From 2bf13cf002de33bfd97167538154e85d4efb8715 Mon Sep 17 00:00:00 2001 From: Brijesh Bittu <717550+brijeshb42@users.noreply.github.com> Date: Fri, 16 Oct 2026 13:13:39 +0530 Subject: [PATCH 1/6] Pin docs migration dependencies --- docs/package.json | 2 +- package.json | 5 + ...i__internal-core-docs@10.0.0-alpha.0.patch | 41 ++ ...internal-docs-infra@0.13.1-canary.14.patch | 145 ++++ pnpm-lock.yaml | 641 ++++++++---------- pnpm-workspace.yaml | 28 +- test/utils/checkMaterialVersion.ts | 57 +- 7 files changed, 566 insertions(+), 353 deletions(-) create mode 100644 patches/@mui__internal-core-docs@10.0.0-alpha.0.patch create mode 100644 patches/@mui__internal-docs-infra@0.13.1-canary.14.patch diff --git a/docs/package.json b/docs/package.json index be6d72db20c61..5f0adc55ba484 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,7 +26,7 @@ "@emotion/styled": "catalog:", "@mui/icons-material": "catalog:", "@mui/internal-core-docs": "catalog:", - "@mui/internal-docs-infra": "^0.13.1-canary.0", + "@mui/internal-docs-infra": "catalog:", "@mui/material": "catalog:", "@mui/material-nextjs": "^9.5.0", "@mui/stylis-plugin-rtl": "catalog:", diff --git a/package.json b/package.json index 70a4db4c54336..af09bea845332 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,10 @@ { "version": "9.16.0", "private": true, + "repository": { + "type": "git", + "url": "https://github.com/mui/mui-x.git" + }, "scripts": { "start": "pnpm i && pnpm docs:dev", "docs:dev": "pnpm --filter docs dev", @@ -80,6 +84,7 @@ "@mui/internal-bundle-size-checker": "1.1.1-canary.6", "@mui/internal-code-infra": "0.1.1-canary.25", "@mui/internal-core-docs": "catalog:", + "@mui/internal-docs-infra": "0.13.1-canary.14", "@mui/internal-markdown": "3.0.13-canary.0", "@mui/internal-netlify-cache": "0.1.1-canary.2", "@mui/internal-scripts": "3.0.12-canary.0", diff --git a/patches/@mui__internal-core-docs@10.0.0-alpha.0.patch b/patches/@mui__internal-core-docs@10.0.0-alpha.0.patch new file mode 100644 index 0000000000000..680ff2e41e439 --- /dev/null +++ b/patches/@mui__internal-core-docs@10.0.0-alpha.0.patch @@ -0,0 +1,41 @@ +diff --git a/nextFonts/index.js b/nextFonts/index.js +index 88f6b3da015a2c0cedd4f099bbc4053787869c73..822a01190bd78e3531e118f3a03f0ea65eee601a 100644 +--- a/nextFonts/index.js ++++ b/nextFonts/index.js +@@ -1,17 +1,20 @@ + import { Inter, Roboto } from 'next/font/google'; + import localFont from 'next/font/local'; + export const inter = Inter({ ++ variable: '--font-inter', + weight: ['300', '400', '500', '600', '700'], + subsets: ['latin'], + preload: false + }); + export const roboto = Roboto({ ++ variable: '--font-roboto', + weight: ['300', '400', '500', '700'], + style: ['normal', 'italic'], + subsets: ['latin'], + preload: false + }); + export const generalSans = localFont({ ++ variable: '--font-general-sans', + declarations: [{ + prop: 'font-family', + value: 'General Sans' +@@ -50,6 +53,7 @@ const generalSansDeferred = localFont({ + // "⌘K" badge; each preloaded file delays LCP on slow links (~0.3s per 55kB + // on Lighthouse mobile), so those two stay deferred. + export const ibmPlexSans = localFont({ ++ variable: '--font-ibm-plex-sans', + declarations: [{ + prop: 'font-family', + value: 'IBM Plex Sans' +@@ -81,4 +85,5 @@ const ibmPlexSansDeferred = localFont({ + }] + }); + export const fonts = [ibmPlexSans, generalSans, ibmPlexSansDeferred, generalSansDeferred, inter, roboto]; +-export const fontClasses = fonts.map(font => font.className).join(' '); +\ No newline at end of file ++// `className` also sets font-weight for single-file loaders, so body only gets the variables. ++export const fontClasses = [ibmPlexSans, generalSans, inter, roboto].map(font => font.variable).join(' '); diff --git a/patches/@mui__internal-docs-infra@0.13.1-canary.14.patch b/patches/@mui__internal-docs-infra@0.13.1-canary.14.patch new file mode 100644 index 0000000000000..fc6a0d3bc465d --- /dev/null +++ b/patches/@mui__internal-docs-infra@0.13.1-canary.14.patch @@ -0,0 +1,145 @@ +diff --git a/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs b/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs +index e5d7298e25487623053aa38d027fdba2f9089036..77a18bf8278c98a8c0d7fe8eced78514ea61345e 100644 +--- a/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs ++++ b/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs +@@ -15,6 +15,52 @@ import { getFileNameFromUrl, IGNORE_COMMENT_PREFIXES } from "../loaderUtils/inde + import { createPerformanceLogger, logPerformance, performanceMeasure } from "./performanceLogger.mjs"; + import { fallbackToHast } from "../../CodeHighlighter/fallbackFormat.mjs"; + ++// Compilation identity prevents reuse across compilers and watch rebuilds. ++const deferredCaches = new WeakMap(); ++ ++function isSerializable(value, ancestors = new Set()) { ++ if (value === null || typeof value === 'string' || typeof value === 'boolean') { ++ return true; ++ } ++ if (typeof value === 'number') { ++ return Number.isFinite(value); ++ } ++ if (typeof value !== 'object' || ancestors.has(value) || Object.getOwnPropertySymbols(value).length) { ++ return false; ++ } ++ const prototype = Object.getPrototypeOf(value); ++ if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) { ++ return false; ++ } ++ ancestors.add(value); ++ const supported = Object.entries(Object.getOwnPropertyDescriptors(value)).every(([name, descriptor]) => { ++ if (Array.isArray(value) && name === 'length') { ++ return true; ++ } ++ return descriptor.enumerable && 'value' in descriptor && isSerializable(descriptor.value, ancestors); ++ }); ++ ancestors.delete(value); ++ return supported; ++} ++ ++function getDeferredCache(context, source, options) { ++ if (!options.deferPrecompute || !context._compilation || !isSerializable(options)) { ++ return undefined; ++ } ++ let entries = deferredCaches.get(context._compilation); ++ if (!entries) { ++ entries = new Map(); ++ deferredCaches.set(context._compilation, entries); ++ } ++ return { entries, key: JSON.stringify([context.resourcePath, source, options]) }; ++} ++ ++function registerDependencies(context, dependencies) { ++ dependencies.forEach(dependency => { ++ context.addDependency(dependency.startsWith('file://') ? fileURLToPath(dependency) : dependency); ++ }); ++} ++ + /** + * Extracts a string array from structured options data. + * Handles the parser's array format: [[element1, element2, ...]] +@@ -115,6 +161,14 @@ export async function loadPrecomputedCodeHighlighter(source) { + const callback = this.async(); + this.cacheable(); + const options = this.getOptions(); ++ const isDeferredRequest = this.resourceQuery === '?mui-deferred-precompute'; ++ const deferredCache = getDeferredCache(this, source, options); ++ const cached = isDeferredRequest ? deferredCache?.entries.get(deferredCache.key) : undefined; ++ if (cached) { ++ registerDependencies(this, cached.dependencies); ++ callback(null, cached.source); ++ return; ++ } + const performanceNotableMs = options.performance?.notableMs ?? 100; + const performanceShowWrapperMeasures = options.performance?.showWrapperMeasures ?? false; + const relativePath = path.relative(this.rootContext || process.cwd(), this.resourcePath); +@@ -276,9 +330,13 @@ export async function loadPrecomputedCodeHighlighter(source) { + measure: 'Complete Variants Loading' + }, [functionName, relativePath], true); + const deferredRequest = `./${path.basename(this.resourcePath)}?mui-deferred-precompute`; +- const isDeferredRequest = this.resourceQuery === '?mui-deferred-precompute'; ++ const deferredSource = isDeferredRequest || deferredCache ? `export default ${JSON.stringify(variantData)};` : undefined; ++ registerDependencies(this, allDependencies); ++ if (deferredCache) { ++ deferredCache.entries.set(deferredCache.key, { source: deferredSource, dependencies: allDependencies }); ++ } + if (isDeferredRequest) { +- callback(null, `export default ${JSON.stringify(variantData)};`); ++ callback(null, deferredSource); + return; + } + +@@ -293,13 +351,6 @@ export async function loadPrecomputedCodeHighlighter(source) { + measure: 'Precompute Replacement' + }, [functionName, relativePath]); + +- // Add all dependencies to webpack's watch list +- allDependencies.forEach(dep => { +- // Convert file:// URLs to proper file system paths for webpack's dependency tracking +- // Using fileURLToPath handles Windows drive letters correctly (e.g., file:///C:/... → C:\...) +- this.addDependency(dep.startsWith('file://') ? fileURLToPath(dep) : dep); +- }); +- + // log any pending performance entries before completing + observer?.takeRecords()?.forEach(entry => logPerformance(entry, performanceNotableMs, performanceShowWrapperMeasures, relativePath)); + observer?.disconnect(); +diff --git a/useDemo/exportVariant.d.mts b/useDemo/exportVariant.d.mts +index f2ccb993de2e97ed06acb6b75fe5ae70ccb3a0b8..5b8713538a668becb0a4facdccc296dbafe02abd 100644 +--- a/useDemo/exportVariant.d.mts ++++ b/useDemo/exportVariant.d.mts +@@ -180,7 +180,7 @@ export interface ExportConfig { + * return { [packageName]: 'latest' }; + * } + */ +- resolveDependencies?: (packageName: string, envVars?: Record) => Record; ++ resolveDependencies?: (packageName: string, envVars?: Record, importedModules?: string[]) => Record; + } + /** + * Export a variant as a standalone project with metadata files properly scoped +diff --git a/useDemo/exportVariant.mjs b/useDemo/exportVariant.mjs +index 77c0f79191a8135cc21af71df277a903fcbd565b..fb0cc3d4e85aa717e750d7a8110a2f67a20c1053 100644 +--- a/useDemo/exportVariant.mjs ++++ b/useDemo/exportVariant.mjs +@@ -286,18 +286,14 @@ export function exportVariant(variantCode, config = {}) { + + // Check if they're providing their own framework + const isFramework = 'frameworkFiles' in config; +- const externalPackages = externalsToPackages(processedVariantCode.externals || []); ++ const importedModules = processedVariantCode.externals || []; ++ const externalPackages = externalsToPackages(importedModules); + const variantDeps = Object.keys(externalPackages).reduce((acc, pkg) => { +- // Check if we have a specific version for this package first +- if (versions[pkg]) { +- acc[pkg] = versions[pkg]; +- } else if (resolveDependencies) { +- const resolvedDeps = resolveDependencies(pkg); +- Object.assign(acc, resolvedDeps); +- } else { +- // Simple fallback: just use 'latest' for each package +- acc[pkg] = 'latest'; +- } ++ // Pinned versions still need adapter and product peer dependencies. ++ const packageImports = importedModules.filter(name => name === pkg || name.startsWith(`${pkg}/`)); ++ const resolvedDeps = resolveDependencies?.(pkg, undefined, packageImports) ?? {}; ++ Object.assign(acc, resolvedDeps); ++ acc[pkg] = versions[pkg] ?? resolvedDeps[pkg] ?? 'latest'; + return acc; + }, {}); + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98c271ec8a67b..533575d4970ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,30 +210,9 @@ catalogs: '@emotion/styled': specifier: ^11.14.1 version: 11.14.1 - '@mui/icons-material': - specifier: 9.5.0 - version: 9.5.0 - '@mui/internal-core-docs': - specifier: 9.4.1-canary.0 - version: 9.4.1-canary.0 '@mui/internal-test-utils': specifier: 2.1.1-canary.5 version: 2.1.1-canary.5 - '@mui/material': - specifier: 9.5.0 - version: 9.5.0 - '@mui/stylis-plugin-rtl': - specifier: 9.5.0 - version: 9.5.0 - '@mui/system': - specifier: 9.5.0 - version: 9.5.0 - '@mui/types': - specifier: 9.5.0 - version: 9.5.0 - '@mui/utils': - specifier: ^9.5.0 - version: 9.5.0 '@mui/x-internal-exceljs-fork': specifier: 5.0.0 version: 5.0.0 @@ -386,9 +365,29 @@ catalogs: version: 18.2.0 overrides: + '@mui/internal-docs-infra': 0.13.1-canary.14 + '@mui/core-downloads-tracker': https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf + '@mui/icons-material': https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + '@mui/internal-api-docs-builder': https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf + '@mui/internal-core-docs': https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf + '@mui/internal-docs-utils': https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf + '@mui/internal-markdown': https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf + '@mui/internal-scripts': https://pkg.pr.new/mui/material-ui/@mui/internal-scripts@40645cf + '@mui/material': https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + '@mui/material-nextjs': https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf + '@mui/private-theming': https://pkg.pr.new/mui/material-ui/@mui/private-theming@40645cf + '@mui/styled-engine': https://pkg.pr.new/mui/material-ui/@mui/styled-engine@40645cf + '@mui/stylis-plugin-rtl': https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf + '@mui/system': https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + '@mui/types': https://pkg.pr.new/mui/material-ui/@mui/types@40645cf + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf stylis: ^4.4.0 caniuse-lite: ^1.0.30001819 +patchedDependencies: + '@mui/internal-core-docs@10.0.0-alpha.0': 4e36c2ebcf2081080150350048ac7116e1752af7837a8436f852fba7563292cb + '@mui/internal-docs-infra@0.13.1-canary.14': efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f + importers: .: @@ -424,8 +423,8 @@ importers: specifier: 8.7.4 version: 8.7.4(@types/node@22.20.5) '@mui/internal-api-docs-builder': - specifier: 1.0.6-canary.0 - version: 1.0.6-canary.0(supports-color@11.0.0) + specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf(supports-color@11.0.0) '@mui/internal-babel-plugin-display-name': specifier: 2.0.1-canary.2 version: 2.0.1-canary.2(@babel/core@8.0.7)(@babel/preset-react@8.0.1(@babel/core@8.0.7)) @@ -439,26 +438,29 @@ importers: specifier: 0.1.1-canary.25 version: 0.1.1-canary.25(@next/eslint-plugin-next@16.4.3(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0)))(@octokit/core@7.0.8)(@types/node@22.20.5)(@typescript-eslint/eslint-plugin@8.72.0(@typescript-eslint/parser@8.72.0(@typescript/typescript6@6.0.2)(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript/typescript6@6.0.2)(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript-eslint/parser@8.72.0(@typescript/typescript6@6.0.2)(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript/typescript6@6.0.2)(eslint-import-resolver-node@0.3.10(supports-color@11.0.0))(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0))(postcss@8.5.31)(prettier@3.9.10)(stylelint@17.16.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0))(supports-color@11.0.0)(vitest@5.0.5) '@mui/internal-core-docs': - specifier: 'catalog:' - version: 9.4.1-canary.0(9671974134f7bea721236594eafef1fc) + specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf(patch_hash=4e36c2ebcf2081080150350048ac7116e1752af7837a8436f852fba7563292cb)(20b6a332c52b484624b256ff4a4658fc) + '@mui/internal-docs-infra': + specifier: 0.13.1-canary.14 + version: 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) '@mui/internal-markdown': - specifier: 3.0.13-canary.0 - version: 3.0.13-canary.0 + specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf '@mui/internal-netlify-cache': specifier: 0.1.1-canary.2 version: 0.1.1-canary.2 '@mui/internal-scripts': - specifier: 3.0.12-canary.0 - version: 3.0.12-canary.0(supports-color@11.0.0) + specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-scripts@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/internal-scripts@40645cf(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@netlify/types': specifier: 3.3.0 version: 3.3.0 @@ -667,29 +669,29 @@ importers: specifier: 'catalog:' version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@mui/icons-material': - specifier: 'catalog:' - version: 9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) '@mui/internal-core-docs': - specifier: 'catalog:' - version: 9.4.1-canary.0(9671974134f7bea721236594eafef1fc) + specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf(patch_hash=4e36c2ebcf2081080150350048ac7116e1752af7837a8436f852fba7563292cb)(20b6a332c52b484624b256ff4a4658fc) '@mui/internal-docs-infra': - specifier: ^0.13.1-canary.0 - version: 0.13.1-canary.13(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) + specifier: 0.13.1-canary.14 + version: 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/material-nextjs': - specifier: ^9.5.0 - version: 9.5.0(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1) '@mui/stylis-plugin-rtl': - specifier: 'catalog:' - version: 9.5.0(stylis@4.4.0) + specifier: https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf(stylis@4.4.0) '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-charts': specifier: workspace:^ version: link:../packages/x-charts/build @@ -860,8 +862,8 @@ importers: specifier: 'catalog:' version: 8.0.7(@babel/core@8.0.7) '@mui/internal-docs-utils': - specifier: 3.0.8-canary.0 - version: 3.0.8-canary.0 + specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf '@types/chance': specifier: 'catalog:' version: 1.1.8 @@ -990,9 +992,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-charts-vendor': specifier: workspace:* version: link:../x-charts-vendor/build @@ -1018,12 +1026,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -1058,9 +1060,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-charts': specifier: workspace:^ version: link:../x-charts/build @@ -1086,12 +1094,6 @@ importers: specifier: 'catalog:' version: 15.8.1 devDependencies: - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -1127,9 +1129,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-charts': specifier: workspace:^ version: link:../x-charts/build @@ -1152,12 +1160,6 @@ importers: specifier: 'catalog:' version: 15.8.1 devDependencies: - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -1291,9 +1293,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-chat-headless': specifier: workspace:* version: link:../x-chat-headless/build @@ -1316,12 +1324,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -1348,8 +1350,8 @@ importers: specifier: 'catalog:' version: 0.5.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1411,9 +1413,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1431,20 +1439,14 @@ importers: version: 1.7.0(react@19.3.1) devDependencies: '@mui/icons-material': - specifier: 'catalog:' - version: 9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/types': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0) + specifier: https://pkg.pr.new/mui/material-ui/@mui/types@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/types@40645cf(@types/react@19.3.0) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -1473,9 +1475,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/icons-material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/system': - specifier: ^7.3.0 || ^9.0.0 - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/x-data-grid': specifier: workspace:^ version: link:../x-data-grid/build @@ -1498,15 +1506,9 @@ importers: specifier: ^11.5.3 version: 11.5.3 devDependencies: - '@mui/icons-material': - specifier: 'catalog:' - version: 9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@types/chance': specifier: 'catalog:' version: 1.1.8 @@ -1535,9 +1537,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-data-grid': specifier: workspace:^ version: link:../x-data-grid/build @@ -1563,12 +1571,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -1606,9 +1608,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-data-grid': specifier: workspace:^ version: link:../x-data-grid/build @@ -1628,12 +1636,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -1665,9 +1667,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1687,12 +1695,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/luxon': specifier: 'catalog:' version: 3.7.6 @@ -1751,9 +1753,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-date-pickers': specifier: workspace:^ version: link:../x-date-pickers/build @@ -1782,12 +1790,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/luxon': specifier: 'catalog:' version: 3.7.6 @@ -1845,8 +1847,8 @@ importers: specifier: 'catalog:' version: 0.5.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) devDependencies: '@mui/internal-test-utils': specifier: 'catalog:' @@ -1868,8 +1870,8 @@ importers: specifier: 'catalog:' version: 8.0.7 '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1908,9 +1910,18 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/icons-material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1927,18 +1938,9 @@ importers: specifier: 'catalog:' version: 15.8.1 devDependencies: - '@mui/icons-material': - specifier: 'catalog:' - version: 9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -2079,9 +2081,18 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/icons-material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -2107,18 +2118,9 @@ importers: specifier: 'catalog:' version: 15.8.1 devDependencies: - '@mui/icons-material': - specifier: 'catalog:' - version: 9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -2179,9 +2181,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -2195,12 +2203,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -2229,9 +2231,15 @@ importers: '@emotion/styled': specifier: ^11.8.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) + '@mui/material': + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/system': + specifier: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -2251,12 +2259,6 @@ importers: '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) - '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/system': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) '@types/prop-types': specifier: 'catalog:' version: 15.7.15 @@ -2280,8 +2282,8 @@ importers: specifier: 'catalog:' version: 0.5.0(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/utils': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -2290,8 +2292,8 @@ importers: specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) '@mui/types': - specifier: 'catalog:' - version: 9.5.0(@types/react@19.3.0) + specifier: https://pkg.pr.new/mui/material-ui/@mui/types@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/types@40645cf(@types/react@19.3.0) react: specifier: 'catalog:' version: 19.3.1 @@ -2321,11 +2323,11 @@ importers: specifier: 'catalog:' version: 11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@mui/material': - specifier: 'catalog:' - version: 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/stylis-plugin-rtl': - specifier: 'catalog:' - version: 9.5.0(stylis@4.4.0) + specifier: https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf(stylis@4.4.0) '@mui/x-charts': specifier: workspace:^ version: link:../packages/x-charts/build @@ -2579,8 +2581,8 @@ importers: specifier: 5.3.0 version: 5.3.0 '@mui/icons-material': - specifier: 'catalog:' - version: 9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) + specifier: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + version: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) '@mui/internal-test-utils': specifier: 'catalog:' version: 2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5) @@ -4499,22 +4501,25 @@ packages: '@cfworker/json-schema': optional: true - '@mui/core-downloads-tracker@9.5.0': - resolution: {integrity: sha512-PErEpl3Lp+1ZqWYKI7GQU8XSiciAFmLbUAZ7IoaUL598HLy1UAFuEUMEJu8yAS1v8vkXYzWprMVZzky4UwXoOA==} + '@mui/core-downloads-tracker@https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf': + resolution: {integrity: sha512-wT18JYI8owQJJcchuujMVtt2hbG1+au4UUQQBw/vf1uCO5VTROQ7oSb/xXRqUsHBVrQND7fLDMo+KA2Hgp59Aw==, tarball: https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf} + version: 10.0.0-alpha.0 - '@mui/icons-material@9.5.0': - resolution: {integrity: sha512-dahtVaqnRUIBgaZ4WC9EdP+LgJ5d2rslASYIX+nDFG6+ssUiM11jQ+Gd1wH8vhUGoNA9ES40MYics5BI8zJFXQ==} + '@mui/icons-material@https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf': + resolution: {integrity: sha512-lRWH4AiT2Reh0qktvSvziOOngxwBwcEB5rwkq8RDwii9WWPv5XySX9XvEyvWJw9KU+m1HhIvrFGiXIb5VprrBQ==, tarball: https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: - '@mui/material': ^9.5.0 + '@mui/material': 10.0.0-alpha.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/internal-api-docs-builder@1.0.6-canary.0': - resolution: {integrity: sha512-Jkd6kcdqbeCjc0O3j1pSFmQs3aMYstcWxynRUQUyrzj0vTx/Qwlfn2imQVg3tLcJv5EbrauYS9zQjJA136aIow==} + '@mui/internal-api-docs-builder@https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf': + resolution: {integrity: sha512-qtmK9QR9tyL0GWGMVZZGYGstRXkSJTyDdpRoZNySCaAA5rchdho1DKArazvrjLBINChqitmFxaMMNtHiN1fHwQ==, tarball: https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf} + version: 2.0.0 engines: {node: '>=22.23.3'} '@mui/internal-babel-plugin-display-name@2.0.1-canary.2': @@ -4566,8 +4571,9 @@ packages: typescript: optional: true - '@mui/internal-core-docs@9.4.1-canary.0': - resolution: {integrity: sha512-/83lMYMcecmiyDwYnSxjGWDhrIGLqfEsl47MEHkqvvl2cqeXTicTLwWGKt7VwnXMgsf6Yp4WVYpFpTQLJQqcug==} + '@mui/internal-core-docs@https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf': + resolution: {integrity: sha512-Vv0JjemOUEtDF7aRdXpMqIvwEpbxbQA998LzANREsdgQXu/ZBNefHkL688+FCFifFBkCyR41PE0eVfhllIORzg==, tarball: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=22.23.3'} peerDependencies: '@base-ui/react': ^1 @@ -4575,12 +4581,12 @@ packages: '@emotion/cache': ^11.14.0 '@emotion/react': ^11.14.0 '@emotion/styled': ^11.14.1 - '@mui/icons-material': ^5.0.0 || ^6.0.0 || ^7.0.0 || ^9.0.0 || ^9.0.0-alpha || ^9.0.0-beta - '@mui/material': ^5.0.0 || ^6.0.0 || ^7.0.0 || ^9.0.0 || ^9.0.0-alpha || ^9.0.0-beta - '@mui/material-nextjs': ^5.0.0 || ^6.0.0 || ^7.0.0 || ^9.0.0 || ^9.0.0-alpha || ^9.0.0-beta - '@mui/stylis-plugin-rtl': ^5.0.0 || ^6.0.0 || ^7.0.0 || ^9.0.0 || ^9.0.0-alpha || ^9.0.0-beta - '@mui/system': ^5.0.0 || ^6.0.0 || ^7.0.0 || ^9.0.0 || ^9.0.0-alpha || ^9.0.0-beta - '@mui/utils': ^5.0.0 || ^6.0.0 || ^7.0.0 || ^9.0.0 || ^9.0.0-alpha || ^9.0.0-beta + '@mui/icons-material': 10.0.0-alpha.0 + '@mui/material': 10.0.0-alpha.0 + '@mui/material-nextjs': 10.0.0-alpha.0 + '@mui/stylis-plugin-rtl': 10.0.0-alpha.0 + '@mui/system': 10.0.0-alpha.0 + '@mui/utils': 10.0.0-alpha.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/stylis': ^4.2.7 csstype: ^3.1.3 @@ -4590,8 +4596,8 @@ packages: react-runner: ^1.0.5 react-simple-code-editor: ^0.14.1 - '@mui/internal-docs-infra@0.13.1-canary.13': - resolution: {integrity: sha512-ycLQO91FWIan/vSAhZIoFlpRwOOs+H76CsNS5ejbT4GEoLunb69/nmUK4geJt9sleZ7r/iO/Nf7aB3cuIfYTdQ==} + '@mui/internal-docs-infra@0.13.1-canary.14': + resolution: {integrity: sha512-ZQn+xLezKXpPJMHUmYFdWLVZk68hr3GLNkkT3kez2k6/7DG+Ud6t1CQRc9zVHVH3s5a4eGeDHSYCt5ZWrJ31uQ==} engines: {node: '>=22.18.0'} hasBin: true peerDependencies: @@ -4608,17 +4614,20 @@ packages: prettier: optional: true - '@mui/internal-docs-utils@3.0.8-canary.0': - resolution: {integrity: sha512-cX4BbU1xdaEYk4qHbByeXPSv/wdRY2Zuy/V0KBJhmPGR3NlMCtMkAVC/8wbc3TgIf77Lxn0VI4Nd9kd4qyN3TA==} + '@mui/internal-docs-utils@https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf': + resolution: {integrity: sha512-uGGl9pkmUAFKbA+mlKcQpgaLm8wraiqVd7l2tjYoc9oPwdZ8MBNibbib+BkRTXXG4TNBzOc3ZEUb1njS8xQKjA==, tarball: https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf} + version: 4.0.0 - '@mui/internal-markdown@3.0.13-canary.0': - resolution: {integrity: sha512-POFDIWxQVcK96RhyJrM9eERUkWPZa0EzJ5NBiOiRN4dxw4hXmozdxlDrmfPYAFe3JJuiLDMLEcJH0TADHwfwVw==} + '@mui/internal-markdown@https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf': + resolution: {integrity: sha512-DwVzDbYGS+yhQ7ilaMkH0fojTCIoqpNt0scXCw/uUWMggHyabrBQ7ZaYntZ3Ma6jJAPgT6WvheEAaCTd/ZTKuQ==, tarball: https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf} + version: 4.0.0 '@mui/internal-netlify-cache@0.1.1-canary.2': resolution: {integrity: sha512-kKjQhjZd6zXY0cFjd9h1w1fHwwobuEpRd9l+JF3c7K+IzG31yvQMUZ4cS2w5tnpsrRxAYCEbq97PqbmZipM8YA==} - '@mui/internal-scripts@3.0.12-canary.0': - resolution: {integrity: sha512-btvBJQ/jMd3G/d4RCE6Bqkych84Ge3OmaAsvgKKkt7a/juZl5LRNPSNxjumXCP3vu1EuonsDPxnqtWrcX/zVvw==} + '@mui/internal-scripts@https://pkg.pr.new/mui/material-ui/@mui/internal-scripts@40645cf': + resolution: {integrity: sha512-KOy9HkcFT9dGmg5bMPdTi3XLun3xiLKJMACEH2nt1ANyb2AgN2ceCnbdCwb8n/hWNT58O35lYfcS82SEnNACsw==, tarball: https://pkg.pr.new/mui/material-ui/@mui/internal-scripts@40645cf} + version: 4.0.0 '@mui/internal-test-utils@2.1.1-canary.5': resolution: {integrity: sha512-LgsQKKSQ3YyggJSJO5yty1pWlTPJhmWk9qWXsHRJvwSF7U1HiXQFJz3QeIBYsM/h9XsI4jX4jUMX6hbmoQF/Ww==} @@ -4635,8 +4644,9 @@ packages: '@emotion/react': optional: true - '@mui/material-nextjs@9.5.0': - resolution: {integrity: sha512-IzEH+a4WnOaLHkINsL/4gHdEW/codbaX9reiINSZXhn3Px9YZ4zfm8WMcPjTXhIlmjB/VBjp7jsb+HRN/PLE6g==} + '@mui/material-nextjs@https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf': + resolution: {integrity: sha512-DuKovPJR5dLnq4VH7iZb1VLqjHH7VsXPoAdMOVuQJV/OwtJk7jn1rHu3BMMdSWMvbYc8Cg3pu7nNedjkEYn+FQ==, tarball: https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: '@emotion/cache': ^11.11.0 @@ -4653,13 +4663,14 @@ packages: '@types/react': optional: true - '@mui/material@9.5.0': - resolution: {integrity: sha512-QgqvdVjZoKxP8E8SBxYY6LrdV+kw00moXweZQWBbMMdifPKZAGfUaaXhGKIca6fjKnCL6HJIe/AWWCpqNvyHVw==} + '@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf': + resolution: {integrity: sha512-Slz5zusjXoOLw/04dTZjYZTb3pPKmOJgR+9qfEWAQuJABCMPyMusXjlMlq2Ca+kvv4H8iZfoMElqCP8nCGcw3w==, tarball: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material-pigment-css': ^9.5.0 + '@mui/material-pigment-css': 10.0.0-alpha.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4673,8 +4684,9 @@ packages: '@types/react': optional: true - '@mui/private-theming@9.5.0': - resolution: {integrity: sha512-UHZKySlr4ZJeA5HEhe/Tq1fhsR5573ViKYn7JV80dCVJtgqRQIplRSer1DHPg2Yi22llX7QRhgM0Vtrx4kZHSA==} + '@mui/private-theming@https://pkg.pr.new/mui/material-ui/@mui/private-theming@40645cf': + resolution: {integrity: sha512-y7RqyVQVQCb5ClE3kHcrxKoPJDzXFLqc7pp+lB+snGYt8eyCpVGyHtZm02lcqNsihPnEDhMvZnXyYfZDjPztqw==, tarball: https://pkg.pr.new/mui/material-ui/@mui/private-theming@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4683,8 +4695,9 @@ packages: '@types/react': optional: true - '@mui/styled-engine@9.5.0': - resolution: {integrity: sha512-IX1ceHnZ0bJgzJRWO/Ayl4ME1rNmpWVYwV28yb089UAMR17rJkV1qfr7ApsWQXXPi1oi+2JapJrWQAiAnTlJHQ==} + '@mui/styled-engine@https://pkg.pr.new/mui/material-ui/@mui/styled-engine@40645cf': + resolution: {integrity: sha512-D58l9La1VUXayh67UL6EiPc2tque/wPJTneFoIZxbnTwmgYzh1ovjx59GPAVyq2zo9LC8JSdivHOYdseTfOIIw==, tarball: https://pkg.pr.new/mui/material-ui/@mui/styled-engine@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -4696,14 +4709,16 @@ packages: '@emotion/styled': optional: true - '@mui/stylis-plugin-rtl@9.5.0': - resolution: {integrity: sha512-AyS9NC0FGhBTyH+IiCD8LnOlvHgJHckVHn74mjXbY97dKAaf7HlH5LXsbZFlPmSC0V0gXkyipqmMhliT99v+qg==} + '@mui/stylis-plugin-rtl@https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf': + resolution: {integrity: sha512-e3q0L4sWzsXBGct2LOLy0KBgUeaZVbbcE85xNe3iV1MNrCtxLsbEtP+o0eOV652gNGwkkdAxnvi8H/feIoOBGw==, tarball: https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: stylis: ^4.4.0 - '@mui/system@9.5.0': - resolution: {integrity: sha512-OZuAwvoiaaHpvn0a540VH1DUwwmojJubGfNmO2g+nb2ybNDP4/gF7t7aA6AMduELSuJ5yxwlzyFvUO3CfLv1Yg==} + '@mui/system@https://pkg.pr.new/mui/material-ui/@mui/system@40645cf': + resolution: {integrity: sha512-5E9DZ47hcuzpOX0zF1AJIyttGBKUmDokRMMDJhw8eLve5+Rh9NK5XnwNmHX4fLSVlBqRcjLpPEgBXdvW3/HEBQ==, tarball: https://pkg.pr.new/mui/material-ui/@mui/system@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -4718,52 +4733,18 @@ packages: '@types/react': optional: true - '@mui/types@7.2.24': - resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} + '@mui/types@https://pkg.pr.new/mui/material-ui/@mui/types@40645cf': + resolution: {integrity: sha512-0UCQpSk/WBmb9WjiSTUmMPzGxagMif6uXyxJ1yMprgtQuwAd8jINUNULIXEjAjOR7anAajFk3psGzKMla5x/AQ==, tarball: https://pkg.pr.new/mui/material-ui/@mui/types@40645cf} + version: 10.0.0-alpha.0 peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/types@7.4.12': - resolution: {integrity: sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/types@9.5.0': - resolution: {integrity: sha512-O0S6xS80qEQqW2CYNrd4GlBEQ1xpMOHZ5b4zO/DaLu6NZmtthM6smEg0Gz/u9gX5vL+8NB3EiBIxmxSCcG590Q==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@5.17.1': - resolution: {integrity: sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@7.3.11': - resolution: {integrity: sha512-XTjGnifwteg71/ij+0e7Y7d+hwyntMYP5wPoA/g2drdGH+Flkvjwy0OfrVpKBbaOvofq4zU/LIyUZyKgmWu18g==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@9.5.0': - resolution: {integrity: sha512-8m0LfSgE2pj58znY3kZ+anwRKbnBkcu/7AJPA8L/77wEjN0QnpX4/zRAccyplp1VEUnMsUBADeTRin5Mkf7epA==} + '@mui/utils@https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf': + resolution: {integrity: sha512-egAWNuCesGrWS9JNrOHLIJiTEKkFiKNE/niEk4l+ip+ozQPXmEsDAENMNcoN8PJmhxQ1Un+arCqvBM4gq8Sirg==, tarball: https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf} + version: 10.0.0-alpha.0 engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -13407,24 +13388,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@mui/core-downloads-tracker@9.5.0': {} + '@mui/core-downloads-tracker@https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf': {} - '@mui/icons-material@9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1)': + '@mui/icons-material@https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 - '@mui/material': 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/material': https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) react: 19.3.1 optionalDependencies: '@types/react': 19.3.0 - '@mui/internal-api-docs-builder@1.0.6-canary.0(supports-color@11.0.0)': + '@mui/internal-api-docs-builder@https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf(supports-color@11.0.0)': dependencies: '@babel/core': 7.29.7(supports-color@11.0.0) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0))(supports-color@11.0.0) '@babel/traverse': 7.29.10(supports-color@11.0.0) '@babel/types': 7.29.8 - '@mui/internal-docs-utils': 3.0.8-canary.0 - '@mui/internal-markdown': 3.0.13-canary.0 + '@mui/internal-docs-utils': https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf + '@mui/internal-markdown': https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf '@typescript/typescript6': 6.0.2 doctrine: 3.0.0 es-toolkit: 1.52.0 @@ -13627,7 +13608,7 @@ snapshots: - ts-declaration-location - vitest - '@mui/internal-core-docs@9.4.1-canary.0(9671974134f7bea721236594eafef1fc)': + '@mui/internal-core-docs@https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf(patch_hash=4e36c2ebcf2081080150350048ac7116e1752af7837a8436f852fba7563292cb)(20b6a332c52b484624b256ff4a4658fc)': dependencies: '@babel/runtime': 8.0.7 '@base-ui/react': 1.9.0(@date-fns/tz@1.5.0)(@types/react@19.3.0)(date-fns@4.4.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) @@ -13635,13 +13616,14 @@ snapshots: '@emotion/cache': 11.14.0 '@emotion/react': 11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) - '@mui/icons-material': 9.5.0(@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) - '@mui/internal-markdown': 3.0.13-canary.0 - '@mui/material': 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) - '@mui/material-nextjs': 9.5.0(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1) - '@mui/stylis-plugin-rtl': 9.5.0(stylis@4.4.0) - '@mui/system': 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) - '@mui/utils': 9.5.0(@types/react@19.3.0)(react@19.3.1) + '@mui/icons-material': https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) + '@mui/internal-docs-infra': 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) + '@mui/internal-markdown': https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf + '@mui/material': https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@mui/material-nextjs': https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1) + '@mui/stylis-plugin-rtl': https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf(stylis@4.4.0) + '@mui/system': https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@types/react': 19.3.0 '@types/stylis': 4.2.7 clipboard-copy: 4.0.1 @@ -13657,8 +13639,11 @@ snapshots: react-runner: 1.0.5(react-dom@19.3.1(react@19.3.1))(react@19.3.1) react-simple-code-editor: 0.14.1(react-dom@19.3.1(react@19.3.1))(react@19.3.1) stylis: 4.4.0 + transitivePeerDependencies: + - prettier + - supports-color - '@mui/internal-docs-infra@0.13.1-canary.13(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0)': + '@mui/internal-docs-infra@0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0)': dependencies: '@babel/runtime': 8.0.7 '@csstools/postcss-light-dark-function': 3.0.7(postcss@8.5.31) @@ -13711,12 +13696,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@mui/internal-docs-utils@3.0.8-canary.0': + '@mui/internal-docs-utils@https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf': dependencies: '@typescript/typescript6': 6.0.2 rimraf: 6.1.3 - '@mui/internal-markdown@3.0.13-canary.0': + '@mui/internal-markdown@https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf': dependencies: '@babel/runtime': 8.0.7 es-toolkit: 1.52.0 @@ -13725,18 +13710,24 @@ snapshots: '@mui/internal-netlify-cache@0.1.1-canary.2': {} - '@mui/internal-scripts@3.0.12-canary.0(supports-color@11.0.0)': + '@mui/internal-scripts@https://pkg.pr.new/mui/material-ui/@mui/internal-scripts@40645cf(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0)': dependencies: '@babel/core': 7.29.7(supports-color@11.0.0) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7(supports-color@11.0.0)) '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0)) '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0)) '@babel/types': 7.29.8 - '@mui/internal-docs-utils': 3.0.8-canary.0 + '@mui/internal-docs-infra': 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) + '@mui/internal-docs-utils': https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf '@typescript/typescript6': 6.0.2 doctrine: 3.0.0 es-toolkit: 1.52.0 transitivePeerDependencies: + - '@types/react' + - next + - prettier + - react + - react-dom - supports-color '@mui/internal-test-utils@2.1.1-canary.5(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@playwright/test@1.64.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(@vitest/utils@5.0.5)(chai@6.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.9.1))(vitest@5.0.5)': @@ -13767,7 +13758,7 @@ snapshots: - vite - vitest - '@mui/material-nextjs@9.5.0(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1)': + '@mui/material-nextjs@https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 '@emotion/react': 11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) @@ -13778,13 +13769,13 @@ snapshots: '@emotion/server': 11.11.0 '@types/react': 19.3.0 - '@mui/material@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': + '@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 - '@mui/core-downloads-tracker': 9.5.0 - '@mui/system': 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) - '@mui/types': 9.5.0(@types/react@19.3.0) - '@mui/utils': 9.5.0(@types/react@19.3.0)(react@19.3.1) + '@mui/core-downloads-tracker': https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf + '@mui/system': https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1) + '@mui/types': https://pkg.pr.new/mui/material-ui/@mui/types@40645cf(@types/react@19.3.0) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.12(@types/react@19.3.0) clsx: 2.1.1 @@ -13799,16 +13790,16 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@types/react': 19.3.0 - '@mui/private-theming@9.5.0(@types/react@19.3.0)(react@19.3.1)': + '@mui/private-theming@https://pkg.pr.new/mui/material-ui/@mui/private-theming@40645cf(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 - '@mui/utils': 9.5.0(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) prop-types: 15.8.1 react: 19.3.1 optionalDependencies: '@types/react': 19.3.0 - '@mui/styled-engine@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(react@19.3.1)': + '@mui/styled-engine@https://pkg.pr.new/mui/material-ui/@mui/styled-engine@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 '@emotion/cache': 11.14.0 @@ -13821,19 +13812,19 @@ snapshots: '@emotion/react': 11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) - '@mui/stylis-plugin-rtl@9.5.0(stylis@4.4.0)': + '@mui/stylis-plugin-rtl@https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf(stylis@4.4.0)': dependencies: '@babel/runtime': 8.0.7 cssjanus: 2.3.1 stylis: 4.4.0 - '@mui/system@9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)': + '@mui/system@https://pkg.pr.new/mui/material-ui/@mui/system@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 - '@mui/private-theming': 9.5.0(@types/react@19.3.0)(react@19.3.1) - '@mui/styled-engine': 9.5.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(react@19.3.1) - '@mui/types': 9.5.0(@types/react@19.3.0) - '@mui/utils': 9.5.0(@types/react@19.3.0)(react@19.3.1) + '@mui/private-theming': https://pkg.pr.new/mui/material-ui/@mui/private-theming@40645cf(@types/react@19.3.0)(react@19.3.1) + '@mui/styled-engine': https://pkg.pr.new/mui/material-ui/@mui/styled-engine@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(react@19.3.1) + '@mui/types': https://pkg.pr.new/mui/material-ui/@mui/types@40645cf(@types/react@19.3.0) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 @@ -13843,50 +13834,16 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@types/react': 19.3.0 - '@mui/types@7.2.24(@types/react@19.3.0)': - optionalDependencies: - '@types/react': 19.3.0 - - '@mui/types@7.4.12(@types/react@19.3.0)': - dependencies: - '@babel/runtime': 7.29.10 - optionalDependencies: - '@types/react': 19.3.0 - - '@mui/types@9.5.0(@types/react@19.3.0)': + '@mui/types@https://pkg.pr.new/mui/material-ui/@mui/types@40645cf(@types/react@19.3.0)': dependencies: '@babel/runtime': 8.0.7 optionalDependencies: '@types/react': 19.3.0 - '@mui/utils@5.17.1(@types/react@19.3.0)(react@19.3.1)': - dependencies: - '@babel/runtime': 7.29.10 - '@mui/types': 7.2.24(@types/react@19.3.0) - '@types/prop-types': 15.7.15 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 19.3.1 - react-is: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - - '@mui/utils@7.3.11(@types/react@19.3.0)(react@19.3.1)': - dependencies: - '@babel/runtime': 7.29.10 - '@mui/types': 7.4.12(@types/react@19.3.0) - '@types/prop-types': 15.7.15 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 19.3.1 - react-is: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - - '@mui/utils@9.5.0(@types/react@19.3.0)(react@19.3.1)': + '@mui/utils@https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 - '@mui/types': 9.5.0(@types/react@19.3.0) + '@mui/types': https://pkg.pr.new/mui/material-ui/@mui/types@40645cf(@types/react@19.3.0) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 @@ -13907,7 +13864,7 @@ snapshots: '@mui/x-internals@7.29.0(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 7.29.10 - '@mui/utils': 7.3.11(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) react: 19.3.1 transitivePeerDependencies: - '@types/react' @@ -13915,7 +13872,7 @@ snapshots: '@mui/x-internals@8.29.3(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 7.29.10 - '@mui/utils': 7.3.11(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) react: 19.3.1 reselect: 5.3.0 use-sync-external-store: 1.7.0(react@19.3.1) @@ -13925,7 +13882,7 @@ snapshots: '@mui/x-license-pro@5.17.12(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 7.29.10 - '@mui/utils': 5.17.1(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) react: 19.3.1 transitivePeerDependencies: - '@types/react' @@ -13933,7 +13890,7 @@ snapshots: '@mui/x-license-pro@6.10.2(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 7.29.10 - '@mui/utils': 5.17.1(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) react: 19.3.1 transitivePeerDependencies: - '@types/react' @@ -13941,7 +13898,7 @@ snapshots: '@mui/x-license@7.29.1(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 7.29.10 - '@mui/utils': 7.3.11(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': 7.29.0(@types/react@19.3.0)(react@19.3.1) react: 19.3.1 transitivePeerDependencies: @@ -13950,7 +13907,7 @@ snapshots: '@mui/x-license@8.29.3(@types/react@19.3.0)(react@19.3.1)': dependencies: '@babel/runtime': 7.29.10 - '@mui/utils': 7.3.11(@types/react@19.3.0)(react@19.3.1) + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf(@types/react@19.3.0)(react@19.3.1) '@mui/x-internals': 8.29.3(@types/react@19.3.0)(react@19.3.1) '@mui/x-telemetry': 8.29.0 react: 19.3.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7580afead02ef..f464e40041f6e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -23,6 +23,7 @@ catalog: '@mui/icons-material': 9.5.0 '@mui/internal-test-utils': 2.1.1-canary.5 '@mui/internal-core-docs': 9.4.1-canary.0 + '@mui/internal-docs-infra': 0.13.1-canary.14 '@mui/material': 9.5.0 '@mui/stylis-plugin-rtl': 9.5.0 '@mui/system': 9.5.0 @@ -85,7 +86,8 @@ catalog: engineStrict: true updateNotifier: false autoDedupe: true -blockExoticSubdeps: true +# Required while transitive dependencies use the SHA-pinned material-ui preview overrides below. +blockExoticSubdeps: false minimumReleaseAge: 4320 minimumReleaseAgeExclude: - '@mui/*' @@ -120,6 +122,24 @@ allowBuilds: msw: false overrides: + '@mui/internal-docs-infra': 0.13.1-canary.14 + # Preview packages from material-ui PR #48842, pinned to its reviewed head. + '@mui/core-downloads-tracker': https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf + '@mui/icons-material': https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf + '@mui/internal-api-docs-builder': https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf + '@mui/internal-core-docs': https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf + '@mui/internal-docs-utils': https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf + '@mui/internal-markdown': https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf + '@mui/internal-scripts': https://pkg.pr.new/mui/material-ui/@mui/internal-scripts@40645cf + '@mui/material': https://pkg.pr.new/mui/material-ui/@mui/material@40645cf + '@mui/material-nextjs': https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf + '@mui/private-theming': https://pkg.pr.new/mui/material-ui/@mui/private-theming@40645cf + '@mui/styled-engine': https://pkg.pr.new/mui/material-ui/@mui/styled-engine@40645cf + '@mui/stylis-plugin-rtl': https://pkg.pr.new/mui/material-ui/@mui/stylis-plugin-rtl@40645cf + '@mui/system': https://pkg.pr.new/mui/material-ui/@mui/system@40645cf + '@mui/types': https://pkg.pr.new/mui/material-ui/@mui/types@40645cf + '@mui/utils': https://pkg.pr.new/mui/material-ui/@mui/utils@40645cf + # Pin the version otherwise emotion uses its own version resulting in docs build error # @TODO: Debug a fix separately and remove the override stylis: ^4.4.0 @@ -127,3 +147,9 @@ overrides: lockfile: includeResolutionSettings: true + +patchedDependencies: + # Remove after adopting the core-docs font fix from material-ui #49460. + '@mui/internal-core-docs@10.0.0-alpha.0': patches/@mui__internal-core-docs@10.0.0-alpha.0.patch + # Remove after docs-infra ships the export, precompute, and watch fixes. + '@mui/internal-docs-infra@0.13.1-canary.14': patches/@mui__internal-docs-infra@0.13.1-canary.14.patch diff --git a/test/utils/checkMaterialVersion.ts b/test/utils/checkMaterialVersion.ts index 3d5871e7b4b6c..3694eec524a8f 100644 --- a/test/utils/checkMaterialVersion.ts +++ b/test/utils/checkMaterialVersion.ts @@ -7,16 +7,41 @@ type PackageJson = { version: string; }; -let catalogCache: Record | null = null; +interface WorkspaceConfig { + catalog: Record; + overrides?: Record; +} + +interface InstalledPackage { + version: string; + resolved: string; +} + +interface InstalledWorkspace { + name?: string; + dependencies?: Record; + devDependencies?: Record; +} + +let configCache: WorkspaceConfig | null = null; +let installedCache: InstalledWorkspace[] | null = null; -async function getCatalog(): Promise> { - if (!catalogCache) { +async function getWorkspaceConfig(): Promise { + if (!configCache) { const { execa } = await import('execa'); const { stdout } = await execa('pnpm', ['config', 'list', '--json']); - const pnpmWorkspaceConfig = JSON.parse(stdout); - catalogCache = pnpmWorkspaceConfig.catalog as Record; + configCache = JSON.parse(stdout) as WorkspaceConfig; } - return catalogCache; + return configCache!; +} + +async function getInstalledWorkspaces(): Promise { + if (!installedCache) { + const { execa } = await import('execa'); + const { stdout } = await execa('pnpm', ['list', '@mui/material', '--depth', '0', '--json']); + installedCache = JSON.parse(stdout) as InstalledWorkspace[]; + } + return installedCache!; } export function checkMaterialVersion({ @@ -29,11 +54,25 @@ export function checkMaterialVersion({ it.skipIf(!isJSDOM)( `${packageJson.name} should resolve proper @mui/material version`, async () => { - let versionRange = packageJson.devDependencies['@mui/material']; + const config = await getWorkspaceConfig(); + const override = config.overrides?.['@mui/material']; + let versionRange = override ?? packageJson.devDependencies['@mui/material']; if (versionRange === 'catalog:') { - const catalog = await getCatalog(); - versionRange = catalog['@mui/material']; + versionRange = config.catalog['@mui/material']; + } + + // Preview tarballs can report a version outside the published catalog. + // Verify the installed source against the explicit override instead. + if (versionRange.startsWith('https://')) { + const workspaces = await getInstalledWorkspaces(); + const workspace = workspaces.find((entry) => entry.name === packageJson.name); + const installed = + workspace?.devDependencies?.['@mui/material'] ?? + workspace?.dependencies?.['@mui/material']; + expect(installed?.resolved).to.equal(versionRange); + expect(installed?.version).to.equal(materialPackageJson.version); + return; } expect(semver.satisfies(materialPackageJson.version, versionRange)).to.equal( From b45195f716871047c6c79a9ddfba20c9de358a7b Mon Sep 17 00:00:00 2001 From: Brijesh Bittu <717550+brijeshb42@users.noreply.github.com> Date: Fri, 16 Oct 2026 13:13:39 +0530 Subject: [PATCH 2/6] Wire docs demo infrastructure --- docs/next.config.ts | 93 +++++++++++- docs/pages/_app.tsx | 4 + docs/scripts/buildNetlify.cjs | 40 +++++ docs/scripts/exportDemo.test.cjs | 101 +++++++++++++ docs/scripts/formattedTSDemos.js | 11 +- docs/scripts/loadCompactDemoToolbar.cjs | 28 ++++ docs/scripts/loadDemoExportDeps.cjs | 52 +++++++ docs/scripts/loadMigratedMarkdown.cjs | 26 ++++ docs/scripts/migratedMarkdown.test.cjs | 123 +++++++++++++++ docs/scripts/precomputeDemo.test.cjs | 191 ++++++++++++++++++++++++ docs/src/modules/utils/serviceWorker.js | 64 ++++++++ eslint.config.mjs | 46 ++++++ netlify.toml | 8 +- scripts/buildLlmsDocs/index.ts | 14 +- test/regressions/testsBySuite.ts | 76 +++++----- tsconfig.json | 7 + 16 files changed, 828 insertions(+), 56 deletions(-) create mode 100644 docs/scripts/buildNetlify.cjs create mode 100644 docs/scripts/exportDemo.test.cjs create mode 100644 docs/scripts/loadCompactDemoToolbar.cjs create mode 100644 docs/scripts/loadDemoExportDeps.cjs create mode 100644 docs/scripts/loadMigratedMarkdown.cjs create mode 100644 docs/scripts/migratedMarkdown.test.cjs create mode 100644 docs/scripts/precomputeDemo.test.cjs create mode 100644 docs/src/modules/utils/serviceWorker.js diff --git a/docs/next.config.ts b/docs/next.config.ts index 5f0c1ec054903..39c03ee48b052 100644 --- a/docs/next.config.ts +++ b/docs/next.config.ts @@ -30,12 +30,36 @@ declare global { } } +// Match the collapsed snippet length used by the legacy demo previews. +const DEMO_FOCUS_MAX_LINES = 16; +const demoHighlighterOptions = { + deferPrecompute: true, + emphasisOptions: { + emitFrameIndent: true, + focusFramesMaxSize: DEMO_FOCUS_MAX_LINES, + oversizedFocus: 'hide', + }, + requireClient: '@mui/internal-core-docs/utils/createDemoClient', + transformTypescriptToJavascript: true, +}; + const IS_PRODUCTION = process.env.NODE_ENV === 'production'; const currentDirectory = url.fileURLToPath(new URL('.', import.meta.url)); const require = createRequire(import.meta.url); +// The pinned core-docs preview ships these files but omits their export entries. +// Keep these aliases until the preview package exports its demo factories. +const coreDocsDirectory = path.dirname(require.resolve('@mui/internal-core-docs/package.json')); +const demoFactoryAliases = { + '@mui/internal-core-docs/utils/createDemo': path.join(coreDocsDirectory, 'utils/createDemo.js'), + '@mui/internal-core-docs/utils/createDemoClient': path.join( + coreDocsDirectory, + 'utils/createDemoClient.js', + ), +}; + const WORKSPACE_ROOT = path.resolve(currentDirectory, '../'); function loadPkg(pkgPath: string): { version: string } { @@ -111,14 +135,10 @@ export default withDeploymentConfig({ reactStrictMode: true, experimental: { esmExternals: undefined, - // Run each webpack compilation in a separate, disposable worker process so - // its memory is released before static generation instead of accumulating - // in the long-lived build process. This is off by default whenever a custom - // `webpack` config is present (Next resolves the `undefined` default to - // `false` when `config.webpack` is set), so it must be enabled explicitly. - // Cuts peak docs-build RSS from ~10 GB to ~4 GB, keeping it well under the - // Netlify build container limit that the static export was hitting. + // Dispose compiler memory before static generation. webpackBuildWorker: true, + // Avoid duplicate source buffers when compiling all docs demos. + webpackMemoryOptimizations: true, // The TS7 side-by-side alias (@typescript/typescript6) ships no `tsc` bin, // which the Next.js >= 16.3 CLI checker requires. Use the TS6 JS API instead. useTypeScriptCli: false, @@ -152,6 +172,7 @@ export default withDeploymentConfig({ MUI_CHAT_SCOPES: 'x-data-grid,x-date-pickers,x-charts,x-tree-view', }, turbopack: { + resolveAlias: demoFactoryAliases, resolveExtensions: ['.mjs', '.tsx', '.ts', '.jsx', '.js', '.json'], rules: { // `.md?muiMarkdown` → markdown loader (mirrors the webpack `oneOf` branch). @@ -163,6 +184,26 @@ export default withDeploymentConfig({ as: '*.js', }, ], + '**/@mui/internal-core-docs/MarkdownDocs/RichMarkdownElement.js': { + loaders: [path.join(currentDirectory, 'scripts/loadMigratedMarkdown.cjs')], + }, + '**/DemoContent/DemoContentLoading.js': { + loaders: [path.join(currentDirectory, 'scripts/loadCompactDemoToolbar.cjs')], + }, + '**/DemoContent/exportConfig.js': { + loaders: [path.join(currentDirectory, 'scripts/loadDemoExportDeps.cjs')], + }, + './**/demos/*/index.ts': { + loaders: [ + { + loader: '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter', + options: demoHighlighterOptions, + }, + ], + }, + './**/demos/*/client.ts': { + loaders: ['@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighterClient'], + }, // Token replacement that webpack does via `string-replace-loader`. // `{ not: 'foreign' }` keeps it off node_modules; the tokens only live in // first-party source (`docs/` and `packages/*/src`). @@ -183,6 +224,11 @@ export default withDeploymentConfig({ }, }, webpack: (config, options) => { + // Keep compiler caches out of CI build memory. + if (process.env.CI === 'true' && !options.dev) { + config.cache = false; + } + const plugins = config.plugins.slice(); if (process.env.DOCS_STATS_ENABLED) { @@ -201,6 +247,10 @@ export default withDeploymentConfig({ return { ...config, plugins, + resolve: { + ...config.resolve, + alias: { ...config.resolve.alias, ...demoFactoryAliases }, + }, module: { ...config.module, rules: config.module.rules.concat([ @@ -225,6 +275,35 @@ export default withDeploymentConfig({ }, ], }, + { + test: /[/\\]@mui[/\\]internal-core-docs[/\\]MarkdownDocs[/\\]RichMarkdownElement\.js$/, + use: [path.join(currentDirectory, 'scripts/loadMigratedMarkdown.cjs')], + }, + { + test: /[/\\]@mui[/\\]internal-core-docs[/\\]DemoContent[/\\]DemoContentLoading\.js$/, + use: [path.join(currentDirectory, 'scripts/loadCompactDemoToolbar.cjs')], + }, + { + test: /[/\\]@mui[/\\]internal-core-docs[/\\]DemoContent[/\\]exportConfig\.js$/, + use: [path.join(currentDirectory, 'scripts/loadDemoExportDeps.cjs')], + }, + { + test: /[/\\]demos[/\\][^/\\]+[/\\]index\.ts$/, + use: [ + options.defaultLoaders.babel, + { + loader: '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter', + options: demoHighlighterOptions, + }, + ], + }, + { + test: /[/\\]demos[/\\][^/\\]+[/\\]client\.ts$/, + use: [ + options.defaultLoaders.babel, + '@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighterClient', + ], + }, { test: /\.(ts|tsx)$/, loader: 'string-replace-loader', diff --git a/docs/pages/_app.tsx b/docs/pages/_app.tsx index 65dc603331af9..2052cbaca40e3 100644 --- a/docs/pages/_app.tsx +++ b/docs/pages/_app.tsx @@ -15,6 +15,7 @@ import type { VersionEntry } from '@mui/internal-core-docs/DocsProvider'; import { LicenseInfo } from '@mui/x-license'; import { muiXTelemetrySettings } from '@mui/x-telemetry'; import xPages from 'docs/data/pages'; // DO NOT REMOVE +import { registerServiceWorker } from 'docs/src/modules/utils/serviceWorker'; import { postProcessImport } from 'docs/src/modules/utils/postProcessImport'; import { ExperimentLayout } from 'docs/src/modules/components/ExperimentLayout'; import type { AppProps } from 'next/app'; @@ -284,6 +285,9 @@ export default function MyApp( const { Component } = props; const { pathname } = useRouter(); const isExperimentPage = pathname === '/x/experiments' || pathname.startsWith('/x/experiments/'); + React.useEffect(() => { + registerServiceWorker('/x/sw.js'); + }, []); const pageProps = React.useMemo(() => { const { userLanguage = 'en', diff --git a/docs/scripts/buildNetlify.cjs b/docs/scripts/buildNetlify.cjs new file mode 100644 index 0000000000000..432bc527ce1d0 --- /dev/null +++ b/docs/scripts/buildNetlify.cjs @@ -0,0 +1,40 @@ +const { spawnSync } = require('node:child_process'); +const { readFileSync } = require('node:fs'); + +const MEMORY_FILES = [ + '/sys/fs/cgroup/memory.max', + '/sys/fs/cgroup/memory.peak', + '/sys/fs/cgroup/memory.events', + '/sys/fs/cgroup/memory/memory.limit_in_bytes', + '/sys/fs/cgroup/memory/memory.max_usage_in_bytes', + '/sys/fs/cgroup/memory/memory.failcnt', +]; + +function logMemory(phase) { + for (const file of MEMORY_FILES) { + try { + process.stdout.write(`[netlify ${phase}] ${file}:\n${readFileSync(file, 'utf8').trim()}\n`); + } catch { + // Cgroup files vary by host; diagnostics must not block the build. + } + } +} + +process.stdout.write(`[netlify] Node ${process.version}\n`); +for (const name of ['NODE_OPTIONS', 'NEXT_WEBPACK_PARALLELISM']) { + process.stdout.write(`[netlify] ${name}=${process.env[name] ?? '(unset)'}\n`); +} + +logMemory('before'); +const result = spawnSync('pnpm', ['docs:build'], { stdio: 'inherit' }); +logMemory('after'); + +if (result.error) { + throw result.error; +} + +if (result.signal) { + process.kill(process.pid, result.signal); +} else { + process.exitCode = result.status; +} diff --git a/docs/scripts/exportDemo.test.cjs b/docs/scripts/exportDemo.test.cjs new file mode 100644 index 0000000000000..7e3e51dc99e05 --- /dev/null +++ b/docs/scripts/exportDemo.test.cjs @@ -0,0 +1,101 @@ +const assert = require('node:assert/strict'); +const { test } = require('node:test'); +const fs = require('node:fs'); +const path = require('node:path'); +const { pathToFileURL } = require('node:url'); +const babel = require('@babel/core'); +const transform = require('./loadDemoExportDeps.cjs'); + +const PICKERS_PACKAGE = '@mui/x-date-pickers'; +const ADAPTER_IMPORT = `${PICKERS_PACKAGE}/AdapterDayjs`; +const PICKERS_VERSION = '^9.0.0'; + +// Pinned product versions must still resolve adapter and generator peers. +test('resolves pinned dependencies with their full import paths', async () => { + const { exportVariant } = await import('@mui/internal-docs-infra/useDemo'); + let imports; + const { exported } = exportVariant( + { + source: 'export default function Demo() { return null; }', + fileName: 'Demo.tsx', + externals: [ADAPTER_IMPORT], + }, + { + versions: { [PICKERS_PACKAGE]: PICKERS_VERSION }, + resolveDependencies(packageName, _envVars, importPaths) { + assert.equal(packageName, PICKERS_PACKAGE); + imports = importPaths; + return { [packageName]: 'latest', dayjs: 'latest' }; + }, + }, + ); + const { dependencies } = JSON.parse(exported.extraFiles['../package.json'].source); + + assert.equal(dependencies.dayjs, 'latest'); + assert.equal(dependencies[PICKERS_PACKAGE], PICKERS_VERSION); + assert.deepEqual(imports, [ADAPTER_IMPORT]); +}); + +// Exercise the compiled preview through the consumer loader and public exporter. +test('keeps bundled declarations without nonexistent type packages', async () => { + const corePath = path.join( + path.dirname(require.resolve('@mui/internal-core-docs/package.json')), + 'DemoContent/exportConfig.js', + ); + const coreSource = transform(fs.readFileSync(corePath, 'utf8')).replace( + "'@mui/internal-docs-infra/useDemo'", + JSON.stringify(pathToFileURL(require.resolve('@mui/internal-docs-infra/useDemo')).href), + ); + const adapterPath = path.resolve(__dirname, '../src/modules/utils/postProcessImport.ts'); + const { code } = babel.transformSync(fs.readFileSync(adapterPath, 'utf8'), { + filename: adapterPath, + babelrc: false, + configFile: false, + presets: [require.resolve('@babel/preset-typescript')], + }); + const { postProcessImport } = await import( + `data:text/javascript;base64,${Buffer.from(code).toString('base64')}` + ); + const { buildExportConfig } = await import( + `data:text/javascript;base64,${Buffer.from(coreSource).toString('base64')}` + ); + const previousDeps = process.env.PICKERS_ADAPTERS_DEPS; + process.env.PICKERS_ADAPTERS_DEPS = JSON.stringify({ 'date-fns-jalali': 'latest' }); + + try { + const config = buildExportConfig({ + csbConfig: { postProcessImport }, + useTypescriptRef: { current: true }, + }); + const { exported } = config.exportFunction( + { + source: 'export default function Demo() { return null; }', + fileName: 'Demo.tsx', + externals: [ + `${PICKERS_PACKAGE}/AdapterDateFnsJalali`, + '@emotion/cache', + 'rxjs', + '@tanstack/query-core', + ], + }, + { ...config, useTypescript: true }, + ); + const { dependencies } = JSON.parse(exported.extraFiles['../package.json'].source); + + for (const [dependency, types] of [ + ['date-fns-jalali', '@types/date-fns-jalali'], + ['@emotion/cache', '@types/emotion__cache'], + ['rxjs', '@types/rxjs'], + ['@tanstack/query-core', '@types/tanstack__query-core'], + ]) { + assert.ok(dependencies[dependency], dependency); + assert.equal(dependencies[types], undefined, types); + } + } finally { + if (previousDeps === undefined) { + delete process.env.PICKERS_ADAPTERS_DEPS; + } else { + process.env.PICKERS_ADAPTERS_DEPS = previousDeps; + } + } +}); diff --git a/docs/scripts/formattedTSDemos.js b/docs/scripts/formattedTSDemos.js index 89e116eada233..6ef607d556b9a 100644 --- a/docs/scripts/formattedTSDemos.js +++ b/docs/scripts/formattedTSDemos.js @@ -58,6 +58,14 @@ async function getFiles(root, excludeRoot = false) { const stat = await fs.promises.stat(filePath); if (stat.isDirectory()) { + // Docs-infra generates JS and focused source at build time. Keep + // transpiling only the legacy demos while areas migrate in stages. + if ( + fs.existsSync(path.join(filePath, 'index.ts')) && + fs.existsSync(path.join(filePath, 'client.ts')) + ) { + return; + } files.push(...(await getFiles(filePath))); } else if ( stat.isFile() && @@ -87,11 +95,8 @@ const TranspileResult = { }; const previewOverride = { - 'docs/data/charts/axis/GroupedAxes.tsx': { maxLines: 30 }, 'docs/data/charts/axis/GroupedAxesStyling.tsx': { maxLines: 30 }, 'docs/data/charts/axis/GroupedAxesTickSize.tsx': { maxLines: 30 }, - 'docs/data/charts/axis/GroupedYAxes.tsx': { maxLines: 30 }, - 'docs/data/charts/sankey/SankeyDetailedDataStructure.tsx': { maxLines: 30 }, }; async function transpileFile(tsxPath, ignoreCache = false) { diff --git a/docs/scripts/loadCompactDemoToolbar.cjs b/docs/scripts/loadCompactDemoToolbar.cjs new file mode 100644 index 0000000000000..f086564348365 --- /dev/null +++ b/docs/scripts/loadCompactDemoToolbar.cjs @@ -0,0 +1,28 @@ +/** + * Keep the pinned preview's SSR toolbar compact while preserving its 47px + * desktop row (42px content, 4px padding, 1px border). The live toolbar still + * renders all controls after hydration. Its inert SSR copy otherwise adds + * about 6KB of markup per demo and eagerly renders the toolbar's Emotion CSS. + */ +function compactDemoToolbar(source) { + const importStatement = 'import { DemoToolbar } from "./DemoToolbar.js";'; + // The preview uses `_jsx` without whitespace after the PURE annotation. + const start = ' const toolbar = /*#__PURE__*/_jsx(DemoToolbar, {'; + const startIndex = source.indexOf(start); + const endIndex = source.indexOf('\n });', startIndex); + if (!source.includes(importStatement) || startIndex === -1 || endIndex === -1) { + throw new Error( + 'The core-docs preview toolbar changed. Update or remove loadCompactDemoToolbar.', + ); + } + return `${source.slice( + 0, + startIndex, + )} const toolbar = _jsx("div", { "aria-hidden": true, style: { height: 42, width: "100%" } });${source.slice( + endIndex + '\n });'.length, + )}` + .replace(importStatement, '') + .replace('const noop = () => {};\nconst noopAsync = async () => {};', ''); +} + +module.exports = compactDemoToolbar; diff --git a/docs/scripts/loadDemoExportDeps.cjs b/docs/scripts/loadDemoExportDeps.cjs new file mode 100644 index 0000000000000..a0493ff94f7f7 --- /dev/null +++ b/docs/scripts/loadDemoExportDeps.cjs @@ -0,0 +1,52 @@ +// Keep adapter import paths and configured peers in sandbox exports until the +// pinned core-docs preview includes the upstream resolver fix. +function fixDemoExportDeps(source) { + const start = ' const resolveDependencies = packageName => {'; + const end = '\n return {\n versions,\n resolveDependencies\n };'; + const startIndex = source.indexOf(start); + const endIndex = source.indexOf(end, startIndex); + + if (startIndex === -1 || endIndex === -1) { + throw new Error('The core-docs export resolver changed. Update or remove loadDemoExportDeps.'); + } + + const resolver = ` const bundledTypes = [ + ...PACKAGES_WITH_BUNDLED_TYPES, + '@emotion/cache', + 'date-fns-jalali', + 'rxjs', + '@tanstack/query-core' + ]; + const resolveDependencies = (packageName, _envVars, importedModules = [packageName]) => { + let result = { [packageName]: versions[packageName] ?? 'latest' }; + + if (packageName === '@mui/lab' || packageName === '@mui/icons-material' || packageName === '@mui/x-data-grid') { + result['@mui/material'] = versions['@mui/material'] ?? 'latest'; + } + + if (csbConfig?.postProcessImport) { + for (const importName of importedModules) { + Object.assign(result, csbConfig.postProcessImport(importName)); + } + } + + if (csbConfig?.includePeerDependencies) { + result = csbConfig.includePeerDependencies(result, { versions }); + } + + if (useTypescriptRef.current) { + for (const dependency of Object.keys(result)) { + if (bundledTypes.includes(dependency) || isMuiPackage(dependency) || dependency.startsWith('@types/')) { + continue; + } + result[getTypesPackageName(dependency)] = 'latest'; + } + } + + return result; + };`; + + return source.slice(0, startIndex) + resolver + source.slice(endIndex); +} + +module.exports = fixDemoExportDeps; diff --git a/docs/scripts/loadMigratedMarkdown.cjs b/docs/scripts/loadMigratedMarkdown.cjs new file mode 100644 index 0000000000000..fac30237dd4e6 --- /dev/null +++ b/docs/scripts/loadMigratedMarkdown.cjs @@ -0,0 +1,26 @@ +const LEGACY_IMPORTS = [ + 'import { Demo } from "../Demo/Demo.js";', + 'import { DemoToolbar } from "../Demo/DemoToolbar.js";', +]; +const LEGACY_BRANCH = ' const name = renderedMarkdownOrDemo.demo;'; +const LEGACY_END = ' demoToolbarSlot: DemoToolbar\n });\n}'; + +// X has no legacy demo directives; exclude their UI from every markdown page. +function migratedMarkdown(source) { + const start = source.indexOf(LEGACY_BRANCH); + if ( + start === -1 || + !source.trimEnd().endsWith(LEGACY_END) || + LEGACY_IMPORTS.some((statement) => !source.includes(statement)) + ) { + throw new Error('The core-docs markdown renderer changed. Update loadMigratedMarkdown.'); + } + + let rendered = `${source.slice(0, start)} throw new Error("MUI X docs: Legacy demo directives are unsupported. Use a file:// component directive.");\n}\n`; + for (const statement of LEGACY_IMPORTS) { + rendered = rendered.replace(statement, ''); + } + return rendered; +} + +module.exports = migratedMarkdown; diff --git a/docs/scripts/migratedMarkdown.test.cjs b/docs/scripts/migratedMarkdown.test.cjs new file mode 100644 index 0000000000000..ae397dd558147 --- /dev/null +++ b/docs/scripts/migratedMarkdown.test.cjs @@ -0,0 +1,123 @@ +const assert = require('node:assert/strict'); +const fs = require('node:fs/promises'); +const os = require('node:os'); +const path = require('node:path'); +const { createRequire } = require('node:module'); +const { test } = require('node:test'); +const React = require('react'); +const { renderToString } = require('react-dom/server'); +const nextWebpack = require('next/dist/compiled/webpack/webpack'); + +const webpack = nextWebpack.webpack; +const coreDirectory = path.dirname(require.resolve('@mui/internal-core-docs/package.json')); +const rendererPath = path.join(coreDirectory, 'MarkdownDocs/RichMarkdownElement.js'); +const loaderPath = path.join(__dirname, 'loadMigratedMarkdown.cjs'); + +// Check the real bundle graph and SSR output, including tabbed code blocks. +test('keeps migrated markdown SSR without bundling legacy demos', async () => { + const directory = await fs.mkdtemp(path.join(os.tmpdir(), 'mui-markdown-renderer-')); + const entry = path.join(directory, 'entry.js'); + await fs.writeFile( + entry, + `export { RichMarkdownElement } from ${JSON.stringify(rendererPath)};\nexport { ThemeProvider } from '@mui/material/styles';\nexport { brandingLightTheme } from ${JSON.stringify(path.join(coreDirectory, 'branding/brandingTheme.js'))};\n`, + ); + + async function build(mode) { + const outputPath = path.join(directory, mode, 'renderer.cjs'); + const compiler = webpack({ + mode: 'development', + target: 'node', + entry, + resolve: { modules: [path.join(__dirname, '../node_modules'), 'node_modules'] }, + output: { + path: path.dirname(outputPath), + filename: 'renderer.cjs', + library: { type: 'commonjs2' }, + }, + externals: [ + ({ context, request }, callback) => { + if ( + request === 'react' || + request.startsWith('react/') || + request.startsWith('react-dom') || + request.startsWith('next/') + ) { + callback(null, `commonjs ${require.resolve(request, { paths: [context, __dirname] })}`); + return; + } + callback(); + }, + ], + module: { + rules: + mode === 'candidate' + ? [{ test: /MarkdownDocs[/\\]RichMarkdownElement\.js$/, use: [loaderPath] }] + : [], + }, + optimization: { minimize: false }, + devtool: false, + }); + let stats; + + try { + stats = await new Promise((resolve, reject) => { + compiler.run((error, result) => { + if (error) { + reject(error); + return; + } + resolve(result); + }); + }); + assert.equal(stats.hasErrors(), false, stats.toString({ all: false, errors: true })); + } finally { + await new Promise((resolve) => { + compiler.close(resolve); + }); + } + + const { RichMarkdownElement, ThemeProvider, brandingLightTheme } = + createRequire(outputPath)(outputPath); + const cases = [ + { renderedMarkdownOrDemo: '

Markdown text

' }, + { + renderedMarkdownOrDemo: { component: 'demo', label: 'Demo text' }, + srcComponents: { demo: ({ label }) => React.createElement('span', null, label) }, + }, + { + renderedMarkdownOrDemo: { + type: 'codeblock', + data: [{ tab: 'JS', code: 'const value = 1;', language: 'js' }], + }, + }, + ]; + const html = cases.map((props) => + renderToString( + React.createElement( + ThemeProvider, + { theme: brandingLightTheme }, + React.createElement(RichMarkdownElement, props), + ), + ), + ); + assert.ok(html[0].includes('

Markdown text

')); + assert.equal(html[1], 'Demo text'); + assert.ok(html[2].includes('role="tab"')); + assert.ok(html[2].includes('const')); + const resources = [...stats.compilation.modules].map((module) => module.resource || ''); + return { html, resources }; + } + + try { + const baseline = await build('baseline'); + const candidate = await build('candidate'); + assert.deepEqual(candidate.html, baseline.html); + assert.equal( + candidate.resources.some((resource) => /[/\\]Demo[/\\]Demo(?:Toolbar)?\.js$/.test(resource)), + false, + 'legacy demo modules stay out of migrated bundles', + ); + } finally { + await fs.rm(directory, { recursive: true, force: true }); + } +}); diff --git a/docs/scripts/precomputeDemo.test.cjs b/docs/scripts/precomputeDemo.test.cjs new file mode 100644 index 0000000000000..43f011a51cd0a --- /dev/null +++ b/docs/scripts/precomputeDemo.test.cjs @@ -0,0 +1,191 @@ +const assert = require('node:assert/strict'); +const fs = require('node:fs/promises'); +const os = require('node:os'); +const path = require('node:path'); +const { test } = require('node:test'); +const { performance } = require('node:perf_hooks'); +const { createRequire } = require('node:module'); +const nextWebpack = require('next/dist/compiled/webpack/webpack'); + +const webpack = nextWebpack.webpack; + +const DEFERRED_QUERY = '?mui-deferred-precompute'; +const WATCH_TIMEOUT_MS = 30_000; +const WATCH_AGGREGATE_MS = 20; +const VARIANT_MEASURE = + '| Load Precomputed Code Highlighter | Complete Variants Loading - index.ts'; +const loader = require.resolve('@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter'); + +// Deferred source must watch imported files, not retain the previous compilation's code. +test( + 'refreshes deferred demo source after a watched dependency changes', + { timeout: WATCH_TIMEOUT_MS }, + async () => { + const directory = await fs.realpath( + await fs.mkdtemp(path.join(os.tmpdir(), 'mui-demo-precompute-')), + ); + const demoPath = path.join(directory, 'Demo.js'); + const helperPath = path.join(directory, 'helper.js'); + const outputPath = path.join(directory, 'dist', 'main.cjs'); + const loadOutput = createRequire(outputPath); + await fs.writeFile(helperPath, 'export const label = "Before";\n'); + await fs.writeFile( + demoPath, + 'import { label } from "./helper";\nexport default function Demo() { return label; }\n', + ); + await fs.writeFile( + path.join(directory, 'factory.js'), + 'export function createDemo(url, demo, options) { return options; }\n', + ); + await fs.writeFile( + path.join(directory, 'index.ts'), + 'import { createDemo } from "./factory";\nimport Demo from "./Demo";\nexport default createDemo(import.meta.url, Demo, {});\n', + ); + + const compiler = webpack({ + mode: 'development', + target: 'node', + context: directory, + entry: './index.ts', + output: { + path: path.join(directory, 'dist'), + filename: 'main.cjs', + chunkFilename: '[id].[contenthash].cjs', + library: { type: 'commonjs2' }, + }, + resolve: { extensions: ['.ts', '.js'] }, + module: { + rules: [ + { + test: /index\.ts$/, + use: [{ loader, options: { deferPrecompute: true, output: 'hast' } }], + }, + ], + }, + optimization: { minimize: false }, + devtool: false, + }); + let watching; + let builds = 0; + const priorMeasures = performance.getEntriesByName(VARIANT_MEASURE).length; + + try { + await new Promise((resolve, reject) => { + watching = compiler.watch({ aggregateTimeout: WATCH_AGGREGATE_MS }, (error, stats) => { + (async () => { + assert.ifError(error); + assert.equal(stats.hasErrors(), false, stats.toString({ all: false, errors: true })); + const deferred = [...stats.compilation.modules].find((module) => + module.resource?.endsWith(DEFERRED_QUERY), + ); + assert.ok(deferred, 'deferred source module'); + const dependencies = new Set(deferred.buildInfo.snapshot.getFileIterable()); + assert.ok(dependencies.has(demoPath), 'demo dependency'); + assert.ok(dependencies.has(helperPath), 'transitive helper dependency'); + delete require.cache[outputPath]; + const variants = await loadOutput(outputPath).default.loadPrecompute(); + const serialized = JSON.stringify(variants); + builds += 1; + assert.equal( + performance.getEntriesByName(VARIANT_MEASURE).length - priorMeasures, + builds, + 'precomputes each demo once per compilation', + ); + + if (builds === 1) { + assert.ok(serialized.includes('Before')); + await fs.writeFile(helperPath, 'export const label = "After";\n'); + return; + } + + assert.ok(serialized.includes('After')); + assert.equal(serialized.includes('Before'), false); + resolve(); + })().catch(reject); + }); + }); + } finally { + await new Promise((resolve) => { + watching.close(resolve); + }); + await new Promise((resolve) => { + compiler.close(resolve); + }); + await fs.rm(directory, { recursive: true, force: true }); + } + }, +); + +// Non-enumerable output options must not collide with JSON-equivalent loader options. +test('preserves a deferred output option omitted by JSON serialization', async () => { + const directory = await fs.realpath( + await fs.mkdtemp(path.join(os.tmpdir(), 'mui-demo-precompute-options-')), + ); + const outputPath = path.join(directory, 'dist', 'main.cjs'); + const loadOutput = createRequire(outputPath); + await fs.writeFile( + path.join(directory, 'Demo.js'), + 'export default function Demo() { return "Demo"; }\n', + ); + await fs.writeFile( + path.join(directory, 'factory.js'), + 'export function createDemo(url, demo, options) { return options; }\n', + ); + await fs.writeFile( + path.join(directory, 'index.ts'), + 'import { createDemo } from "./factory";\nimport Demo from "./Demo";\nexport default createDemo(import.meta.url, Demo, {});\n', + ); + const deferredOptions = { deferPrecompute: true }; + Object.defineProperty(deferredOptions, 'output', { value: 'hast' }); + const compiler = webpack({ + mode: 'development', + target: 'node', + context: directory, + entry: './index.ts', + output: { + path: path.join(directory, 'dist'), + filename: 'main.cjs', + library: { type: 'commonjs2' }, + }, + resolve: { extensions: ['.ts', '.js'] }, + module: { + rules: [ + { + test: /index\.ts$/, + oneOf: [ + { + resourceQuery: /mui-deferred-precompute/, + use: [{ loader, options: deferredOptions }], + }, + { use: [{ loader, options: { deferPrecompute: true } }] }, + ], + }, + ], + }, + optimization: { minimize: false }, + devtool: false, + }); + + try { + await new Promise((resolve, reject) => { + compiler.run((error, stats) => { + if (error) { + reject(error); + return; + } + if (stats.hasErrors()) { + reject(new Error(stats.toString({ all: false, errors: true }))); + return; + } + resolve(); + }); + }); + const variants = await loadOutput(outputPath).default.loadPrecompute(); + assert.equal(variants.Default.source.type, 'root'); + } finally { + await new Promise((resolve) => { + compiler.close(resolve); + }); + await fs.rm(directory, { recursive: true, force: true }); + } +}); diff --git a/docs/src/modules/utils/serviceWorker.js b/docs/src/modules/utils/serviceWorker.js new file mode 100644 index 0000000000000..59e16fb172142 --- /dev/null +++ b/docs/src/modules/utils/serviceWorker.js @@ -0,0 +1,64 @@ +let reloadInterval; + +// Avoid infinite loop when "Update on reload" is set in the Chrome sw dev tools. +function lazyReload() { + clearInterval(reloadInterval); + reloadInterval = setInterval(() => { + if (document.hasFocus()) { + window.location.reload(); + } + }, 100); +} + +// Inspired by +// https://developers.google.com/web/tools/workbox/guides/advanced-recipes#offer_a_page_reload_for_users +function forcePageReload(registration) { + // console.log('already controlled?', Boolean(navigator.serviceWorker.controller)); + + if (!navigator.serviceWorker.controller) { + // The window client isn't currently controlled so it's a new service + // worker that will activate immediately. + return; + } + + // console.log('registration waiting?', Boolean(registration.waiting)); + if (registration.waiting) { + // SW is waiting to activate. Can occur if multiple clients open and + // one of the clients is refreshed. + registration.waiting.postMessage('skipWaiting'); + return; + } + function listenInstalledStateChange() { + registration.installing.addEventListener('statechange', (event) => { + // console.log('statechange', event.target.state); + if (event.target.state === 'installed' && registration.waiting) { + // A new service worker is available, inform the user + registration.waiting.postMessage('skipWaiting'); + } else if (event.target.state === 'activated') { + // Force the control of the page by the activated service worker. + lazyReload(); + } + }); + } + if (registration.installing) { + listenInstalledStateChange(); + return; + } + + // We are currently controlled so a new SW may be found... + // Add a listener in case a new SW is found, + registration.addEventListener('updatefound', listenInstalledStateChange); +} +export async function registerServiceWorker(swPath) { + const { host } = window.location; + if ( + 'serviceWorker' in navigator && + process.env.NODE_ENV === 'production' && + (host === 'mui.com' || host.endsWith('.mui.com')) + ) { + // register() automatically attempts to refresh the sw.js. + const registration = await navigator.serviceWorker.register(swPath); + // Force the page reload for users. + forcePageReload(registration); + } +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 8acc9c7ca7b67..374dfe7883189 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -13,6 +13,7 @@ import eslintPluginMuiX from 'eslint-plugin-mui-x'; import { defineConfig } from 'eslint/config'; import * as path from 'node:path'; import * as url from 'node:url'; +import { lintJavascriptDemoFocus } from '@mui/internal-docs-infra/pipeline/lintJavascriptDemoFocus'; import remarkConfig from './.remarkrc.mjs'; const eslintPluginConsistentName = fixupPluginRules(eslintPluginConsistentNameRaw); @@ -189,6 +190,9 @@ export default defineConfig( 'ts-ignore', 'ts-nocheck', 'typescript-to-proptypes-ignore', + // Docs-infra reads these plain block comments as source metadata. + 'focus-start', + 'focus-end', ], }, ], @@ -460,6 +464,48 @@ export default defineConfig( }, }, + { + files: [ + 'docs/data/**/demos/*/*.tsx', + 'docs/data/**/demos/*/*.jsx', + 'docs/src/pages/production-error/demos/*/*.tsx', + ], + // Legacy showcase directories also contain shared helpers. + ignores: ['docs/data/data-grid/demos/*/*.tsx'], + plugins: { + 'docs-infra': { rules: { 'require-demo-focus': lintJavascriptDemoFocus } }, + }, + rules: { + 'docs-infra/require-demo-focus': ['error', { wrapReturn: true }], + }, + }, + { + files: ['docs/src/pages/production-error/demos/*/*.tsx'], + // The decoder has no Grid API and needs no type-aware state checks. + rules: { + 'mui-x/no-direct-state-access': 'off', + }, + }, + { + files: ['docs/data/**/demos/*/client.ts'], + rules: { + 'consistent-default-export-name/default-export-match-filename': 'off', + }, + }, + + { + // The precomputed live editor imports runtime symbols explicitly. Type-only + // imports must not become editor externals, including shared demo helpers. + files: ['docs/data/**/*.{ts,tsx}', 'docs/src/pages/production-error/demos/*/*.tsx'], + rules: { + '@typescript-eslint/consistent-type-imports': [ + 'error', + { fixStyle: 'separate-type-imports' }, + ], + 'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], + }, + }, + // Next.js entry points pages { files: [`docs/pages/**/*${EXTENSION_TS}`], diff --git a/netlify.toml b/netlify.toml index 15f5a020835e3..722552a3ba0f3 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,15 +3,15 @@ publish = "docs/export/" # Build command. - command = "pnpm docs:build" + command = "node docs/scripts/buildNetlify.cjs" [build.environment] NODE_VERSION = "22.23.4" PNPM_FLAGS = "--frozen-lockfile" - # Single-threaded docs build: one large-heap worker fits the ~11 GiB build - # container; two multi-GiB workers overflow it (OOM). - NODE_OPTIONS = "--max-old-space-size=8192" + # Leave memory for native source buffers outside the compiler heap. + NODE_OPTIONS = "--max-old-space-size=5120" NEXT_PARALLELISM = "1" + NEXT_WEBPACK_PARALLELISM = "8" # disabled because of https://github.com/mui/mui-public/issues/809 # TODO: Re-enable after either: diff --git a/scripts/buildLlmsDocs/index.ts b/scripts/buildLlmsDocs/index.ts index 4e822cb95130a..ea85aa3ff50a7 100644 --- a/scripts/buildLlmsDocs/index.ts +++ b/scripts/buildLlmsDocs/index.ts @@ -306,7 +306,7 @@ function findNonComponentMarkdownFiles( /** * Process a single component by combining its markdown and API documentation */ -function processComponent(component: ComponentDocInfo): string | null { +async function processComponent(component: ComponentDocInfo): Promise { // Skip if no markdown file found if (!component.markdownPath) { console.error(`Warning: No markdown file found for component: ${component.name}`); @@ -314,7 +314,7 @@ function processComponent(component: ComponentDocInfo): string | null { } // Process the markdown file with demo replacement - let processedMarkdown = processMarkdownFile(component.markdownPath); + let processedMarkdown = await processMarkdownFile(component.markdownPath); // Read the frontmatter to get all components listed in this markdown file const markdownContent = fs.readFileSync(component.markdownPath, 'utf-8'); @@ -468,13 +468,13 @@ async function processApiSection( apiMarkdown = processApiFile(jsonFilePathDouble); } else if (fs.existsSync(markdownFilePath)) { // Process the markdown file from docs/data - apiMarkdown = processMarkdownFile(markdownFilePath); + apiMarkdown = await processMarkdownFile(markdownFilePath); } else if (fs.existsSync(markdownFilePathPages)) { // Process the markdown file from docs/pages - apiMarkdown = processMarkdownFile(markdownFilePathPages); + apiMarkdown = await processMarkdownFile(markdownFilePathPages); } else if (fs.existsSync(markdownFilePathPagesIndex)) { // Process the markdown file from docs/pages - apiMarkdown = processMarkdownFile(markdownFilePathPagesIndex); + apiMarkdown = await processMarkdownFile(markdownFilePathPagesIndex); } else { throw new Error( `Warning: API file not found (tried JSON and markdown in multiple patterns): ${apiItem.pathname} @@ -814,7 +814,7 @@ async function buildLlmsDocs(argv: ArgumentsCamelCase): Promise< // Process each component for (const component of components) { try { - const processedMarkdown = processComponent(component); + const processedMarkdown = await processComponent(component); if (!processedMarkdown) { continue; @@ -878,7 +878,7 @@ async function buildLlmsDocs(argv: ArgumentsCamelCase): Promise< for (const file of nonComponentFiles) { try { // Process the markdown file with demo replacement - const processedMarkdown = processMarkdownFile(file.markdownPath); + const processedMarkdown = await processMarkdownFile(file.markdownPath); const outputPath = path.join(outputDir, file.outputPath); diff --git a/test/regressions/testsBySuite.ts b/test/regressions/testsBySuite.ts index a8523b2bf75be..3cf2bafffbac2 100644 --- a/test/regressions/testsBySuite.ts +++ b/test/regressions/testsBySuite.ts @@ -16,53 +16,56 @@ const removeExtension = (filePath: string) => { const docsImports = import.meta.glob( [ 'docs/data/**/[A-Z]*.js', + // Docs-infra demos keep a single TSX source instead of generated JS. + 'docs/data/**/demos/*/[A-Z]*.tsx', // Hooks examples 'docs/data/**/use[A-Z]*.js', + 'docs/data/**/demos/*/use[A-Z]*.tsx', // ================== Exclusions ================== - '!docs/data/charts/lines/GDPperCapita.js', + '!docs/data/charts/lines/{,demos/*/}GDPperCapita.{js,tsx}', '!docs/data/data-grid/list-view/components/*.js', // Excludes demos that we don't want '!docs/data/**/*NoSnap.*', - '!docs/data/data-grid/filtering/RemoveBuiltInOperators', // Needs interaction - '!docs/data/data-grid/filtering/CustomRatingOperator', // Needs interaction - '!docs/data/data-grid/filtering/CustomInputComponent', // Needs interaction - '!docs/data/data-grid/server-side-data/ServerSideLazyLoadingRevalidation', // Flashes cause flaky argos screenshots - '!docs/data/data-grid/server-side-data/ServerSideLazyLoadingTreeDataRevalidation', // Flashes cause flaky argos screenshots - '!docs/data/data-grid/server-side-data/ServerSideLazyLoadingGroupingRevalidation', // Flashes cause flaky argos screenshots - '!docs/data/data-grid/server-side-data/ServerSideLazyLoadingRevalidationTabs', // Flashes cause flaky argos screenshots - '!docs/data/data-grid/server-side-data/ServerSideLazyLoadingFullyReplaced', // Flashes cause flaky argos screenshots - '!docs/data/data-grid/server-side-data/ServerSideDataGridRevalidation', // Flashes cause flaky argos screenshots - '!docs/data/data-grid/server-side-data/ServerSideTreeDataRevalidation', // Flashes cause flaky argos screenshots - '!docs/data/date-pickers/date-calendar/DateCalendarServerRequest', // Has random behavior (TODO: Use seeded random) - '!docs/data/charts/tooltip/Custom*', // Composition example - '!docs/data/charts/tooltip/Item*', // Composition example - '!docs/data/charts/tooltip/AxisFormatter', - '!docs/data/charts/tooltip/Formatting', - '!docs/data/charts/tooltip/SeriesFormatter', - '!docs/data/charts/tooltip/TooltipStyle', - '!docs/data/charts/brush/*', - '!docs/data/data-grid/server-side-data/useNestedPagination', - '!docs/data/data-grid/server-side-data/NestedPaginationGroupingCell', - '!docs/data/data-grid/tree-data/utils/TreeDataSyncRowDataGroupingCell', - '!docs/data/data-grid/tree-data/utils/DataStore', - '!docs/data/charts/export/ExportOptionSelector', // sub-component for demo purpose - '!docs/data/charts/axis-ticks/SelectTimeFrequency', // sub-component for demo purpose - '!docs/data/charts/sankey/CustomNodeLabelPlot', // sub-component for demo purpose - '!docs/data/charts/references/ReferenceArea', // sub-component for demo purpose - '!docs/data/charts/references/ReferencePoint', // sub-component for demo purpose - '!docs/data/charts/scatter/ScatterWebGLRenderer', // Timeout due to the large number of points. - '!docs/data/charts/scatter/ScatterAsyncRenderer', // Progressive renderer paints over several animation frames, screenshots are unstable. - '!docs/data/charts/range-bar/WebGLRangeBars', // Timeout due to the large number of bars. + '!docs/data/data-grid/filtering/{,demos/*/}RemoveBuiltInOperators.{js,tsx}', // Needs interaction + '!docs/data/data-grid/filtering/{,demos/*/}CustomRatingOperator.{js,tsx}', // Needs interaction + '!docs/data/data-grid/filtering/{,demos/*/}CustomInputComponent.{js,tsx}', // Needs interaction + '!docs/data/data-grid/server-side-data/{,demos/*/}ServerSideLazyLoadingRevalidation.{js,tsx}', // Flashes cause flaky argos screenshots + '!docs/data/data-grid/server-side-data/{,demos/*/}ServerSideLazyLoadingTreeDataRevalidation.{js,tsx}', // Flashes cause flaky argos screenshots + '!docs/data/data-grid/server-side-data/{,demos/*/}ServerSideLazyLoadingGroupingRevalidation.{js,tsx}', // Flashes cause flaky argos screenshots + '!docs/data/data-grid/server-side-data/{,demos/*/}ServerSideLazyLoadingRevalidationTabs.{js,tsx}', // Flashes cause flaky argos screenshots + '!docs/data/data-grid/server-side-data/{,demos/*/}ServerSideLazyLoadingFullyReplaced.{js,tsx}', // Flashes cause flaky argos screenshots + '!docs/data/data-grid/server-side-data/{,demos/*/}ServerSideDataGridRevalidation.{js,tsx}', // Flashes cause flaky argos screenshots + '!docs/data/data-grid/server-side-data/{,demos/*/}ServerSideTreeDataRevalidation.{js,tsx}', // Flashes cause flaky argos screenshots + '!docs/data/date-pickers/date-calendar/{,demos/*/}DateCalendarServerRequest.{js,tsx}', // Has random behavior (TODO: Use seeded random) + '!docs/data/charts/tooltip/{,demos/*/}Custom*.{js,tsx}', // Composition example + '!docs/data/charts/tooltip/{,demos/*/}Item*.{js,tsx}', // Composition example + '!docs/data/charts/tooltip/{,demos/*/}AxisFormatter.{js,tsx}', + '!docs/data/charts/tooltip/{,demos/*/}Formatting.{js,tsx}', + '!docs/data/charts/tooltip/{,demos/*/}SeriesFormatter.{js,tsx}', + '!docs/data/charts/tooltip/{,demos/*/}TooltipStyle.{js,tsx}', + '!docs/data/charts/brush/**/*', + '!docs/data/data-grid/server-side-data/{,demos/*/}useNestedPagination.{js,tsx}', + '!docs/data/data-grid/server-side-data/{,demos/*/}NestedPaginationGroupingCell.{js,tsx}', + '!docs/data/data-grid/tree-data/utils/{,demos/*/}TreeDataSyncRowDataGroupingCell.{js,tsx}', + '!docs/data/data-grid/tree-data/utils/{,demos/*/}DataStore.{js,tsx}', + '!docs/data/charts/export/{,demos/*/}ExportOptionSelector.{js,tsx}', // sub-component for demo purpose + '!docs/data/charts/axis-ticks/{,demos/*/}SelectTimeFrequency.{js,tsx}', // sub-component for demo purpose + '!docs/data/charts/sankey/{,demos/*/}CustomNodeLabelPlot.{js,tsx}', // sub-component for demo purpose + '!docs/data/charts/references/{,demos/*/}ReferenceArea.{js,tsx}', // sub-component for demo purpose + '!docs/data/charts/references/{,demos/*/}ReferencePoint.{js,tsx}', // sub-component for demo purpose + '!docs/data/charts/scatter/{,demos/*/}ScatterWebGLRenderer.{js,tsx}', // Timeout due to the large number of points. + '!docs/data/charts/scatter/{,demos/*/}ScatterAsyncRenderer.{js,tsx}', // Progressive renderer paints over several animation frames, screenshots are unstable. + '!docs/data/charts/range-bar/{,demos/*/}WebGLRangeBars.{js,tsx}', // Timeout due to the large number of bars. // Exclude shared utility files that don't have a default export '!docs/data/**/shared/*', // Streaming demos conflict with the fake timers (cancelAnimationFrame on native timer) - '!docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat', + '!docs/data/chat/core/examples/controlled-state/{,demos/*/}ControlledStateHeadlessChat.{js,tsx}', // Exclude codesandbox embedded demos since they're not using packages built from the branch anyway. - '!docs/data/migration/migration-pickers-v5/MobileKeyboardView', - '!docs/data/migration/migration-data-grid-v4/CoreV5WithCoreV4', + '!docs/data/migration/migration-pickers-v5/{,demos/*/}MobileKeyboardView.{js,tsx}', + '!docs/data/migration/migration-data-grid-v4/{,demos/*/}CoreV5WithCoreV4.{js,tsx}', // ], { eager: true, import: 'default' }, @@ -70,7 +73,10 @@ const docsImports = import.meta.glob( Object.keys(docsImports).forEach((path: string) => { const [name, ...suiteArray] = path .replace('../../docs/data/', '') - .replace('.js', '') + // Only TSX entries use the new layout during the staged migration. + // Legacy Data Grid pages also have a `demos` directory: preserve it. + .replace(/\/demos\/[^/]+(?=\/[^/]+\.tsx$)/, '') + .replace(/\.(js|tsx)$/, '') .split('/') .reverse(); const suite = `docs-${suiteArray.reverse().join('-')}`; diff --git a/tsconfig.json b/tsconfig.json index ee4ddc12154af..bf3258e010cf1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,13 @@ // Prevents errors like https://github.com/mui/mui-x/issues/17772 "isolatedModules": true, "paths": { + // Temporary factory exports missing from the pinned core-docs preview. + "@mui/internal-core-docs/utils/createDemo": [ + "./node_modules/@mui/internal-core-docs/utils/createDemo.d.ts" + ], + "@mui/internal-core-docs/utils/createDemoClient": [ + "./node_modules/@mui/internal-core-docs/utils/createDemoClient.d.ts" + ], "@mui/x-data-grid": ["./packages/x-data-grid/src"], "@mui/x-data-grid/*": ["./packages/x-data-grid/src/*"], "@mui/x-data-grid-generator": ["./packages/x-data-grid-generator/src/"], From 668196fe48f9c0c0438d1cb7659a0a2d8ff432a5 Mon Sep 17 00:00:00 2001 From: Brijesh Bittu <717550+brijeshb42@users.noreply.github.com> Date: Fri, 16 Oct 2026 13:13:39 +0530 Subject: [PATCH 3/6] Verify migrated demos and performance --- docs/scripts/benchmarkDocs.mjs | 150 +++++++++++++ test/e2e-website/docs-demo-exports.spec.ts | 95 +++++++++ test/e2e-website/docs-fonts.spec.ts | 34 +++ test/e2e-website/tree-view-docs.spec.ts | 235 +++++++++++++++++++++ test/e2e-website/tsconfig.json | 1 + 5 files changed, 515 insertions(+) create mode 100644 docs/scripts/benchmarkDocs.mjs create mode 100644 test/e2e-website/docs-demo-exports.spec.ts create mode 100644 test/e2e-website/docs-fonts.spec.ts create mode 100644 test/e2e-website/tree-view-docs.spec.ts diff --git a/docs/scripts/benchmarkDocs.mjs b/docs/scripts/benchmarkDocs.mjs new file mode 100644 index 0000000000000..b895eba92db5f --- /dev/null +++ b/docs/scripts/benchmarkDocs.mjs @@ -0,0 +1,150 @@ +/* eslint-disable no-await-in-loop, no-console */ +// Run measurements serially and print progress so concurrent work cannot bias timing. +/** + * Compare production docs builds with interleaved cold-browser Lighthouse runs. + * Install optional tooling outside the workspace: + * npm install --prefix /tmp/mui-x-lighthouse-tool lighthouse@13.4.1 chrome-launcher + * + * LIGHTHOUSE_TOOLING_DIR=/tmp/mui-x-lighthouse-tool node docs/scripts/benchmarkDocs.mjs \ + * --baseline https://master--material-ui-x.netlify.app/x/ \ + * --candidate https://deploy-preview-N--material-ui-x.netlify.app/x/ \ + * --output /tmp/mui-x-docs-performance + */ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { parseArgs } from 'node:util'; +import { gzipSync, brotliCompressSync } from 'node:zlib'; +import { chromium } from 'playwright'; + +const { values } = parseArgs({ + options: { + baseline: { type: 'string' }, + candidate: { type: 'string' }, + output: { type: 'string' }, + runs: { type: 'string', default: '3' }, + 'chrome-path': { type: 'string' }, + 'baseline-sha': { type: 'string' }, + 'candidate-sha': { type: 'string' }, + }, +}); +if (!values.baseline || !values.candidate || !values.output) { + throw new Error('Supply --baseline, --candidate, and --output. See the example in this script.'); +} +const runs = Number(values.runs); +if (!Number.isInteger(runs) || runs < 1) { + throw new Error('--runs must be a positive integer. Use at least three runs for comparisons.'); +} +const tooling = process.env.LIGHTHOUSE_TOOLING_DIR; +const lighthouseModule = tooling + ? pathToFileURL(path.resolve(tooling, 'node_modules/lighthouse/core/index.js')).href + : 'lighthouse'; +const launcherModule = tooling + ? pathToFileURL(path.resolve(tooling, 'node_modules/chrome-launcher/dist/index.js')).href + : 'chrome-launcher'; +const { default: lighthouse } = await import(lighthouseModule); +const { launch } = await import(launcherModule); +const output = path.resolve(values.output); +const chromePath = values['chrome-path'] ?? process.env.CHROME_PATH ?? chromium.executablePath(); +const targets = [ + { name: 'baseline', origin: new URL(values.baseline).origin, sha: values['baseline-sha'] }, + { name: 'candidate', origin: new URL(values.candidate).origin, sha: values['candidate-sha'] }, +]; +const routes = [ + '/x/react-data-grid/column-definition/', + '/x/react-data-grid/row-grouping/', + '/x/react-charts/axis/', + '/x/react-charts/lines/', + '/x/react-tree-view/simple-tree-view/items/', +]; +await fs.mkdir(output, { recursive: true }); +await fs.writeFile( + path.join(output, 'manifest.json'), + JSON.stringify( + { targets, routes, runs, chromePath, measuredAt: new Date().toISOString() }, + null, + 2, + ), +); +const rows = []; +for (const route of routes) { + const sizes = {}; + for (const target of targets) { + const url = `${target.origin}${route}`; + const response = await fetch(url); + if (!response.ok || new URL(response.url).origin !== target.origin) { + throw new Error(`${url}: HTTP ${response.status}, resolved to ${response.url}`); + } + const html = Buffer.from(await response.arrayBuffer()); + const scripts = [...html.toString().matchAll(/]+src="([^"]+)"/g)]; + for (const [, script] of scripts) { + if (!script.startsWith('/')) { + continue; + } + const asset = await fetch(`${target.origin}${script}`); + if (!asset.ok || !asset.headers.get('content-type')?.includes('javascript')) { + throw new Error(`${target.name}: broken script ${script} (HTTP ${asset.status})`); + } + } + sizes[target.name] = { + htmlBytes: html.length, + htmlGzipBytes: gzipSync(html).length, + htmlBrotliBytes: brotliCompressSync(html).length, + }; + } + for (let run = 1; run <= runs; run += 1) { + // Reverse the order on alternate runs to reduce warm-up and time-of-day bias. + for (const target of run % 2 ? targets : [...targets].reverse()) { + const chrome = await launch({ + chromePath, + chromeFlags: ['--headless', '--no-sandbox', '--disable-dev-shm-usage'], + }); + try { + const result = await lighthouse(`${target.origin}${route}`, { + port: chrome.port, + onlyCategories: ['performance'], + output: 'json', + logLevel: 'error', + }); + const { lhr } = result; + if (lhr.runtimeError || new URL(lhr.finalDisplayedUrl).origin !== target.origin) { + throw new Error( + `${target.name}: ${JSON.stringify(lhr.runtimeError ?? lhr.finalDisplayedUrl)}`, + ); + } + const row = { + target: target.name, + sha: target.sha, + route, + run, + timestamp: lhr.fetchTime, + browser: lhr.environment.hostUserAgent, + lighthouseVersion: lhr.lighthouseVersion, + configSettings: lhr.configSettings, + lcpMs: lhr.audits['largest-contentful-paint'].numericValue, + tbtMs: lhr.audits['total-blocking-time'].numericValue, + cls: lhr.audits['cumulative-layout-shift'].numericValue, + performanceScore: lhr.categories.performance.score, + ...sizes[target.name], + }; + rows.push(row); + const name = `${target.name}-${route.split('/').filter(Boolean).join('-')}-${run}.json`; + await fs.writeFile(path.join(output, name), result.report); + await fs.writeFile(path.join(output, 'summary.json'), JSON.stringify(rows, null, 2)); + console.log( + JSON.stringify({ + target: row.target, + route, + run, + lcpMs: row.lcpMs, + tbtMs: row.tbtMs, + cls: row.cls, + htmlBytes: row.htmlBytes, + }), + ); + } finally { + await chrome.kill(); + } + } + } +} diff --git a/test/e2e-website/docs-demo-exports.spec.ts b/test/e2e-website/docs-demo-exports.spec.ts new file mode 100644 index 0000000000000..b435b01f1c136 --- /dev/null +++ b/test/e2e-website/docs-demo-exports.spec.ts @@ -0,0 +1,95 @@ +import { posix } from 'node:path'; +import { test, expect, type Page } from '@playwright/test'; + +const FILE_PREFIX = 'project[files]['; +const SOURCE_EXTENSIONS = ['', '.ts', '.tsx', '.js', '.jsx', '.json']; + +type ExportFiles = Record; +type ExportWindow = Window & { exportedFiles?: ExportFiles }; + +async function exportDemo(page: Page, route: string, name: string) { + // Capture the real sandbox payload without sending it to StackBlitz. + await page.addInitScript(() => { + HTMLFormElement.prototype.submit = function captureExport() { + (window as ExportWindow).exportedFiles = Object.fromEntries( + Array.from(new FormData(this).entries(), ([key, value]) => [key, String(value)]), + ); + }; + }); + await page.goto(`${route}#${name}.tsx`); + const demo = page.locator(`#${name}`).locator('..'); + await expect(async () => { + await demo.scrollIntoViewIfNeeded(); + await expect(demo.getByRole('toolbar', { name: 'demo source' })).not.toHaveAttribute( + 'aria-busy', + 'true', + ); + }).toPass({ timeout: 15_000 }); + await demo.getByRole('button', { name: 'Show TypeScript source' }).click(); + await demo.getByRole('button', { name: 'Edit in StackBlitz' }).click(); + await expect.poll(() => page.evaluate(() => (window as ExportWindow).exportedFiles)).toBeTruthy(); + + const fields = await page.evaluate(() => (window as ExportWindow).exportedFiles!); + return Object.fromEntries( + Object.entries(fields) + .filter(([key]) => key.startsWith(FILE_PREFIX)) + .map(([key, value]) => [key.slice(FILE_PREFIX.length, -1), value]), + ); +} + +function dependencies(files: ExportFiles): Record { + return JSON.parse(files['package.json']).dependencies; +} + +test.describe('Docs demo exports', () => { + test.skip(!process.env.PLAYWRIGHT_TEST_BASE_URL, 'Set the migrated docs build URL explicitly.'); + + test.beforeEach(async ({ page }) => { + await page.setViewportSize({ width: 1280, height: 900 }); + }); + + test('includes the date adapter peer without a direct library import', async ({ page }) => { + const files = await exportDemo(page, '/x/react-date-pickers/date-picker/', 'BasicDatePicker'); + const source = Object.values(files).find((value) => + value.includes('function BasicDatePicker'), + )!; + expect(source).toContain('@mui/x-date-pickers/AdapterDayjs'); + expect(source).not.toMatch(/from ['"]dayjs/); + expect(dependencies(files).dayjs).toBeTruthy(); + }); + + test('includes generator peers without direct icon imports', async ({ page }) => { + const files = await exportDemo( + page, + '/x/react-data-grid/pagination/', + 'PaginationModelControlled', + ); + const deps = dependencies(files); + expect(deps['@mui/x-data-grid-generator']).toBeTruthy(); + expect(deps['@mui/icons-material']).toBeTruthy(); + }); + + test('resolves shared helper imports within the exported project', async ({ page }) => { + const files = await exportDemo(page, '/x/react-tree-view/quickstart/', 'BasicRichTreeView'); + expect( + Object.values(files).some((source) => source.includes('export const MUI_X_PRODUCTS')), + ).toBe(true); + + for (const [file, source] of Object.entries(files)) { + if (!/\.[jt]sx?$/.test(file)) { + continue; + } + for (const match of source.matchAll(/(?:from\s*|import\s*)['"]([.][^'"]+)['"]/g)) { + const target = posix.normalize(posix.join(posix.dirname(file), match[1])); + const candidates = SOURCE_EXTENSIONS.flatMap((extension) => [ + `${target}${extension}`, + `${target}/index${extension}`, + ]); + expect( + candidates.some((candidate) => candidate in files), + `${file}: ${match[1]}`, + ).toBe(true); + } + } + }); +}); diff --git a/test/e2e-website/docs-fonts.spec.ts b/test/e2e-website/docs-fonts.spec.ts new file mode 100644 index 0000000000000..b9a896fe3515c --- /dev/null +++ b/test/e2e-website/docs-fonts.spec.ts @@ -0,0 +1,34 @@ +import { test, expect } from '@playwright/test'; + +const DOCS_PATH = '/x/react-charts/lines/'; +const BODY_FONT = /^"?IBM Plex Sans"?(?:,|$)/; +const BODY_WEIGHT = '400'; +const HYDRATION_TIMEOUT_MS = 15_000; + +test('keeps branded body typography before and after hydration', async ({ browser }) => { + test.skip(!process.env.PLAYWRIGHT_TEST_BASE_URL, 'Set the docs build URL explicitly.'); + + await Promise.all( + ['server', 'hydrated'].map(async (mode) => { + const context = await browser.newContext({ + baseURL: process.env.PLAYWRIGHT_TEST_BASE_URL, + javaScriptEnabled: mode === 'hydrated', + }); + try { + const page = await context.newPage(); + await page.goto(DOCS_PATH); + if (mode === 'hydrated') { + await expect( + page.getByRole('toolbar', { name: 'demo source' }).first(), + ).not.toHaveAttribute('aria-busy', 'true', { timeout: HYDRATION_TIMEOUT_MS }); + } + const body = page.locator('body'); + await expect(body).toHaveCSS('font-family', BODY_FONT); + await expect(body).toHaveCSS('font-weight', BODY_WEIGHT); + await expect(body).toHaveCSS('font-style', 'normal'); + } finally { + await context.close(); + } + }), + ); +}); diff --git a/test/e2e-website/tree-view-docs.spec.ts b/test/e2e-website/tree-view-docs.spec.ts new file mode 100644 index 0000000000000..bbc6bec4b512d --- /dev/null +++ b/test/e2e-website/tree-view-docs.spec.ts @@ -0,0 +1,235 @@ +import { test, expect, type Locator, type Page } from '@playwright/test'; + +const ITEMS_PATH = '/x/react-tree-view/simple-tree-view/items/'; +const QUICKSTART_PATH = '/x/react-tree-view/quickstart/'; +const LAZY_PATH = '/x/react-tree-view/rich-tree-view/lazy-loading/'; + +function getDemo(page: Page, name: string) { + return page.locator(`#${name}`).locator('..'); +} + +async function readyDemo(page: Page, name: string) { + const demo = getDemo(page, name); + // Hydration can replace the loading container while Playwright is scrolling it. + // Scroll before waiting for the live toolbar so below-fold demos can load. + await expect(async () => { + await demo.scrollIntoViewIfNeeded(); + await expect(demo.getByRole('toolbar', { name: 'demo source' })).not.toHaveAttribute( + 'aria-busy', + 'true', + ); + }).toPass({ timeout: 15_000 }); + return demo; +} + +async function editor(demo: Locator) { + const textarea = demo.locator('textarea:visible'); + if ((await textarea.count()) === 0) { + await demo.getByRole('group', { name: 'Editable code' }).first().click(); + } + await textarea.waitFor(); + return textarea; +} + +async function clickForEffect(target: Locator, expectation: () => Promise) { + await expect(async () => { + await target.click(); + await expectation(); + }).toPass({ timeout: 15_000 }); +} + +test.describe('Tree View docs-infra migration', () => { + // These checks require an explicitly supplied migrated docs build URL. + test.skip(!process.env.PLAYWRIGHT_TEST_BASE_URL, 'Set the migrated docs build URL explicitly.'); + + test.beforeEach(async ({ page }) => { + await page.setViewportSize({ width: 1280, height: 900 }); + }); + + test('server renders the preview and plain source without JavaScript', async ({ browser }) => { + const context = await browser.newContext({ + baseURL: process.env.PLAYWRIGHT_TEST_BASE_URL, + javaScriptEnabled: false, + viewport: { width: 1280, height: 900 }, + }); + try { + const page = await context.newPage(); + await page.goto(QUICKSTART_PATH); + const demo = getDemo(page, 'BasicRichTreeView'); + await expect(demo.getByRole('treeitem', { name: 'Data Grid', exact: true })).toBeVisible(); + await expect(demo.locator('pre code')).toContainText(' { + await page.goto(QUICKSTART_PATH); + const demo = await readyDemo(page, 'BasicRichTreeView'); + const code = demo.locator('pre code'); + await expect(code).toContainText(' { + let releaseScripts!: () => void; + const scriptsReady = new Promise((resolve) => { + releaseScripts = resolve; + }); + await page.route('**/_next/static/**/*.js', async (route) => { + await scriptsReady; + await route.continue(); + }); + try { + await page.goto(ITEMS_PATH, { waitUntil: 'commit' }); + const toolbar = getDemo(page, 'BasicSimpleTreeView').getByRole('toolbar', { + name: 'demo source', + }); + await expect(toolbar).toHaveAttribute('aria-busy', 'true'); + const loadingHeight = await toolbar.evaluate( + (element) => element.getBoundingClientRect().height, + ); + releaseScripts(); + await readyDemo(page, 'BasicSimpleTreeView'); + expect( + await toolbar.evaluate((element) => element.getBoundingClientRect().height), + ).toBeCloseTo(loadingHeight, 2); + } finally { + releaseScripts(); + } + }); + + test('source deep links select the language and override the stored preference', async ({ + page, + }) => { + await page.goto(`${ITEMS_PATH}#BasicSimpleTreeView.jsx`); + let demo = await readyDemo(page, 'BasicSimpleTreeView'); + await expect(demo.locator('button[data-ga-event-action="expand"]')).toHaveAttribute( + 'aria-expanded', + 'true', + ); + await expect(demo.getByRole('button', { name: 'Show JavaScript source' })).toHaveAttribute( + 'aria-pressed', + 'true', + ); + await demo.getByRole('button', { name: 'Show TypeScript source' }).click(); + await expect(demo.getByRole('button', { name: 'Show TypeScript source' })).toHaveAttribute( + 'aria-pressed', + 'true', + ); + await page.evaluate(() => { + document.cookie = 'codeVariant=JS;path=/'; + }); + await page.goto(`${ITEMS_PATH}#BasicSimpleTreeView.tsx`); + demo = await readyDemo(page, 'BasicSimpleTreeView'); + await expect(demo.getByRole('button', { name: 'Show TypeScript source' })).toHaveAttribute( + 'aria-pressed', + 'true', + ); + await expect(await editor(demo)).toHaveValue(/export default function BasicSimpleTreeView/); + }); + + test('live source editing changes a tree label and expansion resets the edit', async ({ + page, + }) => { + await page.goto(`${ITEMS_PATH}#BasicSimpleTreeView.tsx`); + const demo = await readyDemo(page, 'BasicSimpleTreeView'); + const textarea = await editor(demo); + const source = await textarea.inputValue(); + expect(source).toContain('label="Data Grid"'); + await textarea.fill(source.replace('label="Data Grid"', 'label="Edited live tree"')); + await expect( + demo.getByRole('treeitem', { name: 'Edited live tree', exact: true }), + ).toBeVisible(); + await demo.locator('button[data-ga-event-action="expand"]').click(); + await clickForEffect(demo.locator('button[data-ga-event-action="expand"]'), async () => { + await expect(demo.getByRole('treeitem', { name: 'Data Grid', exact: true })).toBeVisible({ + timeout: 2000, + }); + }); + await expect(await editor(demo)).not.toHaveValue(/Edited live tree/); + }); + + test('collects and edits a shared TypeScript dependency outside the demo directory', async ({ + page, + }) => { + await page.goto(`${LAZY_PATH}#LazyLoadingInitialState.tsx`); + const demo = await readyDemo(page, 'LazyLoadingInitialState'); + await demo.getByRole('tab', { name: 'items.ts', exact: true }).click(); + const textarea = await editor(demo); + const source = await textarea.inputValue(); + expect(source).toContain('Amy Harris'); + expect(source).toContain('ItemType'); + await textarea.fill(source.replace('Amy Harris', 'Edited shared item')); + await expect( + demo.getByRole('treeitem', { name: 'Edited shared item', exact: true }), + ).toBeVisible(); + await demo.locator('button[data-ga-event-action="expand"]').click(); + await demo.locator('button[data-ga-event-action="expand"]').click(); + await expect(demo.getByRole('treeitem', { name: 'Amy Harris', exact: true })).toBeVisible(); + }); + + test('copies and exports original source and links the moved authored file', async ({ + page, + context, + }) => { + await context.grantPermissions(['clipboard-read', 'clipboard-write']); + await page.goto(`${ITEMS_PATH}#BasicSimpleTreeView.tsx`); + const demo = await readyDemo(page, 'BasicSimpleTreeView'); + await page.evaluate(() => { + HTMLFormElement.prototype.submit = function captureSubmission() { + (window as typeof window & { exportedSource?: string }).exportedSource = Array.from( + new FormData(this).values(), + String, + ).join('\n'); + }; + }); + const textarea = await editor(demo); + await textarea.fill( + (await textarea.inputValue()).replace('label="Data Grid"', 'label="Edited export tree"'), + ); + await expect( + demo.getByRole('treeitem', { name: 'Edited export tree', exact: true }), + ).toBeVisible(); + await demo.getByRole('button', { name: 'Copy the source' }).click(); + await expect + .poll(() => page.evaluate(() => navigator.clipboard.readText())) + .toContain('Data Grid'); + expect(await page.evaluate(() => navigator.clipboard.readText())).not.toContain( + 'Edited export tree', + ); + await demo.getByRole('button', { name: 'Edit in StackBlitz' }).click(); + await expect + .poll(() => + page.evaluate(() => (window as typeof window & { exportedSource?: string }).exportedSource), + ) + .toContain('Data Grid'); + expect( + await page.evaluate( + () => (window as typeof window & { exportedSource?: string }).exportedSource, + ), + ).not.toContain('Edited export tree'); + await demo.getByRole('button', { name: 'See more' }).click(); + const link = page.getByRole('menuitem', { name: 'View the source on GitHub' }); + await expect(link).toHaveAttribute( + 'href', + /github\.com\/[^/]+\/mui-x\/blob\/[^/]+\/docs\/data\/tree-view\/simple-tree-view\/items\/demos\/basic-simple-tree-view\/BasicSimpleTreeView\.tsx$/, + ); + await page.keyboard.press('Escape'); + await demo.getByRole('button', { name: 'Show JavaScript source' }).click(); + await demo.getByRole('button', { name: 'See more' }).click(); + await expect(link).toHaveAttribute('href', /BasicSimpleTreeView\.tsx$/); + }); +}); diff --git a/test/e2e-website/tsconfig.json b/test/e2e-website/tsconfig.json index 31221a706890c..96c01c0ea6f6d 100644 --- a/test/e2e-website/tsconfig.json +++ b/test/e2e-website/tsconfig.json @@ -2,6 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "types": [ + "node", "@mui/internal-test-utils/initMatchers", "@mui/material/themeCssVarsAugmentation", "dayjs/plugin/timezone.d.ts", From aeb50bcf53eecf7fb5cff777a636ae097e4a9413 Mon Sep 17 00:00:00 2001 From: Brijesh Bittu <717550+brijeshb42@users.noreply.github.com> Date: Fri, 16 Oct 2026 18:51:35 +0530 Subject: [PATCH 4/6] Render demo toolbars from first paint --- docs/next.config.ts | 7 ------- docs/scripts/loadCompactDemoToolbar.cjs | 28 ------------------------- test/e2e-website/tree-view-docs.spec.ts | 4 +++- 3 files changed, 3 insertions(+), 36 deletions(-) delete mode 100644 docs/scripts/loadCompactDemoToolbar.cjs diff --git a/docs/next.config.ts b/docs/next.config.ts index 39c03ee48b052..64a56f727d2f3 100644 --- a/docs/next.config.ts +++ b/docs/next.config.ts @@ -187,9 +187,6 @@ export default withDeploymentConfig({ '**/@mui/internal-core-docs/MarkdownDocs/RichMarkdownElement.js': { loaders: [path.join(currentDirectory, 'scripts/loadMigratedMarkdown.cjs')], }, - '**/DemoContent/DemoContentLoading.js': { - loaders: [path.join(currentDirectory, 'scripts/loadCompactDemoToolbar.cjs')], - }, '**/DemoContent/exportConfig.js': { loaders: [path.join(currentDirectory, 'scripts/loadDemoExportDeps.cjs')], }, @@ -279,10 +276,6 @@ export default withDeploymentConfig({ test: /[/\\]@mui[/\\]internal-core-docs[/\\]MarkdownDocs[/\\]RichMarkdownElement\.js$/, use: [path.join(currentDirectory, 'scripts/loadMigratedMarkdown.cjs')], }, - { - test: /[/\\]@mui[/\\]internal-core-docs[/\\]DemoContent[/\\]DemoContentLoading\.js$/, - use: [path.join(currentDirectory, 'scripts/loadCompactDemoToolbar.cjs')], - }, { test: /[/\\]@mui[/\\]internal-core-docs[/\\]DemoContent[/\\]exportConfig\.js$/, use: [path.join(currentDirectory, 'scripts/loadDemoExportDeps.cjs')], diff --git a/docs/scripts/loadCompactDemoToolbar.cjs b/docs/scripts/loadCompactDemoToolbar.cjs deleted file mode 100644 index f086564348365..0000000000000 --- a/docs/scripts/loadCompactDemoToolbar.cjs +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Keep the pinned preview's SSR toolbar compact while preserving its 47px - * desktop row (42px content, 4px padding, 1px border). The live toolbar still - * renders all controls after hydration. Its inert SSR copy otherwise adds - * about 6KB of markup per demo and eagerly renders the toolbar's Emotion CSS. - */ -function compactDemoToolbar(source) { - const importStatement = 'import { DemoToolbar } from "./DemoToolbar.js";'; - // The preview uses `_jsx` without whitespace after the PURE annotation. - const start = ' const toolbar = /*#__PURE__*/_jsx(DemoToolbar, {'; - const startIndex = source.indexOf(start); - const endIndex = source.indexOf('\n });', startIndex); - if (!source.includes(importStatement) || startIndex === -1 || endIndex === -1) { - throw new Error( - 'The core-docs preview toolbar changed. Update or remove loadCompactDemoToolbar.', - ); - } - return `${source.slice( - 0, - startIndex, - )} const toolbar = _jsx("div", { "aria-hidden": true, style: { height: 42, width: "100%" } });${source.slice( - endIndex + '\n });'.length, - )}` - .replace(importStatement, '') - .replace('const noop = () => {};\nconst noopAsync = async () => {};', ''); -} - -module.exports = compactDemoToolbar; diff --git a/test/e2e-website/tree-view-docs.spec.ts b/test/e2e-website/tree-view-docs.spec.ts index bbc6bec4b512d..c12c30fbf6acb 100644 --- a/test/e2e-website/tree-view-docs.spec.ts +++ b/test/e2e-website/tree-view-docs.spec.ts @@ -83,7 +83,7 @@ test.describe('Tree View docs-infra migration', () => { await checkSourceLanguage('TypeScript'); }); - test('keeps the loading toolbar height when the live controls hydrate', async ({ page }) => { + test('shows toolbar controls before scripts load and keeps their height', async ({ page }) => { let releaseScripts!: () => void; const scriptsReady = new Promise((resolve) => { releaseScripts = resolve; @@ -98,6 +98,8 @@ test.describe('Tree View docs-infra migration', () => { name: 'demo source', }); await expect(toolbar).toHaveAttribute('aria-busy', 'true'); + await expect(toolbar.locator('button[data-ga-event-action="expand"]')).toBeVisible(); + await expect(toolbar.locator('button[data-ga-event-action="copy"]')).toBeVisible(); const loadingHeight = await toolbar.evaluate( (element) => element.getBoundingClientRect().height, ); From 768a510e2e073a52ff237ccebd3a7a6e583f98ee Mon Sep 17 00:00:00 2001 From: Brijesh Bittu <717550+brijeshb42@users.noreply.github.com> Date: Fri, 30 Oct 2026 12:12:30 +0100 Subject: [PATCH 5/6] Adopt released docs-infra fixes --- package.json | 2 +- ...internal-docs-infra@0.13.1-canary.14.patch | 145 ------------------ pnpm-lock.yaml | 43 +++--- pnpm-workspace.yaml | 6 +- 4 files changed, 25 insertions(+), 171 deletions(-) delete mode 100644 patches/@mui__internal-docs-infra@0.13.1-canary.14.patch diff --git a/package.json b/package.json index af09bea845332..65a4402a59bfd 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "@mui/internal-bundle-size-checker": "1.1.1-canary.6", "@mui/internal-code-infra": "0.1.1-canary.25", "@mui/internal-core-docs": "catalog:", - "@mui/internal-docs-infra": "0.13.1-canary.14", + "@mui/internal-docs-infra": "0.13.1-canary.28", "@mui/internal-markdown": "3.0.13-canary.0", "@mui/internal-netlify-cache": "0.1.1-canary.2", "@mui/internal-scripts": "3.0.12-canary.0", diff --git a/patches/@mui__internal-docs-infra@0.13.1-canary.14.patch b/patches/@mui__internal-docs-infra@0.13.1-canary.14.patch deleted file mode 100644 index fc6a0d3bc465d..0000000000000 --- a/patches/@mui__internal-docs-infra@0.13.1-canary.14.patch +++ /dev/null @@ -1,145 +0,0 @@ -diff --git a/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs b/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs -index e5d7298e25487623053aa38d027fdba2f9089036..77a18bf8278c98a8c0d7fe8eced78514ea61345e 100644 ---- a/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs -+++ b/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.mjs -@@ -15,6 +15,52 @@ import { getFileNameFromUrl, IGNORE_COMMENT_PREFIXES } from "../loaderUtils/inde - import { createPerformanceLogger, logPerformance, performanceMeasure } from "./performanceLogger.mjs"; - import { fallbackToHast } from "../../CodeHighlighter/fallbackFormat.mjs"; - -+// Compilation identity prevents reuse across compilers and watch rebuilds. -+const deferredCaches = new WeakMap(); -+ -+function isSerializable(value, ancestors = new Set()) { -+ if (value === null || typeof value === 'string' || typeof value === 'boolean') { -+ return true; -+ } -+ if (typeof value === 'number') { -+ return Number.isFinite(value); -+ } -+ if (typeof value !== 'object' || ancestors.has(value) || Object.getOwnPropertySymbols(value).length) { -+ return false; -+ } -+ const prototype = Object.getPrototypeOf(value); -+ if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) { -+ return false; -+ } -+ ancestors.add(value); -+ const supported = Object.entries(Object.getOwnPropertyDescriptors(value)).every(([name, descriptor]) => { -+ if (Array.isArray(value) && name === 'length') { -+ return true; -+ } -+ return descriptor.enumerable && 'value' in descriptor && isSerializable(descriptor.value, ancestors); -+ }); -+ ancestors.delete(value); -+ return supported; -+} -+ -+function getDeferredCache(context, source, options) { -+ if (!options.deferPrecompute || !context._compilation || !isSerializable(options)) { -+ return undefined; -+ } -+ let entries = deferredCaches.get(context._compilation); -+ if (!entries) { -+ entries = new Map(); -+ deferredCaches.set(context._compilation, entries); -+ } -+ return { entries, key: JSON.stringify([context.resourcePath, source, options]) }; -+} -+ -+function registerDependencies(context, dependencies) { -+ dependencies.forEach(dependency => { -+ context.addDependency(dependency.startsWith('file://') ? fileURLToPath(dependency) : dependency); -+ }); -+} -+ - /** - * Extracts a string array from structured options data. - * Handles the parser's array format: [[element1, element2, ...]] -@@ -115,6 +161,14 @@ export async function loadPrecomputedCodeHighlighter(source) { - const callback = this.async(); - this.cacheable(); - const options = this.getOptions(); -+ const isDeferredRequest = this.resourceQuery === '?mui-deferred-precompute'; -+ const deferredCache = getDeferredCache(this, source, options); -+ const cached = isDeferredRequest ? deferredCache?.entries.get(deferredCache.key) : undefined; -+ if (cached) { -+ registerDependencies(this, cached.dependencies); -+ callback(null, cached.source); -+ return; -+ } - const performanceNotableMs = options.performance?.notableMs ?? 100; - const performanceShowWrapperMeasures = options.performance?.showWrapperMeasures ?? false; - const relativePath = path.relative(this.rootContext || process.cwd(), this.resourcePath); -@@ -276,9 +330,13 @@ export async function loadPrecomputedCodeHighlighter(source) { - measure: 'Complete Variants Loading' - }, [functionName, relativePath], true); - const deferredRequest = `./${path.basename(this.resourcePath)}?mui-deferred-precompute`; -- const isDeferredRequest = this.resourceQuery === '?mui-deferred-precompute'; -+ const deferredSource = isDeferredRequest || deferredCache ? `export default ${JSON.stringify(variantData)};` : undefined; -+ registerDependencies(this, allDependencies); -+ if (deferredCache) { -+ deferredCache.entries.set(deferredCache.key, { source: deferredSource, dependencies: allDependencies }); -+ } - if (isDeferredRequest) { -- callback(null, `export default ${JSON.stringify(variantData)};`); -+ callback(null, deferredSource); - return; - } - -@@ -293,13 +351,6 @@ export async function loadPrecomputedCodeHighlighter(source) { - measure: 'Precompute Replacement' - }, [functionName, relativePath]); - -- // Add all dependencies to webpack's watch list -- allDependencies.forEach(dep => { -- // Convert file:// URLs to proper file system paths for webpack's dependency tracking -- // Using fileURLToPath handles Windows drive letters correctly (e.g., file:///C:/... → C:\...) -- this.addDependency(dep.startsWith('file://') ? fileURLToPath(dep) : dep); -- }); -- - // log any pending performance entries before completing - observer?.takeRecords()?.forEach(entry => logPerformance(entry, performanceNotableMs, performanceShowWrapperMeasures, relativePath)); - observer?.disconnect(); -diff --git a/useDemo/exportVariant.d.mts b/useDemo/exportVariant.d.mts -index f2ccb993de2e97ed06acb6b75fe5ae70ccb3a0b8..5b8713538a668becb0a4facdccc296dbafe02abd 100644 ---- a/useDemo/exportVariant.d.mts -+++ b/useDemo/exportVariant.d.mts -@@ -180,7 +180,7 @@ export interface ExportConfig { - * return { [packageName]: 'latest' }; - * } - */ -- resolveDependencies?: (packageName: string, envVars?: Record) => Record; -+ resolveDependencies?: (packageName: string, envVars?: Record, importedModules?: string[]) => Record; - } - /** - * Export a variant as a standalone project with metadata files properly scoped -diff --git a/useDemo/exportVariant.mjs b/useDemo/exportVariant.mjs -index 77c0f79191a8135cc21af71df277a903fcbd565b..fb0cc3d4e85aa717e750d7a8110a2f67a20c1053 100644 ---- a/useDemo/exportVariant.mjs -+++ b/useDemo/exportVariant.mjs -@@ -286,18 +286,14 @@ export function exportVariant(variantCode, config = {}) { - - // Check if they're providing their own framework - const isFramework = 'frameworkFiles' in config; -- const externalPackages = externalsToPackages(processedVariantCode.externals || []); -+ const importedModules = processedVariantCode.externals || []; -+ const externalPackages = externalsToPackages(importedModules); - const variantDeps = Object.keys(externalPackages).reduce((acc, pkg) => { -- // Check if we have a specific version for this package first -- if (versions[pkg]) { -- acc[pkg] = versions[pkg]; -- } else if (resolveDependencies) { -- const resolvedDeps = resolveDependencies(pkg); -- Object.assign(acc, resolvedDeps); -- } else { -- // Simple fallback: just use 'latest' for each package -- acc[pkg] = 'latest'; -- } -+ // Pinned versions still need adapter and product peer dependencies. -+ const packageImports = importedModules.filter(name => name === pkg || name.startsWith(`${pkg}/`)); -+ const resolvedDeps = resolveDependencies?.(pkg, undefined, packageImports) ?? {}; -+ Object.assign(acc, resolvedDeps); -+ acc[pkg] = versions[pkg] ?? resolvedDeps[pkg] ?? 'latest'; - return acc; - }, {}); - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 533575d4970ec..09e3705af9af4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -365,7 +365,7 @@ catalogs: version: 18.2.0 overrides: - '@mui/internal-docs-infra': 0.13.1-canary.14 + '@mui/internal-docs-infra': 0.13.1-canary.28 '@mui/core-downloads-tracker': https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf '@mui/icons-material': https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf '@mui/internal-api-docs-builder': https://pkg.pr.new/mui/material-ui/@mui/internal-api-docs-builder@40645cf @@ -386,7 +386,6 @@ overrides: patchedDependencies: '@mui/internal-core-docs@10.0.0-alpha.0': 4e36c2ebcf2081080150350048ac7116e1752af7837a8436f852fba7563292cb - '@mui/internal-docs-infra@0.13.1-canary.14': efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f importers: @@ -441,8 +440,8 @@ importers: specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf version: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf(patch_hash=4e36c2ebcf2081080150350048ac7116e1752af7837a8436f852fba7563292cb)(20b6a332c52b484624b256ff4a4658fc) '@mui/internal-docs-infra': - specifier: 0.13.1-canary.14 - version: 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) + specifier: 0.13.1-canary.28 + version: 0.13.1-canary.28(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) '@mui/internal-markdown': specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf version: https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf @@ -675,8 +674,8 @@ importers: specifier: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf version: https://pkg.pr.new/mui/material-ui/@mui/internal-core-docs@40645cf(patch_hash=4e36c2ebcf2081080150350048ac7116e1752af7837a8436f852fba7563292cb)(20b6a332c52b484624b256ff4a4658fc) '@mui/internal-docs-infra': - specifier: 0.13.1-canary.14 - version: 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) + specifier: 0.13.1-canary.28 + version: 0.13.1-canary.28(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) '@mui/material': specifier: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf version: https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) @@ -4596,8 +4595,8 @@ packages: react-runner: ^1.0.5 react-simple-code-editor: ^0.14.1 - '@mui/internal-docs-infra@0.13.1-canary.14': - resolution: {integrity: sha512-ZQn+xLezKXpPJMHUmYFdWLVZk68hr3GLNkkT3kez2k6/7DG+Ud6t1CQRc9zVHVH3s5a4eGeDHSYCt5ZWrJ31uQ==} + '@mui/internal-docs-infra@0.13.1-canary.28': + resolution: {integrity: sha512-t7IMLEjPQexTuXt6OBVyVyRW7r2MAeUQxXZxVbDUoJdyW+d1ni1a0AJMdddwZGdde0Z0RvSlgSFlDakCu1+hyg==} engines: {node: '>=22.18.0'} hasBin: true peerDependencies: @@ -4644,6 +4643,12 @@ packages: '@emotion/react': optional: true + '@mui/internal-typescript-api-extractor@0.1.1-canary.1': + resolution: {integrity: sha512-qO14IwkNvZw9fi6YT4DbDJlX+Yq0ZHHmIP42P8tyO5W2EQoyAyfq/jRgf7orfqVzbk9XOzBRR/FSAV0lmVhZsw==} + engines: {node: '>=22.12.0'} + peerDependencies: + typescript: ^5.8 || ^6.0 + '@mui/material-nextjs@https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf': resolution: {integrity: sha512-DuKovPJR5dLnq4VH7iZb1VLqjHH7VsXPoAdMOVuQJV/OwtJk7jn1rHu3BMMdSWMvbYc8Cg3pu7nNedjkEYn+FQ==, tarball: https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf} version: 10.0.0-alpha.0 @@ -10945,10 +10950,6 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-api-extractor@1.0.0-beta.7: - resolution: {integrity: sha512-aM4Nsec9X76xXOnz9RJ+B5rATt6rPlGbfnxJn+QHvicM8lQTeGap3W8Hztq2x6HKtfiRBhiPsyYZBuM00pllMg==} - engines: {node: '>=22'} - typescript-eslint@8.72.0: resolution: {integrity: sha512-r26Fkc8As+mZvqp7SLsMmNFyYUup/6CjK7/eHBHmhOw6GH6n6YFxHVFrG0jN1c5CMpDzelLPxvgeCOzx7BjN+A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13617,7 +13618,7 @@ snapshots: '@emotion/react': 11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0) '@mui/icons-material': https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf(@mui/material@https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(@types/react@19.3.0)(react@19.3.1) - '@mui/internal-docs-infra': 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) + '@mui/internal-docs-infra': 0.13.1-canary.28(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) '@mui/internal-markdown': https://pkg.pr.new/mui/material-ui/@mui/internal-markdown@40645cf '@mui/material': https://pkg.pr.new/mui/material-ui/@mui/material@40645cf(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@mui/material-nextjs': https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1) @@ -13643,12 +13644,13 @@ snapshots: - prettier - supports-color - '@mui/internal-docs-infra@0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0)': + '@mui/internal-docs-infra@0.13.1-canary.28(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0)': dependencies: '@babel/runtime': 8.0.7 '@csstools/postcss-light-dark-function': 3.0.7(postcss@8.5.31) '@csstools/postcss-relative-color-syntax': 4.0.15(postcss@8.5.31) '@csstools/postcss-stepped-value-functions': 5.0.9(postcss@8.5.31) + '@mui/internal-typescript-api-extractor': 0.1.1-canary.1(@typescript/typescript6@6.0.2) '@orama/orama': 3.1.18 '@orama/plugin-qps': 3.1.18 '@orama/stemmers': 3.1.18 @@ -13682,7 +13684,6 @@ snapshots: remark-typography: 0.8.10 sucrase: 3.35.1 typescript: '@typescript/typescript6@6.0.2' - typescript-api-extractor: 1.0.0-beta.7 uint8-to-base64: 0.2.1 unified: 11.0.5 unist-util-visit: 5.2.0 @@ -13717,7 +13718,7 @@ snapshots: '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0)) '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0)) '@babel/types': 7.29.8 - '@mui/internal-docs-infra': 0.13.1-canary.14(patch_hash=efa5289e95086ce7548ff4419ea290a9fb77bf4fffcae8cb1f0f6caa41b3ee2f)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) + '@mui/internal-docs-infra': 0.13.1-canary.28(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(prettier@3.9.10)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(supports-color@11.0.0) '@mui/internal-docs-utils': https://pkg.pr.new/mui/material-ui/@mui/internal-docs-utils@40645cf '@typescript/typescript6': 6.0.2 doctrine: 3.0.0 @@ -13758,6 +13759,11 @@ snapshots: - vite - vitest + '@mui/internal-typescript-api-extractor@0.1.1-canary.1(@typescript/typescript6@6.0.2)': + dependencies: + '@babel/runtime': 8.0.7 + typescript: '@typescript/typescript6@6.0.2' + '@mui/material-nextjs@https://pkg.pr.new/mui/material-ui/@mui/material-nextjs@40645cf(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.1)(supports-color@11.0.0))(@emotion/server@11.11.0)(@types/react@19.3.0)(next@16.4.3(@babel/core@8.0.7)(@playwright/test@1.64.1)(@types/node@22.20.5)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(react@19.3.1)': dependencies: '@babel/runtime': 8.0.7 @@ -20983,11 +20989,6 @@ snapshots: typedarray@0.0.6: {} - typescript-api-extractor@1.0.0-beta.7: - dependencies: - es-toolkit: 1.52.0 - typescript: 6.0.3 - typescript-eslint@8.72.0(@typescript/typescript6@6.0.2)(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: '@typescript-eslint/eslint-plugin': 8.72.0(@typescript-eslint/parser@8.72.0(@typescript/typescript6@6.0.2)(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript/typescript6@6.0.2)(eslint@10.13.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f464e40041f6e..1c9f64dbe37a3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -23,7 +23,7 @@ catalog: '@mui/icons-material': 9.5.0 '@mui/internal-test-utils': 2.1.1-canary.5 '@mui/internal-core-docs': 9.4.1-canary.0 - '@mui/internal-docs-infra': 0.13.1-canary.14 + '@mui/internal-docs-infra': 0.13.1-canary.28 '@mui/material': 9.5.0 '@mui/stylis-plugin-rtl': 9.5.0 '@mui/system': 9.5.0 @@ -122,7 +122,7 @@ allowBuilds: msw: false overrides: - '@mui/internal-docs-infra': 0.13.1-canary.14 + '@mui/internal-docs-infra': 0.13.1-canary.28 # Preview packages from material-ui PR #48842, pinned to its reviewed head. '@mui/core-downloads-tracker': https://pkg.pr.new/mui/material-ui/@mui/core-downloads-tracker@40645cf '@mui/icons-material': https://pkg.pr.new/mui/material-ui/@mui/icons-material@40645cf @@ -151,5 +151,3 @@ lockfile: patchedDependencies: # Remove after adopting the core-docs font fix from material-ui #49460. '@mui/internal-core-docs@10.0.0-alpha.0': patches/@mui__internal-core-docs@10.0.0-alpha.0.patch - # Remove after docs-infra ships the export, precompute, and watch fixes. - '@mui/internal-docs-infra@0.13.1-canary.14': patches/@mui__internal-docs-infra@0.13.1-canary.14.patch From 63cb1112432eca327b2942ca02ee0f7a72105274 Mon Sep 17 00:00:00 2001 From: Brijesh Bittu <717550+brijeshb42@users.noreply.github.com> Date: Fri, 30 Oct 2026 12:12:30 +0100 Subject: [PATCH 6/6] Migrate all docs demos --- .../accessibility/KeyboardActivation.js | 77 -- .../accessibility/KeyboardNavigation.js | 155 --- .../accessibility/KeyboardNavigation.tsx | 164 --- .../charts/accessibility/accessibility.md | 4 +- .../KeyboardActivation.tsx | 4 +- .../demos/keyboard-activation/client.ts | 7 + .../demos/keyboard-activation/index.ts | 6 + .../KeyboardNavigation.tsx | 167 +++ .../demos/keyboard-navigation/client.ts | 7 + .../demos/keyboard-navigation/index.ts | 6 + .../animation/CSSAnimationCustomization.js | 32 - .../CSSAnimationCustomization.tsx.preview | 13 - .../animation/JSAnimationCustomization.js | 78 -- .../charts/animation/JSDefaultAnimation.js | 86 -- .../animation/MotionAnimationCustomization.js | 67 - .../ReactSpringAnimationCustomization.js | 77 -- docs/data/charts/animation/animation.md | 10 +- .../CSSAnimationCustomization.tsx | 2 + .../css-animation-customization/client.ts | 7 + .../css-animation-customization/index.ts | 6 + .../JSAnimationCustomization.tsx | 5 +- .../js-animation-customization/client.ts | 7 + .../demos/js-animation-customization/index.ts | 6 + .../JSDefaultAnimation.tsx | 5 +- .../demos/js-default-animation/client.ts | 7 + .../demos/js-default-animation/index.ts | 6 + .../MotionAnimationCustomization.tsx | 9 +- .../motion-animation-customization/client.ts | 7 + .../motion-animation-customization/index.ts | 6 + .../ReactSpringAnimationCustomization.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../areas-demo/AreaChartConnectNulls.js | 23 - .../AreaChartConnectNulls.tsx.preview | 10 - .../charts/areas-demo/AreaChartFillByValue.js | 165 --- .../charts/areas-demo/PercentAreaChart.js | 60 - .../data/charts/areas-demo/SimpleAreaChart.js | 31 - .../areas-demo/SimpleAreaChart.tsx.preview | 10 - .../charts/areas-demo/StackedAreaChart.js | 43 - docs/data/charts/areas-demo/TinyAreaChart.js | 34 - .../areas-demo/TinyAreaChart.tsx.preview | 16 - docs/data/charts/areas-demo/areas-demo.md | 12 +- .../AreaChartConnectNulls.tsx | 2 + .../demos/area-chart-connect-nulls/client.ts | 7 + .../demos/area-chart-connect-nulls/index.ts | 6 + .../AreaChartFillByValue.tsx | 4 +- .../demos/area-chart-fill-by-value/client.ts | 7 + .../demos/area-chart-fill-by-value/index.ts | 6 + .../percent-area-chart}/PercentAreaChart.tsx | 2 + .../demos/percent-area-chart/client.ts | 7 + .../demos/percent-area-chart/index.ts | 6 + .../simple-area-chart}/SimpleAreaChart.tsx | 2 + .../demos/simple-area-chart/client.ts | 7 + .../demos/simple-area-chart/index.ts | 6 + .../stacked-area-chart}/StackedAreaChart.tsx | 2 + .../demos/stacked-area-chart/client.ts | 7 + .../demos/stacked-area-chart/index.ts | 6 + .../tiny-area-chart}/TinyAreaChart.tsx | 2 + .../demos/tiny-area-chart/client.ts | 7 + .../areas-demo/demos/tiny-area-chart/index.ts | 6 + .../axis-customization/AxisCustomization.js | 67 - .../axis-customization/AxisIdStyling.js | 40 - .../AxisIdStyling.tsx.preview | 15 - .../AxisTextCustomization.js | 91 -- .../axis-customization/CustomAxisTicks.js | 89 -- .../CustomAxisTicks.tsx.preview | 5 - .../axis-customization/GroupedAxesStyling.js | 87 -- .../axis-customization/GroupedAxesTickSize.js | 83 -- .../MarginAndLabelPosition.js | 241 ---- .../axis-customization/TickLabelImage.js | 79 -- .../axis-customization/axis-customization.md | 16 +- .../axis-customization}/AxisCustomization.tsx | 2 + .../demos/axis-customization/client.ts | 7 + .../demos/axis-customization/index.ts | 6 + .../axis-id-styling}/AxisIdStyling.tsx | 5 +- .../demos/axis-id-styling/client.ts | 7 + .../demos/axis-id-styling/index.ts | 6 + .../AxisTextCustomization.tsx | 4 +- .../demos/axis-text-customization/client.ts | 7 + .../demos/axis-text-customization/index.ts | 6 + .../custom-axis-ticks}/CustomAxisTicks.tsx | 7 +- .../demos/custom-axis-ticks/client.ts | 7 + .../demos/custom-axis-ticks/index.ts | 6 + .../GroupedAxesStyling.tsx | 2 + .../demos/grouped-axes-styling/client.ts | 7 + .../demos/grouped-axes-styling/index.ts | 6 + .../GroupedAxesTickSize.tsx | 2 + .../demos/grouped-axes-tick-size/client.ts | 7 + .../demos/grouped-axes-tick-size/index.ts | 6 + .../MarginAndLabelPosition.tsx | 2 + .../demos/margin-and-label-position/client.ts | 7 + .../demos/margin-and-label-position/index.ts | 6 + .../tick-label-image}/TickLabelImage.tsx | 6 +- .../demos/tick-label-image/client.ts | 7 + .../demos/tick-label-image/index.ts | 6 + .../charts/axis-ticks/CustomTickFrequency.js | 74 -- .../CustomTickFrequency.tsx.preview | 13 - docs/data/charts/axis-ticks/GridDemo.js | 23 - docs/data/charts/axis-ticks/GridDemo.tsx | 23 - .../charts/axis-ticks/GridDemo.tsx.preview | 10 - docs/data/charts/axis-ticks/GridLabels.js | 63 - .../charts/axis-ticks/OrdinalTickPlacement.js | 83 -- .../charts/axis-ticks/SelectTimeFrequency.tsx | 2 +- .../charts/axis-ticks/TickLabelPosition.js | 96 -- docs/data/charts/axis-ticks/TickNumber.js | 59 - .../charts/axis-ticks/TickNumber.tsx.preview | 16 - docs/data/charts/axis-ticks/TickPosition.js | 93 -- .../axis-ticks/TickPosition.tsx.preview | 16 - docs/data/charts/axis-ticks/TickSpacing.js | 52 - docs/data/charts/axis-ticks/axis-ticks.md | 16 +- .../CustomTickFrequency.tsx | 11 +- .../demos/custom-tick-frequency/client.ts | 7 + .../demos/custom-tick-frequency/index.ts | 6 + .../axis-ticks/demos/grid-demo/GridDemo.tsx | 25 + .../axis-ticks/demos/grid-demo/client.ts | 7 + .../axis-ticks/demos/grid-demo/index.ts | 6 + .../{ => demos/grid-labels}/GridLabels.tsx | 6 +- .../axis-ticks/demos/grid-labels/client.ts | 7 + .../axis-ticks/demos/grid-labels/index.ts | 6 + .../OrdinalTickPlacement.tsx | 15 +- .../demos/ordinal-tick-placement/client.ts | 7 + .../demos/ordinal-tick-placement/index.ts | 6 + .../TickLabelPosition.tsx | 4 +- .../demos/tick-label-position/client.ts | 7 + .../demos/tick-label-position/index.ts | 6 + .../{ => demos/tick-number}/TickNumber.tsx | 2 + .../axis-ticks/demos/tick-number/client.ts | 7 + .../axis-ticks/demos/tick-number/index.ts | 6 + .../tick-position}/TickPosition.tsx | 4 +- .../axis-ticks/demos/tick-position/client.ts | 7 + .../axis-ticks/demos/tick-position/index.ts | 6 + .../{ => demos/tick-spacing}/TickSpacing.tsx | 4 +- .../axis-ticks/demos/tick-spacing/client.ts | 7 + .../axis-ticks/demos/tick-spacing/index.ts | 6 + docs/data/charts/axis/AxisAutoSize.js | 65 - docs/data/charts/axis/AxisAutoSizeRotated.js | 75 -- docs/data/charts/axis/AxisCoordinatesDemo.js | 152 --- docs/data/charts/axis/AxisWithComposition.js | 59 - docs/data/charts/axis/CustomDomainYAxis.js | 55 - docs/data/charts/axis/CustomDomainYAxis.tsx | 59 - docs/data/charts/axis/FormatterD3.js | 59 - docs/data/charts/axis/FormatterDemo.js | 117 -- .../charts/axis/FormatterDemo.tsx.preview | 16 - docs/data/charts/axis/GroupedAxes.js | 84 -- docs/data/charts/axis/GroupedAxes.tsx.preview | 17 - docs/data/charts/axis/GroupedAxesAutoSize.js | 166 --- docs/data/charts/axis/GroupedYAxes.js | 63 - .../data/charts/axis/GroupedYAxes.tsx.preview | 25 - docs/data/charts/axis/HidingAxis.js | 13 - docs/data/charts/axis/HidingAxis.tsx.preview | 7 - docs/data/charts/axis/MinMaxExample.js | 59 - docs/data/charts/axis/ModifyAxisPosition.js | 27 - .../axis/ModifyAxisPosition.tsx.preview | 5 - docs/data/charts/axis/MultipleAxes.js | 23 - .../data/charts/axis/MultipleAxes.tsx.preview | 12 - docs/data/charts/axis/ReferenceLine.js | 65 - .../charts/axis/ReferenceLine.tsx.preview | 13 - docs/data/charts/axis/ReverseExample.js | 99 -- docs/data/charts/axis/ScaleExample.js | 23 - .../data/charts/axis/ScaleExample.tsx.preview | 12 - docs/data/charts/axis/SymlogScale.js | 67 - docs/data/charts/axis/SymlogScale.tsx.preview | 15 - docs/data/charts/axis/TicksWithoutLabels.js | 97 -- docs/data/charts/axis/axis.md | 38 +- .../AxisAutoSizeRotated.tsx | 2 + .../demos/axis-auto-size-rotated/client.ts | 7 + .../demos/axis-auto-size-rotated/index.ts | 6 + .../axis-auto-size}/AxisAutoSize.tsx | 2 + .../axis/demos/axis-auto-size/client.ts | 7 + .../charts/axis/demos/axis-auto-size/index.ts | 6 + .../AxisCoordinatesDemo.tsx | 6 +- .../demos/axis-coordinates-demo/client.ts | 7 + .../axis/demos/axis-coordinates-demo/index.ts | 6 + .../AxisWithComposition.tsx | 2 + .../demos/axis-with-composition/client.ts | 7 + .../axis/demos/axis-with-composition/index.ts | 6 + .../CustomDomainYAxis.tsx | 61 + .../axis/demos/custom-domain-y-axis/client.ts | 7 + .../axis/demos/custom-domain-y-axis/index.ts | 6 + .../{ => demos/formatter-d3}/FormatterD3.tsx | 4 +- .../charts/axis/demos/formatter-d3/client.ts | 7 + .../charts/axis/demos/formatter-d3/index.ts | 6 + .../formatter-demo}/FormatterDemo.tsx | 2 + .../axis/demos/formatter-demo/client.ts | 7 + .../charts/axis/demos/formatter-demo/index.ts | 6 + .../GroupedAxesAutoSize.tsx | 4 +- .../demos/grouped-axes-auto-size/client.ts | 7 + .../demos/grouped-axes-auto-size/index.ts | 6 + .../{ => demos/grouped-axes}/GroupedAxes.tsx | 2 + .../charts/axis/demos/grouped-axes/client.ts | 7 + .../charts/axis/demos/grouped-axes/index.ts | 6 + .../grouped-y-axes}/GroupedYAxes.tsx | 2 + .../axis/demos/grouped-y-axes/client.ts | 7 + .../charts/axis/demos/grouped-y-axes/index.ts | 6 + .../{ => demos/hiding-axis}/HidingAxis.tsx | 2 + .../charts/axis/demos/hiding-axis/client.ts | 7 + .../charts/axis/demos/hiding-axis/index.ts | 6 + .../min-max-example}/MinMaxExample.tsx | 2 + .../axis/demos/min-max-example/client.ts | 7 + .../axis/demos/min-max-example/index.ts | 6 + .../ModifyAxisPosition.tsx | 2 + .../axis/demos/modify-axis-position/client.ts | 7 + .../axis/demos/modify-axis-position/index.ts | 6 + .../multiple-axes}/MultipleAxes.tsx | 2 + .../charts/axis/demos/multiple-axes/client.ts | 7 + .../charts/axis/demos/multiple-axes/index.ts | 6 + .../reference-line}/ReferenceLine.tsx | 4 +- .../axis/demos/reference-line/client.ts | 7 + .../charts/axis/demos/reference-line/index.ts | 6 + .../reverse-example}/ReverseExample.tsx | 2 + .../axis/demos/reverse-example/client.ts | 7 + .../axis/demos/reverse-example/index.ts | 6 + .../scale-example}/ScaleExample.tsx | 2 + .../charts/axis/demos/scale-example/client.ts | 7 + .../charts/axis/demos/scale-example/index.ts | 6 + .../{ => demos/symlog-scale}/SymlogScale.tsx | 2 + .../charts/axis/demos/symlog-scale/client.ts | 7 + .../charts/axis/demos/symlog-scale/index.ts | 6 + .../TicksWithoutLabels.tsx | 9 +- .../axis/demos/ticks-without-labels/client.ts | 7 + .../axis/demos/ticks-without-labels/index.ts | 6 + .../charts/bar-demo/BarChartStackedBySign.js | 30 - .../BarChartStackedBySign.tsx.preview | 8 - docs/data/charts/bar-demo/BiaxialBarChart.js | 43 - .../data/charts/bar-demo/HistogramBarChart.js | 96 -- docs/data/charts/bar-demo/MixedBarChart.js | 32 - .../charts/bar-demo/MixedBarChart.tsx.preview | 9 - .../bar-demo/PopulationPyramidBarChart.js | 107 -- .../bar-demo/PositiveAndNegativeBarChart.js | 30 - .../PositiveAndNegativeBarChart.tsx.preview | 8 - docs/data/charts/bar-demo/SimpleBarChart.js | 29 - .../bar-demo/SimpleBarChart.tsx.preview | 8 - docs/data/charts/bar-demo/StackedBarChart.js | 29 - .../bar-demo/StackedBarChart.tsx.preview | 8 - docs/data/charts/bar-demo/TinyBarChart.js | 26 - .../charts/bar-demo/TinyBarChart.tsx.preview | 8 - docs/data/charts/bar-demo/WaterfallChart.js | 71 - docs/data/charts/bar-demo/bar-demo.md | 20 +- .../BarChartStackedBySign.tsx | 2 + .../demos/bar-chart-stacked-by-sign/client.ts | 7 + .../demos/bar-chart-stacked-by-sign/index.ts | 6 + .../biaxial-bar-chart}/BiaxialBarChart.tsx | 2 + .../demos/biaxial-bar-chart/client.ts | 7 + .../bar-demo/demos/biaxial-bar-chart/index.ts | 6 + .../HistogramBarChart.tsx | 2 + .../demos/histogram-bar-chart/client.ts | 7 + .../demos/histogram-bar-chart/index.ts | 6 + .../mixed-bar-chart}/MixedBarChart.tsx | 2 + .../bar-demo/demos/mixed-bar-chart/client.ts | 7 + .../bar-demo/demos/mixed-bar-chart/index.ts | 6 + .../PopulationPyramidBarChart.tsx | 2 + .../population-pyramid-bar-chart/client.ts | 7 + .../population-pyramid-bar-chart/index.ts | 6 + .../PositiveAndNegativeBarChart.tsx | 2 + .../positive-and-negative-bar-chart/client.ts | 7 + .../positive-and-negative-bar-chart/index.ts | 6 + .../simple-bar-chart}/SimpleBarChart.tsx | 2 + .../bar-demo/demos/simple-bar-chart/client.ts | 7 + .../bar-demo/demos/simple-bar-chart/index.ts | 6 + .../stacked-bar-chart}/StackedBarChart.tsx | 2 + .../demos/stacked-bar-chart/client.ts | 7 + .../bar-demo/demos/stacked-bar-chart/index.ts | 6 + .../tiny-bar-chart}/TinyBarChart.tsx | 2 + .../bar-demo/demos/tiny-bar-chart/client.ts | 7 + .../bar-demo/demos/tiny-bar-chart/index.ts | 6 + .../waterfall-chart}/WaterfallChart.tsx | 2 + .../bar-demo/demos/waterfall-chart/client.ts | 7 + .../bar-demo/demos/waterfall-chart/index.ts | 6 + docs/data/charts/bars/BarAnimation.js | 147 --- docs/data/charts/bars/BarBatchRenderer.js | 74 -- docs/data/charts/bars/BarClick.js | 97 -- docs/data/charts/bars/BarGap.js | 68 - docs/data/charts/bars/BarGradient.js | 42 - docs/data/charts/bars/BarGradient.tsx.preview | 15 - docs/data/charts/bars/BarLabel.js | 26 - docs/data/charts/bars/BarLabel.tsx.preview | 14 - docs/data/charts/bars/BarLabelPlacement.js | 16 - .../charts/bars/BarLabelPlacement.tsx.preview | 10 - .../charts/bars/BarOECDHouseholdSavings.js | 110 -- docs/data/charts/bars/BarScatterCompostion.js | 110 -- docs/data/charts/bars/BarsDataset.js | 28 - docs/data/charts/bars/BarsDataset.tsx.preview | 11 - docs/data/charts/bars/BasicBars.js | 11 - docs/data/charts/bars/BasicBars.tsx.preview | 5 - docs/data/charts/bars/BorderRadius.js | 102 -- docs/data/charts/bars/ColorScale.js | 173 --- docs/data/charts/bars/ColorScale.tsx | 184 --- docs/data/charts/bars/CustomLabels.js | 36 - docs/data/charts/bars/GridDemo.js | 21 - docs/data/charts/bars/GridDemo.tsx | 21 - docs/data/charts/bars/GridDemo.tsx.preview | 8 - docs/data/charts/bars/HorizontalBars.js | 24 - .../charts/bars/HorizontalBars.tsx.preview | 7 - docs/data/charts/bars/LabelsAboveBars.js | 71 - .../charts/bars/LabelsAboveBars.tsx.preview | 11 - docs/data/charts/bars/MinBarSize.js | 41 - .../charts/bars/ShinyBarChartHorizontal.js | 157 --- docs/data/charts/bars/StackBars.js | 32 - docs/data/charts/bars/StackBars.tsx.preview | 15 - docs/data/charts/bars/StackTotalLabels.js | 79 -- docs/data/charts/bars/TickPlacementBars.js | 93 -- .../charts/bars/TickPlacementBars.tsx.preview | 11 - docs/data/charts/bars/WebGLBars.js | 64 - docs/data/charts/bars/bars.md | 46 +- .../bar-animation}/BarAnimation.tsx | 4 +- .../charts/bars/demos/bar-animation/client.ts | 7 + .../charts/bars/demos/bar-animation/index.ts | 6 + .../bar-batch-renderer}/BarBatchRenderer.tsx | 4 +- .../bars/demos/bar-batch-renderer/client.ts | 7 + .../bars/demos/bar-batch-renderer/index.ts | 6 + .../bars/{ => demos/bar-click}/BarClick.tsx | 4 +- .../charts/bars/demos/bar-click/client.ts | 7 + .../data/charts/bars/demos/bar-click/index.ts | 6 + .../bars/{ => demos/bar-gap}/BarGap.tsx | 4 +- docs/data/charts/bars/demos/bar-gap/client.ts | 7 + docs/data/charts/bars/demos/bar-gap/index.ts | 6 + .../{ => demos/bar-gradient}/BarGradient.tsx | 2 + .../charts/bars/demos/bar-gradient/client.ts | 7 + .../charts/bars/demos/bar-gradient/index.ts | 6 + .../BarLabelPlacement.tsx | 2 + .../bars/demos/bar-label-placement/client.ts | 7 + .../bars/demos/bar-label-placement/index.ts | 6 + .../bars/{ => demos/bar-label}/BarLabel.tsx | 2 + .../charts/bars/demos/bar-label/client.ts | 7 + .../data/charts/bars/demos/bar-label/index.ts | 6 + .../BarOECDHouseholdSavings.tsx | 9 +- .../bar-oecd-household-savings/client.ts | 7 + .../demos/bar-oecd-household-savings/index.ts | 6 + .../BarScatterCompostion.tsx | 4 +- .../demos/bar-scatter-compostion/client.ts | 7 + .../demos/bar-scatter-compostion/index.ts | 6 + .../{ => demos/bars-dataset}/BarsDataset.tsx | 4 +- .../charts/bars/demos/bars-dataset/client.ts | 7 + .../charts/bars/demos/bars-dataset/index.ts | 6 + .../bars/{ => demos/basic-bars}/BasicBars.tsx | 2 + .../charts/bars/demos/basic-bars/client.ts | 7 + .../charts/bars/demos/basic-bars/index.ts | 6 + .../border-radius}/BorderRadius.tsx | 5 +- .../charts/bars/demos/border-radius/client.ts | 7 + .../charts/bars/demos/border-radius/index.ts | 6 + .../bars/demos/color-scale/ColorScale.tsx | 186 +++ .../charts/bars/demos/color-scale/client.ts | 7 + .../charts/bars/demos/color-scale/index.ts | 6 + .../custom-labels}/CustomLabels.tsx | 5 +- .../charts/bars/demos/custom-labels/client.ts | 7 + .../charts/bars/demos/custom-labels/index.ts | 6 + .../charts/bars/demos/grid-demo/GridDemo.tsx | 23 + .../charts/bars/demos/grid-demo/client.ts | 7 + .../data/charts/bars/demos/grid-demo/index.ts | 6 + .../horizontal-bars}/HorizontalBars.tsx | 4 +- .../bars/demos/horizontal-bars/client.ts | 7 + .../bars/demos/horizontal-bars/index.ts | 6 + .../labels-above-bars}/LabelsAboveBars.tsx | 5 +- .../bars/demos/labels-above-bars/client.ts | 7 + .../bars/demos/labels-above-bars/index.ts | 6 + .../{ => demos/min-bar-size}/MinBarSize.tsx | 2 + .../charts/bars/demos/min-bar-size/client.ts | 7 + .../charts/bars/demos/min-bar-size/index.ts | 6 + .../ShinyBarChartHorizontal.tsx | 7 +- .../shiny-bar-chart-horizontal/client.ts | 7 + .../demos/shiny-bar-chart-horizontal/index.ts | 6 + .../bars/{ => demos/stack-bars}/StackBars.tsx | 7 +- .../charts/bars/demos/stack-bars/client.ts | 7 + .../charts/bars/demos/stack-bars/index.ts | 6 + .../stack-total-labels}/StackTotalLabels.tsx | 2 + .../bars/demos/stack-total-labels/client.ts | 7 + .../bars/demos/stack-total-labels/index.ts | 6 + .../TickPlacementBars.tsx | 4 +- .../bars/demos/tick-placement-bars/client.ts | 7 + .../bars/demos/tick-placement-bars/index.ts | 6 + .../{ => demos/web-gl-bars}/WebGLBars.tsx | 2 + .../charts/bars/demos/web-gl-bars/client.ts | 7 + .../charts/bars/demos/web-gl-bars/index.ts | 6 + docs/data/charts/brush/BrushBasic.js | 42 - docs/data/charts/brush/BrushBasic.tsx.preview | 16 - docs/data/charts/brush/BrushCustomOverlay.js | 200 --- docs/data/charts/brush/BrushScatterList.js | 155 --- docs/data/charts/brush/brush.md | 6 +- .../{ => demos/brush-basic}/BrushBasic.tsx | 2 + .../charts/brush/demos/brush-basic/client.ts | 7 + .../charts/brush/demos/brush-basic/index.ts | 6 + .../BrushCustomOverlay.tsx | 2 + .../demos/brush-custom-overlay/client.ts | 7 + .../brush/demos/brush-custom-overlay/index.ts | 6 + .../brush-scatter-list}/BrushScatterList.tsx | 2 + .../brush/demos/brush-scatter-list/client.ts | 7 + .../brush/demos/brush-scatter-list/index.ts | 6 + .../charts/bubble/BubbleChartCO2Emissions.js | 204 --- docs/data/charts/bubble/ColorScale.js | 285 ---- docs/data/charts/bubble/ColorScale.tsx | 306 ----- docs/data/charts/bubble/DifferentSizeScale.js | 59 - docs/data/charts/bubble/ScatterZAxis.js | 207 --- docs/data/charts/bubble/SizeScale.js | 33 - docs/data/charts/bubble/SizeScale.tsx.preview | 11 - docs/data/charts/bubble/bubble.md | 10 +- .../BubbleChartCO2Emissions.tsx | 4 +- .../bubble-chart-co2-emissions/client.ts | 7 + .../demos/bubble-chart-co2-emissions/index.ts | 6 + .../bubble/demos/color-scale/ColorScale.tsx | 308 +++++ .../charts/bubble/demos/color-scale/client.ts | 7 + .../charts/bubble/demos/color-scale/index.ts | 6 + .../DifferentSizeScale.tsx | 2 + .../demos/different-size-scale/client.ts | 7 + .../demos/different-size-scale/index.ts | 6 + .../scatter-z-axis}/ScatterZAxis.tsx | 7 +- .../bubble/demos/scatter-z-axis/client.ts | 7 + .../bubble/demos/scatter-z-axis/index.ts | 6 + .../{ => demos/size-scale}/SizeScale.tsx | 2 + .../charts/bubble/demos/size-scale/client.ts | 7 + .../charts/bubble/demos/size-scale/index.ts | 6 + .../charts/candlestick/BasicCandlestick.js | 17 - .../charts/candlestick/BasicCandlestick.tsx | 22 - .../candlestick/BasicCandlestick.tsx.preview | 5 - .../candlestick/CandlestickComposition.js | 238 ---- .../charts/candlestick/CandlestickOverview.js | 452 ------- .../candlestick/CandlestickValueFormatter.js | 54 - .../CandlestickValueFormatter.tsx.preview | 16 - .../charts/candlestick/ColorCandlestick.js | 23 - .../candlestick/ColorCandlestick.tsx.preview | 12 - .../candlestick/CustomizedCandlestick.js | 43 - .../candlestick/CustomizedCandlestick.tsx | 46 - .../CustomizedCandlestick.tsx.preview | 11 - .../charts/candlestick/DatasetCandlestick.js | 27 - .../DatasetCandlestick.tsx.preview | 15 - docs/data/charts/candlestick/candlestick.md | 14 +- .../basic-candlestick/BasicCandlestick.tsx | 24 + .../demos/basic-candlestick/client.ts | 7 + .../demos/basic-candlestick/index.ts | 6 + .../CandlestickComposition.tsx | 9 +- .../demos/candlestick-composition/client.ts | 7 + .../demos/candlestick-composition/index.ts | 6 + .../CandlestickOverview.tsx | 9 +- .../demos/candlestick-overview/client.ts | 7 + .../demos/candlestick-overview/index.ts | 6 + .../CandlestickValueFormatter.tsx | 12 +- .../candlestick-value-formatter/client.ts | 7 + .../candlestick-value-formatter/index.ts | 6 + .../color-candlestick}/ColorCandlestick.tsx | 6 +- .../demos/color-candlestick/client.ts | 7 + .../demos/color-candlestick/index.ts | 6 + .../CustomizedCandlestick.tsx | 46 + .../demos/customized-candlestick/client.ts | 7 + .../demos/customized-candlestick/index.ts | 6 + .../DatasetCandlestick.tsx | 4 +- .../demos/dataset-candlestick/client.ts | 7 + .../demos/dataset-candlestick/index.ts | 6 + docs/data/charts/components/BasicScaleDemo.js | 66 - .../components/BasicScaleDemo.tsx.preview | 14 - docs/data/charts/components/HtmlLegend.js | 65 - .../charts/components/HtmlLegend.tsx.preview | 14 - docs/data/charts/components/OriginDemo.js | 77 -- docs/data/charts/components/ScaleDemo.js | 133 -- docs/data/charts/components/SeriesDemo.js | 104 -- .../charts/components/SeriesDemo.tsx.preview | 16 - docs/data/charts/components/components.md | 10 +- .../basic-scale-demo}/BasicScaleDemo.tsx | 2 + .../demos/basic-scale-demo/client.ts | 7 + .../demos/basic-scale-demo/index.ts | 6 + .../{ => demos/html-legend}/HtmlLegend.tsx | 2 + .../components/demos/html-legend/client.ts | 7 + .../components/demos/html-legend/index.ts | 6 + .../{ => demos/origin-demo}/OriginDemo.tsx | 4 +- .../components/demos/origin-demo/client.ts | 7 + .../components/demos/origin-demo/index.ts | 6 + .../{ => demos/scale-demo}/ScaleDemo.tsx | 4 +- .../components/demos/scale-demo/client.ts | 7 + .../components/demos/scale-demo/index.ts | 6 + .../{ => demos/series-demo}/SeriesDemo.tsx | 4 +- .../components/demos/series-demo/client.ts | 7 + .../components/demos/series-demo/index.ts | 6 + .../charts/composition/BasicComposition.js | 56 - .../charts/composition/BellCurveOverlay.js | 137 -- docs/data/charts/composition/Layering.js | 71 - .../composition/LegendTooltipComposition.js | 52 - docs/data/charts/composition/LimitOverflow.js | 101 -- .../charts/composition/SwitchSeriesType.js | 54 - .../charts/composition/WeatherComposition.js | 297 ----- docs/data/charts/composition/composition.md | 14 +- .../basic-composition}/BasicComposition.tsx | 2 + .../demos/basic-composition/client.ts | 7 + .../demos/basic-composition/index.ts | 6 + .../bell-curve-overlay}/BellCurveOverlay.tsx | 4 +- .../demos/bell-curve-overlay/client.ts | 7 + .../demos/bell-curve-overlay/index.ts | 6 + .../{ => demos/layering}/Layering.tsx | 4 +- .../composition/demos/layering/client.ts | 7 + .../composition/demos/layering/index.ts | 6 + .../LegendTooltipComposition.tsx | 2 + .../legend-tooltip-composition/client.ts | 7 + .../demos/legend-tooltip-composition/index.ts | 6 + .../limit-overflow}/LimitOverflow.tsx | 2 + .../demos/limit-overflow/client.ts | 7 + .../composition/demos/limit-overflow/index.ts | 6 + .../switch-series-type}/SwitchSeriesType.tsx | 2 + .../demos/switch-series-type/client.ts | 7 + .../demos/switch-series-type/index.ts | 6 + .../WeatherComposition.tsx | 8 +- .../demos/weather-composition/client.ts | 7 + .../demos/weather-composition/index.ts | 6 + .../weatherCompositionComponents.tsx | 3 +- .../data-grid-integration.md | 2 +- docs/data/charts/dataset/AxisValueGetter.js | 28 - .../dataset/AxisValueGetter.tsx.preview | 13 - docs/data/charts/dataset/DatasetBasic.js | 30 - .../charts/dataset/DatasetBasic.tsx.preview | 9 - docs/data/charts/dataset/SeriesValueGetter.js | 37 - docs/data/charts/dataset/countryData.ts | 4 +- docs/data/charts/dataset/dataset.md | 6 +- .../axis-value-getter}/AxisValueGetter.tsx | 2 + .../dataset/demos/axis-value-getter/client.ts | 7 + .../dataset/demos/axis-value-getter/index.ts | 6 + .../dataset-basic}/DatasetBasic.tsx | 2 + .../dataset/demos/dataset-basic/client.ts | 7 + .../dataset/demos/dataset-basic/index.ts | 6 + .../SeriesValueGetter.tsx | 2 + .../demos/series-value-getter/client.ts | 7 + .../demos/series-value-getter/index.ts | 6 + .../charts/dataset/temperatureBerlinPorto.tsx | 2 +- .../data/charts/dataset/usUnemploymentRate.ts | 2 +- docs/data/charts/export/ExportChartAsExcel.js | 45 - .../export/ExportChartAsExcel.tsx.preview | 13 - docs/data/charts/export/ExportChartAsImage.js | 95 -- .../export/ExportChartAsImage.tsx.preview | 15 - .../charts/export/ExportChartHideOnExport.js | 25 - .../export/ExportChartOnBeforeExport.js | 123 -- .../ExportChartOnBeforeExport.tsx.preview | 16 - docs/data/charts/export/ExportChartToolbar.js | 65 - .../export/ExportChartToolbar.tsx.preview | 5 - .../export/ExportChartToolbarCustomization.js | 139 -- .../charts/export/ExportCompositionNoSnap.js | 85 -- docs/data/charts/export/PrintChart.js | 197 --- .../ExportChartAsExcel.tsx | 2 + .../demos/export-chart-as-excel/client.ts | 7 + .../demos/export-chart-as-excel/index.ts | 6 + .../ExportChartAsImage.tsx | 4 +- .../demos/export-chart-as-image/client.ts | 7 + .../demos/export-chart-as-image/index.ts | 6 + .../ExportChartHideOnExport.tsx | 2 + .../export-chart-hide-on-export/client.ts | 7 + .../export-chart-hide-on-export/index.ts | 6 + .../ExportChartOnBeforeExport.tsx | 4 +- .../export-chart-on-before-export/client.ts | 7 + .../export-chart-on-before-export/index.ts | 6 + .../ExportChartToolbarCustomization.tsx | 12 +- .../client.ts | 7 + .../index.ts | 6 + .../ExportChartToolbar.tsx | 4 +- .../demos/export-chart-toolbar/client.ts | 7 + .../demos/export-chart-toolbar/index.ts | 6 + .../ExportCompositionNoSnap.tsx | 2 + .../export-composition-no-snap/client.ts | 7 + .../demos/export-composition-no-snap/index.ts | 6 + .../{ => demos/print-chart}/PrintChart.tsx | 11 +- .../charts/export/demos/print-chart/client.ts | 7 + .../charts/export/demos/print-chart/index.ts | 6 + docs/data/charts/export/export.md | 16 +- docs/data/charts/export/heatmapData.ts | 2 +- docs/data/charts/funnel/BasicFunnel.js | 17 - .../charts/funnel/BasicFunnel.tsx.preview | 8 - docs/data/charts/funnel/FunnelAxisAutoSize.js | 56 - docs/data/charts/funnel/FunnelBorderRadius.js | 28 - docs/data/charts/funnel/FunnelCategoryAxis.js | 26 - .../funnel/FunnelCategoryAxis.tsx.preview | 11 - docs/data/charts/funnel/FunnelColor.js | 22 - .../charts/funnel/FunnelColor.tsx.preview | 13 - docs/data/charts/funnel/FunnelCurves.js | 92 -- .../charts/funnel/FunnelDataAttributes.js | 36 - .../funnel/FunnelDataAttributes.tsx.preview | 16 - docs/data/charts/funnel/FunnelGap.js | 18 - docs/data/charts/funnel/FunnelGap.tsx.preview | 9 - .../charts/funnel/FunnelLabelPositioning.js | 125 -- docs/data/charts/funnel/FunnelLabelStyling.js | 28 - .../funnel/FunnelLabelStyling.tsx.preview | 14 - docs/data/charts/funnel/FunnelLabels.js | 29 - .../charts/funnel/FunnelLabels.tsx.preview | 15 - docs/data/charts/funnel/FunnelLegend.js | 48 - .../charts/funnel/FunnelLegend.tsx.preview | 15 - docs/data/charts/funnel/FunnelLinearScale.js | 20 - .../funnel/FunnelLinearScale.tsx.preview | 5 - docs/data/charts/funnel/FunnelStacked.js | 39 - .../charts/funnel/FunnelStacked.tsx.preview | 16 - docs/data/charts/funnel/FunnelVariant.js | 25 - .../charts/funnel/FunnelVariant.tsx.preview | 9 - docs/data/charts/funnel/HighlightFunnel.js | 90 -- docs/data/charts/funnel/PyramidFunnel.js | 18 - .../charts/funnel/PyramidFunnel.tsx.preview | 9 - .../{ => demos/basic-funnel}/BasicFunnel.tsx | 2 + .../funnel/demos/basic-funnel/client.ts | 7 + .../charts/funnel/demos/basic-funnel/index.ts | 6 + .../FunnelAxisAutoSize.tsx | 2 + .../demos/funnel-axis-auto-size/client.ts | 7 + .../demos/funnel-axis-auto-size/index.ts | 6 + .../FunnelBorderRadius.tsx | 2 + .../demos/funnel-border-radius/client.ts | 7 + .../demos/funnel-border-radius/index.ts | 6 + .../FunnelCategoryAxis.tsx | 4 +- .../demos/funnel-category-axis/client.ts | 7 + .../demos/funnel-category-axis/index.ts | 6 + .../{ => demos/funnel-color}/FunnelColor.tsx | 2 + .../funnel/demos/funnel-color/client.ts | 7 + .../charts/funnel/demos/funnel-color/index.ts | 6 + .../funnel-curves}/FunnelCurves.tsx | 4 +- .../funnel/demos/funnel-curves/client.ts | 7 + .../funnel/demos/funnel-curves/index.ts | 6 + .../FunnelDataAttributes.tsx | 2 + .../demos/funnel-data-attributes/client.ts | 7 + .../demos/funnel-data-attributes/index.ts | 6 + .../{ => demos/funnel-gap}/FunnelGap.tsx | 2 + .../charts/funnel/demos/funnel-gap/client.ts | 7 + .../charts/funnel/demos/funnel-gap/index.ts | 6 + .../FunnelLabelPositioning.tsx | 2 + .../demos/funnel-label-positioning/client.ts | 7 + .../demos/funnel-label-positioning/index.ts | 6 + .../FunnelLabelStyling.tsx | 2 + .../demos/funnel-label-styling/client.ts | 7 + .../demos/funnel-label-styling/index.ts | 6 + .../funnel-labels}/FunnelLabels.tsx | 2 + .../funnel/demos/funnel-labels/client.ts | 7 + .../funnel/demos/funnel-labels/index.ts | 6 + .../funnel-legend}/FunnelLegend.tsx | 2 + .../funnel/demos/funnel-legend/client.ts | 7 + .../funnel/demos/funnel-legend/index.ts | 6 + .../FunnelLinearScale.tsx | 4 +- .../demos/funnel-linear-scale/client.ts | 7 + .../funnel/demos/funnel-linear-scale/index.ts | 6 + .../funnel-stacked}/FunnelStacked.tsx | 5 +- .../funnel/demos/funnel-stacked/client.ts | 7 + .../funnel/demos/funnel-stacked/index.ts | 6 + .../funnel-variant}/FunnelVariant.tsx | 2 + .../funnel/demos/funnel-variant/client.ts | 7 + .../funnel/demos/funnel-variant/index.ts | 6 + .../highlight-funnel}/HighlightFunnel.tsx | 6 +- .../funnel/demos/highlight-funnel/client.ts | 7 + .../funnel/demos/highlight-funnel/index.ts | 6 + .../pyramid-funnel}/PyramidFunnel.tsx | 2 + .../funnel/demos/pyramid-funnel/client.ts | 7 + .../funnel/demos/pyramid-funnel/index.ts | 6 + docs/data/charts/funnel/funnel.md | 34 +- docs/data/charts/gauge/ArcDesign.js | 27 - docs/data/charts/gauge/ArcDesign.tsx.preview | 15 - docs/data/charts/gauge/ArcPlayground.js | 83 -- docs/data/charts/gauge/BasicGauges.js | 11 - .../data/charts/gauge/BasicGauges.tsx.preview | 2 - docs/data/charts/gauge/CompositionExample.js | 46 - docs/data/charts/gauge/CompositionExample.tsx | 46 - .../gauge/CompositionExample.tsx.preview | 11 - docs/data/charts/gauge/GaugeValueRange.js | 11 - .../charts/gauge/GaugeValueRange.tsx.preview | 2 - docs/data/charts/gauge/TextPlayground.js | 81 -- .../{ => demos/arc-design}/ArcDesign.tsx | 2 + .../charts/gauge/demos/arc-design/client.ts | 7 + .../charts/gauge/demos/arc-design/index.ts | 6 + .../arc-playground}/ArcPlayground.tsx | 2 + .../gauge/demos/arc-playground/client.ts | 7 + .../gauge/demos/arc-playground/index.ts | 6 + .../{ => demos/basic-gauges}/BasicGauges.tsx | 2 + .../charts/gauge/demos/basic-gauges/client.ts | 7 + .../charts/gauge/demos/basic-gauges/index.ts | 6 + .../CompositionExample.tsx | 48 + .../gauge/demos/composition-example/client.ts | 7 + .../gauge/demos/composition-example/index.ts | 6 + .../gauge-value-range}/GaugeValueRange.tsx | 2 + .../gauge/demos/gauge-value-range/client.ts | 7 + .../gauge/demos/gauge-value-range/index.ts | 6 + .../text-playground}/TextPlayground.tsx | 2 + .../gauge/demos/text-playground/client.ts | 7 + .../gauge/demos/text-playground/index.ts | 6 + docs/data/charts/gauge/gauge.md | 12 +- docs/data/charts/heatmap/BasicHeatmap.js | 16 - .../charts/heatmap/BasicHeatmap.tsx.preview | 6 - docs/data/charts/heatmap/ColorConfig.js | 123 -- .../charts/heatmap/ColorConfig.tsx.preview | 16 - docs/data/charts/heatmap/CustomItem.js | 44 - .../charts/heatmap/CustomItem.tsx.preview | 7 - docs/data/charts/heatmap/HeatmapCellClick.js | 65 - docs/data/charts/heatmap/HeatmapDemo.js | 120 -- docs/data/charts/heatmap/HeatmapLegend.js | 24 - .../charts/heatmap/HeatmapLegend.tsx.preview | 14 - docs/data/charts/heatmap/HighlightClasses.js | 35 - docs/data/charts/heatmap/HighlightHeatmap.js | 16 - .../heatmap/HighlightHeatmap.tsx.preview | 6 - docs/data/charts/heatmap/WebGLHeatmap.js | 54 - .../charts/heatmap/WebGLHeatmap.tsx.preview | 5 - .../basic-heatmap}/BasicHeatmap.tsx | 4 +- .../heatmap/demos/basic-heatmap/client.ts | 7 + .../heatmap/demos/basic-heatmap/index.ts | 6 + .../{ => demos/color-config}/ColorConfig.tsx | 4 +- .../heatmap/demos/color-config/client.ts | 7 + .../heatmap/demos/color-config/index.ts | 6 + .../{ => demos/custom-item}/CustomItem.tsx | 7 +- .../heatmap/demos/custom-item/client.ts | 7 + .../charts/heatmap/demos/custom-item/index.ts | 6 + .../heatmap-cell-click}/HeatmapCellClick.tsx | 4 +- .../demos/heatmap-cell-click/client.ts | 7 + .../heatmap/demos/heatmap-cell-click/index.ts | 6 + .../{ => demos/heatmap-demo}/HeatmapDemo.tsx | 6 +- .../heatmap/demos/heatmap-demo/client.ts | 7 + .../heatmap/demos/heatmap-demo/index.ts | 6 + .../heatmap-legend}/HeatmapLegend.tsx | 4 +- .../heatmap/demos/heatmap-legend/client.ts | 7 + .../heatmap/demos/heatmap-legend/index.ts | 6 + .../highlight-classes}/HighlightClasses.tsx | 4 +- .../heatmap/demos/highlight-classes/client.ts | 7 + .../heatmap/demos/highlight-classes/index.ts | 6 + .../highlight-heatmap}/HighlightHeatmap.tsx | 4 +- .../heatmap/demos/highlight-heatmap/client.ts | 7 + .../heatmap/demos/highlight-heatmap/index.ts | 6 + .../web-gl-heatmap}/WebGLHeatmap.tsx | 10 +- .../heatmap/demos/web-gl-heatmap/client.ts | 7 + .../heatmap/demos/web-gl-heatmap/index.ts | 6 + docs/data/charts/heatmap/dumbData.ts | 2 +- docs/data/charts/heatmap/heatmap.md | 18 +- .../charts/highlighting/AxisValueHighlight.js | 76 -- .../AxisValueHighlightCustomization.js | 91 -- .../data/charts/highlighting/BandHighlight.js | 79 -- .../charts/highlighting/BandHighlight.tsx | 84 -- .../highlighting/ControlledAxisHighlight.js | 80 -- .../highlighting/ControlledHighlight.js | 132 -- .../charts/highlighting/ElementHighlights.js | 212 --- .../charts/highlighting/ElementHighlights.tsx | 215 ---- .../data/charts/highlighting/SyncHighlight.js | 66 - .../AxisValueHighlightCustomization.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../AxisValueHighlight.tsx | 4 +- .../demos/axis-value-highlight/client.ts | 7 + .../demos/axis-value-highlight/index.ts | 6 + .../demos/band-highlight/BandHighlight.tsx | 86 ++ .../demos/band-highlight/client.ts | 7 + .../demos/band-highlight/index.ts | 6 + .../ControlledAxisHighlight.tsx | 10 +- .../demos/controlled-axis-highlight/client.ts | 7 + .../demos/controlled-axis-highlight/index.ts | 6 + .../ControlledHighlight.tsx | 7 +- .../demos/controlled-highlight/client.ts | 7 + .../demos/controlled-highlight/index.ts | 6 + .../element-highlights/ElementHighlights.tsx | 218 ++++ .../demos/element-highlights/client.ts | 7 + .../demos/element-highlights/index.ts | 6 + .../sync-highlight}/SyncHighlight.tsx | 10 +- .../demos/sync-highlight/client.ts | 7 + .../demos/sync-highlight/index.ts | 6 + docs/data/charts/highlighting/highlighting.md | 14 +- docs/data/charts/hooks/UseAxes.js | 186 --- docs/data/charts/hooks/UseBarSeries.js | 103 -- docs/data/charts/hooks/UseDataset.js | 127 -- docs/data/charts/hooks/UseDatasetAdvanced.js | 186 --- docs/data/charts/hooks/UseDrawingArea.js | 84 -- docs/data/charts/hooks/UseLegend.js | 47 - docs/data/charts/hooks/UseLegend.tsx.preview | 5 - docs/data/charts/hooks/UsePolarGeometry.js | 74 -- .../charts/hooks/UsePolarGeometry.tsx.preview | 14 - docs/data/charts/hooks/UseScale.js | 93 -- docs/data/charts/hooks/UseSeries.js | 84 -- .../hooks/{ => demos/use-axes}/UseAxes.tsx | 2 + .../charts/hooks/demos/use-axes/client.ts | 7 + .../data/charts/hooks/demos/use-axes/index.ts | 6 + .../use-bar-series}/UseBarSeries.tsx | 2 + .../hooks/demos/use-bar-series/client.ts | 7 + .../hooks/demos/use-bar-series/index.ts | 6 + .../UseDatasetAdvanced.tsx | 4 +- .../demos/use-dataset-advanced/client.ts | 7 + .../hooks/demos/use-dataset-advanced/index.ts | 6 + .../{ => demos/use-dataset}/UseDataset.tsx | 2 + .../charts/hooks/demos/use-dataset/client.ts | 7 + .../charts/hooks/demos/use-dataset/index.ts | 6 + .../use-drawing-area}/UseDrawingArea.tsx | 2 + .../hooks/demos/use-drawing-area/client.ts | 7 + .../hooks/demos/use-drawing-area/index.ts | 6 + .../{ => demos/use-legend}/UseLegend.tsx | 2 + .../charts/hooks/demos/use-legend/client.ts | 7 + .../charts/hooks/demos/use-legend/index.ts | 6 + .../use-polar-geometry}/UsePolarGeometry.tsx | 2 + .../hooks/demos/use-polar-geometry/client.ts | 7 + .../hooks/demos/use-polar-geometry/index.ts | 6 + .../hooks/{ => demos/use-scale}/UseScale.tsx | 2 + .../charts/hooks/demos/use-scale/client.ts | 7 + .../charts/hooks/demos/use-scale/index.ts | 6 + .../{ => demos/use-series}/UseSeries.tsx | 2 + .../charts/hooks/demos/use-series/client.ts | 7 + .../charts/hooks/demos/use-series/index.ts | 6 + docs/data/charts/hooks/use-axes.md | 2 +- docs/data/charts/hooks/use-dataset.md | 4 +- docs/data/charts/hooks/use-drawing-area.md | 2 +- docs/data/charts/hooks/use-legend.md | 2 +- docs/data/charts/hooks/use-polar-geometry.md | 2 +- docs/data/charts/hooks/use-scale.md | 2 +- docs/data/charts/hooks/use-series.md | 4 +- docs/data/charts/label/BasicLabel.js | 21 - docs/data/charts/label/BasicLabel.tsx.preview | 9 - docs/data/charts/label/FunctionLabel.js | 19 - .../charts/label/FunctionLabel.tsx.preview | 7 - docs/data/charts/label/PieLabel.js | 25 - docs/data/charts/label/PieLabel.tsx.preview | 14 - .../{ => demos/basic-label}/BasicLabel.tsx | 2 + .../charts/label/demos/basic-label/client.ts | 7 + .../charts/label/demos/basic-label/index.ts | 6 + .../function-label}/FunctionLabel.tsx | 2 + .../label/demos/function-label/client.ts | 7 + .../label/demos/function-label/index.ts | 6 + .../label/{ => demos/pie-label}/PieLabel.tsx | 2 + .../charts/label/demos/pie-label/client.ts | 7 + .../charts/label/demos/pie-label/index.ts | 6 + docs/data/charts/label/label.md | 6 +- docs/data/charts/legend/BasicColorLegend.js | 59 - docs/data/charts/legend/BasicLegend.js | 15 - .../charts/legend/BasicLegend.tsx.preview | 8 - .../legend/ContinuousInteractiveDemo.js | 111 -- .../charts/legend/ControlledVisibility.js | 105 -- docs/data/charts/legend/CustomLegend.js | 117 -- docs/data/charts/legend/HiddenLegend.js | 36 - .../charts/legend/HiddenLegend.tsx.preview | 2 - docs/data/charts/legend/LegendClick.js | 143 --- .../charts/legend/LegendCustomLabelMark.js | 34 - .../legend/LegendCustomLabelMark.tsx.preview | 10 - docs/data/charts/legend/LegendDimension.js | 79 -- .../charts/legend/LegendLabelPositions.js | 245 ---- docs/data/charts/legend/LegendMarkType.js | 48 - docs/data/charts/legend/LegendPosition.js | 85 -- docs/data/charts/legend/LegendStyleSeries.js | 66 - docs/data/charts/legend/LegendTextStyling.js | 73 -- .../charts/legend/PiecewiseInteractiveDemo.js | 118 -- docs/data/charts/legend/ScrollableLegend.js | 46 - .../legend/ScrollableLegend.tsx.preview | 15 - .../data/charts/legend/StackLineVisibility.js | 44 - .../charts/legend/ToggleSeriesVisibility.js | 41 - .../charts/legend/VeryBasicColorLegend.js | 60 - .../legend/VeryBasicColorLegend.tsx.preview | 15 - docs/data/charts/legend/VisibilityOnChange.js | 35 - .../legend/VisibilityOnChange.tsx.preview | 14 - .../basic-color-legend}/BasicColorLegend.tsx | 4 +- .../legend/demos/basic-color-legend/client.ts | 7 + .../legend/demos/basic-color-legend/index.ts | 6 + .../{ => demos/basic-legend}/BasicLegend.tsx | 4 +- .../legend/demos/basic-legend/client.ts | 7 + .../charts/legend/demos/basic-legend/index.ts | 6 + .../ContinuousInteractiveDemo.tsx | 4 +- .../continuous-interactive-demo/client.ts | 7 + .../continuous-interactive-demo/index.ts | 6 + .../ControlledVisibility.tsx | 2 + .../demos/controlled-visibility/client.ts | 7 + .../demos/controlled-visibility/index.ts | 6 + .../custom-legend}/CustomLegend.tsx | 8 +- .../legend/demos/custom-legend/client.ts | 7 + .../legend/demos/custom-legend/index.ts | 6 + .../hidden-legend}/HiddenLegend.tsx | 2 + .../legend/demos/hidden-legend/client.ts | 7 + .../legend/demos/hidden-legend/index.ts | 6 + .../{ => demos/legend-click}/LegendClick.tsx | 2 + .../legend/demos/legend-click/client.ts | 7 + .../charts/legend/demos/legend-click/index.ts | 6 + .../LegendCustomLabelMark.tsx | 4 +- .../demos/legend-custom-label-mark/client.ts | 7 + .../demos/legend-custom-label-mark/index.ts | 6 + .../legend-dimension}/LegendDimension.tsx | 2 + .../legend/demos/legend-dimension/client.ts | 7 + .../legend/demos/legend-dimension/index.ts | 6 + .../LegendLabelPositions.tsx | 4 +- .../demos/legend-label-positions/client.ts | 7 + .../demos/legend-label-positions/index.ts | 6 + .../legend-mark-type}/LegendMarkType.tsx | 2 + .../legend/demos/legend-mark-type/client.ts | 7 + .../legend/demos/legend-mark-type/index.ts | 6 + .../legend-position}/LegendPosition.tsx | 2 + .../legend/demos/legend-position/client.ts | 7 + .../legend/demos/legend-position/index.ts | 6 + .../LegendStyleSeries.tsx | 5 +- .../demos/legend-style-series/client.ts | 7 + .../legend/demos/legend-style-series/index.ts | 6 + .../LegendTextStyling.tsx | 2 + .../demos/legend-text-styling/client.ts | 7 + .../legend/demos/legend-text-styling/index.ts | 6 + .../PiecewiseInteractiveDemo.tsx | 4 +- .../piecewise-interactive-demo/client.ts | 7 + .../demos/piecewise-interactive-demo/index.ts | 6 + .../scrollable-legend}/ScrollableLegend.tsx | 2 + .../legend/demos/scrollable-legend/client.ts | 7 + .../legend/demos/scrollable-legend/index.ts | 6 + .../StackLineVisibility.tsx | 4 +- .../demos/stack-line-visibility/client.ts | 7 + .../demos/stack-line-visibility/index.ts | 6 + .../ToggleSeriesVisibility.tsx | 4 +- .../demos/toggle-series-visibility/client.ts | 7 + .../demos/toggle-series-visibility/index.ts | 6 + .../VeryBasicColorLegend.tsx | 7 +- .../demos/very-basic-color-legend/client.ts | 7 + .../demos/very-basic-color-legend/index.ts | 6 + .../VisibilityOnChange.tsx | 2 + .../demos/visibility-on-change/client.ts | 7 + .../demos/visibility-on-change/index.ts | 6 + docs/data/charts/legend/legend.md | 40 +- .../data/charts/line-demo/BiaxialLineChart.js | 32 - .../line-demo/BiaxialLineChart.tsx.preview | 11 - .../data/charts/line-demo/CustomLabelChart.js | 53 - .../line-demo/CustomLabelChart.tsx.preview | 9 - docs/data/charts/line-demo/CustomLineMarks.js | 41 - docs/data/charts/line-demo/DashedLineChart.js | 48 - .../line-demo/LargerHighlightLineNoSnap.js | 93 -- .../LargerHighlightLineNoSnap.tsx.preview | 11 - .../charts/line-demo/LineChartConnectNulls.js | 22 - .../LineChartConnectNulls.tsx.preview | 10 - .../line-demo/LineChartWithReferenceLines.js | 45 - .../line-demo/LineWithUncertaintyArea.js | 168 --- .../charts/line-demo/LiveLineChartNoSnap.js | 86 -- docs/data/charts/line-demo/SimpleLineChart.js | 31 - .../line-demo/SimpleLineChart.tsx.preview | 9 - docs/data/charts/line-demo/TinyLineChart.js | 41 - .../biaxial-line-chart}/BiaxialLineChart.tsx | 2 + .../demos/biaxial-line-chart/client.ts | 7 + .../demos/biaxial-line-chart/index.ts | 6 + .../custom-label-chart}/CustomLabelChart.tsx | 5 +- .../demos/custom-label-chart/client.ts | 7 + .../demos/custom-label-chart/index.ts | 6 + .../custom-line-marks}/CustomLineMarks.tsx | 2 + .../demos/custom-line-marks/client.ts | 7 + .../demos/custom-line-marks/index.ts | 6 + .../dashed-line-chart}/DashedLineChart.tsx | 2 + .../demos/dashed-line-chart/client.ts | 7 + .../demos/dashed-line-chart/index.ts | 6 + .../LargerHighlightLineNoSnap.tsx | 7 +- .../larger-highlight-line-no-snap/client.ts | 7 + .../larger-highlight-line-no-snap/index.ts | 6 + .../LineChartConnectNulls.tsx | 2 + .../demos/line-chart-connect-nulls/client.ts | 7 + .../demos/line-chart-connect-nulls/index.ts | 6 + .../LineChartWithReferenceLines.tsx | 2 + .../line-chart-with-reference-lines/client.ts | 7 + .../line-chart-with-reference-lines/index.ts | 6 + .../LineWithUncertaintyArea.tsx | 15 +- .../line-with-uncertainty-area/client.ts | 7 + .../demos/line-with-uncertainty-area/index.ts | 6 + .../LiveLineChartNoSnap.tsx | 2 + .../demos/live-line-chart-no-snap/client.ts | 7 + .../demos/live-line-chart-no-snap/index.ts | 6 + .../simple-line-chart}/SimpleLineChart.tsx | 2 + .../demos/simple-line-chart/client.ts | 7 + .../demos/simple-line-chart/index.ts | 6 + .../tiny-line-chart}/TinyLineChart.tsx | 2 + .../line-demo/demos/tiny-line-chart/client.ts | 7 + .../line-demo/demos/tiny-line-chart/index.ts | 6 + docs/data/charts/line-demo/line-demo.md | 22 +- docs/data/charts/lines/AreaBaseline.js | 17 - .../charts/lines/AreaBaseline.tsx.preview | 11 - docs/data/charts/lines/BasicArea.js | 16 - docs/data/charts/lines/BasicArea.tsx.preview | 10 - docs/data/charts/lines/BasicLineChart.js | 15 - .../charts/lines/BasicLineChart.tsx.preview | 9 - docs/data/charts/lines/CSSCustomization.js | 64 - docs/data/charts/lines/ColorScale.js | 166 --- docs/data/charts/lines/ColorScale.tsx | 175 --- docs/data/charts/lines/ConnectNulls.js | 38 - docs/data/charts/lines/DifferentLength.js | 24 - docs/data/charts/lines/ExpandingStep.js | 100 -- docs/data/charts/lines/GridDemo.js | 41 - docs/data/charts/lines/GridDemo.tsx | 38 - docs/data/charts/lines/GridDemo.tsx.preview | 8 - docs/data/charts/lines/InterpolationDemo.js | 62 - docs/data/charts/lines/LineAnimation.js | 88 -- docs/data/charts/lines/LineClick.js | 102 -- docs/data/charts/lines/LineDataset.js | 34 - .../data/charts/lines/LineDataset.tsx.preview | 14 - .../charts/lines/LineDefaultDomainLimit.js | 62 - docs/data/charts/lines/LineMarkShape.js | 78 -- docs/data/charts/lines/LineOverview.js | 188 --- .../charts/lines/LinePointerInteraction.js | 36 - .../lines/LinePointerInteraction.tsx.preview | 4 - docs/data/charts/lines/MarkOptimization.js | 16 - .../charts/lines/MarkOptimization.tsx.preview | 10 - docs/data/charts/lines/MarkSize.js | 82 -- docs/data/charts/lines/StackedAreas.js | 45 - docs/data/charts/lines/StyledLineChart.js | 62 - .../area-baseline}/AreaBaseline.tsx | 2 + .../lines/demos/area-baseline/client.ts | 7 + .../charts/lines/demos/area-baseline/index.ts | 6 + .../{ => demos/basic-area}/BasicArea.tsx | 2 + .../charts/lines/demos/basic-area/client.ts | 7 + .../charts/lines/demos/basic-area/index.ts | 6 + .../basic-line-chart}/BasicLineChart.tsx | 2 + .../lines/demos/basic-line-chart/client.ts | 7 + .../lines/demos/basic-line-chart/index.ts | 6 + .../lines/demos/color-scale/ColorScale.tsx | 177 +++ .../charts/lines/demos/color-scale/client.ts | 7 + .../charts/lines/demos/color-scale/index.ts | 6 + .../connect-nulls}/ConnectNulls.tsx | 2 + .../lines/demos/connect-nulls/client.ts | 7 + .../charts/lines/demos/connect-nulls/index.ts | 6 + .../css-customization}/CSSCustomization.tsx | 4 +- .../lines/demos/css-customization/client.ts | 7 + .../lines/demos/css-customization/index.ts | 6 + .../different-length}/DifferentLength.tsx | 2 + .../lines/demos/different-length/client.ts | 7 + .../lines/demos/different-length/index.ts | 6 + .../expanding-step}/ExpandingStep.tsx | 2 + .../lines/demos/expanding-step/client.ts | 7 + .../lines/demos/expanding-step/index.ts | 6 + .../charts/lines/demos/grid-demo/GridDemo.tsx | 40 + .../charts/lines/demos/grid-demo/client.ts | 7 + .../charts/lines/demos/grid-demo/index.ts | 6 + .../interpolation-demo}/InterpolationDemo.tsx | 4 +- .../lines/demos/interpolation-demo/client.ts | 7 + .../lines/demos/interpolation-demo/index.ts | 6 + .../line-animation}/LineAnimation.tsx | 2 + .../lines/demos/line-animation/client.ts | 7 + .../lines/demos/line-animation/index.ts | 6 + .../{ => demos/line-click}/LineClick.tsx | 4 +- .../charts/lines/demos/line-click/client.ts | 7 + .../charts/lines/demos/line-click/index.ts | 6 + .../{ => demos/line-dataset}/LineDataset.tsx | 4 +- .../charts/lines/demos/line-dataset/client.ts | 7 + .../charts/lines/demos/line-dataset/index.ts | 6 + .../LineDefaultDomainLimit.tsx | 4 +- .../demos/line-default-domain-limit/client.ts | 7 + .../demos/line-default-domain-limit/index.ts | 6 + .../line-mark-shape}/LineMarkShape.tsx | 4 +- .../lines/demos/line-mark-shape/client.ts | 7 + .../lines/demos/line-mark-shape/index.ts | 6 + .../line-overview}/LineOverview.tsx | 4 +- .../lines/demos/line-overview/client.ts | 7 + .../charts/lines/demos/line-overview/index.ts | 6 + .../LinePointerInteraction.tsx | 2 + .../demos/line-pointer-interaction/client.ts | 7 + .../demos/line-pointer-interaction/index.ts | 6 + .../mark-optimization}/MarkOptimization.tsx | 2 + .../lines/demos/mark-optimization/client.ts | 7 + .../lines/demos/mark-optimization/index.ts | 6 + .../lines/{ => demos/mark-size}/MarkSize.tsx | 2 + .../charts/lines/demos/mark-size/client.ts | 7 + .../charts/lines/demos/mark-size/index.ts | 6 + .../stacked-areas}/StackedAreas.tsx | 4 +- .../lines/demos/stacked-areas/client.ts | 7 + .../charts/lines/demos/stacked-areas/index.ts | 6 + .../styled-line-chart}/StyledLineChart.tsx | 2 + .../lines/demos/styled-line-chart/client.ts | 7 + .../lines/demos/styled-line-chart/index.ts | 6 + docs/data/charts/lines/lines.md | 42 +- .../ChartsLocalizationTableNoSnap.js | 6 - .../localization/CustomLocaleOverlay.js | 14 - .../CustomLocaleOverlay.tsx.preview | 8 - .../ChartsLocalizationTableNoSnap.tsx | 9 + .../client.ts | 7 + .../index.ts | 6 + .../CustomLocaleOverlay.tsx | 2 + .../demos/custom-locale-overlay/client.ts | 7 + .../demos/custom-locale-overlay/index.ts | 6 + docs/data/charts/localization/localization.md | 4 +- docs/data/charts/map/BasicGeoDataPlot.js | 59 - docs/data/charts/map/ColorScaleMapShape.js | 123 -- .../data/charts/map/CountryProjectionShape.js | 219 ---- docs/data/charts/map/ExportMap.js | 92 -- docs/data/charts/map/GeoDataPlotDemo.js | 58 - docs/data/charts/map/GeoFeatureKeyMapShape.js | 73 -- docs/data/charts/map/HighlightedMapShape.js | 133 -- docs/data/charts/map/MapShapeClick.js | 82 -- docs/data/charts/map/MapShapePlotDemo.js | 39 - docs/data/charts/map/MapZoomControl.js | 282 ---- docs/data/charts/map/MapZoomOptions.js | 235 ---- docs/data/charts/map/MarsMap.js | 147 --- docs/data/charts/map/ProjectionMapShape.js | 113 -- docs/data/charts/map/RemoveAntarctica.js | 117 -- docs/data/charts/map/TectonicPlates.js | 124 -- docs/data/charts/map/VisibleMapShape.js | 95 -- docs/data/charts/map/ZoomMap.tsx | 2 +- .../basic-geo-data-plot}/BasicGeoDataPlot.tsx | 6 +- .../map/demos/basic-geo-data-plot/client.ts | 7 + .../map/demos/basic-geo-data-plot/index.ts | 6 + .../ColorScaleMapShape.tsx | 8 +- .../map/demos/color-scale-map-shape/client.ts | 7 + .../map/demos/color-scale-map-shape/index.ts | 6 + .../CountryProjectionShape.tsx | 11 +- .../demos/country-projection-shape/client.ts | 7 + .../demos/country-projection-shape/index.ts | 6 + .../map/{ => demos/export-map}/ExportMap.tsx | 8 +- .../charts/map/demos/export-map/client.ts | 7 + .../data/charts/map/demos/export-map/index.ts | 6 + .../geo-data-plot-demo}/GeoDataPlotDemo.tsx | 4 +- .../map/demos/geo-data-plot-demo/client.ts | 7 + .../map/demos/geo-data-plot-demo/index.ts | 6 + .../GeoFeatureKeyMapShape.tsx | 6 +- .../demos/geo-feature-key-map-shape/client.ts | 7 + .../demos/geo-feature-key-map-shape/index.ts | 6 + .../HighlightedMapShape.tsx | 6 +- .../map/demos/highlighted-map-shape/client.ts | 7 + .../map/demos/highlighted-map-shape/index.ts | 6 + .../map-shape-click}/MapShapeClick.tsx | 8 +- .../map/demos/map-shape-click/client.ts | 7 + .../charts/map/demos/map-shape-click/index.ts | 6 + .../map-shape-plot-demo}/MapShapePlotDemo.tsx | 6 +- .../map/demos/map-shape-plot-demo/client.ts | 7 + .../map/demos/map-shape-plot-demo/index.ts | 6 + .../map-zoom-control}/MapZoomControl.tsx | 17 +- .../map/demos/map-zoom-control/client.ts | 7 + .../map/demos/map-zoom-control/index.ts | 6 + .../map-zoom-options}/MapZoomOptions.tsx | 11 +- .../map/demos/map-zoom-options/client.ts | 7 + .../map/demos/map-zoom-options/index.ts | 6 + .../map/{ => demos/mars-map}/MarsMap.tsx | 6 +- docs/data/charts/map/demos/mars-map/client.ts | 7 + docs/data/charts/map/demos/mars-map/index.ts | 6 + .../ProjectionMapShape.tsx | 11 +- .../map/demos/projection-map-shape/client.ts | 7 + .../map/demos/projection-map-shape/index.ts | 6 + .../remove-antarctica}/RemoveAntarctica.tsx | 10 +- .../map/demos/remove-antarctica/client.ts | 7 + .../map/demos/remove-antarctica/index.ts | 6 + .../tectonic-plates}/TectonicPlates.tsx | 17 +- .../map/demos/tectonic-plates/client.ts | 7 + .../charts/map/demos/tectonic-plates/index.ts | 6 + .../visible-map-shape}/VisibleMapShape.tsx | 6 +- .../map/demos/visible-map-shape/client.ts | 7 + .../map/demos/visible-map-shape/index.ts | 6 + docs/data/charts/map/map.md | 32 +- docs/data/charts/map/marsRegions.ts | 2 +- docs/data/charts/performance/BarSampling.js | 44 - docs/data/charts/performance/LineSampling.js | 57 - .../charts/performance/LineSamplingNulls.js | 54 - .../performance/SamplingMethodComparison.js | 61 - .../{ => demos/bar-sampling}/BarSampling.tsx | 4 +- .../performance/demos/bar-sampling/client.ts | 7 + .../performance/demos/bar-sampling/index.ts | 6 + .../LineSamplingNulls.tsx | 4 +- .../demos/line-sampling-nulls/client.ts | 7 + .../demos/line-sampling-nulls/index.ts | 6 + .../line-sampling}/LineSampling.tsx | 4 +- .../performance/demos/line-sampling/client.ts | 7 + .../performance/demos/line-sampling/index.ts | 6 + .../SamplingMethodComparison.tsx | 4 +- .../sampling-method-comparison/client.ts | 7 + .../demos/sampling-method-comparison/index.ts | 6 + docs/data/charts/performance/performance.md | 8 +- .../pie-demo/PieChartWithCenterLabel.js | 40 - .../PieChartWithCenterLabel.tsx.preview | 3 - .../PieChartWithCustomLegendAndTooltip.js | 44 - .../pie-demo/PieChartWithCustomizedLabel.js | 42 - .../PieChartWithCustomizedLabel.tsx.preview | 16 - .../pie-demo/PieChartWithPaddingAngle.js | 40 - .../charts/pie-demo/StraightAnglePieChart.js | 26 - .../StraightAnglePieChart.tsx.preview | 11 - docs/data/charts/pie-demo/TwoLevelPieChart.js | 45 - .../pie-demo/TwoLevelPieChart.tsx.preview | 15 - .../PieChartWithCenterLabel.tsx | 2 + .../pie-chart-with-center-label/client.ts | 7 + .../pie-chart-with-center-label/index.ts | 6 + .../PieChartWithCustomLegendAndTooltip.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../PieChartWithCustomizedLabel.tsx | 4 +- .../pie-chart-with-customized-label/client.ts | 7 + .../pie-chart-with-customized-label/index.ts | 6 + .../PieChartWithPaddingAngle.tsx | 2 + .../pie-chart-with-padding-angle/client.ts | 7 + .../pie-chart-with-padding-angle/index.ts | 6 + .../StraightAnglePieChart.tsx | 2 + .../demos/straight-angle-pie-chart/client.ts | 7 + .../demos/straight-angle-pie-chart/index.ts | 6 + .../two-level-pie-chart}/TwoLevelPieChart.tsx | 2 + .../demos/two-level-pie-chart/client.ts | 7 + .../demos/two-level-pie-chart/index.ts | 6 + docs/data/charts/pie-demo/pie-demo.md | 12 +- docs/data/charts/pie/BasicPie.js | 19 - docs/data/charts/pie/BasicPie.tsx.preview | 13 - docs/data/charts/pie/DonutChart.js | 24 - docs/data/charts/pie/DonutChart.tsx.preview | 4 - docs/data/charts/pie/PieActiveArc.js | 19 - docs/data/charts/pie/PieActiveArc.tsx.preview | 12 - docs/data/charts/pie/PieAnimation.js | 76 -- docs/data/charts/pie/PieArcLabel.js | 33 - docs/data/charts/pie/PieArcLabel.tsx.preview | 16 - docs/data/charts/pie/PieCSSStyling.js | 59 - .../data/charts/pie/PieCSSStyling.tsx.preview | 8 - docs/data/charts/pie/PieClick.js | 75 -- docs/data/charts/pie/PieColor.js | 59 - docs/data/charts/pie/PieShape.js | 54 - docs/data/charts/pie/TitanicPie.js | 252 ---- .../pie/{ => demos/basic-pie}/BasicPie.tsx | 2 + .../data/charts/pie/demos/basic-pie/client.ts | 7 + docs/data/charts/pie/demos/basic-pie/index.ts | 6 + .../{ => demos/donut-chart}/DonutChart.tsx | 2 + .../charts/pie/demos/donut-chart/client.ts | 7 + .../charts/pie/demos/donut-chart/index.ts | 6 + .../pie-active-arc}/PieActiveArc.tsx | 4 +- .../charts/pie/demos/pie-active-arc/client.ts | 7 + .../charts/pie/demos/pie-active-arc/index.ts | 6 + .../pie-animation}/PieAnimation.tsx | 4 +- .../charts/pie/demos/pie-animation/client.ts | 7 + .../charts/pie/demos/pie-animation/index.ts | 6 + .../{ => demos/pie-arc-label}/PieArcLabel.tsx | 4 +- .../charts/pie/demos/pie-arc-label/client.ts | 7 + .../charts/pie/demos/pie-arc-label/index.ts | 6 + .../pie/{ => demos/pie-click}/PieClick.tsx | 6 +- .../data/charts/pie/demos/pie-click/client.ts | 7 + docs/data/charts/pie/demos/pie-click/index.ts | 6 + .../pie/{ => demos/pie-color}/PieColor.tsx | 4 +- .../data/charts/pie/demos/pie-color/client.ts | 7 + docs/data/charts/pie/demos/pie-color/index.ts | 6 + .../pie-css-styling}/PieCSSStyling.tsx | 5 +- .../pie/demos/pie-css-styling/client.ts | 7 + .../charts/pie/demos/pie-css-styling/index.ts | 6 + .../pie/{ => demos/pie-shape}/PieShape.tsx | 4 +- .../data/charts/pie/demos/pie-shape/client.ts | 7 + docs/data/charts/pie/demos/pie-shape/index.ts | 6 + .../{ => demos/titanic-pie}/TitanicPie.tsx | 2 + .../charts/pie/demos/titanic-pie/client.ts | 7 + .../charts/pie/demos/titanic-pie/index.ts | 6 + docs/data/charts/pie/pie.md | 20 +- docs/data/charts/pyramid/Pyramid.js | 18 - docs/data/charts/pyramid/Pyramid.tsx.preview | 9 - docs/data/charts/pyramid/PyramidDirection.js | 46 - docs/data/charts/pyramid/PyramidPlayground.js | 75 -- .../charts/pyramid/PyramidSegmentLinear.js | 27 - .../pyramid/PyramidSegmentLinear.tsx.preview | 16 - .../pyramid-direction}/PyramidDirection.tsx | 4 +- .../pyramid/demos/pyramid-direction/client.ts | 7 + .../pyramid/demos/pyramid-direction/index.ts | 6 + .../pyramid-playground}/PyramidPlayground.tsx | 4 +- .../demos/pyramid-playground/client.ts | 7 + .../pyramid/demos/pyramid-playground/index.ts | 6 + .../PyramidSegmentLinear.tsx | 2 + .../demos/pyramid-segment-linear/client.ts | 7 + .../demos/pyramid-segment-linear/index.ts | 6 + .../pyramid/{ => demos/pyramid}/Pyramid.tsx | 2 + .../charts/pyramid/demos/pyramid/client.ts | 7 + .../charts/pyramid/demos/pyramid/index.ts | 6 + docs/data/charts/pyramid/pyramid.md | 8 +- docs/data/charts/quickstart/Combining.js | 91 -- docs/data/charts/quickstart/SimpleCharts.js | 21 - .../quickstart/SimpleCharts.tsx.preview | 15 - .../{ => demos/combining}/Combining.tsx | 6 +- .../quickstart/demos/combining/client.ts | 7 + .../quickstart/demos/combining/index.ts | 6 + .../simple-charts}/SimpleCharts.tsx | 2 + .../quickstart/demos/simple-charts/client.ts | 7 + .../quickstart/demos/simple-charts/index.ts | 6 + docs/data/charts/quickstart/quickstart.md | 4 +- docs/data/charts/radar/BasicRadar.js | 14 - docs/data/charts/radar/BasicRadar.tsx.preview | 8 - docs/data/charts/radar/CompositionExample.js | 60 - docs/data/charts/radar/CompositionExample.tsx | 59 - docs/data/charts/radar/DemoRadar.js | 105 -- docs/data/charts/radar/DemoRadarAxis.js | 103 -- .../charts/radar/DemoRadarAxisHighlight.js | 56 - .../charts/radar/DemoRadarSeriesHighlight.js | 102 -- .../charts/radar/DemoRadarVisualisation.js | 66 - docs/data/charts/radar/MultiSeriesRadar.js | 34 - docs/data/charts/radar/RadarAxis.js | 20 - docs/data/charts/radar/RadarAxis.tsx.preview | 14 - docs/data/charts/radar/RadarClick.js | 119 -- docs/data/charts/radar/RadarTooltip.js | 59 - .../charts/radar/RadarTooltip.tsx.preview | 15 - .../{ => demos/basic-radar}/BasicRadar.tsx | 2 + .../charts/radar/demos/basic-radar/client.ts | 7 + .../charts/radar/demos/basic-radar/index.ts | 6 + .../CompositionExample.tsx | 61 + .../radar/demos/composition-example/client.ts | 7 + .../radar/demos/composition-example/index.ts | 6 + .../DemoRadarAxisHighlight.tsx | 5 +- .../demos/demo-radar-axis-highlight/client.ts | 7 + .../demos/demo-radar-axis-highlight/index.ts | 6 + .../demo-radar-axis}/DemoRadarAxis.tsx | 2 + .../radar/demos/demo-radar-axis/client.ts | 7 + .../radar/demos/demo-radar-axis/index.ts | 6 + .../DemoRadarSeriesHighlight.tsx | 7 +- .../demo-radar-series-highlight/client.ts | 7 + .../demo-radar-series-highlight/index.ts | 6 + .../DemoRadarVisualisation.tsx | 5 +- .../demos/demo-radar-visualisation/client.ts | 7 + .../demos/demo-radar-visualisation/index.ts | 6 + .../{ => demos/demo-radar}/DemoRadar.tsx | 2 + .../charts/radar/demos/demo-radar/client.ts | 7 + .../charts/radar/demos/demo-radar/index.ts | 6 + .../multi-series-radar}/MultiSeriesRadar.tsx | 2 + .../radar/demos/multi-series-radar/client.ts | 7 + .../radar/demos/multi-series-radar/index.ts | 6 + .../{ => demos/radar-axis}/RadarAxis.tsx | 2 + .../charts/radar/demos/radar-axis/client.ts | 7 + .../charts/radar/demos/radar-axis/index.ts | 6 + .../{ => demos/radar-click}/RadarClick.tsx | 4 +- .../charts/radar/demos/radar-click/client.ts | 7 + .../charts/radar/demos/radar-click/index.ts | 6 + .../radar-tooltip}/RadarTooltip.tsx | 2 + .../radar/demos/radar-tooltip/client.ts | 7 + .../charts/radar/demos/radar-tooltip/index.ts | 6 + docs/data/charts/radar/radar.md | 22 +- docs/data/charts/radial-axes/BandHighlight.js | 111 -- .../data/charts/radial-axes/BandHighlight.tsx | 125 -- .../radial-axes/RadialGridPlayground.js | 81 -- .../radial-axes/RadiusAxisPercentage.js | 55 - .../RadiusAxisPercentage.tsx.preview | 12 - .../radial-axes/RadiusAxisPlayground.js | 124 -- .../radial-axes/RotationAxisPlayground.js | 123 -- .../demos/band-highlight/BandHighlight.tsx | 127 ++ .../demos/band-highlight/client.ts | 7 + .../radial-axes/demos/band-highlight/index.ts | 6 + .../RadialGridPlayground.tsx | 2 + .../demos/radial-grid-playground/client.ts | 7 + .../demos/radial-grid-playground/index.ts | 6 + .../RadiusAxisPercentage.tsx | 2 + .../demos/radius-axis-percentage/client.ts | 7 + .../demos/radius-axis-percentage/index.ts | 6 + .../RadiusAxisPlayground.tsx | 2 + .../demos/radius-axis-playground/client.ts | 7 + .../demos/radius-axis-playground/index.ts | 6 + .../RotationAxisPlayground.tsx | 2 + .../demos/rotation-axis-playground/client.ts | 7 + .../demos/rotation-axis-playground/index.ts | 6 + docs/data/charts/radial-axes/radial-axes.md | 10 +- .../charts/radial-bars/BasicRadialBarChart.js | 49 - .../radial-bars/HealthRadialBarChart.js | 63 - .../data/charts/radial-bars/RadialBarClick.js | 133 -- .../charts/radial-bars/RadialBarConfig.js | 125 -- .../charts/radial-bars/TrustRadialBarChart.js | 93 -- .../BasicRadialBarChart.tsx | 2 + .../demos/basic-radial-bar-chart/client.ts | 7 + .../demos/basic-radial-bar-chart/index.ts | 6 + .../HealthRadialBarChart.tsx | 2 + .../demos/health-radial-bar-chart/client.ts | 7 + .../demos/health-radial-bar-chart/index.ts | 6 + .../radial-bar-click}/RadialBarClick.tsx | 12 +- .../demos/radial-bar-click/client.ts | 7 + .../demos/radial-bar-click/index.ts | 6 + .../radial-bar-config}/RadialBarConfig.tsx | 4 +- .../demos/radial-bar-config/client.ts | 7 + .../demos/radial-bar-config/index.ts | 6 + .../TrustRadialBarChart.tsx | 6 +- .../demos/trust-radial-bar-chart/client.ts | 7 + .../demos/trust-radial-bar-chart/index.ts | 6 + docs/data/charts/radial-bars/radial-bars.md | 10 +- .../radial-lines/BasicRadialLineChart.js | 23 - .../BasicRadialLineChart.tsx.preview | 15 - .../radial-lines/ClosedOpenRadialLineChart.js | 61 - .../radial-lines/ContinuousRadialLineChart.js | 36 - .../charts/radial-lines/ElementHighlights.js | 103 -- .../charts/radial-lines/ElementHighlights.tsx | 106 -- .../charts/radial-lines/RadialLineClick.js | 103 -- .../radial-lines/RadialLineMarkShape.js | 55 - .../BasicRadialLineChart.tsx | 4 +- .../demos/basic-radial-line-chart/client.ts | 7 + .../demos/basic-radial-line-chart/index.ts | 6 + .../ClosedOpenRadialLineChart.tsx | 2 + .../closed-open-radial-line-chart/client.ts | 7 + .../closed-open-radial-line-chart/index.ts | 6 + .../ContinuousRadialLineChart.tsx | 2 + .../continuous-radial-line-chart/client.ts | 7 + .../continuous-radial-line-chart/index.ts | 6 + .../element-highlights/ElementHighlights.tsx | 108 ++ .../demos/element-highlights/client.ts | 7 + .../demos/element-highlights/index.ts | 6 + .../radial-line-click}/RadialLineClick.tsx | 12 +- .../demos/radial-line-click/client.ts | 7 + .../demos/radial-line-click/index.ts | 6 + .../RadialLineMarkShape.tsx | 4 +- .../demos/radial-line-mark-shape/client.ts | 7 + .../demos/radial-line-mark-shape/index.ts | 6 + docs/data/charts/radial-lines/radial-lines.md | 12 +- docs/data/charts/range-bar/BasicRangeBar.js | 48 - .../charts/range-bar/RangeBarAnimation.js | 328 ----- .../charts/range-bar/RangeBarBorderRadius.js | 106 -- docs/data/charts/range-bar/RangeBarClick.js | 99 -- .../charts/range-bar/RangeBarColorScale.js | 131 -- .../data/charts/range-bar/RangeBarGradient.js | 67 - .../range-bar/RangeBarGradient.tsx.preview | 12 - .../range-bar/RangeBarProjectSchedule.js | 353 ----- docs/data/charts/range-bar/WebGLRangeBars.js | 71 - .../basic-range-bar}/BasicRangeBar.tsx | 6 +- .../range-bar/demos/basic-range-bar/client.ts | 7 + .../range-bar/demos/basic-range-bar/index.ts | 6 + .../RangeBarAnimation.tsx | 12 +- .../demos/range-bar-animation/client.ts | 7 + .../demos/range-bar-animation/index.ts | 6 + .../RangeBarBorderRadius.tsx | 8 +- .../demos/range-bar-border-radius/client.ts | 7 + .../demos/range-bar-border-radius/index.ts | 6 + .../range-bar-click}/RangeBarClick.tsx | 12 +- .../range-bar/demos/range-bar-click/client.ts | 7 + .../range-bar/demos/range-bar-click/index.ts | 6 + .../RangeBarColorScale.tsx | 8 +- .../demos/range-bar-color-scale/client.ts | 7 + .../demos/range-bar-color-scale/index.ts | 6 + .../range-bar-gradient}/RangeBarGradient.tsx | 4 +- .../demos/range-bar-gradient/client.ts | 7 + .../demos/range-bar-gradient/index.ts | 6 + .../RangeBarProjectSchedule.tsx | 10 +- .../range-bar-project-schedule/client.ts | 7 + .../demos/range-bar-project-schedule/index.ts | 6 + .../web-gl-range-bars}/WebGLRangeBars.tsx | 2 + .../demos/web-gl-range-bars/client.ts | 7 + .../demos/web-gl-range-bars/index.ts | 6 + docs/data/charts/range-bar/range-bar.md | 16 +- .../charts/references/ReferenceAreaBasic.js | 100 -- .../charts/references/ReferenceLineBasic.js | 20 - .../references/ReferenceLineBasic.tsx.preview | 4 - .../charts/references/ReferenceLineLabel.js | 28 - .../references/ReferenceLineLabel.tsx.preview | 12 - .../charts/references/ReferenceLineStyled.js | 41 - .../ReferenceLineStyled.tsx.preview | 15 - .../charts/references/ReferenceOverview.js | 205 --- .../charts/references/ReferencePointBasic.js | 45 - .../ReferencePointBasic.tsx.preview | 11 - .../ReferenceAreaBasic.tsx | 4 +- .../demos/reference-area-basic/client.ts | 7 + .../demos/reference-area-basic/index.ts | 6 + .../ReferenceLineBasic.tsx | 5 +- .../demos/reference-line-basic/client.ts | 7 + .../demos/reference-line-basic/index.ts | 6 + .../ReferenceLineLabel.tsx | 5 +- .../demos/reference-line-label/client.ts | 7 + .../demos/reference-line-label/index.ts | 6 + .../ReferenceLineStyled.tsx | 5 +- .../demos/reference-line-styled/client.ts | 7 + .../demos/reference-line-styled/index.ts | 6 + .../reference-overview}/ReferenceOverview.tsx | 8 +- .../demos/reference-overview/client.ts | 7 + .../demos/reference-overview/index.ts | 6 + .../ReferencePointBasic.tsx | 5 +- .../demos/reference-point-basic/client.ts | 7 + .../demos/reference-point-basic/index.ts | 6 + docs/data/charts/references/references.md | 12 +- .../charts/sankey/CustomNodeLabelPlot.tsx | 4 +- .../charts/sankey/SankeyBasicDataStructure.js | 19 - .../SankeyBasicDataStructure.tsx.preview | 13 - docs/data/charts/sankey/SankeyClick.js | 111 -- .../sankey/SankeyControlledHighlight.js | 118 -- .../charts/sankey/SankeyCurveCorrection.js | 64 - .../sankey/SankeyCurveCorrection.tsx.preview | 13 - .../sankey/SankeyDetailedDataStructure.js | 25 - .../SankeyDetailedDataStructure.tsx.preview | 19 - docs/data/charts/sankey/SankeyHighlighting.js | 109 -- docs/data/charts/sankey/SankeyIterations.js | 69 - .../charts/sankey/SankeyLinkKeywordColors.js | 69 - docs/data/charts/sankey/SankeyLinkSorting.js | 72 -- docs/data/charts/sankey/SankeyLinkStyling.js | 75 -- .../data/charts/sankey/SankeyNodeAlignment.js | 88 -- docs/data/charts/sankey/SankeyNodeSorting.js | 84 -- docs/data/charts/sankey/SankeyNodeStyling.js | 79 -- docs/data/charts/sankey/SankeyOverview.js | 144 --- .../charts/sankey/SankeyValueFormatter.js | 53 - .../SankeyBasicDataStructure.tsx | 2 + .../sankey-basic-data-structure/client.ts | 7 + .../sankey-basic-data-structure/index.ts | 6 + .../{ => demos/sankey-click}/SankeyClick.tsx | 5 +- .../sankey/demos/sankey-click/client.ts | 7 + .../charts/sankey/demos/sankey-click/index.ts | 6 + .../SankeyControlledHighlight.tsx | 4 +- .../sankey-controlled-highlight/client.ts | 7 + .../sankey-controlled-highlight/index.ts | 6 + .../SankeyCurveCorrection.tsx | 2 + .../demos/sankey-curve-correction/client.ts | 7 + .../demos/sankey-curve-correction/index.ts | 6 + .../SankeyDetailedDataStructure.tsx | 2 + .../sankey-detailed-data-structure/client.ts | 7 + .../sankey-detailed-data-structure/index.ts | 6 + .../SankeyHighlighting.tsx | 2 + .../demos/sankey-highlighting/client.ts | 7 + .../sankey/demos/sankey-highlighting/index.ts | 6 + .../sankey-iterations}/SankeyIterations.tsx | 2 + .../sankey/demos/sankey-iterations/client.ts | 7 + .../sankey/demos/sankey-iterations/index.ts | 6 + .../SankeyLinkKeywordColors.tsx | 2 + .../sankey-link-keyword-colors/client.ts | 7 + .../demos/sankey-link-keyword-colors/index.ts | 6 + .../SankeyLinkSorting.tsx | 2 + .../demos/sankey-link-sorting/client.ts | 7 + .../sankey/demos/sankey-link-sorting/index.ts | 6 + .../SankeyLinkStyling.tsx | 2 + .../demos/sankey-link-styling/client.ts | 7 + .../sankey/demos/sankey-link-styling/index.ts | 6 + .../SankeyNodeAlignment.tsx | 2 + .../demos/sankey-node-alignment/client.ts | 7 + .../demos/sankey-node-alignment/index.ts | 6 + .../SankeyNodeSorting.tsx | 2 + .../demos/sankey-node-sorting/client.ts | 7 + .../sankey/demos/sankey-node-sorting/index.ts | 6 + .../SankeyNodeStyling.tsx | 2 + .../demos/sankey-node-styling/client.ts | 7 + .../sankey/demos/sankey-node-styling/index.ts | 6 + .../sankey-overview}/SankeyOverview.tsx | 4 +- .../sankey/demos/sankey-overview/client.ts | 7 + .../sankey/demos/sankey-overview/index.ts | 6 + .../SankeyValueFormatter.tsx | 8 +- .../demos/sankey-value-formatter/client.ts | 7 + .../demos/sankey-value-formatter/index.ts | 6 + docs/data/charts/sankey/sankey.md | 30 +- .../scatter-demo/MultipleYAxesScatterChart.js | 63 - .../charts/scatter-demo/SimpleScatterChart.js | 22 - .../SimpleScatterChart.tsx.preview | 4 - .../MultipleYAxesScatterChart.tsx | 2 + .../multiple-y-axes-scatter-chart/client.ts | 7 + .../multiple-y-axes-scatter-chart/index.ts | 6 + .../SimpleScatterChart.tsx | 2 + .../demos/simple-scatter-chart/client.ts | 7 + .../demos/simple-scatter-chart/index.ts | 6 + docs/data/charts/scatter-demo/scatter-demo.md | 4 +- docs/data/charts/scatter/BasicScatter.js | 20 - .../charts/scatter/BasicScatter.tsx.preview | 13 - .../charts/scatter/ClosestPointInteraction.js | 90 -- docs/data/charts/scatter/CustomScatter.js | 59 - .../charts/scatter/CustomScatter.tsx.preview | 4 - docs/data/charts/scatter/GridDemo.js | 21 - docs/data/charts/scatter/GridDemo.tsx | 21 - docs/data/charts/scatter/GridDemo.tsx.preview | 14 - .../charts/scatter/ScatterAsyncRenderer.js | 251 ---- .../charts/scatter/ScatterBatchRenderer.js | 124 -- .../scatter/ScatterBatchRenderer.tsx.preview | 5 - .../charts/scatter/ScatterCSSSelectors.js | 36 - .../scatter/ScatterCSSSelectors.tsx.preview | 14 - docs/data/charts/scatter/ScatterClick.js | 135 -- .../data/charts/scatter/ScatterCustomShape.js | 80 -- docs/data/charts/scatter/ScatterCustomSize.js | 22 - .../scatter/ScatterCustomSize.tsx.preview | 15 - docs/data/charts/scatter/ScatterDataset.js | 77 -- .../charts/scatter/ScatterDataset.tsx.preview | 8 - docs/data/charts/scatter/ScatterOverview.js | 106 -- .../scatter/ScatterOverview.tsx.preview | 9 - .../charts/scatter/ScatterRegressionLine.js | 109 -- .../charts/scatter/ScatterWebGLRenderer.js | 65 - .../scatter/ScatterWebGLRenderer.tsx.preview | 12 - .../basic-scatter}/BasicScatter.tsx | 4 +- .../scatter/demos/basic-scatter/client.ts | 7 + .../scatter/demos/basic-scatter/index.ts | 6 + .../ClosestPointInteraction.tsx | 4 +- .../demos/closest-point-interaction/client.ts | 7 + .../demos/closest-point-interaction/index.ts | 6 + .../custom-scatter}/CustomScatter.tsx | 2 + .../scatter/demos/custom-scatter/client.ts | 7 + .../scatter/demos/custom-scatter/index.ts | 6 + .../scatter/demos/grid-demo/GridDemo.tsx | 23 + .../charts/scatter/demos/grid-demo/client.ts | 7 + .../charts/scatter/demos/grid-demo/index.ts | 6 + .../ScatterAsyncRenderer.tsx | 2 + .../demos/scatter-async-renderer/client.ts | 7 + .../demos/scatter-async-renderer/index.ts | 6 + .../ScatterBatchRenderer.tsx | 11 +- .../demos/scatter-batch-renderer/client.ts | 7 + .../demos/scatter-batch-renderer/index.ts | 6 + .../scatter-click}/ScatterClick.tsx | 4 +- .../scatter/demos/scatter-click/client.ts | 7 + .../scatter/demos/scatter-click/index.ts | 6 + .../ScatterCSSSelectors.tsx | 7 +- .../demos/scatter-css-selectors/client.ts | 7 + .../demos/scatter-css-selectors/index.ts | 6 + .../ScatterCustomShape.tsx | 9 +- .../demos/scatter-custom-shape/client.ts | 7 + .../demos/scatter-custom-shape/index.ts | 6 + .../ScatterCustomSize.tsx | 4 +- .../demos/scatter-custom-size/client.ts | 7 + .../demos/scatter-custom-size/index.ts | 6 + .../scatter-dataset}/ScatterDataset.tsx | 2 + .../scatter/demos/scatter-dataset/client.ts | 7 + .../scatter/demos/scatter-dataset/index.ts | 6 + .../scatter-overview}/ScatterOverview.tsx | 7 +- .../scatter/demos/scatter-overview/client.ts | 7 + .../scatter/demos/scatter-overview/index.ts | 6 + .../ScatterRegressionLine.tsx | 4 +- .../demos/scatter-regression-line/client.ts | 7 + .../demos/scatter-regression-line/index.ts | 6 + .../ScatterWebGLRenderer.tsx | 2 + .../demos/scatter-web-gl-renderer/client.ts | 7 + .../demos/scatter-web-gl-renderer/index.ts | 6 + docs/data/charts/scatter/scatter.md | 30 +- docs/data/charts/sparkline/AreaSparkLine.js | 21 - .../sparkline/AreaSparkLine.tsx.preview | 11 - docs/data/charts/sparkline/BasicSparkLine.js | 31 - .../sparkline/BasicSparkLine.tsx.preview | 10 - .../sparkline/BasicSparkLineCustomization.js | 69 - .../charts/sparkline/ColorCustomization.js | 17 - .../sparkline/ColorCustomization.tsx.preview | 1 - .../sparkline/ColorCustomizationMode.js | 50 - .../ColorCustomizationMode.tsx.preview | 7 - docs/data/charts/sparkline/CustomAxis.js | 55 - .../charts/sparkline/CustomDomainYAxis.js | 88 -- .../charts/sparkline/CustomDomainYAxis.tsx | 93 -- docs/data/charts/sparkline/CustomYAxis.js | 53 - docs/data/charts/sparkline/NpmSparkLine.js | 136 -- .../charts/sparkline/SparklineLineWidth.js | 89 -- .../area-spark-line}/AreaSparkLine.tsx | 2 + .../sparkline/demos/area-spark-line/client.ts | 7 + .../sparkline/demos/area-spark-line/index.ts | 6 + .../BasicSparkLineCustomization.tsx | 2 + .../basic-spark-line-customization/client.ts | 7 + .../basic-spark-line-customization/index.ts | 6 + .../basic-spark-line}/BasicSparkLine.tsx | 2 + .../demos/basic-spark-line/client.ts | 7 + .../sparkline/demos/basic-spark-line/index.ts | 6 + .../ColorCustomizationMode.tsx | 2 + .../demos/color-customization-mode/client.ts | 7 + .../demos/color-customization-mode/index.ts | 6 + .../ColorCustomization.tsx | 1 + .../demos/color-customization/client.ts | 7 + .../demos/color-customization/index.ts | 6 + .../{ => demos/custom-axis}/CustomAxis.tsx | 2 + .../sparkline/demos/custom-axis/client.ts | 7 + .../sparkline/demos/custom-axis/index.ts | 6 + .../CustomDomainYAxis.tsx | 95 ++ .../demos/custom-domain-y-axis/client.ts | 7 + .../demos/custom-domain-y-axis/index.ts | 6 + .../{ => demos/custom-y-axis}/CustomYAxis.tsx | 2 + .../sparkline/demos/custom-y-axis/client.ts | 7 + .../sparkline/demos/custom-y-axis/index.ts | 6 + .../npm-spark-line}/NpmSparkLine.tsx | 7 +- .../sparkline/demos/npm-spark-line/client.ts | 7 + .../sparkline/demos/npm-spark-line/index.ts | 6 + .../SparklineLineWidth.tsx | 5 +- .../demos/sparkline-line-width/client.ts | 7 + .../demos/sparkline-line-width/index.ts | 6 + docs/data/charts/sparkline/sparkline.md | 20 +- docs/data/charts/stacking/BasicStacking.js | 26 - .../charts/stacking/BasicStacking.tsx.preview | 8 - docs/data/charts/stacking/StackOffsetDemo.js | 68 - docs/data/charts/stacking/StackOrderDemo.js | 127 -- .../basic-stacking}/BasicStacking.tsx | 2 + .../stacking/demos/basic-stacking/client.ts | 7 + .../stacking/demos/basic-stacking/index.ts | 6 + .../stack-offset-demo}/StackOffsetDemo.tsx | 4 +- .../demos/stack-offset-demo/client.ts | 7 + .../stacking/demos/stack-offset-demo/index.ts | 6 + .../stack-order-demo}/StackOrderDemo.tsx | 4 +- .../stacking/demos/stack-order-demo/client.ts | 7 + .../stacking/demos/stack-order-demo/index.ts | 6 + docs/data/charts/stacking/stacking.md | 6 +- docs/data/charts/styling/BackgroundStyling.js | 67 - .../styling/BackgroundStyling.tsx.preview | 13 - docs/data/charts/styling/BasicColor.js | 58 - docs/data/charts/styling/ColorCallback.js | 89 -- .../charts/styling/ColorCallback.tsx.preview | 5 - docs/data/charts/styling/ColorTemplate.js | 215 ---- docs/data/charts/styling/CustomOverlay.js | 70 - .../charts/styling/CustomOverlay.tsx.preview | 12 - docs/data/charts/styling/GradientTooltip.js | 41 - docs/data/charts/styling/Margin.js | 190 --- docs/data/charts/styling/MuiColorTemplate.js | 208 --- docs/data/charts/styling/Overlay.js | 16 - docs/data/charts/styling/Overlay.tsx.preview | 2 - docs/data/charts/styling/OverlayWithAxis.js | 36 - docs/data/charts/styling/SxStyling.js | 53 - docs/data/charts/styling/TextStyling.js | 63 - .../background-styling}/BackgroundStyling.tsx | 6 +- .../demos/background-styling/client.ts | 7 + .../styling/demos/background-styling/index.ts | 6 + .../{ => demos/basic-color}/BasicColor.tsx | 2 + .../styling/demos/basic-color/client.ts | 7 + .../charts/styling/demos/basic-color/index.ts | 6 + .../color-callback}/ColorCallback.tsx | 5 +- .../styling/demos/color-callback/client.ts | 7 + .../styling/demos/color-callback/index.ts | 6 + .../color-template}/ColorTemplate.tsx | 7 +- .../styling/demos/color-template/client.ts | 7 + .../styling/demos/color-template/index.ts | 6 + .../custom-overlay}/CustomOverlay.tsx | 2 + .../styling/demos/custom-overlay/client.ts | 7 + .../styling/demos/custom-overlay/index.ts | 6 + .../gradient-tooltip}/GradientTooltip.tsx | 2 + .../styling/demos/gradient-tooltip/client.ts | 7 + .../styling/demos/gradient-tooltip/index.ts | 6 + .../styling/{ => demos/margin}/Margin.tsx | 2 + .../charts/styling/demos/margin/client.ts | 7 + .../data/charts/styling/demos/margin/index.ts | 6 + .../mui-color-template}/MuiColorTemplate.tsx | 7 +- .../demos/mui-color-template/client.ts | 7 + .../styling/demos/mui-color-template/index.ts | 6 + .../overlay-with-axis}/OverlayWithAxis.tsx | 2 + .../styling/demos/overlay-with-axis/client.ts | 7 + .../styling/demos/overlay-with-axis/index.ts | 6 + .../styling/{ => demos/overlay}/Overlay.tsx | 2 + .../charts/styling/demos/overlay/client.ts | 7 + .../charts/styling/demos/overlay/index.ts | 6 + .../{ => demos/sx-styling}/SxStyling.tsx | 2 + .../charts/styling/demos/sx-styling/client.ts | 7 + .../charts/styling/demos/sx-styling/index.ts | 6 + .../{ => demos/text-styling}/TextStyling.tsx | 2 + .../styling/demos/text-styling/client.ts | 7 + .../styling/demos/text-styling/index.ts | 6 + docs/data/charts/styling/styling.md | 24 +- docs/data/charts/toolbar/ChartsToolbar.js | 25 - .../charts/toolbar/ChartsToolbar.tsx.preview | 7 - .../toolbar/ChartsToolbarCustomElements.js | 43 - .../ChartsToolbarCustomElements.tsx.preview | 14 - .../ChartsToolbarCustomRangeButtons.js | 37 - .../toolbar/ChartsToolbarCustomToolbar.js | 141 -- .../ChartsToolbarOrdinalRangeButtons.js | 37 - .../toolbar/ChartsToolbarRangeButtonValues.js | 35 - .../toolbar/ChartsToolbarRangeButtons.js | 30 - ...artsToolbarRangeButtonsInitialSelection.js | 34 - .../ChartsToolbarCustomElements.tsx | 6 +- .../charts-toolbar-custom-elements/client.ts | 7 + .../charts-toolbar-custom-elements/index.ts | 6 + .../ChartsToolbarCustomRangeButtons.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../ChartsToolbarCustomToolbar.tsx | 7 +- .../charts-toolbar-custom-toolbar/client.ts | 7 + .../charts-toolbar-custom-toolbar/index.ts | 6 + .../ChartsToolbarOrdinalRangeButtons.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../ChartsToolbarRangeButtonValues.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + ...rtsToolbarRangeButtonsInitialSelection.tsx | 4 +- .../client.ts | 7 + .../index.ts | 8 + .../ChartsToolbarRangeButtons.tsx | 4 +- .../charts-toolbar-range-buttons/client.ts | 7 + .../charts-toolbar-range-buttons/index.ts | 6 + .../charts-toolbar}/ChartsToolbar.tsx | 4 +- .../toolbar/demos/charts-toolbar/client.ts | 7 + .../toolbar/demos/charts-toolbar/index.ts | 6 + docs/data/charts/toolbar/toolbar.md | 16 +- docs/data/charts/tooltip/AxisFormatter.js | 68 - .../charts/tooltip/AxisFormatter.tsx.preview | 13 - .../charts/tooltip/ControlledAxisTooltip.js | 83 -- docs/data/charts/tooltip/ControlledTooltip.js | 124 -- .../tooltip/CustomAxisTooltipContent.js | 37 - .../charts/tooltip/CustomTooltipContent.js | 37 - .../charts/tooltip/CustomTooltipPosition.js | 79 -- docs/data/charts/tooltip/Formatting.js | 93 -- .../charts/tooltip/Formatting.tsx.preview | 8 - docs/data/charts/tooltip/Interaction.js | 22 - .../charts/tooltip/Interaction.tsx.preview | 2 - docs/data/charts/tooltip/ItemTooltip.tsx | 3 +- .../data/charts/tooltip/ItemTooltipFixedY.tsx | 3 +- .../charts/tooltip/ItemTooltipTopElement.tsx | 2 +- docs/data/charts/tooltip/SeriesFormatter.js | 37 - .../tooltip/SeriesFormatter.tsx.preview | 12 - docs/data/charts/tooltip/SortDemo.js | 55 - docs/data/charts/tooltip/SyncTooltip.js | 94 -- .../charts/tooltip/SynchronizedTooltip.js | 170 --- docs/data/charts/tooltip/TooltipPosition.js | 106 -- docs/data/charts/tooltip/TooltipStyle.js | 22 - .../charts/tooltip/TooltipStyle.tsx.preview | 8 - .../axis-formatter}/AxisFormatter.tsx | 5 +- .../tooltip/demos/axis-formatter/client.ts | 7 + .../tooltip/demos/axis-formatter/index.ts | 6 + .../ControlledAxisTooltip.tsx | 7 +- .../demos/controlled-axis-tooltip/client.ts | 7 + .../demos/controlled-axis-tooltip/index.ts | 6 + .../controlled-tooltip}/ControlledTooltip.tsx | 7 +- .../demos/controlled-tooltip/client.ts | 7 + .../tooltip/demos/controlled-tooltip/index.ts | 6 + .../CustomAxisTooltipContent.tsx | 6 +- .../custom-axis-tooltip-content/client.ts | 7 + .../custom-axis-tooltip-content/index.ts | 6 + .../CustomTooltipContent.tsx | 6 +- .../demos/custom-tooltip-content/client.ts | 7 + .../demos/custom-tooltip-content/index.ts | 6 + .../CustomTooltipPosition.tsx | 10 +- .../demos/custom-tooltip-position/client.ts | 7 + .../demos/custom-tooltip-position/index.ts | 6 + .../{ => demos/formatting}/Formatting.tsx | 2 + .../charts/tooltip/demos/formatting/client.ts | 7 + .../charts/tooltip/demos/formatting/index.ts | 6 + .../{ => demos/interaction}/Interaction.tsx | 2 + .../tooltip/demos/interaction/client.ts | 7 + .../charts/tooltip/demos/interaction/index.ts | 6 + .../series-formatter}/SeriesFormatter.tsx | 5 +- .../tooltip/demos/series-formatter/client.ts | 7 + .../tooltip/demos/series-formatter/index.ts | 6 + .../{ => demos/sort-demo}/SortDemo.tsx | 2 + .../charts/tooltip/demos/sort-demo/client.ts | 7 + .../charts/tooltip/demos/sort-demo/index.ts | 6 + .../{ => demos/sync-tooltip}/SyncTooltip.tsx | 10 +- .../tooltip/demos/sync-tooltip/client.ts | 7 + .../tooltip/demos/sync-tooltip/index.ts | 6 + .../SynchronizedTooltip.tsx | 7 +- .../demos/synchronized-tooltip/client.ts | 7 + .../demos/synchronized-tooltip/index.ts | 6 + .../tooltip-position}/TooltipPosition.tsx | 6 +- .../tooltip/demos/tooltip-position/client.ts | 7 + .../tooltip/demos/tooltip-position/index.ts | 6 + .../tooltip-style}/TooltipStyle.tsx | 2 + .../tooltip/demos/tooltip-style/client.ts | 7 + .../tooltip/demos/tooltip-style/index.ts | 6 + docs/data/charts/tooltip/tooltip.md | 28 +- docs/data/charts/zoom-and-pan/BrushZoom.js | 54 - .../zoom-and-pan/ExternalZoomManagement.js | 67 - .../zoom-and-pan/ZoomAndPanInteractions.js | 220 ---- docs/data/charts/zoom-and-pan/ZoomBarChart.js | 117 -- .../zoom-and-pan/ZoomBarChart.tsx.preview | 5 - .../charts/zoom-and-pan/ZoomControlled.js | 79 -- .../charts/zoom-and-pan/ZoomFilterMode.js | 19 - .../zoom-and-pan/ZoomFilterMode.tsx.preview | 12 - docs/data/charts/zoom-and-pan/ZoomHeatmap.js | 142 -- .../charts/zoom-and-pan/ZoomInitialRange.js | 153 --- docs/data/charts/zoom-and-pan/ZoomKeyboard.js | 24 - .../zoom-and-pan/ZoomKeyboard.tsx.preview | 6 - .../data/charts/zoom-and-pan/ZoomLineChart.js | 123 -- .../zoom-and-pan/ZoomLineChart.tsx.preview | 11 - docs/data/charts/zoom-and-pan/ZoomOptions.js | 141 -- .../charts/zoom-and-pan/ZoomScatterChart.js | 195 --- .../zoom-and-pan/ZoomScatterChart.tsx.preview | 14 - docs/data/charts/zoom-and-pan/ZoomSlider.js | 59 - .../zoom-and-pan/ZoomSliderComposition.js | 49 - .../charts/zoom-and-pan/ZoomSliderPreview.js | 330 ----- .../ZoomSliderPreviewCustomMarkerSize.js | 98 -- .../ZoomSliderPreviewSeriesFilter.js | 56 - .../ZoomSliderPreviewSeriesFilter.tsx.preview | 15 - .../charts/zoom-and-pan/ZoomSliderTooltip.js | 61 - .../{ => demos/brush-zoom}/BrushZoom.tsx | 2 + .../zoom-and-pan/demos/brush-zoom/client.ts | 7 + .../zoom-and-pan/demos/brush-zoom/index.ts | 6 + .../ExternalZoomManagement.tsx | 6 +- .../demos/external-zoom-management/client.ts | 7 + .../demos/external-zoom-management/index.ts | 6 + .../ZoomAndPanInteractions.tsx | 2 + .../demos/zoom-and-pan-interactions/client.ts | 7 + .../demos/zoom-and-pan-interactions/index.ts | 6 + .../zoom-bar-chart}/ZoomBarChart.tsx | 2 + .../demos/zoom-bar-chart/client.ts | 7 + .../demos/zoom-bar-chart/index.ts | 6 + .../zoom-controlled}/ZoomControlled.tsx | 6 +- .../demos/zoom-controlled/client.ts | 7 + .../demos/zoom-controlled/index.ts | 6 + .../zoom-filter-mode}/ZoomFilterMode.tsx | 4 +- .../demos/zoom-filter-mode/client.ts | 7 + .../demos/zoom-filter-mode/index.ts | 6 + .../{ => demos/zoom-heatmap}/ZoomHeatmap.tsx | 6 +- .../zoom-and-pan/demos/zoom-heatmap/client.ts | 7 + .../zoom-and-pan/demos/zoom-heatmap/index.ts | 6 + .../zoom-initial-range}/ZoomInitialRange.tsx | 6 +- .../demos/zoom-initial-range/client.ts | 7 + .../demos/zoom-initial-range/index.ts | 6 + .../zoom-keyboard}/ZoomKeyboard.tsx | 4 +- .../demos/zoom-keyboard/client.ts | 7 + .../zoom-and-pan/demos/zoom-keyboard/index.ts | 6 + .../zoom-line-chart}/ZoomLineChart.tsx | 2 + .../demos/zoom-line-chart/client.ts | 7 + .../demos/zoom-line-chart/index.ts | 6 + .../{ => demos/zoom-options}/ZoomOptions.tsx | 2 + .../zoom-and-pan/demos/zoom-options/client.ts | 7 + .../zoom-and-pan/demos/zoom-options/index.ts | 6 + .../zoom-scatter-chart}/ZoomScatterChart.tsx | 2 + .../demos/zoom-scatter-chart/client.ts | 7 + .../demos/zoom-scatter-chart/index.ts | 6 + .../ZoomSliderComposition.tsx | 2 + .../demos/zoom-slider-composition/client.ts | 7 + .../demos/zoom-slider-composition/index.ts | 6 + .../ZoomSliderPreviewCustomMarkerSize.tsx | 16 +- .../client.ts | 7 + .../index.ts | 6 + .../ZoomSliderPreviewSeriesFilter.tsx | 10 +- .../client.ts | 7 + .../index.ts | 6 + .../ZoomSliderPreview.tsx | 40 +- .../demos/zoom-slider-preview/client.ts | 7 + .../demos/zoom-slider-preview/index.ts | 6 + .../ZoomSliderTooltip.tsx | 2 + .../demos/zoom-slider-tooltip/client.ts | 7 + .../demos/zoom-slider-tooltip/index.ts | 6 + .../{ => demos/zoom-slider}/ZoomSlider.tsx | 2 + .../zoom-and-pan/demos/zoom-slider/client.ts | 7 + .../zoom-and-pan/demos/zoom-slider/index.ts | 6 + docs/data/charts/zoom-and-pan/zoom-and-pan.md | 36 +- docs/data/chat/accessibility/accessibility.md | 2 +- .../reasoning/ReasoningSlotsDemo.js | 152 --- .../reasoning/ReasoningStreamingDemo.js | 82 -- .../ReasoningStreamingDemo.tsx.preview | 12 - .../ReasoningSlotsDemo.tsx | 2 + .../demos/reasoning-slots-demo/client.ts | 7 + .../demos/reasoning-slots-demo/index.ts | 6 + .../ReasoningStreamingDemo.tsx | 2 + .../demos/reasoning-streaming-demo/client.ts | 7 + .../demos/reasoning-streaming-demo/index.ts | 6 + .../chat/ai-and-agents/reasoning/reasoning.md | 4 +- .../step-tracking/StepTrackingDemo.js | 164 --- .../StepTrackingDemo.tsx.preview | 12 - .../step-tracking-demo}/StepTrackingDemo.tsx | 2 + .../demos/step-tracking-demo/client.ts | 7 + .../demos/step-tracking-demo/index.ts | 6 + .../step-tracking/step-tracking.md | 2 +- .../ChatConfirmationPlayground.js | 110 -- .../tool-approval/ToolApprovalFlow.js | 145 --- .../ToolApprovalFlow.tsx.preview | 12 - .../ChatConfirmationPlayground.tsx | 8 +- .../chat-confirmation-playground/client.ts | 7 + .../chat-confirmation-playground/index.ts | 6 + .../tool-approval-flow}/ToolApprovalFlow.tsx | 2 + .../demos/tool-approval-flow/client.ts | 7 + .../demos/tool-approval-flow/index.ts | 6 + .../tool-approval/tool-approval.md | 4 +- .../tool-calling/ToolCallingLifecycle.js | 137 -- .../ToolCallingLifecycle.tsx.preview | 11 - .../ToolCardExpansionPlayground.js | 203 --- .../ToolCallingLifecycle.tsx | 2 + .../demos/tool-calling-lifecycle/client.ts | 7 + .../demos/tool-calling-lifecycle/index.ts | 6 + .../ToolCardExpansionPlayground.tsx | 16 +- .../tool-card-expansion-playground/client.ts | 7 + .../tool-card-expansion-playground/index.ts | 6 + .../tool-calling/tool-calling.md | 4 +- .../backend/adapters/MinimalAdapterDemo.js | 91 -- .../adapters/MinimalAdapterDemo.tsx.preview | 12 - docs/data/chat/backend/adapters/adapters.md | 2 +- .../MinimalAdapterDemo.tsx | 2 + .../demos/minimal-adapter-demo/client.ts | 7 + .../demos/minimal-adapter-demo/index.ts | 6 + .../ManualStreamAdapterDemo.js | 112 -- .../ManualStreamAdapterDemo.tsx.preview | 15 - .../building-an-adapter.md | 2 +- .../ManualStreamAdapterDemo.tsx | 2 + .../manual-stream-adapter-demo/client.ts | 7 + .../demos/manual-stream-adapter-demo/index.ts | 6 + .../ai-sdk-adapter/AiSdkMockStreamDemo.js | 92 -- .../AiSdkMockStreamDemo.tsx.preview | 13 - .../ai-sdk-adapter/MuiDocsAssistantDemo.js | 67 - .../MuiDocsAssistantDemo.tsx.preview | 13 - .../ai-sdk-adapter/ai-sdk-adapter.md | 4 +- .../AiSdkMockStreamDemo.tsx | 2 + .../demos/ai-sdk-mock-stream-demo/client.ts | 7 + .../demos/ai-sdk-mock-stream-demo/index.ts | 6 + .../MuiDocsAssistantDemo.tsx | 2 + .../demos/mui-docs-assistant-demo/client.ts | 7 + .../demos/mui-docs-assistant-demo/index.ts | 6 + .../echo-adapter/EchoAdapterCannedReplies.js | 52 - .../EchoAdapterCannedReplies.tsx.preview | 12 - .../echo-adapter/EchoAdapterDemo.js | 43 - .../echo-adapter/EchoAdapterDemo.tsx.preview | 12 - .../EchoAdapterCannedReplies.tsx | 2 + .../echo-adapter-canned-replies/client.ts | 7 + .../echo-adapter-canned-replies/index.ts | 6 + .../echo-adapter-demo}/EchoAdapterDemo.tsx | 2 + .../demos/echo-adapter-demo/client.ts | 7 + .../demos/echo-adapter-demo/index.ts | 6 + .../echo-adapter/echo-adapter.md | 4 +- .../ControlledActiveConversation.js | 143 --- .../controlled-state/controlled-state.md | 4 +- .../ControlledActiveConversation.tsx | 2 + .../controlled-active-conversation/client.ts | 7 + .../controlled-active-conversation/index.ts | 6 + .../real-time-adapters/real-time-adapters.md | 2 +- .../basics/chatbox/ChatBoxFeatureFlags.js | 92 -- .../chatbox/ChatBoxFeatureFlags.tsx.preview | 13 - .../chat/basics/chatbox/ChatBoxPlayground.js | 303 ----- docs/data/chat/basics/chatbox/chatbox.md | 14 +- .../ChatBoxFeatureFlags.tsx | 2 + .../demos/chat-box-feature-flags/client.ts | 7 + .../demos/chat-box-feature-flags/index.ts | 6 + .../ChatBoxPlayground.tsx | 8 +- .../demos/chat-box-playground/client.ts | 7 + .../demos/chat-box-playground/index.ts | 6 + .../basics/composer/ChatComposerPlayground.js | 260 ---- .../composer/ComposerControlledStandalone.js | 21 - .../ComposerControlledStandalone.tsx.preview | 10 - .../ComposerCustomPlaceholderStandalone.js | 12 - .../ComposerCustomPlaceholderStandalone.tsx | 12 - ...serCustomPlaceholderStandalone.tsx.preview | 4 - .../composer/ComposerDisabledStandalone.js | 12 - .../composer/ComposerDisabledStandalone.tsx | 12 - .../ComposerDisabledStandalone.tsx.preview | 4 - .../composer/ComposerHelperTextStandalone.js | 7 - .../composer/ComposerHelperTextStandalone.tsx | 7 - .../ComposerHelperTextStandalone.tsx.preview | 1 - .../ComposerHiddenAttachButtonStandalone.js | 12 - .../ComposerHiddenAttachButtonStandalone.tsx | 12 - ...erHiddenAttachButtonStandalone.tsx.preview | 4 - .../composer/ComposerHookStateStandalone.js | 40 - .../ComposerHookStateStandalone.tsx.preview | 4 - .../composer/ComposerVariantsStandalone.js | 68 - docs/data/chat/basics/composer/composer.md | 16 +- .../ChatComposerPlayground.tsx | 8 +- .../demos/chat-composer-playground/client.ts | 7 + .../demos/chat-composer-playground/index.ts | 6 + .../ComposerControlledStandalone.tsx | 4 +- .../composer-controlled-standalone/client.ts | 7 + .../composer-controlled-standalone/index.ts | 6 + .../ComposerCustomPlaceholderStandalone.tsx | 14 + .../client.ts | 7 + .../index.ts | 6 + .../ComposerDisabledStandalone.tsx | 14 + .../composer-disabled-standalone/client.ts | 7 + .../composer-disabled-standalone/index.ts | 6 + .../ComposerHelperTextStandalone.tsx | 10 + .../composer-helper-text-standalone/client.ts | 7 + .../composer-helper-text-standalone/index.ts | 6 + .../ComposerHiddenAttachButtonStandalone.tsx | 14 + .../client.ts | 7 + .../index.ts | 8 + .../ComposerHookStateStandalone.tsx | 4 +- .../composer-hook-state-standalone/client.ts | 7 + .../composer-hook-state-standalone/index.ts | 6 + .../ComposerVariantsStandalone.tsx | 2 + .../composer-variants-standalone/client.ts | 7 + .../composer-variants-standalone/index.ts | 6 + .../ChatConversationPlayground.js | 161 --- .../ConversationBasicStandalone.js | 67 - .../chat/basics/conversation/conversation.md | 4 +- .../ChatConversationPlayground.tsx | 8 +- .../chat-conversation-playground/client.ts | 7 + .../chat-conversation-playground/index.ts | 6 + .../ConversationBasicStandalone.tsx | 2 + .../conversation-basic-standalone/client.ts | 7 + .../conversation-basic-standalone/index.ts | 6 + .../layout/LayoutRecomposedStandalone.js | 89 -- .../layout/LayoutResponsiveStandalone.js | 183 --- .../layout/LayoutThreadOnlyStandalone.js | 78 -- .../basics/layout/LayoutTwoPaneStandalone.js | 128 -- .../LayoutRecomposedStandalone.tsx | 2 + .../layout-recomposed-standalone/client.ts | 7 + .../layout-recomposed-standalone/index.ts | 6 + .../LayoutResponsiveStandalone.tsx | 2 + .../layout-responsive-standalone/client.ts | 7 + .../layout-responsive-standalone/index.ts | 6 + .../LayoutThreadOnlyStandalone.tsx | 2 + .../layout-thread-only-standalone/client.ts | 7 + .../layout-thread-only-standalone/index.ts | 6 + .../LayoutTwoPaneStandalone.tsx | 2 + .../layout-two-pane-standalone/client.ts | 7 + .../demos/layout-two-pane-standalone/index.ts | 6 + docs/data/chat/basics/layout/layout.md | 8 +- .../ChatMessageAuthorLabelPlayground.js | 91 -- .../messages/ChatMessageAvatarPlayground.js | 106 -- .../messages/ChatMessageContentPlayground.js | 122 -- .../messages/ChatMessageGroupPlayground.js | 143 --- .../ChatMessageInlineMetaPlayground.js | 116 -- .../messages/ChatMessageListPlayground.js | 246 ---- .../messages/ChatMessageMetaPlayground.js | 114 -- .../basics/messages/ChatMessagePlayground.js | 201 --- .../basics/messages/StandaloneMessages.js | 34 - .../ChatMessageAuthorLabelPlayground.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../ChatMessageAvatarPlayground.tsx | 8 +- .../chat-message-avatar-playground/client.ts | 7 + .../chat-message-avatar-playground/index.ts | 6 + .../ChatMessageContentPlayground.tsx | 8 +- .../chat-message-content-playground/client.ts | 7 + .../chat-message-content-playground/index.ts | 6 + .../ChatMessageGroupPlayground.tsx | 2 + .../chat-message-group-playground/client.ts | 7 + .../chat-message-group-playground/index.ts | 6 + .../ChatMessageInlineMetaPlayground.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../ChatMessageListPlayground.tsx | 8 +- .../chat-message-list-playground/client.ts | 7 + .../chat-message-list-playground/index.ts | 6 + .../ChatMessageMetaPlayground.tsx | 8 +- .../chat-message-meta-playground/client.ts | 7 + .../chat-message-meta-playground/index.ts | 6 + .../ChatMessagePlayground.tsx | 8 +- .../demos/chat-message-playground/client.ts | 7 + .../demos/chat-message-playground/index.ts | 6 + .../StandaloneMessages.tsx | 2 + .../demos/standalone-messages/client.ts | 7 + .../demos/standalone-messages/index.ts | 6 + docs/data/chat/basics/messages/messages.md | 20 +- .../variants-and-density.md | 4 +- .../attachments/AttachmentValidation.js | 56 - .../ChatComposerAttachButtonPlayground.js | 99 -- .../ChatComposerAttachmentListPlayground.js | 113 -- .../chat/behavior/attachments/attachments.md | 8 +- .../AttachmentValidation.tsx | 2 + .../demos/attachment-validation/client.ts | 7 + .../demos/attachment-validation/index.ts | 6 + .../ChatComposerAttachButtonPlayground.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../ChatComposerAttachmentListPlayground.tsx | 11 +- .../client.ts | 7 + .../index.ts | 8 + .../ChatMessageErrorPlayground.js | 143 --- .../behavior/error-handling/RetryRecovery.js | 80 -- .../ChatMessageErrorPlayground.tsx | 8 +- .../chat-message-error-playground/client.ts | 7 + .../chat-message-error-playground/index.ts | 6 + .../retry-recovery}/RetryRecovery.tsx | 2 + .../demos/retry-recovery/client.ts | 7 + .../demos/retry-recovery/index.ts | 6 + .../behavior/error-handling/error-handling.md | 6 +- .../behavior/scrolling/AutoScrollBuffer.js | 115 -- .../ChatScrollToBottomAffordancePlayground.js | 177 --- .../auto-scroll-buffer}/AutoScrollBuffer.tsx | 2 + .../demos/auto-scroll-buffer/client.ts | 7 + .../demos/auto-scroll-buffer/index.ts | 6 + ...ChatScrollToBottomAffordancePlayground.tsx | 16 +- .../client.ts | 7 + .../index.ts | 8 + .../data/chat/behavior/scrolling/scrolling.md | 4 +- .../streaming/ChatStreamingIndicatorDemo.js | 197 --- .../streaming/ChatStreamingPlayground.js | 192 --- .../ChatStreamingIndicatorDemo.tsx | 2 + .../chat-streaming-indicator-demo/client.ts | 7 + .../chat-streaming-indicator-demo/index.ts | 6 + .../ChatStreamingPlayground.tsx | 2 + .../demos/chat-streaming-playground/client.ts | 7 + .../demos/chat-streaming-playground/index.ts | 6 + .../data/chat/behavior/streaming/streaming.md | 4 +- .../suggestions/AutoSubmitSuggestions.js | 26 - .../AutoSubmitSuggestions.tsx.preview | 14 - .../suggestions/ChatSuggestionsPlayground.js | 113 -- .../suggestions/SuggestionsAboveComposer.js | 35 - .../suggestions/SuggestionsWithLabels.js | 39 - .../AutoSubmitSuggestions.tsx | 2 + .../demos/auto-submit-suggestions/client.ts | 7 + .../demos/auto-submit-suggestions/index.ts | 6 + .../ChatSuggestionsPlayground.tsx | 8 +- .../chat-suggestions-playground/client.ts | 7 + .../chat-suggestions-playground/index.ts | 6 + .../SuggestionsAboveComposer.tsx | 2 + .../suggestions-above-composer/client.ts | 7 + .../demos/suggestions-above-composer/index.ts | 6 + .../SuggestionsWithLabels.tsx | 2 + .../demos/suggestions-with-labels/client.ts | 7 + .../demos/suggestions-with-labels/index.ts | 6 + .../chat/behavior/suggestions/suggestions.md | 8 +- .../ChatTypingIndicatorPlayground.js | 82 -- .../ChatTypingIndicatorPlayground.tsx | 8 +- .../client.ts | 7 + .../chat-typing-indicator-playground/index.ts | 6 + .../typing-indicators/typing-indicators.md | 2 +- docs/data/chat/core/adapters/adapters.md | 2 +- docs/data/chat/core/core.md | 2 +- .../AdvancedStoreAccessHeadlessChat.js | 255 ---- ...dvancedStoreAccessHeadlessChat.tsx.preview | 9 - .../advanced-store-access.md | 2 +- .../AdvancedStoreAccessHeadlessChat.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../examples/composer/ComposerHeadlessChat.js | 299 ----- .../composer/ComposerHeadlessChat.tsx.preview | 3 - .../chat/core/examples/composer/composer.md | 2 +- .../ComposerHeadlessChat.tsx | 4 +- .../demos/composer-headless-chat/client.ts | 7 + .../demos/composer-headless-chat/index.ts | 6 + .../ControlledStateHeadlessChat.js | 268 ---- .../controlled-state/controlled-state.md | 2 +- .../ControlledStateHeadlessChat.tsx | 14 +- .../controlled-state-headless-chat/client.ts | 7 + .../controlled-state-headless-chat/index.ts | 6 + .../minimal-chat/MinimalHeadlessChat.js | 185 --- .../MinimalHeadlessChat.tsx.preview | 3 - .../MinimalHeadlessChat.tsx | 5 +- .../demos/minimal-headless-chat/client.ts | 7 + .../demos/minimal-headless-chat/index.ts | 6 + .../examples/minimal-chat/minimal-chat.md | 2 +- .../RealtimeThreadSyncHeadlessChat.js | 363 ------ ...RealtimeThreadSyncHeadlessChat.tsx.preview | 11 - .../RealtimeThreadSyncHeadlessChat.tsx | 15 +- .../client.ts | 7 + .../index.ts | 6 + .../realtime-thread-sync.md | 2 +- .../examples/realtime/RealtimeHeadlessChat.js | 282 ---- .../realtime/RealtimeHeadlessChat.tsx.preview | 7 - .../RealtimeHeadlessChat.tsx | 5 +- .../demos/realtime-headless-chat/client.ts | 7 + .../demos/realtime-headless-chat/index.ts | 6 + .../chat/core/examples/realtime/realtime.md | 2 +- .../SelectorDrivenThread.js | 203 --- .../SelectorDrivenThread.tsx | 10 +- .../demos/selector-driven-thread/client.ts | 7 + .../demos/selector-driven-thread/index.ts | 6 + .../selector-driven-thread.md | 2 +- .../StreamingLifecycleHeadlessChat.js | 324 ----- .../StreamingLifecycleHeadlessChat.tsx | 10 +- .../client.ts | 7 + .../index.ts | 6 + .../streaming-lifecycle.md | 2 +- .../ToolApprovalAndRenderersHeadlessChat.js | 340 ----- ...provalAndRenderersHeadlessChat.tsx.preview | 7 - .../ToolApprovalAndRenderersHeadlessChat.tsx | 16 +- .../client.ts | 7 + .../index.ts | 8 + .../tool-approval-and-renderers.md | 2 +- .../ToolCallEventsHeadlessChat.js | 233 ---- .../ToolCallEventsHeadlessChat.tsx | 10 +- .../tool-call-events-headless-chat/client.ts | 7 + .../tool-call-events-headless-chat/index.ts | 6 + .../tool-call-events/tool-call-events.md | 2 +- .../TypeAugmentationHeadlessChat.js | 404 ------ .../TypeAugmentationHeadlessChat.tsx.preview | 9 - .../TypeAugmentationHeadlessChat.tsx | 14 +- .../type-augmentation-headless-chat/client.ts | 7 + .../type-augmentation-headless-chat/index.ts | 6 + .../type-augmentation/type-augmentation.md | 2 +- docs/data/chat/core/hooks/hooks.md | 2 +- docs/data/chat/core/realtime/realtime.md | 2 +- docs/data/chat/core/selectors/selectors.md | 2 +- docs/data/chat/core/state/state.md | 2 +- docs/data/chat/core/streaming/streaming.md | 2 +- docs/data/chat/core/types/types.md | 2 +- .../look-and-feel/ComposerVariantsDemo.js | 82 -- .../look-and-feel/DensityComparisonDemo.js | 64 - .../DensityComparisonDemo.tsx.preview | 3 - .../look-and-feel/LookAndFeelPlayground.js | 168 --- .../look-and-feel/MessageStatesDemo.js | 147 --- .../look-and-feel/MessageVariantsDemo.js | 63 - .../MessageVariantsDemo.tsx.preview | 2 - .../look-and-feel/ThemeAndSlotsDemo.js | 57 - .../ComposerVariantsDemo.tsx | 2 + .../demos/composer-variants-demo/client.ts | 7 + .../demos/composer-variants-demo/index.ts | 6 + .../DensityComparisonDemo.tsx | 2 + .../demos/density-comparison-demo/client.ts | 7 + .../demos/density-comparison-demo/index.ts | 6 + .../LookAndFeelPlayground.tsx | 2 + .../demos/look-and-feel-playground/client.ts | 7 + .../demos/look-and-feel-playground/index.ts | 6 + .../MessageStatesDemo.tsx | 2 + .../demos/message-states-demo/client.ts | 7 + .../demos/message-states-demo/index.ts | 6 + .../MessageVariantsDemo.tsx | 2 + .../demos/message-variants-demo/client.ts | 7 + .../demos/message-variants-demo/index.ts | 6 + .../ThemeAndSlotsDemo.tsx | 2 + .../demos/theme-and-slots-demo/client.ts | 7 + .../demos/theme-and-slots-demo/index.ts | 6 + .../look-and-feel/look-and-feel.md | 12 +- .../overview/EightyTwentyDemo.js | 62 - .../eighty-twenty-demo}/EightyTwentyDemo.tsx | 2 + .../demos/eighty-twenty-demo/client.ts | 7 + .../demos/eighty-twenty-demo/index.ts | 6 + .../chat/customization/overview/overview.md | 2 +- .../structure/StructureRecipes.js | 48 - .../structure/StructureRecipes.tsx.preview | 15 - .../structure-recipes}/StructureRecipes.tsx | 2 + .../demos/structure-recipes/client.ts | 7 + .../demos/structure-recipes/index.ts | 6 + .../chat/customization/structure/structure.md | 2 +- .../date-divider/ChatDateDividerPlayground.js | 171 --- .../display/date-divider/DateDividerByWeek.js | 111 -- .../chat/display/date-divider/date-divider.md | 6 +- .../ChatDateDividerPlayground.tsx | 8 +- .../chat-date-divider-playground/client.ts | 7 + .../chat-date-divider-playground/index.ts | 6 + .../DateDividerByWeek.tsx | 2 + .../demos/date-divider-by-week/client.ts | 7 + .../demos/date-divider-by-week/index.ts | 6 + .../ChatMessageSkeletonPlayground.js | 52 - .../CustomEmptyState.js | 107 -- .../LoadingSkeletonInList.js | 102 -- .../ChatMessageSkeletonPlayground.tsx | 8 +- .../client.ts | 7 + .../chat-message-skeleton-playground/index.ts | 6 + .../custom-empty-state}/CustomEmptyState.tsx | 2 + .../demos/custom-empty-state/client.ts | 7 + .../demos/custom-empty-state/index.ts | 6 + .../LoadingSkeletonInList.tsx | 2 + .../demos/loading-skeleton-in-list/client.ts | 7 + .../demos/loading-skeleton-in-list/index.ts | 6 + .../loading-and-empty-states.md | 8 +- .../message-actions/BasicMessageActions.js | 50 - .../BasicMessageActions.tsx.preview | 15 - .../ChatMessageActionsPlayground.js | 163 --- .../ExtraActionsMessageActions.js | 43 - .../RoleBasedMessageActions.js | 65 - .../RoleBasedMessageActions.tsx.preview | 15 - .../BasicMessageActions.tsx | 2 + .../demos/basic-message-actions/client.ts | 7 + .../demos/basic-message-actions/index.ts | 6 + .../ChatMessageActionsPlayground.tsx | 8 +- .../chat-message-actions-playground/client.ts | 7 + .../chat-message-actions-playground/index.ts | 6 + .../ExtraActionsMessageActions.tsx | 2 + .../extra-actions-message-actions/client.ts | 7 + .../extra-actions-message-actions/index.ts | 6 + .../RoleBasedMessageActions.tsx | 2 + .../role-based-message-actions/client.ts | 7 + .../demos/role-based-message-actions/index.ts | 6 + .../message-actions/message-actions.md | 8 +- .../message-appearance/message-appearance.md | 14 +- .../code-blocks/ChatCodeBlockPlayground.js | 162 --- .../message-parts/code-blocks/code-blocks.md | 4 +- .../ChatCodeBlockPlayground.tsx | 8 +- .../chat-code-block-playground/client.ts | 7 + .../demos/chat-code-block-playground/index.ts | 6 + .../custom-parts/CustomDataPartChat.js | 146 --- .../CustomDataPartChat.tsx.preview | 11 - .../custom-parts/custom-parts.md | 2 +- .../CustomDataPartChat.tsx | 2 + .../demos/custom-data-part-chat/client.ts | 7 + .../demos/custom-data-part-chat/index.ts | 6 + .../ChatFilePartCustomizationDemo.js | 79 -- .../files-and-images/ChatFilePartsDemo.js | 60 - .../ChatFilePartsDemo.tsx.preview | 12 - .../ChatFilePartCustomizationDemo.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../ChatFilePartsDemo.tsx | 2 + .../demos/chat-file-parts-demo/client.ts | 7 + .../demos/chat-file-parts-demo/index.ts | 6 + .../files-and-images/files-and-images.md | 4 +- .../ChatMessageSourcesPlayground.js | 78 -- .../sources-and-citations/SourcePartsDemo.js | 76 -- .../ChatMessageSourcesPlayground.tsx | 8 +- .../chat-message-sources-playground/client.ts | 7 + .../chat-message-sources-playground/index.ts | 6 + .../source-parts-demo}/SourcePartsDemo.tsx | 2 + .../demos/source-parts-demo/client.ts | 7 + .../demos/source-parts-demo/index.ts | 6 + .../sources-and-citations.md | 4 +- .../text-and-markdown/MarkdownPlayground.js | 93 -- .../text-and-markdown/StreamingMarkdown.js | 70 - .../StreamingMarkdown.tsx.preview | 12 - .../MarkdownPlayground.tsx | 2 + .../demos/markdown-playground/client.ts | 7 + .../demos/markdown-playground/index.ts | 6 + .../streaming-markdown}/StreamingMarkdown.tsx | 2 + .../demos/streaming-markdown/client.ts | 7 + .../demos/streaming-markdown/index.ts | 6 + .../text-and-markdown/text-and-markdown.md | 4 +- .../ChatUnreadMarkerPlayground.js | 122 -- .../unread-marker/UnreadMarkerStandalone.js | 47 - .../UnreadMarkerStandalone.tsx.preview | 14 - .../ChatUnreadMarkerPlayground.tsx | 8 +- .../chat-unread-marker-playground/client.ts | 7 + .../chat-unread-marker-playground/index.ts | 6 + .../UnreadMarkerStandalone.tsx | 2 + .../demos/unread-marker-standalone/client.ts | 7 + .../demos/unread-marker-standalone/index.ts | 6 + .../display/unread-marker/unread-marker.md | 4 +- docs/data/chat/headless/composer/composer.md | 2 +- .../chat/headless/composition/composition.md | 2 +- .../conversation-list/conversation-list.md | 2 +- .../headless/customization/customization.md | 2 +- .../chatgpt-style/ChatGptStyleChat.js | 1141 ----------------- .../examples/chatgpt-style/chatgpt-style.md | 2 +- .../chat-gpt-style-chat}/ChatGptStyleChat.tsx | 2 + .../demos/chat-gpt-style-chat/client.ts | 7 + .../demos/chat-gpt-style-chat/index.ts | 6 + .../ComposerWithAttachments.js | 282 ---- .../composer-with-attachments.md | 2 +- .../ComposerWithAttachments.tsx | 2 + .../demos/composer-with-attachments/client.ts | 7 + .../demos/composer-with-attachments/index.ts | 6 + .../CustomMessagePartRendering.js | 224 ---- .../custom-message-part-rendering.md | 2 +- .../CustomMessagePartRendering.tsx | 2 + .../custom-message-part-rendering/client.ts | 7 + .../custom-message-part-rendering/index.ts | 6 + .../GroupedMessageTimeline.js | 229 ---- .../GroupedMessageTimeline.tsx | 2 + .../demos/grouped-message-timeline/client.ts | 7 + .../demos/grouped-message-timeline/index.ts | 6 + .../grouped-message-timeline.md | 2 +- .../IndicatorsInContext.js | 276 ---- .../IndicatorsInContext.tsx | 2 + .../demos/indicators-in-context/client.ts | 7 + .../demos/indicators-in-context/index.ts | 6 + .../indicators-in-context.md | 2 +- .../intercom-style/IntercomStyleChat.js | 505 -------- .../IntercomStyleChat.tsx | 2 + .../demos/intercom-style-chat/client.ts | 7 + .../demos/intercom-style-chat/index.ts | 6 + .../examples/intercom-style/intercom-style.md | 2 +- .../minimal-shell/MinimalUnstyledShell.js | 138 -- .../MinimalUnstyledShell.tsx | 2 + .../demos/minimal-unstyled-shell/client.ts | 7 + .../demos/minimal-unstyled-shell/index.ts | 6 + .../examples/minimal-shell/minimal-shell.md | 2 +- .../slot-customization/SlotCustomization.js | 688 ---------- .../slot-customization}/SlotCustomization.tsx | 2 + .../demos/slot-customization/client.ts | 7 + .../demos/slot-customization/index.ts | 6 + .../slot-customization/slot-customization.md | 2 +- .../examples/two-pane-inbox/TwoPaneInbox.js | 209 --- .../two-pane-inbox}/TwoPaneInbox.tsx | 2 + .../demos/two-pane-inbox/client.ts | 7 + .../demos/two-pane-inbox/index.ts | 6 + .../examples/two-pane-inbox/two-pane-inbox.md | 2 +- .../chat/headless/indicators/indicators.md | 2 +- docs/data/chat/headless/layout/layout.md | 2 +- docs/data/chat/headless/messages/messages.md | 2 +- docs/data/chat/headless/thread/thread.md | 2 +- docs/data/chat/material/adapter/adapter.md | 2 +- .../material/composer/CompactComposerIdeas.js | 223 ---- .../composer/CompactComposerIdeas.tsx.preview | 3 - .../material/composer/ComposerControlled.js | 47 - .../composer/ComposerCustomPlaceholder.js | 30 - .../ComposerCustomPlaceholder.tsx.preview | 15 - .../material/composer/ComposerDisabled.js | 30 - .../composer/ComposerDisabled.tsx.preview | 15 - .../composer/ComposerHiddenAttachButton.js | 28 - .../ComposerHiddenAttachButton.tsx.preview | 13 - docs/data/chat/material/composer/composer.md | 10 +- .../CompactComposerIdeas.tsx | 2 + .../demos/compact-composer-ideas/client.ts | 7 + .../demos/compact-composer-ideas/index.ts | 6 + .../ComposerControlled.tsx | 2 + .../demos/composer-controlled/client.ts | 7 + .../demos/composer-controlled/index.ts | 6 + .../ComposerCustomPlaceholder.tsx | 2 + .../composer-custom-placeholder/client.ts | 7 + .../composer-custom-placeholder/index.ts | 6 + .../composer-disabled}/ComposerDisabled.tsx | 2 + .../demos/composer-disabled/client.ts | 7 + .../composer/demos/composer-disabled/index.ts | 6 + .../ComposerHiddenAttachButton.tsx | 2 + .../composer-hidden-attach-button/client.ts | 7 + .../composer-hidden-attach-button/index.ts | 6 + .../chat/material/context/ChatBoxWithHooks.js | 39 - .../context/ChatBoxWithHooks.tsx.preview | 16 - .../context/ChatProviderCustomLayout.js | 103 -- .../material/context/MultipleInstances.js | 121 -- docs/data/chat/material/context/context.md | 6 +- .../chat-box-with-hooks}/ChatBoxWithHooks.tsx | 2 + .../demos/chat-box-with-hooks/client.ts | 7 + .../demos/chat-box-with-hooks/index.ts | 6 + .../ChatProviderCustomLayout.tsx | 2 + .../chat-provider-custom-layout/client.ts | 7 + .../chat-provider-custom-layout/index.ts | 6 + .../multiple-instances}/MultipleInstances.tsx | 2 + .../demos/multiple-instances/client.ts | 7 + .../context/demos/multiple-instances/index.ts | 6 + .../material/conversation-list/CompactRow.js | 116 -- .../conversation-list/FullCustomRow.js | 175 --- .../conversation-list/RichItemContent.js | 117 -- .../conversation-list/ThemedAvatar.js | 95 -- .../conversation-list/conversation-list.md | 10 +- .../{ => demos/compact-row}/CompactRow.tsx | 2 + .../demos/compact-row/client.ts | 7 + .../demos/compact-row/index.ts | 6 + .../full-custom-row}/FullCustomRow.tsx | 2 + .../demos/full-custom-row/client.ts | 7 + .../demos/full-custom-row/index.ts | 6 + .../rich-item-content}/RichItemContent.tsx | 2 + .../demos/rich-item-content/client.ts | 7 + .../demos/rich-item-content/index.ts | 6 + .../themed-avatar}/ThemedAvatar.tsx | 2 + .../demos/themed-avatar/client.ts | 7 + .../demos/themed-avatar/index.ts | 6 + .../material/customization/customization.md | 2 +- .../examples/agentic-code/AgenticCode.js | 507 -------- .../examples/agentic-code/ToolStylingA.js | 550 -------- .../examples/agentic-code/ToolStylingB.js | 587 --------- .../examples/agentic-code/ToolStylingC.js | 620 --------- .../examples/agentic-code/agentic-code.md | 8 +- .../{ => demos/agentic-code}/AgenticCode.tsx | 2 + .../agentic-code/demos/agentic-code/client.ts | 7 + .../agentic-code/demos/agentic-code/index.ts | 6 + .../tool-styling-a}/ToolStylingA.tsx | 2 + .../demos/tool-styling-a/client.ts | 7 + .../demos/tool-styling-a/index.ts | 6 + .../tool-styling-b}/ToolStylingB.tsx | 2 + .../demos/tool-styling-b/client.ts | 7 + .../demos/tool-styling-b/index.ts | 6 + .../tool-styling-c}/ToolStylingC.tsx | 2 + .../demos/tool-styling-c/client.ts | 7 + .../demos/tool-styling-c/index.ts | 6 + .../examples/basic-ai-chat/BasicAiChat.js | 27 - .../basic-ai-chat/BasicAiChat.tsx.preview | 12 - .../examples/basic-ai-chat/basic-ai-chat.md | 2 +- .../{ => demos/basic-ai-chat}/BasicAiChat.tsx | 2 + .../demos/basic-ai-chat/client.ts | 7 + .../demos/basic-ai-chat/index.ts | 6 + .../material/examples/code-block/CodeBlock.js | 135 -- .../examples/code-block/code-block.md | 2 +- .../{ => demos/code-block}/CodeBlock.tsx | 2 + .../code-block/demos/code-block/client.ts | 7 + .../code-block/demos/code-block/index.ts | 6 + .../compact-variant/CompactVariant.js | 63 - .../compact-variant/CompactVariant.tsx | 64 - .../compact-variant/compact-variant.md | 2 +- .../demos/compact-variant/CompactVariant.tsx | 66 + .../demos/compact-variant/client.ts | 7 + .../demos/compact-variant/index.ts | 6 + .../examples/confirmation/Confirmation.js | 113 -- .../examples/confirmation/confirmation.md | 2 +- .../{ => demos/confirmation}/Confirmation.tsx | 2 + .../confirmation/demos/confirmation/client.ts | 7 + .../confirmation/demos/confirmation/index.ts | 6 + .../examples/custom-theme/CustomTheme.js | 55 - .../custom-theme/CustomTheme.tsx.preview | 15 - .../examples/custom-theme/custom-theme.md | 2 +- .../{ => demos/custom-theme}/CustomTheme.tsx | 2 + .../custom-theme/demos/custom-theme/client.ts | 7 + .../custom-theme/demos/custom-theme/index.ts | 6 + .../examples/empty-state/EmptyState.js | 37 - .../empty-state/EmptyState.tsx.preview | 13 - .../{ => demos/empty-state}/EmptyState.tsx | 2 + .../empty-state/demos/empty-state/client.ts | 7 + .../empty-state/demos/empty-state/index.ts | 6 + .../examples/empty-state/empty-state.md | 2 +- .../examples/error-state/ErrorState.js | 53 - .../{ => demos/error-state}/ErrorState.tsx | 2 + .../error-state/demos/error-state/client.ts | 7 + .../error-state/demos/error-state/index.ts | 6 + .../examples/error-state/error-state.md | 2 +- .../examples/long-messages/LongMessages.js | 107 -- .../long-messages/LongMessages.tsx.preview | 12 - .../long-messages}/LongMessages.tsx | 2 + .../demos/long-messages/client.ts | 7 + .../demos/long-messages/index.ts | 6 + .../examples/long-messages/long-messages.md | 2 +- .../examples/many-messages/ManyMessages.js | 66 - .../many-messages/ManyMessages.tsx.preview | 12 - .../many-messages}/ManyMessages.tsx | 2 + .../demos/many-messages/client.ts | 7 + .../demos/many-messages/index.ts | 6 + .../examples/many-messages/many-messages.md | 2 +- .../examples/message-feed/MessageFeed.js | 119 -- .../{ => demos/message-feed}/MessageFeed.tsx | 2 + .../message-feed/demos/message-feed/client.ts | 7 + .../message-feed/demos/message-feed/index.ts | 6 + .../examples/message-feed/message-feed.md | 2 +- .../examples/model-selector/ModelSelector.js | 58 - .../model-selector/ModelSelector.tsx.preview | 15 - .../model-selector}/ModelSelector.tsx | 5 +- .../demos/model-selector/client.ts | 7 + .../demos/model-selector/index.ts | 6 + .../examples/model-selector/model-selector.md | 2 +- .../multi-conversation/MultiConversation.js | 62 - .../multi-conversation}/MultiConversation.tsx | 2 + .../demos/multi-conversation/client.ts | 7 + .../demos/multi-conversation/index.ts | 6 + .../multi-conversation/multi-conversation.md | 2 +- .../NoConversationHistory.js | 124 -- .../NoConversationHistory.tsx | 2 + .../demos/no-conversation-history/client.ts | 7 + .../demos/no-conversation-history/index.ts | 6 + .../no-conversation-history.md | 2 +- .../material/examples/plan-task/PlanTask.js | 384 ------ .../examples/plan-task/PlanTask.tsx.preview | 13 - .../{ => demos/plan-task}/PlanTask.tsx | 2 + .../plan-task/demos/plan-task/client.ts | 7 + .../plan-task/demos/plan-task/index.ts | 6 + .../material/examples/plan-task/plan-task.md | 2 +- .../examples/slot-overrides/SlotOverrides.js | 87 -- .../slot-overrides/SlotOverrides.tsx.preview | 15 - .../slot-overrides}/SlotOverrides.tsx | 9 +- .../demos/slot-overrides/client.ts | 7 + .../demos/slot-overrides/index.ts | 6 + .../examples/slot-overrides/slot-overrides.md | 2 +- .../examples/slow-streaming/SlowStreaming.js | 54 - .../slow-streaming/SlowStreaming.tsx.preview | 12 - .../slow-streaming}/SlowStreaming.tsx | 2 + .../demos/slow-streaming/client.ts | 7 + .../demos/slow-streaming/index.ts | 6 + .../examples/slow-streaming/slow-streaming.md | 2 +- .../examples/split-layout/SplitLayout.js | 153 --- .../{ => demos/split-layout}/SplitLayout.tsx | 2 + .../split-layout/demos/split-layout/client.ts | 7 + .../split-layout/demos/split-layout/index.ts | 6 + .../examples/split-layout/split-layout.md | 2 +- .../examples/thread-only/ThreadOnly.js | 27 - .../thread-only/ThreadOnly.tsx.preview | 10 - .../{ => demos/thread-only}/ThreadOnly.tsx | 2 + .../thread-only/demos/thread-only/client.ts | 7 + .../thread-only/demos/thread-only/index.ts | 6 + .../examples/thread-only/thread-only.md | 2 +- .../material/hooks/ConversationSidebar.js | 101 -- .../chat/material/hooks/CustomComposer.js | 83 -- .../material/hooks/CustomComposer.tsx.preview | 15 - .../chat/material/hooks/EfficientThread.js | 108 -- docs/data/chat/material/hooks/StatusFooter.js | 67 - .../ConversationSidebar.tsx | 2 + .../demos/conversation-sidebar/client.ts | 7 + .../hooks/demos/conversation-sidebar/index.ts | 6 + .../custom-composer}/CustomComposer.tsx | 2 + .../hooks/demos/custom-composer/client.ts | 7 + .../hooks/demos/custom-composer/index.ts | 6 + .../efficient-thread}/EfficientThread.tsx | 2 + .../hooks/demos/efficient-thread/client.ts | 7 + .../hooks/demos/efficient-thread/index.ts | 6 + .../status-footer}/StatusFooter.tsx | 2 + .../hooks/demos/status-footer/client.ts | 7 + .../hooks/demos/status-footer/index.ts | 6 + docs/data/chat/material/hooks/hooks.md | 10 +- .../material/message-list/AutoScrollConfig.js | 44 - .../material/message-list/CompactVariant.js | 83 -- .../material/message-list/CompactVariant.tsx | 83 -- .../message-list/CompactVariant.tsx.preview | 12 - .../message-list/DateDividerFormat.js | 74 -- .../chat/material/message-list/DensityProp.js | 113 -- .../message-list/KeyboardNavigation.js | 94 -- .../message-list/KeyboardNavigation.tsx | 94 -- .../material/message-list/MessageGrouping.js | 81 -- .../message-list/MessageGrouping.tsx.preview | 15 - .../message-list/StandaloneMessageList.js | 51 - .../auto-scroll-config}/AutoScrollConfig.tsx | 2 + .../demos/auto-scroll-config/client.ts | 7 + .../demos/auto-scroll-config/index.ts | 6 + .../demos/compact-variant/CompactVariant.tsx | 85 ++ .../demos/compact-variant/client.ts | 7 + .../demos/compact-variant/index.ts | 6 + .../DateDividerFormat.tsx | 2 + .../demos/date-divider-format/client.ts | 7 + .../demos/date-divider-format/index.ts | 6 + .../{ => demos/density-prop}/DensityProp.tsx | 5 +- .../message-list/demos/density-prop/client.ts | 7 + .../message-list/demos/density-prop/index.ts | 6 + .../KeyboardNavigation.tsx | 96 ++ .../demos/keyboard-navigation/client.ts | 7 + .../demos/keyboard-navigation/index.ts | 6 + .../message-grouping}/MessageGrouping.tsx | 2 + .../demos/message-grouping/client.ts | 7 + .../demos/message-grouping/index.ts | 6 + .../StandaloneMessageList.tsx | 2 + .../demos/standalone-message-list/client.ts | 7 + .../demos/standalone-message-list/index.ts | 6 + .../material/message-list/message-list.md | 14 +- .../material/slot-overrides/FeatureFlags.js | 33 - .../slot-overrides/SlotBasicReplacement.js | 55 - .../SlotBasicReplacement.tsx.preview | 15 - .../slot-overrides/SlotPropsCustomization.js | 35 - .../slot-overrides/ThemeAndSlotCombination.js | 69 - .../feature-flags}/FeatureFlags.tsx | 2 + .../demos/feature-flags/client.ts | 7 + .../demos/feature-flags/index.ts | 6 + .../SlotBasicReplacement.tsx | 2 + .../demos/slot-basic-replacement/client.ts | 7 + .../demos/slot-basic-replacement/index.ts | 6 + .../SlotPropsCustomization.tsx | 2 + .../demos/slot-props-customization/client.ts | 7 + .../demos/slot-props-customization/index.ts | 6 + .../ThemeAndSlotCombination.tsx | 2 + .../theme-and-slot-combination/client.ts | 7 + .../demos/theme-and-slot-combination/index.ts | 6 + .../material/slot-overrides/slot-overrides.md | 8 +- .../material/tailwind/TailwindChatDemo.js | 125 -- .../tailwind-chat-demo}/TailwindChatDemo.tsx | 2 + .../demos/tailwind-chat-demo/client.ts | 7 + .../demos/tailwind-chat-demo/index.ts | 6 + docs/data/chat/material/tailwind/tailwind.md | 2 +- .../material/thread/AdaptiveSendButton.js | 57 - .../thread/AdaptiveSendButton.tsx.preview | 15 - .../chat/material/thread/BubbleWithStatus.js | 63 - .../thread/BubbleWithStatus.tsx.preview | 15 - .../chat/material/thread/GradientHeader.js | 43 - .../chat/material/thread/GradientHeader.tsx | 43 - .../thread/GradientHeader.tsx.preview | 15 - docs/data/chat/material/thread/PaperBubble.js | 65 - .../material/thread/PaperBubble.tsx.preview | 15 - .../material/thread/ThreadRecomposition.js | 80 -- .../AdaptiveSendButton.tsx | 2 + .../demos/adaptive-send-button/client.ts | 7 + .../demos/adaptive-send-button/index.ts | 6 + .../bubble-with-status}/BubbleWithStatus.tsx | 9 +- .../thread/demos/bubble-with-status/client.ts | 7 + .../thread/demos/bubble-with-status/index.ts | 6 + .../demos/gradient-header/GradientHeader.tsx | 45 + .../thread/demos/gradient-header/client.ts | 7 + .../thread/demos/gradient-header/index.ts | 6 + .../{ => demos/paper-bubble}/PaperBubble.tsx | 9 +- .../thread/demos/paper-bubble/client.ts | 7 + .../thread/demos/paper-bubble/index.ts | 6 + .../ThreadRecomposition.tsx | 2 + .../demos/thread-recomposition/client.ts | 7 + .../demos/thread-recomposition/index.ts | 6 + docs/data/chat/material/thread/thread.md | 12 +- .../ChatConversationHeaderPlayground.js | 184 --- .../CustomHeaderActions.js | 76 -- .../conversation-header/GradientHeader.js | 54 - .../conversation-header/GradientHeader.tsx | 54 - .../GradientHeader.tsx.preview | 16 - .../conversation-header/LiveTitle.js | 53 - .../conversation-header/LiveTitle.tsx.preview | 9 - .../conversation-header.md | 8 +- .../ChatConversationHeaderPlayground.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../CustomHeaderActions.tsx | 2 + .../demos/custom-header-actions/client.ts | 7 + .../demos/custom-header-actions/index.ts | 6 + .../demos/gradient-header/GradientHeader.tsx | 56 + .../demos/gradient-header/client.ts | 7 + .../demos/gradient-header/index.ts | 6 + .../{ => demos/live-title}/LiveTitle.tsx | 2 + .../demos/live-title/client.ts | 7 + .../demos/live-title/index.ts | 6 + .../ChatConversationListPlayground.js | 168 --- .../ConversationListFullCustomRow.js | 139 -- .../ConversationListFullCustomRow.tsx.preview | 16 - .../ConversationListVariants.js | 64 - .../conversation-list/conversation-list.md | 8 +- .../ChatConversationListPlayground.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../ConversationListFullCustomRow.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../ConversationListVariants.tsx | 2 + .../conversation-list-variants/client.ts | 7 + .../demos/conversation-list-variants/index.ts | 6 + .../HistoryPaginationDemo.js | 87 -- .../HistoryPaginationDemo.tsx.preview | 12 - .../HistoryPaginationDemo.tsx | 2 + .../demos/history-pagination-demo/client.ts | 7 + .../demos/history-pagination-demo/index.ts | 6 + .../history-and-pagination.md | 2 +- .../read-receipts/ReadReceiptsTwoPane.js | 210 --- .../ReadReceiptsTwoPane.tsx | 2 + .../demos/read-receipts-two-pane/client.ts | 7 + .../demos/read-receipts-two-pane/index.ts | 6 + .../read-receipts/read-receipts.md | 2 +- .../real-time-sync/RealtimeSyncSimulation.js | 276 ---- .../RealtimeSyncSimulation.tsx.preview | 8 - .../RealtimeSyncSimulation.tsx | 12 +- .../demos/realtime-sync-simulation/client.ts | 7 + .../demos/realtime-sync-simulation/index.ts | 6 + .../real-time-sync/real-time-sync.md | 2 +- docs/data/chat/quickstart/RenderChatBox.js | 36 - .../chat/quickstart/RenderChatBox.tsx.preview | 13 - .../render-chat-box}/RenderChatBox.tsx | 2 + .../demos/render-chat-box/client.ts | 7 + .../quickstart/demos/render-chat-box/index.ts | 6 + docs/data/chat/quickstart/quickstart.md | 4 +- .../events-and-callbacks/CallbackEventLog.js | 163 --- .../callback-event-log}/CallbackEventLog.tsx | 2 + .../demos/callback-event-log/client.ts | 7 + .../demos/callback-event-log/index.ts | 6 + .../events-and-callbacks.md | 2 +- .../chat/resources/hooks/HooksHeadlessChat.js | 145 --- .../HooksHeadlessChat.tsx | 2 + .../hooks/demos/hooks-headless-chat/client.ts | 7 + .../hooks/demos/hooks-headless-chat/index.ts | 6 + docs/data/chat/resources/hooks/hooks.md | 2 +- .../performance/RenderIsolationComparison.js | 260 ---- .../RenderIsolationComparison.tsx | 5 +- .../render-isolation-comparison/client.ts | 7 + .../render-isolation-comparison/index.ts | 6 + .../chat/resources/performance/performance.md | 2 +- .../chat/resources/selectors/selectors.md | 4 +- .../custom-components/CustomSlot.js | 12 - .../custom-components/CustomSlot.tsx.preview | 1 - .../CustomSlotAndSlotProps.js | 19 - .../CustomSlotAndSlotProps.tsx.preview | 8 - .../custom-components/CustomSlotProps.js | 17 - .../CustomSlotProps.tsx.preview | 7 - .../CustomSlotPropsCallback.js | 17 - .../CustomSlotPropsCallback.tsx.preview | 7 - .../custom-components/TypescriptCasting.js | 62 - .../TypescriptCasting.tsx.preview | 14 - .../custom-components/custom-components.md | 10 +- .../CustomSlotAndSlotProps.tsx | 2 + .../custom-slot-and-slot-props/client.ts | 7 + .../demos/custom-slot-and-slot-props/index.ts | 6 + .../CustomSlotPropsCallback.tsx | 2 + .../custom-slot-props-callback/client.ts | 7 + .../demos/custom-slot-props-callback/index.ts | 6 + .../custom-slot-props}/CustomSlotProps.tsx | 2 + .../demos/custom-slot-props/client.ts | 7 + .../demos/custom-slot-props/index.ts | 6 + .../{ => demos/custom-slot}/CustomSlot.tsx | 2 + .../demos/custom-slot/client.ts | 7 + .../demos/custom-slot/index.ts | 6 + .../typescript-casting}/TypescriptCasting.tsx | 8 +- .../demos/typescript-casting/client.ts | 7 + .../demos/typescript-casting/index.ts | 6 + .../accessibility/DensitySelectorGrid.js | 96 -- .../DensitySelectorGrid.tsx.preview | 7 - .../accessibility/FocusManagement.js | 48 - .../data-grid/accessibility/RowHeaderGrid.js | 21 - .../accessibility/RowHeaderGrid.tsx.preview | 1 - .../data-grid/accessibility/TabNavigation.js | 157 --- .../data-grid/accessibility/accessibility.md | 8 +- .../DensitySelectorGrid.tsx | 4 +- .../demos/density-selector-grid/client.ts | 7 + .../demos/density-selector-grid/index.ts | 6 + .../focus-management}/FocusManagement.tsx | 6 +- .../demos/focus-management/client.ts | 7 + .../demos/focus-management/index.ts | 6 + .../row-header-grid}/RowHeaderGrid.tsx | 4 +- .../demos/row-header-grid/client.ts | 7 + .../demos/row-header-grid/index.ts | 6 + .../tab-navigation}/TabNavigation.tsx | 6 +- .../demos/tab-navigation/client.ts | 7 + .../demos/tab-navigation/index.ts | 6 + .../AggregationColDefAggregable.js | 58 - .../AggregationColDefAggregable.tsx.preview | 11 - .../AggregationColDefNonAggregable.js | 59 - ...AggregationColDefNonAggregable.tsx.preview | 12 - .../aggregation/AggregationControlled.js | 46 - .../AggregationControlled.tsx.preview | 6 - .../aggregation/AggregationCustomFunction.js | 93 -- .../AggregationCustomFunction.tsx.preview | 16 - .../aggregation/AggregationDisabled.js | 16 - .../AggregationDisabled.tsx.preview | 5 - .../aggregation/AggregationFiltering.js | 52 - .../AggregationGetAggregationPosition.js | 74 -- ...regationGetAggregationPosition.tsx.preview | 10 - .../aggregation/AggregationInitialState.js | 46 - .../AggregationInitialState.tsx.preview | 11 - .../AggregationMultipleRowFields.js | 126 -- .../AggregationMultipleRowFields.tsx.preview | 11 - .../aggregation/AggregationPinnedRows.js | 188 --- .../AggregationRemoveFunctionAllColumns.js | 54 - ...gationRemoveFunctionAllColumns.tsx.preview | 16 - .../AggregationRemoveFunctionOneColumn.js | 53 - ...egationRemoveFunctionOneColumn.tsx.preview | 12 - .../aggregation/AggregationRenderCell.js | 56 - .../AggregationRenderCell.tsx.preview | 11 - .../aggregation/AggregationRowGrouping.js | 44 - .../AggregationRowGrouping.tsx.preview | 7 - .../aggregation/AggregationTreeData.js | 146 --- .../aggregation/AggregationValueFormatter.js | 73 -- .../AggregationValueFormatter.tsx.preview | 15 - .../data/data-grid/aggregation/aggregation.md | 34 +- .../AggregationColDefAggregable.tsx | 5 +- .../aggregation-col-def-aggregable/client.ts | 7 + .../aggregation-col-def-aggregable/index.ts | 6 + .../AggregationColDefNonAggregable.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../AggregationControlled.tsx | 9 +- .../demos/aggregation-controlled/client.ts | 7 + .../demos/aggregation-controlled/index.ts | 6 + .../AggregationCustomFunction.tsx | 5 +- .../aggregation-custom-function/client.ts | 7 + .../aggregation-custom-function/index.ts | 6 + .../AggregationDisabled.tsx | 2 + .../demos/aggregation-disabled/client.ts | 7 + .../demos/aggregation-disabled/index.ts | 6 + .../AggregationFiltering.tsx | 5 +- .../demos/aggregation-filtering/client.ts | 7 + .../demos/aggregation-filtering/index.ts | 6 + .../AggregationGetAggregationPosition.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../AggregationInitialState.tsx | 5 +- .../demos/aggregation-initial-state/client.ts | 7 + .../demos/aggregation-initial-state/index.ts | 6 + .../AggregationMultipleRowFields.tsx | 8 +- .../aggregation-multiple-row-fields/client.ts | 7 + .../aggregation-multiple-row-fields/index.ts | 6 + .../AggregationPinnedRows.tsx | 12 +- .../demos/aggregation-pinned-rows/client.ts | 7 + .../demos/aggregation-pinned-rows/index.ts | 6 + .../AggregationRemoveFunctionAllColumns.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../AggregationRemoveFunctionOneColumn.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../AggregationRenderCell.tsx | 5 +- .../demos/aggregation-render-cell/client.ts | 7 + .../demos/aggregation-render-cell/index.ts | 6 + .../AggregationRowGrouping.tsx | 2 + .../demos/aggregation-row-grouping/client.ts | 7 + .../demos/aggregation-row-grouping/index.ts | 6 + .../AggregationTreeData.tsx | 7 +- .../demos/aggregation-tree-data/client.ts | 7 + .../demos/aggregation-tree-data/index.ts | 6 + .../AggregationValueFormatter.tsx | 5 +- .../aggregation-value-formatter/client.ts | 7 + .../aggregation-value-formatter/index.ts | 6 + .../ai-assistant/AssistantWithCharts.js | 104 -- .../ai-assistant/AssistantWithDataSampling.js | 68 - .../ai-assistant/AssistantWithDataSource.js | 137 -- .../ai-assistant/AssistantWithExamples.js | 178 --- .../data-grid/ai-assistant/ai-assistant.md | 8 +- .../AssistantWithCharts.tsx | 4 +- .../demos/assistant-with-charts/client.ts | 7 + .../demos/assistant-with-charts/index.ts | 6 + .../AssistantWithDataSampling.tsx | 2 + .../assistant-with-data-sampling/client.ts | 7 + .../assistant-with-data-sampling/index.ts | 6 + .../AssistantWithDataSource.tsx | 10 +- .../assistant-with-data-source/client.ts | 7 + .../demos/assistant-with-data-source/index.ts | 6 + .../AssistantWithExamples.tsx | 2 + .../demos/assistant-with-examples/client.ts | 7 + .../demos/assistant-with-examples/index.ts | 6 + .../AccessDisabledColumnFeatures.js | 56 - .../AccessDisabledColumnFeatures.tsx.preview | 12 - .../data-grid/api-object/UseGridApiContext.js | 45 - .../api-object/UseGridApiContext.tsx.preview | 16 - .../data-grid/api-object/UseGridApiRef.js | 46 - .../api-object/UseGridApiRef.tsx.preview | 12 - docs/data/data-grid/api-object/api-object.md | 6 +- .../AccessDisabledColumnFeatures.tsx | 5 +- .../access-disabled-column-features/client.ts | 7 + .../access-disabled-column-features/index.ts | 6 + .../UseGridApiContext.tsx | 2 + .../demos/use-grid-api-context/client.ts | 7 + .../demos/use-grid-api-context/index.ts | 6 + .../use-grid-api-ref}/UseGridApiRef.tsx | 2 + .../demos/use-grid-api-ref/client.ts | 7 + .../demos/use-grid-api-ref/index.ts | 6 + .../cell-selection/CellSelectionApiNoSnap.js | 6 - .../CellSelectionFormulaField.js | 91 -- .../cell-selection/CellSelectionGrid.js | 30 - .../CellSelectionGrid.tsx.preview | 11 - .../CellSelectionRangeStyling.js | 51 - .../CellSelectionRangeStyling.tsx.preview | 1 - .../cell-selection/cell-selection.md | 8 +- .../CellSelectionApiNoSnap.tsx | 9 + .../cell-selection-api-no-snap/client.ts | 7 + .../demos/cell-selection-api-no-snap/index.ts | 6 + .../CellSelectionFormulaField.tsx | 7 +- .../cell-selection-formula-field/client.ts | 7 + .../cell-selection-formula-field/index.ts | 6 + .../CellSelectionGrid.tsx | 2 + .../demos/cell-selection-grid/client.ts | 7 + .../demos/cell-selection-grid/index.ts | 6 + .../CellSelectionRangeStyling.tsx | 2 + .../cell-selection-range-styling/client.ts | 7 + .../cell-selection-range-styling/index.ts | 6 + docs/data/data-grid/cells/LongTextCell.js | 170 --- .../data-grid/cells/LongTextCell.tsx.preview | 1 - docs/data/data-grid/cells/cells.md | 2 +- .../long-text-cell}/LongTextCell.tsx | 6 +- .../cells/demos/long-text-cell/client.ts | 7 + .../cells/demos/long-text-cell/index.ts | 6 + .../GridChartsIntegrationBasic.js | 58 - .../GridChartsIntegrationCustomization.js | 251 ---- .../GridChartsIntegrationDataSource.js | 164 --- .../GridChartsIntegrationLiveData.js | 169 --- .../GridChartsIntegrationLocalization.js | 151 --- .../GridChartsIntegrationMultipleCharts.js | 139 -- .../GridChartsIntegrationPivoting.js | 111 -- .../GridChartsIntegrationRowGrouping.js | 115 -- .../charts-integration/charts-integration.md | 16 +- .../GridChartsIntegrationBasic.tsx | 2 + .../grid-charts-integration-basic/client.ts | 7 + .../grid-charts-integration-basic/index.ts | 6 + .../GridChartsIntegrationCustomization.tsx | 20 +- .../client.ts | 7 + .../index.ts | 6 + .../GridChartsIntegrationDataSource.tsx | 12 +- .../client.ts | 7 + .../index.ts | 6 + .../GridChartsIntegrationLiveData.tsx | 9 +- .../client.ts | 7 + .../index.ts | 6 + .../GridChartsIntegrationLocalization.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../GridChartsIntegrationMultipleCharts.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../GridChartsIntegrationPivoting.tsx | 5 +- .../client.ts | 7 + .../grid-charts-integration-pivoting/index.ts | 6 + .../GridChartsIntegrationRowGrouping.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../clipboard/CellSelectionFillHandle.js | 98 -- .../CellSelectionFillHandle.tsx.preview | 8 - .../data/data-grid/clipboard/ClipboardCopy.js | 55 - .../clipboard/ClipboardCopyAddRows.js | 64 - .../clipboard/ClipboardCopyButton.js | 113 -- .../data-grid/clipboard/ClipboardPaste.js | 36 - .../clipboard/ClipboardPaste.tsx.preview | 9 - .../clipboard/ClipboardPasteDelimiter.js | 37 - .../ClipboardPasteDelimiter.tsx.preview | 11 - .../clipboard/ClipboardPasteDisabled.js | 17 - .../ClipboardPasteDisabled.tsx.preview | 1 - .../clipboard/ClipboardPasteEvents.js | 116 -- .../clipboard/ClipboardPasteIsCellEditable.js | 102 -- .../ClipboardPasteIsCellEditable.tsx.preview | 8 - .../clipboard/ClipboardPastePersistence.js | 262 ---- .../ClipboardPastePersistence.tsx.preview | 15 - docs/data/data-grid/clipboard/clipboard.md | 20 +- .../CellSelectionFillHandle.tsx | 9 +- .../cell-selection-fill-handle/client.ts | 7 + .../demos/cell-selection-fill-handle/index.ts | 6 + .../ClipboardCopyAddRows.tsx | 9 +- .../demos/clipboard-copy-add-rows/client.ts | 7 + .../demos/clipboard-copy-add-rows/index.ts | 6 + .../ClipboardCopyButton.tsx | 4 +- .../demos/clipboard-copy-button/client.ts | 7 + .../demos/clipboard-copy-button/index.ts | 6 + .../clipboard-copy}/ClipboardCopy.tsx | 2 + .../clipboard/demos/clipboard-copy/client.ts | 7 + .../clipboard/demos/clipboard-copy/index.ts | 6 + .../ClipboardPasteDelimiter.tsx | 2 + .../demos/clipboard-paste-delimiter/client.ts | 7 + .../demos/clipboard-paste-delimiter/index.ts | 6 + .../ClipboardPasteDisabled.tsx | 2 + .../demos/clipboard-paste-disabled/client.ts | 7 + .../demos/clipboard-paste-disabled/index.ts | 6 + .../ClipboardPasteEvents.tsx | 5 +- .../demos/clipboard-paste-events/client.ts | 7 + .../demos/clipboard-paste-events/index.ts | 6 + .../ClipboardPasteIsCellEditable.tsx | 9 +- .../client.ts | 7 + .../clipboard-paste-is-cell-editable/index.ts | 6 + .../ClipboardPastePersistence.tsx | 6 +- .../clipboard-paste-persistence/client.ts | 7 + .../clipboard-paste-persistence/index.ts | 6 + .../clipboard-paste}/ClipboardPaste.tsx | 2 + .../clipboard/demos/clipboard-paste/client.ts | 7 + .../clipboard/demos/clipboard-paste/index.ts | 6 + .../column-definition/ActionsWithModalGrid.js | 94 -- .../column-definition/AutogeneratedRows.js | 56 - .../AutogeneratedRows.tsx.preview | 12 - .../column-definition/BasicColumnsGrid.js | 19 - .../BasicColumnsGrid.tsx.preview | 10 - .../column-definition/ColumnTypesGrid.js | 168 --- .../ColumnTypesGrid.tsx.preview | 3 - .../column-definition/MultiSelectColumn.js | 69 - .../MultiSelectColumn.tsx.preview | 1 - .../column-definition/MultiSelectKeyboard.js | 36 - .../MultiSelectKeyboard.tsx.preview | 1 - .../column-definition/RenderCellGrid.js | 75 -- .../RenderCellGrid.tsx.preview | 1 - .../column-definition/RenderExpandCellGrid.js | 170 --- .../RenderExpandCellGrid.tsx.preview | 1 - .../column-definition/ValueFormatterGrid.js | 46 - .../column-definition/ValueGetterGrid.js | 34 - .../ValueGetterGrid.tsx.preview | 1 - .../column-definition/column-definition.md | 20 +- .../ActionsWithModalGrid.tsx | 12 +- .../demos/actions-with-modal-grid/client.ts | 7 + .../demos/actions-with-modal-grid/index.ts | 6 + .../autogenerated-rows}/AutogeneratedRows.tsx | 4 +- .../demos/autogenerated-rows/client.ts | 7 + .../demos/autogenerated-rows/index.ts | 6 + .../basic-columns-grid}/BasicColumnsGrid.tsx | 2 + .../demos/basic-columns-grid/client.ts | 7 + .../demos/basic-columns-grid/index.ts | 6 + .../column-types-grid}/ColumnTypesGrid.tsx | 12 +- .../demos/column-types-grid/client.ts | 7 + .../demos/column-types-grid/index.ts | 6 + .../MultiSelectColumn.tsx | 4 +- .../demos/multi-select-column/client.ts | 7 + .../demos/multi-select-column/index.ts | 6 + .../MultiSelectKeyboard.tsx | 4 +- .../demos/multi-select-keyboard/client.ts | 7 + .../demos/multi-select-keyboard/index.ts | 6 + .../render-cell-grid}/RenderCellGrid.tsx | 6 +- .../demos/render-cell-grid/client.ts | 7 + .../demos/render-cell-grid/index.ts | 6 + .../RenderExpandCellGrid.tsx | 4 +- .../demos/render-expand-cell-grid/client.ts | 7 + .../demos/render-expand-cell-grid/index.ts | 6 + .../ValueFormatterGrid.tsx | 2 + .../demos/value-formatter-grid/client.ts | 7 + .../demos/value-formatter-grid/index.ts | 6 + .../value-getter-grid}/ValueGetterGrid.tsx | 4 +- .../demos/value-getter-grid/client.ts | 7 + .../demos/value-getter-grid/index.ts | 6 + .../column-dimensions/ColumnAutosizing.js | 144 --- .../ColumnAutosizingAsync.js | 116 -- .../ColumnAutosizingDynamicRowHeight.js | 63 - .../ColumnAutosizingGroupedRows.js | 45 - .../ColumnAutosizingGroupedRows.tsx.preview | 7 - .../ColumnAutosizingHeaderFilters.js | 61 - .../ColumnAutosizingHeaderFilters.tsx.preview | 9 - .../ColumnAutosizingVirtualized.js | 59 - .../ColumnAutosizingVirtualized.tsx.preview | 13 - .../column-dimensions/ColumnFluidWidthGrid.js | 36 - .../column-dimensions/ColumnMinWidthGrid.js | 23 - .../ColumnMinWidthGrid.tsx.preview | 7 - .../column-dimensions/ColumnSizingGrid.js | 30 - .../ColumnSizingGrid.tsx.preview | 14 - .../column-dimensions/ColumnWidthGrid.js | 23 - .../ColumnWidthGrid.tsx.preview | 7 - .../column-dimensions/column-dimensions.md | 20 +- .../ColumnAutosizingAsync.tsx | 7 +- .../demos/column-autosizing-async/client.ts | 7 + .../demos/column-autosizing-async/index.ts | 6 + .../ColumnAutosizingDynamicRowHeight.tsx | 11 +- .../client.ts | 7 + .../index.ts | 6 + .../ColumnAutosizingGroupedRows.tsx | 8 +- .../column-autosizing-grouped-rows/client.ts | 7 + .../column-autosizing-grouped-rows/index.ts | 6 + .../ColumnAutosizingHeaderFilters.tsx | 2 + .../client.ts | 7 + .../column-autosizing-header-filters/index.ts | 6 + .../ColumnAutosizingVirtualized.tsx | 5 +- .../column-autosizing-virtualized/client.ts | 7 + .../column-autosizing-virtualized/index.ts | 6 + .../column-autosizing}/ColumnAutosizing.tsx | 2 + .../demos/column-autosizing/client.ts | 7 + .../demos/column-autosizing/index.ts | 6 + .../ColumnFluidWidthGrid.tsx | 2 + .../demos/column-fluid-width-grid/client.ts | 7 + .../demos/column-fluid-width-grid/index.ts | 6 + .../ColumnMinWidthGrid.tsx | 2 + .../demos/column-min-width-grid/client.ts | 7 + .../demos/column-min-width-grid/index.ts | 6 + .../column-sizing-grid}/ColumnSizingGrid.tsx | 2 + .../demos/column-sizing-grid/client.ts | 7 + .../demos/column-sizing-grid/index.ts | 6 + .../column-width-grid}/ColumnWidthGrid.tsx | 2 + .../demos/column-width-grid/client.ts | 7 + .../demos/column-width-grid/index.ts | 6 + .../column-groups/BasicGroupingDemo.js | 67 - .../BasicGroupingDemo.tsx.preview | 7 - .../column-groups/BreakingGroupDemo.js | 65 - .../BreakingGroupDemo.tsx.preview | 7 - .../column-groups/CollapsibleColumnGroups.js | 122 -- .../CollapsibleColumnGroups.tsx.preview | 7 - .../column-groups/CustomizationDemo.js | 112 -- .../CustomizationDemo.tsx.preview | 7 - .../column-groups/GroupHeaderHeight.js | 66 - .../GroupHeaderHeight.tsx.preview | 6 - .../data-grid/column-groups/column-groups.md | 10 +- .../BasicGroupingDemo.tsx | 5 +- .../demos/basic-grouping-demo/client.ts | 7 + .../demos/basic-grouping-demo/index.ts | 6 + .../BreakingGroupDemo.tsx | 9 +- .../demos/breaking-group-demo/client.ts | 7 + .../demos/breaking-group-demo/index.ts | 6 + .../CollapsibleColumnGroups.tsx | 8 +- .../demos/collapsible-column-groups/client.ts | 7 + .../demos/collapsible-column-groups/index.ts | 6 + .../customization-demo}/CustomizationDemo.tsx | 6 +- .../demos/customization-demo/client.ts | 7 + .../demos/customization-demo/index.ts | 6 + .../GroupHeaderHeight.tsx | 5 +- .../demos/group-header-height/client.ts | 7 + .../demos/group-header-height/index.ts | 6 + .../column-header/HeaderColumnsGrid.js | 29 - .../HeaderColumnsGrid.tsx.preview | 13 - .../data-grid/column-header/HeaderHeight.js | 28 - .../column-header/HeaderHeight.tsx.preview | 1 - .../column-header/RenderHeaderGrid.js | 41 - .../RenderHeaderGrid.tsx.preview | 1 - .../data-grid/column-header/column-header.md | 6 +- .../HeaderColumnsGrid.tsx | 2 + .../demos/header-columns-grid/client.ts | 7 + .../demos/header-columns-grid/index.ts | 6 + .../header-height}/HeaderHeight.tsx | 4 +- .../demos/header-height/client.ts | 7 + .../demos/header-height/index.ts | 6 + .../render-header-grid}/RenderHeaderGrid.tsx | 4 +- .../demos/render-header-grid/client.ts | 7 + .../demos/render-header-grid/index.ts | 6 + .../column-menu/AddNewColumnMenuGrid.js | 53 - .../AddNewColumnMenuGrid.tsx.preview | 1 - .../data-grid/column-menu/ColumnMenuGrid.js | 16 - .../column-menu/ColumnMenuGrid.tsx.preview | 1 - .../column-menu/ColumnMenuGridPremium.js | 58 - .../ColumnMenuGridPremium.tsx.preview | 7 - .../column-menu/ColumnMenuGridPremiumSnap.tsx | 6 +- .../ColumnMenuGridReferencesNoSnap.js | 150 --- ...ColumnMenuGridReferencesNoSnap.tsx.preview | 1 - .../column-menu/CustomColumnMenuGrid.js | 61 - .../CustomColumnMenuGrid.tsx.preview | 6 - .../column-menu/DisabledColumnMenuGrid.js | 16 - .../DisabledColumnMenuGrid.tsx.preview | 1 - .../column-menu/HideColumnMenuGrid.js | 28 - .../HideColumnMenuGrid.tsx.preview | 1 - .../column-menu/OverrideColumnMenuGrid.js | 53 - .../OverrideColumnMenuGrid.tsx.preview | 1 - .../column-menu/ReorderColumnMenuGrid.js | 33 - .../ReorderColumnMenuGrid.tsx.preview | 1 - .../data/data-grid/column-menu/column-menu.md | 18 +- .../AddNewColumnMenuGrid.tsx | 10 +- .../demos/add-new-column-menu-grid/client.ts | 7 + .../demos/add-new-column-menu-grid/index.ts | 6 + .../ColumnMenuGridPremium.tsx | 8 +- .../demos/column-menu-grid-premium/client.ts | 7 + .../demos/column-menu-grid-premium/index.ts | 6 + .../ColumnMenuGridReferencesNoSnap.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../column-menu-grid}/ColumnMenuGrid.tsx | 2 + .../demos/column-menu-grid/client.ts | 7 + .../demos/column-menu-grid/index.ts | 6 + .../CustomColumnMenuGrid.tsx | 5 +- .../demos/custom-column-menu-grid/client.ts | 7 + .../demos/custom-column-menu-grid/index.ts | 6 + .../DisabledColumnMenuGrid.tsx | 2 + .../demos/disabled-column-menu-grid/client.ts | 7 + .../demos/disabled-column-menu-grid/index.ts | 6 + .../HideColumnMenuGrid.tsx | 5 +- .../demos/hide-column-menu-grid/client.ts | 7 + .../demos/hide-column-menu-grid/index.ts | 6 + .../OverrideColumnMenuGrid.tsx | 11 +- .../demos/override-column-menu-grid/client.ts | 7 + .../demos/override-column-menu-grid/index.ts | 6 + .../ReorderColumnMenuGrid.tsx | 5 +- .../demos/reorder-column-menu-grid/client.ts | 7 + .../demos/reorder-column-menu-grid/index.ts | 6 + .../ColumnOrderingDisabledGrid.js | 24 - .../ColumnOrderingDisabledGrid.tsx.preview | 8 - .../column-ordering/ColumnOrderingGrid.js | 16 - .../ColumnOrderingGrid.tsx.preview | 1 - .../column-ordering/column-ordering.md | 4 +- .../ColumnOrderingDisabledGrid.tsx | 2 + .../column-ordering-disabled-grid/client.ts | 7 + .../column-ordering-disabled-grid/index.ts | 6 + .../ColumnOrderingGrid.tsx | 2 + .../demos/column-ordering-grid/client.ts | 7 + .../demos/column-ordering-grid/index.ts | 6 + .../column-pinning/BasicColumnPinning.js | 139 -- .../BasicColumnPinning.tsx.preview | 5 - .../column-pinning/ColumnPinningApiNoSnap.js | 6 - .../ColumnPinningAutogeneratedColumns.js | 111 -- ...umnPinningAutogeneratedColumns.tsx.preview | 15 - .../ColumnPinningDynamicRowHeight.js | 177 --- .../ColumnPinningDynamicRowHeight.tsx.preview | 12 - .../ColumnPinningSectionSeparator.js | 173 --- .../column-pinning/ControlPinnedColumns.js | 99 -- .../ControlPinnedColumns.tsx.preview | 11 - .../DisableColumnPinningButtons.js | 83 -- .../DisableColumnPinningButtons.tsx.preview | 6 - .../column-pinning/column-pinning.md | 14 +- .../BasicColumnPinning.tsx | 5 +- .../demos/basic-column-pinning/client.ts | 7 + .../demos/basic-column-pinning/index.ts | 6 + .../ColumnPinningApiNoSnap.tsx | 9 + .../column-pinning-api-no-snap/client.ts | 7 + .../demos/column-pinning-api-no-snap/index.ts | 6 + .../ColumnPinningAutogeneratedColumns.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ColumnPinningDynamicRowHeight.tsx | 10 +- .../client.ts | 7 + .../index.ts | 6 + .../ColumnPinningSectionSeparator.tsx | 10 +- .../client.ts | 7 + .../column-pinning-section-separator/index.ts | 6 + .../ControlPinnedColumns.tsx | 6 +- .../demos/control-pinned-columns/client.ts | 7 + .../demos/control-pinned-columns/index.ts | 6 + .../DisableColumnPinningButtons.tsx | 5 +- .../disable-column-pinning-buttons/client.ts | 7 + .../disable-column-pinning-buttons/index.ts | 6 + .../ColumnSizingPersistWidthOrder.js | 87 -- .../ColumnSizingPersistWidthOrder.tsx.preview | 12 - .../ColumnSizingPersistWidthPivoting.js | 201 --- .../LongTextCustomPopupContent.js | 148 --- .../LongTextCustomPopupContent.tsx.preview | 1 - .../column-recipes/MultiSelectCustomChips.js | 188 --- .../MultiSelectCustomChips.tsx.preview | 1 - .../ColumnSizingPersistWidthOrder.tsx | 10 +- .../client.ts | 7 + .../index.ts | 6 + .../ColumnSizingPersistWidthPivoting.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../LongTextCustomPopupContent.tsx | 4 +- .../long-text-custom-popup-content/client.ts | 7 + .../long-text-custom-popup-content/index.ts | 6 + .../MultiSelectCustomChips.tsx | 8 +- .../demos/multi-select-custom-chips/client.ts | 7 + .../demos/multi-select-custom-chips/index.ts | 6 + docs/data/data-grid/column-recipes/index.md | 8 +- .../column-spanning/ColumnSpanningDerived.js | 187 --- .../ColumnSpanningDerived.tsx.preview | 15 - .../column-spanning/ColumnSpanningFunction.js | 118 -- .../ColumnSpanningFunction.tsx.preview | 10 - .../column-spanning/ColumnSpanningNumber.js | 39 - .../ColumnSpanningNumber.tsx.preview | 14 - .../column-spanning/column-spanning.md | 6 +- .../ColumnSpanningDerived.tsx | 5 +- .../demos/column-spanning-derived/client.ts | 7 + .../demos/column-spanning-derived/index.ts | 6 + .../ColumnSpanningFunction.tsx | 5 +- .../demos/column-spanning-function/client.ts | 7 + .../demos/column-spanning-function/index.ts | 6 + .../ColumnSpanningNumber.tsx | 2 + .../demos/column-spanning-number/client.ts | 7 + .../demos/column-spanning-number/index.ts | 6 + .../ColumnSelectorDisabledGrid.js | 65 - .../column-visibility/ColumnSelectorGrid.js | 16 - .../ColumnSelectorGrid.tsx.preview | 1 - .../ColumnSelectorGridCustomizeColumns.js | 51 - ...mnSelectorGridCustomizeColumns.tsx.preview | 11 - .../ColumnSelectorGridToggleAllMode.js | 24 - ...olumnSelectorGridToggleAllMode.tsx.preview | 9 - .../VisibleColumnsBasicExample.js | 32 - .../VisibleColumnsBasicExample.tsx.preview | 9 - .../VisibleColumnsModelControlled.js | 30 - .../VisibleColumnsModelControlled.tsx.preview | 8 - .../VisibleColumnsModelInitialState.js | 30 - ...isibleColumnsModelInitialState.tsx.preview | 15 - .../column-visibility/column-visibility.md | 14 +- .../ColumnSelectorDisabledGrid.tsx | 5 +- .../column-selector-disabled-grid/client.ts | 7 + .../column-selector-disabled-grid/index.ts | 6 + .../ColumnSelectorGridCustomizeColumns.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../ColumnSelectorGridToggleAllMode.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../ColumnSelectorGrid.tsx | 2 + .../demos/column-selector-grid/client.ts | 7 + .../demos/column-selector-grid/index.ts | 6 + .../VisibleColumnsBasicExample.tsx | 2 + .../visible-columns-basic-example/client.ts | 7 + .../visible-columns-basic-example/index.ts | 6 + .../VisibleColumnsModelControlled.tsx | 5 +- .../client.ts | 7 + .../visible-columns-model-controlled/index.ts | 6 + .../VisibleColumnsModelInitialState.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../data-grid/components/CellWithPopover.js | 63 - .../data-grid/components/CustomColumnMenu.js | 123 -- .../components/CustomColumnsPanel.js | 194 --- .../components/CustomColumnsPanel.tsx.preview | 14 - .../data/data-grid/components/CustomFooter.js | 55 - .../components/CustomPaginationGrid.js | 55 - .../CustomPaginationGrid.tsx.preview | 16 - .../data-grid/components/CustomSortIcons.js | 53 - .../components/CustomSortIcons.tsx.preview | 12 - .../data-grid/components/CustomToolbarGrid.js | 57 - .../components/CustomToolbarGrid.tsx.preview | 7 - .../data-grid/components/RowContextMenu.js | 124 -- docs/data/data-grid/components/ToolbarGrid.js | 16 - .../components/ToolbarGrid.tsx.preview | 1 - .../GridAiAssistantPanelTrigger.js | 43 - .../GridAiAssistantPanelTrigger.tsx.preview | 8 - .../ai-assistant-panel/ai-assistant-panel.md | 2 +- .../GridAiAssistantPanelTrigger.tsx | 2 + .../grid-ai-assistant-panel-trigger/client.ts | 7 + .../grid-ai-assistant-panel-trigger/index.ts | 6 + .../charts-panel/GridChartsPanelTrigger.js | 63 - .../components/charts-panel/charts-panel.md | 2 +- .../GridChartsPanelTrigger.tsx | 2 + .../demos/grid-charts-panel-trigger/client.ts | 7 + .../demos/grid-charts-panel-trigger/index.ts | 6 + .../columns-panel/GridColumnsPanelTrigger.js | 40 - .../GridColumnsPanelTrigger.tsx.preview | 6 - .../components/columns-panel/columns-panel.md | 2 +- .../GridColumnsPanelTrigger.tsx | 2 + .../grid-columns-panel-trigger/client.ts | 7 + .../demos/grid-columns-panel-trigger/index.ts | 6 + docs/data/data-grid/components/components.md | 20 +- .../GridComputedColumnsPanelTrigger.js | 68 - .../computed-columns-panel.md | 2 +- .../GridComputedColumnsPanelTrigger.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../cell-with-popover}/CellWithPopover.tsx | 2 + .../demos/cell-with-popover/client.ts | 7 + .../demos/cell-with-popover/index.ts | 6 + .../custom-column-menu}/CustomColumnMenu.tsx | 8 +- .../demos/custom-column-menu/client.ts | 7 + .../demos/custom-column-menu/index.ts | 6 + .../CustomColumnsPanel.tsx | 14 +- .../demos/custom-columns-panel/client.ts | 7 + .../demos/custom-columns-panel/index.ts | 6 + .../custom-footer}/CustomFooter.tsx | 5 +- .../components/demos/custom-footer/client.ts | 7 + .../components/demos/custom-footer/index.ts | 6 + .../CustomPaginationGrid.tsx | 4 +- .../demos/custom-pagination-grid/client.ts | 7 + .../demos/custom-pagination-grid/index.ts | 6 + .../custom-sort-icons}/CustomSortIcons.tsx | 2 + .../demos/custom-sort-icons/client.ts | 7 + .../demos/custom-sort-icons/index.ts | 6 + .../CustomToolbarGrid.tsx | 2 + .../demos/custom-toolbar-grid/client.ts | 7 + .../demos/custom-toolbar-grid/index.ts | 6 + .../row-context-menu}/RowContextMenu.tsx | 2 + .../demos/row-context-menu/client.ts | 7 + .../demos/row-context-menu/index.ts | 6 + .../{ => demos/toolbar-grid}/ToolbarGrid.tsx | 2 + .../components/demos/toolbar-grid/client.ts | 7 + .../components/demos/toolbar-grid/index.ts | 6 + .../components/export/GridExportMenu.js | 80 -- .../export/GridExportMenu.tsx.preview | 6 - .../components/export/GridExportTrigger.js | 47 - .../export/GridExportTrigger.tsx.preview | 6 - .../grid-export-menu}/GridExportMenu.tsx | 2 + .../export/demos/grid-export-menu/client.ts | 7 + .../export/demos/grid-export-menu/index.ts | 6 + .../GridExportTrigger.tsx | 2 + .../demos/grid-export-trigger/client.ts | 7 + .../export/demos/grid-export-trigger/index.ts | 6 + .../data-grid/components/export/export.md | 4 +- .../FilterPanelTriggerDescription.js | 77 -- .../FilterPanelTriggerDescription.tsx.preview | 14 - .../filter-panel/GridFilterPanelTrigger.js | 40 - .../GridFilterPanelTrigger.tsx.preview | 6 - .../FilterPanelTriggerDescription.tsx | 2 + .../client.ts | 7 + .../filter-panel-trigger-description/index.ts | 6 + .../GridFilterPanelTrigger.tsx | 2 + .../demos/grid-filter-panel-trigger/client.ts | 7 + .../demos/grid-filter-panel-trigger/index.ts | 6 + .../components/filter-panel/filter-panel.md | 4 +- .../components/formula-bar/GridFormulaBar.js | 50 - .../formula-bar/GridFormulaBar.tsx.preview | 11 - .../grid-formula-bar}/GridFormulaBar.tsx | 5 +- .../demos/grid-formula-bar/client.ts | 7 + .../demos/grid-formula-bar/index.ts | 6 + .../components/formula-bar/formula-bar.md | 2 +- .../pivot-panel/GridPivotPanelTrigger.js | 47 - .../GridPivotPanelTrigger.tsx.preview | 6 - .../GridPivotPanelTrigger.tsx | 2 + .../demos/grid-pivot-panel-trigger/client.ts | 7 + .../demos/grid-pivot-panel-trigger/index.ts | 6 + .../components/pivot-panel/pivot-panel.md | 2 +- .../prompt-field/GridPromptField.js | 143 --- .../prompt-field/GridPromptField.tsx.preview | 8 - .../grid-prompt-field}/GridPromptField.tsx | 2 + .../demos/grid-prompt-field/client.ts | 7 + .../demos/grid-prompt-field/index.ts | 6 + .../components/prompt-field/prompt-field.md | 2 +- .../quick-filter/GridControlledQuickFilter.js | 136 -- .../GridControlledQuickFilter.tsx.preview | 6 - .../quick-filter/GridPersistentQuickFilter.js | 80 -- .../GridPersistentQuickFilter.tsx.preview | 6 - .../quick-filter/GridQuickFilter.js | 117 -- .../quick-filter/GridQuickFilter.tsx.preview | 6 - .../GridUncontrolledQuickFilter.js | 117 -- .../GridUncontrolledQuickFilter.tsx.preview | 6 - .../GridControlledQuickFilter.tsx | 2 + .../grid-controlled-quick-filter/client.ts | 7 + .../grid-controlled-quick-filter/index.ts | 6 + .../GridPersistentQuickFilter.tsx | 2 + .../grid-persistent-quick-filter/client.ts | 7 + .../grid-persistent-quick-filter/index.ts | 6 + .../grid-quick-filter}/GridQuickFilter.tsx | 2 + .../demos/grid-quick-filter/client.ts | 7 + .../demos/grid-quick-filter/index.ts | 6 + .../GridUncontrolledQuickFilter.tsx | 2 + .../grid-uncontrolled-quick-filter/client.ts | 7 + .../grid-uncontrolled-quick-filter/index.ts | 6 + .../components/quick-filter/quick-filter.md | 8 +- .../components/toolbar/GridToolbar.js | 188 --- .../toolbar/GridToolbar.tsx.preview | 6 - .../components/toolbar/GridToolbarCustom.js | 140 -- .../toolbar/GridToolbarCustom.tsx.preview | 10 - .../toolbar/GridToolbarCustomPanel.js | 155 --- .../GridToolbarCustomPanel.tsx.preview | 6 - .../toolbar/GridToolbarFilterBar.js | 107 -- .../toolbar/GridToolbarFilterBar.tsx.preview | 14 - .../toolbar/GridToolbarRowGrouping.js | 205 --- .../GridToolbarRowGrouping.tsx.preview | 8 - .../toolbar/GridToolbarSettingsMenu.js | 149 --- .../GridToolbarSettingsMenu.tsx.preview | 15 - .../toolbar/GridToolbarStyleReuse.js | 34 - .../toolbar/GridToolbarStyleReuse.tsx.preview | 16 - .../GridToolbarCustomPanel.tsx | 2 + .../demos/grid-toolbar-custom-panel/client.ts | 7 + .../demos/grid-toolbar-custom-panel/index.ts | 6 + .../GridToolbarCustom.tsx | 4 +- .../demos/grid-toolbar-custom/client.ts | 7 + .../demos/grid-toolbar-custom/index.ts | 6 + .../GridToolbarFilterBar.tsx | 10 +- .../demos/grid-toolbar-filter-bar/client.ts | 7 + .../demos/grid-toolbar-filter-bar/index.ts | 6 + .../GridToolbarRowGrouping.tsx | 2 + .../demos/grid-toolbar-row-grouping/client.ts | 7 + .../demos/grid-toolbar-row-grouping/index.ts | 6 + .../GridToolbarSettingsMenu.tsx | 5 +- .../grid-toolbar-settings-menu/client.ts | 7 + .../demos/grid-toolbar-settings-menu/index.ts | 6 + .../GridToolbarStyleReuse.tsx | 2 + .../demos/grid-toolbar-style-reuse/client.ts | 7 + .../demos/grid-toolbar-style-reuse/index.ts | 6 + .../{ => demos/grid-toolbar}/GridToolbar.tsx | 2 + .../toolbar/demos/grid-toolbar/client.ts | 7 + .../toolbar/demos/grid-toolbar/index.ts | 6 + .../data-grid/components/toolbar/toolbar.md | 14 +- .../custom-columns/CustomColumnFullExample.js | 159 --- .../CustomColumnFullExample.tsx.preview | 1 - .../custom-columns/CustomColumnTypesGrid.js | 59 - .../CustomColumnTypesGrid.tsx.preview | 8 - .../custom-columns/EditingWithDatePickers.js | 193 --- .../EditingWithDatePickers.tsx.preview | 3 - .../custom-columns/SparklineColumn.js | 195 --- .../SparklineColumn.tsx.preview | 1 - .../custom-columns/cell-renderers/avatar.tsx | 2 +- .../custom-columns/cell-renderers/country.tsx | 4 +- .../custom-columns/cell-renderers/email.tsx | 2 +- .../cell-renderers/incoterm.tsx | 7 +- .../cell-renderers/progress.tsx | 7 +- .../custom-columns/cell-renderers/rating.tsx | 4 +- .../cell-renderers/sparkline.tsx | 2 +- .../custom-columns/cell-renderers/status.tsx | 9 +- .../custom-columns/custom-columns.md | 8 +- .../CustomColumnFullExample.tsx | 26 +- .../custom-column-full-example/client.ts | 7 + .../demos/custom-column-full-example/index.ts | 6 + .../CustomColumnTypesGrid.tsx | 5 +- .../demos/custom-column-types-grid/client.ts | 7 + .../demos/custom-column-types-grid/index.ts | 6 + .../EditingWithDatePickers.tsx | 14 +- .../demos/editing-with-date-pickers/client.ts | 7 + .../demos/editing-with-date-pickers/index.ts | 6 + .../sparkline-column}/SparklineColumn.tsx | 6 +- .../demos/sparkline-column/client.ts | 7 + .../demos/sparkline-column/index.ts | 6 + .../editing/AskConfirmationBeforeSave.js | 189 --- .../AskConfirmationBeforeSave.tsx.preview | 7 - .../editing/AutoStopEditComponent.js | 73 -- .../editing/AutoStopEditComponent.tsx.preview | 1 - .../data-grid/editing/BasicEditingGrid.js | 90 -- .../editing/BasicEditingGrid.tsx.preview | 1 - .../data-grid/editing/BasicRowEditingGrid.js | 90 -- .../editing/BasicRowEditingGrid.tsx.preview | 1 - .../data-grid/editing/CustomEditComponent.js | 76 -- .../editing/CustomEditComponent.tsx.preview | 1 - .../editing/DisableStopEditModeOnFocusOut.js | 86 -- .../DisableStopEditModeOnFocusOut.tsx.preview | 9 - docs/data/data-grid/editing/EditApiNoSnap.js | 6 - .../data-grid/editing/FullFeaturedCrudGrid.js | 285 ---- .../editing/FullFeaturedCrudGrid.tsx.preview | 16 - .../data-grid/editing/IsCellEditableGrid.js | 94 -- .../editing/IsCellEditableGrid.tsx.preview | 5 - .../editing/ServerSidePersistence.js | 132 -- .../editing/ServerSidePersistence.tsx.preview | 16 - .../data-grid/editing/StartEditButtonGrid.js | 197 --- .../editing/ValidateServerNameGrid.js | 123 -- .../ValidateServerNameGrid.tsx.preview | 7 - .../editing/ValueParserSetterGrid.js | 49 - .../editing/ValueParserSetterGrid.tsx.preview | 1 - .../editing/custom-edit-component.md | 4 +- .../AskConfirmationBeforeSave.tsx | 9 +- .../ask-confirmation-before-save/client.ts | 7 + .../ask-confirmation-before-save/index.ts | 6 + .../AutoStopEditComponent.tsx | 12 +- .../demos/auto-stop-edit-component/client.ts | 7 + .../demos/auto-stop-edit-component/index.ts | 6 + .../basic-editing-grid}/BasicEditingGrid.tsx | 4 +- .../demos/basic-editing-grid/client.ts | 7 + .../editing/demos/basic-editing-grid/index.ts | 6 + .../BasicRowEditingGrid.tsx | 4 +- .../demos/basic-row-editing-grid/client.ts | 7 + .../demos/basic-row-editing-grid/index.ts | 6 + .../CustomEditComponent.tsx | 9 +- .../demos/custom-edit-component/client.ts | 7 + .../demos/custom-edit-component/index.ts | 6 + .../DisableStopEditModeOnFocusOut.tsx | 7 +- .../client.ts | 7 + .../index.ts | 6 + .../demos/edit-api-no-snap/EditApiNoSnap.tsx | 9 + .../editing/demos/edit-api-no-snap/client.ts | 7 + .../editing/demos/edit-api-no-snap/index.ts | 6 + .../FullFeaturedCrudGrid.tsx | 16 +- .../demos/full-featured-crud-grid/client.ts | 7 + .../demos/full-featured-crud-grid/index.ts | 6 + .../IsCellEditableGrid.tsx | 5 +- .../demos/is-cell-editable-grid/client.ts | 7 + .../demos/is-cell-editable-grid/index.ts | 6 + .../ServerSidePersistence.tsx | 9 +- .../demos/server-side-persistence/client.ts | 7 + .../demos/server-side-persistence/index.ts | 6 + .../StartEditButtonGrid.tsx | 9 +- .../demos/start-edit-button-grid/client.ts | 7 + .../demos/start-edit-button-grid/index.ts | 6 + .../ValidateServerNameGrid.tsx | 10 +- .../demos/validate-server-name-grid/client.ts | 7 + .../demos/validate-server-name-grid/index.ts | 6 + .../ValueParserSetterGrid.tsx | 5 +- .../demos/value-parser-setter-grid/client.ts | 7 + .../demos/value-parser-setter-grid/index.ts | 6 + docs/data/data-grid/editing/editing-events.md | 2 +- docs/data/data-grid/editing/editing.md | 16 +- docs/data/data-grid/editing/persistence.md | 4 +- .../data-grid/events/CatalogOfEventsNoSnap.js | 170 --- .../events/DoubleClickWithCtrlToEdit.js | 25 - .../DoubleClickWithCtrlToEdit.tsx.preview | 9 - .../events/SubscribeToEventsApiRef.js | 30 - .../SubscribeToEventsApiRef.tsx.preview | 4 - .../data-grid/events/SubscribeToEventsHook.js | 41 - .../events/SubscribeToEventsHook.tsx.preview | 3 - .../data-grid/events/SubscribeToEventsProp.js | 24 - .../events/SubscribeToEventsProp.tsx.preview | 4 - .../CatalogOfEventsNoSnap.tsx | 175 +++ .../demos/catalog-of-events-no-snap/client.ts | 7 + .../demos/catalog-of-events-no-snap/index.ts | 6 + .../DoubleClickWithCtrlToEdit.tsx | 2 + .../double-click-with-ctrl-to-edit/client.ts | 7 + .../double-click-with-ctrl-to-edit/index.ts | 6 + .../SubscribeToEventsApiRef.tsx | 5 +- .../subscribe-to-events-api-ref/client.ts | 7 + .../subscribe-to-events-api-ref/index.ts | 6 + .../SubscribeToEventsHook.tsx | 4 +- .../demos/subscribe-to-events-hook/client.ts | 7 + .../demos/subscribe-to-events-hook/index.ts | 6 + .../SubscribeToEventsProp.tsx | 5 +- .../demos/subscribe-to-events-prop/client.ts | 7 + .../demos/subscribe-to-events-prop/index.ts | 6 + docs/data/data-grid/events/events.md | 10 +- .../data-grid/export/CsvExportApiNoSnap.js | 6 - .../data-grid/export/CsvGetRowsToExport.js | 89 -- .../export/CsvGetRowsToExportRowGrouping.js | 75 -- .../CsvGetRowsToExportRowGrouping.tsx.preview | 13 - docs/data/data-grid/export/CustomExport.js | 133 -- .../data-grid/export/CustomExport.tsx.preview | 6 - .../data-grid/export/ExcelCustomExport.js | 296 ----- .../export/ExcelCustomExport.tsx.preview | 10 - docs/data/data-grid/export/ExcelExport.js | 119 -- .../data-grid/export/ExcelExport.tsx.preview | 1 - .../data-grid/export/ExcelExportApiNoSnap.js | 6 - .../export/ExcelExportWithWebWorker.js | 56 - .../data-grid/export/ExportDefaultToolbar.js | 16 - .../export/ExportDefaultToolbar.tsx.preview | 1 - .../data-grid/export/ExportServerSideData.js | 114 -- .../export/ExportServerSideData.tsx.preview | 15 - .../data-grid/export/PrintExportApiNoSnap.js | 6 - .../data-grid/export/RemovePrintExport.js | 25 - .../export/RemovePrintExport.tsx.preview | 10 - .../CsvExportApiNoSnap.tsx | 9 + .../demos/csv-export-api-no-snap/client.ts | 7 + .../demos/csv-export-api-no-snap/index.ts | 6 + .../CsvGetRowsToExportRowGrouping.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../CsvGetRowsToExport.tsx | 8 +- .../demos/csv-get-rows-to-export/client.ts | 7 + .../demos/csv-get-rows-to-export/index.ts | 6 + .../custom-export}/CustomExport.tsx | 4 +- .../export/demos/custom-export/client.ts | 7 + .../export/demos/custom-export/index.ts | 6 + .../ExcelCustomExport.tsx | 6 +- .../demos/excel-custom-export/client.ts | 7 + .../export/demos/excel-custom-export/index.ts | 6 + .../ExcelExportApiNoSnap.tsx | 9 + .../demos/excel-export-api-no-snap/client.ts | 7 + .../demos/excel-export-api-no-snap/index.ts | 6 + .../ExcelExportWithWebWorker.tsx | 7 +- .../excel-export-with-web-worker/client.ts | 7 + .../excel-export-with-web-worker/index.ts | 6 + .../{ => demos/excel-export}/ExcelExport.tsx | 4 +- .../export/demos/excel-export/client.ts | 7 + .../export/demos/excel-export/index.ts | 6 + .../ExportDefaultToolbar.tsx | 2 + .../demos/export-default-toolbar/client.ts | 7 + .../demos/export-default-toolbar/index.ts | 6 + .../ExportServerSideData.tsx | 2 + .../demos/export-server-side-data/client.ts | 7 + .../demos/export-server-side-data/index.ts | 6 + .../PrintExportApiNoSnap.tsx | 9 + .../demos/print-export-api-no-snap/client.ts | 7 + .../demos/print-export-api-no-snap/index.ts | 6 + .../RemovePrintExport.tsx | 2 + .../demos/remove-print-export/client.ts | 7 + .../export/demos/remove-print-export/index.ts | 6 + docs/data/data-grid/export/export.md | 24 +- .../data-grid/features/FullFeaturedDemo.tsx | 3 +- .../data-grid/features/PopularFeaturesDemo.js | 626 --------- .../PopularFeaturesDemo.tsx | 54 +- .../demos/popular-features-demo/client.ts | 7 + .../demos/popular-features-demo/index.ts | 6 + docs/data/data-grid/features/features.md | 2 +- .../filtering-recipes/FilterPresetsPanel.js | 347 ----- .../FilterPresetsPanel.tsx.preview | 8 - .../filtering-recipes/FilteredRowCount.js | 99 -- .../FilteringLocalStorage.js | 86 -- .../FilteringLocalStorage.tsx.preview | 7 - .../filtering-recipes/PasteListIntoIsAnyOf.js | 260 ---- .../PasteListIntoIsAnyOf.tsx.preview | 13 - .../QuickFilterOutsideOfGrid.js | 141 -- .../FilterPresetsPanel.tsx | 4 +- .../demos/filter-presets-panel/client.ts | 7 + .../demos/filter-presets-panel/index.ts | 6 + .../filtered-row-count}/FilteredRowCount.tsx | 5 +- .../demos/filtered-row-count/client.ts | 7 + .../demos/filtered-row-count/index.ts | 6 + .../FilteringLocalStorage.tsx | 5 +- .../demos/filtering-local-storage/client.ts | 7 + .../demos/filtering-local-storage/index.ts | 6 + .../PasteListIntoIsAnyOf.tsx | 8 +- .../demos/paste-list-into-is-any-of/client.ts | 7 + .../demos/paste-list-into-is-any-of/index.ts | 6 + .../QuickFilterOutsideOfGrid.tsx | 2 + .../quick-filter-outside-of-grid/client.ts | 7 + .../quick-filter-outside-of-grid/index.ts | 6 + .../filtering-recipes/filtering-recipes.md | 10 +- .../filtering/ApplyFiltersOnDemand.js | 163 --- .../ApplyFiltersOnDemand.tsx.preview | 16 - .../filtering/BasicExampleDataGrid.js | 18 - .../filtering/BasicExampleDataGrid.tsx | 18 - .../BasicExampleDataGrid.tsx.preview | 1 - .../filtering/BasicExampleDataGridPro.js | 18 - .../filtering/BasicExampleDataGridPro.tsx | 18 - .../BasicExampleDataGridPro.tsx.preview | 1 - .../data-grid/filtering/ControlledFilters.js | 35 - .../filtering/ControlledFilters.tsx.preview | 7 - .../filtering/CustomFilterColumnInput.js | 59 - .../CustomFilterColumnInput.tsx.preview | 14 - .../filtering/CustomFilterPanelContent.js | 104 -- .../filtering/CustomFilterPanelPosition.js | 51 - .../CustomFilterPanelPosition.tsx.preview | 12 - .../CustomHeaderFilterDataGridPro.js | 132 -- .../CustomHeaderFilterOperatorDataGridPro.js | 82 -- ...eaderFilterOperatorDataGridPro.tsx.preview | 1 - .../CustomHeaderFilterSingleDataGridPro.js | 105 -- ...mHeaderFilterSingleDataGridPro.tsx.preview | 7 - .../filtering/CustomInputComponent.js | 92 -- .../CustomInputComponent.tsx.preview | 14 - .../filtering/CustomMultiValueOperator.js | 150 --- .../CustomMultiValueOperator.tsx.preview | 7 - .../filtering/CustomRatingOperator.js | 109 -- .../filtering/CustomSelectionOperator.js | 71 - .../CustomSelectionOperator.tsx.preview | 1 - .../DisableActionButtonsDataGridPro.js | 28 - ...isableActionButtonsDataGridPro.tsx.preview | 11 - .../DisableFilteringGridAllColumns.js | 18 - ...DisableFilteringGridAllColumns.tsx.preview | 1 - .../DisableFilteringGridSomeColumns.js | 27 - ...isableFilteringGridSomeColumns.tsx.preview | 1 - .../DisableMultiFiltersDataGridPro.js | 52 - ...DisableMultiFiltersDataGridPro.tsx.preview | 13 - .../data-grid/filtering/FilterApiNoSnap.js | 6 - .../filtering/HeaderFilteringDataGridPro.js | 28 - .../HeaderFilteringDataGridPro.tsx.preview | 14 - .../HeaderFilteringInlineClearDataGridPro.js | 53 - .../data-grid/filtering/InitialFilters.js | 37 - .../filtering/QuickFilteringCustomLogic.js | 56 - .../QuickFilteringCustomLogic.tsx.preview | 1 - .../filtering/QuickFilteringCustomizedGrid.js | 52 - .../filtering/QuickFilteringDiacritics.js | 62 - .../QuickFilteringExcludeHiddenColumns.js | 87 -- .../data-grid/filtering/QuickFilteringGrid.js | 29 - .../filtering/QuickFilteringGrid.tsx.preview | 8 - .../filtering/QuickFilteringInitialize.js | 37 - .../QuickFilteringInitialize.tsx.preview | 16 - .../data-grid/filtering/ReadOnlyFilters.js | 45 - .../filtering/ReadOnlyFilters.tsx.preview | 8 - .../filtering/RemoveBuiltInOperators.js | 49 - .../RemoveBuiltInOperators.tsx.preview | 14 - .../data-grid/filtering/ServerFilterGrid.js | 28 - .../filtering/ServerFilterGrid.tsx.preview | 7 - .../SimpleHeaderFilteringDataGridPro.js | 33 - .../data/data-grid/filtering/customization.md | 18 +- .../ApplyFiltersOnDemand.tsx | 2 + .../demos/apply-filters-on-demand/client.ts | 7 + .../demos/apply-filters-on-demand/index.ts | 6 + .../BasicExampleDataGridPro.tsx | 20 + .../basic-example-data-grid-pro/client.ts | 7 + .../basic-example-data-grid-pro/index.ts | 6 + .../BasicExampleDataGrid.tsx | 20 + .../demos/basic-example-data-grid/client.ts | 7 + .../demos/basic-example-data-grid/index.ts | 6 + .../controlled-filters}/ControlledFilters.tsx | 5 +- .../demos/controlled-filters/client.ts | 7 + .../demos/controlled-filters/index.ts | 6 + .../CustomFilterColumnInput.tsx | 2 + .../custom-filter-column-input/client.ts | 7 + .../demos/custom-filter-column-input/index.ts | 6 + .../CustomFilterPanelContent.tsx | 2 + .../custom-filter-panel-content/client.ts | 7 + .../custom-filter-panel-content/index.ts | 6 + .../CustomFilterPanelPosition.tsx | 4 +- .../custom-filter-panel-position/client.ts | 7 + .../custom-filter-panel-position/index.ts | 6 + .../CustomHeaderFilterDataGridPro.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../CustomHeaderFilterOperatorDataGridPro.tsx | 12 +- .../client.ts | 7 + .../index.ts | 8 + .../CustomHeaderFilterSingleDataGridPro.tsx | 7 +- .../client.ts | 7 + .../index.ts | 6 + .../CustomInputComponent.tsx | 12 +- .../demos/custom-input-component/client.ts | 7 + .../demos/custom-input-component/index.ts | 6 + .../CustomMultiValueOperator.tsx | 10 +- .../custom-multi-value-operator/client.ts | 7 + .../custom-multi-value-operator/index.ts | 6 + .../CustomRatingOperator.tsx | 9 +- .../demos/custom-rating-operator/client.ts | 7 + .../demos/custom-rating-operator/index.ts | 6 + .../CustomSelectionOperator.tsx | 4 +- .../demos/custom-selection-operator/client.ts | 7 + .../demos/custom-selection-operator/index.ts | 6 + .../DisableActionButtonsDataGridPro.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../DisableFilteringGridAllColumns.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../DisableFilteringGridSomeColumns.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../DisableMultiFiltersDataGridPro.tsx | 6 +- .../client.ts | 7 + .../index.ts | 6 + .../filter-api-no-snap/FilterApiNoSnap.tsx | 9 + .../demos/filter-api-no-snap/client.ts | 7 + .../demos/filter-api-no-snap/index.ts | 6 + .../HeaderFilteringDataGridPro.tsx | 2 + .../header-filtering-data-grid-pro/client.ts | 7 + .../header-filtering-data-grid-pro/index.ts | 6 + .../HeaderFilteringInlineClearDataGridPro.tsx | 2 + .../client.ts | 7 + .../index.ts | 8 + .../initial-filters}/InitialFilters.tsx | 2 + .../filtering/demos/initial-filters/client.ts | 7 + .../filtering/demos/initial-filters/index.ts | 6 + .../QuickFilteringCustomLogic.tsx | 5 +- .../quick-filtering-custom-logic/client.ts | 7 + .../quick-filtering-custom-logic/index.ts | 6 + .../QuickFilteringCustomizedGrid.tsx | 2 + .../quick-filtering-customized-grid/client.ts | 7 + .../quick-filtering-customized-grid/index.ts | 6 + .../QuickFilteringDiacritics.tsx | 5 +- .../quick-filtering-diacritics/client.ts | 7 + .../demos/quick-filtering-diacritics/index.ts | 6 + .../QuickFilteringExcludeHiddenColumns.tsx | 9 +- .../client.ts | 7 + .../index.ts | 6 + .../QuickFilteringGrid.tsx | 2 + .../demos/quick-filtering-grid/client.ts | 7 + .../demos/quick-filtering-grid/index.ts | 6 + .../QuickFilteringInitialize.tsx | 2 + .../quick-filtering-initialize/client.ts | 7 + .../demos/quick-filtering-initialize/index.ts | 6 + .../read-only-filters}/ReadOnlyFilters.tsx | 5 +- .../demos/read-only-filters/client.ts | 7 + .../demos/read-only-filters/index.ts | 6 + .../RemoveBuiltInOperators.tsx | 2 + .../demos/remove-built-in-operators/client.ts | 7 + .../demos/remove-built-in-operators/index.ts | 6 + .../server-filter-grid}/ServerFilterGrid.tsx | 5 +- .../demos/server-filter-grid/client.ts | 7 + .../demos/server-filter-grid/index.ts | 6 + .../SimpleHeaderFilteringDataGridPro.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../data-grid/filtering/header-filters.md | 12 +- docs/data/data-grid/filtering/index.md | 14 +- .../data/data-grid/filtering/multi-filters.md | 6 +- docs/data/data-grid/filtering/quick-filter.md | 12 +- docs/data/data-grid/filtering/server-side.md | 2 +- .../formulas/ComputedColumnsApiNoSnap.js | 6 - .../formulas/ComputedColumnsBasic.js | 148 --- .../formulas/ComputedColumnsBasic.tsx.preview | 12 - .../formulas/ComputedColumnsControlled.js | 152 --- .../formulas/ComputedColumnsErrors.js | 76 -- .../ComputedColumnsErrors.tsx.preview | 14 - .../formulas/ComputedColumnsReadOnly.js | 66 - .../ComputedColumnsReadOnly.tsx.preview | 12 - .../data-grid/formulas/FormulaAutocomplete.js | 136 -- .../formulas/FormulaAutocomplete.tsx.preview | 11 - .../data-grid/formulas/FormulaBarBasic.js | 102 -- .../formulas/FormulaBarBasic.tsx.preview | 14 - docs/data/data-grid/formulas/FormulaBasic.js | 147 --- .../formulas/FormulaBasic.tsx.preview | 14 - .../data-grid/formulas/FormulaExcelExport.js | 126 -- .../data-grid/formulas/FormulaFillHandle.js | 79 -- .../formulas/FormulaFillHandle.tsx.preview | 13 - .../formulas/FormulaReferenceHighlighting.js | 116 -- .../FormulaReferenceHighlighting.tsx.preview | 12 - .../data-grid/formulas/computed-columns.md | 10 +- .../ComputedColumnsApiNoSnap.tsx | 9 + .../computed-columns-api-no-snap/client.ts | 7 + .../computed-columns-api-no-snap/index.ts | 6 + .../ComputedColumnsBasic.tsx | 6 +- .../demos/computed-columns-basic/client.ts | 7 + .../demos/computed-columns-basic/index.ts | 6 + .../ComputedColumnsControlled.tsx | 6 +- .../computed-columns-controlled/client.ts | 7 + .../computed-columns-controlled/index.ts | 6 + .../ComputedColumnsErrors.tsx | 6 +- .../demos/computed-columns-errors/client.ts | 7 + .../demos/computed-columns-errors/index.ts | 6 + .../ComputedColumnsReadOnly.tsx | 6 +- .../computed-columns-read-only/client.ts | 7 + .../demos/computed-columns-read-only/index.ts | 6 + .../FormulaAutocomplete.tsx | 6 +- .../demos/formula-autocomplete/client.ts | 7 + .../demos/formula-autocomplete/index.ts | 6 + .../formula-bar-basic}/FormulaBarBasic.tsx | 5 +- .../demos/formula-bar-basic/client.ts | 7 + .../formulas/demos/formula-bar-basic/index.ts | 6 + .../formula-basic}/FormulaBasic.tsx | 5 +- .../formulas/demos/formula-basic/client.ts | 7 + .../formulas/demos/formula-basic/index.ts | 6 + .../FormulaExcelExport.tsx | 5 +- .../demos/formula-excel-export/client.ts | 7 + .../demos/formula-excel-export/index.ts | 6 + .../FormulaFillHandle.tsx | 5 +- .../demos/formula-fill-handle/client.ts | 7 + .../demos/formula-fill-handle/index.ts | 6 + .../FormulaReferenceHighlighting.tsx | 5 +- .../formula-reference-highlighting/client.ts | 7 + .../formula-reference-highlighting/index.ts | 6 + docs/data/data-grid/formulas/formulas.md | 12 +- docs/data/data-grid/layout/AutoHeightGrid.js | 37 - .../layout/AutoHeightGrid.tsx.preview | 14 - docs/data/data-grid/layout/FixedSizeGrid.js | 18 - .../layout/FixedSizeGrid.tsx.preview | 3 - docs/data/data-grid/layout/FlexGrid.js | 34 - .../data-grid/layout/FlexGrid.tsx.preview | 11 - .../data-grid/layout/GridOverlayHeight.js | 72 -- .../layout/GridOverlayHeight.tsx.preview | 10 - docs/data/data-grid/layout/HeightGrid.js | 12 - .../data-grid/layout/HeightGrid.tsx.preview | 1 - .../data/data-grid/layout/MinMaxHeightGrid.js | 108 -- .../auto-height-grid}/AutoHeightGrid.tsx | 2 + .../layout/demos/auto-height-grid/client.ts | 7 + .../layout/demos/auto-height-grid/index.ts | 6 + .../fixed-size-grid}/FixedSizeGrid.tsx | 2 + .../layout/demos/fixed-size-grid/client.ts | 7 + .../layout/demos/fixed-size-grid/index.ts | 6 + .../layout/{ => demos/flex-grid}/FlexGrid.tsx | 2 + .../layout/demos/flex-grid/client.ts | 7 + .../data-grid/layout/demos/flex-grid/index.ts | 6 + .../GridOverlayHeight.tsx | 2 + .../demos/grid-overlay-height/client.ts | 7 + .../layout/demos/grid-overlay-height/index.ts | 6 + .../{ => demos/height-grid}/HeightGrid.tsx | 2 + .../layout/demos/height-grid/client.ts | 7 + .../layout/demos/height-grid/index.ts | 6 + .../min-max-height-grid}/MinMaxHeightGrid.tsx | 2 + .../demos/min-max-height-grid/client.ts | 7 + .../layout/demos/min-max-height-grid/index.ts | 6 + docs/data/data-grid/layout/layout.md | 12 +- docs/data/data-grid/list-view/ListView.js | 164 --- .../data-grid/list-view/ListViewAdvanced.js | 390 ------ docs/data/data-grid/list-view/ListViewEdit.js | 223 ---- .../list-view/ListViewEdit.tsx.preview | 8 - .../data-grid/list-view/ListViewMediaQuery.js | 79 -- .../list-view/ListViewMediaQuery.tsx.preview | 7 - .../list-view/components/ActionDrawer.tsx | 7 +- .../data-grid/list-view/components/Card.tsx | 6 +- .../list-view/components/DetailsDrawer.tsx | 7 +- .../data-grid/list-view/components/Drawer.tsx | 8 +- .../list-view/components/FileIcon.tsx | 5 +- .../list-view/components/ListCell.tsx | 5 +- .../list-view/components/RenameDialog.tsx | 4 +- .../list-view/components/Toolbar.tsx | 5 +- .../list-view/components/ToolbarAddItem.tsx | 5 +- .../components/ToolbarColumnsItem.tsx | 3 +- .../components/ToolbarDensityItem.tsx | 6 +- .../components/ToolbarFilterItem.tsx | 7 +- .../list-view/components/ToolbarSortItem.tsx | 5 +- docs/data/data-grid/list-view/constants.ts | 2 +- docs/data/data-grid/list-view/data.ts | 4 +- .../list-view-advanced}/ListViewAdvanced.tsx | 32 +- .../demos/list-view-advanced/client.ts | 7 + .../demos/list-view-advanced/index.ts | 6 + .../list-view-edit}/ListViewEdit.tsx | 7 +- .../list-view/demos/list-view-edit/client.ts | 7 + .../list-view/demos/list-view-edit/index.ts | 6 + .../ListViewMediaQuery.tsx | 9 +- .../demos/list-view-media-query/client.ts | 7 + .../demos/list-view-media-query/index.ts | 6 + .../{ => demos/list-view}/ListView.tsx | 8 +- .../list-view/demos/list-view/client.ts | 7 + .../list-view/demos/list-view/index.ts | 6 + docs/data/data-grid/list-view/list-view.md | 8 +- docs/data/data-grid/list-view/types.ts | 2 +- .../localization/CustomLocaleTextGrid.js | 22 - .../CustomLocaleTextGrid.tsx.preview | 7 - .../DataGridLocalisationTableNoSnap.js | 6 - .../data-grid/localization/DataGridRTL.js | 74 -- .../localization/DataGridRTL.tsx.preview | 7 - .../PaginationNumberFormatting.js | 54 - .../PaginationNumberFormatting.tsx.preview | 1 - .../CustomLocaleTextGrid.tsx | 2 + .../demos/custom-locale-text-grid/client.ts | 7 + .../demos/custom-locale-text-grid/index.ts | 6 + .../DataGridLocalisationTableNoSnap.tsx | 9 + .../client.ts | 7 + .../index.ts | 6 + .../{ => demos/data-grid-rtl}/DataGridRTL.tsx | 5 +- .../demos/data-grid-rtl/client.ts | 7 + .../localization/demos/data-grid-rtl/index.ts | 6 + .../PaginationNumberFormatting.tsx | 2 + .../pagination-number-formatting/client.ts | 7 + .../pagination-number-formatting/index.ts | 6 + .../data-grid/localization/localization.md | 8 +- .../master-detail/BasicDetailPanels.tsx | 3 +- .../master-detail/ControlMasterDetail.js | 93 -- .../CustomizeDetailPanelToggle.js | 137 -- .../CustomizeDetailPanelToggle.tsx.preview | 6 - .../master-detail/DetailPanelApiNoSnap.js | 6 - .../master-detail/DetailPanelAutoHeight.js | 259 ---- .../DetailPanelAutoHeight.tsx.preview | 6 - .../master-detail/DetailPanelConditional.js | 44 - .../DetailPanelConditional.tsx.preview | 11 - .../master-detail/FormDetailPanel.js | 141 -- .../master-detail/FormDetailPanel.tsx.preview | 6 - .../master-detail/FullWidthDetailPanel.js | 207 --- .../FullWidthDetailPanel.tsx.preview | 16 - .../master-detail/LazyLoadingDetailPanel.js | 151 --- .../LazyLoadingDetailPanel.tsx.preview | 9 - .../master-detail/MasterDetailEmailExample.js | 151 --- .../MasterDetailEmailExample.tsx.preview | 16 - .../ControlMasterDetail.tsx | 6 +- .../demos/control-master-detail/client.ts | 7 + .../demos/control-master-detail/index.ts | 6 + .../CustomizeDetailPanelToggle.tsx | 8 +- .../customize-detail-panel-toggle/client.ts | 7 + .../customize-detail-panel-toggle/index.ts | 6 + .../DetailPanelApiNoSnap.tsx | 9 + .../demos/detail-panel-api-no-snap/client.ts | 7 + .../demos/detail-panel-api-no-snap/index.ts | 6 + .../DetailPanelAutoHeight.tsx | 10 +- .../demos/detail-panel-auto-height/client.ts | 7 + .../demos/detail-panel-auto-height/index.ts | 6 + .../DetailPanelConditional.tsx | 5 +- .../demos/detail-panel-conditional/client.ts | 7 + .../demos/detail-panel-conditional/index.ts | 6 + .../form-detail-panel}/FormDetailPanel.tsx | 7 +- .../demos/form-detail-panel/client.ts | 7 + .../demos/form-detail-panel/index.ts | 6 + .../FullWidthDetailPanel.tsx | 5 +- .../demos/full-width-detail-panel/client.ts | 7 + .../demos/full-width-detail-panel/index.ts | 6 + .../LazyLoadingDetailPanel.tsx | 7 +- .../demos/lazy-loading-detail-panel/client.ts | 7 + .../demos/lazy-loading-detail-panel/index.ts | 6 + .../MasterDetailEmailExample.tsx | 5 +- .../master-detail-email-example/client.ts | 7 + .../master-detail-email-example/index.ts | 6 + .../data-grid/master-detail/master-detail.md | 18 +- .../data-grid/overlays/EmptyPivotOverlay.js | 63 - .../overlays/EmptyPivotOverlay.tsx.preview | 7 - .../LoadingOverlayCircularProgress.js | 26 - ...LoadingOverlayCircularProgress.tsx.preview | 10 - .../overlays/LoadingOverlayCustom.js | 80 -- .../overlays/LoadingOverlayCustom.tsx.preview | 7 - .../overlays/LoadingOverlayLinearProgress.js | 26 - .../LoadingOverlayLinearProgress.tsx.preview | 10 - .../overlays/LoadingOverlaySkeleton.js | 26 - .../LoadingOverlaySkeleton.tsx.preview | 10 - .../data-grid/overlays/NoColumnsOverlay.js | 34 - .../overlays/NoColumnsOverlay.tsx.preview | 8 - .../overlays/NoColumnsOverlayCustom.js | 100 -- .../NoColumnsOverlayCustom.tsx.preview | 11 - .../data-grid/overlays/NoResultsOverlay.js | 29 - .../overlays/NoResultsOverlay.tsx.preview | 13 - .../overlays/NoResultsOverlayCustom.js | 84 -- .../NoResultsOverlayCustom.tsx.preview | 16 - docs/data/data-grid/overlays/NoRowsOverlay.js | 17 - .../overlays/NoRowsOverlay.tsx.preview | 1 - .../data-grid/overlays/NoRowsOverlayCustom.js | 76 -- .../overlays/NoRowsOverlayCustom.tsx.preview | 7 - .../EmptyPivotOverlay.tsx | 6 +- .../demos/empty-pivot-overlay/client.ts | 7 + .../demos/empty-pivot-overlay/index.ts | 6 + .../LoadingOverlayCircularProgress.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../LoadingOverlayCustom.tsx | 7 +- .../demos/loading-overlay-custom/client.ts | 7 + .../demos/loading-overlay-custom/index.ts | 6 + .../LoadingOverlayLinearProgress.tsx | 2 + .../loading-overlay-linear-progress/client.ts | 7 + .../loading-overlay-linear-progress/index.ts | 6 + .../LoadingOverlaySkeleton.tsx | 2 + .../demos/loading-overlay-skeleton/client.ts | 7 + .../demos/loading-overlay-skeleton/index.ts | 6 + .../NoColumnsOverlayCustom.tsx | 2 + .../demos/no-columns-overlay-custom/client.ts | 7 + .../demos/no-columns-overlay-custom/index.ts | 6 + .../no-columns-overlay}/NoColumnsOverlay.tsx | 2 + .../demos/no-columns-overlay/client.ts | 7 + .../demos/no-columns-overlay/index.ts | 6 + .../NoResultsOverlayCustom.tsx | 2 + .../demos/no-results-overlay-custom/client.ts | 7 + .../demos/no-results-overlay-custom/index.ts | 6 + .../no-results-overlay}/NoResultsOverlay.tsx | 2 + .../demos/no-results-overlay/client.ts | 7 + .../demos/no-results-overlay/index.ts | 6 + .../NoRowsOverlayCustom.tsx | 2 + .../demos/no-rows-overlay-custom/client.ts | 7 + .../demos/no-rows-overlay-custom/index.ts | 6 + .../no-rows-overlay}/NoRowsOverlay.tsx | 2 + .../overlays/demos/no-rows-overlay/client.ts | 7 + .../overlays/demos/no-rows-overlay/index.ts | 6 + docs/data/data-grid/overlays/overlays.md | 22 +- docs/data/data-grid/overview/DataGridDemo.js | 67 - .../overview/DataGridDemo.tsx.preview | 14 - .../data-grid/overview/DataGridPremiumDemo.js | 66 - .../overview/DataGridPremiumDemo.tsx.preview | 9 - .../data-grid/overview/DataGridProDemo.js | 24 - .../overview/DataGridProDemo.tsx.preview | 7 - .../data-grid-demo}/DataGridDemo.tsx | 5 +- .../overview/demos/data-grid-demo/client.ts | 7 + .../overview/demos/data-grid-demo/index.ts | 6 + .../DataGridPremiumDemo.tsx | 2 + .../demos/data-grid-premium-demo/client.ts | 7 + .../demos/data-grid-premium-demo/index.ts | 6 + .../data-grid-pro-demo}/DataGridProDemo.tsx | 2 + .../demos/data-grid-pro-demo/client.ts | 7 + .../demos/data-grid-pro-demo/index.ts | 6 + docs/data/data-grid/overview/overview.md | 6 +- .../pagination/CursorPaginationGrid.js | 141 -- .../data/data-grid/pagination/PageSizeAuto.js | 42 - .../pagination/PageSizeAutoPremium.js | 119 -- .../PageSizeAutoPremium.tsx.preview | 1 - .../pagination/PageSizeCustomOptions.js | 24 - .../PageSizeCustomOptions.tsx.preview | 9 - .../pagination/PaginationApiNoSnap.js | 6 - .../pagination/PaginationCommunityNoSnap.js | 16 - .../PaginationCommunityNoSnap.tsx.preview | 1 - .../pagination/PaginationModelControlled.js | 26 - .../PaginationModelControlled.tsx.preview | 6 - .../pagination/PaginationModelInitialState.js | 29 - .../PaginationModelInitialState.tsx.preview | 14 - .../ServerPaginationFilterSortGrid.js | 57 - ...ServerPaginationFilterSortGrid.tsx.preview | 16 - .../pagination/ServerPaginationGrid.js | 44 - .../ServerPaginationGrid.tsx.preview | 10 - .../ServerPaginationGridEstimated.js | 60 - .../ServerPaginationGridNoRowCount.js | 55 - ...ServerPaginationGridNoRowCount.tsx.preview | 12 - .../CursorPaginationGrid.tsx | 6 +- .../demos/cursor-pagination-grid/client.ts | 7 + .../demos/cursor-pagination-grid/index.ts | 6 + .../PageSizeAutoPremium.tsx | 4 +- .../demos/page-size-auto-premium/client.ts | 7 + .../demos/page-size-auto-premium/index.ts | 6 + .../page-size-auto}/PageSizeAuto.tsx | 2 + .../pagination/demos/page-size-auto/client.ts | 7 + .../pagination/demos/page-size-auto/index.ts | 6 + .../PageSizeCustomOptions.tsx | 2 + .../demos/page-size-custom-options/client.ts | 7 + .../demos/page-size-custom-options/index.ts | 6 + .../PaginationApiNoSnap.tsx | 9 + .../demos/pagination-api-no-snap/client.ts | 7 + .../demos/pagination-api-no-snap/index.ts | 6 + .../PaginationCommunityNoSnap.tsx | 2 + .../pagination-community-no-snap/client.ts | 7 + .../pagination-community-no-snap/index.ts | 6 + .../PaginationModelControlled.tsx | 2 + .../pagination-model-controlled/client.ts | 7 + .../pagination-model-controlled/index.ts | 6 + .../PaginationModelInitialState.tsx | 2 + .../pagination-model-initial-state/client.ts | 7 + .../pagination-model-initial-state/index.ts | 6 + .../ServerPaginationFilterSortGrid.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerPaginationGridEstimated.tsx | 2 + .../client.ts | 7 + .../server-pagination-grid-estimated/index.ts | 6 + .../ServerPaginationGridNoRowCount.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerPaginationGrid.tsx | 2 + .../demos/server-pagination-grid/client.ts | 7 + .../demos/server-pagination-grid/index.ts | 6 + docs/data/data-grid/pagination/pagination.md | 24 +- .../performance/GridVisualization.js | 73 -- .../performance/GridVisualization.tsx.preview | 8 - .../grid-visualization}/GridVisualization.tsx | 2 + .../demos/grid-visualization/client.ts | 7 + .../demos/grid-visualization/index.ts | 6 + .../data/data-grid/performance/performance.md | 2 +- .../pivoting/GridGetPivotDerivedColumns.js | 176 --- .../pivoting/GridNonPivotableColumns.js | 73 -- .../GridNonPivotableColumns.tsx.preview | 12 - .../data/data-grid/pivoting/GridNonPivoted.js | 130 -- .../pivoting/GridNonPivoted.tsx.preview | 11 - .../data-grid/pivoting/GridPivotingColumns.js | 157 --- .../pivoting/GridPivotingColumns.tsx.preview | 15 - .../pivoting/GridPivotingCommodities.js | 71 - .../pivoting/GridPivotingControlled.js | 75 -- .../pivoting/GridPivotingFinancial.js | 154 --- .../pivoting/GridPivotingInitialState.js | 72 -- .../GridPivotingInitialState.tsx.preview | 12 - .../data-grid/pivoting/GridPivotingMovies.js | 64 - .../pivoting/GridPivotingMultipleValues.js | 159 --- .../GridPivotingMultipleValues.tsx.preview | 15 - .../pivoting/GridPivotingQuickStart.js | 154 --- .../GridPivotingQuickStart.tsx.preview | 12 - .../data-grid/pivoting/GridPivotingRows.js | 154 --- .../pivoting/GridPivotingRows.tsx.preview | 15 - .../data-grid/pivoting/GridPivotingValues.js | 157 --- .../pivoting/GridPivotingValues.tsx.preview | 15 - .../GridGetPivotDerivedColumns.tsx | 7 +- .../grid-get-pivot-derived-columns/client.ts | 7 + .../grid-get-pivot-derived-columns/index.ts | 6 + .../GridNonPivotableColumns.tsx | 7 +- .../grid-non-pivotable-columns/client.ts | 7 + .../demos/grid-non-pivotable-columns/index.ts | 6 + .../grid-non-pivoted}/GridNonPivoted.tsx | 5 +- .../pivoting/demos/grid-non-pivoted/client.ts | 7 + .../pivoting/demos/grid-non-pivoted/index.ts | 6 + .../GridPivotingColumns.tsx | 9 +- .../demos/grid-pivoting-columns/client.ts | 7 + .../demos/grid-pivoting-columns/index.ts | 6 + .../GridPivotingCommodities.tsx | 10 +- .../demos/grid-pivoting-commodities/client.ts | 7 + .../demos/grid-pivoting-commodities/index.ts | 6 + .../GridPivotingControlled.tsx | 7 +- .../demos/grid-pivoting-controlled/client.ts | 7 + .../demos/grid-pivoting-controlled/index.ts | 6 + .../GridPivotingFinancial.tsx | 10 +- .../demos/grid-pivoting-financial/client.ts | 7 + .../demos/grid-pivoting-financial/index.ts | 6 + .../GridPivotingInitialState.tsx | 7 +- .../grid-pivoting-initial-state/client.ts | 7 + .../grid-pivoting-initial-state/index.ts | 6 + .../GridPivotingMovies.tsx | 9 +- .../demos/grid-pivoting-movies/client.ts | 7 + .../demos/grid-pivoting-movies/index.ts | 6 + .../GridPivotingMultipleValues.tsx | 9 +- .../grid-pivoting-multiple-values/client.ts | 7 + .../grid-pivoting-multiple-values/index.ts | 6 + .../GridPivotingQuickStart.tsx | 7 +- .../demos/grid-pivoting-quick-start/client.ts | 7 + .../demos/grid-pivoting-quick-start/index.ts | 6 + .../grid-pivoting-rows}/GridPivotingRows.tsx | 9 +- .../demos/grid-pivoting-rows/client.ts | 7 + .../demos/grid-pivoting-rows/index.ts | 6 + .../GridPivotingValues.tsx | 9 +- .../demos/grid-pivoting-values/client.ts | 7 + .../demos/grid-pivoting-values/index.ts | 6 + .../data-grid/pivoting/pivoting-explained.md | 10 +- docs/data/data-grid/pivoting/pivoting.md | 16 +- .../data-grid/quickstart/RenderComponent.js | 20 - .../quickstart/RenderComponent.tsx.preview | 1 - .../render-component}/RenderComponent.tsx | 4 +- .../demos/render-component/client.ts | 7 + .../demos/render-component/index.ts | 6 + docs/data/data-grid/quickstart/quickstart.md | 2 +- .../recipes-editing/AutocompleteEditing.js | 138 -- .../AutocompleteEditing.tsx.preview | 1 - .../data-grid/recipes-editing/BulkEditing.js | 226 ---- .../BulkEditingPremiumNoSnap.js | 225 ---- .../ConditionalValidationGrid.js | 101 -- .../ConditionalValidationGrid.tsx.preview | 3 - .../LinkedFieldsCellEditing.js | 139 -- .../LinkedFieldsCellEditing.tsx.preview | 7 - .../recipes-editing/LinkedFieldsRowEditing.js | 103 -- .../LinkedFieldsRowEditing.tsx.preview | 1 - .../recipes-editing/MultilineEditing.js | 147 --- .../MultilineEditing.tsx.preview | 12 - .../recipes-editing/SingleClickEditing.js | 122 -- .../SingleClickEditing.tsx.preview | 7 - .../AutocompleteEditing.tsx | 12 +- .../demos/autocomplete-editing/client.ts | 7 + .../demos/autocomplete-editing/index.ts | 6 + .../BulkEditingPremiumNoSnap.tsx | 12 +- .../bulk-editing-premium-no-snap/client.ts | 7 + .../bulk-editing-premium-no-snap/index.ts | 6 + .../{ => demos/bulk-editing}/BulkEditing.tsx | 12 +- .../demos/bulk-editing/client.ts | 7 + .../demos/bulk-editing/index.ts | 6 + .../ConditionalValidationGrid.tsx | 5 +- .../conditional-validation-grid/client.ts | 7 + .../conditional-validation-grid/index.ts | 6 + .../LinkedFieldsCellEditing.tsx | 10 +- .../linked-fields-cell-editing/client.ts | 7 + .../demos/linked-fields-cell-editing/index.ts | 6 + .../LinkedFieldsRowEditing.tsx | 10 +- .../demos/linked-fields-row-editing/client.ts | 7 + .../demos/linked-fields-row-editing/index.ts | 6 + .../multiline-editing}/MultilineEditing.tsx | 13 +- .../demos/multiline-editing/client.ts | 7 + .../demos/multiline-editing/index.ts | 6 + .../SingleClickEditing.tsx | 7 +- .../demos/single-click-editing/client.ts | 7 + .../demos/single-click-editing/index.ts | 6 + .../recipes-editing/recipes-editing.md | 16 +- .../RowGroupingChildRowCount.js | 54 - .../RowGroupingChildRowCount.tsx.preview | 8 - .../RowGroupingExpandOnRowClick.js | 48 - .../RowGroupingExpandOnRowClick.tsx.preview | 6 - .../RowGroupingMultipleFields.js | 133 -- .../RowGroupingMultipleFields.tsx.preview | 6 - .../RowGroupingPinning.js | 28 - .../RowGroupingPinning.tsx.preview | 1 - .../RowGroupingSortByChildRows.js | 71 - .../RowGroupingSortByChildRows.tsx.preview | 6 - .../RowGroupingChildRowCount.tsx | 4 +- .../row-grouping-child-row-count/client.ts | 7 + .../row-grouping-child-row-count/index.ts | 6 + .../RowGroupingExpandOnRowClick.tsx | 4 +- .../client.ts | 7 + .../row-grouping-expand-on-row-click/index.ts | 6 + .../RowGroupingMultipleFields.tsx | 7 +- .../row-grouping-multiple-fields/client.ts | 7 + .../row-grouping-multiple-fields/index.ts | 6 + .../RowGroupingPinning.tsx | 2 + .../demos/row-grouping-pinning/client.ts | 7 + .../demos/row-grouping-pinning/index.ts | 6 + .../RowGroupingSortByChildRows.tsx | 8 +- .../row-grouping-sort-by-child-rows/client.ts | 7 + .../row-grouping-sort-by-child-rows/index.ts | 6 + .../recipes-row-grouping.md | 10 +- .../data/data-grid/row-definition/RowsGrid.js | 15 - .../row-definition/RowsGrid.tsx.preview | 7 - .../row-definition/RowsGridWithGetRowId.js | 16 - .../RowsGridWithGetRowId.tsx.preview | 8 - .../RowsGridWithGetRowId.tsx | 2 + .../demos/rows-grid-with-get-row-id/client.ts | 7 + .../demos/rows-grid-with-get-row-id/index.ts | 6 + .../{ => demos/rows-grid}/RowsGrid.tsx | 2 + .../row-definition/demos/rows-grid/client.ts | 7 + .../row-definition/demos/rows-grid/index.ts | 6 + .../row-definition/row-definition.md | 4 +- .../row-grouping/RowGroupingApiNoSnap.js | 6 - .../row-grouping/RowGroupingBasicExample.js | 26 - .../RowGroupingBasicExample.tsx.preview | 1 - .../RowGroupingColDefCanBeGrouped.js | 41 - .../RowGroupingColDefCanBeGrouped.tsx.preview | 7 - .../row-grouping/RowGroupingControlled.js | 22 - .../RowGroupingControlled.tsx.preview | 5 - .../row-grouping/RowGroupingCustomCell.js | 46 - .../RowGroupingCustomCell.tsx.preview | 5 - .../RowGroupingCustomCellDefault.js | 43 - .../RowGroupingCustomCellDefault.tsx.preview | 5 - .../RowGroupingCustomCellIndent.js | 33 - .../RowGroupingCustomCellIndent.tsx.preview | 8 - ...RowGroupingCustomGroupingColDefCallback.js | 95 -- .../RowGroupingCustomGroupingColDefObject.js | 36 - ...pingCustomGroupingColDefObject.tsx.preview | 7 - .../RowGroupingDefaultExpansionDepth.js | 32 - ...wGroupingDefaultExpansionDepth.tsx.preview | 7 - .../row-grouping/RowGroupingDisabled.js | 12 - .../RowGroupingDisabled.tsx.preview | 1 - ...owGroupingFilteringSingleGroupingColDef.js | 71 - .../row-grouping/RowGroupingFullExample.js | 48 - .../RowGroupingFullExample.tsx.preview | 8 - .../RowGroupingGetRowGroupChildren.js | 78 -- .../RowGroupingGroupingValueGetter.js | 53 - ...RowGroupingGroupingValueGetter.tsx.preview | 6 - .../RowGroupingGroupingValueSetter.js | 66 - ...RowGroupingGroupingValueSetter.tsx.preview | 7 - .../RowGroupingHideDescendantCount.js | 36 - ...RowGroupingHideDescendantCount.tsx.preview | 7 - .../row-grouping/RowGroupingInitialState.js | 20 - .../RowGroupingInitialState.tsx.preview | 9 - .../RowGroupingIsGroupExpandedByDefault.js | 35 - ...oupingIsGroupExpandedByDefault.tsx.preview | 7 - .../row-grouping/RowGroupingLeafWithValue.js | 41 - .../RowGroupingLeafWithValue.tsx.preview | 6 - .../RowGroupingMultipleGroupingCol.js | 31 - ...RowGroupingMultipleGroupingCol.tsx.preview | 6 - .../RowGroupingPropagateSelection.js | 72 -- .../row-grouping/RowGroupingReadOnly.js | 32 - .../RowGroupingReadOnly.tsx.preview | 6 - .../row-grouping/RowGroupingReordering.js | 31 - .../RowGroupingReordering.tsx.preview | 6 - .../RowGroupingRowsWithMissingGroups.js | 31 - ...wGroupingRowsWithMissingGroups.tsx.preview | 6 - .../RowGroupingSetChildrenExpansion.js | 61 - ...owGroupingSetChildrenExpansion.tsx.preview | 11 - .../RowGroupingSingleGroupingCol.js | 26 - .../RowGroupingSingleGroupingCol.tsx.preview | 1 - ...owGroupingSortingMultipleGroupingColDef.js | 42 - ...gSortingMultipleGroupingColDef.tsx.preview | 9 - .../RowGroupingUseKeepGroupedColumnsHidden.js | 26 - ...ingUseKeepGroupedColumnsHidden.tsx.preview | 1 - .../RowGroupingApiNoSnap.tsx | 9 + .../demos/row-grouping-api-no-snap/client.ts | 7 + .../demos/row-grouping-api-no-snap/index.ts | 6 + .../RowGroupingBasicExample.tsx | 2 + .../row-grouping-basic-example/client.ts | 7 + .../demos/row-grouping-basic-example/index.ts | 6 + .../RowGroupingColDefCanBeGrouped.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingControlled.tsx | 5 +- .../demos/row-grouping-controlled/client.ts | 7 + .../demos/row-grouping-controlled/index.ts | 6 + .../RowGroupingCustomCellDefault.tsx | 5 +- .../client.ts | 7 + .../row-grouping-custom-cell-default/index.ts | 6 + .../RowGroupingCustomCellIndent.tsx | 2 + .../row-grouping-custom-cell-indent/client.ts | 7 + .../row-grouping-custom-cell-indent/index.ts | 6 + .../RowGroupingCustomCell.tsx | 5 +- .../demos/row-grouping-custom-cell/client.ts | 7 + .../demos/row-grouping-custom-cell/index.ts | 6 + ...owGroupingCustomGroupingColDefCallback.tsx | 8 +- .../client.ts | 7 + .../index.ts | 8 + .../RowGroupingCustomGroupingColDefObject.tsx | 8 +- .../client.ts | 7 + .../index.ts | 8 + .../RowGroupingDefaultExpansionDepth.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingDisabled.tsx | 2 + .../demos/row-grouping-disabled/client.ts | 7 + .../demos/row-grouping-disabled/index.ts | 6 + ...wGroupingFilteringSingleGroupingColDef.tsx | 8 +- .../client.ts | 7 + .../index.ts | 8 + .../RowGroupingFullExample.tsx | 8 +- .../demos/row-grouping-full-example/client.ts | 7 + .../demos/row-grouping-full-example/index.ts | 6 + .../RowGroupingGetRowGroupChildren.tsx | 7 +- .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingGroupingValueGetter.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingGroupingValueSetter.tsx | 7 +- .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingHideDescendantCount.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingInitialState.tsx | 2 + .../row-grouping-initial-state/client.ts | 7 + .../demos/row-grouping-initial-state/index.ts | 6 + .../RowGroupingIsGroupExpandedByDefault.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingLeafWithValue.tsx | 8 +- .../row-grouping-leaf-with-value/client.ts | 7 + .../row-grouping-leaf-with-value/index.ts | 6 + .../RowGroupingMultipleGroupingCol.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingPropagateSelection.tsx | 4 +- .../client.ts | 7 + .../row-grouping-propagate-selection/index.ts | 6 + .../RowGroupingReadOnly.tsx | 5 +- .../demos/row-grouping-read-only/client.ts | 7 + .../demos/row-grouping-read-only/index.ts | 6 + .../RowGroupingReordering.tsx | 2 + .../demos/row-grouping-reordering/client.ts | 7 + .../demos/row-grouping-reordering/index.ts | 6 + .../RowGroupingRowsWithMissingGroups.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingSetChildrenExpansion.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../RowGroupingSingleGroupingCol.tsx | 2 + .../client.ts | 7 + .../row-grouping-single-grouping-col/index.ts | 6 + ...wGroupingSortingMultipleGroupingColDef.tsx | 4 +- .../client.ts | 7 + .../index.ts | 8 + ...RowGroupingUseKeepGroupedColumnsHidden.tsx | 2 + .../client.ts | 7 + .../index.ts | 8 + .../data-grid/row-grouping/row-grouping.md | 58 +- .../data-grid/row-height/DenseHeightGrid.js | 16 - .../row-height/DenseHeightGrid.tsx.preview | 1 - .../row-height/DynamicRowHeightGrid.js | 64 - .../DynamicRowHeightGrid.tsx.preview | 10 - .../data-grid/row-height/ExpandableCells.js | 97 -- .../data-grid/row-height/RowMarginGrid.js | 35 - .../row-height/RowMarginGrid.tsx.preview | 11 - .../row-height/VariableRowHeightGrid.js | 115 -- .../VariableRowHeightGrid.tsx.preview | 15 - .../VirtualizeColumnsWithAutoRowHeight.js | 49 - ...ualizeColumnsWithAutoRowHeight.tsx.preview | 5 - .../dense-height-grid}/DenseHeightGrid.tsx | 2 + .../demos/dense-height-grid/client.ts | 7 + .../demos/dense-height-grid/index.ts | 6 + .../DynamicRowHeightGrid.tsx | 5 +- .../demos/dynamic-row-height-grid/client.ts | 7 + .../demos/dynamic-row-height-grid/index.ts | 6 + .../expandable-cells}/ExpandableCells.tsx | 5 +- .../demos/expandable-cells/client.ts | 7 + .../demos/expandable-cells/index.ts | 6 + .../row-margin-grid}/RowMarginGrid.tsx | 5 +- .../demos/row-margin-grid/client.ts | 7 + .../row-height/demos/row-margin-grid/index.ts | 6 + .../VariableRowHeightGrid.tsx | 6 +- .../demos/variable-row-height-grid/client.ts | 7 + .../demos/variable-row-height-grid/index.ts | 6 + .../VirtualizeColumnsWithAutoRowHeight.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + docs/data/data-grid/row-height/row-height.md | 12 +- .../data-grid/row-ordering/RowOrderingGrid.js | 61 - .../row-ordering/RowOrderingGrid.tsx.preview | 7 - .../row-ordering/RowReorderingDisabled.js | 26 - .../RowReorderingDisabled.tsx.preview | 6 - .../row-ordering/RowReorderingValidation.js | 49 - .../RowReorderingValidation.tsx.preview | 8 - .../row-ordering-grid}/RowOrderingGrid.tsx | 9 +- .../demos/row-ordering-grid/client.ts | 7 + .../demos/row-ordering-grid/index.ts | 6 + .../RowReorderingDisabled.tsx | 5 +- .../demos/row-reordering-disabled/client.ts | 7 + .../demos/row-reordering-disabled/index.ts | 6 + .../RowReorderingValidation.tsx | 6 +- .../demos/row-reordering-validation/client.ts | 7 + .../demos/row-reordering-validation/index.ts | 6 + .../data-grid/row-ordering/row-ordering.md | 6 +- docs/data/data-grid/row-pinning/RowPinning.js | 47 - .../row-pinning/RowPinning.tsx.preview | 1 - .../row-pinning/RowPinningSectionSeparator.js | 80 -- .../row-pinning/RowPinningWithActions.js | 167 --- .../RowPinningWithActions.tsx.preview | 3 - .../row-pinning/RowPinningWithPagination.js | 46 - .../RowPinningWithPagination.tsx.preview | 15 - .../RowPinningSectionSeparator.tsx | 12 +- .../row-pinning-section-separator/client.ts | 7 + .../row-pinning-section-separator/index.ts | 6 + .../RowPinningWithActions.tsx | 12 +- .../demos/row-pinning-with-actions/client.ts | 7 + .../demos/row-pinning-with-actions/index.ts | 6 + .../RowPinningWithPagination.tsx | 2 + .../row-pinning-with-pagination/client.ts | 7 + .../row-pinning-with-pagination/index.ts | 6 + .../{ => demos/row-pinning}/RowPinning.tsx | 4 +- .../row-pinning/demos/row-pinning/client.ts | 7 + .../row-pinning/demos/row-pinning/index.ts | 6 + .../data/data-grid/row-pinning/row-pinning.md | 8 +- .../row-recipes/AccessingLoadingState.js | 47 - .../AccessingLoadingState.tsx.preview | 6 - .../DetailPanelExpandCollapseAll.js | 141 -- .../DetailPanelExpandCollapseAll.tsx.preview | 6 - .../DetailPanelExpandOnRowClick.js | 194 --- .../DetailPanelExpandOnRowClick.tsx.preview | 8 - .../row-recipes/DetailPanelOneExpandedRow.js | 95 -- .../DetailPanelOneExpandedRow.tsx.preview | 8 - .../LazyLoadingAutoHeightDetailPanel.js | 164 --- ...zyLoadingAutoHeightDetailPanel.tsx.preview | 9 - .../RowReorderingWithPagination.js | 228 ---- .../RowReorderingWithPagination.tsx.preview | 16 - .../AccessingLoadingState.tsx | 2 + .../demos/accessing-loading-state/client.ts | 7 + .../demos/accessing-loading-state/index.ts | 6 + .../DetailPanelExpandCollapseAll.tsx | 10 +- .../client.ts | 7 + .../detail-panel-expand-collapse-all/index.ts | 6 + .../DetailPanelExpandOnRowClick.tsx | 7 +- .../client.ts | 7 + .../detail-panel-expand-on-row-click/index.ts | 6 + .../DetailPanelOneExpandedRow.tsx | 6 +- .../detail-panel-one-expanded-row/client.ts | 7 + .../detail-panel-one-expanded-row/index.ts | 6 + .../LazyLoadingAutoHeightDetailPanel.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../RowReorderingWithPagination.tsx | 5 +- .../row-reordering-with-pagination/client.ts | 7 + .../row-reordering-with-pagination/index.ts | 6 + .../row-recipes/detailPanelCache.tsx | 2 +- .../data/data-grid/row-recipes/row-recipes.md | 12 +- .../row-selection/CheckboxSelectionCustom.js | 28 - .../CheckboxSelectionCustom.tsx.preview | 1 - .../row-selection/CheckboxSelectionGrid.js | 52 - .../CheckboxSelectionVisibleOnlyGrid.js | 49 - .../row-selection/ControlledSelectionGrid.js | 29 - .../ControlledSelectionGrid.tsx.preview | 8 - ...ControlledSelectionServerPaginationGrid.js | 75 -- .../DisableClickSelectionGrid.js | 16 - .../DisableClickSelectionGrid.tsx.preview | 1 - .../row-selection/DisableRowSelection.js | 21 - .../DisableRowSelection.tsx.preview | 6 - .../KeepNonExistentRowsSelected.js | 22 - .../KeepNonExistentRowsSelected.tsx.preview | 7 - .../row-selection/MultipleRowSelectionGrid.js | 28 - .../MultipleRowSelectionGrid.tsx.preview | 13 - .../row-selection/RowSelectionApiNoSnap.js | 7 - .../row-selection/SingleRowSelectionGrid.js | 16 - .../SingleRowSelectionGrid.tsx.preview | 1 - .../CheckboxSelectionCustom.tsx | 2 + .../demos/checkbox-selection-custom/client.ts | 7 + .../demos/checkbox-selection-custom/index.ts | 6 + .../CheckboxSelectionGrid.tsx | 2 + .../demos/checkbox-selection-grid/client.ts | 7 + .../demos/checkbox-selection-grid/index.ts | 6 + .../CheckboxSelectionVisibleOnlyGrid.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../ControlledSelectionGrid.tsx | 5 +- .../demos/controlled-selection-grid/client.ts | 7 + .../demos/controlled-selection-grid/index.ts | 6 + ...ontrolledSelectionServerPaginationGrid.tsx | 8 +- .../client.ts | 7 + .../index.ts | 8 + .../DisableClickSelectionGrid.tsx | 2 + .../disable-click-selection-grid/client.ts | 7 + .../disable-click-selection-grid/index.ts | 6 + .../DisableRowSelection.tsx | 5 +- .../demos/disable-row-selection/client.ts | 7 + .../demos/disable-row-selection/index.ts | 6 + .../KeepNonExistentRowsSelected.tsx | 2 + .../keep-non-existent-rows-selected/client.ts | 7 + .../keep-non-existent-rows-selected/index.ts | 6 + .../MultipleRowSelectionGrid.tsx | 2 + .../multiple-row-selection-grid/client.ts | 7 + .../multiple-row-selection-grid/index.ts | 6 + .../RowSelectionApiNoSnap.tsx | 10 + .../demos/row-selection-api-no-snap/client.ts | 7 + .../demos/row-selection-api-no-snap/index.ts | 6 + .../SingleRowSelectionGrid.tsx | 2 + .../demos/single-row-selection-grid/client.ts | 7 + .../demos/single-row-selection-grid/index.ts | 6 + .../data-grid/row-selection/row-selection.md | 22 +- .../data-grid/row-spanning/RowSpanning.js | 131 -- .../row-spanning/RowSpanningCalendar.js | 153 --- .../RowSpanningCalendar.tsx.preview | 14 - .../row-spanning/RowSpanningClassSchedule.js | 158 --- .../row-spanning/RowSpanningCustom.js | 95 -- .../RowSpanningCustom.tsx.preview | 14 - .../RowSpanningCalendar.tsx | 5 +- .../demos/row-spanning-calendar/client.ts | 7 + .../demos/row-spanning-calendar/index.ts | 6 + .../RowSpanningClassSchedule.tsx | 5 +- .../row-spanning-class-schedule/client.ts | 7 + .../row-spanning-class-schedule/index.ts | 6 + .../RowSpanningCustom.tsx | 5 +- .../demos/row-spanning-custom/client.ts | 7 + .../demos/row-spanning-custom/index.ts | 6 + .../{ => demos/row-spanning}/RowSpanning.tsx | 5 +- .../row-spanning/demos/row-spanning/client.ts | 7 + .../row-spanning/demos/row-spanning/index.ts | 6 + .../data-grid/row-spanning/row-spanning.md | 8 +- .../row-updates/InfiniteLoadingGrid.js | 170 --- .../data-grid/row-updates/LazyLoadingGrid.js | 113 -- .../row-updates/LazyLoadingGrid.tsx.preview | 13 - .../row-updates/ThrottledRowsGrid.js | 53 - .../row-updates/ThrottledRowsGrid.tsx.preview | 6 - .../data-grid/row-updates/UpdateRowsApiRef.js | 80 -- .../data-grid/row-updates/UpdateRowsProp.js | 83 -- .../InfiniteLoadingGrid.tsx | 14 +- .../demos/infinite-loading-grid/client.ts | 7 + .../demos/infinite-loading-grid/index.ts | 6 + .../lazy-loading-grid}/LazyLoadingGrid.tsx | 16 +- .../demos/lazy-loading-grid/client.ts | 7 + .../demos/lazy-loading-grid/index.ts | 6 + .../ThrottledRowsGrid.tsx | 5 +- .../demos/throttled-rows-grid/client.ts | 7 + .../demos/throttled-rows-grid/index.ts | 6 + .../update-rows-api-ref}/UpdateRowsApiRef.tsx | 5 +- .../demos/update-rows-api-ref/client.ts | 7 + .../demos/update-rows-api-ref/index.ts | 6 + .../update-rows-prop}/UpdateRowsProp.tsx | 5 +- .../demos/update-rows-prop/client.ts | 7 + .../demos/update-rows-prop/index.ts | 6 + .../data/data-grid/row-updates/row-updates.md | 10 +- .../data-grid/scrolling/ScrollApiNoSnap.js | 6 - .../data-grid/scrolling/ScrollPlayground.js | 110 -- .../data-grid/scrolling/ScrollRestoration.js | 59 - .../scrolling/ScrollRestoration.tsx.preview | 13 - .../scroll-api-no-snap/ScrollApiNoSnap.tsx | 9 + .../demos/scroll-api-no-snap/client.ts | 7 + .../demos/scroll-api-no-snap/index.ts | 6 + .../scroll-playground}/ScrollPlayground.tsx | 4 +- .../demos/scroll-playground/client.ts | 7 + .../demos/scroll-playground/index.ts | 6 + .../scroll-restoration}/ScrollRestoration.tsx | 4 +- .../demos/scroll-restoration/client.ts | 7 + .../demos/scroll-restoration/index.ts | 6 + docs/data/data-grid/scrolling/scrolling.md | 6 +- .../NestedPaginationGroupingCell.tsx | 12 +- .../ServerSideCursorBlocking.js | 69 - .../ServerSideCursorBlocking.tsx.preview | 12 - .../ServerSideCursorNonBlocking.js | 158 --- .../server-side-data/ServerSideDataGrid.js | 45 - .../ServerSideDataGrid.tsx.preview | 10 - .../ServerSideDataGridAggregation.js | 74 -- .../ServerSideDataGridAggregation.tsx.preview | 10 - ...erverSideDataGridAggregationLazyLoading.js | 62 - ...DataGridAggregationLazyLoading.tsx.preview | 15 - .../ServerSideDataGridAggregationPivoting.js | 83 -- ...ideDataGridAggregationPivoting.tsx.preview | 8 - ...erverSideDataGridAggregationRowGrouping.js | 89 -- ...DataGridAggregationRowGrouping.tsx.preview | 8 - .../ServerSideDataGridAggregationTreeData.js | 70 - ...ideDataGridAggregationTreeData.tsx.preview | 14 - .../ServerSideDataGridKeepPreviousData.js | 46 - ...erSideDataGridKeepPreviousData.tsx.preview | 11 - .../ServerSideDataGridNoCache.js | 59 - .../ServerSideDataGridNoCache.tsx.preview | 8 - .../ServerSideDataGridRevalidation.js | 168 --- ...ServerSideDataGridRevalidation.tsx.preview | 13 - .../server-side-data/ServerSideDataGridTTL.js | 56 - .../ServerSideDataGridTTL.tsx.preview | 8 - .../server-side-data/ServerSideEditing.js | 71 - .../ServerSideErrorHandling.js | 146 --- .../ServerSideLazyLoadingErrorHandling.js | 110 -- .../ServerSideLazyLoadingFullyReplaced.js | 184 --- ...verSideLazyLoadingGroupingRevalidation.tsx | 6 +- .../ServerSideLazyLoadingInfinite.js | 48 - .../ServerSideLazyLoadingModeUpdate.js | 83 -- .../ServerSideLazyLoadingRequestThrottle.js | 115 -- .../ServerSideLazyLoadingRevalidation.tsx | 8 +- .../ServerSideLazyLoadingRevalidationTabs.js | 76 -- ...ideLazyLoadingRowGroupingGroupExpansion.js | 69 - ...adingRowGroupingGroupExpansion.tsx.preview | 10 - ...erSideLazyLoadingTreeDataGroupExpansion.js | 68 - ...yLoadingTreeDataGroupExpansion.tsx.preview | 10 - ...verSideLazyLoadingTreeDataRevalidation.tsx | 5 +- .../ServerSideLazyLoadingViewport.js | 49 - ...erverSidePivotingColumnStructureComplex.js | 146 --- ...PivotingColumnStructureComplex.tsx.preview | 14 - ...ServerSidePivotingColumnStructureSimple.js | 142 -- ...ePivotingColumnStructureSimple.tsx.preview | 14 - .../ServerSidePivotingDataGrid.js | 93 -- .../ServerSidePivotingDataGrid.tsx.preview | 10 - .../ServerSidePivotingDerivedColumns.js | 125 -- ...rverSidePivotingDerivedColumns.tsx.preview | 11 - .../ServerSidePivotingErrorHandling.js | 169 --- .../ServerSidePivotingGroupExpansion.js | 91 -- ...rverSidePivotingGroupExpansion.tsx.preview | 9 - .../ServerSideRowGroupingDataGrid.js | 70 - .../ServerSideRowGroupingErrorHandling.js | 127 -- ...rverSideRowGroupingExpansionPersistence.js | 82 -- .../ServerSideRowGroupingFullDataGrid.js | 83 -- ...verSideRowGroupingFullDataGrid.tsx.preview | 13 - .../ServerSideRowGroupingGroupExpansion.js | 71 - .../ServerSideRowGroupingNestedLazyLoading.js | 68 - ...deRowGroupingNestedLazyLoading.tsx.preview | 9 - .../server-side-data/ServerSideTreeData.js | 79 -- .../ServerSideTreeData.tsx.preview | 15 - .../ServerSideTreeDataCustomCache.js | 104 -- .../ServerSideTreeDataCustomCache.tsx.preview | 14 - .../ServerSideTreeDataErrorHandling.js | 144 --- .../ServerSideTreeDataExpansionPersistence.js | 95 -- .../ServerSideTreeDataGroupExpansion.js | 74 -- ...rverSideTreeDataGroupExpansion.tsx.preview | 16 - .../ServerSideTreeDataNestedLazyLoading.js | 67 - ...rSideTreeDataNestedLazyLoading.tsx.preview | 9 - .../ServerSideTreeDataNestedPagination.js | 69 - ...erSideTreeDataNestedPagination.tsx.preview | 12 - .../ServerSideTreeDataRevalidation.js | 418 ------ ...ServerSideTreeDataRevalidation.tsx.preview | 14 - .../data-grid/server-side-data/aggregation.md | 10 +- .../ServerSideCursorBlocking.tsx | 6 +- .../server-side-cursor-blocking/client.ts | 7 + .../server-side-cursor-blocking/index.ts | 6 + .../ServerSideCursorNonBlocking.tsx | 10 +- .../server-side-cursor-non-blocking/client.ts | 7 + .../server-side-cursor-non-blocking/index.ts | 6 + ...rverSideDataGridAggregationLazyLoading.tsx | 9 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideDataGridAggregationPivoting.tsx | 6 +- .../client.ts | 7 + .../index.ts | 8 + ...rverSideDataGridAggregationRowGrouping.tsx | 5 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideDataGridAggregationTreeData.tsx | 10 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideDataGridAggregation.tsx | 9 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideDataGridKeepPreviousData.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideDataGridNoCache.tsx | 5 +- .../server-side-data-grid-no-cache/client.ts | 7 + .../server-side-data-grid-no-cache/index.ts | 6 + .../ServerSideDataGridRevalidation.tsx | 6 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideDataGridTTL.tsx | 9 +- .../demos/server-side-data-grid-ttl/client.ts | 7 + .../demos/server-side-data-grid-ttl/index.ts | 6 + .../ServerSideDataGrid.tsx | 5 +- .../demos/server-side-data-grid/client.ts | 7 + .../demos/server-side-data-grid/index.ts | 6 + .../ServerSideEditing.tsx | 5 +- .../demos/server-side-editing/client.ts | 7 + .../demos/server-side-editing/index.ts | 6 + .../ServerSideErrorHandling.tsx | 14 +- .../server-side-error-handling/client.ts | 7 + .../demos/server-side-error-handling/index.ts | 6 + .../ServerSideLazyLoadingErrorHandling.tsx | 6 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideLazyLoadingFullyReplaced.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideLazyLoadingInfinite.tsx | 7 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideLazyLoadingModeUpdate.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideLazyLoadingRequestThrottle.tsx | 5 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideLazyLoadingRevalidationTabs.tsx | 8 +- .../client.ts | 7 + .../index.ts | 8 + ...deLazyLoadingRowGroupingGroupExpansion.tsx | 4 +- .../client.ts | 7 + .../index.ts | 8 + ...rSideLazyLoadingTreeDataGroupExpansion.tsx | 10 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideLazyLoadingViewport.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + ...rverSidePivotingColumnStructureComplex.tsx | 6 +- .../client.ts | 7 + .../index.ts | 8 + ...erverSidePivotingColumnStructureSimple.tsx | 6 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSidePivotingDataGrid.tsx | 6 +- .../server-side-pivoting-data-grid/client.ts | 7 + .../server-side-pivoting-data-grid/index.ts | 6 + .../ServerSidePivotingDerivedColumns.tsx | 6 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSidePivotingErrorHandling.tsx | 10 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSidePivotingGroupExpansion.tsx | 6 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideRowGroupingDataGrid.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideRowGroupingErrorHandling.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + ...verSideRowGroupingExpansionPersistence.tsx | 5 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideRowGroupingFullDataGrid.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideRowGroupingGroupExpansion.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + ...ServerSideRowGroupingNestedLazyLoading.tsx | 4 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideTreeDataCustomCache.tsx | 7 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideTreeDataErrorHandling.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + ...ServerSideTreeDataExpansionPersistence.tsx | 10 +- .../client.ts | 7 + .../index.ts | 8 + .../ServerSideTreeDataGroupExpansion.tsx | 10 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideTreeDataNestedLazyLoading.tsx | 10 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideTreeDataNestedPagination.tsx | 11 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideTreeDataRevalidation.tsx | 6 +- .../client.ts | 7 + .../index.ts | 6 + .../ServerSideTreeData.tsx | 10 +- .../demos/server-side-tree-data/client.ts | 7 + .../demos/server-side-tree-data/index.ts | 6 + docs/data/data-grid/server-side-data/index.md | 14 +- .../server-side-data/lazy-loading.md | 22 +- .../data-grid/server-side-data/pivoting.md | 12 +- .../data-grid/server-side-data/recipes.md | 6 +- .../server-side-data/row-grouping.md | 10 +- .../data-grid/server-side-data/tree-data.md | 12 +- .../server-side-data/useNestedPagination.tsx | 4 +- .../data-grid/sorting/BasicExampleDataGrid.js | 18 - .../sorting/BasicExampleDataGrid.tsx | 18 - .../sorting/BasicExampleDataGrid.tsx.preview | 1 - .../sorting/BasicExampleDataGridPro.js | 18 - .../sorting/BasicExampleDataGridPro.tsx | 18 - .../BasicExampleDataGridPro.tsx.preview | 1 - docs/data/data-grid/sorting/ControlledSort.js | 31 - .../sorting/ControlledSort.tsx.preview | 6 - .../data-grid/sorting/DisableSortingGrid.js | 26 - .../sorting/DisableSortingGrid.tsx.preview | 1 - .../sorting/DisableSortingGridAllColumns.js | 18 - .../DisableSortingGridAllColumns.tsx.preview | 1 - .../sorting/ExtendedSortComparator.js | 80 -- .../sorting/FullyCustomSortComparator.js | 52 - .../data-grid/sorting/GetSortComparator.js | 46 - .../sorting/GetSortComparator.tsx.preview | 1 - docs/data/data-grid/sorting/InitialSort.js | 33 - .../data-grid/sorting/InitialSort.tsx.preview | 16 - .../sorting/MultiSortingWithoutModifier.js | 32 - .../MultiSortingWithoutModifier.tsx.preview | 6 - .../data-grid/sorting/OrderSortingGrid.js | 34 - .../sorting/OrderSortingPerColumnGrid.js | 39 - .../OrderSortingPerColumnGrid.tsx.preview | 6 - .../data-grid/sorting/ReadOnlySortingGrid.js | 91 -- .../sorting/ReadOnlySortingGrid.tsx.preview | 13 - .../data-grid/sorting/ServerSortingGrid.js | 36 - .../sorting/ServerSortingGrid.tsx.preview | 7 - .../data-grid/sorting/SortingApiNoSnap.js | 6 - .../BasicExampleDataGridPro.tsx | 20 + .../basic-example-data-grid-pro/client.ts | 7 + .../basic-example-data-grid-pro/index.ts | 6 + .../BasicExampleDataGrid.tsx | 20 + .../demos/basic-example-data-grid/client.ts | 7 + .../demos/basic-example-data-grid/index.ts | 6 + .../controlled-sort}/ControlledSort.tsx | 5 +- .../sorting/demos/controlled-sort/client.ts | 7 + .../sorting/demos/controlled-sort/index.ts | 6 + .../DisableSortingGridAllColumns.tsx | 2 + .../client.ts | 7 + .../disable-sorting-grid-all-columns/index.ts | 6 + .../DisableSortingGrid.tsx | 2 + .../demos/disable-sorting-grid/client.ts | 7 + .../demos/disable-sorting-grid/index.ts | 6 + .../ExtendedSortComparator.tsx | 5 +- .../demos/extended-sort-comparator/client.ts | 7 + .../demos/extended-sort-comparator/index.ts | 6 + .../FullyCustomSortComparator.tsx | 5 +- .../fully-custom-sort-comparator/client.ts | 7 + .../fully-custom-sort-comparator/index.ts | 6 + .../GetSortComparator.tsx | 8 +- .../demos/get-sort-comparator/client.ts | 7 + .../demos/get-sort-comparator/index.ts | 6 + .../{ => demos/initial-sort}/InitialSort.tsx | 2 + .../sorting/demos/initial-sort/client.ts | 7 + .../sorting/demos/initial-sort/index.ts | 6 + .../MultiSortingWithoutModifier.tsx | 5 +- .../multi-sorting-without-modifier/client.ts | 7 + .../multi-sorting-without-modifier/index.ts | 6 + .../order-sorting-grid}/OrderSortingGrid.tsx | 2 + .../demos/order-sorting-grid/client.ts | 7 + .../sorting/demos/order-sorting-grid/index.ts | 6 + .../OrderSortingPerColumnGrid.tsx | 5 +- .../order-sorting-per-column-grid/client.ts | 7 + .../order-sorting-per-column-grid/index.ts | 6 + .../ReadOnlySortingGrid.tsx | 4 +- .../demos/read-only-sorting-grid/client.ts | 7 + .../demos/read-only-sorting-grid/index.ts | 6 + .../ServerSortingGrid.tsx | 8 +- .../demos/server-sorting-grid/client.ts | 7 + .../demos/server-sorting-grid/index.ts | 6 + .../sorting-api-no-snap/SortingApiNoSnap.tsx | 9 + .../demos/sorting-api-no-snap/client.ts | 7 + .../demos/sorting-api-no-snap/index.ts | 6 + docs/data/data-grid/sorting/sorting.md | 30 +- docs/data/data-grid/state/DirectSelector.js | 54 - docs/data/data-grid/state/InitialState.js | 30 - .../data-grid/state/InitialState.tsx.preview | 15 - .../data-grid/state/RestoreStateApiRef.js | 314 ----- .../state/RestoreStateApiRef.tsx.preview | 8 - .../state/RestoreStateInitialState.js | 165 --- .../state/SaveAndRestoreStateInitialState.js | 55 - ...aveAndRestoreStateInitialState.tsx.preview | 9 - .../data-grid/state/SelectorInEventHandler.js | 45 - .../state/SelectorInEventHandler.tsx.preview | 9 - docs/data/data-grid/state/UseGridSelector.js | 55 - .../state/UseGridSelector.tsx.preview | 11 - .../direct-selector}/DirectSelector.tsx | 2 + .../state/demos/direct-selector/client.ts | 7 + .../state/demos/direct-selector/index.ts | 6 + .../initial-state}/InitialState.tsx | 2 + .../state/demos/initial-state/client.ts | 7 + .../state/demos/initial-state/index.ts | 6 + .../RestoreStateApiRef.tsx | 4 +- .../demos/restore-state-api-ref/client.ts | 7 + .../demos/restore-state-api-ref/index.ts | 6 + .../RestoreStateInitialState.tsx | 5 +- .../restore-state-initial-state/client.ts | 7 + .../restore-state-initial-state/index.ts | 6 + .../SaveAndRestoreStateInitialState.tsx | 9 +- .../client.ts | 7 + .../index.ts | 6 + .../SelectorInEventHandler.tsx | 10 +- .../demos/selector-in-event-handler/client.ts | 7 + .../demos/selector-in-event-handler/index.ts | 6 + .../use-grid-selector}/UseGridSelector.tsx | 2 + .../state/demos/use-grid-selector/client.ts | 7 + .../state/demos/use-grid-selector/index.ts | 6 + docs/data/data-grid/state/state.md | 14 +- .../style-recipes/CellFocusNoOutline.js | 30 - .../CellFocusNoOutline.tsx.preview | 13 - .../ColumnHeaderHideSeparator.js | 44 - .../ColumnHeaderHideSeparator.tsx.preview | 11 - .../StylingAllCellsButAggregation.js | 78 -- .../CellFocusNoOutline.tsx | 2 + .../demos/cell-focus-no-outline/client.ts | 7 + .../demos/cell-focus-no-outline/index.ts | 6 + .../ColumnHeaderHideSeparator.tsx | 5 +- .../column-header-hide-separator/client.ts | 7 + .../column-header-hide-separator/index.ts | 6 + .../StylingAllCellsButAggregation.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../data-grid/style-recipes/style-recipes.md | 6 +- docs/data/data-grid/style/AntDesignGrid.js | 159 --- .../data-grid/style/AntDesignGrid.tsx.preview | 10 - .../data-grid/style/BackgroundColorsGrid.js | 108 -- .../data-grid/style/RowGroupingStyling.js | 91 -- docs/data/data-grid/style/StripedGrid.js | 60 - .../data-grid/style/StripedGrid.tsx.preview | 7 - docs/data/data-grid/style/StylingAllCells.js | 46 - .../style/StylingAllCells.tsx.preview | 10 - docs/data/data-grid/style/StylingCellsGrid.js | 72 -- .../style/StylingCellsGrid.tsx.preview | 1 - .../data/data-grid/style/StylingHeaderGrid.js | 53 - .../style/StylingHeaderGrid.tsx.preview | 1 - docs/data/data-grid/style/StylingRowsGrid.js | 79 -- .../style/StylingRowsGrid.tsx.preview | 5 - docs/data/data-grid/style/SxProp.js | 27 - docs/data/data-grid/style/SxProp.tsx.preview | 11 - .../ant-design-grid}/AntDesignGrid.tsx | 5 +- .../style/demos/ant-design-grid/client.ts | 7 + .../style/demos/ant-design-grid/index.ts | 6 + .../BackgroundColorsGrid.tsx | 4 +- .../demos/background-colors-grid/client.ts | 7 + .../demos/background-colors-grid/index.ts | 6 + .../RowGroupingStyling.tsx | 4 +- .../demos/row-grouping-styling/client.ts | 7 + .../style/demos/row-grouping-styling/index.ts | 6 + .../{ => demos/striped-grid}/StripedGrid.tsx | 2 + .../style/demos/striped-grid/client.ts | 7 + .../style/demos/striped-grid/index.ts | 6 + .../styling-all-cells}/StylingAllCells.tsx | 5 +- .../style/demos/styling-all-cells/client.ts | 7 + .../style/demos/styling-all-cells/index.ts | 6 + .../styling-cells-grid}/StylingCellsGrid.tsx | 4 +- .../style/demos/styling-cells-grid/client.ts | 7 + .../style/demos/styling-cells-grid/index.ts | 6 + .../StylingHeaderGrid.tsx | 4 +- .../style/demos/styling-header-grid/client.ts | 7 + .../style/demos/styling-header-grid/index.ts | 6 + .../styling-rows-grid}/StylingRowsGrid.tsx | 5 +- .../style/demos/styling-rows-grid/client.ts | 7 + .../style/demos/styling-rows-grid/index.ts | 6 + .../style/{ => demos/sx-prop}/SxProp.tsx | 2 + .../data-grid/style/demos/sx-prop/client.ts | 7 + .../data-grid/style/demos/sx-prop/index.ts | 6 + docs/data/data-grid/style/style.md | 18 +- .../tree-data/TreeDataCustomGroupingColumn.js | 181 --- .../TreeDataCustomGroupingColumn.tsx.preview | 7 - .../TreeDataDisableChildrenFiltering.js | 160 --- .../TreeDataDisableChildrenSorting.js | 151 --- .../tree-data/TreeDataFullExample.js | 22 - .../tree-data/TreeDataFullExample.tsx.preview | 5 - .../data-grid/tree-data/TreeDataReordering.js | 35 - .../tree-data/TreeDataReordering.tsx.preview | 8 - .../tree-data/TreeDataSyncRowData.js | 114 -- .../data-grid/tree-data/TreeDataWithGap.js | 116 -- .../tree-data/TreeDataWithGap.tsx.preview | 6 - .../TreeDataCustomGroupingColumn.tsx | 13 +- .../client.ts | 7 + .../tree-data-custom-grouping-column/index.ts | 6 + .../TreeDataDisableChildrenFiltering.tsx | 7 +- .../client.ts | 7 + .../index.ts | 6 + .../TreeDataDisableChildrenSorting.tsx | 6 +- .../client.ts | 7 + .../index.ts | 6 + .../TreeDataFullExample.tsx | 2 + .../demos/tree-data-full-example/client.ts | 7 + .../demos/tree-data-full-example/index.ts | 6 + .../TreeDataReordering.tsx | 5 +- .../demos/tree-data-reordering/client.ts | 7 + .../demos/tree-data-reordering/index.ts | 6 + .../TreeDataSyncRowData.tsx | 13 +- .../demos/tree-data-sync-row-data/client.ts | 7 + .../demos/tree-data-sync-row-data/index.ts | 6 + .../tree-data-with-gap}/TreeDataWithGap.tsx | 5 +- .../demos/tree-data-with-gap/client.ts | 7 + .../demos/tree-data-with-gap/index.ts | 6 + docs/data/data-grid/tree-data/tree-data.md | 14 +- .../utils/TreeDataSyncRowDataGroupingCell.tsx | 3 +- .../data-grid/undo-redo/AddFilterHandler.js | 106 -- .../undo-redo/AddFilterHandler.tsx.preview | 11 - .../data/data-grid/undo-redo/BasicUndoRedo.js | 26 - .../undo-redo/BasicUndoRedo.tsx.preview | 8 - .../data-grid/undo-redo/CustomHandlers.js | 53 - .../data-grid/undo-redo/DataSourceUndoRedo.js | 63 - .../undo-redo/DataSourceUndoRedo.tsx.preview | 13 - .../data-grid/undo-redo/ToggleUndoRedo.js | 42 - .../undo-redo/customHistoryEventHandlers.ts | 4 +- .../add-filter-handler}/AddFilterHandler.tsx | 12 +- .../demos/add-filter-handler/client.ts | 7 + .../demos/add-filter-handler/index.ts | 6 + .../basic-undo-redo}/BasicUndoRedo.tsx | 2 + .../undo-redo/demos/basic-undo-redo/client.ts | 7 + .../undo-redo/demos/basic-undo-redo/index.ts | 6 + .../custom-handlers}/CustomHandlers.tsx | 9 +- .../undo-redo/demos/custom-handlers/client.ts | 7 + .../undo-redo/demos/custom-handlers/index.ts | 6 + .../DataSourceUndoRedo.tsx | 5 +- .../demos/data-source-undo-redo/client.ts | 7 + .../demos/data-source-undo-redo/index.ts | 6 + .../toggle-undo-redo}/ToggleUndoRedo.tsx | 2 + .../demos/toggle-undo-redo/client.ts | 7 + .../undo-redo/demos/toggle-undo-redo/index.ts | 6 + docs/data/data-grid/undo-redo/undo-redo.md | 10 +- .../ColumnVirtualizationGrid.js | 45 - .../ColumnVirtualizationGrid.tsx.preview | 1 - .../virtualization/VirtualizerLayoutMode.js | 55 - .../ColumnVirtualizationGrid.tsx | 5 +- .../column-virtualization-grid/client.ts | 7 + .../demos/column-virtualization-grid/index.ts | 6 + .../VirtualizerLayoutMode.tsx | 2 + .../demos/virtualizer-layout-mode/client.ts | 7 + .../demos/virtualizer-layout-mode/index.ts | 6 + .../virtualization/virtualization.md | 4 +- .../adapters-locale/AmPMCustomization.js | 49 - .../CustomCalendarHeaderFormat.js | 24 - .../CustomCalendarHeaderFormat.tsx.preview | 9 - .../adapters-locale/CustomDayOfWeekFormat.js | 19 - .../CustomDayOfWeekFormat.tsx.preview | 5 - .../adapters-locale/CustomFieldFormat.js | 25 - .../CustomFieldFormat.tsx.preview | 10 - .../adapters-locale/CustomToolbarFormat.js | 18 - .../CustomToolbarFormat.tsx.preview | 7 - .../adapters-locale/FieldPlaceholder.js | 30 - .../FieldPlaceholder.tsx.preview | 16 - .../adapters-locale/LocalizationDateFns.js | 43 - .../adapters-locale/LocalizationDayjs.js | 43 - .../adapters-locale/LocalizationLuxon.js | 43 - .../adapters-locale/LocalizationMoment.js | 47 - .../adapters-locale/PickersRTL.js | 51 - .../RespectLeadingZerosFieldFormat.js | 27 - ...RespectLeadingZerosFieldFormat.tsx.preview | 12 - .../adapters-locale/adapters-locale.md | 24 +- .../AmPMCustomization.tsx | 2 + .../demos/am-pm-customization/client.ts | 7 + .../demos/am-pm-customization/index.ts | 6 + .../CustomCalendarHeaderFormat.tsx | 2 + .../custom-calendar-header-format/client.ts | 7 + .../custom-calendar-header-format/index.ts | 6 + .../CustomDayOfWeekFormat.tsx | 5 +- .../demos/custom-day-of-week-format/client.ts | 7 + .../demos/custom-day-of-week-format/index.ts | 6 + .../CustomFieldFormat.tsx | 2 + .../demos/custom-field-format/client.ts | 7 + .../demos/custom-field-format/index.ts | 6 + .../CustomToolbarFormat.tsx | 2 + .../demos/custom-toolbar-format/client.ts | 7 + .../demos/custom-toolbar-format/index.ts | 6 + .../field-placeholder}/FieldPlaceholder.tsx | 2 + .../demos/field-placeholder/client.ts | 7 + .../demos/field-placeholder/index.ts | 6 + .../LocalizationDateFns.tsx | 2 + .../demos/localization-date-fns/client.ts | 7 + .../demos/localization-date-fns/index.ts | 6 + .../localization-dayjs}/LocalizationDayjs.tsx | 2 + .../demos/localization-dayjs/client.ts | 7 + .../demos/localization-dayjs/index.ts | 6 + .../localization-luxon}/LocalizationLuxon.tsx | 2 + .../demos/localization-luxon/client.ts | 7 + .../demos/localization-luxon/index.ts | 6 + .../LocalizationMoment.tsx | 2 + .../demos/localization-moment/client.ts | 7 + .../demos/localization-moment/index.ts | 6 + .../{ => demos/pickers-rtl}/PickersRTL.tsx | 2 + .../demos/pickers-rtl/client.ts | 7 + .../demos/pickers-rtl/index.ts | 6 + .../RespectLeadingZerosFieldFormat.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../base-concepts/BasicDateCalendar.js | 14 - .../base-concepts/BasicDateCalendar.tsx | 14 - .../BasicDateCalendar.tsx.preview | 1 - .../base-concepts/BasicDateField.js | 14 - .../base-concepts/BasicDateField.tsx | 14 - .../base-concepts/BasicDateField.tsx.preview | 1 - .../base-concepts/BasicDatePicker.js | 14 - .../base-concepts/BasicDatePicker.tsx | 14 - .../base-concepts/BasicDatePicker.tsx.preview | 1 - .../base-concepts/ComponentExplorerNoSnap.js | 223 ---- .../base-concepts/ComponentFamilies.js | 93 -- .../base-concepts/ControlledComponent.js | 18 - .../ControlledComponent.tsx.preview | 1 - .../date-pickers/base-concepts/CustomSlots.js | 45 - .../ReferenceDateDefaultBehavior.js | 20 - .../ReferenceDateDefaultBehavior.tsx.preview | 6 - .../ReferenceDateExplicitDateTimePicker.js | 26 - ...enceDateExplicitDateTimePicker.tsx.preview | 8 - .../ReferenceDateExplicitTimePicker.js | 26 - ...eferenceDateExplicitTimePicker.tsx.preview | 8 - .../base-concepts/ReferenceDateRange.js | 14 - .../ReferenceDateRange.tsx.preview | 3 - .../base-concepts/ReferenceDateUsingValue.js | 18 - .../ReferenceDateUsingValue.tsx.preview | 4 - .../base-concepts/ResponsivePickers.js | 27 - .../ResponsivePickers.tsx.preview | 9 - .../base-concepts/base-concepts.md | 26 +- .../basic-date-calendar/BasicDateCalendar.tsx | 16 + .../demos/basic-date-calendar/client.ts | 7 + .../demos/basic-date-calendar/index.ts | 6 + .../demos/basic-date-field/BasicDateField.tsx | 16 + .../demos/basic-date-field/client.ts | 7 + .../demos/basic-date-field/index.ts | 6 + .../basic-date-picker/BasicDatePicker.tsx | 16 + .../demos/basic-date-picker/client.ts | 7 + .../demos/basic-date-picker/index.ts | 6 + .../ComponentExplorerNoSnap.tsx | 2 + .../component-explorer-no-snap/client.ts | 7 + .../demos/component-explorer-no-snap/index.ts | 6 + .../component-families}/ComponentFamilies.tsx | 2 + .../demos/component-families/client.ts | 7 + .../demos/component-families/index.ts | 6 + .../ControlledComponent.tsx | 4 +- .../demos/controlled-component/client.ts | 7 + .../demos/controlled-component/index.ts | 6 + .../{ => demos/custom-slots}/CustomSlots.tsx | 2 + .../demos/custom-slots/client.ts | 7 + .../base-concepts/demos/custom-slots/index.ts | 6 + .../ReferenceDateDefaultBehavior.tsx | 2 + .../reference-date-default-behavior/client.ts | 7 + .../reference-date-default-behavior/index.ts | 6 + .../ReferenceDateExplicitDateTimePicker.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ReferenceDateExplicitTimePicker.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ReferenceDateRange.tsx | 2 + .../demos/reference-date-range/client.ts | 7 + .../demos/reference-date-range/index.ts | 6 + .../ReferenceDateUsingValue.tsx | 2 + .../reference-date-using-value/client.ts | 7 + .../demos/reference-date-using-value/index.ts | 6 + .../responsive-pickers}/ResponsivePickers.tsx | 2 + .../demos/responsive-pickers/client.ts | 7 + .../demos/responsive-pickers/index.ts | 6 + .../calendar-systems/AdapterBuddhist.js | 17 - .../AdapterBuddhist.tsx.preview | 4 - .../calendar-systems/AdapterHijri.js | 101 -- .../calendar-systems/AdapterJalali.js | 50 - .../calendar-systems/AdapterMomentJalali.js | 51 - .../calendar-systems/calendar-systems.md | 8 +- .../adapter-buddhist}/AdapterBuddhist.tsx | 2 + .../demos/adapter-buddhist/client.ts | 7 + .../demos/adapter-buddhist/index.ts | 6 + .../adapter-hijri}/AdapterHijri.tsx | 6 +- .../demos/adapter-hijri/client.ts | 7 + .../demos/adapter-hijri/index.ts | 6 + .../adapter-jalali}/AdapterJalali.tsx | 2 + .../demos/adapter-jalali/client.ts | 7 + .../demos/adapter-jalali/index.ts | 6 + .../AdapterMomentJalali.tsx | 2 + .../demos/adapter-moment-jalali/client.ts | 7 + .../demos/adapter-moment-jalali/index.ts | 6 + .../custom-components/ActionBarComponent.js | 176 --- .../ActionBarComponent.tsx.preview | 11 - .../ActionBarComponentProps.js | 19 - .../ActionBarComponentProps.tsx.preview | 8 - .../ArrowSwitcherComponent.js | 64 - .../ArrowSwitcherComponentProps.js | 68 - .../CalendarHeaderComponent.js | 60 - .../CalendarHeaderComponent.tsx.preview | 1 - .../CalendarHeaderComponentProps.js | 16 - .../CalendarHeaderComponentProps.tsx.preview | 3 - .../CalendarHeaderComponentRange.js | 70 - .../CalendarHeaderComponentRange.tsx.preview | 1 - .../custom-components/MonthButtonComponent.js | 24 - .../MonthButtonComponent.tsx.preview | 5 - .../MonthButtonComponentProps.js | 28 - .../MonthButtonComponentProps.tsx.preview | 15 - .../custom-components/PickerDayDemoCSSVars.js | 23 - .../PickerDayDemoCSSVars.tsx.preview | 10 - .../PickerDayDemoCustomTheme.js | 20 - .../PickerDayDemoCustomTheme.tsx.preview | 3 - .../date-pickers/custom-components/Tabs.js | 36 - .../custom-components/Tabs.tsx.preview | 11 - .../custom-components/ToolbarComponent.js | 42 - .../ToolbarComponent.tsx.preview | 15 - .../custom-components/UsePickerAdapter.js | 82 -- .../UsePickerAdapter.tsx.preview | 14 - .../custom-components/YearButtonComponent.js | 20 - .../YearButtonComponent.tsx.preview | 1 - .../YearButtonComponentProps.js | 27 - .../YearButtonComponentProps.tsx.preview | 14 - .../custom-components/custom-components.md | 32 +- .../ActionBarComponentProps.tsx | 2 + .../action-bar-component-props/client.ts | 7 + .../demos/action-bar-component-props/index.ts | 6 + .../ActionBarComponent.tsx | 4 +- .../demos/action-bar-component/client.ts | 7 + .../demos/action-bar-component/index.ts | 6 + .../ArrowSwitcherComponentProps.tsx | 5 +- .../arrow-switcher-component-props/client.ts | 7 + .../arrow-switcher-component-props/index.ts | 6 + .../ArrowSwitcherComponent.tsx | 5 +- .../demos/arrow-switcher-component/client.ts | 7 + .../demos/arrow-switcher-component/index.ts | 6 + .../CalendarHeaderComponentProps.tsx | 2 + .../calendar-header-component-props/client.ts | 7 + .../calendar-header-component-props/index.ts | 6 + .../CalendarHeaderComponentRange.tsx | 4 +- .../calendar-header-component-range/client.ts | 7 + .../calendar-header-component-range/index.ts | 6 + .../CalendarHeaderComponent.tsx | 4 +- .../demos/calendar-header-component/client.ts | 7 + .../demos/calendar-header-component/index.ts | 6 + .../MonthButtonComponentProps.tsx | 2 + .../month-button-component-props/client.ts | 7 + .../month-button-component-props/index.ts | 6 + .../MonthButtonComponent.tsx | 2 + .../demos/month-button-component/client.ts | 7 + .../demos/month-button-component/index.ts | 6 + .../PickerDayDemoCSSVars.tsx | 2 + .../demos/picker-day-demo-css-vars/client.ts | 7 + .../demos/picker-day-demo-css-vars/index.ts | 6 + .../PickerDayDemoCustomTheme.tsx | 4 +- .../picker-day-demo-custom-theme/client.ts | 7 + .../picker-day-demo-custom-theme/index.ts | 6 + .../{ => demos/tabs}/Tabs.tsx | 8 +- .../custom-components/demos/tabs/client.ts | 7 + .../custom-components/demos/tabs/index.ts | 6 + .../toolbar-component}/ToolbarComponent.tsx | 8 +- .../demos/toolbar-component/client.ts | 7 + .../demos/toolbar-component/index.ts | 6 + .../use-picker-adapter}/UsePickerAdapter.tsx | 4 +- .../demos/use-picker-adapter/client.ts | 7 + .../demos/use-picker-adapter/index.ts | 6 + .../YearButtonComponentProps.tsx | 2 + .../year-button-component-props/client.ts | 7 + .../year-button-component-props/index.ts | 6 + .../YearButtonComponent.tsx | 2 + .../demos/year-button-component/client.ts | 7 + .../demos/year-button-component/index.ts | 6 + .../custom-components/getDensePickerTheme.ts | 2 +- .../date-pickers/custom-field/BrowserField.js | 129 -- .../custom-field/BrowserField.tsx.preview | 5 - .../BrowserMultiInputRangeField.js | 134 -- .../BrowserMultiInputRangeField.tsx.preview | 1 - .../BrowserSingleInputRangeField.js | 140 -- .../BrowserSingleInputRangeField.tsx.preview | 5 - .../custom-field/FieldFormatDensity.js | 17 - .../FieldFormatDensity.tsx.preview | 3 - .../custom-field/MaterialFieldWrapped.js | 22 - .../MaterialFieldWrapped.tsx.preview | 2 - .../custom-field/MultiInputDateRangePicker.js | 15 - .../MultiInputDateRangePicker.tsx | 15 - .../MultiInputDateRangePicker.tsx.preview | 1 - .../MultiInputDateRangePickerWrapped.js | 21 - ...ltiInputDateRangePickerWrapped.tsx.preview | 1 - .../MultiInputFieldSeparatorSlotProps.js | 23 - ...tiInputFieldSeparatorSlotProps.tsx.preview | 9 - .../MultiInputFieldTextFieldProps.js | 36 - .../custom-field/RangeFieldDateSeparator.js | 19 - .../RangeFieldDateSeparator.tsx.preview | 5 - .../custom-field/TextFieldSlotProps.js | 25 - .../TextFieldSlotProps.tsx.preview | 12 - .../MaterialDatePicker.js | 146 --- .../MaterialDatePicker.tsx | 168 --- .../MaterialDatePicker.tsx.preview | 9 - .../MaterialDatePicker.tsx | 171 +++ .../demos/material-date-picker/client.ts | 7 + .../demos/material-date-picker/index.ts | 6 + .../behavior-button/MaterialDatePicker.js | 60 - .../behavior-button/MaterialDatePicker.tsx | 68 - .../MaterialDatePicker.tsx.preview | 1 - .../MaterialDateRangePicker.js | 70 - .../MaterialDateRangePicker.tsx.preview | 1 - .../MaterialDatePicker.tsx | 70 + .../demos/material-date-picker/client.ts | 7 + .../demos/material-date-picker/index.ts | 6 + .../MaterialDateRangePicker.tsx | 10 +- .../material-date-range-picker/client.ts | 7 + .../demos/material-date-range-picker/index.ts | 6 + .../MaskedMaterialTextField.js | 175 --- .../MaskedMaterialTextField.tsx.preview | 1 - .../MaskedMaterialTextField.tsx | 9 +- .../masked-material-text-field/client.ts | 7 + .../demos/masked-material-text-field/index.ts | 6 + .../MaterialDatePicker.js | 81 -- .../MaterialDatePicker.tsx | 85 -- .../MaterialDatePicker.tsx.preview | 1 - .../MaterialDatePicker.tsx | 87 ++ .../demos/material-date-picker/client.ts | 7 + .../demos/material-date-picker/index.ts | 6 + .../MaterialDatePicker.js | 66 - .../MaterialDatePicker.tsx | 70 - .../MaterialDatePicker.tsx.preview | 1 - .../MaterialDatePicker.tsx | 72 ++ .../demos/material-date-picker/client.ts | 7 + .../demos/material-date-picker/index.ts | 6 + .../behavior-tutorial/MaterialDatePicker.js | 92 -- .../behavior-tutorial/MaterialDatePicker.tsx | 96 -- .../MaterialDatePicker.tsx.preview | 1 - .../MaterialDatePicker.tsx | 99 ++ .../demos/material-date-picker/client.ts | 7 + .../demos/material-date-picker/index.ts | 6 + .../date-pickers/custom-field/custom-field.md | 36 +- .../browser-field}/BrowserField.tsx | 6 +- .../demos/browser-field/client.ts | 7 + .../custom-field/demos/browser-field/index.ts | 6 + .../BrowserMultiInputRangeField.tsx | 14 +- .../browser-multi-input-range-field/client.ts | 7 + .../browser-multi-input-range-field/index.ts | 6 + .../BrowserSingleInputRangeField.tsx | 6 +- .../client.ts | 7 + .../browser-single-input-range-field/index.ts | 6 + .../FieldFormatDensity.tsx | 2 + .../demos/field-format-density/client.ts | 7 + .../demos/field-format-density/index.ts | 6 + .../MaterialFieldWrapped.tsx | 8 +- .../demos/material-field-wrapped/client.ts | 7 + .../demos/material-field-wrapped/index.ts | 6 + .../MultiInputDateRangePickerWrapped.tsx | 8 +- .../client.ts | 7 + .../index.ts | 6 + .../MultiInputDateRangePicker.tsx | 17 + .../multi-input-date-range-picker/client.ts | 7 + .../multi-input-date-range-picker/index.ts | 6 + .../MultiInputFieldSeparatorSlotProps.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../MultiInputFieldTextFieldProps.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../RangeFieldDateSeparator.tsx | 2 + .../range-field-date-separator/client.ts | 7 + .../demos/range-field-date-separator/index.ts | 6 + .../TextFieldSlotProps.tsx | 2 + .../demos/text-field-slot-props/client.ts | 7 + .../demos/text-field-slot-props/index.ts | 6 + .../custom-layout/AddComponent.js | 104 -- .../custom-layout/AddComponent.tsx.preview | 6 - .../custom-layout/LayoutBlocks.js | 141 -- .../custom-layout/MovingActions.js | 58 - .../custom-layout/MovingActions.tsx.preview | 15 - .../custom-layout/custom-layout.md | 6 +- .../add-component}/AddComponent.tsx | 8 +- .../demos/add-component/client.ts | 7 + .../demos/add-component/index.ts | 6 + .../demos/layout-blocks/LayoutBlocks.tsx | 145 +++ .../demos/layout-blocks/client.ts | 7 + .../demos/layout-blocks/index.ts | 6 + .../moving-actions}/MovingActions.tsx | 4 +- .../demos/moving-actions/client.ts | 7 + .../demos/moving-actions/index.ts | 6 + .../AddWarningIconWhenInvalid.js | 53 - .../AddWarningIconWhenInvalid.tsx.preview | 10 - .../AddWarningIconWhenInvalidRange.js | 63 - .../CustomOpeningIcon.js | 39 - .../CustomOpeningIcon.tsx.preview | 15 - .../CustomOpeningIconConditional.js | 27 - .../CustomOpeningIconConditional.tsx.preview | 8 - .../CustomPropsOpeningButton.js | 25 - .../CustomPropsOpeningButton.tsx.preview | 12 - .../StartEdgeOpeningButton.js | 18 - .../StartEdgeOpeningButton.tsx.preview | 5 - .../custom-opening-button.md | 12 +- .../AddWarningIconWhenInvalidRange.tsx | 9 +- .../client.ts | 7 + .../index.ts | 6 + .../AddWarningIconWhenInvalid.tsx | 7 +- .../add-warning-icon-when-invalid/client.ts | 7 + .../add-warning-icon-when-invalid/index.ts | 6 + .../CustomOpeningIconConditional.tsx | 4 +- .../custom-opening-icon-conditional/client.ts | 7 + .../custom-opening-icon-conditional/index.ts | 6 + .../CustomOpeningIcon.tsx | 2 + .../demos/custom-opening-icon/client.ts | 7 + .../demos/custom-opening-icon/index.ts | 6 + .../CustomPropsOpeningButton.tsx | 2 + .../custom-props-opening-button/client.ts | 7 + .../custom-props-opening-button/index.ts | 6 + .../StartEdgeOpeningButton.tsx | 2 + .../demos/start-edge-opening-button/client.ts | 7 + .../demos/start-edge-opening-button/index.ts | 6 + .../date-calendar/AddWeekNumber.js | 17 - .../date-calendar/AddWeekNumber.tsx.preview | 1 - .../date-calendar/BasicDateCalendar.js | 11 - .../date-calendar/BasicDateCalendar.tsx | 11 - .../BasicDateCalendar.tsx.preview | 1 - .../date-calendar/CustomMonthLayout.js | 11 - .../CustomMonthLayout.tsx.preview | 1 - .../date-calendar/DateCalendarFormProps.js | 20 - .../DateCalendarFormProps.tsx.preview | 6 - .../DateCalendarReferenceDate.js | 18 - .../DateCalendarReferenceDate.tsx.preview | 4 - .../DateCalendarServerRequest.js | 114 -- .../DateCalendarServerRequest.tsx.preview | 14 - .../date-calendar/DateCalendarValue.js | 23 - .../DateCalendarValue.tsx.preview | 6 - .../date-calendar/DateCalendarViews.js | 30 - .../DateCalendarViews.tsx.preview | 16 - .../date-pickers/date-calendar/WeekPicker.js | 95 -- .../date-calendar/WeekPicker.tsx.preview | 16 - .../date-calendar/YearMonthCalendar.js | 20 - .../YearMonthCalendar.tsx.preview | 6 - .../YearsOrderDescendingCalendar.js | 19 - .../YearsOrderDescendingCalendar.tsx.preview | 3 - .../date-calendar/date-calendar.md | 22 +- .../add-week-number}/AddWeekNumber.tsx | 2 + .../demos/add-week-number/client.ts | 7 + .../demos/add-week-number/index.ts | 6 + .../basic-date-calendar/BasicDateCalendar.tsx | 13 + .../demos/basic-date-calendar/client.ts | 7 + .../demos/basic-date-calendar/index.ts | 6 + .../CustomMonthLayout.tsx | 2 + .../demos/custom-month-layout/client.ts | 7 + .../demos/custom-month-layout/index.ts | 6 + .../DateCalendarFormProps.tsx | 2 + .../demos/date-calendar-form-props/client.ts | 7 + .../demos/date-calendar-form-props/index.ts | 6 + .../DateCalendarReferenceDate.tsx | 2 + .../date-calendar-reference-date/client.ts | 7 + .../date-calendar-reference-date/index.ts | 6 + .../DateCalendarServerRequest.tsx | 8 +- .../date-calendar-server-request/client.ts | 7 + .../date-calendar-server-request/index.ts | 6 + .../DateCalendarValue.tsx | 5 +- .../demos/date-calendar-value/client.ts | 7 + .../demos/date-calendar-value/index.ts | 6 + .../DateCalendarViews.tsx | 2 + .../demos/date-calendar-views/client.ts | 7 + .../demos/date-calendar-views/index.ts | 6 + .../{ => demos/week-picker}/WeekPicker.tsx | 8 +- .../date-calendar/demos/week-picker/client.ts | 7 + .../date-calendar/demos/week-picker/index.ts | 6 + .../YearMonthCalendar.tsx | 2 + .../demos/year-month-calendar/client.ts | 7 + .../demos/year-month-calendar/index.ts | 6 + .../YearsOrderDescendingCalendar.tsx | 2 + .../years-order-descending-calendar/client.ts | 7 + .../years-order-descending-calendar/index.ts | 6 + .../date-pickers/date-field/BasicDateField.js | 14 - .../date-field/BasicDateField.tsx | 14 - .../date-field/BasicDateField.tsx.preview | 1 - .../date-field/CustomDateFormat.js | 24 - .../date-field/CustomDateFormat.tsx.preview | 10 - .../date-pickers/date-field/DateFieldValue.js | 23 - .../date-field/DateFieldValue.tsx.preview | 6 - .../date-pickers/date-field/date-field.md | 6 +- .../demos/basic-date-field/BasicDateField.tsx | 16 + .../demos/basic-date-field/client.ts | 7 + .../demos/basic-date-field/index.ts | 6 + .../custom-date-format}/CustomDateFormat.tsx | 2 + .../demos/custom-date-format/client.ts | 7 + .../demos/custom-date-format/index.ts | 6 + .../date-field-value}/DateFieldValue.tsx | 5 +- .../demos/date-field-value/client.ts | 7 + .../demos/date-field-value/index.ts | 6 + .../date-picker/BasicDatePicker.js | 14 - .../date-picker/BasicDatePicker.tsx | 14 - .../date-picker/BasicDatePicker.tsx.preview | 1 - .../date-pickers/date-picker/ClearableProp.js | 54 - .../CustomizationExamplesNoSnap.js | 60 - .../date-picker/DatePickerOpenTo.js | 19 - .../date-picker/DatePickerOpenTo.tsx.preview | 6 - .../date-picker/DatePickerValue.js | 23 - .../date-picker/DatePickerValue.tsx.preview | 6 - .../date-picker/DatePickerViews.js | 19 - .../date-picker/DatePickerViews.tsx.preview | 6 - .../date-picker/DatePickerYearsOrder.js | 21 - .../DatePickerYearsOrder.tsx.preview | 8 - .../date-picker/FormPropsDatePickers.js | 16 - .../FormPropsDatePickers.tsx.preview | 3 - .../date-pickers/date-picker/HelperText.js | 18 - .../date-picker/HelperText.tsx.preview | 8 - .../date-picker/ResponsiveDatePickers.js | 36 - .../ResponsiveDatePickers.tsx.preview | 12 - .../date-picker/StaticDatePickerLandscape.js | 11 - .../StaticDatePickerLandscape.tsx.preview | 1 - .../date-pickers/date-picker/date-picker.md | 22 +- .../basic-date-picker/BasicDatePicker.tsx | 16 + .../demos/basic-date-picker/client.ts | 7 + .../demos/basic-date-picker/index.ts | 6 + .../clearable-prop}/ClearableProp.tsx | 2 + .../demos/clearable-prop/client.ts | 7 + .../date-picker/demos/clearable-prop/index.ts | 6 + .../CustomizationExamplesNoSnap.tsx | 64 + .../customization-examples-no-snap/client.ts | 7 + .../customization-examples-no-snap/index.ts | 6 + .../date-picker-open-to}/DatePickerOpenTo.tsx | 2 + .../demos/date-picker-open-to/client.ts | 7 + .../demos/date-picker-open-to/index.ts | 6 + .../date-picker-value}/DatePickerValue.tsx | 5 +- .../demos/date-picker-value/client.ts | 7 + .../demos/date-picker-value/index.ts | 6 + .../date-picker-views}/DatePickerViews.tsx | 2 + .../demos/date-picker-views/client.ts | 7 + .../demos/date-picker-views/index.ts | 6 + .../DatePickerYearsOrder.tsx | 2 + .../demos/date-picker-years-order/client.ts | 7 + .../demos/date-picker-years-order/index.ts | 6 + .../FormPropsDatePickers.tsx | 2 + .../demos/form-props-date-pickers/client.ts | 7 + .../demos/form-props-date-pickers/index.ts | 6 + .../{ => demos/helper-text}/HelperText.tsx | 2 + .../date-picker/demos/helper-text/client.ts | 7 + .../date-picker/demos/helper-text/index.ts | 6 + .../ResponsiveDatePickers.tsx | 2 + .../demos/responsive-date-pickers/client.ts | 7 + .../demos/responsive-date-pickers/index.ts | 6 + .../StaticDatePickerLandscape.tsx | 2 + .../static-date-picker-landscape/client.ts | 7 + .../static-date-picker-landscape/index.ts | 6 + .../date-picker/examplesConfig.styling.tsx | 16 +- .../BasicDateRangeCalendar.js | 14 - .../BasicDateRangeCalendar.tsx.preview | 1 - .../CustomDateRangePickerDay.js | 57 - .../CustomDateRangePickerDay.tsx.preview | 4 - .../DateRangeCalendarCalendarsProp.js | 19 - ...DateRangeCalendarCalendarsProp.tsx.preview | 6 - ...alendarCurrentMonthCalendarPositionProp.js | 14 - ...rrentMonthCalendarPositionProp.tsx.preview | 1 - .../DateRangeCalendarFormProps.js | 26 - .../DateRangeCalendarFormProps.tsx.preview | 12 - .../DateRangeCalendarValue.js | 31 - .../DateRangeCalendarValue.tsx.preview | 11 - .../date-range-calendar.md | 12 +- .../BasicDateRangeCalendar.tsx | 2 + .../demos/basic-date-range-calendar/client.ts | 7 + .../demos/basic-date-range-calendar/index.ts | 6 + .../CustomDateRangePickerDay.tsx | 8 +- .../custom-date-range-picker-day/client.ts | 7 + .../custom-date-range-picker-day/index.ts | 6 + .../DateRangeCalendarCalendarsProp.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + ...lendarCurrentMonthCalendarPositionProp.tsx | 2 + .../client.ts | 7 + .../index.ts | 8 + .../DateRangeCalendarFormProps.tsx | 2 + .../date-range-calendar-form-props/client.ts | 7 + .../date-range-calendar-form-props/index.ts | 6 + .../DateRangeCalendarValue.tsx | 7 +- .../demos/date-range-calendar-value/client.ts | 7 + .../demos/date-range-calendar-value/index.ts | 6 + .../date-range-field/BasicDateRangeField.js | 24 - .../BasicDateRangeField.tsx.preview | 8 - .../date-range-field/DateRangeFieldValue.js | 31 - .../DateRangeFieldValue.tsx.preview | 9 - .../date-range-field/date-range-field.md | 4 +- .../BasicDateRangeField.tsx | 2 + .../demos/basic-date-range-field/client.ts | 7 + .../demos/basic-date-range-field/index.ts | 6 + .../DateRangeFieldValue.tsx | 7 +- .../demos/date-range-field-value/client.ts | 7 + .../demos/date-range-field-value/index.ts | 6 + .../date-range-picker/BasicDateRangePicker.js | 14 - .../BasicDateRangePicker.tsx.preview | 1 - .../date-range-picker/BasicRangeShortcuts.js | 61 - .../date-range-picker/BasicRangeShortcuts.tsx | 63 - .../BasicRangeShortcuts.tsx.preview | 9 - .../DateRangePickerCalendarProp.js | 24 - .../DateRangePickerCalendarProp.tsx.preview | 9 - .../date-range-picker/DateRangePickerValue.js | 32 - .../DateRangePickerValue.tsx.preview | 11 - .../FormPropsDateRangePickers.js | 18 - .../FormPropsDateRangePickers.tsx.preview | 3 - .../MultiInputDateRangePicker.js | 15 - .../MultiInputDateRangePicker.tsx | 15 - .../MultiInputDateRangePicker.tsx.preview | 1 - .../ResponsiveDateRangePickers.js | 50 - .../date-range-picker/date-range-picker.md | 14 +- .../BasicDateRangePicker.tsx | 2 + .../demos/basic-date-range-picker/client.ts | 7 + .../demos/basic-date-range-picker/index.ts | 6 + .../BasicRangeShortcuts.tsx | 66 + .../demos/basic-range-shortcuts/client.ts | 7 + .../demos/basic-range-shortcuts/index.ts | 6 + .../DateRangePickerCalendarProp.tsx | 2 + .../date-range-picker-calendar-prop/client.ts | 7 + .../date-range-picker-calendar-prop/index.ts | 6 + .../DateRangePickerValue.tsx | 7 +- .../demos/date-range-picker-value/client.ts | 7 + .../demos/date-range-picker-value/index.ts | 6 + .../FormPropsDateRangePickers.tsx | 2 + .../form-props-date-range-pickers/client.ts | 7 + .../form-props-date-range-pickers/index.ts | 6 + .../MultiInputDateRangePicker.tsx | 17 + .../multi-input-date-range-picker/client.ts | 7 + .../multi-input-date-range-picker/index.ts | 6 + .../ResponsiveDateRangePickers.tsx | 2 + .../responsive-date-range-pickers/client.ts | 7 + .../responsive-date-range-pickers/index.ts | 6 + .../date-time-field/BasicDateTimeField.js | 14 - .../BasicDateTimeField.tsx.preview | 1 - .../date-time-field/CustomDateTimeFormat.js | 31 - .../CustomDateTimeFormat.tsx.preview | 15 - .../date-time-field/DateTimeFieldValue.js | 26 - .../DateTimeFieldValue.tsx.preview | 9 - .../date-time-field/date-time-field.md | 6 +- .../BasicDateTimeField.tsx | 2 + .../demos/basic-date-time-field/client.ts | 7 + .../demos/basic-date-time-field/index.ts | 6 + .../CustomDateTimeFormat.tsx | 2 + .../demos/custom-date-time-format/client.ts | 7 + .../demos/custom-date-time-format/index.ts | 6 + .../DateTimeFieldValue.tsx | 5 +- .../demos/date-time-field-value/client.ts | 7 + .../demos/date-time-field-value/index.ts | 6 + .../date-time-picker/BasicDateTimePicker.js | 14 - .../BasicDateTimePicker.tsx.preview | 1 - .../date-time-picker/DateTimePickerOpenTo.js | 16 - .../DateTimePickerOpenTo.tsx.preview | 2 - .../date-time-picker/DateTimePickerValue.js | 26 - .../DateTimePickerValue.tsx.preview | 9 - .../DateTimePickerViewRenderers.js | 30 - .../DateTimePickerViewRenderers.tsx.preview | 16 - .../date-time-picker/DateTimePickerViews.js | 28 - .../DateTimePickerViews.tsx.preview | 13 - .../FormPropsDateTimePickers.js | 18 - .../FormPropsDateTimePickers.tsx.preview | 3 - .../ResponsiveDateTimePickers.js | 36 - .../ResponsiveDateTimePickers.tsx.preview | 12 - .../StaticDateTimePickerLandscape.js | 11 - .../StaticDateTimePickerLandscape.tsx.preview | 1 - .../date-time-picker/date-time-picker.md | 16 +- .../BasicDateTimePicker.tsx | 2 + .../demos/basic-date-time-picker/client.ts | 7 + .../demos/basic-date-time-picker/index.ts | 6 + .../DateTimePickerOpenTo.tsx | 2 + .../demos/date-time-picker-open-to/client.ts | 7 + .../demos/date-time-picker-open-to/index.ts | 6 + .../DateTimePickerValue.tsx | 5 +- .../demos/date-time-picker-value/client.ts | 7 + .../demos/date-time-picker-value/index.ts | 6 + .../DateTimePickerViewRenderers.tsx | 2 + .../date-time-picker-view-renderers/client.ts | 7 + .../date-time-picker-view-renderers/index.ts | 6 + .../DateTimePickerViews.tsx | 2 + .../demos/date-time-picker-views/client.ts | 7 + .../demos/date-time-picker-views/index.ts | 6 + .../FormPropsDateTimePickers.tsx | 2 + .../form-props-date-time-pickers/client.ts | 7 + .../form-props-date-time-pickers/index.ts | 6 + .../ResponsiveDateTimePickers.tsx | 2 + .../responsive-date-time-pickers/client.ts | 7 + .../responsive-date-time-pickers/index.ts | 6 + .../StaticDateTimePickerLandscape.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../BasicDateTimeRangeField.js | 27 - .../BasicDateTimeRangeField.tsx.preview | 8 - .../DateTimeRangeFieldValue.js | 35 - .../DateTimeRangeFieldValue.tsx.preview | 9 - .../date-time-range-field.md | 4 +- .../BasicDateTimeRangeField.tsx | 2 + .../basic-date-time-range-field/client.ts | 7 + .../basic-date-time-range-field/index.ts | 6 + .../DateTimeRangeFieldValue.tsx | 7 +- .../date-time-range-field-value/client.ts | 7 + .../date-time-range-field-value/index.ts | 6 + .../BasicDateTimeRangePicker.js | 14 - .../BasicDateTimeRangePicker.tsx.preview | 1 - .../DateTimeRangePickerCalendarProp.js | 28 - ...ateTimeRangePickerCalendarProp.tsx.preview | 9 - .../DateTimeRangePickerValue.js | 32 - .../DateTimeRangePickerValue.tsx.preview | 11 - .../DateTimeRangePickerViewRenderer.js | 33 - ...ateTimeRangePickerViewRenderer.tsx.preview | 16 - .../FormPropsDateTimeRangePickers.js | 22 - .../FormPropsDateTimeRangePickers.tsx.preview | 3 - .../MultiInputDateTimeRangePicker.js | 15 - .../MultiInputDateTimeRangePicker.tsx.preview | 1 - .../ResponsiveDateTimeRangePickers.js | 37 - ...ResponsiveDateTimeRangePickers.tsx.preview | 15 - .../date-time-range-picker.md | 14 +- .../BasicDateTimeRangePicker.tsx | 2 + .../basic-date-time-range-picker/client.ts | 7 + .../basic-date-time-range-picker/index.ts | 6 + .../DateTimeRangePickerCalendarProp.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../DateTimeRangePickerValue.tsx | 7 +- .../date-time-range-picker-value/client.ts | 7 + .../date-time-range-picker-value/index.ts | 6 + .../DateTimeRangePickerViewRenderer.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../FormPropsDateTimeRangePickers.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../MultiInputDateTimeRangePicker.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../ResponsiveDateTimeRangePickers.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../digital-clock/DigitalClockAmPm.js | 66 - .../digital-clock/DigitalClockBasic.js | 20 - .../DigitalClockBasic.tsx.preview | 6 - .../digital-clock/DigitalClockFormProps.js | 46 - .../digital-clock/DigitalClockSkipDisabled.js | 41 - .../DigitalClockSkipDisabled.tsx.preview | 14 - .../digital-clock/DigitalClockTimeStep.js | 23 - .../DigitalClockTimeStep.tsx.preview | 9 - .../digital-clock/DigitalClockValue.js | 49 - .../digital-clock/DigitalClockViews.js | 28 - .../DigitalClockViews.tsx.preview | 9 - .../digital-clock-am-pm}/DigitalClockAmPm.tsx | 2 + .../demos/digital-clock-am-pm/client.ts | 7 + .../demos/digital-clock-am-pm/index.ts | 6 + .../DigitalClockBasic.tsx | 2 + .../demos/digital-clock-basic/client.ts | 7 + .../demos/digital-clock-basic/index.ts | 6 + .../DigitalClockFormProps.tsx | 2 + .../demos/digital-clock-form-props/client.ts | 7 + .../demos/digital-clock-form-props/index.ts | 6 + .../DigitalClockSkipDisabled.tsx | 7 +- .../digital-clock-skip-disabled/client.ts | 7 + .../digital-clock-skip-disabled/index.ts | 6 + .../DigitalClockTimeStep.tsx | 2 + .../demos/digital-clock-time-step/client.ts | 7 + .../demos/digital-clock-time-step/index.ts | 6 + .../DigitalClockValue.tsx | 5 +- .../demos/digital-clock-value/client.ts | 7 + .../demos/digital-clock-value/index.ts | 6 + .../DigitalClockViews.tsx | 2 + .../demos/digital-clock-views/client.ts | 7 + .../demos/digital-clock-views/index.ts | 6 + .../digital-clock/digital-clock.md | 14 +- .../date-pickers/fields/ClearableBehavior.js | 56 - .../fields/ControlledSelectedSections.js | 40 - .../ControlledSelectedSections.tsx.preview | 16 - ...ledSelectedSectionsMultiInputRangeField.js | 58 - ...edSectionsMultiInputRangeField.tsx.preview | 11 - ...edSelectedSectionsSingleInputRangeField.js | 63 - ...dSectionsSingleInputRangeField.tsx.preview | 10 - .../date-pickers/fields/CustomizeClearIcon.js | 26 - .../fields/CustomizeClearIcon.tsx.preview | 10 - .../fields/DateRangeFieldExamples.js | 58 - .../date-pickers/fields/ImperativeClear.js | 137 -- .../fields/SingleDateFieldExamples.js | 27 - .../SingleDateFieldExamples.tsx.preview | 9 - .../clearable-behavior}/ClearableBehavior.tsx | 4 +- .../fields/demos/clearable-behavior/client.ts | 7 + .../fields/demos/clearable-behavior/index.ts | 6 + ...edSelectedSectionsMultiInputRangeField.tsx | 8 +- .../client.ts | 7 + .../index.ts | 8 + ...dSelectedSectionsSingleInputRangeField.tsx | 8 +- .../client.ts | 7 + .../index.ts | 8 + .../ControlledSelectedSections.tsx | 6 +- .../controlled-selected-sections/client.ts | 7 + .../controlled-selected-sections/index.ts | 6 + .../CustomizeClearIcon.tsx | 2 + .../demos/customize-clear-icon/client.ts | 7 + .../demos/customize-clear-icon/index.ts | 6 + .../DateRangeFieldExamples.tsx | 2 + .../demos/date-range-field-examples/client.ts | 7 + .../demos/date-range-field-examples/index.ts | 6 + .../imperative-clear}/ImperativeClear.tsx | 6 +- .../fields/demos/imperative-clear/client.ts | 7 + .../fields/demos/imperative-clear/index.ts | 6 + .../SingleDateFieldExamples.tsx | 2 + .../single-date-field-examples/client.ts | 7 + .../demos/single-date-field-examples/index.ts | 6 + docs/data/date-pickers/fields/fields.md | 16 +- .../lifecycle/KeepOpenDuringFieldFocus.js | 27 - .../KeepOpenDuringFieldFocus.tsx.preview | 12 - .../lifecycle/LifeCycleDateFieldEmpty.js | 20 - .../LifeCycleDateFieldEmpty.tsx.preview | 4 - .../lifecycle/LifeCycleDateRangeField.js | 26 - .../LifeCycleDateRangeField.tsx.preview | 9 - .../lifecycle/LifeCycleIgnoreInvalidValue.js | 29 - .../LifeCycleIgnoreInvalidValue.tsx.preview | 13 - .../lifecycle/ServerInteraction.js | 124 -- .../KeepOpenDuringFieldFocus.tsx | 2 + .../keep-open-during-field-focus/client.ts | 7 + .../keep-open-during-field-focus/index.ts | 6 + .../LifeCycleDateFieldEmpty.tsx | 4 +- .../life-cycle-date-field-empty/client.ts | 7 + .../life-cycle-date-field-empty/index.ts | 6 + .../LifeCycleDateRangeField.tsx | 7 +- .../life-cycle-date-range-field/client.ts | 7 + .../life-cycle-date-range-field/index.ts | 6 + .../LifeCycleIgnoreInvalidValue.tsx | 5 +- .../life-cycle-ignore-invalid-value/client.ts | 7 + .../life-cycle-ignore-invalid-value/index.ts | 6 + .../server-interaction}/ServerInteraction.tsx | 8 +- .../demos/server-interaction/client.ts | 7 + .../demos/server-interaction/index.ts | 6 + docs/data/date-pickers/lifecycle/lifecycle.md | 10 +- .../PickersLocalisationTableNoSnap.js | 6 - .../PickersLocalisationTableNoSnap.tsx | 9 + .../client.ts | 7 + .../index.ts | 6 + .../date-pickers/localization/localization.md | 2 +- .../playground/PickersPlaygroundWrapper.js | 5 - .../PickersPlaygroundWrapper.tsx | 8 + .../pickers-playground-wrapper/client.ts | 7 + .../demos/pickers-playground-wrapper/index.ts | 6 + .../date-pickers/playground/playground.md | 2 +- .../date-pickers/quickstart/FirstComponent.js | 11 - .../quickstart/FirstComponent.tsx.preview | 1 - .../first-component}/FirstComponent.tsx | 2 + .../demos/first-component/client.ts | 7 + .../quickstart/demos/first-component/index.ts | 6 + .../date-pickers/quickstart/quickstart.md | 2 +- .../shortcuts/AdvancedRangeShortcuts.js | 78 -- .../AdvancedRangeShortcuts.tsx.preview | 8 - .../shortcuts/BasicRangeShortcuts.js | 59 - .../shortcuts/BasicRangeShortcuts.tsx | 61 - .../shortcuts/BasicRangeShortcuts.tsx.preview | 7 - .../date-pickers/shortcuts/BasicShortcuts.js | 81 -- .../shortcuts/BasicShortcuts.tsx.preview | 7 - .../shortcuts/ChangeImportance.js | 104 -- .../shortcuts/CustomizedRangeShortcuts.js | 129 -- .../shortcuts/DisabledDatesShortcuts.js | 100 -- .../DisabledDatesShortcuts.tsx.preview | 8 - .../shortcuts/OnChangeShortcutLabel.js | 99 -- .../OnChangeShortcutLabel.tsx.preview | 13 - .../date-pickers/shortcuts/RTLShortcuts.js | 103 -- .../shortcuts/RTLShortcuts.tsx.preview | 9 - .../AdvancedRangeShortcuts.tsx | 9 +- .../demos/advanced-range-shortcuts/client.ts | 7 + .../demos/advanced-range-shortcuts/index.ts | 6 + .../BasicRangeShortcuts.tsx | 64 + .../demos/basic-range-shortcuts/client.ts | 7 + .../demos/basic-range-shortcuts/index.ts | 6 + .../basic-shortcuts}/BasicShortcuts.tsx | 7 +- .../shortcuts/demos/basic-shortcuts/client.ts | 7 + .../shortcuts/demos/basic-shortcuts/index.ts | 6 + .../change-importance}/ChangeImportance.tsx | 9 +- .../demos/change-importance/client.ts | 7 + .../demos/change-importance/index.ts | 6 + .../CustomizedRangeShortcuts.tsx | 9 +- .../customized-range-shortcuts/client.ts | 7 + .../demos/customized-range-shortcuts/index.ts | 6 + .../DisabledDatesShortcuts.tsx | 7 +- .../demos/disabled-dates-shortcuts/client.ts | 7 + .../demos/disabled-dates-shortcuts/index.ts | 6 + .../OnChangeShortcutLabel.tsx | 9 +- .../demos/on-change-shortcut-label/client.ts | 7 + .../demos/on-change-shortcut-label/index.ts | 6 + .../rtl-shortcuts}/RTLShortcuts.tsx | 7 +- .../shortcuts/demos/rtl-shortcuts/client.ts | 7 + .../shortcuts/demos/rtl-shortcuts/index.ts | 6 + docs/data/date-pickers/shortcuts/shortcuts.md | 16 +- .../date-pickers/time-clock/BasicTimeClock.js | 11 - .../time-clock/BasicTimeClock.tsx.preview | 1 - .../date-pickers/time-clock/TimeClockAmPm.js | 23 - .../time-clock/TimeClockAmPm.tsx.preview | 9 - .../time-clock/TimeClockFormProps.js | 20 - .../time-clock/TimeClockFormProps.tsx.preview | 6 - .../date-pickers/time-clock/TimeClockValue.js | 23 - .../time-clock/TimeClockValue.tsx.preview | 6 - .../date-pickers/time-clock/TimeClockViews.js | 22 - .../time-clock/TimeClockViews.tsx.preview | 9 - .../basic-time-clock}/BasicTimeClock.tsx | 2 + .../demos/basic-time-clock/client.ts | 7 + .../demos/basic-time-clock/index.ts | 6 + .../time-clock-am-pm}/TimeClockAmPm.tsx | 2 + .../demos/time-clock-am-pm/client.ts | 7 + .../demos/time-clock-am-pm/index.ts | 6 + .../TimeClockFormProps.tsx | 2 + .../demos/time-clock-form-props/client.ts | 7 + .../demos/time-clock-form-props/index.ts | 6 + .../time-clock-value}/TimeClockValue.tsx | 5 +- .../demos/time-clock-value/client.ts | 7 + .../demos/time-clock-value/index.ts | 6 + .../time-clock-views}/TimeClockViews.tsx | 2 + .../demos/time-clock-views/client.ts | 7 + .../demos/time-clock-views/index.ts | 6 + .../date-pickers/time-clock/time-clock.md | 10 +- .../date-pickers/time-field/BasicTimeField.js | 14 - .../time-field/BasicTimeField.tsx.preview | 1 - .../time-field/CustomTimeFormat.js | 29 - .../time-field/CustomTimeFormat.tsx.preview | 15 - .../date-pickers/time-field/TimeFieldValue.js | 26 - .../time-field/TimeFieldValue.tsx.preview | 9 - .../basic-time-field}/BasicTimeField.tsx | 2 + .../demos/basic-time-field/client.ts | 7 + .../demos/basic-time-field/index.ts | 6 + .../custom-time-format}/CustomTimeFormat.tsx | 2 + .../demos/custom-time-format/client.ts | 7 + .../demos/custom-time-format/index.ts | 6 + .../time-field-value}/TimeFieldValue.tsx | 5 +- .../demos/time-field-value/client.ts | 7 + .../demos/time-field-value/index.ts | 6 + .../date-pickers/time-field/time-field.md | 6 +- .../time-picker/BasicTimePicker.js | 14 - .../time-picker/BasicTimePicker.tsx.preview | 1 - .../time-picker/FormPropsTimePickers.js | 16 - .../FormPropsTimePickers.tsx.preview | 3 - .../time-picker/ResponsiveTimePickers.js | 36 - .../ResponsiveTimePickers.tsx.preview | 12 - .../time-picker/StaticTimePickerLandscape.js | 11 - .../StaticTimePickerLandscape.tsx.preview | 1 - .../time-picker/TimePickerOpenTo.js | 20 - .../time-picker/TimePickerOpenTo.tsx.preview | 7 - .../time-picker/TimePickerValue.js | 26 - .../time-picker/TimePickerValue.tsx.preview | 9 - .../time-picker/TimePickerViewRenderers.js | 22 - .../TimePickerViewRenderers.tsx.preview | 8 - .../time-picker/TimePickerViews.js | 22 - .../time-picker/TimePickerViews.tsx.preview | 9 - .../basic-time-picker}/BasicTimePicker.tsx | 2 + .../demos/basic-time-picker/client.ts | 7 + .../demos/basic-time-picker/index.ts | 6 + .../FormPropsTimePickers.tsx | 2 + .../demos/form-props-time-pickers/client.ts | 7 + .../demos/form-props-time-pickers/index.ts | 6 + .../ResponsiveTimePickers.tsx | 2 + .../demos/responsive-time-pickers/client.ts | 7 + .../demos/responsive-time-pickers/index.ts | 6 + .../StaticTimePickerLandscape.tsx | 2 + .../static-time-picker-landscape/client.ts | 7 + .../static-time-picker-landscape/index.ts | 6 + .../time-picker-open-to}/TimePickerOpenTo.tsx | 2 + .../demos/time-picker-open-to/client.ts | 7 + .../demos/time-picker-open-to/index.ts | 6 + .../time-picker-value}/TimePickerValue.tsx | 5 +- .../demos/time-picker-value/client.ts | 7 + .../demos/time-picker-value/index.ts | 6 + .../TimePickerViewRenderers.tsx | 2 + .../time-picker-view-renderers/client.ts | 7 + .../demos/time-picker-view-renderers/index.ts | 6 + .../time-picker-views}/TimePickerViews.tsx | 2 + .../demos/time-picker-views/client.ts | 7 + .../demos/time-picker-views/index.ts | 6 + .../date-pickers/time-picker/time-picker.md | 16 +- .../time-range-field/BasicTimeRangeField.js | 24 - .../BasicTimeRangeField.tsx.preview | 8 - .../time-range-field/TimeRangeFieldValue.js | 32 - .../TimeRangeFieldValue.tsx.preview | 9 - .../BasicTimeRangeField.tsx | 2 + .../demos/basic-time-range-field/client.ts | 7 + .../demos/basic-time-range-field/index.ts | 6 + .../TimeRangeFieldValue.tsx | 7 +- .../demos/time-range-field-value/client.ts | 7 + .../demos/time-range-field-value/index.ts | 6 + .../time-range-field/time-range-field.md | 4 +- .../time-range-picker/BasicTimeRangePicker.js | 14 - .../BasicTimeRangePicker.tsx.preview | 1 - .../CustomizedBehaviorTimeRangePicker.js | 56 - .../FormPropsTimeRangePickers.js | 16 - .../FormPropsTimeRangePickers.tsx.preview | 3 - .../MultiInputTimeRangePicker.js | 15 - .../MultiInputTimeRangePicker.tsx.preview | 1 - .../ResponsiveTimeRangePickers.js | 37 - .../ResponsiveTimeRangePickers.tsx.preview | 15 - .../time-range-picker/TimeRangePickerValue.js | 32 - .../TimeRangePickerValue.tsx.preview | 11 - .../BasicTimeRangePicker.tsx | 2 + .../demos/basic-time-range-picker/client.ts | 7 + .../demos/basic-time-range-picker/index.ts | 6 + .../CustomizedBehaviorTimeRangePicker.tsx | 12 +- .../client.ts | 7 + .../index.ts | 6 + .../FormPropsTimeRangePickers.tsx | 2 + .../form-props-time-range-pickers/client.ts | 7 + .../form-props-time-range-pickers/index.ts | 6 + .../MultiInputTimeRangePicker.tsx | 2 + .../multi-input-time-range-picker/client.ts | 7 + .../multi-input-time-range-picker/index.ts | 6 + .../ResponsiveTimeRangePickers.tsx | 2 + .../responsive-time-range-pickers/client.ts | 7 + .../responsive-time-range-pickers/index.ts | 6 + .../TimeRangePickerValue.tsx | 7 +- .../demos/time-range-picker-value/client.ts | 7 + .../demos/time-range-picker-value/index.ts | 6 + .../time-range-picker/time-range-picker.md | 12 +- .../timezone/BasicTimezoneProp.js | 38 - .../timezone/BasicTimezoneProp.tsx.preview | 15 - .../date-pickers/timezone/BasicValueProp.js | 33 - .../timezone/BasicValueProp.tsx.preview | 8 - .../date-pickers/timezone/DayjsTimezone.js | 29 - .../timezone/DayjsTimezone.tsx.preview | 4 - docs/data/date-pickers/timezone/DayjsUTC.js | 25 - .../timezone/DayjsUTC.tsx.preview | 4 - .../date-pickers/timezone/LuxonTimezone.js | 24 - .../timezone/LuxonTimezone.tsx.preview | 4 - docs/data/date-pickers/timezone/LuxonUTC.js | 24 - .../timezone/LuxonUTC.tsx.preview | 4 - .../date-pickers/timezone/MomentTimezone.js | 30 - .../timezone/MomentTimezone.tsx.preview | 4 - docs/data/date-pickers/timezone/MomentUTC.js | 24 - .../timezone/MomentUTC.tsx.preview | 4 - .../StoreUTCButDisplayOtherTimezone.js | 31 - ...toreUTCButDisplayOtherTimezone.tsx.preview | 8 - .../StoreUTCButDisplaySystemTimezone.js | 27 - ...oreUTCButDisplaySystemTimezone.tsx.preview | 4 - .../timezone/TimezonePlayground.js | 55 - .../BasicTimezoneProp.tsx | 5 +- .../demos/basic-timezone-prop/client.ts | 7 + .../demos/basic-timezone-prop/index.ts | 6 + .../basic-value-prop}/BasicValueProp.tsx | 5 +- .../timezone/demos/basic-value-prop/client.ts | 7 + .../timezone/demos/basic-value-prop/index.ts | 6 + .../dayjs-timezone}/DayjsTimezone.tsx | 5 +- .../timezone/demos/dayjs-timezone/client.ts | 7 + .../timezone/demos/dayjs-timezone/index.ts | 6 + .../{ => demos/dayjs-utc}/DayjsUTC.tsx | 5 +- .../timezone/demos/dayjs-utc/client.ts | 7 + .../timezone/demos/dayjs-utc/index.ts | 6 + .../luxon-timezone}/LuxonTimezone.tsx | 2 + .../timezone/demos/luxon-timezone/client.ts | 7 + .../timezone/demos/luxon-timezone/index.ts | 6 + .../{ => demos/luxon-utc}/LuxonUTC.tsx | 2 + .../timezone/demos/luxon-utc/client.ts | 7 + .../timezone/demos/luxon-utc/index.ts | 6 + .../moment-timezone}/MomentTimezone.tsx | 5 +- .../timezone/demos/moment-timezone/client.ts | 7 + .../timezone/demos/moment-timezone/index.ts | 6 + .../{ => demos/moment-utc}/MomentUTC.tsx | 5 +- .../timezone/demos/moment-utc/client.ts | 7 + .../timezone/demos/moment-utc/index.ts | 6 + .../StoreUTCButDisplayOtherTimezone.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../StoreUTCButDisplaySystemTimezone.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../TimezonePlayground.tsx | 7 +- .../demos/timezone-playground/client.ts | 7 + .../demos/timezone-playground/index.ts | 6 + docs/data/date-pickers/timezone/timezone.md | 22 +- .../DateRangeValidationShouldDisableDate.js | 48 - .../DateTimeValidationMaxDateTime.js | 27 - .../DateTimeValidationMaxDateTime.tsx.preview | 9 - .../DateTimeValidationMinDateTime.js | 27 - .../DateTimeValidationMinDateTime.tsx.preview | 9 - .../validation/DateValidationDisableFuture.js | 58 - .../validation/DateValidationDisablePast.js | 58 - .../validation/DateValidationMaxDate.js | 50 - .../validation/DateValidationMinDate.js | 47 - .../DateValidationShouldDisableDate.js | 59 - .../DateValidationShouldDisableMonth.js | 33 - ...teValidationShouldDisableMonth.tsx.preview | 14 - .../DateValidationShouldDisableYear.js | 25 - ...ateValidationShouldDisableYear.tsx.preview | 6 - .../validation/RenderErrorUnderField.js | 48 - .../RenderErrorUnderField.tsx.preview | 11 - .../validation/TimeValidationMaxTime.js | 39 - .../TimeValidationMaxTime.tsx.preview | 12 - .../validation/TimeValidationMinTime.js | 39 - .../TimeValidationMinTime.tsx.preview | 12 - .../TimeValidationShouldDisableTime.js | 53 - .../validation/ValidationBehaviorInput.js | 14 - .../ValidationBehaviorInput.tsx.preview | 1 - .../validation/ValidationBehaviorView.js | 30 - .../ValidationBehaviorView.tsx.preview | 13 - .../DateRangeValidationShouldDisableDate.tsx | 5 +- .../client.ts | 7 + .../index.ts | 8 + .../DateTimeValidationMaxDateTime.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../DateTimeValidationMinDateTime.tsx | 2 + .../client.ts | 7 + .../index.ts | 6 + .../DateValidationDisableFuture.tsx | 2 + .../date-validation-disable-future/client.ts | 7 + .../date-validation-disable-future/index.ts | 6 + .../DateValidationDisablePast.tsx | 2 + .../date-validation-disable-past/client.ts | 7 + .../date-validation-disable-past/index.ts | 6 + .../DateValidationMaxDate.tsx | 2 + .../demos/date-validation-max-date/client.ts | 7 + .../demos/date-validation-max-date/index.ts | 6 + .../DateValidationMinDate.tsx | 2 + .../demos/date-validation-min-date/client.ts | 7 + .../demos/date-validation-min-date/index.ts | 6 + .../DateValidationShouldDisableDate.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../DateValidationShouldDisableMonth.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../DateValidationShouldDisableYear.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../RenderErrorUnderField.tsx | 4 +- .../demos/render-error-under-field/client.ts | 7 + .../demos/render-error-under-field/index.ts | 6 + .../TimeValidationMaxTime.tsx | 2 + .../demos/time-validation-max-time/client.ts | 7 + .../demos/time-validation-max-time/index.ts | 6 + .../TimeValidationMinTime.tsx | 2 + .../demos/time-validation-min-time/client.ts | 7 + .../demos/time-validation-min-time/index.ts | 6 + .../TimeValidationShouldDisableTime.tsx | 5 +- .../client.ts | 7 + .../index.ts | 6 + .../ValidationBehaviorInput.tsx | 2 + .../demos/validation-behavior-input/client.ts | 7 + .../demos/validation-behavior-input/index.ts | 6 + .../ValidationBehaviorView.tsx | 2 + .../demos/validation-behavior-view/client.ts | 7 + .../demos/validation-behavior-view/index.ts | 6 + .../date-pickers/validation/validation.md | 32 +- .../experiments/scheduler/CompactDayView.tsx | 2 +- .../scheduler/CompactThreeDayView.tsx | 2 +- .../experiments/scheduler/CompactWeekView.tsx | 2 +- .../MonthViewOverflowButtonOverlap.tsx | 2 +- .../MonthViewOverflowContinuation.tsx | 2 +- .../scheduler/MonthViewOverflowPersist.tsx | 2 +- .../scheduler/RecurringEventDurations.tsx | 2 +- .../scheduler/TimelineAutoScheduling.tsx | 10 +- .../scheduler/TimelineDependencyArrows.tsx | 10 +- .../introduction/support/SupportedVersions.js | 122 -- .../supported-versions}/SupportedVersions.tsx | 2 + .../demos/supported-versions/client.ts | 7 + .../support/demos/supported-versions/index.ts | 6 + docs/data/introduction/support/support.md | 2 +- .../ColDefChangesGridNoSnap.js | 153 --- .../ColDefChangesGridNoSnap.tsx | 162 +++ .../col-def-changes-grid-no-snap/client.ts | 7 + .../col-def-changes-grid-no-snap/index.ts | 6 + .../migration-data-grid-v6.md | 2 +- .../MobileKeyboardView.js | 127 -- .../MobileKeyboardView.tsx.preview | 6 - .../MobileKeyboardView.tsx | 12 +- .../demos/mobile-keyboard-view/client.ts | 7 + .../demos/mobile-keyboard-view/index.ts | 6 + .../migration-pickers-v5.md | 2 +- .../event-dialog/CustomGeneralTab.js | 92 -- .../event-dialog/CustomGeneralTab.tsx.preview | 8 - .../event-dialog/CustomValidation.js | 88 -- .../event-dialog/CustomValidation.tsx.preview | 8 - .../event-dialog/ReorderAndOmitSections.js | 62 - .../ReorderAndOmitSections.tsx.preview | 8 - .../custom-general-tab}/CustomGeneralTab.tsx | 4 +- .../demos/custom-general-tab/client.ts | 7 + .../demos/custom-general-tab/index.ts | 6 + .../custom-validation}/CustomValidation.tsx | 4 +- .../demos/custom-validation/client.ts | 7 + .../demos/custom-validation/index.ts | 6 + .../ReorderAndOmitSections.tsx | 4 +- .../demos/reorder-and-omit-sections/client.ts | 7 + .../demos/reorder-and-omit-sections/index.ts | 6 + .../components/event-dialog/event-dialog.md | 6 +- .../data/scheduler/datasets/all-day-events.ts | 2 +- .../scheduler/datasets/apartment-bookings.ts | 2 +- docs/data/scheduler/datasets/broadway.ts | 2 +- .../datasets/calendar-palette-demo.ts | 2 +- docs/data/scheduler/datasets/car-rental.ts | 2 +- .../scheduler/datasets/company-roadmap.ts | 2 +- .../datasets/personal-agenda-rrule.ts | 2 +- .../scheduler/datasets/personal-agenda.ts | 2 +- .../datasets/recurring-event-durations.ts | 2 +- .../scheduler/datasets/recurring-events.ts | 2 +- .../scheduler/datasets/school-calendar.ts | 2 +- .../scheduler/datasets/software-company.ts | 2 +- .../datasets/timeline-palette-demo.ts | 2 +- .../timezone-community-instant-based.ts | 2 +- .../datasets/timezone-instant-based-events.ts | 2 +- .../datasets/timezone-wall-time-events.ts | 2 +- docs/data/scheduler/datasets/tv-series.ts | 2 +- .../drag-interactions/BasicDragAndDrop.js | 24 - .../drag-interactions/BasicDragAndDrop.tsx | 24 - .../BasicDragAndDrop.tsx.preview | 7 - .../drag-interactions/DisableDragging.js | 25 - .../drag-interactions/DisableDragging.tsx | 25 - .../DisableDragging.tsx.preview | 8 - .../drag-interactions/DisableResizing.js | 25 - .../drag-interactions/DisableResizing.tsx | 25 - .../DisableResizing.tsx.preview | 8 - .../drag-interactions/ExternalDragAndDrop.js | 171 --- .../drag-interactions/ExternalDragAndDrop.tsx | 174 --- .../basic-drag-and-drop/BasicDragAndDrop.tsx | 26 + .../demos/basic-drag-and-drop/client.ts | 7 + .../demos/basic-drag-and-drop/index.ts | 6 + .../disable-dragging/DisableDragging.tsx | 27 + .../demos/disable-dragging/client.ts | 7 + .../demos/disable-dragging/index.ts | 6 + .../disable-resizing/DisableResizing.tsx | 27 + .../demos/disable-resizing/client.ts | 7 + .../demos/disable-resizing/index.ts | 6 + .../ExternalDragAndDrop.tsx | 177 +++ .../demos/external-drag-and-drop/client.ts | 7 + .../demos/external-drag-and-drop/index.ts | 6 + .../drag-interactions/drag-interactions.md | 8 +- .../event-calendar/editing/CustomEditingUI.js | 119 -- .../editing/CustomEditingUI.tsx | 129 -- .../editing/EventCreationDuration.js | 25 - .../editing/EventCreationDuration.tsx | 25 - .../editing/EventCreationDuration.tsx.preview | 8 - .../editing/EventCreationInteraction.js | 25 - .../editing/EventCreationInteraction.tsx | 25 - .../EventCreationInteraction.tsx.preview | 8 - .../editing/EventDeletionConfirmation.js | 25 - .../editing/EventDeletionConfirmation.tsx | 25 - .../EventDeletionConfirmation.tsx.preview | 8 - .../editing/EventDeletionDisabled.js | 25 - .../editing/EventDeletionDisabled.tsx | 25 - .../editing/EventDeletionDisabled.tsx.preview | 8 - .../event-calendar/editing/EventDialog.js | 54 - .../event-calendar/editing/EventDialog.tsx | 54 - .../editing/EventDialog.tsx.preview | 8 - .../event-calendar/editing/ReadOnly.js | 25 - .../event-calendar/editing/ReadOnly.tsx | 25 - .../editing/ReadOnly.tsx.preview | 8 - .../custom-editing-ui/CustomEditingUI.tsx | 131 ++ .../editing/demos/custom-editing-ui/client.ts | 7 + .../editing/demos/custom-editing-ui/index.ts | 6 + .../EventCreationDuration.tsx | 27 + .../demos/event-creation-duration/client.ts | 7 + .../demos/event-creation-duration/index.ts | 6 + .../EventCreationInteraction.tsx | 27 + .../event-creation-interaction/client.ts | 7 + .../demos/event-creation-interaction/index.ts | 6 + .../EventDeletionConfirmation.tsx | 27 + .../event-deletion-confirmation/client.ts | 7 + .../event-deletion-confirmation/index.ts | 6 + .../EventDeletionDisabled.tsx | 27 + .../demos/event-deletion-disabled/client.ts | 7 + .../demos/event-deletion-disabled/index.ts | 6 + .../demos/event-dialog/EventDialog.tsx | 56 + .../editing/demos/event-dialog/client.ts | 7 + .../editing/demos/event-dialog/index.ts | 6 + .../editing/demos/read-only/ReadOnly.tsx | 27 + .../editing/demos/read-only/client.ts | 7 + .../editing/demos/read-only/index.ts | 6 + .../event-calendar/editing/editing.md | 14 +- .../scheduler/event-calendar/events/AllDay.js | 24 - .../event-calendar/events/AllDay.tsx | 24 - .../event-calendar/events/AllDay.tsx.preview | 7 - .../events/ClassNameProperty.js | 72 -- .../events/ClassNameProperty.tsx | 72 -- .../event-calendar/events/ColorPalettes.js | 22 - .../event-calendar/events/ColorPalettes.tsx | 25 - .../events/ColorPalettes.tsx.preview | 6 - .../events/DynamicResourceProperty.js | 168 --- .../events/DynamicResourceProperty.tsx | 185 --- .../event-calendar/events/TitleProperty.js | 45 - .../event-calendar/events/TitleProperty.tsx | 52 - .../events/TitleProperty.tsx.preview | 7 - .../events/demos/all-day/AllDay.tsx | 26 + .../events/demos/all-day/client.ts | 7 + .../events/demos/all-day/index.ts | 6 + .../class-name-property/ClassNameProperty.tsx | 74 ++ .../demos/class-name-property/client.ts | 7 + .../events/demos/class-name-property/index.ts | 6 + .../demos/color-palettes/ColorPalettes.tsx | 27 + .../events/demos/color-palettes/client.ts | 7 + .../events/demos/color-palettes/index.ts | 6 + .../DynamicResourceProperty.tsx | 187 +++ .../demos/dynamic-resource-property/client.ts | 7 + .../demos/dynamic-resource-property/index.ts | 6 + .../demos/title-property/TitleProperty.tsx | 54 + .../events/demos/title-property/client.ts | 7 + .../events/demos/title-property/index.ts | 6 + .../scheduler/event-calendar/events/events.md | 10 +- .../lazy-loading/BasicDataSource.js | 21 - .../lazy-loading/BasicDataSource.tsx | 21 - .../lazy-loading/BasicDataSource.tsx.preview | 6 - .../lazy-loading/ErrorHandling.js | 50 - .../lazy-loading/ErrorHandling.tsx | 50 - .../basic-data-source/BasicDataSource.tsx | 23 + .../demos/basic-data-source/client.ts | 7 + .../demos/basic-data-source/index.ts | 6 + .../demos/error-handling/ErrorHandling.tsx | 52 + .../demos/error-handling/client.ts | 7 + .../demos/error-handling/index.ts | 6 + .../event-calendar/lazy-loading/fakeServer.ts | 2 +- .../lazy-loading/lazy-loading.md | 4 +- .../localization/CustomLocaleTextCalendar.js | 31 - .../CustomLocaleTextCalendar.tsx.preview | 14 - .../localization/DateLocaleCalendar.js | 33 - .../DateLocaleCalendar.tsx.preview | 9 - .../localization/LocaleTextCalendar.js | 33 - .../LocaleTextCalendar.tsx.preview | 9 - .../localization/RTLCalendar.js | 126 -- .../localization/RTLCalendar.tsx.preview | 12 - .../SchedulerLocalisationTableNoSnap.js | 6 - .../CustomLocaleTextCalendar.tsx | 6 +- .../custom-locale-text-calendar/client.ts | 7 + .../custom-locale-text-calendar/index.ts | 6 + .../DateLocaleCalendar.tsx | 6 +- .../demos/date-locale-calendar/client.ts | 7 + .../demos/date-locale-calendar/index.ts | 6 + .../LocaleTextCalendar.tsx | 6 +- .../demos/locale-text-calendar/client.ts | 7 + .../demos/locale-text-calendar/index.ts | 6 + .../{ => demos/rtl-calendar}/RTLCalendar.tsx | 4 +- .../localization/demos/rtl-calendar/client.ts | 7 + .../localization/demos/rtl-calendar/index.ts | 6 + .../SchedulerLocalisationTableNoSnap.tsx | 9 + .../client.ts | 7 + .../index.ts | 6 + .../localization/localization.md | 10 +- .../navigation/ApiMethodSetVisibleDate.js | 39 - .../navigation/ApiMethodSetVisibleDate.tsx | 39 - .../navigation/DefaultVisibleDate.js | 22 - .../navigation/DefaultVisibleDate.tsx | 22 - .../navigation/DefaultVisibleDate.tsx.preview | 7 - .../ApiMethodSetVisibleDate.tsx | 41 + .../api-method-set-visible-date/client.ts | 7 + .../api-method-set-visible-date/index.ts | 6 + .../DefaultVisibleDate.tsx | 24 + .../demos/default-visible-date/client.ts | 7 + .../demos/default-visible-date/index.ts | 6 + .../event-calendar/navigation/navigation.md | 4 +- .../preferences/DefaultPreferences.js | 30 - .../preferences/DefaultPreferences.tsx | 30 - .../DefaultPreferences.tsx.preview | 7 - .../preferences/PreferencesMenu.js | 28 - .../preferences/PreferencesMenu.tsx.preview | 11 - .../DefaultPreferences.tsx | 35 + .../demos/default-preferences/client.ts | 7 + .../demos/default-preferences/index.ts | 6 + .../preferences-menu}/PreferencesMenu.tsx | 6 +- .../demos/preferences-menu/client.ts | 7 + .../demos/preferences-menu/index.ts | 6 + .../event-calendar/preferences/preferences.md | 4 +- .../event-calendar/resources/ColorPalettes.js | 24 - .../resources/ColorPalettes.tsx | 27 - .../resources/ColorPalettes.tsx.preview | 7 - .../resources/DefaultCollapsedResources.js | 23 - .../resources/DefaultCollapsedResources.tsx | 23 - .../DefaultCollapsedResources.tsx.preview | 7 - .../resources/DefaultVisibleResources.js | 26 - .../resources/DefaultVisibleResources.tsx | 26 - .../DefaultVisibleResources.tsx.preview | 10 - .../resources/MultipleResourcesPerEvent.js | 46 - .../resources/MultipleResourcesPerEvent.tsx | 46 - .../MultipleResourcesPerEvent.tsx.preview | 8 - .../resources/NestedResources.js | 22 - .../resources/NestedResources.tsx | 22 - .../resources/NestedResources.tsx.preview | 6 - .../event-calendar/resources/TitleProperty.js | 36 - .../resources/TitleProperty.tsx | 45 - .../resources/TitleProperty.tsx.preview | 8 - .../demos/color-palettes/ColorPalettes.tsx | 29 + .../resources/demos/color-palettes/client.ts | 7 + .../resources/demos/color-palettes/index.ts | 6 + .../DefaultCollapsedResources.tsx | 25 + .../default-collapsed-resources/client.ts | 7 + .../default-collapsed-resources/index.ts | 6 + .../DefaultVisibleResources.tsx | 28 + .../demos/default-visible-resources/client.ts | 7 + .../demos/default-visible-resources/index.ts | 6 + .../MultipleResourcesPerEvent.tsx | 48 + .../multiple-resources-per-event/client.ts | 7 + .../multiple-resources-per-event/index.ts | 6 + .../nested-resources/NestedResources.tsx | 24 + .../demos/nested-resources/client.ts | 7 + .../resources/demos/nested-resources/index.ts | 6 + .../demos/title-property/TitleProperty.tsx | 50 + .../resources/demos/title-property/client.ts | 7 + .../resources/demos/title-property/index.ts | 6 + .../event-calendar/resources/resources.md | 12 +- .../ResponsiveTypographyDemo.js | 55 - .../ResponsiveTypographyDemo.tsx | 6 +- .../responsive-typography-demo/client.ts | 7 + .../demos/responsive-typography-demo/index.ts | 6 + .../responsiveness/responsiveness.md | 2 +- .../views/AgendaViewDayCount.js | 24 - .../views/AgendaViewDayCount.tsx.preview | 7 - .../event-calendar/views/BasicAgendaView.js | 23 - .../views/BasicAgendaView.tsx.preview | 6 - .../event-calendar/views/BasicDayView.js | 23 - .../views/BasicDayView.tsx.preview | 6 - .../event-calendar/views/BasicMonthView.js | 23 - .../views/BasicMonthView.tsx.preview | 6 - .../event-calendar/views/BasicWeekView.js | 23 - .../views/BasicWeekView.tsx.preview | 6 - .../views/DayViewInitialScrollTime.js | 23 - .../DayViewInitialScrollTime.tsx.preview | 7 - .../views/DayViewStartEndTime.js | 24 - .../views/DayViewStartEndTime.tsx.preview | 7 - .../views/DayViewTimeGridEvents.js | 61 - .../event-calendar/views/DefaultView.js | 25 - .../views/DefaultView.tsx.preview | 8 - .../event-calendar/views/RemoveViews.js | 25 - .../views/RemoveViews.tsx.preview | 8 - .../views/WeekViewInitialScrollTime.js | 24 - .../WeekViewInitialScrollTime.tsx.preview | 7 - .../views/WeekViewStartEndTime.js | 24 - .../views/WeekViewStartEndTime.tsx.preview | 7 - .../views/WeekViewTimeGridEvents.js | 73 -- .../AgendaViewDayCount.tsx | 6 +- .../demos/agenda-view-day-count/client.ts | 7 + .../demos/agenda-view-day-count/index.ts | 6 + .../basic-agenda-view}/BasicAgendaView.tsx | 6 +- .../views/demos/basic-agenda-view/client.ts | 7 + .../views/demos/basic-agenda-view/index.ts | 6 + .../basic-day-view}/BasicDayView.tsx | 6 +- .../views/demos/basic-day-view/client.ts | 7 + .../views/demos/basic-day-view/index.ts | 6 + .../basic-month-view}/BasicMonthView.tsx | 6 +- .../views/demos/basic-month-view/client.ts | 7 + .../views/demos/basic-month-view/index.ts | 6 + .../basic-week-view}/BasicWeekView.tsx | 6 +- .../views/demos/basic-week-view/client.ts | 7 + .../views/demos/basic-week-view/index.ts | 6 + .../DayViewInitialScrollTime.tsx | 6 +- .../day-view-initial-scroll-time/client.ts | 7 + .../day-view-initial-scroll-time/index.ts | 6 + .../DayViewStartEndTime.tsx | 6 +- .../demos/day-view-start-end-time/client.ts | 7 + .../demos/day-view-start-end-time/index.ts | 6 + .../DayViewTimeGridEvents.tsx | 6 +- .../demos/day-view-time-grid-events/client.ts | 7 + .../demos/day-view-time-grid-events/index.ts | 6 + .../{ => demos/default-view}/DefaultView.tsx | 6 +- .../views/demos/default-view/client.ts | 7 + .../views/demos/default-view/index.ts | 6 + .../{ => demos/remove-views}/RemoveViews.tsx | 6 +- .../views/demos/remove-views/client.ts | 7 + .../views/demos/remove-views/index.ts | 6 + .../WeekViewInitialScrollTime.tsx | 6 +- .../week-view-initial-scroll-time/client.ts | 7 + .../week-view-initial-scroll-time/index.ts | 6 + .../WeekViewStartEndTime.tsx | 6 +- .../demos/week-view-start-end-time/client.ts | 7 + .../demos/week-view-start-end-time/index.ts | 6 + .../WeekViewTimeGridEvents.tsx | 6 +- .../week-view-time-grid-events/client.ts | 7 + .../demos/week-view-time-grid-events/index.ts | 6 + .../scheduler/event-calendar/views/views.md | 26 +- .../drag-interactions/BasicDragAndDrop.js | 24 - .../drag-interactions/BasicDragAndDrop.tsx | 24 - .../BasicDragAndDrop.tsx.preview | 7 - .../drag-interactions/DisableDragging.js | 25 - .../drag-interactions/DisableDragging.tsx | 25 - .../DisableDragging.tsx.preview | 8 - .../drag-interactions/DisableResizing.js | 25 - .../drag-interactions/DisableResizing.tsx | 25 - .../DisableResizing.tsx.preview | 8 - .../drag-interactions/ExternalDragAndDrop.js | 168 --- .../drag-interactions/ExternalDragAndDrop.tsx | 171 --- .../basic-drag-and-drop/BasicDragAndDrop.tsx | 26 + .../demos/basic-drag-and-drop/client.ts | 7 + .../demos/basic-drag-and-drop/index.ts | 6 + .../disable-dragging/DisableDragging.tsx | 27 + .../demos/disable-dragging/client.ts | 7 + .../demos/disable-dragging/index.ts | 6 + .../disable-resizing/DisableResizing.tsx | 27 + .../demos/disable-resizing/client.ts | 7 + .../demos/disable-resizing/index.ts | 6 + .../ExternalDragAndDrop.tsx | 174 +++ .../demos/external-drag-and-drop/client.ts | 7 + .../demos/external-drag-and-drop/index.ts | 6 + .../drag-interactions/drag-interactions.md | 8 +- .../event-timeline/editing/CustomEditingUI.js | 101 -- .../editing/CustomEditingUI.tsx | 110 -- .../editing/EventCreationDuration.js | 25 - .../editing/EventCreationDuration.tsx | 25 - .../editing/EventCreationDuration.tsx.preview | 8 - .../editing/EventCreationInteraction.js | 25 - .../editing/EventCreationInteraction.tsx | 25 - .../EventCreationInteraction.tsx.preview | 8 - .../editing/EventDeletionConfirmation.js | 25 - .../editing/EventDeletionConfirmation.tsx | 25 - .../EventDeletionConfirmation.tsx.preview | 8 - .../editing/EventDeletionDisabled.js | 25 - .../editing/EventDeletionDisabled.tsx | 25 - .../editing/EventDeletionDisabled.tsx.preview | 8 - .../event-timeline/editing/EventDialog.js | 24 - .../event-timeline/editing/EventDialog.tsx | 24 - .../editing/EventDialog.tsx.preview | 7 - .../event-timeline/editing/ReadOnly.js | 25 - .../event-timeline/editing/ReadOnly.tsx | 25 - .../editing/ReadOnly.tsx.preview | 8 - .../custom-editing-ui/CustomEditingUI.tsx | 112 ++ .../editing/demos/custom-editing-ui/client.ts | 7 + .../editing/demos/custom-editing-ui/index.ts | 6 + .../EventCreationDuration.tsx | 27 + .../demos/event-creation-duration/client.ts | 7 + .../demos/event-creation-duration/index.ts | 6 + .../EventCreationInteraction.tsx | 27 + .../event-creation-interaction/client.ts | 7 + .../demos/event-creation-interaction/index.ts | 6 + .../EventDeletionConfirmation.tsx | 27 + .../event-deletion-confirmation/client.ts | 7 + .../event-deletion-confirmation/index.ts | 6 + .../EventDeletionDisabled.tsx | 27 + .../demos/event-deletion-disabled/client.ts | 7 + .../demos/event-deletion-disabled/index.ts | 6 + .../demos/event-dialog/EventDialog.tsx | 26 + .../editing/demos/event-dialog/client.ts | 7 + .../editing/demos/event-dialog/index.ts | 6 + .../editing/demos/read-only/ReadOnly.tsx | 27 + .../editing/demos/read-only/client.ts | 7 + .../editing/demos/read-only/index.ts | 6 + .../event-timeline/editing/editing.md | 14 +- .../scheduler/event-timeline/events/AllDay.js | 51 - .../event-timeline/events/AllDay.tsx | 51 - .../event-timeline/events/AllDay.tsx.preview | 7 - .../events/ClassNameProperty.js | 88 -- .../events/ClassNameProperty.tsx | 88 -- .../event-timeline/events/ColorPalettes.js | 24 - .../event-timeline/events/ColorPalettes.tsx | 26 - .../events/ColorPalettes.tsx.preview | 7 - .../events/DynamicResourceProperty.js | 167 --- .../events/DynamicResourceProperty.tsx | 184 --- .../event-timeline/events/EventContentSlot.js | 83 -- .../events/EventContentSlot.tsx.preview | 9 - .../event-timeline/events/TitleProperty.js | 63 - .../event-timeline/events/TitleProperty.tsx | 75 -- .../events/TitleProperty.tsx.preview | 8 - .../events/demos/all-day/AllDay.tsx | 53 + .../events/demos/all-day/client.ts | 7 + .../events/demos/all-day/index.ts | 6 + .../class-name-property/ClassNameProperty.tsx | 90 ++ .../demos/class-name-property/client.ts | 7 + .../events/demos/class-name-property/index.ts | 6 + .../demos/color-palettes/ColorPalettes.tsx | 28 + .../events/demos/color-palettes/client.ts | 7 + .../events/demos/color-palettes/index.ts | 6 + .../DynamicResourceProperty.tsx | 186 +++ .../demos/dynamic-resource-property/client.ts | 7 + .../demos/dynamic-resource-property/index.ts | 6 + .../event-content-slot}/EventContentSlot.tsx | 14 +- .../events/demos/event-content-slot/client.ts | 7 + .../events/demos/event-content-slot/index.ts | 6 + .../demos/title-property/TitleProperty.tsx | 77 ++ .../events/demos/title-property/client.ts | 7 + .../events/demos/title-property/index.ts | 6 + .../scheduler/event-timeline/events/events.md | 12 +- .../lazy-loading/BasicDataSource.js | 70 - .../lazy-loading/BasicDataSource.tsx | 71 - .../lazy-loading/ErrorHandling.js | 98 -- .../lazy-loading/ErrorHandling.tsx | 100 -- .../basic-data-source/BasicDataSource.tsx | 74 ++ .../demos/basic-data-source/client.ts | 7 + .../demos/basic-data-source/index.ts | 6 + .../demos/error-handling/ErrorHandling.tsx | 103 ++ .../demos/error-handling/client.ts | 7 + .../demos/error-handling/index.ts | 6 + .../event-timeline/lazy-loading/fakeServer.ts | 2 +- .../lazy-loading/lazy-loading.md | 4 +- .../localization/CustomLocaleTextTimeline.js | 27 - .../CustomLocaleTextTimeline.tsx.preview | 10 - .../localization/DateLocaleTimeline.js | 33 - .../DateLocaleTimeline.tsx.preview | 9 - .../localization/LocaleTextTimeline.js | 33 - .../LocaleTextTimeline.tsx.preview | 9 - .../localization/RTLTimeline.js | 137 -- .../localization/RTLTimeline.tsx.preview | 13 - .../SchedulerLocalisationTableNoSnap.js | 6 - .../CustomLocaleTextTimeline.tsx | 6 +- .../custom-locale-text-timeline/client.ts | 7 + .../custom-locale-text-timeline/index.ts | 6 + .../DateLocaleTimeline.tsx | 6 +- .../demos/date-locale-timeline/client.ts | 7 + .../demos/date-locale-timeline/index.ts | 6 + .../LocaleTextTimeline.tsx | 6 +- .../demos/locale-text-timeline/client.ts | 7 + .../demos/locale-text-timeline/index.ts | 6 + .../{ => demos/rtl-timeline}/RTLTimeline.tsx | 4 +- .../localization/demos/rtl-timeline/client.ts | 7 + .../localization/demos/rtl-timeline/index.ts | 6 + .../SchedulerLocalisationTableNoSnap.tsx | 9 + .../client.ts | 7 + .../index.ts | 6 + .../localization/localization.md | 10 +- .../navigation/ApiMethodSetVisibleDate.js | 39 - .../navigation/ApiMethodSetVisibleDate.tsx | 39 - .../navigation/DefaultVisibleDate.js | 22 - .../navigation/DefaultVisibleDate.tsx | 22 - .../navigation/DefaultVisibleDate.tsx.preview | 7 - .../navigation/ExternalNavigation.js | 79 -- .../ApiMethodSetVisibleDate.tsx | 41 + .../api-method-set-visible-date/client.ts | 7 + .../api-method-set-visible-date/index.ts | 6 + .../DefaultVisibleDate.tsx | 24 + .../demos/default-visible-date/client.ts | 7 + .../demos/default-visible-date/index.ts | 6 + .../ExternalNavigation.tsx | 9 +- .../demos/external-navigation/client.ts | 7 + .../demos/external-navigation/index.ts | 6 + .../event-timeline/navigation/navigation.md | 6 +- .../preferences/DefaultPreferences.js | 30 - .../preferences/DefaultPreferences.tsx | 31 - .../DefaultPreferences.tsx.preview | 8 - .../DefaultPreferences.tsx | 33 + .../demos/default-preferences/client.ts | 7 + .../demos/default-preferences/index.ts | 6 + .../event-timeline/preferences/preferences.md | 2 +- .../presets/DayAndHourPreset.js | 25 - .../presets/DayAndHourPreset.tsx.preview | 8 - .../presets/DayAndHourStartEndTime.js | 26 - .../DayAndHourStartEndTime.tsx.preview | 9 - .../presets/DayAndMonthPreset.js | 25 - .../presets/DayAndMonthPreset.tsx.preview | 8 - .../presets/DayAndWeekPreset.js | 25 - .../presets/DayAndWeekPreset.tsx.preview | 8 - .../presets/MonthAndYearPreset.js | 25 - .../presets/MonthAndYearPreset.tsx.preview | 8 - .../event-timeline/presets/YearPreset.js | 25 - .../presets/YearPreset.tsx.preview | 8 - .../day-and-hour-preset}/DayAndHourPreset.tsx | 6 +- .../demos/day-and-hour-preset/client.ts | 7 + .../demos/day-and-hour-preset/index.ts | 6 + .../DayAndHourStartEndTime.tsx | 6 +- .../day-and-hour-start-end-time/client.ts | 7 + .../day-and-hour-start-end-time/index.ts | 6 + .../DayAndMonthPreset.tsx | 6 +- .../demos/day-and-month-preset/client.ts | 7 + .../demos/day-and-month-preset/index.ts | 6 + .../day-and-week-preset}/DayAndWeekPreset.tsx | 6 +- .../demos/day-and-week-preset/client.ts | 7 + .../demos/day-and-week-preset/index.ts | 6 + .../MonthAndYearPreset.tsx | 6 +- .../demos/month-and-year-preset/client.ts | 7 + .../demos/month-and-year-preset/index.ts | 6 + .../{ => demos/year-preset}/YearPreset.tsx | 6 +- .../presets/demos/year-preset/client.ts | 7 + .../presets/demos/year-preset/index.ts | 6 + .../event-timeline/presets/presets.md | 12 +- .../event-timeline/resources/ColorPalettes.js | 24 - .../resources/ColorPalettes.tsx | 26 - .../resources/ColorPalettes.tsx.preview | 7 - .../resources/DefaultCollapsedResources.js | 30 - .../resources/DefaultCollapsedResources.tsx | 30 - .../DefaultCollapsedResources.tsx.preview | 14 - .../resources/DefaultVisibleResources.js | 27 - .../resources/DefaultVisibleResources.tsx | 27 - .../DefaultVisibleResources.tsx.preview | 11 - .../resources/MultipleResourcesPerEvent.js | 47 - .../resources/MultipleResourcesPerEvent.tsx | 47 - .../MultipleResourcesPerEvent.tsx.preview | 9 - .../resources/NestedResources.js | 29 - .../resources/NestedResources.tsx | 29 - .../resources/NestedResources.tsx.preview | 13 - .../resources/ResourceColumnLabel.js | 25 - .../resources/ResourceColumnLabel.tsx.preview | 8 - .../resources/ResourceTitleSlot.js | 68 - .../resources/ResourceTitleSlot.tsx.preview | 8 - .../event-timeline/resources/TitleProperty.js | 40 - .../resources/TitleProperty.tsx | 49 - .../resources/TitleProperty.tsx.preview | 8 - .../demos/color-palettes/ColorPalettes.tsx | 28 + .../resources/demos/color-palettes/client.ts | 7 + .../resources/demos/color-palettes/index.ts | 6 + .../DefaultCollapsedResources.tsx | 32 + .../default-collapsed-resources/client.ts | 7 + .../default-collapsed-resources/index.ts | 6 + .../DefaultVisibleResources.tsx | 29 + .../demos/default-visible-resources/client.ts | 7 + .../demos/default-visible-resources/index.ts | 6 + .../MultipleResourcesPerEvent.tsx | 49 + .../multiple-resources-per-event/client.ts | 7 + .../multiple-resources-per-event/index.ts | 6 + .../nested-resources/NestedResources.tsx | 31 + .../demos/nested-resources/client.ts | 7 + .../resources/demos/nested-resources/index.ts | 6 + .../ResourceColumnLabel.tsx | 6 +- .../demos/resource-column-label/client.ts | 7 + .../demos/resource-column-label/index.ts | 6 + .../ResourceTitleSlot.tsx | 8 +- .../demos/resource-title-slot/client.ts | 7 + .../demos/resource-title-slot/index.ts | 6 + .../demos/title-property/TitleProperty.tsx | 54 + .../resources/demos/title-property/client.ts | 7 + .../resources/demos/title-property/index.ts | 6 + .../event-timeline/resources/resources.md | 16 +- .../quickstart/RenderEventCalendar.js | 37 - .../RenderEventCalendar.tsx.preview | 5 - .../quickstart/RenderEventTimelinePremium.js | 46 - .../RenderEventTimelinePremium.tsx.preview | 6 - .../RenderEventCalendar.tsx | 4 +- .../demos/render-event-calendar/client.ts | 7 + .../demos/render-event-calendar/index.ts | 6 + .../RenderEventTimelinePremium.tsx | 7 +- .../render-event-timeline-premium/client.ts | 7 + .../render-event-timeline-premium/index.ts | 6 + docs/data/scheduler/quickstart/quickstart.md | 4 +- .../RecurringEventsDataset.js | 25 - .../RecurringEventsDataset.tsx.preview | 7 - .../RecurringEventsDataset.tsx | 6 +- .../demos/recurring-events-dataset/client.ts | 7 + .../demos/recurring-events-dataset/index.ts | 6 + .../recurring-events/recurring-events.md | 2 +- .../timezone/TimezoneDatasetWallTime.js | 24 - .../TimezoneDatasetWallTime.tsx.preview | 8 - .../timezone/TimezoneInstantBased.js | 24 - .../timezone/TimezoneInstantBased.tsx.preview | 8 - .../timezone/TimezoneRecurringEvents.js | 28 - .../TimezoneRecurringEvents.tsx.preview | 12 - .../TimezoneDatasetWallTime.tsx | 4 +- .../timezone-dataset-wall-time/client.ts | 7 + .../demos/timezone-dataset-wall-time/index.ts | 6 + .../TimezoneInstantBased.tsx | 4 +- .../demos/timezone-instant-based/client.ts | 7 + .../demos/timezone-instant-based/index.ts | 6 + .../TimezoneRecurringEvents.tsx | 4 +- .../demos/timezone-recurring-events/client.ts | 7 + .../demos/timezone-recurring-events/index.ts | 6 + docs/data/scheduler/timezone/timezone.md | 6 +- docs/data/tree-view/datasets/deepProducts.ts | 2 +- docs/data/tree-view/datasets/employees.ts | 2 +- docs/data/tree-view/datasets/products.ts | 2 +- .../tree-view/quickstart/BasicRichTreeView.js | 11 - .../quickstart/BasicRichTreeView.tsx | 11 - .../quickstart/BasicRichTreeView.tsx.preview | 1 - .../quickstart/BasicRichTreeViewPro.js | 11 - .../BasicRichTreeViewPro.tsx.preview | 1 - .../quickstart/BasicSimpleTreeView.js | 29 - .../quickstart/BasicSimpleTreeView.tsx | 29 - .../BasicRichTreeViewPro.tsx | 3 +- .../demos/basic-rich-tree-view-pro/client.ts | 7 + .../demos/basic-rich-tree-view-pro/index.ts | 6 + .../BasicRichTreeView.tsx | 12 + .../demos/basic-rich-tree-view/client.ts | 7 + .../demos/basic-rich-tree-view/index.ts | 6 + .../BasicSimpleTreeView.tsx | 31 + .../demos/basic-simple-tree-view/client.ts | 7 + .../demos/basic-simple-tree-view/index.ts | 6 + docs/data/tree-view/quickstart/quickstart.md | 6 +- .../customization/CustomAnimation.js | 33 - .../customization/CustomAnimation.tsx | 33 - .../customization/CustomAnimation.tsx.preview | 5 - .../customization/CustomIcons.js | 47 - .../customization/CustomIcons.tsx | 47 - .../customization/CustomIcons.tsx.preview | 10 - .../customization/CustomStyling.js | 54 - .../customization/CustomStyling.tsx | 54 - .../customization/CustomStyling.tsx.preview | 5 - .../CustomStylingRichTreeViewPro.js | 74 -- .../CustomStylingRichTreeViewPro.tsx.preview | 7 - .../customization/FileExplorer.js | 265 ---- .../customization/FileExplorer.tsx | 299 ----- .../customization/FileExplorer.tsx.preview | 8 - .../customization/HeadlessAPI.js | 93 -- .../customization/HeadlessAPI.tsx | 101 -- .../customization/HeadlessAPI.tsx.preview | 5 - .../customization/StickyHeaders.js | 47 - .../customization/StickyHeaders.tsx.preview | 5 - .../customization/customization.md | 14 +- .../custom-animation/CustomAnimation.tsx | 35 + .../demos/custom-animation/client.ts | 7 + .../demos/custom-animation/index.ts | 6 + .../demos/custom-icons/CustomIcons.tsx | 50 + .../demos/custom-icons/client.ts | 7 + .../customization/demos/custom-icons/index.ts | 6 + .../CustomStylingRichTreeViewPro.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../demos/custom-styling/CustomStyling.tsx | 56 + .../demos/custom-styling/client.ts | 7 + .../demos/custom-styling/index.ts | 6 + .../demos/file-explorer/FileExplorer.tsx | 302 +++++ .../demos/file-explorer/client.ts | 7 + .../demos/file-explorer/index.ts | 6 + .../demos/headless-api/HeadlessAPI.tsx | 104 ++ .../demos/headless-api/client.ts | 7 + .../customization/demos/headless-api/index.ts | 6 + .../sticky-headers}/StickyHeaders.tsx | 7 +- .../demos/sticky-headers/client.ts | 7 + .../demos/sticky-headers/index.ts | 6 + .../editing/ApiMethodSetEditedItem.js | 48 - .../ApiMethodSetEditedItem.tsx.preview | 11 - .../editing/ApiMethodUpdateItemLabel.js | 35 - .../ApiMethodUpdateItemLabel.tsx.preview | 8 - .../rich-tree-view/editing/CustomBehavior.js | 43 - .../editing/CustomBehavior.tsx.preview | 6 - .../editing/CustomLabelInput.js | 185 --- .../editing/CustomLabelInput.tsx.preview | 7 - .../rich-tree-view/editing/EditLeaves.js | 20 - .../editing/EditLeaves.tsx.preview | 8 - .../rich-tree-view/editing/EditWithIcons.js | 116 -- .../editing/EditWithIcons.tsx.preview | 7 - .../rich-tree-view/editing/EditingCallback.js | 31 - .../editing/EditingCallback.tsx.preview | 16 - .../editing/LabelEditingAllItems.js | 15 - .../editing/LabelEditingAllItems.tsx.preview | 5 - .../editing/LabelEditingSomeItems.js | 15 - .../editing/LabelEditingSomeItems.tsx.preview | 5 - .../rich-tree-view/editing/Validation.js | 107 -- .../editing/Validation.tsx.preview | 6 - .../ApiMethodSetEditedItem.tsx | 2 + .../api-method-set-edited-item/client.ts | 7 + .../demos/api-method-set-edited-item/index.ts | 6 + .../ApiMethodUpdateItemLabel.tsx | 4 +- .../api-method-update-item-label/client.ts | 7 + .../api-method-update-item-label/index.ts | 6 + .../custom-behavior}/CustomBehavior.tsx | 9 +- .../editing/demos/custom-behavior/client.ts | 7 + .../editing/demos/custom-behavior/index.ts | 6 + .../custom-label-input}/CustomLabelInput.tsx | 9 +- .../demos/custom-label-input/client.ts | 7 + .../editing/demos/custom-label-input/index.ts | 6 + .../{ => demos/edit-leaves}/EditLeaves.tsx | 4 +- .../editing/demos/edit-leaves/client.ts | 7 + .../editing/demos/edit-leaves/index.ts | 6 + .../edit-with-icons}/EditWithIcons.tsx | 9 +- .../editing/demos/edit-with-icons/client.ts | 7 + .../editing/demos/edit-with-icons/index.ts | 6 + .../editing-callback}/EditingCallback.tsx | 4 +- .../editing/demos/editing-callback/client.ts | 7 + .../editing/demos/editing-callback/index.ts | 6 + .../LabelEditingAllItems.tsx | 4 +- .../demos/label-editing-all-items/client.ts | 7 + .../demos/label-editing-all-items/index.ts | 6 + .../LabelEditingSomeItems.tsx | 4 +- .../demos/label-editing-some-items/client.ts | 7 + .../demos/label-editing-some-items/index.ts | 6 + .../{ => demos/validation}/Validation.tsx | 9 +- .../editing/demos/validation/client.ts | 7 + .../editing/demos/validation/index.ts | 6 + .../rich-tree-view/editing/editing.md | 20 +- .../expansion/ApiMethodIsItemExpanded.js | 40 - .../expansion/ApiMethodIsItemExpanded.tsx | 40 - .../ApiMethodIsItemExpanded.tsx.preview | 16 - .../expansion/ApiMethodSetItemExpansion.js | 39 - .../expansion/ApiMethodSetItemExpansion.tsx | 39 - .../ApiMethodSetItemExpansion.tsx.preview | 7 - .../expansion/ControlledExpansion.js | 52 - .../expansion/ControlledExpansion.tsx | 58 - .../expansion/ControlledExpansion.tsx.preview | 12 - .../expansion/IconExpansionTreeView.js | 11 - .../expansion/IconExpansionTreeView.tsx | 11 - .../IconExpansionTreeView.tsx.preview | 1 - .../expansion/TrackItemExpansionToggle.js | 32 - .../expansion/TrackItemExpansionToggle.tsx | 39 - .../TrackItemExpansionToggle.tsx.preview | 13 - .../ApiMethodIsItemExpanded.tsx | 42 + .../api-method-is-item-expanded/client.ts | 7 + .../api-method-is-item-expanded/index.ts | 6 + .../ApiMethodSetItemExpansion.tsx | 41 + .../api-method-set-item-expansion/client.ts | 7 + .../api-method-set-item-expansion/index.ts | 6 + .../ControlledExpansion.tsx | 60 + .../demos/controlled-expansion/client.ts | 7 + .../demos/controlled-expansion/index.ts | 6 + .../IconExpansionTreeView.tsx | 12 + .../demos/icon-expansion-tree-view/client.ts | 7 + .../demos/icon-expansion-tree-view/index.ts | 6 + .../TrackItemExpansionToggle.tsx | 41 + .../track-item-expansion-toggle/client.ts | 7 + .../track-item-expansion-toggle/index.ts | 6 + .../rich-tree-view/expansion/expansion.md | 10 +- .../focus/ApiMethodFocusItem.js | 25 - .../focus/ApiMethodFocusItem.tsx | 25 - .../focus/ApiMethodFocusItem.tsx.preview | 6 - .../ApiMethodFocusItem.tsx | 27 + .../demos/api-method-focus-item/client.ts | 7 + .../demos/api-method-focus-item/index.ts | 6 + .../tree-view/rich-tree-view/focus/focus.md | 2 +- .../rich-tree-view/items/ApiMethodAddItems.js | 54 - .../rich-tree-view/items/ApiMethodGetItem.js | 37 - .../items/ApiMethodGetItem.tsx.preview | 11 - .../items/ApiMethodGetItemDOMElement.js | 34 - .../items/ApiMethodGetItemDOMElement.tsx | 34 - .../ApiMethodGetItemDOMElement.tsx.preview | 12 - .../ApiMethodGetItemOrderedChildrenIds.js | 38 - ...ethodGetItemOrderedChildrenIds.tsx.preview | 12 - .../items/ApiMethodGetItemTree.js | 36 - .../items/ApiMethodGetItemTree.tsx.preview | 8 - .../rich-tree-view/items/BasicRichTreeView.js | 11 - .../items/BasicRichTreeView.tsx | 11 - .../items/BasicRichTreeView.tsx.preview | 1 - .../items/DisableTreeItemPublicAPI.js | 75 -- .../DisableTreeItemPublicAPI.tsx.preview | 5 - .../items/DisabledItemsFocusable.js | 38 - .../items/DisabledItemsFocusable.tsx | 38 - .../rich-tree-view/items/DisabledPropItem.js | 13 - .../rich-tree-view/items/DisabledPropItem.tsx | 13 - .../items/DisabledPropItem.tsx.preview | 1 - .../rich-tree-view/items/GetItemChildren.js | 43 - .../items/GetItemChildren.tsx.preview | 1 - .../rich-tree-view/items/GetItemId.js | 42 - .../items/GetItemId.tsx.preview | 1 - .../rich-tree-view/items/GetItemLabel.js | 42 - .../items/GetItemLabel.tsx.preview | 1 - .../items/GetParentIdPublicAPI.js | 44 - .../items/GetParentIdPublicAPI.tsx.preview | 16 - .../rich-tree-view/items/ItemHeight.js | 12 - .../rich-tree-view/items/ItemHeight.tsx | 12 - .../items/ItemHeight.tsx.preview | 1 - .../items/LoadingCustomIndicator.js | 30 - .../items/LoadingCustomIndicator.tsx.preview | 7 - .../rich-tree-view/items/LoadingCustomRows.js | 36 - .../items/LoadingCustomRows.tsx.preview | 12 - .../items/LoadingRichTreeView.js | 31 - .../items/LoadingRichTreeView.tsx.preview | 13 - .../rich-tree-view/items/OnItemClick.js | 26 - .../rich-tree-view/items/OnItemClick.tsx | 26 - .../items/OnItemClick.tsx.preview | 11 - .../rich-tree-view/items/RootElementRef.js | 55 - .../rich-tree-view/items/RootElementRef.tsx | 56 - .../items/RootElementRef.tsx.preview | 10 - .../ApiMethodAddItems.tsx | 4 +- .../demos/api-method-add-items/client.ts | 7 + .../items/demos/api-method-add-items/index.ts | 6 + .../ApiMethodGetItemDOMElement.tsx | 36 + .../api-method-get-item-dom-element/client.ts | 7 + .../api-method-get-item-dom-element/index.ts | 6 + .../ApiMethodGetItemOrderedChildrenIds.tsx | 4 +- .../client.ts | 7 + .../index.ts | 6 + .../ApiMethodGetItemTree.tsx | 4 +- .../demos/api-method-get-item-tree/client.ts | 7 + .../demos/api-method-get-item-tree/index.ts | 6 + .../api-method-get-item}/ApiMethodGetItem.tsx | 6 +- .../items/demos/api-method-get-item/client.ts | 7 + .../items/demos/api-method-get-item/index.ts | 6 + .../BasicRichTreeView.tsx | 12 + .../demos/basic-rich-tree-view/client.ts | 7 + .../items/demos/basic-rich-tree-view/index.ts | 6 + .../DisableTreeItemPublicAPI.tsx | 11 +- .../disable-tree-item-public-api/client.ts | 7 + .../disable-tree-item-public-api/index.ts | 6 + .../DisabledItemsFocusable.tsx | 41 + .../demos/disabled-items-focusable/client.ts | 7 + .../demos/disabled-items-focusable/index.ts | 6 + .../disabled-prop-item/DisabledPropItem.tsx | 15 + .../items/demos/disabled-prop-item/client.ts | 7 + .../items/demos/disabled-prop-item/index.ts | 6 + .../get-item-children}/GetItemChildren.tsx | 3 +- .../items/demos/get-item-children/client.ts | 7 + .../items/demos/get-item-children/index.ts | 6 + .../{ => demos/get-item-id}/GetItemId.tsx | 1 + .../items/demos/get-item-id/client.ts | 7 + .../items/demos/get-item-id/index.ts | 6 + .../get-item-label}/GetItemLabel.tsx | 1 + .../items/demos/get-item-label/client.ts | 7 + .../items/demos/get-item-label/index.ts | 6 + .../GetParentIdPublicAPI.tsx | 4 +- .../demos/get-parent-id-public-api/client.ts | 7 + .../demos/get-parent-id-public-api/index.ts | 6 + .../items/demos/item-height/ItemHeight.tsx | 13 + .../items/demos/item-height/client.ts | 7 + .../items/demos/item-height/index.ts | 6 + .../LoadingCustomIndicator.tsx | 2 + .../demos/loading-custom-indicator/client.ts | 7 + .../demos/loading-custom-indicator/index.ts | 6 + .../LoadingCustomRows.tsx | 8 +- .../items/demos/loading-custom-rows/client.ts | 7 + .../items/demos/loading-custom-rows/index.ts | 6 + .../LoadingRichTreeView.tsx | 4 +- .../demos/loading-rich-tree-view/client.ts | 7 + .../demos/loading-rich-tree-view/index.ts | 6 + .../items/demos/on-item-click/OnItemClick.tsx | 28 + .../items/demos/on-item-click/client.ts | 7 + .../items/demos/on-item-click/index.ts | 6 + .../demos/root-element-ref/RootElementRef.tsx | 58 + .../items/demos/root-element-ref/client.ts | 7 + .../items/demos/root-element-ref/index.ts | 6 + .../tree-view/rich-tree-view/items/items.md | 38 +- .../ApiMethodUpdateItemChildren.js | 112 -- .../ApiMethodUpdateItemChildren.tsx.preview | 8 - .../lazy-loading/AutoExpandLazyLoadedItems.js | 75 -- .../lazy-loading/BasicLazyLoading.js | 69 - .../lazy-loading/ChildrenLoadingRows.js | 35 - .../ChildrenLoadingRows.tsx.preview | 9 - .../lazy-loading/CustomizedLazyLoading.js | 169 --- .../CustomizedLazyLoading.tsx.preview | 10 - .../lazy-loading/ErrorManagement.js | 49 - .../lazy-loading/ErrorManagement.tsx.preview | 16 - .../lazy-loading/FetchingWithReactQuery.js | 64 - .../FetchingWithReactQuery.tsx.preview | 3 - .../lazy-loading/LazyLoadingAndAddingItems.js | 84 -- .../LazyLoadingAndAddingItems.tsx.preview | 14 - .../LazyLoadingAndLabelEditing.js | 58 - .../LazyLoadingAndLabelEditing.tsx.preview | 11 - .../lazy-loading/LazyLoadingInitialState.js | 37 - .../LazyLoadingInitialState.tsx.preview | 7 - .../lazy-loading/LowTTLCache.js | 34 - .../lazy-loading/LowTTLCache.tsx.preview | 8 - .../lazy-loading/ReactQueryCache.js | 66 - .../lazy-loading/ReactQueryCache.tsx.preview | 3 - .../ApiMethodUpdateItemChildren.tsx | 6 +- .../api-method-update-item-children/client.ts | 7 + .../api-method-update-item-children/index.ts | 6 + .../AutoExpandLazyLoadedItems.tsx | 2 + .../auto-expand-lazy-loaded-items/client.ts | 7 + .../auto-expand-lazy-loaded-items/index.ts | 6 + .../basic-lazy-loading}/BasicLazyLoading.tsx | 2 + .../demos/basic-lazy-loading/client.ts | 7 + .../demos/basic-lazy-loading/index.ts | 6 + .../ChildrenLoadingRows.tsx | 2 + .../demos/children-loading-rows/client.ts | 7 + .../demos/children-loading-rows/index.ts | 6 + .../CustomizedLazyLoading.tsx | 7 +- .../demos/customized-lazy-loading/client.ts | 7 + .../demos/customized-lazy-loading/index.ts | 6 + .../error-management}/ErrorManagement.tsx | 5 +- .../demos/error-management/client.ts | 7 + .../demos/error-management/index.ts | 6 + .../FetchingWithReactQuery.tsx | 2 + .../demos/fetching-with-react-query/client.ts | 7 + .../demos/fetching-with-react-query/index.ts | 6 + .../LazyLoadingAndAddingItems.tsx | 4 +- .../lazy-loading-and-adding-items/client.ts | 7 + .../lazy-loading-and-adding-items/index.ts | 6 + .../LazyLoadingAndLabelEditing.tsx | 4 +- .../lazy-loading-and-label-editing/client.ts | 7 + .../lazy-loading-and-label-editing/index.ts | 6 + .../LazyLoadingInitialState.tsx | 5 +- .../lazy-loading-initial-state/client.ts | 7 + .../demos/lazy-loading-initial-state/index.ts | 6 + .../{ => demos/low-ttl-cache}/LowTTLCache.tsx | 2 + .../demos/low-ttl-cache/client.ts | 7 + .../lazy-loading/demos/low-ttl-cache/index.ts | 6 + .../react-query-cache}/ReactQueryCache.tsx | 4 +- .../demos/react-query-cache/client.ts | 7 + .../demos/react-query-cache/index.ts | 6 + .../lazy-loading/lazy-loading.md | 24 +- .../ordering/CanMoveItemByType.js | 38 - .../ordering/CanMoveItemByType.tsx.preview | 12 - .../rich-tree-view/ordering/DragAndDrop.js | 15 - .../ordering/DragAndDrop.tsx.preview | 5 - .../rich-tree-view/ordering/FileExplorer.js | 259 ---- .../rich-tree-view/ordering/FileExplorer.tsx | 293 ----- .../ordering/OnItemPositionChange.js | 35 - .../ordering/OnlyReorderFromDragHandle.js | 76 -- .../OnlyReorderFromDragHandle.tsx.preview | 6 - .../ordering/OnlyReorderInSameParent.js | 18 - .../OnlyReorderInSameParent.tsx.preview | 8 - .../ordering/OnlyReorderLeaves.js | 22 - .../ordering/OnlyReorderLeaves.tsx.preview | 9 - .../ordering/SendAllItemsToServer.js | 55 - .../ordering/SendAllItemsToServer.tsx.preview | 16 - .../CanMoveItemByType.tsx | 2 + .../demos/can-move-item-by-type/client.ts | 7 + .../demos/can-move-item-by-type/index.ts | 6 + .../{ => demos/drag-and-drop}/DragAndDrop.tsx | 4 +- .../ordering/demos/drag-and-drop/client.ts | 7 + .../ordering/demos/drag-and-drop/index.ts | 6 + .../demos/file-explorer/FileExplorer.tsx | 296 +++++ .../ordering/demos/file-explorer/client.ts | 7 + .../ordering/demos/file-explorer/index.ts | 6 + .../OnItemPositionChange.tsx | 10 +- .../demos/on-item-position-change/client.ts | 7 + .../demos/on-item-position-change/index.ts | 6 + .../OnlyReorderFromDragHandle.tsx | 7 +- .../only-reorder-from-drag-handle/client.ts | 7 + .../only-reorder-from-drag-handle/index.ts | 6 + .../OnlyReorderInSameParent.tsx | 4 +- .../only-reorder-in-same-parent/client.ts | 7 + .../only-reorder-in-same-parent/index.ts | 6 + .../OnlyReorderLeaves.tsx | 4 +- .../demos/only-reorder-leaves/client.ts | 7 + .../demos/only-reorder-leaves/index.ts | 6 + .../SendAllItemsToServer.tsx | 6 +- .../demos/send-all-items-to-server/client.ts | 7 + .../demos/send-all-items-to-server/index.ts | 6 + .../rich-tree-view/ordering/ordering.md | 16 +- .../selection/ApiMethodGetItemSelection.js | 48 - .../selection/ApiMethodGetItemSelection.tsx | 49 - .../selection/ApiMethodSetItemSelection.js | 29 - .../selection/ApiMethodSetItemSelection.tsx | 29 - .../ApiMethodSetItemSelection.tsx.preview | 10 - ...odSetItemSelectionKeepExistingSelection.js | 35 - ...dSetItemSelectionKeepExistingSelection.tsx | 35 - ...SelectionKeepExistingSelection.tsx.preview | 12 - .../selection/CheckboxMultiSelection.js | 11 - .../selection/CheckboxMultiSelection.tsx | 11 - .../CheckboxMultiSelection.tsx.preview | 1 - .../selection/CheckboxSelection.js | 11 - .../selection/CheckboxSelection.tsx | 11 - .../selection/CheckboxSelection.tsx.preview | 1 - .../selection/ControlledSelection.js | 51 - .../selection/ControlledSelection.tsx | 57 - .../selection/ControlledSelection.tsx.preview | 13 - .../selection/DisableSelection.js | 11 - .../selection/DisableSelection.tsx | 11 - .../selection/DisableSelection.tsx.preview | 1 - .../selection/MultiSelectTreeView.js | 11 - .../selection/MultiSelectTreeView.tsx | 11 - .../selection/MultiSelectTreeView.tsx.preview | 1 - .../selection/SelectableItems.js | 20 - .../selection/SelectableItems.tsx | 20 - .../selection/SelectableItems.tsx.preview | 6 - .../selection/SelectionPropagation.js | 59 - .../selection/SelectionPropagationDisabled.js | 46 - .../SelectionPropagationDisabled.tsx.preview | 8 - .../selection/SelectionPropagationMount.js | 35 - .../SelectionPropagationMount.tsx.preview | 9 - .../selection/SingleSelectTreeView.js | 11 - .../selection/SingleSelectTreeView.tsx | 11 - .../SingleSelectTreeView.tsx.preview | 1 - .../selection/TrackItemSelectionToggle.js | 32 - .../selection/TrackItemSelectionToggle.tsx | 38 - .../TrackItemSelectionToggle.tsx.preview | 11 - .../ApiMethodGetItemSelection.tsx | 51 + .../api-method-get-item-selection/client.ts | 7 + .../api-method-get-item-selection/index.ts | 6 + ...dSetItemSelectionKeepExistingSelection.tsx | 37 + .../client.ts | 7 + .../index.ts | 8 + .../ApiMethodSetItemSelection.tsx | 31 + .../api-method-set-item-selection/client.ts | 7 + .../api-method-set-item-selection/index.ts | 6 + .../CheckboxMultiSelection.tsx | 12 + .../demos/checkbox-multi-selection/client.ts | 7 + .../demos/checkbox-multi-selection/index.ts | 6 + .../checkbox-selection/CheckboxSelection.tsx | 12 + .../demos/checkbox-selection/client.ts | 7 + .../demos/checkbox-selection/index.ts | 6 + .../ControlledSelection.tsx | 59 + .../demos/controlled-selection/client.ts | 7 + .../demos/controlled-selection/index.ts | 6 + .../disable-selection/DisableSelection.tsx | 12 + .../demos/disable-selection/client.ts | 7 + .../demos/disable-selection/index.ts | 6 + .../MultiSelectTreeView.tsx | 12 + .../demos/multi-select-tree-view/client.ts | 7 + .../demos/multi-select-tree-view/index.ts | 6 + .../selectable-items/SelectableItems.tsx | 22 + .../demos/selectable-items/client.ts | 7 + .../selection/demos/selectable-items/index.ts | 6 + .../SelectionPropagationDisabled.tsx | 4 +- .../selection-propagation-disabled/client.ts | 7 + .../selection-propagation-disabled/index.ts | 6 + .../SelectionPropagationMount.tsx | 4 +- .../selection-propagation-mount/client.ts | 7 + .../selection-propagation-mount/index.ts | 6 + .../SelectionPropagation.tsx | 6 +- .../demos/selection-propagation/client.ts | 7 + .../demos/selection-propagation/index.ts | 6 + .../SingleSelectTreeView.tsx | 12 + .../demos/single-select-tree-view/client.ts | 7 + .../demos/single-select-tree-view/index.ts | 6 + .../TrackItemSelectionToggle.tsx | 40 + .../track-item-selection-toggle/client.ts | 7 + .../track-item-selection-toggle/index.ts | 6 + .../rich-tree-view/selection/selection.md | 28 +- .../BasicVirtualizedRichTreeViewPro.js | 29 - ...asicVirtualizedRichTreeViewPro.tsx.preview | 1 - .../virtualization/FixedSizeRichTreeView.js | 16 - .../FixedSizeRichTreeView.tsx.preview | 3 - .../virtualization/FlexRichTreeView.js | 32 - .../FlexRichTreeView.tsx.preview | 11 - .../MinMaxHeightRichTreeView.js | 106 -- .../BasicVirtualizedRichTreeViewPro.tsx | 3 +- .../client.ts | 7 + .../index.ts | 6 + .../FixedSizeRichTreeView.tsx | 4 +- .../demos/fixed-size-rich-tree-view/client.ts | 7 + .../demos/fixed-size-rich-tree-view/index.ts | 6 + .../flex-rich-tree-view}/FlexRichTreeView.tsx | 4 +- .../demos/flex-rich-tree-view/client.ts | 7 + .../demos/flex-rich-tree-view/index.ts | 6 + .../MinMaxHeightRichTreeView.tsx | 4 +- .../min-max-height-rich-tree-view/client.ts | 7 + .../min-max-height-rich-tree-view/index.ts | 6 + .../virtualization/virtualization.md | 8 +- .../customization/BorderedTreeView.js | 66 - .../customization/CustomAnimation.js | 54 - .../customization/CustomAnimation.tsx | 56 - .../customization/CustomIcons.js | 60 - .../customization/CustomIcons.tsx | 60 - .../customization/CustomStyling.js | 60 - .../customization/CustomStyling.tsx | 60 - .../customization/GmailTreeView.js | 194 --- .../customization/HeadlessAPI.js | 75 -- .../customization/HeadlessAPI.tsx | 83 -- .../customization/HeadlessAPI.tsx.preview | 11 - .../customization/customization.md | 12 +- .../bordered-tree-view}/BorderedTreeView.tsx | 2 + .../demos/bordered-tree-view/client.ts | 7 + .../demos/bordered-tree-view/index.ts | 6 + .../custom-animation/CustomAnimation.tsx | 59 + .../demos/custom-animation/client.ts | 7 + .../demos/custom-animation/index.ts | 6 + .../demos/custom-icons/CustomIcons.tsx | 63 + .../demos/custom-icons/client.ts | 7 + .../customization/demos/custom-icons/index.ts | 6 + .../demos/custom-styling/CustomStyling.tsx | 62 + .../demos/custom-styling/client.ts | 7 + .../demos/custom-styling/index.ts | 6 + .../gmail-tree-view}/GmailTreeView.tsx | 7 +- .../demos/gmail-tree-view/client.ts | 7 + .../demos/gmail-tree-view/index.ts | 6 + .../demos/headless-api/HeadlessAPI.tsx | 86 ++ .../demos/headless-api/client.ts | 7 + .../customization/demos/headless-api/index.ts | 6 + .../expansion/ApiMethodIsItemExpanded.js | 56 - .../expansion/ApiMethodIsItemExpanded.tsx | 56 - .../expansion/ApiMethodSetItemExpansion.js | 55 - .../expansion/ApiMethodSetItemExpansion.tsx | 55 - .../expansion/ControlledExpansion.js | 66 - .../expansion/ControlledExpansion.tsx | 69 - .../expansion/IconExpansionTreeView.js | 27 - .../expansion/IconExpansionTreeView.tsx | 27 - .../expansion/TrackItemExpansionToggle.js | 45 - .../expansion/TrackItemExpansionToggle.tsx | 52 - .../ApiMethodIsItemExpanded.tsx | 58 + .../api-method-is-item-expanded/client.ts | 7 + .../api-method-is-item-expanded/index.ts | 6 + .../ApiMethodSetItemExpansion.tsx | 57 + .../api-method-set-item-expansion/client.ts | 7 + .../api-method-set-item-expansion/index.ts | 6 + .../ControlledExpansion.tsx | 71 + .../demos/controlled-expansion/client.ts | 7 + .../demos/controlled-expansion/index.ts | 6 + .../IconExpansionTreeView.tsx | 29 + .../demos/icon-expansion-tree-view/client.ts | 7 + .../demos/icon-expansion-tree-view/index.ts | 6 + .../TrackItemExpansionToggle.tsx | 54 + .../track-item-expansion-toggle/client.ts | 7 + .../track-item-expansion-toggle/index.ts | 6 + .../simple-tree-view/expansion/expansion.md | 10 +- .../focus/ApiMethodFocusItem.js | 41 - .../focus/ApiMethodFocusItem.tsx | 41 - .../ApiMethodFocusItem.tsx | 43 + .../demos/api-method-focus-item/client.ts | 7 + .../demos/api-method-focus-item/index.ts | 6 + .../tree-view/simple-tree-view/focus/focus.md | 2 +- .../items/ApiMethodGetItemDOMElement.js | 49 - .../items/ApiMethodGetItemDOMElement.tsx | 49 - .../items/BasicSimpleTreeView.js | 27 - .../items/BasicSimpleTreeView.tsx | 27 - .../items/DisabledItemsFocusable.js | 48 - .../items/DisabledItemsFocusable.tsx | 48 - .../simple-tree-view/items/DisabledJSXItem.js | 27 - .../simple-tree-view/items/ItemHeight.js | 28 - .../simple-tree-view/items/ItemHeight.tsx | 28 - .../simple-tree-view/items/OnItemClick.js | 39 - .../simple-tree-view/items/OnItemClick.tsx | 39 - .../simple-tree-view/items/RootElementRef.js | 46 - .../simple-tree-view/items/RootElementRef.tsx | 46 - .../items/RootElementRef.tsx.preview | 12 - .../ApiMethodGetItemDOMElement.tsx | 51 + .../api-method-get-item-dom-element/client.ts | 7 + .../api-method-get-item-dom-element/index.ts | 6 + .../BasicSimpleTreeView.tsx | 29 + .../demos/basic-simple-tree-view/client.ts | 7 + .../demos/basic-simple-tree-view/index.ts | 6 + .../DisabledItemsFocusable.tsx | 50 + .../demos/disabled-items-focusable/client.ts | 7 + .../demos/disabled-items-focusable/index.ts | 6 + .../disabled-jsx-item}/DisabledJSXItem.tsx | 2 + .../items/demos/disabled-jsx-item/client.ts | 7 + .../items/demos/disabled-jsx-item/index.ts | 6 + .../items/demos/item-height/ItemHeight.tsx | 30 + .../items/demos/item-height/client.ts | 7 + .../items/demos/item-height/index.ts | 6 + .../items/demos/on-item-click/OnItemClick.tsx | 41 + .../items/demos/on-item-click/client.ts | 7 + .../items/demos/on-item-click/index.ts | 6 + .../demos/root-element-ref/RootElementRef.tsx | 48 + .../items/demos/root-element-ref/client.ts | 7 + .../items/demos/root-element-ref/index.ts | 6 + .../tree-view/simple-tree-view/items/items.md | 14 +- .../selection/ApiMethodGetItemSelection.js | 63 - .../selection/ApiMethodGetItemSelection.tsx | 64 - .../selection/ApiMethodSetItemSelection.js | 41 - .../selection/ApiMethodSetItemSelection.tsx | 41 - ...odSetItemSelectionKeepExistingSelection.js | 50 - ...dSetItemSelectionKeepExistingSelection.tsx | 50 - .../selection/CheckboxMultiSelection.js | 27 - .../selection/CheckboxMultiSelection.tsx | 27 - .../selection/CheckboxSelection.js | 27 - .../selection/CheckboxSelection.tsx | 27 - .../selection/ControlledSelection.js | 67 - .../selection/ControlledSelection.tsx | 70 - .../selection/DisableSelection.js | 27 - .../selection/DisableSelection.tsx | 27 - .../selection/MultiSelectTreeView.js | 27 - .../selection/MultiSelectTreeView.tsx | 27 - .../selection/SelectableItems.js | 27 - .../selection/SelectableItems.tsx | 27 - .../selection/SingleSelectTreeView.js | 27 - .../selection/SingleSelectTreeView.tsx | 27 - .../selection/TrackItemSelectionToggle.js | 45 - .../selection/TrackItemSelectionToggle.tsx | 51 - .../ApiMethodGetItemSelection.tsx | 66 + .../api-method-get-item-selection/client.ts | 7 + .../api-method-get-item-selection/index.ts | 6 + ...dSetItemSelectionKeepExistingSelection.tsx | 52 + .../client.ts | 7 + .../index.ts | 8 + .../ApiMethodSetItemSelection.tsx | 43 + .../api-method-set-item-selection/client.ts | 7 + .../api-method-set-item-selection/index.ts | 6 + .../CheckboxMultiSelection.tsx | 29 + .../demos/checkbox-multi-selection/client.ts | 7 + .../demos/checkbox-multi-selection/index.ts | 6 + .../checkbox-selection/CheckboxSelection.tsx | 29 + .../demos/checkbox-selection/client.ts | 7 + .../demos/checkbox-selection/index.ts | 6 + .../ControlledSelection.tsx | 72 ++ .../demos/controlled-selection/client.ts | 7 + .../demos/controlled-selection/index.ts | 6 + .../disable-selection/DisableSelection.tsx | 29 + .../demos/disable-selection/client.ts | 7 + .../demos/disable-selection/index.ts | 6 + .../MultiSelectTreeView.tsx | 29 + .../demos/multi-select-tree-view/client.ts | 7 + .../demos/multi-select-tree-view/index.ts | 6 + .../selectable-items/SelectableItems.tsx | 29 + .../demos/selectable-items/client.ts | 7 + .../selection/demos/selectable-items/index.ts | 6 + .../SingleSelectTreeView.tsx | 29 + .../demos/single-select-tree-view/client.ts | 7 + .../demos/single-select-tree-view/index.ts | 6 + .../TrackItemSelectionToggle.tsx | 53 + .../track-item-selection-toggle/client.ts | 7 + .../track-item-selection-toggle/index.ts | 6 + .../simple-tree-view/selection/selection.md | 22 +- .../tree-item-customization/CheckboxSlot.js | 34 - .../CheckboxSlot.tsx.preview | 6 - .../CheckboxSlotProps.js | 36 - .../CheckboxSlotProps.tsx.preview | 6 - .../tree-item-customization/ContentSlot.js | 50 - .../ContentSlot.tsx.preview | 7 - .../ContentSlotProps.js | 31 - .../ContentSlotProps.tsx | 40 - .../ContentSlotProps.tsx.preview | 5 - .../CustomTreeItemDemo.tsx | 3 +- .../HandleCheckboxSelectionDemo.js | 46 - .../HandleCheckboxSelectionDemo.tsx.preview | 6 - .../HandleExpansionDemo.js | 102 -- .../HandleExpansionDemo.tsx.preview | 5 - .../HandleSelectionDemo.js | 72 -- .../HandleSelectionDemo.tsx.preview | 6 - .../ItemChildrenIndentationProp.js | 15 - .../ItemChildrenIndentationProp.tsx.preview | 5 - .../tree-item-customization/LabelSlot.js | 98 -- .../LabelSlot.tsx.preview | 5 - .../tree-item-customization/LabelSlotProps.js | 31 - .../LabelSlotProps.tsx | 34 - .../LabelSlotProps.tsx.preview | 5 - .../CheckboxSlotProps.tsx | 11 +- .../demos/checkbox-slot-props/client.ts | 7 + .../demos/checkbox-slot-props/index.ts | 6 + .../checkbox-slot}/CheckboxSlot.tsx | 7 +- .../demos/checkbox-slot/client.ts | 7 + .../demos/checkbox-slot/index.ts | 6 + .../content-slot-props/ContentSlotProps.tsx | 39 + .../demos/content-slot-props/client.ts | 7 + .../demos/content-slot-props/index.ts | 6 + .../{ => demos/content-slot}/ContentSlot.tsx | 7 +- .../demos/content-slot/client.ts | 7 + .../demos/content-slot/index.ts | 6 + .../HandleCheckboxSelectionDemo.tsx | 13 +- .../handle-checkbox-selection-demo/client.ts | 7 + .../handle-checkbox-selection-demo/index.ts | 6 + .../HandleExpansionDemo.tsx | 6 +- .../demos/handle-expansion-demo/client.ts | 7 + .../demos/handle-expansion-demo/index.ts | 6 + .../HandleSelectionDemo.tsx | 13 +- .../demos/handle-selection-demo/client.ts | 7 + .../demos/handle-selection-demo/index.ts | 6 + .../ItemChildrenIndentationProp.tsx | 4 +- .../item-children-indentation-prop/client.ts | 7 + .../item-children-indentation-prop/index.ts | 6 + .../demos/label-slot-props/LabelSlotProps.tsx | 37 + .../demos/label-slot-props/client.ts | 7 + .../demos/label-slot-props/index.ts | 6 + .../{ => demos/label-slot}/LabelSlot.tsx | 5 +- .../demos/label-slot/client.ts | 7 + .../demos/label-slot/index.ts | 6 + .../use-tree-item-hook-properties/client.ts | 7 + .../use-tree-item-hook-properties/index.ts | 6 + .../useTreeItemHookProperties.tsx | 6 +- .../use-tree-item-hook-public-api/client.ts | 7 + .../use-tree-item-hook-public-api/index.ts | 6 + .../useTreeItemHookPublicAPI.tsx | 7 +- .../demos/use-tree-item-hook-status/client.ts | 7 + .../demos/use-tree-item-hook-status/index.ts | 6 + .../useTreeItemHookStatus.tsx | 9 +- .../tree-item-customization.md | 28 +- .../useTreeItemHookProperties.js | 70 - .../useTreeItemHookProperties.tsx.preview | 7 - .../useTreeItemHookPublicAPI.js | 75 -- .../useTreeItemHookPublicAPI.tsx.preview | 5 - .../useTreeItemHookStatus.js | 168 --- .../useTreeItemHookStatus.tsx.preview | 11 - .../useTreeItemModelHook.tsx | 3 +- .../components/ToolbarMigration.test.tsx | 4 +- .../overview/chat/mainDemo/MainDemo.tsx | 2 +- .../overview/chat/mainDemo/demoConfigs.ts | 8 +- .../modules/examples/charts/AreaChartsGrid.js | 8 +- .../modules/examples/charts/BarChartsGrid.js | 14 +- .../modules/examples/charts/LineChartsGrid.js | 16 +- .../examples/charts/OtherChartsGrid.js | 8 +- .../modules/examples/charts/PieChartsGrid.js | 12 +- .../examples/charts/ScatterChartsGrid.js | 4 +- .../pages/production-error/ErrorDecoder.js | 124 -- .../demos/error-decoder/ErrorDecoder.tsx | 134 ++ .../demos/error-decoder/client.ts | 5 + .../demos/error-decoder/index.ts | 5 + docs/src/pages/production-error/index.md | 2 +- 7411 files changed, 35045 insertions(+), 133838 deletions(-) delete mode 100644 docs/data/charts/accessibility/KeyboardActivation.js delete mode 100644 docs/data/charts/accessibility/KeyboardNavigation.js delete mode 100644 docs/data/charts/accessibility/KeyboardNavigation.tsx rename docs/data/charts/accessibility/{ => demos/keyboard-activation}/KeyboardActivation.tsx (95%) create mode 100644 docs/data/charts/accessibility/demos/keyboard-activation/client.ts create mode 100644 docs/data/charts/accessibility/demos/keyboard-activation/index.ts create mode 100644 docs/data/charts/accessibility/demos/keyboard-navigation/KeyboardNavigation.tsx create mode 100644 docs/data/charts/accessibility/demos/keyboard-navigation/client.ts create mode 100644 docs/data/charts/accessibility/demos/keyboard-navigation/index.ts delete mode 100644 docs/data/charts/animation/CSSAnimationCustomization.js delete mode 100644 docs/data/charts/animation/CSSAnimationCustomization.tsx.preview delete mode 100644 docs/data/charts/animation/JSAnimationCustomization.js delete mode 100644 docs/data/charts/animation/JSDefaultAnimation.js delete mode 100644 docs/data/charts/animation/MotionAnimationCustomization.js delete mode 100644 docs/data/charts/animation/ReactSpringAnimationCustomization.js rename docs/data/charts/animation/{ => demos/css-animation-customization}/CSSAnimationCustomization.tsx (95%) create mode 100644 docs/data/charts/animation/demos/css-animation-customization/client.ts create mode 100644 docs/data/charts/animation/demos/css-animation-customization/index.ts rename docs/data/charts/animation/{ => demos/js-animation-customization}/JSAnimationCustomization.tsx (91%) create mode 100644 docs/data/charts/animation/demos/js-animation-customization/client.ts create mode 100644 docs/data/charts/animation/demos/js-animation-customization/index.ts rename docs/data/charts/animation/{ => demos/js-default-animation}/JSDefaultAnimation.tsx (91%) create mode 100644 docs/data/charts/animation/demos/js-default-animation/client.ts create mode 100644 docs/data/charts/animation/demos/js-default-animation/index.ts rename docs/data/charts/animation/{ => demos/motion-animation-customization}/MotionAnimationCustomization.tsx (89%) create mode 100644 docs/data/charts/animation/demos/motion-animation-customization/client.ts create mode 100644 docs/data/charts/animation/demos/motion-animation-customization/index.ts rename docs/data/charts/animation/{ => demos/react-spring-animation-customization}/ReactSpringAnimationCustomization.tsx (90%) create mode 100644 docs/data/charts/animation/demos/react-spring-animation-customization/client.ts create mode 100644 docs/data/charts/animation/demos/react-spring-animation-customization/index.ts delete mode 100644 docs/data/charts/areas-demo/AreaChartConnectNulls.js delete mode 100644 docs/data/charts/areas-demo/AreaChartConnectNulls.tsx.preview delete mode 100644 docs/data/charts/areas-demo/AreaChartFillByValue.js delete mode 100644 docs/data/charts/areas-demo/PercentAreaChart.js delete mode 100644 docs/data/charts/areas-demo/SimpleAreaChart.js delete mode 100644 docs/data/charts/areas-demo/SimpleAreaChart.tsx.preview delete mode 100644 docs/data/charts/areas-demo/StackedAreaChart.js delete mode 100644 docs/data/charts/areas-demo/TinyAreaChart.js delete mode 100644 docs/data/charts/areas-demo/TinyAreaChart.tsx.preview rename docs/data/charts/areas-demo/{ => demos/area-chart-connect-nulls}/AreaChartConnectNulls.tsx (93%) create mode 100644 docs/data/charts/areas-demo/demos/area-chart-connect-nulls/client.ts create mode 100644 docs/data/charts/areas-demo/demos/area-chart-connect-nulls/index.ts rename docs/data/charts/areas-demo/{ => demos/area-chart-fill-by-value}/AreaChartFillByValue.tsx (97%) create mode 100644 docs/data/charts/areas-demo/demos/area-chart-fill-by-value/client.ts create mode 100644 docs/data/charts/areas-demo/demos/area-chart-fill-by-value/index.ts rename docs/data/charts/areas-demo/{ => demos/percent-area-chart}/PercentAreaChart.tsx (96%) create mode 100644 docs/data/charts/areas-demo/demos/percent-area-chart/client.ts create mode 100644 docs/data/charts/areas-demo/demos/percent-area-chart/index.ts rename docs/data/charts/areas-demo/{ => demos/simple-area-chart}/SimpleAreaChart.tsx (93%) create mode 100644 docs/data/charts/areas-demo/demos/simple-area-chart/client.ts create mode 100644 docs/data/charts/areas-demo/demos/simple-area-chart/index.ts rename docs/data/charts/areas-demo/{ => demos/stacked-area-chart}/StackedAreaChart.tsx (95%) create mode 100644 docs/data/charts/areas-demo/demos/stacked-area-chart/client.ts create mode 100644 docs/data/charts/areas-demo/demos/stacked-area-chart/index.ts rename docs/data/charts/areas-demo/{ => demos/tiny-area-chart}/TinyAreaChart.tsx (93%) create mode 100644 docs/data/charts/areas-demo/demos/tiny-area-chart/client.ts create mode 100644 docs/data/charts/areas-demo/demos/tiny-area-chart/index.ts delete mode 100644 docs/data/charts/axis-customization/AxisCustomization.js delete mode 100644 docs/data/charts/axis-customization/AxisIdStyling.js delete mode 100644 docs/data/charts/axis-customization/AxisIdStyling.tsx.preview delete mode 100644 docs/data/charts/axis-customization/AxisTextCustomization.js delete mode 100644 docs/data/charts/axis-customization/CustomAxisTicks.js delete mode 100644 docs/data/charts/axis-customization/CustomAxisTicks.tsx.preview delete mode 100644 docs/data/charts/axis-customization/GroupedAxesStyling.js delete mode 100644 docs/data/charts/axis-customization/GroupedAxesTickSize.js delete mode 100644 docs/data/charts/axis-customization/MarginAndLabelPosition.js delete mode 100644 docs/data/charts/axis-customization/TickLabelImage.js rename docs/data/charts/axis-customization/{ => demos/axis-customization}/AxisCustomization.tsx (97%) create mode 100644 docs/data/charts/axis-customization/demos/axis-customization/client.ts create mode 100644 docs/data/charts/axis-customization/demos/axis-customization/index.ts rename docs/data/charts/axis-customization/{ => demos/axis-id-styling}/AxisIdStyling.tsx (87%) create mode 100644 docs/data/charts/axis-customization/demos/axis-id-styling/client.ts create mode 100644 docs/data/charts/axis-customization/demos/axis-id-styling/index.ts rename docs/data/charts/axis-customization/{ => demos/axis-text-customization}/AxisTextCustomization.tsx (95%) create mode 100644 docs/data/charts/axis-customization/demos/axis-text-customization/client.ts create mode 100644 docs/data/charts/axis-customization/demos/axis-text-customization/index.ts rename docs/data/charts/axis-customization/{ => demos/custom-axis-ticks}/CustomAxisTicks.tsx (91%) create mode 100644 docs/data/charts/axis-customization/demos/custom-axis-ticks/client.ts create mode 100644 docs/data/charts/axis-customization/demos/custom-axis-ticks/index.ts rename docs/data/charts/axis-customization/{ => demos/grouped-axes-styling}/GroupedAxesStyling.tsx (97%) create mode 100644 docs/data/charts/axis-customization/demos/grouped-axes-styling/client.ts create mode 100644 docs/data/charts/axis-customization/demos/grouped-axes-styling/index.ts rename docs/data/charts/axis-customization/{ => demos/grouped-axes-tick-size}/GroupedAxesTickSize.tsx (97%) create mode 100644 docs/data/charts/axis-customization/demos/grouped-axes-tick-size/client.ts create mode 100644 docs/data/charts/axis-customization/demos/grouped-axes-tick-size/index.ts rename docs/data/charts/axis-customization/{ => demos/margin-and-label-position}/MarginAndLabelPosition.tsx (99%) create mode 100644 docs/data/charts/axis-customization/demos/margin-and-label-position/client.ts create mode 100644 docs/data/charts/axis-customization/demos/margin-and-label-position/index.ts rename docs/data/charts/axis-customization/{ => demos/tick-label-image}/TickLabelImage.tsx (92%) create mode 100644 docs/data/charts/axis-customization/demos/tick-label-image/client.ts create mode 100644 docs/data/charts/axis-customization/demos/tick-label-image/index.ts delete mode 100644 docs/data/charts/axis-ticks/CustomTickFrequency.js delete mode 100644 docs/data/charts/axis-ticks/CustomTickFrequency.tsx.preview delete mode 100644 docs/data/charts/axis-ticks/GridDemo.js delete mode 100644 docs/data/charts/axis-ticks/GridDemo.tsx delete mode 100644 docs/data/charts/axis-ticks/GridDemo.tsx.preview delete mode 100644 docs/data/charts/axis-ticks/GridLabels.js delete mode 100644 docs/data/charts/axis-ticks/OrdinalTickPlacement.js delete mode 100644 docs/data/charts/axis-ticks/TickLabelPosition.js delete mode 100644 docs/data/charts/axis-ticks/TickNumber.js delete mode 100644 docs/data/charts/axis-ticks/TickNumber.tsx.preview delete mode 100644 docs/data/charts/axis-ticks/TickPosition.js delete mode 100644 docs/data/charts/axis-ticks/TickPosition.tsx.preview delete mode 100644 docs/data/charts/axis-ticks/TickSpacing.js rename docs/data/charts/axis-ticks/{ => demos/custom-tick-frequency}/CustomTickFrequency.tsx (90%) create mode 100644 docs/data/charts/axis-ticks/demos/custom-tick-frequency/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/custom-tick-frequency/index.ts create mode 100644 docs/data/charts/axis-ticks/demos/grid-demo/GridDemo.tsx create mode 100644 docs/data/charts/axis-ticks/demos/grid-demo/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/grid-demo/index.ts rename docs/data/charts/axis-ticks/{ => demos/grid-labels}/GridLabels.tsx (91%) create mode 100644 docs/data/charts/axis-ticks/demos/grid-labels/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/grid-labels/index.ts rename docs/data/charts/axis-ticks/{ => demos/ordinal-tick-placement}/OrdinalTickPlacement.tsx (86%) create mode 100644 docs/data/charts/axis-ticks/demos/ordinal-tick-placement/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/ordinal-tick-placement/index.ts rename docs/data/charts/axis-ticks/{ => demos/tick-label-position}/TickLabelPosition.tsx (95%) create mode 100644 docs/data/charts/axis-ticks/demos/tick-label-position/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/tick-label-position/index.ts rename docs/data/charts/axis-ticks/{ => demos/tick-number}/TickNumber.tsx (96%) create mode 100644 docs/data/charts/axis-ticks/demos/tick-number/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/tick-number/index.ts rename docs/data/charts/axis-ticks/{ => demos/tick-position}/TickPosition.tsx (95%) create mode 100644 docs/data/charts/axis-ticks/demos/tick-position/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/tick-position/index.ts rename docs/data/charts/axis-ticks/{ => demos/tick-spacing}/TickSpacing.tsx (93%) create mode 100644 docs/data/charts/axis-ticks/demos/tick-spacing/client.ts create mode 100644 docs/data/charts/axis-ticks/demos/tick-spacing/index.ts delete mode 100644 docs/data/charts/axis/AxisAutoSize.js delete mode 100644 docs/data/charts/axis/AxisAutoSizeRotated.js delete mode 100644 docs/data/charts/axis/AxisCoordinatesDemo.js delete mode 100644 docs/data/charts/axis/AxisWithComposition.js delete mode 100644 docs/data/charts/axis/CustomDomainYAxis.js delete mode 100644 docs/data/charts/axis/CustomDomainYAxis.tsx delete mode 100644 docs/data/charts/axis/FormatterD3.js delete mode 100644 docs/data/charts/axis/FormatterDemo.js delete mode 100644 docs/data/charts/axis/FormatterDemo.tsx.preview delete mode 100644 docs/data/charts/axis/GroupedAxes.js delete mode 100644 docs/data/charts/axis/GroupedAxes.tsx.preview delete mode 100644 docs/data/charts/axis/GroupedAxesAutoSize.js delete mode 100644 docs/data/charts/axis/GroupedYAxes.js delete mode 100644 docs/data/charts/axis/GroupedYAxes.tsx.preview delete mode 100644 docs/data/charts/axis/HidingAxis.js delete mode 100644 docs/data/charts/axis/HidingAxis.tsx.preview delete mode 100644 docs/data/charts/axis/MinMaxExample.js delete mode 100644 docs/data/charts/axis/ModifyAxisPosition.js delete mode 100644 docs/data/charts/axis/ModifyAxisPosition.tsx.preview delete mode 100644 docs/data/charts/axis/MultipleAxes.js delete mode 100644 docs/data/charts/axis/MultipleAxes.tsx.preview delete mode 100644 docs/data/charts/axis/ReferenceLine.js delete mode 100644 docs/data/charts/axis/ReferenceLine.tsx.preview delete mode 100644 docs/data/charts/axis/ReverseExample.js delete mode 100644 docs/data/charts/axis/ScaleExample.js delete mode 100644 docs/data/charts/axis/ScaleExample.tsx.preview delete mode 100644 docs/data/charts/axis/SymlogScale.js delete mode 100644 docs/data/charts/axis/SymlogScale.tsx.preview delete mode 100644 docs/data/charts/axis/TicksWithoutLabels.js rename docs/data/charts/axis/{ => demos/axis-auto-size-rotated}/AxisAutoSizeRotated.tsx (97%) create mode 100644 docs/data/charts/axis/demos/axis-auto-size-rotated/client.ts create mode 100644 docs/data/charts/axis/demos/axis-auto-size-rotated/index.ts rename docs/data/charts/axis/{ => demos/axis-auto-size}/AxisAutoSize.tsx (97%) create mode 100644 docs/data/charts/axis/demos/axis-auto-size/client.ts create mode 100644 docs/data/charts/axis/demos/axis-auto-size/index.ts rename docs/data/charts/axis/{ => demos/axis-coordinates-demo}/AxisCoordinatesDemo.tsx (96%) create mode 100644 docs/data/charts/axis/demos/axis-coordinates-demo/client.ts create mode 100644 docs/data/charts/axis/demos/axis-coordinates-demo/index.ts rename docs/data/charts/axis/{ => demos/axis-with-composition}/AxisWithComposition.tsx (96%) create mode 100644 docs/data/charts/axis/demos/axis-with-composition/client.ts create mode 100644 docs/data/charts/axis/demos/axis-with-composition/index.ts create mode 100644 docs/data/charts/axis/demos/custom-domain-y-axis/CustomDomainYAxis.tsx create mode 100644 docs/data/charts/axis/demos/custom-domain-y-axis/client.ts create mode 100644 docs/data/charts/axis/demos/custom-domain-y-axis/index.ts rename docs/data/charts/axis/{ => demos/formatter-d3}/FormatterD3.tsx (93%) create mode 100644 docs/data/charts/axis/demos/formatter-d3/client.ts create mode 100644 docs/data/charts/axis/demos/formatter-d3/index.ts rename docs/data/charts/axis/{ => demos/formatter-demo}/FormatterDemo.tsx (97%) create mode 100644 docs/data/charts/axis/demos/formatter-demo/client.ts create mode 100644 docs/data/charts/axis/demos/formatter-demo/index.ts rename docs/data/charts/axis/{ => demos/grouped-axes-auto-size}/GroupedAxesAutoSize.tsx (97%) create mode 100644 docs/data/charts/axis/demos/grouped-axes-auto-size/client.ts create mode 100644 docs/data/charts/axis/demos/grouped-axes-auto-size/index.ts rename docs/data/charts/axis/{ => demos/grouped-axes}/GroupedAxes.tsx (97%) create mode 100644 docs/data/charts/axis/demos/grouped-axes/client.ts create mode 100644 docs/data/charts/axis/demos/grouped-axes/index.ts rename docs/data/charts/axis/{ => demos/grouped-y-axes}/GroupedYAxes.tsx (96%) create mode 100644 docs/data/charts/axis/demos/grouped-y-axes/client.ts create mode 100644 docs/data/charts/axis/demos/grouped-y-axes/index.ts rename docs/data/charts/axis/{ => demos/hiding-axis}/HidingAxis.tsx (85%) create mode 100644 docs/data/charts/axis/demos/hiding-axis/client.ts create mode 100644 docs/data/charts/axis/demos/hiding-axis/index.ts rename docs/data/charts/axis/{ => demos/min-max-example}/MinMaxExample.tsx (97%) create mode 100644 docs/data/charts/axis/demos/min-max-example/client.ts create mode 100644 docs/data/charts/axis/demos/min-max-example/index.ts rename docs/data/charts/axis/{ => demos/modify-axis-position}/ModifyAxisPosition.tsx (93%) create mode 100644 docs/data/charts/axis/demos/modify-axis-position/client.ts create mode 100644 docs/data/charts/axis/demos/modify-axis-position/index.ts rename docs/data/charts/axis/{ => demos/multiple-axes}/MultipleAxes.tsx (93%) create mode 100644 docs/data/charts/axis/demos/multiple-axes/client.ts create mode 100644 docs/data/charts/axis/demos/multiple-axes/index.ts rename docs/data/charts/axis/{ => demos/reference-line}/ReferenceLine.tsx (94%) create mode 100644 docs/data/charts/axis/demos/reference-line/client.ts create mode 100644 docs/data/charts/axis/demos/reference-line/index.ts rename docs/data/charts/axis/{ => demos/reverse-example}/ReverseExample.tsx (98%) create mode 100644 docs/data/charts/axis/demos/reverse-example/client.ts create mode 100644 docs/data/charts/axis/demos/reverse-example/index.ts rename docs/data/charts/axis/{ => demos/scale-example}/ScaleExample.tsx (93%) create mode 100644 docs/data/charts/axis/demos/scale-example/client.ts create mode 100644 docs/data/charts/axis/demos/scale-example/index.ts rename docs/data/charts/axis/{ => demos/symlog-scale}/SymlogScale.tsx (97%) create mode 100644 docs/data/charts/axis/demos/symlog-scale/client.ts create mode 100644 docs/data/charts/axis/demos/symlog-scale/index.ts rename docs/data/charts/axis/{ => demos/ticks-without-labels}/TicksWithoutLabels.tsx (93%) create mode 100644 docs/data/charts/axis/demos/ticks-without-labels/client.ts create mode 100644 docs/data/charts/axis/demos/ticks-without-labels/index.ts delete mode 100644 docs/data/charts/bar-demo/BarChartStackedBySign.js delete mode 100644 docs/data/charts/bar-demo/BarChartStackedBySign.tsx.preview delete mode 100644 docs/data/charts/bar-demo/BiaxialBarChart.js delete mode 100644 docs/data/charts/bar-demo/HistogramBarChart.js delete mode 100644 docs/data/charts/bar-demo/MixedBarChart.js delete mode 100644 docs/data/charts/bar-demo/MixedBarChart.tsx.preview delete mode 100644 docs/data/charts/bar-demo/PopulationPyramidBarChart.js delete mode 100644 docs/data/charts/bar-demo/PositiveAndNegativeBarChart.js delete mode 100644 docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx.preview delete mode 100644 docs/data/charts/bar-demo/SimpleBarChart.js delete mode 100644 docs/data/charts/bar-demo/SimpleBarChart.tsx.preview delete mode 100644 docs/data/charts/bar-demo/StackedBarChart.js delete mode 100644 docs/data/charts/bar-demo/StackedBarChart.tsx.preview delete mode 100644 docs/data/charts/bar-demo/TinyBarChart.js delete mode 100644 docs/data/charts/bar-demo/TinyBarChart.tsx.preview delete mode 100644 docs/data/charts/bar-demo/WaterfallChart.js rename docs/data/charts/bar-demo/{ => demos/bar-chart-stacked-by-sign}/BarChartStackedBySign.tsx (93%) create mode 100644 docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/client.ts create mode 100644 docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/index.ts rename docs/data/charts/bar-demo/{ => demos/biaxial-bar-chart}/BiaxialBarChart.tsx (94%) create mode 100644 docs/data/charts/bar-demo/demos/biaxial-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/biaxial-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/histogram-bar-chart}/HistogramBarChart.tsx (98%) create mode 100644 docs/data/charts/bar-demo/demos/histogram-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/histogram-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/mixed-bar-chart}/MixedBarChart.tsx (93%) create mode 100644 docs/data/charts/bar-demo/demos/mixed-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/mixed-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/population-pyramid-bar-chart}/PopulationPyramidBarChart.tsx (98%) create mode 100644 docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/positive-and-negative-bar-chart}/PositiveAndNegativeBarChart.tsx (92%) create mode 100644 docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/simple-bar-chart}/SimpleBarChart.tsx (92%) create mode 100644 docs/data/charts/bar-demo/demos/simple-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/simple-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/stacked-bar-chart}/StackedBarChart.tsx (93%) create mode 100644 docs/data/charts/bar-demo/demos/stacked-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/stacked-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/tiny-bar-chart}/TinyBarChart.tsx (91%) create mode 100644 docs/data/charts/bar-demo/demos/tiny-bar-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/tiny-bar-chart/index.ts rename docs/data/charts/bar-demo/{ => demos/waterfall-chart}/WaterfallChart.tsx (97%) create mode 100644 docs/data/charts/bar-demo/demos/waterfall-chart/client.ts create mode 100644 docs/data/charts/bar-demo/demos/waterfall-chart/index.ts delete mode 100644 docs/data/charts/bars/BarAnimation.js delete mode 100644 docs/data/charts/bars/BarBatchRenderer.js delete mode 100644 docs/data/charts/bars/BarClick.js delete mode 100644 docs/data/charts/bars/BarGap.js delete mode 100644 docs/data/charts/bars/BarGradient.js delete mode 100644 docs/data/charts/bars/BarGradient.tsx.preview delete mode 100644 docs/data/charts/bars/BarLabel.js delete mode 100644 docs/data/charts/bars/BarLabel.tsx.preview delete mode 100644 docs/data/charts/bars/BarLabelPlacement.js delete mode 100644 docs/data/charts/bars/BarLabelPlacement.tsx.preview delete mode 100644 docs/data/charts/bars/BarOECDHouseholdSavings.js delete mode 100644 docs/data/charts/bars/BarScatterCompostion.js delete mode 100644 docs/data/charts/bars/BarsDataset.js delete mode 100644 docs/data/charts/bars/BarsDataset.tsx.preview delete mode 100644 docs/data/charts/bars/BasicBars.js delete mode 100644 docs/data/charts/bars/BasicBars.tsx.preview delete mode 100644 docs/data/charts/bars/BorderRadius.js delete mode 100644 docs/data/charts/bars/ColorScale.js delete mode 100644 docs/data/charts/bars/ColorScale.tsx delete mode 100644 docs/data/charts/bars/CustomLabels.js delete mode 100644 docs/data/charts/bars/GridDemo.js delete mode 100644 docs/data/charts/bars/GridDemo.tsx delete mode 100644 docs/data/charts/bars/GridDemo.tsx.preview delete mode 100644 docs/data/charts/bars/HorizontalBars.js delete mode 100644 docs/data/charts/bars/HorizontalBars.tsx.preview delete mode 100644 docs/data/charts/bars/LabelsAboveBars.js delete mode 100644 docs/data/charts/bars/LabelsAboveBars.tsx.preview delete mode 100644 docs/data/charts/bars/MinBarSize.js delete mode 100644 docs/data/charts/bars/ShinyBarChartHorizontal.js delete mode 100644 docs/data/charts/bars/StackBars.js delete mode 100644 docs/data/charts/bars/StackBars.tsx.preview delete mode 100644 docs/data/charts/bars/StackTotalLabels.js delete mode 100644 docs/data/charts/bars/TickPlacementBars.js delete mode 100644 docs/data/charts/bars/TickPlacementBars.tsx.preview delete mode 100644 docs/data/charts/bars/WebGLBars.js rename docs/data/charts/bars/{ => demos/bar-animation}/BarAnimation.tsx (97%) create mode 100644 docs/data/charts/bars/demos/bar-animation/client.ts create mode 100644 docs/data/charts/bars/demos/bar-animation/index.ts rename docs/data/charts/bars/{ => demos/bar-batch-renderer}/BarBatchRenderer.tsx (95%) create mode 100644 docs/data/charts/bars/demos/bar-batch-renderer/client.ts create mode 100644 docs/data/charts/bars/demos/bar-batch-renderer/index.ts rename docs/data/charts/bars/{ => demos/bar-click}/BarClick.tsx (95%) create mode 100644 docs/data/charts/bars/demos/bar-click/client.ts create mode 100644 docs/data/charts/bars/demos/bar-click/index.ts rename docs/data/charts/bars/{ => demos/bar-gap}/BarGap.tsx (93%) create mode 100644 docs/data/charts/bars/demos/bar-gap/client.ts create mode 100644 docs/data/charts/bars/demos/bar-gap/index.ts rename docs/data/charts/bars/{ => demos/bar-gradient}/BarGradient.tsx (95%) create mode 100644 docs/data/charts/bars/demos/bar-gradient/client.ts create mode 100644 docs/data/charts/bars/demos/bar-gradient/index.ts rename docs/data/charts/bars/{ => demos/bar-label-placement}/BarLabelPlacement.tsx (90%) create mode 100644 docs/data/charts/bars/demos/bar-label-placement/client.ts create mode 100644 docs/data/charts/bars/demos/bar-label-placement/index.ts rename docs/data/charts/bars/{ => demos/bar-label}/BarLabel.tsx (92%) create mode 100644 docs/data/charts/bars/demos/bar-label/client.ts create mode 100644 docs/data/charts/bars/demos/bar-label/index.ts rename docs/data/charts/bars/{ => demos/bar-oecd-household-savings}/BarOECDHouseholdSavings.tsx (91%) create mode 100644 docs/data/charts/bars/demos/bar-oecd-household-savings/client.ts create mode 100644 docs/data/charts/bars/demos/bar-oecd-household-savings/index.ts rename docs/data/charts/bars/{ => demos/bar-scatter-compostion}/BarScatterCompostion.tsx (96%) create mode 100644 docs/data/charts/bars/demos/bar-scatter-compostion/client.ts create mode 100644 docs/data/charts/bars/demos/bar-scatter-compostion/index.ts rename docs/data/charts/bars/{ => demos/bars-dataset}/BarsDataset.tsx (83%) create mode 100644 docs/data/charts/bars/demos/bars-dataset/client.ts create mode 100644 docs/data/charts/bars/demos/bars-dataset/index.ts rename docs/data/charts/bars/{ => demos/basic-bars}/BasicBars.tsx (85%) create mode 100644 docs/data/charts/bars/demos/basic-bars/client.ts create mode 100644 docs/data/charts/bars/demos/basic-bars/index.ts rename docs/data/charts/bars/{ => demos/border-radius}/BorderRadius.tsx (95%) create mode 100644 docs/data/charts/bars/demos/border-radius/client.ts create mode 100644 docs/data/charts/bars/demos/border-radius/index.ts create mode 100644 docs/data/charts/bars/demos/color-scale/ColorScale.tsx create mode 100644 docs/data/charts/bars/demos/color-scale/client.ts create mode 100644 docs/data/charts/bars/demos/color-scale/index.ts rename docs/data/charts/bars/{ => demos/custom-labels}/CustomLabels.tsx (80%) create mode 100644 docs/data/charts/bars/demos/custom-labels/client.ts create mode 100644 docs/data/charts/bars/demos/custom-labels/index.ts create mode 100644 docs/data/charts/bars/demos/grid-demo/GridDemo.tsx create mode 100644 docs/data/charts/bars/demos/grid-demo/client.ts create mode 100644 docs/data/charts/bars/demos/grid-demo/index.ts rename docs/data/charts/bars/{ => demos/horizontal-bars}/HorizontalBars.tsx (79%) create mode 100644 docs/data/charts/bars/demos/horizontal-bars/client.ts create mode 100644 docs/data/charts/bars/demos/horizontal-bars/index.ts rename docs/data/charts/bars/{ => demos/labels-above-bars}/LabelsAboveBars.tsx (92%) create mode 100644 docs/data/charts/bars/demos/labels-above-bars/client.ts create mode 100644 docs/data/charts/bars/demos/labels-above-bars/index.ts rename docs/data/charts/bars/{ => demos/min-bar-size}/MinBarSize.tsx (96%) create mode 100644 docs/data/charts/bars/demos/min-bar-size/client.ts create mode 100644 docs/data/charts/bars/demos/min-bar-size/index.ts rename docs/data/charts/bars/{ => demos/shiny-bar-chart-horizontal}/ShinyBarChartHorizontal.tsx (94%) create mode 100644 docs/data/charts/bars/demos/shiny-bar-chart-horizontal/client.ts create mode 100644 docs/data/charts/bars/demos/shiny-bar-chart-horizontal/index.ts rename docs/data/charts/bars/{ => demos/stack-bars}/StackBars.tsx (77%) create mode 100644 docs/data/charts/bars/demos/stack-bars/client.ts create mode 100644 docs/data/charts/bars/demos/stack-bars/index.ts rename docs/data/charts/bars/{ => demos/stack-total-labels}/StackTotalLabels.tsx (97%) create mode 100644 docs/data/charts/bars/demos/stack-total-labels/client.ts create mode 100644 docs/data/charts/bars/demos/stack-total-labels/index.ts rename docs/data/charts/bars/{ => demos/tick-placement-bars}/TickPlacementBars.tsx (96%) create mode 100644 docs/data/charts/bars/demos/tick-placement-bars/client.ts create mode 100644 docs/data/charts/bars/demos/tick-placement-bars/index.ts rename docs/data/charts/bars/{ => demos/web-gl-bars}/WebGLBars.tsx (97%) create mode 100644 docs/data/charts/bars/demos/web-gl-bars/client.ts create mode 100644 docs/data/charts/bars/demos/web-gl-bars/index.ts delete mode 100644 docs/data/charts/brush/BrushBasic.js delete mode 100644 docs/data/charts/brush/BrushBasic.tsx.preview delete mode 100644 docs/data/charts/brush/BrushCustomOverlay.js delete mode 100644 docs/data/charts/brush/BrushScatterList.js rename docs/data/charts/brush/{ => demos/brush-basic}/BrushBasic.tsx (94%) create mode 100644 docs/data/charts/brush/demos/brush-basic/client.ts create mode 100644 docs/data/charts/brush/demos/brush-basic/index.ts rename docs/data/charts/brush/{ => demos/brush-custom-overlay}/BrushCustomOverlay.tsx (99%) create mode 100644 docs/data/charts/brush/demos/brush-custom-overlay/client.ts create mode 100644 docs/data/charts/brush/demos/brush-custom-overlay/index.ts rename docs/data/charts/brush/{ => demos/brush-scatter-list}/BrushScatterList.tsx (98%) create mode 100644 docs/data/charts/brush/demos/brush-scatter-list/client.ts create mode 100644 docs/data/charts/brush/demos/brush-scatter-list/index.ts delete mode 100644 docs/data/charts/bubble/BubbleChartCO2Emissions.js delete mode 100644 docs/data/charts/bubble/ColorScale.js delete mode 100644 docs/data/charts/bubble/ColorScale.tsx delete mode 100644 docs/data/charts/bubble/DifferentSizeScale.js delete mode 100644 docs/data/charts/bubble/ScatterZAxis.js delete mode 100644 docs/data/charts/bubble/SizeScale.js delete mode 100644 docs/data/charts/bubble/SizeScale.tsx.preview rename docs/data/charts/bubble/{ => demos/bubble-chart-co2-emissions}/BubbleChartCO2Emissions.tsx (97%) create mode 100644 docs/data/charts/bubble/demos/bubble-chart-co2-emissions/client.ts create mode 100644 docs/data/charts/bubble/demos/bubble-chart-co2-emissions/index.ts create mode 100644 docs/data/charts/bubble/demos/color-scale/ColorScale.tsx create mode 100644 docs/data/charts/bubble/demos/color-scale/client.ts create mode 100644 docs/data/charts/bubble/demos/color-scale/index.ts rename docs/data/charts/bubble/{ => demos/different-size-scale}/DifferentSizeScale.tsx (97%) create mode 100644 docs/data/charts/bubble/demos/different-size-scale/client.ts create mode 100644 docs/data/charts/bubble/demos/different-size-scale/index.ts rename docs/data/charts/bubble/{ => demos/scatter-z-axis}/ScatterZAxis.tsx (96%) create mode 100644 docs/data/charts/bubble/demos/scatter-z-axis/client.ts create mode 100644 docs/data/charts/bubble/demos/scatter-z-axis/index.ts rename docs/data/charts/bubble/{ => demos/size-scale}/SizeScale.tsx (94%) create mode 100644 docs/data/charts/bubble/demos/size-scale/client.ts create mode 100644 docs/data/charts/bubble/demos/size-scale/index.ts delete mode 100644 docs/data/charts/candlestick/BasicCandlestick.js delete mode 100644 docs/data/charts/candlestick/BasicCandlestick.tsx delete mode 100644 docs/data/charts/candlestick/BasicCandlestick.tsx.preview delete mode 100644 docs/data/charts/candlestick/CandlestickComposition.js delete mode 100644 docs/data/charts/candlestick/CandlestickOverview.js delete mode 100644 docs/data/charts/candlestick/CandlestickValueFormatter.js delete mode 100644 docs/data/charts/candlestick/CandlestickValueFormatter.tsx.preview delete mode 100644 docs/data/charts/candlestick/ColorCandlestick.js delete mode 100644 docs/data/charts/candlestick/ColorCandlestick.tsx.preview delete mode 100644 docs/data/charts/candlestick/CustomizedCandlestick.js delete mode 100644 docs/data/charts/candlestick/CustomizedCandlestick.tsx delete mode 100644 docs/data/charts/candlestick/CustomizedCandlestick.tsx.preview delete mode 100644 docs/data/charts/candlestick/DatasetCandlestick.js delete mode 100644 docs/data/charts/candlestick/DatasetCandlestick.tsx.preview create mode 100644 docs/data/charts/candlestick/demos/basic-candlestick/BasicCandlestick.tsx create mode 100644 docs/data/charts/candlestick/demos/basic-candlestick/client.ts create mode 100644 docs/data/charts/candlestick/demos/basic-candlestick/index.ts rename docs/data/charts/candlestick/{ => demos/candlestick-composition}/CandlestickComposition.tsx (95%) create mode 100644 docs/data/charts/candlestick/demos/candlestick-composition/client.ts create mode 100644 docs/data/charts/candlestick/demos/candlestick-composition/index.ts rename docs/data/charts/candlestick/{ => demos/candlestick-overview}/CandlestickOverview.tsx (97%) create mode 100644 docs/data/charts/candlestick/demos/candlestick-overview/client.ts create mode 100644 docs/data/charts/candlestick/demos/candlestick-overview/index.ts rename docs/data/charts/candlestick/{ => demos/candlestick-value-formatter}/CandlestickValueFormatter.tsx (79%) create mode 100644 docs/data/charts/candlestick/demos/candlestick-value-formatter/client.ts create mode 100644 docs/data/charts/candlestick/demos/candlestick-value-formatter/index.ts rename docs/data/charts/candlestick/{ => demos/color-candlestick}/ColorCandlestick.tsx (79%) create mode 100644 docs/data/charts/candlestick/demos/color-candlestick/client.ts create mode 100644 docs/data/charts/candlestick/demos/color-candlestick/index.ts create mode 100644 docs/data/charts/candlestick/demos/customized-candlestick/CustomizedCandlestick.tsx create mode 100644 docs/data/charts/candlestick/demos/customized-candlestick/client.ts create mode 100644 docs/data/charts/candlestick/demos/customized-candlestick/index.ts rename docs/data/charts/candlestick/{ => demos/dataset-candlestick}/DatasetCandlestick.tsx (85%) create mode 100644 docs/data/charts/candlestick/demos/dataset-candlestick/client.ts create mode 100644 docs/data/charts/candlestick/demos/dataset-candlestick/index.ts delete mode 100644 docs/data/charts/components/BasicScaleDemo.js delete mode 100644 docs/data/charts/components/BasicScaleDemo.tsx.preview delete mode 100644 docs/data/charts/components/HtmlLegend.js delete mode 100644 docs/data/charts/components/HtmlLegend.tsx.preview delete mode 100644 docs/data/charts/components/OriginDemo.js delete mode 100644 docs/data/charts/components/ScaleDemo.js delete mode 100644 docs/data/charts/components/SeriesDemo.js delete mode 100644 docs/data/charts/components/SeriesDemo.tsx.preview rename docs/data/charts/components/{ => demos/basic-scale-demo}/BasicScaleDemo.tsx (97%) create mode 100644 docs/data/charts/components/demos/basic-scale-demo/client.ts create mode 100644 docs/data/charts/components/demos/basic-scale-demo/index.ts rename docs/data/charts/components/{ => demos/html-legend}/HtmlLegend.tsx (97%) create mode 100644 docs/data/charts/components/demos/html-legend/client.ts create mode 100644 docs/data/charts/components/demos/html-legend/index.ts rename docs/data/charts/components/{ => demos/origin-demo}/OriginDemo.tsx (95%) create mode 100644 docs/data/charts/components/demos/origin-demo/client.ts create mode 100644 docs/data/charts/components/demos/origin-demo/index.ts rename docs/data/charts/components/{ => demos/scale-demo}/ScaleDemo.tsx (97%) create mode 100644 docs/data/charts/components/demos/scale-demo/client.ts create mode 100644 docs/data/charts/components/demos/scale-demo/index.ts rename docs/data/charts/components/{ => demos/series-demo}/SeriesDemo.tsx (95%) create mode 100644 docs/data/charts/components/demos/series-demo/client.ts create mode 100644 docs/data/charts/components/demos/series-demo/index.ts delete mode 100644 docs/data/charts/composition/BasicComposition.js delete mode 100644 docs/data/charts/composition/BellCurveOverlay.js delete mode 100644 docs/data/charts/composition/Layering.js delete mode 100644 docs/data/charts/composition/LegendTooltipComposition.js delete mode 100644 docs/data/charts/composition/LimitOverflow.js delete mode 100644 docs/data/charts/composition/SwitchSeriesType.js delete mode 100644 docs/data/charts/composition/WeatherComposition.js rename docs/data/charts/composition/{ => demos/basic-composition}/BasicComposition.tsx (97%) create mode 100644 docs/data/charts/composition/demos/basic-composition/client.ts create mode 100644 docs/data/charts/composition/demos/basic-composition/index.ts rename docs/data/charts/composition/{ => demos/bell-curve-overlay}/BellCurveOverlay.tsx (96%) create mode 100644 docs/data/charts/composition/demos/bell-curve-overlay/client.ts create mode 100644 docs/data/charts/composition/demos/bell-curve-overlay/index.ts rename docs/data/charts/composition/{ => demos/layering}/Layering.tsx (95%) create mode 100644 docs/data/charts/composition/demos/layering/client.ts create mode 100644 docs/data/charts/composition/demos/layering/index.ts rename docs/data/charts/composition/{ => demos/legend-tooltip-composition}/LegendTooltipComposition.tsx (96%) create mode 100644 docs/data/charts/composition/demos/legend-tooltip-composition/client.ts create mode 100644 docs/data/charts/composition/demos/legend-tooltip-composition/index.ts rename docs/data/charts/composition/{ => demos/limit-overflow}/LimitOverflow.tsx (98%) create mode 100644 docs/data/charts/composition/demos/limit-overflow/client.ts create mode 100644 docs/data/charts/composition/demos/limit-overflow/index.ts rename docs/data/charts/composition/{ => demos/switch-series-type}/SwitchSeriesType.tsx (97%) create mode 100644 docs/data/charts/composition/demos/switch-series-type/client.ts create mode 100644 docs/data/charts/composition/demos/switch-series-type/index.ts rename docs/data/charts/composition/{ => demos/weather-composition}/WeatherComposition.tsx (97%) create mode 100644 docs/data/charts/composition/demos/weather-composition/client.ts create mode 100644 docs/data/charts/composition/demos/weather-composition/index.ts delete mode 100644 docs/data/charts/dataset/AxisValueGetter.js delete mode 100644 docs/data/charts/dataset/AxisValueGetter.tsx.preview delete mode 100644 docs/data/charts/dataset/DatasetBasic.js delete mode 100644 docs/data/charts/dataset/DatasetBasic.tsx.preview delete mode 100644 docs/data/charts/dataset/SeriesValueGetter.js rename docs/data/charts/dataset/{ => demos/axis-value-getter}/AxisValueGetter.tsx (94%) create mode 100644 docs/data/charts/dataset/demos/axis-value-getter/client.ts create mode 100644 docs/data/charts/dataset/demos/axis-value-getter/index.ts rename docs/data/charts/dataset/{ => demos/dataset-basic}/DatasetBasic.tsx (94%) create mode 100644 docs/data/charts/dataset/demos/dataset-basic/client.ts create mode 100644 docs/data/charts/dataset/demos/dataset-basic/index.ts rename docs/data/charts/dataset/{ => demos/series-value-getter}/SeriesValueGetter.tsx (96%) create mode 100644 docs/data/charts/dataset/demos/series-value-getter/client.ts create mode 100644 docs/data/charts/dataset/demos/series-value-getter/index.ts delete mode 100644 docs/data/charts/export/ExportChartAsExcel.js delete mode 100644 docs/data/charts/export/ExportChartAsExcel.tsx.preview delete mode 100644 docs/data/charts/export/ExportChartAsImage.js delete mode 100644 docs/data/charts/export/ExportChartAsImage.tsx.preview delete mode 100644 docs/data/charts/export/ExportChartHideOnExport.js delete mode 100644 docs/data/charts/export/ExportChartOnBeforeExport.js delete mode 100644 docs/data/charts/export/ExportChartOnBeforeExport.tsx.preview delete mode 100644 docs/data/charts/export/ExportChartToolbar.js delete mode 100644 docs/data/charts/export/ExportChartToolbar.tsx.preview delete mode 100644 docs/data/charts/export/ExportChartToolbarCustomization.js delete mode 100644 docs/data/charts/export/ExportCompositionNoSnap.js delete mode 100644 docs/data/charts/export/PrintChart.js rename docs/data/charts/export/{ => demos/export-chart-as-excel}/ExportChartAsExcel.tsx (97%) create mode 100644 docs/data/charts/export/demos/export-chart-as-excel/client.ts create mode 100644 docs/data/charts/export/demos/export-chart-as-excel/index.ts rename docs/data/charts/export/{ => demos/export-chart-as-image}/ExportChartAsImage.tsx (96%) create mode 100644 docs/data/charts/export/demos/export-chart-as-image/client.ts create mode 100644 docs/data/charts/export/demos/export-chart-as-image/index.ts rename docs/data/charts/export/{ => demos/export-chart-hide-on-export}/ExportChartHideOnExport.tsx (92%) create mode 100644 docs/data/charts/export/demos/export-chart-hide-on-export/client.ts create mode 100644 docs/data/charts/export/demos/export-chart-hide-on-export/index.ts rename docs/data/charts/export/{ => demos/export-chart-on-before-export}/ExportChartOnBeforeExport.tsx (96%) create mode 100644 docs/data/charts/export/demos/export-chart-on-before-export/client.ts create mode 100644 docs/data/charts/export/demos/export-chart-on-before-export/index.ts rename docs/data/charts/export/{ => demos/export-chart-toolbar-customization}/ExportChartToolbarCustomization.tsx (91%) create mode 100644 docs/data/charts/export/demos/export-chart-toolbar-customization/client.ts create mode 100644 docs/data/charts/export/demos/export-chart-toolbar-customization/index.ts rename docs/data/charts/export/{ => demos/export-chart-toolbar}/ExportChartToolbar.tsx (93%) create mode 100644 docs/data/charts/export/demos/export-chart-toolbar/client.ts create mode 100644 docs/data/charts/export/demos/export-chart-toolbar/index.ts rename docs/data/charts/export/{ => demos/export-composition-no-snap}/ExportCompositionNoSnap.tsx (98%) create mode 100644 docs/data/charts/export/demos/export-composition-no-snap/client.ts create mode 100644 docs/data/charts/export/demos/export-composition-no-snap/index.ts rename docs/data/charts/export/{ => demos/print-chart}/PrintChart.tsx (95%) create mode 100644 docs/data/charts/export/demos/print-chart/client.ts create mode 100644 docs/data/charts/export/demos/print-chart/index.ts delete mode 100644 docs/data/charts/funnel/BasicFunnel.js delete mode 100644 docs/data/charts/funnel/BasicFunnel.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelAxisAutoSize.js delete mode 100644 docs/data/charts/funnel/FunnelBorderRadius.js delete mode 100644 docs/data/charts/funnel/FunnelCategoryAxis.js delete mode 100644 docs/data/charts/funnel/FunnelCategoryAxis.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelColor.js delete mode 100644 docs/data/charts/funnel/FunnelColor.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelCurves.js delete mode 100644 docs/data/charts/funnel/FunnelDataAttributes.js delete mode 100644 docs/data/charts/funnel/FunnelDataAttributes.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelGap.js delete mode 100644 docs/data/charts/funnel/FunnelGap.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelLabelPositioning.js delete mode 100644 docs/data/charts/funnel/FunnelLabelStyling.js delete mode 100644 docs/data/charts/funnel/FunnelLabelStyling.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelLabels.js delete mode 100644 docs/data/charts/funnel/FunnelLabels.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelLegend.js delete mode 100644 docs/data/charts/funnel/FunnelLegend.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelLinearScale.js delete mode 100644 docs/data/charts/funnel/FunnelLinearScale.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelStacked.js delete mode 100644 docs/data/charts/funnel/FunnelStacked.tsx.preview delete mode 100644 docs/data/charts/funnel/FunnelVariant.js delete mode 100644 docs/data/charts/funnel/FunnelVariant.tsx.preview delete mode 100644 docs/data/charts/funnel/HighlightFunnel.js delete mode 100644 docs/data/charts/funnel/PyramidFunnel.js delete mode 100644 docs/data/charts/funnel/PyramidFunnel.tsx.preview rename docs/data/charts/funnel/{ => demos/basic-funnel}/BasicFunnel.tsx (88%) create mode 100644 docs/data/charts/funnel/demos/basic-funnel/client.ts create mode 100644 docs/data/charts/funnel/demos/basic-funnel/index.ts rename docs/data/charts/funnel/{ => demos/funnel-axis-auto-size}/FunnelAxisAutoSize.tsx (97%) create mode 100644 docs/data/charts/funnel/demos/funnel-axis-auto-size/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-axis-auto-size/index.ts rename docs/data/charts/funnel/{ => demos/funnel-border-radius}/FunnelBorderRadius.tsx (92%) create mode 100644 docs/data/charts/funnel/demos/funnel-border-radius/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-border-radius/index.ts rename docs/data/charts/funnel/{ => demos/funnel-category-axis}/FunnelCategoryAxis.tsx (88%) create mode 100644 docs/data/charts/funnel/demos/funnel-category-axis/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-category-axis/index.ts rename docs/data/charts/funnel/{ => demos/funnel-color}/FunnelColor.tsx (91%) create mode 100644 docs/data/charts/funnel/demos/funnel-color/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-color/index.ts rename docs/data/charts/funnel/{ => demos/funnel-curves}/FunnelCurves.tsx (94%) create mode 100644 docs/data/charts/funnel/demos/funnel-curves/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-curves/index.ts rename docs/data/charts/funnel/{ => demos/funnel-data-attributes}/FunnelDataAttributes.tsx (94%) create mode 100644 docs/data/charts/funnel/demos/funnel-data-attributes/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-data-attributes/index.ts rename docs/data/charts/funnel/{ => demos/funnel-gap}/FunnelGap.tsx (88%) create mode 100644 docs/data/charts/funnel/demos/funnel-gap/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-gap/index.ts rename docs/data/charts/funnel/{ => demos/funnel-label-positioning}/FunnelLabelPositioning.tsx (98%) create mode 100644 docs/data/charts/funnel/demos/funnel-label-positioning/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-label-positioning/index.ts rename docs/data/charts/funnel/{ => demos/funnel-label-styling}/FunnelLabelStyling.tsx (92%) create mode 100644 docs/data/charts/funnel/demos/funnel-label-styling/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-label-styling/index.ts rename docs/data/charts/funnel/{ => demos/funnel-labels}/FunnelLabels.tsx (93%) create mode 100644 docs/data/charts/funnel/demos/funnel-labels/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-labels/index.ts rename docs/data/charts/funnel/{ => demos/funnel-legend}/FunnelLegend.tsx (96%) create mode 100644 docs/data/charts/funnel/demos/funnel-legend/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-legend/index.ts rename docs/data/charts/funnel/{ => demos/funnel-linear-scale}/FunnelLinearScale.tsx (85%) create mode 100644 docs/data/charts/funnel/demos/funnel-linear-scale/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-linear-scale/index.ts rename docs/data/charts/funnel/{ => demos/funnel-stacked}/FunnelStacked.tsx (83%) create mode 100644 docs/data/charts/funnel/demos/funnel-stacked/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-stacked/index.ts rename docs/data/charts/funnel/{ => demos/funnel-variant}/FunnelVariant.tsx (92%) create mode 100644 docs/data/charts/funnel/demos/funnel-variant/client.ts create mode 100644 docs/data/charts/funnel/demos/funnel-variant/index.ts rename docs/data/charts/funnel/{ => demos/highlight-funnel}/HighlightFunnel.tsx (94%) create mode 100644 docs/data/charts/funnel/demos/highlight-funnel/client.ts create mode 100644 docs/data/charts/funnel/demos/highlight-funnel/index.ts rename docs/data/charts/funnel/{ => demos/pyramid-funnel}/PyramidFunnel.tsx (89%) create mode 100644 docs/data/charts/funnel/demos/pyramid-funnel/client.ts create mode 100644 docs/data/charts/funnel/demos/pyramid-funnel/index.ts delete mode 100644 docs/data/charts/gauge/ArcDesign.js delete mode 100644 docs/data/charts/gauge/ArcDesign.tsx.preview delete mode 100644 docs/data/charts/gauge/ArcPlayground.js delete mode 100644 docs/data/charts/gauge/BasicGauges.js delete mode 100644 docs/data/charts/gauge/BasicGauges.tsx.preview delete mode 100644 docs/data/charts/gauge/CompositionExample.js delete mode 100644 docs/data/charts/gauge/CompositionExample.tsx delete mode 100644 docs/data/charts/gauge/CompositionExample.tsx.preview delete mode 100644 docs/data/charts/gauge/GaugeValueRange.js delete mode 100644 docs/data/charts/gauge/GaugeValueRange.tsx.preview delete mode 100644 docs/data/charts/gauge/TextPlayground.js rename docs/data/charts/gauge/{ => demos/arc-design}/ArcDesign.tsx (91%) create mode 100644 docs/data/charts/gauge/demos/arc-design/client.ts create mode 100644 docs/data/charts/gauge/demos/arc-design/index.ts rename docs/data/charts/gauge/{ => demos/arc-playground}/ArcPlayground.tsx (97%) create mode 100644 docs/data/charts/gauge/demos/arc-playground/client.ts create mode 100644 docs/data/charts/gauge/demos/arc-playground/index.ts rename docs/data/charts/gauge/{ => demos/basic-gauges}/BasicGauges.tsx (87%) create mode 100644 docs/data/charts/gauge/demos/basic-gauges/client.ts create mode 100644 docs/data/charts/gauge/demos/basic-gauges/index.ts create mode 100644 docs/data/charts/gauge/demos/composition-example/CompositionExample.tsx create mode 100644 docs/data/charts/gauge/demos/composition-example/client.ts create mode 100644 docs/data/charts/gauge/demos/composition-example/index.ts rename docs/data/charts/gauge/{ => demos/gauge-value-range}/GaugeValueRange.tsx (87%) create mode 100644 docs/data/charts/gauge/demos/gauge-value-range/client.ts create mode 100644 docs/data/charts/gauge/demos/gauge-value-range/index.ts rename docs/data/charts/gauge/{ => demos/text-playground}/TextPlayground.tsx (97%) create mode 100644 docs/data/charts/gauge/demos/text-playground/client.ts create mode 100644 docs/data/charts/gauge/demos/text-playground/index.ts delete mode 100644 docs/data/charts/heatmap/BasicHeatmap.js delete mode 100644 docs/data/charts/heatmap/BasicHeatmap.tsx.preview delete mode 100644 docs/data/charts/heatmap/ColorConfig.js delete mode 100644 docs/data/charts/heatmap/ColorConfig.tsx.preview delete mode 100644 docs/data/charts/heatmap/CustomItem.js delete mode 100644 docs/data/charts/heatmap/CustomItem.tsx.preview delete mode 100644 docs/data/charts/heatmap/HeatmapCellClick.js delete mode 100644 docs/data/charts/heatmap/HeatmapDemo.js delete mode 100644 docs/data/charts/heatmap/HeatmapLegend.js delete mode 100644 docs/data/charts/heatmap/HeatmapLegend.tsx.preview delete mode 100644 docs/data/charts/heatmap/HighlightClasses.js delete mode 100644 docs/data/charts/heatmap/HighlightHeatmap.js delete mode 100644 docs/data/charts/heatmap/HighlightHeatmap.tsx.preview delete mode 100644 docs/data/charts/heatmap/WebGLHeatmap.js delete mode 100644 docs/data/charts/heatmap/WebGLHeatmap.tsx.preview rename docs/data/charts/heatmap/{ => demos/basic-heatmap}/BasicHeatmap.tsx (80%) create mode 100644 docs/data/charts/heatmap/demos/basic-heatmap/client.ts create mode 100644 docs/data/charts/heatmap/demos/basic-heatmap/index.ts rename docs/data/charts/heatmap/{ => demos/color-config}/ColorConfig.tsx (94%) create mode 100644 docs/data/charts/heatmap/demos/color-config/client.ts create mode 100644 docs/data/charts/heatmap/demos/color-config/index.ts rename docs/data/charts/heatmap/{ => demos/custom-item}/CustomItem.tsx (83%) create mode 100644 docs/data/charts/heatmap/demos/custom-item/client.ts create mode 100644 docs/data/charts/heatmap/demos/custom-item/index.ts rename docs/data/charts/heatmap/{ => demos/heatmap-cell-click}/HeatmapCellClick.tsx (95%) create mode 100644 docs/data/charts/heatmap/demos/heatmap-cell-click/client.ts create mode 100644 docs/data/charts/heatmap/demos/heatmap-cell-click/index.ts rename docs/data/charts/heatmap/{ => demos/heatmap-demo}/HeatmapDemo.tsx (94%) create mode 100644 docs/data/charts/heatmap/demos/heatmap-demo/client.ts create mode 100644 docs/data/charts/heatmap/demos/heatmap-demo/index.ts rename docs/data/charts/heatmap/{ => demos/heatmap-legend}/HeatmapLegend.tsx (86%) create mode 100644 docs/data/charts/heatmap/demos/heatmap-legend/client.ts create mode 100644 docs/data/charts/heatmap/demos/heatmap-legend/index.ts rename docs/data/charts/heatmap/{ => demos/highlight-classes}/HighlightClasses.tsx (90%) create mode 100644 docs/data/charts/heatmap/demos/highlight-classes/client.ts create mode 100644 docs/data/charts/heatmap/demos/highlight-classes/index.ts rename docs/data/charts/heatmap/{ => demos/highlight-heatmap}/HighlightHeatmap.tsx (82%) create mode 100644 docs/data/charts/heatmap/demos/highlight-heatmap/client.ts create mode 100644 docs/data/charts/heatmap/demos/highlight-heatmap/index.ts rename docs/data/charts/heatmap/{ => demos/web-gl-heatmap}/WebGLHeatmap.tsx (83%) create mode 100644 docs/data/charts/heatmap/demos/web-gl-heatmap/client.ts create mode 100644 docs/data/charts/heatmap/demos/web-gl-heatmap/index.ts delete mode 100644 docs/data/charts/highlighting/AxisValueHighlight.js delete mode 100644 docs/data/charts/highlighting/AxisValueHighlightCustomization.js delete mode 100644 docs/data/charts/highlighting/BandHighlight.js delete mode 100644 docs/data/charts/highlighting/BandHighlight.tsx delete mode 100644 docs/data/charts/highlighting/ControlledAxisHighlight.js delete mode 100644 docs/data/charts/highlighting/ControlledHighlight.js delete mode 100644 docs/data/charts/highlighting/ElementHighlights.js delete mode 100644 docs/data/charts/highlighting/ElementHighlights.tsx delete mode 100644 docs/data/charts/highlighting/SyncHighlight.js rename docs/data/charts/highlighting/{ => demos/axis-value-highlight-customization}/AxisValueHighlightCustomization.tsx (96%) create mode 100644 docs/data/charts/highlighting/demos/axis-value-highlight-customization/client.ts create mode 100644 docs/data/charts/highlighting/demos/axis-value-highlight-customization/index.ts rename docs/data/charts/highlighting/{ => demos/axis-value-highlight}/AxisValueHighlight.tsx (95%) create mode 100644 docs/data/charts/highlighting/demos/axis-value-highlight/client.ts create mode 100644 docs/data/charts/highlighting/demos/axis-value-highlight/index.ts create mode 100644 docs/data/charts/highlighting/demos/band-highlight/BandHighlight.tsx create mode 100644 docs/data/charts/highlighting/demos/band-highlight/client.ts create mode 100644 docs/data/charts/highlighting/demos/band-highlight/index.ts rename docs/data/charts/highlighting/{ => demos/controlled-axis-highlight}/ControlledAxisHighlight.tsx (88%) create mode 100644 docs/data/charts/highlighting/demos/controlled-axis-highlight/client.ts create mode 100644 docs/data/charts/highlighting/demos/controlled-axis-highlight/index.ts rename docs/data/charts/highlighting/{ => demos/controlled-highlight}/ControlledHighlight.tsx (95%) create mode 100644 docs/data/charts/highlighting/demos/controlled-highlight/client.ts create mode 100644 docs/data/charts/highlighting/demos/controlled-highlight/index.ts create mode 100644 docs/data/charts/highlighting/demos/element-highlights/ElementHighlights.tsx create mode 100644 docs/data/charts/highlighting/demos/element-highlights/client.ts create mode 100644 docs/data/charts/highlighting/demos/element-highlights/index.ts rename docs/data/charts/highlighting/{ => demos/sync-highlight}/SyncHighlight.tsx (83%) create mode 100644 docs/data/charts/highlighting/demos/sync-highlight/client.ts create mode 100644 docs/data/charts/highlighting/demos/sync-highlight/index.ts delete mode 100644 docs/data/charts/hooks/UseAxes.js delete mode 100644 docs/data/charts/hooks/UseBarSeries.js delete mode 100644 docs/data/charts/hooks/UseDataset.js delete mode 100644 docs/data/charts/hooks/UseDatasetAdvanced.js delete mode 100644 docs/data/charts/hooks/UseDrawingArea.js delete mode 100644 docs/data/charts/hooks/UseLegend.js delete mode 100644 docs/data/charts/hooks/UseLegend.tsx.preview delete mode 100644 docs/data/charts/hooks/UsePolarGeometry.js delete mode 100644 docs/data/charts/hooks/UsePolarGeometry.tsx.preview delete mode 100644 docs/data/charts/hooks/UseScale.js delete mode 100644 docs/data/charts/hooks/UseSeries.js rename docs/data/charts/hooks/{ => demos/use-axes}/UseAxes.tsx (99%) create mode 100644 docs/data/charts/hooks/demos/use-axes/client.ts create mode 100644 docs/data/charts/hooks/demos/use-axes/index.ts rename docs/data/charts/hooks/{ => demos/use-bar-series}/UseBarSeries.tsx (98%) create mode 100644 docs/data/charts/hooks/demos/use-bar-series/client.ts create mode 100644 docs/data/charts/hooks/demos/use-bar-series/index.ts rename docs/data/charts/hooks/{ => demos/use-dataset-advanced}/UseDatasetAdvanced.tsx (98%) create mode 100644 docs/data/charts/hooks/demos/use-dataset-advanced/client.ts create mode 100644 docs/data/charts/hooks/demos/use-dataset-advanced/index.ts rename docs/data/charts/hooks/{ => demos/use-dataset}/UseDataset.tsx (98%) create mode 100644 docs/data/charts/hooks/demos/use-dataset/client.ts create mode 100644 docs/data/charts/hooks/demos/use-dataset/index.ts rename docs/data/charts/hooks/{ => demos/use-drawing-area}/UseDrawingArea.tsx (97%) create mode 100644 docs/data/charts/hooks/demos/use-drawing-area/client.ts create mode 100644 docs/data/charts/hooks/demos/use-drawing-area/index.ts rename docs/data/charts/hooks/{ => demos/use-legend}/UseLegend.tsx (96%) create mode 100644 docs/data/charts/hooks/demos/use-legend/client.ts create mode 100644 docs/data/charts/hooks/demos/use-legend/index.ts rename docs/data/charts/hooks/{ => demos/use-polar-geometry}/UsePolarGeometry.tsx (97%) create mode 100644 docs/data/charts/hooks/demos/use-polar-geometry/client.ts create mode 100644 docs/data/charts/hooks/demos/use-polar-geometry/index.ts rename docs/data/charts/hooks/{ => demos/use-scale}/UseScale.tsx (97%) create mode 100644 docs/data/charts/hooks/demos/use-scale/client.ts create mode 100644 docs/data/charts/hooks/demos/use-scale/index.ts rename docs/data/charts/hooks/{ => demos/use-series}/UseSeries.tsx (97%) create mode 100644 docs/data/charts/hooks/demos/use-series/client.ts create mode 100644 docs/data/charts/hooks/demos/use-series/index.ts delete mode 100644 docs/data/charts/label/BasicLabel.js delete mode 100644 docs/data/charts/label/BasicLabel.tsx.preview delete mode 100644 docs/data/charts/label/FunctionLabel.js delete mode 100644 docs/data/charts/label/FunctionLabel.tsx.preview delete mode 100644 docs/data/charts/label/PieLabel.js delete mode 100644 docs/data/charts/label/PieLabel.tsx.preview rename docs/data/charts/label/{ => demos/basic-label}/BasicLabel.tsx (87%) create mode 100644 docs/data/charts/label/demos/basic-label/client.ts create mode 100644 docs/data/charts/label/demos/basic-label/index.ts rename docs/data/charts/label/{ => demos/function-label}/FunctionLabel.tsx (89%) create mode 100644 docs/data/charts/label/demos/function-label/client.ts create mode 100644 docs/data/charts/label/demos/function-label/index.ts rename docs/data/charts/label/{ => demos/pie-label}/PieLabel.tsx (91%) create mode 100644 docs/data/charts/label/demos/pie-label/client.ts create mode 100644 docs/data/charts/label/demos/pie-label/index.ts delete mode 100644 docs/data/charts/legend/BasicColorLegend.js delete mode 100644 docs/data/charts/legend/BasicLegend.js delete mode 100644 docs/data/charts/legend/BasicLegend.tsx.preview delete mode 100644 docs/data/charts/legend/ContinuousInteractiveDemo.js delete mode 100644 docs/data/charts/legend/ControlledVisibility.js delete mode 100644 docs/data/charts/legend/CustomLegend.js delete mode 100644 docs/data/charts/legend/HiddenLegend.js delete mode 100644 docs/data/charts/legend/HiddenLegend.tsx.preview delete mode 100644 docs/data/charts/legend/LegendClick.js delete mode 100644 docs/data/charts/legend/LegendCustomLabelMark.js delete mode 100644 docs/data/charts/legend/LegendCustomLabelMark.tsx.preview delete mode 100644 docs/data/charts/legend/LegendDimension.js delete mode 100644 docs/data/charts/legend/LegendLabelPositions.js delete mode 100644 docs/data/charts/legend/LegendMarkType.js delete mode 100644 docs/data/charts/legend/LegendPosition.js delete mode 100644 docs/data/charts/legend/LegendStyleSeries.js delete mode 100644 docs/data/charts/legend/LegendTextStyling.js delete mode 100644 docs/data/charts/legend/PiecewiseInteractiveDemo.js delete mode 100644 docs/data/charts/legend/ScrollableLegend.js delete mode 100644 docs/data/charts/legend/ScrollableLegend.tsx.preview delete mode 100644 docs/data/charts/legend/StackLineVisibility.js delete mode 100644 docs/data/charts/legend/ToggleSeriesVisibility.js delete mode 100644 docs/data/charts/legend/VeryBasicColorLegend.js delete mode 100644 docs/data/charts/legend/VeryBasicColorLegend.tsx.preview delete mode 100644 docs/data/charts/legend/VisibilityOnChange.js delete mode 100644 docs/data/charts/legend/VisibilityOnChange.tsx.preview rename docs/data/charts/legend/{ => demos/basic-color-legend}/BasicColorLegend.tsx (94%) create mode 100644 docs/data/charts/legend/demos/basic-color-legend/client.ts create mode 100644 docs/data/charts/legend/demos/basic-color-legend/index.ts rename docs/data/charts/legend/{ => demos/basic-legend}/BasicLegend.tsx (75%) create mode 100644 docs/data/charts/legend/demos/basic-legend/client.ts create mode 100644 docs/data/charts/legend/demos/basic-legend/index.ts rename docs/data/charts/legend/{ => demos/continuous-interactive-demo}/ContinuousInteractiveDemo.tsx (97%) create mode 100644 docs/data/charts/legend/demos/continuous-interactive-demo/client.ts create mode 100644 docs/data/charts/legend/demos/continuous-interactive-demo/index.ts rename docs/data/charts/legend/{ => demos/controlled-visibility}/ControlledVisibility.tsx (98%) create mode 100644 docs/data/charts/legend/demos/controlled-visibility/client.ts create mode 100644 docs/data/charts/legend/demos/controlled-visibility/index.ts rename docs/data/charts/legend/{ => demos/custom-legend}/CustomLegend.tsx (94%) create mode 100644 docs/data/charts/legend/demos/custom-legend/client.ts create mode 100644 docs/data/charts/legend/demos/custom-legend/index.ts rename docs/data/charts/legend/{ => demos/hidden-legend}/HiddenLegend.tsx (95%) create mode 100644 docs/data/charts/legend/demos/hidden-legend/client.ts create mode 100644 docs/data/charts/legend/demos/hidden-legend/index.ts rename docs/data/charts/legend/{ => demos/legend-click}/LegendClick.tsx (98%) create mode 100644 docs/data/charts/legend/demos/legend-click/client.ts create mode 100644 docs/data/charts/legend/demos/legend-click/index.ts rename docs/data/charts/legend/{ => demos/legend-custom-label-mark}/LegendCustomLabelMark.tsx (88%) create mode 100644 docs/data/charts/legend/demos/legend-custom-label-mark/client.ts create mode 100644 docs/data/charts/legend/demos/legend-custom-label-mark/index.ts rename docs/data/charts/legend/{ => demos/legend-dimension}/LegendDimension.tsx (97%) create mode 100644 docs/data/charts/legend/demos/legend-dimension/client.ts create mode 100644 docs/data/charts/legend/demos/legend-dimension/index.ts rename docs/data/charts/legend/{ => demos/legend-label-positions}/LegendLabelPositions.tsx (98%) create mode 100644 docs/data/charts/legend/demos/legend-label-positions/client.ts create mode 100644 docs/data/charts/legend/demos/legend-label-positions/index.ts rename docs/data/charts/legend/{ => demos/legend-mark-type}/LegendMarkType.tsx (96%) create mode 100644 docs/data/charts/legend/demos/legend-mark-type/client.ts create mode 100644 docs/data/charts/legend/demos/legend-mark-type/index.ts rename docs/data/charts/legend/{ => demos/legend-position}/LegendPosition.tsx (97%) create mode 100644 docs/data/charts/legend/demos/legend-position/client.ts create mode 100644 docs/data/charts/legend/demos/legend-position/index.ts rename docs/data/charts/legend/{ => demos/legend-style-series}/LegendStyleSeries.tsx (91%) create mode 100644 docs/data/charts/legend/demos/legend-style-series/client.ts create mode 100644 docs/data/charts/legend/demos/legend-style-series/index.ts rename docs/data/charts/legend/{ => demos/legend-text-styling}/LegendTextStyling.tsx (97%) create mode 100644 docs/data/charts/legend/demos/legend-text-styling/client.ts create mode 100644 docs/data/charts/legend/demos/legend-text-styling/index.ts rename docs/data/charts/legend/{ => demos/piecewise-interactive-demo}/PiecewiseInteractiveDemo.tsx (97%) create mode 100644 docs/data/charts/legend/demos/piecewise-interactive-demo/client.ts create mode 100644 docs/data/charts/legend/demos/piecewise-interactive-demo/index.ts rename docs/data/charts/legend/{ => demos/scrollable-legend}/ScrollableLegend.tsx (96%) create mode 100644 docs/data/charts/legend/demos/scrollable-legend/client.ts create mode 100644 docs/data/charts/legend/demos/scrollable-legend/index.ts rename docs/data/charts/legend/{ => demos/stack-line-visibility}/StackLineVisibility.tsx (91%) create mode 100644 docs/data/charts/legend/demos/stack-line-visibility/client.ts create mode 100644 docs/data/charts/legend/demos/stack-line-visibility/index.ts rename docs/data/charts/legend/{ => demos/toggle-series-visibility}/ToggleSeriesVisibility.tsx (91%) create mode 100644 docs/data/charts/legend/demos/toggle-series-visibility/client.ts create mode 100644 docs/data/charts/legend/demos/toggle-series-visibility/index.ts rename docs/data/charts/legend/{ => demos/very-basic-color-legend}/VeryBasicColorLegend.tsx (86%) create mode 100644 docs/data/charts/legend/demos/very-basic-color-legend/client.ts create mode 100644 docs/data/charts/legend/demos/very-basic-color-legend/index.ts rename docs/data/charts/legend/{ => demos/visibility-on-change}/VisibilityOnChange.tsx (96%) create mode 100644 docs/data/charts/legend/demos/visibility-on-change/client.ts create mode 100644 docs/data/charts/legend/demos/visibility-on-change/index.ts delete mode 100644 docs/data/charts/line-demo/BiaxialLineChart.js delete mode 100644 docs/data/charts/line-demo/BiaxialLineChart.tsx.preview delete mode 100644 docs/data/charts/line-demo/CustomLabelChart.js delete mode 100644 docs/data/charts/line-demo/CustomLabelChart.tsx.preview delete mode 100644 docs/data/charts/line-demo/CustomLineMarks.js delete mode 100644 docs/data/charts/line-demo/DashedLineChart.js delete mode 100644 docs/data/charts/line-demo/LargerHighlightLineNoSnap.js delete mode 100644 docs/data/charts/line-demo/LargerHighlightLineNoSnap.tsx.preview delete mode 100644 docs/data/charts/line-demo/LineChartConnectNulls.js delete mode 100644 docs/data/charts/line-demo/LineChartConnectNulls.tsx.preview delete mode 100644 docs/data/charts/line-demo/LineChartWithReferenceLines.js delete mode 100644 docs/data/charts/line-demo/LineWithUncertaintyArea.js delete mode 100644 docs/data/charts/line-demo/LiveLineChartNoSnap.js delete mode 100644 docs/data/charts/line-demo/SimpleLineChart.js delete mode 100644 docs/data/charts/line-demo/SimpleLineChart.tsx.preview delete mode 100644 docs/data/charts/line-demo/TinyLineChart.js rename docs/data/charts/line-demo/{ => demos/biaxial-line-chart}/BiaxialLineChart.tsx (93%) create mode 100644 docs/data/charts/line-demo/demos/biaxial-line-chart/client.ts create mode 100644 docs/data/charts/line-demo/demos/biaxial-line-chart/index.ts rename docs/data/charts/line-demo/{ => demos/custom-label-chart}/CustomLabelChart.tsx (86%) create mode 100644 docs/data/charts/line-demo/demos/custom-label-chart/client.ts create mode 100644 docs/data/charts/line-demo/demos/custom-label-chart/index.ts rename docs/data/charts/line-demo/{ => demos/custom-line-marks}/CustomLineMarks.tsx (94%) create mode 100644 docs/data/charts/line-demo/demos/custom-line-marks/client.ts create mode 100644 docs/data/charts/line-demo/demos/custom-line-marks/index.ts rename docs/data/charts/line-demo/{ => demos/dashed-line-chart}/DashedLineChart.tsx (96%) create mode 100644 docs/data/charts/line-demo/demos/dashed-line-chart/client.ts create mode 100644 docs/data/charts/line-demo/demos/dashed-line-chart/index.ts rename docs/data/charts/line-demo/{ => demos/larger-highlight-line-no-snap}/LargerHighlightLineNoSnap.tsx (90%) create mode 100644 docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/client.ts create mode 100644 docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/index.ts rename docs/data/charts/line-demo/{ => demos/line-chart-connect-nulls}/LineChartConnectNulls.tsx (93%) create mode 100644 docs/data/charts/line-demo/demos/line-chart-connect-nulls/client.ts create mode 100644 docs/data/charts/line-demo/demos/line-chart-connect-nulls/index.ts rename docs/data/charts/line-demo/{ => demos/line-chart-with-reference-lines}/LineChartWithReferenceLines.tsx (96%) create mode 100644 docs/data/charts/line-demo/demos/line-chart-with-reference-lines/client.ts create mode 100644 docs/data/charts/line-demo/demos/line-chart-with-reference-lines/index.ts rename docs/data/charts/line-demo/{ => demos/line-with-uncertainty-area}/LineWithUncertaintyArea.tsx (93%) create mode 100644 docs/data/charts/line-demo/demos/line-with-uncertainty-area/client.ts create mode 100644 docs/data/charts/line-demo/demos/line-with-uncertainty-area/index.ts rename docs/data/charts/line-demo/{ => demos/live-line-chart-no-snap}/LiveLineChartNoSnap.tsx (98%) create mode 100644 docs/data/charts/line-demo/demos/live-line-chart-no-snap/client.ts create mode 100644 docs/data/charts/line-demo/demos/live-line-chart-no-snap/index.ts rename docs/data/charts/line-demo/{ => demos/simple-line-chart}/SimpleLineChart.tsx (93%) create mode 100644 docs/data/charts/line-demo/demos/simple-line-chart/client.ts create mode 100644 docs/data/charts/line-demo/demos/simple-line-chart/index.ts rename docs/data/charts/line-demo/{ => demos/tiny-line-chart}/TinyLineChart.tsx (95%) create mode 100644 docs/data/charts/line-demo/demos/tiny-line-chart/client.ts create mode 100644 docs/data/charts/line-demo/demos/tiny-line-chart/index.ts delete mode 100644 docs/data/charts/lines/AreaBaseline.js delete mode 100644 docs/data/charts/lines/AreaBaseline.tsx.preview delete mode 100644 docs/data/charts/lines/BasicArea.js delete mode 100644 docs/data/charts/lines/BasicArea.tsx.preview delete mode 100644 docs/data/charts/lines/BasicLineChart.js delete mode 100644 docs/data/charts/lines/BasicLineChart.tsx.preview delete mode 100644 docs/data/charts/lines/CSSCustomization.js delete mode 100644 docs/data/charts/lines/ColorScale.js delete mode 100644 docs/data/charts/lines/ColorScale.tsx delete mode 100644 docs/data/charts/lines/ConnectNulls.js delete mode 100644 docs/data/charts/lines/DifferentLength.js delete mode 100644 docs/data/charts/lines/ExpandingStep.js delete mode 100644 docs/data/charts/lines/GridDemo.js delete mode 100644 docs/data/charts/lines/GridDemo.tsx delete mode 100644 docs/data/charts/lines/GridDemo.tsx.preview delete mode 100644 docs/data/charts/lines/InterpolationDemo.js delete mode 100644 docs/data/charts/lines/LineAnimation.js delete mode 100644 docs/data/charts/lines/LineClick.js delete mode 100644 docs/data/charts/lines/LineDataset.js delete mode 100644 docs/data/charts/lines/LineDataset.tsx.preview delete mode 100644 docs/data/charts/lines/LineDefaultDomainLimit.js delete mode 100644 docs/data/charts/lines/LineMarkShape.js delete mode 100644 docs/data/charts/lines/LineOverview.js delete mode 100644 docs/data/charts/lines/LinePointerInteraction.js delete mode 100644 docs/data/charts/lines/LinePointerInteraction.tsx.preview delete mode 100644 docs/data/charts/lines/MarkOptimization.js delete mode 100644 docs/data/charts/lines/MarkOptimization.tsx.preview delete mode 100644 docs/data/charts/lines/MarkSize.js delete mode 100644 docs/data/charts/lines/StackedAreas.js delete mode 100644 docs/data/charts/lines/StyledLineChart.js rename docs/data/charts/lines/{ => demos/area-baseline}/AreaBaseline.tsx (87%) create mode 100644 docs/data/charts/lines/demos/area-baseline/client.ts create mode 100644 docs/data/charts/lines/demos/area-baseline/index.ts rename docs/data/charts/lines/{ => demos/basic-area}/BasicArea.tsx (86%) create mode 100644 docs/data/charts/lines/demos/basic-area/client.ts create mode 100644 docs/data/charts/lines/demos/basic-area/index.ts rename docs/data/charts/lines/{ => demos/basic-line-chart}/BasicLineChart.tsx (85%) create mode 100644 docs/data/charts/lines/demos/basic-line-chart/client.ts create mode 100644 docs/data/charts/lines/demos/basic-line-chart/index.ts create mode 100644 docs/data/charts/lines/demos/color-scale/ColorScale.tsx create mode 100644 docs/data/charts/lines/demos/color-scale/client.ts create mode 100644 docs/data/charts/lines/demos/color-scale/index.ts rename docs/data/charts/lines/{ => demos/connect-nulls}/ConnectNulls.tsx (95%) create mode 100644 docs/data/charts/lines/demos/connect-nulls/client.ts create mode 100644 docs/data/charts/lines/demos/connect-nulls/index.ts rename docs/data/charts/lines/{ => demos/css-customization}/CSSCustomization.tsx (92%) create mode 100644 docs/data/charts/lines/demos/css-customization/client.ts create mode 100644 docs/data/charts/lines/demos/css-customization/index.ts rename docs/data/charts/lines/{ => demos/different-length}/DifferentLength.tsx (93%) create mode 100644 docs/data/charts/lines/demos/different-length/client.ts create mode 100644 docs/data/charts/lines/demos/different-length/index.ts rename docs/data/charts/lines/{ => demos/expanding-step}/ExpandingStep.tsx (98%) create mode 100644 docs/data/charts/lines/demos/expanding-step/client.ts create mode 100644 docs/data/charts/lines/demos/expanding-step/index.ts create mode 100644 docs/data/charts/lines/demos/grid-demo/GridDemo.tsx create mode 100644 docs/data/charts/lines/demos/grid-demo/client.ts create mode 100644 docs/data/charts/lines/demos/grid-demo/index.ts rename docs/data/charts/lines/{ => demos/interpolation-demo}/InterpolationDemo.tsx (94%) create mode 100644 docs/data/charts/lines/demos/interpolation-demo/client.ts create mode 100644 docs/data/charts/lines/demos/interpolation-demo/index.ts rename docs/data/charts/lines/{ => demos/line-animation}/LineAnimation.tsx (98%) create mode 100644 docs/data/charts/lines/demos/line-animation/client.ts create mode 100644 docs/data/charts/lines/demos/line-animation/index.ts rename docs/data/charts/lines/{ => demos/line-click}/LineClick.tsx (95%) create mode 100644 docs/data/charts/lines/demos/line-click/client.ts create mode 100644 docs/data/charts/lines/demos/line-click/index.ts rename docs/data/charts/lines/{ => demos/line-dataset}/LineDataset.tsx (87%) create mode 100644 docs/data/charts/lines/demos/line-dataset/client.ts create mode 100644 docs/data/charts/lines/demos/line-dataset/index.ts rename docs/data/charts/lines/{ => demos/line-default-domain-limit}/LineDefaultDomainLimit.tsx (94%) create mode 100644 docs/data/charts/lines/demos/line-default-domain-limit/client.ts create mode 100644 docs/data/charts/lines/demos/line-default-domain-limit/index.ts rename docs/data/charts/lines/{ => demos/line-mark-shape}/LineMarkShape.tsx (96%) create mode 100644 docs/data/charts/lines/demos/line-mark-shape/client.ts create mode 100644 docs/data/charts/lines/demos/line-mark-shape/index.ts rename docs/data/charts/lines/{ => demos/line-overview}/LineOverview.tsx (97%) create mode 100644 docs/data/charts/lines/demos/line-overview/client.ts create mode 100644 docs/data/charts/lines/demos/line-overview/index.ts rename docs/data/charts/lines/{ => demos/line-pointer-interaction}/LinePointerInteraction.tsx (94%) create mode 100644 docs/data/charts/lines/demos/line-pointer-interaction/client.ts create mode 100644 docs/data/charts/lines/demos/line-pointer-interaction/index.ts rename docs/data/charts/lines/{ => demos/mark-optimization}/MarkOptimization.tsx (88%) create mode 100644 docs/data/charts/lines/demos/mark-optimization/client.ts create mode 100644 docs/data/charts/lines/demos/mark-optimization/index.ts rename docs/data/charts/lines/{ => demos/mark-size}/MarkSize.tsx (98%) create mode 100644 docs/data/charts/lines/demos/mark-size/client.ts create mode 100644 docs/data/charts/lines/demos/mark-size/index.ts rename docs/data/charts/lines/{ => demos/stacked-areas}/StackedAreas.tsx (89%) create mode 100644 docs/data/charts/lines/demos/stacked-areas/client.ts create mode 100644 docs/data/charts/lines/demos/stacked-areas/index.ts rename docs/data/charts/lines/{ => demos/styled-line-chart}/StyledLineChart.tsx (97%) create mode 100644 docs/data/charts/lines/demos/styled-line-chart/client.ts create mode 100644 docs/data/charts/lines/demos/styled-line-chart/index.ts delete mode 100644 docs/data/charts/localization/ChartsLocalizationTableNoSnap.js delete mode 100644 docs/data/charts/localization/CustomLocaleOverlay.js delete mode 100644 docs/data/charts/localization/CustomLocaleOverlay.tsx.preview create mode 100644 docs/data/charts/localization/demos/charts-localization-table-no-snap/ChartsLocalizationTableNoSnap.tsx create mode 100644 docs/data/charts/localization/demos/charts-localization-table-no-snap/client.ts create mode 100644 docs/data/charts/localization/demos/charts-localization-table-no-snap/index.ts rename docs/data/charts/localization/{ => demos/custom-locale-overlay}/CustomLocaleOverlay.tsx (86%) create mode 100644 docs/data/charts/localization/demos/custom-locale-overlay/client.ts create mode 100644 docs/data/charts/localization/demos/custom-locale-overlay/index.ts delete mode 100644 docs/data/charts/map/BasicGeoDataPlot.js delete mode 100644 docs/data/charts/map/ColorScaleMapShape.js delete mode 100644 docs/data/charts/map/CountryProjectionShape.js delete mode 100644 docs/data/charts/map/ExportMap.js delete mode 100644 docs/data/charts/map/GeoDataPlotDemo.js delete mode 100644 docs/data/charts/map/GeoFeatureKeyMapShape.js delete mode 100644 docs/data/charts/map/HighlightedMapShape.js delete mode 100644 docs/data/charts/map/MapShapeClick.js delete mode 100644 docs/data/charts/map/MapShapePlotDemo.js delete mode 100644 docs/data/charts/map/MapZoomControl.js delete mode 100644 docs/data/charts/map/MapZoomOptions.js delete mode 100644 docs/data/charts/map/MarsMap.js delete mode 100644 docs/data/charts/map/ProjectionMapShape.js delete mode 100644 docs/data/charts/map/RemoveAntarctica.js delete mode 100644 docs/data/charts/map/TectonicPlates.js delete mode 100644 docs/data/charts/map/VisibleMapShape.js rename docs/data/charts/map/{ => demos/basic-geo-data-plot}/BasicGeoDataPlot.tsx (92%) create mode 100644 docs/data/charts/map/demos/basic-geo-data-plot/client.ts create mode 100644 docs/data/charts/map/demos/basic-geo-data-plot/index.ts rename docs/data/charts/map/{ => demos/color-scale-map-shape}/ColorScaleMapShape.tsx (94%) create mode 100644 docs/data/charts/map/demos/color-scale-map-shape/client.ts create mode 100644 docs/data/charts/map/demos/color-scale-map-shape/index.ts rename docs/data/charts/map/{ => demos/country-projection-shape}/CountryProjectionShape.tsx (96%) create mode 100644 docs/data/charts/map/demos/country-projection-shape/client.ts create mode 100644 docs/data/charts/map/demos/country-projection-shape/index.ts rename docs/data/charts/map/{ => demos/export-map}/ExportMap.tsx (92%) create mode 100644 docs/data/charts/map/demos/export-map/client.ts create mode 100644 docs/data/charts/map/demos/export-map/index.ts rename docs/data/charts/map/{ => demos/geo-data-plot-demo}/GeoDataPlotDemo.tsx (94%) create mode 100644 docs/data/charts/map/demos/geo-data-plot-demo/client.ts create mode 100644 docs/data/charts/map/demos/geo-data-plot-demo/index.ts rename docs/data/charts/map/{ => demos/geo-feature-key-map-shape}/GeoFeatureKeyMapShape.tsx (93%) create mode 100644 docs/data/charts/map/demos/geo-feature-key-map-shape/client.ts create mode 100644 docs/data/charts/map/demos/geo-feature-key-map-shape/index.ts rename docs/data/charts/map/{ => demos/highlighted-map-shape}/HighlightedMapShape.tsx (96%) create mode 100644 docs/data/charts/map/demos/highlighted-map-shape/client.ts create mode 100644 docs/data/charts/map/demos/highlighted-map-shape/index.ts rename docs/data/charts/map/{ => demos/map-shape-click}/MapShapeClick.tsx (92%) create mode 100644 docs/data/charts/map/demos/map-shape-click/client.ts create mode 100644 docs/data/charts/map/demos/map-shape-click/index.ts rename docs/data/charts/map/{ => demos/map-shape-plot-demo}/MapShapePlotDemo.tsx (88%) create mode 100644 docs/data/charts/map/demos/map-shape-plot-demo/client.ts create mode 100644 docs/data/charts/map/demos/map-shape-plot-demo/index.ts rename docs/data/charts/map/{ => demos/map-zoom-control}/MapZoomControl.tsx (94%) create mode 100644 docs/data/charts/map/demos/map-zoom-control/client.ts create mode 100644 docs/data/charts/map/demos/map-zoom-control/index.ts rename docs/data/charts/map/{ => demos/map-zoom-options}/MapZoomOptions.tsx (96%) create mode 100644 docs/data/charts/map/demos/map-zoom-options/client.ts create mode 100644 docs/data/charts/map/demos/map-zoom-options/index.ts rename docs/data/charts/map/{ => demos/mars-map}/MarsMap.tsx (96%) create mode 100644 docs/data/charts/map/demos/mars-map/client.ts create mode 100644 docs/data/charts/map/demos/mars-map/index.ts rename docs/data/charts/map/{ => demos/projection-map-shape}/ProjectionMapShape.tsx (93%) create mode 100644 docs/data/charts/map/demos/projection-map-shape/client.ts create mode 100644 docs/data/charts/map/demos/projection-map-shape/index.ts rename docs/data/charts/map/{ => demos/remove-antarctica}/RemoveAntarctica.tsx (91%) create mode 100644 docs/data/charts/map/demos/remove-antarctica/client.ts create mode 100644 docs/data/charts/map/demos/remove-antarctica/index.ts rename docs/data/charts/map/{ => demos/tectonic-plates}/TectonicPlates.tsx (93%) create mode 100644 docs/data/charts/map/demos/tectonic-plates/client.ts create mode 100644 docs/data/charts/map/demos/tectonic-plates/index.ts rename docs/data/charts/map/{ => demos/visible-map-shape}/VisibleMapShape.tsx (95%) create mode 100644 docs/data/charts/map/demos/visible-map-shape/client.ts create mode 100644 docs/data/charts/map/demos/visible-map-shape/index.ts delete mode 100644 docs/data/charts/performance/BarSampling.js delete mode 100644 docs/data/charts/performance/LineSampling.js delete mode 100644 docs/data/charts/performance/LineSamplingNulls.js delete mode 100644 docs/data/charts/performance/SamplingMethodComparison.js rename docs/data/charts/performance/{ => demos/bar-sampling}/BarSampling.tsx (92%) create mode 100644 docs/data/charts/performance/demos/bar-sampling/client.ts create mode 100644 docs/data/charts/performance/demos/bar-sampling/index.ts rename docs/data/charts/performance/{ => demos/line-sampling-nulls}/LineSamplingNulls.tsx (92%) create mode 100644 docs/data/charts/performance/demos/line-sampling-nulls/client.ts create mode 100644 docs/data/charts/performance/demos/line-sampling-nulls/index.ts rename docs/data/charts/performance/{ => demos/line-sampling}/LineSampling.tsx (92%) create mode 100644 docs/data/charts/performance/demos/line-sampling/client.ts create mode 100644 docs/data/charts/performance/demos/line-sampling/index.ts rename docs/data/charts/performance/{ => demos/sampling-method-comparison}/SamplingMethodComparison.tsx (92%) create mode 100644 docs/data/charts/performance/demos/sampling-method-comparison/client.ts create mode 100644 docs/data/charts/performance/demos/sampling-method-comparison/index.ts delete mode 100644 docs/data/charts/pie-demo/PieChartWithCenterLabel.js delete mode 100644 docs/data/charts/pie-demo/PieChartWithCenterLabel.tsx.preview delete mode 100644 docs/data/charts/pie-demo/PieChartWithCustomLegendAndTooltip.js delete mode 100644 docs/data/charts/pie-demo/PieChartWithCustomizedLabel.js delete mode 100644 docs/data/charts/pie-demo/PieChartWithCustomizedLabel.tsx.preview delete mode 100644 docs/data/charts/pie-demo/PieChartWithPaddingAngle.js delete mode 100644 docs/data/charts/pie-demo/StraightAnglePieChart.js delete mode 100644 docs/data/charts/pie-demo/StraightAnglePieChart.tsx.preview delete mode 100644 docs/data/charts/pie-demo/TwoLevelPieChart.js delete mode 100644 docs/data/charts/pie-demo/TwoLevelPieChart.tsx.preview rename docs/data/charts/pie-demo/{ => demos/pie-chart-with-center-label}/PieChartWithCenterLabel.tsx (95%) create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-center-label/client.ts create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-center-label/index.ts rename docs/data/charts/pie-demo/{ => demos/pie-chart-with-custom-legend-and-tooltip}/PieChartWithCustomLegendAndTooltip.tsx (89%) create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/client.ts create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/index.ts rename docs/data/charts/pie-demo/{ => demos/pie-chart-with-customized-label}/PieChartWithCustomizedLabel.tsx (89%) create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/client.ts create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/index.ts rename docs/data/charts/pie-demo/{ => demos/pie-chart-with-padding-angle}/PieChartWithPaddingAngle.tsx (94%) create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/client.ts create mode 100644 docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/index.ts rename docs/data/charts/pie-demo/{ => demos/straight-angle-pie-chart}/StraightAnglePieChart.tsx (91%) create mode 100644 docs/data/charts/pie-demo/demos/straight-angle-pie-chart/client.ts create mode 100644 docs/data/charts/pie-demo/demos/straight-angle-pie-chart/index.ts rename docs/data/charts/pie-demo/{ => demos/two-level-pie-chart}/TwoLevelPieChart.tsx (95%) create mode 100644 docs/data/charts/pie-demo/demos/two-level-pie-chart/client.ts create mode 100644 docs/data/charts/pie-demo/demos/two-level-pie-chart/index.ts delete mode 100644 docs/data/charts/pie/BasicPie.js delete mode 100644 docs/data/charts/pie/BasicPie.tsx.preview delete mode 100644 docs/data/charts/pie/DonutChart.js delete mode 100644 docs/data/charts/pie/DonutChart.tsx.preview delete mode 100644 docs/data/charts/pie/PieActiveArc.js delete mode 100644 docs/data/charts/pie/PieActiveArc.tsx.preview delete mode 100644 docs/data/charts/pie/PieAnimation.js delete mode 100644 docs/data/charts/pie/PieArcLabel.js delete mode 100644 docs/data/charts/pie/PieArcLabel.tsx.preview delete mode 100644 docs/data/charts/pie/PieCSSStyling.js delete mode 100644 docs/data/charts/pie/PieCSSStyling.tsx.preview delete mode 100644 docs/data/charts/pie/PieClick.js delete mode 100644 docs/data/charts/pie/PieColor.js delete mode 100644 docs/data/charts/pie/PieShape.js delete mode 100644 docs/data/charts/pie/TitanicPie.js rename docs/data/charts/pie/{ => demos/basic-pie}/BasicPie.tsx (89%) create mode 100644 docs/data/charts/pie/demos/basic-pie/client.ts create mode 100644 docs/data/charts/pie/demos/basic-pie/index.ts rename docs/data/charts/pie/{ => demos/donut-chart}/DonutChart.tsx (91%) create mode 100644 docs/data/charts/pie/demos/donut-chart/client.ts create mode 100644 docs/data/charts/pie/demos/donut-chart/index.ts rename docs/data/charts/pie/{ => demos/pie-active-arc}/PieActiveArc.tsx (78%) create mode 100644 docs/data/charts/pie/demos/pie-active-arc/client.ts create mode 100644 docs/data/charts/pie/demos/pie-active-arc/index.ts rename docs/data/charts/pie/{ => demos/pie-animation}/PieAnimation.tsx (94%) create mode 100644 docs/data/charts/pie/demos/pie-animation/client.ts create mode 100644 docs/data/charts/pie/demos/pie-animation/index.ts rename docs/data/charts/pie/{ => demos/pie-arc-label}/PieArcLabel.tsx (82%) create mode 100644 docs/data/charts/pie/demos/pie-arc-label/client.ts create mode 100644 docs/data/charts/pie/demos/pie-arc-label/index.ts rename docs/data/charts/pie/{ => demos/pie-click}/PieClick.tsx (93%) create mode 100644 docs/data/charts/pie/demos/pie-click/client.ts create mode 100644 docs/data/charts/pie/demos/pie-click/index.ts rename docs/data/charts/pie/{ => demos/pie-color}/PieColor.tsx (92%) create mode 100644 docs/data/charts/pie/demos/pie-color/client.ts create mode 100644 docs/data/charts/pie/demos/pie-color/index.ts rename docs/data/charts/pie/{ => demos/pie-css-styling}/PieCSSStyling.tsx (90%) create mode 100644 docs/data/charts/pie/demos/pie-css-styling/client.ts create mode 100644 docs/data/charts/pie/demos/pie-css-styling/index.ts rename docs/data/charts/pie/{ => demos/pie-shape}/PieShape.tsx (92%) create mode 100644 docs/data/charts/pie/demos/pie-shape/client.ts create mode 100644 docs/data/charts/pie/demos/pie-shape/index.ts rename docs/data/charts/pie/{ => demos/titanic-pie}/TitanicPie.tsx (99%) create mode 100644 docs/data/charts/pie/demos/titanic-pie/client.ts create mode 100644 docs/data/charts/pie/demos/titanic-pie/index.ts delete mode 100644 docs/data/charts/pyramid/Pyramid.js delete mode 100644 docs/data/charts/pyramid/Pyramid.tsx.preview delete mode 100644 docs/data/charts/pyramid/PyramidDirection.js delete mode 100644 docs/data/charts/pyramid/PyramidPlayground.js delete mode 100644 docs/data/charts/pyramid/PyramidSegmentLinear.js delete mode 100644 docs/data/charts/pyramid/PyramidSegmentLinear.tsx.preview rename docs/data/charts/pyramid/{ => demos/pyramid-direction}/PyramidDirection.tsx (88%) create mode 100644 docs/data/charts/pyramid/demos/pyramid-direction/client.ts create mode 100644 docs/data/charts/pyramid/demos/pyramid-direction/index.ts rename docs/data/charts/pyramid/{ => demos/pyramid-playground}/PyramidPlayground.tsx (92%) create mode 100644 docs/data/charts/pyramid/demos/pyramid-playground/client.ts create mode 100644 docs/data/charts/pyramid/demos/pyramid-playground/index.ts rename docs/data/charts/pyramid/{ => demos/pyramid-segment-linear}/PyramidSegmentLinear.tsx (94%) create mode 100644 docs/data/charts/pyramid/demos/pyramid-segment-linear/client.ts create mode 100644 docs/data/charts/pyramid/demos/pyramid-segment-linear/index.ts rename docs/data/charts/pyramid/{ => demos/pyramid}/Pyramid.tsx (89%) create mode 100644 docs/data/charts/pyramid/demos/pyramid/client.ts create mode 100644 docs/data/charts/pyramid/demos/pyramid/index.ts delete mode 100644 docs/data/charts/quickstart/Combining.js delete mode 100644 docs/data/charts/quickstart/SimpleCharts.js delete mode 100644 docs/data/charts/quickstart/SimpleCharts.tsx.preview rename docs/data/charts/quickstart/{ => demos/combining}/Combining.tsx (93%) create mode 100644 docs/data/charts/quickstart/demos/combining/client.ts create mode 100644 docs/data/charts/quickstart/demos/combining/index.ts rename docs/data/charts/quickstart/{ => demos/simple-charts}/SimpleCharts.tsx (88%) create mode 100644 docs/data/charts/quickstart/demos/simple-charts/client.ts create mode 100644 docs/data/charts/quickstart/demos/simple-charts/index.ts delete mode 100644 docs/data/charts/radar/BasicRadar.js delete mode 100644 docs/data/charts/radar/BasicRadar.tsx.preview delete mode 100644 docs/data/charts/radar/CompositionExample.js delete mode 100644 docs/data/charts/radar/CompositionExample.tsx delete mode 100644 docs/data/charts/radar/DemoRadar.js delete mode 100644 docs/data/charts/radar/DemoRadarAxis.js delete mode 100644 docs/data/charts/radar/DemoRadarAxisHighlight.js delete mode 100644 docs/data/charts/radar/DemoRadarSeriesHighlight.js delete mode 100644 docs/data/charts/radar/DemoRadarVisualisation.js delete mode 100644 docs/data/charts/radar/MultiSeriesRadar.js delete mode 100644 docs/data/charts/radar/RadarAxis.js delete mode 100644 docs/data/charts/radar/RadarAxis.tsx.preview delete mode 100644 docs/data/charts/radar/RadarClick.js delete mode 100644 docs/data/charts/radar/RadarTooltip.js delete mode 100644 docs/data/charts/radar/RadarTooltip.tsx.preview rename docs/data/charts/radar/{ => demos/basic-radar}/BasicRadar.tsx (87%) create mode 100644 docs/data/charts/radar/demos/basic-radar/client.ts create mode 100644 docs/data/charts/radar/demos/basic-radar/index.ts create mode 100644 docs/data/charts/radar/demos/composition-example/CompositionExample.tsx create mode 100644 docs/data/charts/radar/demos/composition-example/client.ts create mode 100644 docs/data/charts/radar/demos/composition-example/index.ts rename docs/data/charts/radar/{ => demos/demo-radar-axis-highlight}/DemoRadarAxisHighlight.tsx (90%) create mode 100644 docs/data/charts/radar/demos/demo-radar-axis-highlight/client.ts create mode 100644 docs/data/charts/radar/demos/demo-radar-axis-highlight/index.ts rename docs/data/charts/radar/{ => demos/demo-radar-axis}/DemoRadarAxis.tsx (98%) create mode 100644 docs/data/charts/radar/demos/demo-radar-axis/client.ts create mode 100644 docs/data/charts/radar/demos/demo-radar-axis/index.ts rename docs/data/charts/radar/{ => demos/demo-radar-series-highlight}/DemoRadarSeriesHighlight.tsx (92%) create mode 100644 docs/data/charts/radar/demos/demo-radar-series-highlight/client.ts create mode 100644 docs/data/charts/radar/demos/demo-radar-series-highlight/index.ts rename docs/data/charts/radar/{ => demos/demo-radar-visualisation}/DemoRadarVisualisation.tsx (92%) create mode 100644 docs/data/charts/radar/demos/demo-radar-visualisation/client.ts create mode 100644 docs/data/charts/radar/demos/demo-radar-visualisation/index.ts rename docs/data/charts/radar/{ => demos/demo-radar}/DemoRadar.tsx (98%) create mode 100644 docs/data/charts/radar/demos/demo-radar/client.ts create mode 100644 docs/data/charts/radar/demos/demo-radar/index.ts rename docs/data/charts/radar/{ => demos/multi-series-radar}/MultiSeriesRadar.tsx (94%) create mode 100644 docs/data/charts/radar/demos/multi-series-radar/client.ts create mode 100644 docs/data/charts/radar/demos/multi-series-radar/index.ts rename docs/data/charts/radar/{ => demos/radar-axis}/RadarAxis.tsx (91%) create mode 100644 docs/data/charts/radar/demos/radar-axis/client.ts create mode 100644 docs/data/charts/radar/demos/radar-axis/index.ts rename docs/data/charts/radar/{ => demos/radar-click}/RadarClick.tsx (98%) create mode 100644 docs/data/charts/radar/demos/radar-click/client.ts create mode 100644 docs/data/charts/radar/demos/radar-click/index.ts rename docs/data/charts/radar/{ => demos/radar-tooltip}/RadarTooltip.tsx (96%) create mode 100644 docs/data/charts/radar/demos/radar-tooltip/client.ts create mode 100644 docs/data/charts/radar/demos/radar-tooltip/index.ts delete mode 100644 docs/data/charts/radial-axes/BandHighlight.js delete mode 100644 docs/data/charts/radial-axes/BandHighlight.tsx delete mode 100644 docs/data/charts/radial-axes/RadialGridPlayground.js delete mode 100644 docs/data/charts/radial-axes/RadiusAxisPercentage.js delete mode 100644 docs/data/charts/radial-axes/RadiusAxisPercentage.tsx.preview delete mode 100644 docs/data/charts/radial-axes/RadiusAxisPlayground.js delete mode 100644 docs/data/charts/radial-axes/RotationAxisPlayground.js create mode 100644 docs/data/charts/radial-axes/demos/band-highlight/BandHighlight.tsx create mode 100644 docs/data/charts/radial-axes/demos/band-highlight/client.ts create mode 100644 docs/data/charts/radial-axes/demos/band-highlight/index.ts rename docs/data/charts/radial-axes/{ => demos/radial-grid-playground}/RadialGridPlayground.tsx (98%) create mode 100644 docs/data/charts/radial-axes/demos/radial-grid-playground/client.ts create mode 100644 docs/data/charts/radial-axes/demos/radial-grid-playground/index.ts rename docs/data/charts/radial-axes/{ => demos/radius-axis-percentage}/RadiusAxisPercentage.tsx (96%) create mode 100644 docs/data/charts/radial-axes/demos/radius-axis-percentage/client.ts create mode 100644 docs/data/charts/radial-axes/demos/radius-axis-percentage/index.ts rename docs/data/charts/radial-axes/{ => demos/radius-axis-playground}/RadiusAxisPlayground.tsx (98%) create mode 100644 docs/data/charts/radial-axes/demos/radius-axis-playground/client.ts create mode 100644 docs/data/charts/radial-axes/demos/radius-axis-playground/index.ts rename docs/data/charts/radial-axes/{ => demos/rotation-axis-playground}/RotationAxisPlayground.tsx (98%) create mode 100644 docs/data/charts/radial-axes/demos/rotation-axis-playground/client.ts create mode 100644 docs/data/charts/radial-axes/demos/rotation-axis-playground/index.ts delete mode 100644 docs/data/charts/radial-bars/BasicRadialBarChart.js delete mode 100644 docs/data/charts/radial-bars/HealthRadialBarChart.js delete mode 100644 docs/data/charts/radial-bars/RadialBarClick.js delete mode 100644 docs/data/charts/radial-bars/RadialBarConfig.js delete mode 100644 docs/data/charts/radial-bars/TrustRadialBarChart.js rename docs/data/charts/radial-bars/{ => demos/basic-radial-bar-chart}/BasicRadialBarChart.tsx (95%) create mode 100644 docs/data/charts/radial-bars/demos/basic-radial-bar-chart/client.ts create mode 100644 docs/data/charts/radial-bars/demos/basic-radial-bar-chart/index.ts rename docs/data/charts/radial-bars/{ => demos/health-radial-bar-chart}/HealthRadialBarChart.tsx (97%) create mode 100644 docs/data/charts/radial-bars/demos/health-radial-bar-chart/client.ts create mode 100644 docs/data/charts/radial-bars/demos/health-radial-bar-chart/index.ts rename docs/data/charts/radial-bars/{ => demos/radial-bar-click}/RadialBarClick.tsx (91%) create mode 100644 docs/data/charts/radial-bars/demos/radial-bar-click/client.ts create mode 100644 docs/data/charts/radial-bars/demos/radial-bar-click/index.ts rename docs/data/charts/radial-bars/{ => demos/radial-bar-config}/RadialBarConfig.tsx (96%) create mode 100644 docs/data/charts/radial-bars/demos/radial-bar-config/client.ts create mode 100644 docs/data/charts/radial-bars/demos/radial-bar-config/index.ts rename docs/data/charts/radial-bars/{ => demos/trust-radial-bar-chart}/TrustRadialBarChart.tsx (93%) create mode 100644 docs/data/charts/radial-bars/demos/trust-radial-bar-chart/client.ts create mode 100644 docs/data/charts/radial-bars/demos/trust-radial-bar-chart/index.ts delete mode 100644 docs/data/charts/radial-lines/BasicRadialLineChart.js delete mode 100644 docs/data/charts/radial-lines/BasicRadialLineChart.tsx.preview delete mode 100644 docs/data/charts/radial-lines/ClosedOpenRadialLineChart.js delete mode 100644 docs/data/charts/radial-lines/ContinuousRadialLineChart.js delete mode 100644 docs/data/charts/radial-lines/ElementHighlights.js delete mode 100644 docs/data/charts/radial-lines/ElementHighlights.tsx delete mode 100644 docs/data/charts/radial-lines/RadialLineClick.js delete mode 100644 docs/data/charts/radial-lines/RadialLineMarkShape.js rename docs/data/charts/radial-lines/{ => demos/basic-radial-line-chart}/BasicRadialLineChart.tsx (85%) create mode 100644 docs/data/charts/radial-lines/demos/basic-radial-line-chart/client.ts create mode 100644 docs/data/charts/radial-lines/demos/basic-radial-line-chart/index.ts rename docs/data/charts/radial-lines/{ => demos/closed-open-radial-line-chart}/ClosedOpenRadialLineChart.tsx (97%) create mode 100644 docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/client.ts create mode 100644 docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/index.ts rename docs/data/charts/radial-lines/{ => demos/continuous-radial-line-chart}/ContinuousRadialLineChart.tsx (95%) create mode 100644 docs/data/charts/radial-lines/demos/continuous-radial-line-chart/client.ts create mode 100644 docs/data/charts/radial-lines/demos/continuous-radial-line-chart/index.ts create mode 100644 docs/data/charts/radial-lines/demos/element-highlights/ElementHighlights.tsx create mode 100644 docs/data/charts/radial-lines/demos/element-highlights/client.ts create mode 100644 docs/data/charts/radial-lines/demos/element-highlights/index.ts rename docs/data/charts/radial-lines/{ => demos/radial-line-click}/RadialLineClick.tsx (88%) create mode 100644 docs/data/charts/radial-lines/demos/radial-line-click/client.ts create mode 100644 docs/data/charts/radial-lines/demos/radial-line-click/index.ts rename docs/data/charts/radial-lines/{ => demos/radial-line-mark-shape}/RadialLineMarkShape.tsx (94%) create mode 100644 docs/data/charts/radial-lines/demos/radial-line-mark-shape/client.ts create mode 100644 docs/data/charts/radial-lines/demos/radial-line-mark-shape/index.ts delete mode 100644 docs/data/charts/range-bar/BasicRangeBar.js delete mode 100644 docs/data/charts/range-bar/RangeBarAnimation.js delete mode 100644 docs/data/charts/range-bar/RangeBarBorderRadius.js delete mode 100644 docs/data/charts/range-bar/RangeBarClick.js delete mode 100644 docs/data/charts/range-bar/RangeBarColorScale.js delete mode 100644 docs/data/charts/range-bar/RangeBarGradient.js delete mode 100644 docs/data/charts/range-bar/RangeBarGradient.tsx.preview delete mode 100644 docs/data/charts/range-bar/RangeBarProjectSchedule.js delete mode 100644 docs/data/charts/range-bar/WebGLRangeBars.js rename docs/data/charts/range-bar/{ => demos/basic-range-bar}/BasicRangeBar.tsx (88%) create mode 100644 docs/data/charts/range-bar/demos/basic-range-bar/client.ts create mode 100644 docs/data/charts/range-bar/demos/basic-range-bar/index.ts rename docs/data/charts/range-bar/{ => demos/range-bar-animation}/RangeBarAnimation.tsx (95%) create mode 100644 docs/data/charts/range-bar/demos/range-bar-animation/client.ts create mode 100644 docs/data/charts/range-bar/demos/range-bar-animation/index.ts rename docs/data/charts/range-bar/{ => demos/range-bar-border-radius}/RangeBarBorderRadius.tsx (93%) create mode 100644 docs/data/charts/range-bar/demos/range-bar-border-radius/client.ts create mode 100644 docs/data/charts/range-bar/demos/range-bar-border-radius/index.ts rename docs/data/charts/range-bar/{ => demos/range-bar-click}/RangeBarClick.tsx (88%) create mode 100644 docs/data/charts/range-bar/demos/range-bar-click/client.ts create mode 100644 docs/data/charts/range-bar/demos/range-bar-click/index.ts rename docs/data/charts/range-bar/{ => demos/range-bar-color-scale}/RangeBarColorScale.tsx (95%) create mode 100644 docs/data/charts/range-bar/demos/range-bar-color-scale/client.ts create mode 100644 docs/data/charts/range-bar/demos/range-bar-color-scale/index.ts rename docs/data/charts/range-bar/{ => demos/range-bar-gradient}/RangeBarGradient.tsx (91%) create mode 100644 docs/data/charts/range-bar/demos/range-bar-gradient/client.ts create mode 100644 docs/data/charts/range-bar/demos/range-bar-gradient/index.ts rename docs/data/charts/range-bar/{ => demos/range-bar-project-schedule}/RangeBarProjectSchedule.tsx (96%) create mode 100644 docs/data/charts/range-bar/demos/range-bar-project-schedule/client.ts create mode 100644 docs/data/charts/range-bar/demos/range-bar-project-schedule/index.ts rename docs/data/charts/range-bar/{ => demos/web-gl-range-bars}/WebGLRangeBars.tsx (98%) create mode 100644 docs/data/charts/range-bar/demos/web-gl-range-bars/client.ts create mode 100644 docs/data/charts/range-bar/demos/web-gl-range-bars/index.ts delete mode 100644 docs/data/charts/references/ReferenceAreaBasic.js delete mode 100644 docs/data/charts/references/ReferenceLineBasic.js delete mode 100644 docs/data/charts/references/ReferenceLineBasic.tsx.preview delete mode 100644 docs/data/charts/references/ReferenceLineLabel.js delete mode 100644 docs/data/charts/references/ReferenceLineLabel.tsx.preview delete mode 100644 docs/data/charts/references/ReferenceLineStyled.js delete mode 100644 docs/data/charts/references/ReferenceLineStyled.tsx.preview delete mode 100644 docs/data/charts/references/ReferenceOverview.js delete mode 100644 docs/data/charts/references/ReferencePointBasic.js delete mode 100644 docs/data/charts/references/ReferencePointBasic.tsx.preview rename docs/data/charts/references/{ => demos/reference-area-basic}/ReferenceAreaBasic.tsx (96%) create mode 100644 docs/data/charts/references/demos/reference-area-basic/client.ts create mode 100644 docs/data/charts/references/demos/reference-area-basic/index.ts rename docs/data/charts/references/{ => demos/reference-line-basic}/ReferenceLineBasic.tsx (75%) create mode 100644 docs/data/charts/references/demos/reference-line-basic/client.ts create mode 100644 docs/data/charts/references/demos/reference-line-basic/index.ts rename docs/data/charts/references/{ => demos/reference-line-label}/ReferenceLineLabel.tsx (82%) create mode 100644 docs/data/charts/references/demos/reference-line-label/client.ts create mode 100644 docs/data/charts/references/demos/reference-line-label/index.ts rename docs/data/charts/references/{ => demos/reference-line-styled}/ReferenceLineStyled.tsx (86%) create mode 100644 docs/data/charts/references/demos/reference-line-styled/client.ts create mode 100644 docs/data/charts/references/demos/reference-line-styled/index.ts rename docs/data/charts/references/{ => demos/reference-overview}/ReferenceOverview.tsx (96%) create mode 100644 docs/data/charts/references/demos/reference-overview/client.ts create mode 100644 docs/data/charts/references/demos/reference-overview/index.ts rename docs/data/charts/references/{ => demos/reference-point-basic}/ReferencePointBasic.tsx (89%) create mode 100644 docs/data/charts/references/demos/reference-point-basic/client.ts create mode 100644 docs/data/charts/references/demos/reference-point-basic/index.ts delete mode 100644 docs/data/charts/sankey/SankeyBasicDataStructure.js delete mode 100644 docs/data/charts/sankey/SankeyBasicDataStructure.tsx.preview delete mode 100644 docs/data/charts/sankey/SankeyClick.js delete mode 100644 docs/data/charts/sankey/SankeyControlledHighlight.js delete mode 100644 docs/data/charts/sankey/SankeyCurveCorrection.js delete mode 100644 docs/data/charts/sankey/SankeyCurveCorrection.tsx.preview delete mode 100644 docs/data/charts/sankey/SankeyDetailedDataStructure.js delete mode 100644 docs/data/charts/sankey/SankeyDetailedDataStructure.tsx.preview delete mode 100644 docs/data/charts/sankey/SankeyHighlighting.js delete mode 100644 docs/data/charts/sankey/SankeyIterations.js delete mode 100644 docs/data/charts/sankey/SankeyLinkKeywordColors.js delete mode 100644 docs/data/charts/sankey/SankeyLinkSorting.js delete mode 100644 docs/data/charts/sankey/SankeyLinkStyling.js delete mode 100644 docs/data/charts/sankey/SankeyNodeAlignment.js delete mode 100644 docs/data/charts/sankey/SankeyNodeSorting.js delete mode 100644 docs/data/charts/sankey/SankeyNodeStyling.js delete mode 100644 docs/data/charts/sankey/SankeyOverview.js delete mode 100644 docs/data/charts/sankey/SankeyValueFormatter.js rename docs/data/charts/sankey/{ => demos/sankey-basic-data-structure}/SankeyBasicDataStructure.tsx (90%) create mode 100644 docs/data/charts/sankey/demos/sankey-basic-data-structure/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-basic-data-structure/index.ts rename docs/data/charts/sankey/{ => demos/sankey-click}/SankeyClick.tsx (94%) create mode 100644 docs/data/charts/sankey/demos/sankey-click/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-click/index.ts rename docs/data/charts/sankey/{ => demos/sankey-controlled-highlight}/SankeyControlledHighlight.tsx (96%) create mode 100644 docs/data/charts/sankey/demos/sankey-controlled-highlight/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-controlled-highlight/index.ts rename docs/data/charts/sankey/{ => demos/sankey-curve-correction}/SankeyCurveCorrection.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-curve-correction/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-curve-correction/index.ts rename docs/data/charts/sankey/{ => demos/sankey-detailed-data-structure}/SankeyDetailedDataStructure.tsx (94%) create mode 100644 docs/data/charts/sankey/demos/sankey-detailed-data-structure/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-detailed-data-structure/index.ts rename docs/data/charts/sankey/{ => demos/sankey-highlighting}/SankeyHighlighting.tsx (98%) create mode 100644 docs/data/charts/sankey/demos/sankey-highlighting/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-highlighting/index.ts rename docs/data/charts/sankey/{ => demos/sankey-iterations}/SankeyIterations.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-iterations/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-iterations/index.ts rename docs/data/charts/sankey/{ => demos/sankey-link-keyword-colors}/SankeyLinkKeywordColors.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-link-keyword-colors/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-link-keyword-colors/index.ts rename docs/data/charts/sankey/{ => demos/sankey-link-sorting}/SankeyLinkSorting.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-link-sorting/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-link-sorting/index.ts rename docs/data/charts/sankey/{ => demos/sankey-link-styling}/SankeyLinkStyling.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-link-styling/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-link-styling/index.ts rename docs/data/charts/sankey/{ => demos/sankey-node-alignment}/SankeyNodeAlignment.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-node-alignment/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-node-alignment/index.ts rename docs/data/charts/sankey/{ => demos/sankey-node-sorting}/SankeyNodeSorting.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-node-sorting/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-node-sorting/index.ts rename docs/data/charts/sankey/{ => demos/sankey-node-styling}/SankeyNodeStyling.tsx (97%) create mode 100644 docs/data/charts/sankey/demos/sankey-node-styling/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-node-styling/index.ts rename docs/data/charts/sankey/{ => demos/sankey-overview}/SankeyOverview.tsx (98%) create mode 100644 docs/data/charts/sankey/demos/sankey-overview/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-overview/index.ts rename docs/data/charts/sankey/{ => demos/sankey-value-formatter}/SankeyValueFormatter.tsx (89%) create mode 100644 docs/data/charts/sankey/demos/sankey-value-formatter/client.ts create mode 100644 docs/data/charts/sankey/demos/sankey-value-formatter/index.ts delete mode 100644 docs/data/charts/scatter-demo/MultipleYAxesScatterChart.js delete mode 100644 docs/data/charts/scatter-demo/SimpleScatterChart.js delete mode 100644 docs/data/charts/scatter-demo/SimpleScatterChart.tsx.preview rename docs/data/charts/scatter-demo/{ => demos/multiple-y-axes-scatter-chart}/MultipleYAxesScatterChart.tsx (97%) create mode 100644 docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/client.ts create mode 100644 docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/index.ts rename docs/data/charts/scatter-demo/{ => demos/simple-scatter-chart}/SimpleScatterChart.tsx (91%) create mode 100644 docs/data/charts/scatter-demo/demos/simple-scatter-chart/client.ts create mode 100644 docs/data/charts/scatter-demo/demos/simple-scatter-chart/index.ts delete mode 100644 docs/data/charts/scatter/BasicScatter.js delete mode 100644 docs/data/charts/scatter/BasicScatter.tsx.preview delete mode 100644 docs/data/charts/scatter/ClosestPointInteraction.js delete mode 100644 docs/data/charts/scatter/CustomScatter.js delete mode 100644 docs/data/charts/scatter/CustomScatter.tsx.preview delete mode 100644 docs/data/charts/scatter/GridDemo.js delete mode 100644 docs/data/charts/scatter/GridDemo.tsx delete mode 100644 docs/data/charts/scatter/GridDemo.tsx.preview delete mode 100644 docs/data/charts/scatter/ScatterAsyncRenderer.js delete mode 100644 docs/data/charts/scatter/ScatterBatchRenderer.js delete mode 100644 docs/data/charts/scatter/ScatterBatchRenderer.tsx.preview delete mode 100644 docs/data/charts/scatter/ScatterCSSSelectors.js delete mode 100644 docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview delete mode 100644 docs/data/charts/scatter/ScatterClick.js delete mode 100644 docs/data/charts/scatter/ScatterCustomShape.js delete mode 100644 docs/data/charts/scatter/ScatterCustomSize.js delete mode 100644 docs/data/charts/scatter/ScatterCustomSize.tsx.preview delete mode 100644 docs/data/charts/scatter/ScatterDataset.js delete mode 100644 docs/data/charts/scatter/ScatterDataset.tsx.preview delete mode 100644 docs/data/charts/scatter/ScatterOverview.js delete mode 100644 docs/data/charts/scatter/ScatterOverview.tsx.preview delete mode 100644 docs/data/charts/scatter/ScatterRegressionLine.js delete mode 100644 docs/data/charts/scatter/ScatterWebGLRenderer.js delete mode 100644 docs/data/charts/scatter/ScatterWebGLRenderer.tsx.preview rename docs/data/charts/scatter/{ => demos/basic-scatter}/BasicScatter.tsx (78%) create mode 100644 docs/data/charts/scatter/demos/basic-scatter/client.ts create mode 100644 docs/data/charts/scatter/demos/basic-scatter/index.ts rename docs/data/charts/scatter/{ => demos/closest-point-interaction}/ClosestPointInteraction.tsx (96%) create mode 100644 docs/data/charts/scatter/demos/closest-point-interaction/client.ts create mode 100644 docs/data/charts/scatter/demos/closest-point-interaction/index.ts rename docs/data/charts/scatter/{ => demos/custom-scatter}/CustomScatter.tsx (96%) create mode 100644 docs/data/charts/scatter/demos/custom-scatter/client.ts create mode 100644 docs/data/charts/scatter/demos/custom-scatter/index.ts create mode 100644 docs/data/charts/scatter/demos/grid-demo/GridDemo.tsx create mode 100644 docs/data/charts/scatter/demos/grid-demo/client.ts create mode 100644 docs/data/charts/scatter/demos/grid-demo/index.ts rename docs/data/charts/scatter/{ => demos/scatter-async-renderer}/ScatterAsyncRenderer.tsx (99%) create mode 100644 docs/data/charts/scatter/demos/scatter-async-renderer/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-async-renderer/index.ts rename docs/data/charts/scatter/{ => demos/scatter-batch-renderer}/ScatterBatchRenderer.tsx (88%) create mode 100644 docs/data/charts/scatter/demos/scatter-batch-renderer/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-batch-renderer/index.ts rename docs/data/charts/scatter/{ => demos/scatter-click}/ScatterClick.tsx (97%) create mode 100644 docs/data/charts/scatter/demos/scatter-click/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-click/index.ts rename docs/data/charts/scatter/{ => demos/scatter-css-selectors}/ScatterCSSSelectors.tsx (77%) create mode 100644 docs/data/charts/scatter/demos/scatter-css-selectors/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-css-selectors/index.ts rename docs/data/charts/scatter/{ => demos/scatter-custom-shape}/ScatterCustomShape.tsx (84%) create mode 100644 docs/data/charts/scatter/demos/scatter-custom-shape/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-custom-shape/index.ts rename docs/data/charts/scatter/{ => demos/scatter-custom-size}/ScatterCustomSize.tsx (80%) create mode 100644 docs/data/charts/scatter/demos/scatter-custom-size/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-custom-size/index.ts rename docs/data/charts/scatter/{ => demos/scatter-dataset}/ScatterDataset.tsx (98%) create mode 100644 docs/data/charts/scatter/demos/scatter-dataset/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-dataset/index.ts rename docs/data/charts/scatter/{ => demos/scatter-overview}/ScatterOverview.tsx (93%) create mode 100644 docs/data/charts/scatter/demos/scatter-overview/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-overview/index.ts rename docs/data/charts/scatter/{ => demos/scatter-regression-line}/ScatterRegressionLine.tsx (96%) create mode 100644 docs/data/charts/scatter/demos/scatter-regression-line/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-regression-line/index.ts rename docs/data/charts/scatter/{ => demos/scatter-web-gl-renderer}/ScatterWebGLRenderer.tsx (97%) create mode 100644 docs/data/charts/scatter/demos/scatter-web-gl-renderer/client.ts create mode 100644 docs/data/charts/scatter/demos/scatter-web-gl-renderer/index.ts delete mode 100644 docs/data/charts/sparkline/AreaSparkLine.js delete mode 100644 docs/data/charts/sparkline/AreaSparkLine.tsx.preview delete mode 100644 docs/data/charts/sparkline/BasicSparkLine.js delete mode 100644 docs/data/charts/sparkline/BasicSparkLine.tsx.preview delete mode 100644 docs/data/charts/sparkline/BasicSparkLineCustomization.js delete mode 100644 docs/data/charts/sparkline/ColorCustomization.js delete mode 100644 docs/data/charts/sparkline/ColorCustomization.tsx.preview delete mode 100644 docs/data/charts/sparkline/ColorCustomizationMode.js delete mode 100644 docs/data/charts/sparkline/ColorCustomizationMode.tsx.preview delete mode 100644 docs/data/charts/sparkline/CustomAxis.js delete mode 100644 docs/data/charts/sparkline/CustomDomainYAxis.js delete mode 100644 docs/data/charts/sparkline/CustomDomainYAxis.tsx delete mode 100644 docs/data/charts/sparkline/CustomYAxis.js delete mode 100644 docs/data/charts/sparkline/NpmSparkLine.js delete mode 100644 docs/data/charts/sparkline/SparklineLineWidth.js rename docs/data/charts/sparkline/{ => demos/area-spark-line}/AreaSparkLine.tsx (91%) create mode 100644 docs/data/charts/sparkline/demos/area-spark-line/client.ts create mode 100644 docs/data/charts/sparkline/demos/area-spark-line/index.ts rename docs/data/charts/sparkline/{ => demos/basic-spark-line-customization}/BasicSparkLineCustomization.tsx (97%) create mode 100644 docs/data/charts/sparkline/demos/basic-spark-line-customization/client.ts create mode 100644 docs/data/charts/sparkline/demos/basic-spark-line-customization/index.ts rename docs/data/charts/sparkline/{ => demos/basic-spark-line}/BasicSparkLine.tsx (93%) create mode 100644 docs/data/charts/sparkline/demos/basic-spark-line/client.ts create mode 100644 docs/data/charts/sparkline/demos/basic-spark-line/index.ts rename docs/data/charts/sparkline/{ => demos/color-customization-mode}/ColorCustomizationMode.tsx (96%) create mode 100644 docs/data/charts/sparkline/demos/color-customization-mode/client.ts create mode 100644 docs/data/charts/sparkline/demos/color-customization-mode/index.ts rename docs/data/charts/sparkline/{ => demos/color-customization}/ColorCustomization.tsx (95%) create mode 100644 docs/data/charts/sparkline/demos/color-customization/client.ts create mode 100644 docs/data/charts/sparkline/demos/color-customization/index.ts rename docs/data/charts/sparkline/{ => demos/custom-axis}/CustomAxis.tsx (96%) create mode 100644 docs/data/charts/sparkline/demos/custom-axis/client.ts create mode 100644 docs/data/charts/sparkline/demos/custom-axis/index.ts create mode 100644 docs/data/charts/sparkline/demos/custom-domain-y-axis/CustomDomainYAxis.tsx create mode 100644 docs/data/charts/sparkline/demos/custom-domain-y-axis/client.ts create mode 100644 docs/data/charts/sparkline/demos/custom-domain-y-axis/index.ts rename docs/data/charts/sparkline/{ => demos/custom-y-axis}/CustomYAxis.tsx (96%) create mode 100644 docs/data/charts/sparkline/demos/custom-y-axis/client.ts create mode 100644 docs/data/charts/sparkline/demos/custom-y-axis/index.ts rename docs/data/charts/sparkline/{ => demos/npm-spark-line}/NpmSparkLine.tsx (94%) create mode 100644 docs/data/charts/sparkline/demos/npm-spark-line/client.ts create mode 100644 docs/data/charts/sparkline/demos/npm-spark-line/index.ts rename docs/data/charts/sparkline/{ => demos/sparkline-line-width}/SparklineLineWidth.tsx (93%) create mode 100644 docs/data/charts/sparkline/demos/sparkline-line-width/client.ts create mode 100644 docs/data/charts/sparkline/demos/sparkline-line-width/index.ts delete mode 100644 docs/data/charts/stacking/BasicStacking.js delete mode 100644 docs/data/charts/stacking/BasicStacking.tsx.preview delete mode 100644 docs/data/charts/stacking/StackOffsetDemo.js delete mode 100644 docs/data/charts/stacking/StackOrderDemo.js rename docs/data/charts/stacking/{ => demos/basic-stacking}/BasicStacking.tsx (91%) create mode 100644 docs/data/charts/stacking/demos/basic-stacking/client.ts create mode 100644 docs/data/charts/stacking/demos/basic-stacking/index.ts rename docs/data/charts/stacking/{ => demos/stack-offset-demo}/StackOffsetDemo.tsx (95%) create mode 100644 docs/data/charts/stacking/demos/stack-offset-demo/client.ts create mode 100644 docs/data/charts/stacking/demos/stack-offset-demo/index.ts rename docs/data/charts/stacking/{ => demos/stack-order-demo}/StackOrderDemo.tsx (96%) create mode 100644 docs/data/charts/stacking/demos/stack-order-demo/client.ts create mode 100644 docs/data/charts/stacking/demos/stack-order-demo/index.ts delete mode 100644 docs/data/charts/styling/BackgroundStyling.js delete mode 100644 docs/data/charts/styling/BackgroundStyling.tsx.preview delete mode 100644 docs/data/charts/styling/BasicColor.js delete mode 100644 docs/data/charts/styling/ColorCallback.js delete mode 100644 docs/data/charts/styling/ColorCallback.tsx.preview delete mode 100644 docs/data/charts/styling/ColorTemplate.js delete mode 100644 docs/data/charts/styling/CustomOverlay.js delete mode 100644 docs/data/charts/styling/CustomOverlay.tsx.preview delete mode 100644 docs/data/charts/styling/GradientTooltip.js delete mode 100644 docs/data/charts/styling/Margin.js delete mode 100644 docs/data/charts/styling/MuiColorTemplate.js delete mode 100644 docs/data/charts/styling/Overlay.js delete mode 100644 docs/data/charts/styling/Overlay.tsx.preview delete mode 100644 docs/data/charts/styling/OverlayWithAxis.js delete mode 100644 docs/data/charts/styling/SxStyling.js delete mode 100644 docs/data/charts/styling/TextStyling.js rename docs/data/charts/styling/{ => demos/background-styling}/BackgroundStyling.tsx (90%) create mode 100644 docs/data/charts/styling/demos/background-styling/client.ts create mode 100644 docs/data/charts/styling/demos/background-styling/index.ts rename docs/data/charts/styling/{ => demos/basic-color}/BasicColor.tsx (96%) create mode 100644 docs/data/charts/styling/demos/basic-color/client.ts create mode 100644 docs/data/charts/styling/demos/basic-color/index.ts rename docs/data/charts/styling/{ => demos/color-callback}/ColorCallback.tsx (92%) create mode 100644 docs/data/charts/styling/demos/color-callback/client.ts create mode 100644 docs/data/charts/styling/demos/color-callback/index.ts rename docs/data/charts/styling/{ => demos/color-template}/ColorTemplate.tsx (95%) create mode 100644 docs/data/charts/styling/demos/color-template/client.ts create mode 100644 docs/data/charts/styling/demos/color-template/index.ts rename docs/data/charts/styling/{ => demos/custom-overlay}/CustomOverlay.tsx (97%) create mode 100644 docs/data/charts/styling/demos/custom-overlay/client.ts create mode 100644 docs/data/charts/styling/demos/custom-overlay/index.ts rename docs/data/charts/styling/{ => demos/gradient-tooltip}/GradientTooltip.tsx (95%) create mode 100644 docs/data/charts/styling/demos/gradient-tooltip/client.ts create mode 100644 docs/data/charts/styling/demos/gradient-tooltip/index.ts rename docs/data/charts/styling/{ => demos/margin}/Margin.tsx (98%) create mode 100644 docs/data/charts/styling/demos/margin/client.ts create mode 100644 docs/data/charts/styling/demos/margin/index.ts rename docs/data/charts/styling/{ => demos/mui-color-template}/MuiColorTemplate.tsx (96%) create mode 100644 docs/data/charts/styling/demos/mui-color-template/client.ts create mode 100644 docs/data/charts/styling/demos/mui-color-template/index.ts rename docs/data/charts/styling/{ => demos/overlay-with-axis}/OverlayWithAxis.tsx (94%) create mode 100644 docs/data/charts/styling/demos/overlay-with-axis/client.ts create mode 100644 docs/data/charts/styling/demos/overlay-with-axis/index.ts rename docs/data/charts/styling/{ => demos/overlay}/Overlay.tsx (87%) create mode 100644 docs/data/charts/styling/demos/overlay/client.ts create mode 100644 docs/data/charts/styling/demos/overlay/index.ts rename docs/data/charts/styling/{ => demos/sx-styling}/SxStyling.tsx (97%) create mode 100644 docs/data/charts/styling/demos/sx-styling/client.ts create mode 100644 docs/data/charts/styling/demos/sx-styling/index.ts rename docs/data/charts/styling/{ => demos/text-styling}/TextStyling.tsx (96%) create mode 100644 docs/data/charts/styling/demos/text-styling/client.ts create mode 100644 docs/data/charts/styling/demos/text-styling/index.ts delete mode 100644 docs/data/charts/toolbar/ChartsToolbar.js delete mode 100644 docs/data/charts/toolbar/ChartsToolbar.tsx.preview delete mode 100644 docs/data/charts/toolbar/ChartsToolbarCustomElements.js delete mode 100644 docs/data/charts/toolbar/ChartsToolbarCustomElements.tsx.preview delete mode 100644 docs/data/charts/toolbar/ChartsToolbarCustomRangeButtons.js delete mode 100644 docs/data/charts/toolbar/ChartsToolbarCustomToolbar.js delete mode 100644 docs/data/charts/toolbar/ChartsToolbarOrdinalRangeButtons.js delete mode 100644 docs/data/charts/toolbar/ChartsToolbarRangeButtonValues.js delete mode 100644 docs/data/charts/toolbar/ChartsToolbarRangeButtons.js delete mode 100644 docs/data/charts/toolbar/ChartsToolbarRangeButtonsInitialSelection.js rename docs/data/charts/toolbar/{ => demos/charts-toolbar-custom-elements}/ChartsToolbarCustomElements.tsx (86%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-custom-elements/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-custom-elements/index.ts rename docs/data/charts/toolbar/{ => demos/charts-toolbar-custom-range-buttons}/ChartsToolbarCustomRangeButtons.tsx (91%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-custom-range-buttons/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-custom-range-buttons/index.ts rename docs/data/charts/toolbar/{ => demos/charts-toolbar-custom-toolbar}/ChartsToolbarCustomToolbar.tsx (94%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-custom-toolbar/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-custom-toolbar/index.ts rename docs/data/charts/toolbar/{ => demos/charts-toolbar-ordinal-range-buttons}/ChartsToolbarOrdinalRangeButtons.tsx (95%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-ordinal-range-buttons/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-ordinal-range-buttons/index.ts rename docs/data/charts/toolbar/{ => demos/charts-toolbar-range-button-values}/ChartsToolbarRangeButtonValues.tsx (90%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-range-button-values/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-range-button-values/index.ts rename docs/data/charts/toolbar/{ => demos/charts-toolbar-range-buttons-initial-selection}/ChartsToolbarRangeButtonsInitialSelection.tsx (89%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-range-buttons-initial-selection/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-range-buttons-initial-selection/index.ts rename docs/data/charts/toolbar/{ => demos/charts-toolbar-range-buttons}/ChartsToolbarRangeButtons.tsx (89%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-range-buttons/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar-range-buttons/index.ts rename docs/data/charts/toolbar/{ => demos/charts-toolbar}/ChartsToolbar.tsx (84%) create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar/client.ts create mode 100644 docs/data/charts/toolbar/demos/charts-toolbar/index.ts delete mode 100644 docs/data/charts/tooltip/AxisFormatter.js delete mode 100644 docs/data/charts/tooltip/AxisFormatter.tsx.preview delete mode 100644 docs/data/charts/tooltip/ControlledAxisTooltip.js delete mode 100644 docs/data/charts/tooltip/ControlledTooltip.js delete mode 100644 docs/data/charts/tooltip/CustomAxisTooltipContent.js delete mode 100644 docs/data/charts/tooltip/CustomTooltipContent.js delete mode 100644 docs/data/charts/tooltip/CustomTooltipPosition.js delete mode 100644 docs/data/charts/tooltip/Formatting.js delete mode 100644 docs/data/charts/tooltip/Formatting.tsx.preview delete mode 100644 docs/data/charts/tooltip/Interaction.js delete mode 100644 docs/data/charts/tooltip/Interaction.tsx.preview delete mode 100644 docs/data/charts/tooltip/SeriesFormatter.js delete mode 100644 docs/data/charts/tooltip/SeriesFormatter.tsx.preview delete mode 100644 docs/data/charts/tooltip/SortDemo.js delete mode 100644 docs/data/charts/tooltip/SyncTooltip.js delete mode 100644 docs/data/charts/tooltip/SynchronizedTooltip.js delete mode 100644 docs/data/charts/tooltip/TooltipPosition.js delete mode 100644 docs/data/charts/tooltip/TooltipStyle.js delete mode 100644 docs/data/charts/tooltip/TooltipStyle.tsx.preview rename docs/data/charts/tooltip/{ => demos/axis-formatter}/AxisFormatter.tsx (91%) create mode 100644 docs/data/charts/tooltip/demos/axis-formatter/client.ts create mode 100644 docs/data/charts/tooltip/demos/axis-formatter/index.ts rename docs/data/charts/tooltip/{ => demos/controlled-axis-tooltip}/ControlledAxisTooltip.tsx (91%) create mode 100644 docs/data/charts/tooltip/demos/controlled-axis-tooltip/client.ts create mode 100644 docs/data/charts/tooltip/demos/controlled-axis-tooltip/index.ts rename docs/data/charts/tooltip/{ => demos/controlled-tooltip}/ControlledTooltip.tsx (94%) create mode 100644 docs/data/charts/tooltip/demos/controlled-tooltip/client.ts create mode 100644 docs/data/charts/tooltip/demos/controlled-tooltip/index.ts rename docs/data/charts/tooltip/{ => demos/custom-axis-tooltip-content}/CustomAxisTooltipContent.tsx (87%) create mode 100644 docs/data/charts/tooltip/demos/custom-axis-tooltip-content/client.ts create mode 100644 docs/data/charts/tooltip/demos/custom-axis-tooltip-content/index.ts rename docs/data/charts/tooltip/{ => demos/custom-tooltip-content}/CustomTooltipContent.tsx (87%) create mode 100644 docs/data/charts/tooltip/demos/custom-tooltip-content/client.ts create mode 100644 docs/data/charts/tooltip/demos/custom-tooltip-content/index.ts rename docs/data/charts/tooltip/{ => demos/custom-tooltip-position}/CustomTooltipPosition.tsx (90%) create mode 100644 docs/data/charts/tooltip/demos/custom-tooltip-position/client.ts create mode 100644 docs/data/charts/tooltip/demos/custom-tooltip-position/index.ts rename docs/data/charts/tooltip/{ => demos/formatting}/Formatting.tsx (98%) create mode 100644 docs/data/charts/tooltip/demos/formatting/client.ts create mode 100644 docs/data/charts/tooltip/demos/formatting/index.ts rename docs/data/charts/tooltip/{ => demos/interaction}/Interaction.tsx (93%) create mode 100644 docs/data/charts/tooltip/demos/interaction/client.ts create mode 100644 docs/data/charts/tooltip/demos/interaction/index.ts rename docs/data/charts/tooltip/{ => demos/series-formatter}/SeriesFormatter.tsx (84%) create mode 100644 docs/data/charts/tooltip/demos/series-formatter/client.ts create mode 100644 docs/data/charts/tooltip/demos/series-formatter/index.ts rename docs/data/charts/tooltip/{ => demos/sort-demo}/SortDemo.tsx (97%) create mode 100644 docs/data/charts/tooltip/demos/sort-demo/client.ts create mode 100644 docs/data/charts/tooltip/demos/sort-demo/index.ts rename docs/data/charts/tooltip/{ => demos/sync-tooltip}/SyncTooltip.tsx (87%) create mode 100644 docs/data/charts/tooltip/demos/sync-tooltip/client.ts create mode 100644 docs/data/charts/tooltip/demos/sync-tooltip/index.ts rename docs/data/charts/tooltip/{ => demos/synchronized-tooltip}/SynchronizedTooltip.tsx (95%) create mode 100644 docs/data/charts/tooltip/demos/synchronized-tooltip/client.ts create mode 100644 docs/data/charts/tooltip/demos/synchronized-tooltip/index.ts rename docs/data/charts/tooltip/{ => demos/tooltip-position}/TooltipPosition.tsx (94%) create mode 100644 docs/data/charts/tooltip/demos/tooltip-position/client.ts create mode 100644 docs/data/charts/tooltip/demos/tooltip-position/index.ts rename docs/data/charts/tooltip/{ => demos/tooltip-style}/TooltipStyle.tsx (91%) create mode 100644 docs/data/charts/tooltip/demos/tooltip-style/client.ts create mode 100644 docs/data/charts/tooltip/demos/tooltip-style/index.ts delete mode 100644 docs/data/charts/zoom-and-pan/BrushZoom.js delete mode 100644 docs/data/charts/zoom-and-pan/ExternalZoomManagement.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomAndPanInteractions.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomBarChart.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomBarChart.tsx.preview delete mode 100644 docs/data/charts/zoom-and-pan/ZoomControlled.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomFilterMode.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomFilterMode.tsx.preview delete mode 100644 docs/data/charts/zoom-and-pan/ZoomHeatmap.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomInitialRange.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomKeyboard.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomKeyboard.tsx.preview delete mode 100644 docs/data/charts/zoom-and-pan/ZoomLineChart.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomLineChart.tsx.preview delete mode 100644 docs/data/charts/zoom-and-pan/ZoomOptions.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomScatterChart.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomScatterChart.tsx.preview delete mode 100644 docs/data/charts/zoom-and-pan/ZoomSlider.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomSliderComposition.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomSliderPreview.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomSliderPreviewCustomMarkerSize.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.js delete mode 100644 docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.tsx.preview delete mode 100644 docs/data/charts/zoom-and-pan/ZoomSliderTooltip.js rename docs/data/charts/zoom-and-pan/{ => demos/brush-zoom}/BrushZoom.tsx (95%) create mode 100644 docs/data/charts/zoom-and-pan/demos/brush-zoom/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/brush-zoom/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/external-zoom-management}/ExternalZoomManagement.tsx (90%) create mode 100644 docs/data/charts/zoom-and-pan/demos/external-zoom-management/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/external-zoom-management/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-and-pan-interactions}/ZoomAndPanInteractions.tsx (98%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-bar-chart}/ZoomBarChart.tsx (96%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-controlled}/ZoomControlled.tsx (91%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-controlled/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-controlled/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-filter-mode}/ZoomFilterMode.tsx (78%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-heatmap}/ZoomHeatmap.tsx (96%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-heatmap/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-heatmap/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-initial-range}/ZoomInitialRange.tsx (96%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-initial-range/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-initial-range/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-keyboard}/ZoomKeyboard.tsx (82%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-keyboard/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-keyboard/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-line-chart}/ZoomLineChart.tsx (96%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-line-chart/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-line-chart/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-options}/ZoomOptions.tsx (97%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-options/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-options/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-scatter-chart}/ZoomScatterChart.tsx (98%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-slider-composition}/ZoomSliderComposition.tsx (97%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-slider-preview-custom-marker-size}/ZoomSliderPreviewCustomMarkerSize.tsx (86%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-slider-preview-series-filter}/ZoomSliderPreviewSeriesFilter.tsx (82%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-slider-preview}/ZoomSliderPreview.tsx (88%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-slider-tooltip}/ZoomSliderTooltip.tsx (97%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/index.ts rename docs/data/charts/zoom-and-pan/{ => demos/zoom-slider}/ZoomSlider.tsx (96%) create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider/client.ts create mode 100644 docs/data/charts/zoom-and-pan/demos/zoom-slider/index.ts delete mode 100644 docs/data/chat/ai-and-agents/reasoning/ReasoningSlotsDemo.js delete mode 100644 docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.js delete mode 100644 docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.tsx.preview rename docs/data/chat/ai-and-agents/reasoning/{ => demos/reasoning-slots-demo}/ReasoningSlotsDemo.tsx (98%) create mode 100644 docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/client.ts create mode 100644 docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/index.ts rename docs/data/chat/ai-and-agents/reasoning/{ => demos/reasoning-streaming-demo}/ReasoningStreamingDemo.tsx (98%) create mode 100644 docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/client.ts create mode 100644 docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/index.ts delete mode 100644 docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.js delete mode 100644 docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.tsx.preview rename docs/data/chat/ai-and-agents/step-tracking/{ => demos/step-tracking-demo}/StepTrackingDemo.tsx (99%) create mode 100644 docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/client.ts create mode 100644 docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/index.ts delete mode 100644 docs/data/chat/ai-and-agents/tool-approval/ChatConfirmationPlayground.js delete mode 100644 docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.js delete mode 100644 docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.tsx.preview rename docs/data/chat/ai-and-agents/tool-approval/{ => demos/chat-confirmation-playground}/ChatConfirmationPlayground.tsx (93%) create mode 100644 docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/client.ts create mode 100644 docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/index.ts rename docs/data/chat/ai-and-agents/tool-approval/{ => demos/tool-approval-flow}/ToolApprovalFlow.tsx (98%) create mode 100644 docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/client.ts create mode 100644 docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/index.ts delete mode 100644 docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.js delete mode 100644 docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.tsx.preview delete mode 100644 docs/data/chat/ai-and-agents/tool-calling/ToolCardExpansionPlayground.js rename docs/data/chat/ai-and-agents/tool-calling/{ => demos/tool-calling-lifecycle}/ToolCallingLifecycle.tsx (99%) create mode 100644 docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/client.ts create mode 100644 docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/index.ts rename docs/data/chat/ai-and-agents/tool-calling/{ => demos/tool-card-expansion-playground}/ToolCardExpansionPlayground.tsx (97%) create mode 100644 docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/client.ts create mode 100644 docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/index.ts delete mode 100644 docs/data/chat/backend/adapters/MinimalAdapterDemo.js delete mode 100644 docs/data/chat/backend/adapters/MinimalAdapterDemo.tsx.preview rename docs/data/chat/backend/adapters/{ => demos/minimal-adapter-demo}/MinimalAdapterDemo.tsx (98%) create mode 100644 docs/data/chat/backend/adapters/demos/minimal-adapter-demo/client.ts create mode 100644 docs/data/chat/backend/adapters/demos/minimal-adapter-demo/index.ts delete mode 100644 docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.js delete mode 100644 docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.tsx.preview rename docs/data/chat/backend/building-an-adapter/{ => demos/manual-stream-adapter-demo}/ManualStreamAdapterDemo.tsx (98%) create mode 100644 docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/client.ts create mode 100644 docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/index.ts delete mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.js delete mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.tsx.preview delete mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.js delete mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.tsx.preview rename docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/{ => demos/ai-sdk-mock-stream-demo}/AiSdkMockStreamDemo.tsx (98%) create mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/client.ts create mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/index.ts rename docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/{ => demos/mui-docs-assistant-demo}/MuiDocsAssistantDemo.tsx (97%) create mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/client.ts create mode 100644 docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/index.ts delete mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.js delete mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.tsx.preview delete mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.js delete mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.tsx.preview rename docs/data/chat/backend/built-in-adapters/echo-adapter/{ => demos/echo-adapter-canned-replies}/EchoAdapterCannedReplies.tsx (96%) create mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/client.ts create mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/index.ts rename docs/data/chat/backend/built-in-adapters/echo-adapter/{ => demos/echo-adapter-demo}/EchoAdapterDemo.tsx (95%) create mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/client.ts create mode 100644 docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/index.ts delete mode 100644 docs/data/chat/backend/controlled-state/ControlledActiveConversation.js rename docs/data/chat/backend/controlled-state/{ => demos/controlled-active-conversation}/ControlledActiveConversation.tsx (98%) create mode 100644 docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/client.ts create mode 100644 docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/index.ts delete mode 100644 docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.js delete mode 100644 docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.tsx.preview delete mode 100644 docs/data/chat/basics/chatbox/ChatBoxPlayground.js rename docs/data/chat/basics/chatbox/{ => demos/chat-box-feature-flags}/ChatBoxFeatureFlags.tsx (98%) create mode 100644 docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/client.ts create mode 100644 docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/index.ts rename docs/data/chat/basics/chatbox/{ => demos/chat-box-playground}/ChatBoxPlayground.tsx (97%) create mode 100644 docs/data/chat/basics/chatbox/demos/chat-box-playground/client.ts create mode 100644 docs/data/chat/basics/chatbox/demos/chat-box-playground/index.ts delete mode 100644 docs/data/chat/basics/composer/ChatComposerPlayground.js delete mode 100644 docs/data/chat/basics/composer/ComposerControlledStandalone.js delete mode 100644 docs/data/chat/basics/composer/ComposerControlledStandalone.tsx.preview delete mode 100644 docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.js delete mode 100644 docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx delete mode 100644 docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx.preview delete mode 100644 docs/data/chat/basics/composer/ComposerDisabledStandalone.js delete mode 100644 docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx delete mode 100644 docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx.preview delete mode 100644 docs/data/chat/basics/composer/ComposerHelperTextStandalone.js delete mode 100644 docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx delete mode 100644 docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx.preview delete mode 100644 docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.js delete mode 100644 docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx delete mode 100644 docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx.preview delete mode 100644 docs/data/chat/basics/composer/ComposerHookStateStandalone.js delete mode 100644 docs/data/chat/basics/composer/ComposerHookStateStandalone.tsx.preview delete mode 100644 docs/data/chat/basics/composer/ComposerVariantsStandalone.js rename docs/data/chat/basics/composer/{ => demos/chat-composer-playground}/ChatComposerPlayground.tsx (97%) create mode 100644 docs/data/chat/basics/composer/demos/chat-composer-playground/client.ts create mode 100644 docs/data/chat/basics/composer/demos/chat-composer-playground/index.ts rename docs/data/chat/basics/composer/{ => demos/composer-controlled-standalone}/ComposerControlledStandalone.tsx (84%) create mode 100644 docs/data/chat/basics/composer/demos/composer-controlled-standalone/client.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-controlled-standalone/index.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/ComposerCustomPlaceholderStandalone.tsx create mode 100644 docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/client.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/index.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-disabled-standalone/ComposerDisabledStandalone.tsx create mode 100644 docs/data/chat/basics/composer/demos/composer-disabled-standalone/client.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-disabled-standalone/index.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-helper-text-standalone/ComposerHelperTextStandalone.tsx create mode 100644 docs/data/chat/basics/composer/demos/composer-helper-text-standalone/client.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-helper-text-standalone/index.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/ComposerHiddenAttachButtonStandalone.tsx create mode 100644 docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/client.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/index.ts rename docs/data/chat/basics/composer/{ => demos/composer-hook-state-standalone}/ComposerHookStateStandalone.tsx (91%) create mode 100644 docs/data/chat/basics/composer/demos/composer-hook-state-standalone/client.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-hook-state-standalone/index.ts rename docs/data/chat/basics/composer/{ => demos/composer-variants-standalone}/ComposerVariantsStandalone.tsx (97%) create mode 100644 docs/data/chat/basics/composer/demos/composer-variants-standalone/client.ts create mode 100644 docs/data/chat/basics/composer/demos/composer-variants-standalone/index.ts delete mode 100644 docs/data/chat/basics/conversation/ChatConversationPlayground.js delete mode 100644 docs/data/chat/basics/conversation/ConversationBasicStandalone.js rename docs/data/chat/basics/conversation/{ => demos/chat-conversation-playground}/ChatConversationPlayground.tsx (95%) create mode 100644 docs/data/chat/basics/conversation/demos/chat-conversation-playground/client.ts create mode 100644 docs/data/chat/basics/conversation/demos/chat-conversation-playground/index.ts rename docs/data/chat/basics/conversation/{ => demos/conversation-basic-standalone}/ConversationBasicStandalone.tsx (97%) create mode 100644 docs/data/chat/basics/conversation/demos/conversation-basic-standalone/client.ts create mode 100644 docs/data/chat/basics/conversation/demos/conversation-basic-standalone/index.ts delete mode 100644 docs/data/chat/basics/layout/LayoutRecomposedStandalone.js delete mode 100644 docs/data/chat/basics/layout/LayoutResponsiveStandalone.js delete mode 100644 docs/data/chat/basics/layout/LayoutThreadOnlyStandalone.js delete mode 100644 docs/data/chat/basics/layout/LayoutTwoPaneStandalone.js rename docs/data/chat/basics/layout/{ => demos/layout-recomposed-standalone}/LayoutRecomposedStandalone.tsx (98%) create mode 100644 docs/data/chat/basics/layout/demos/layout-recomposed-standalone/client.ts create mode 100644 docs/data/chat/basics/layout/demos/layout-recomposed-standalone/index.ts rename docs/data/chat/basics/layout/{ => demos/layout-responsive-standalone}/LayoutResponsiveStandalone.tsx (99%) create mode 100644 docs/data/chat/basics/layout/demos/layout-responsive-standalone/client.ts create mode 100644 docs/data/chat/basics/layout/demos/layout-responsive-standalone/index.ts rename docs/data/chat/basics/layout/{ => demos/layout-thread-only-standalone}/LayoutThreadOnlyStandalone.tsx (98%) create mode 100644 docs/data/chat/basics/layout/demos/layout-thread-only-standalone/client.ts create mode 100644 docs/data/chat/basics/layout/demos/layout-thread-only-standalone/index.ts rename docs/data/chat/basics/layout/{ => demos/layout-two-pane-standalone}/LayoutTwoPaneStandalone.tsx (98%) create mode 100644 docs/data/chat/basics/layout/demos/layout-two-pane-standalone/client.ts create mode 100644 docs/data/chat/basics/layout/demos/layout-two-pane-standalone/index.ts delete mode 100644 docs/data/chat/basics/messages/ChatMessageAuthorLabelPlayground.js delete mode 100644 docs/data/chat/basics/messages/ChatMessageAvatarPlayground.js delete mode 100644 docs/data/chat/basics/messages/ChatMessageContentPlayground.js delete mode 100644 docs/data/chat/basics/messages/ChatMessageGroupPlayground.js delete mode 100644 docs/data/chat/basics/messages/ChatMessageInlineMetaPlayground.js delete mode 100644 docs/data/chat/basics/messages/ChatMessageListPlayground.js delete mode 100644 docs/data/chat/basics/messages/ChatMessageMetaPlayground.js delete mode 100644 docs/data/chat/basics/messages/ChatMessagePlayground.js delete mode 100644 docs/data/chat/basics/messages/StandaloneMessages.js rename docs/data/chat/basics/messages/{ => demos/chat-message-author-label-playground}/ChatMessageAuthorLabelPlayground.tsx (92%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-author-label-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-author-label-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/chat-message-avatar-playground}/ChatMessageAvatarPlayground.tsx (93%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-avatar-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-avatar-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/chat-message-content-playground}/ChatMessageContentPlayground.tsx (94%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-content-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-content-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/chat-message-group-playground}/ChatMessageGroupPlayground.tsx (99%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-group-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-group-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/chat-message-inline-meta-playground}/ChatMessageInlineMetaPlayground.tsx (93%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/chat-message-list-playground}/ChatMessageListPlayground.tsx (96%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-list-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-list-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/chat-message-meta-playground}/ChatMessageMetaPlayground.tsx (93%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-meta-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-meta-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/chat-message-playground}/ChatMessagePlayground.tsx (96%) create mode 100644 docs/data/chat/basics/messages/demos/chat-message-playground/client.ts create mode 100644 docs/data/chat/basics/messages/demos/chat-message-playground/index.ts rename docs/data/chat/basics/messages/{ => demos/standalone-messages}/StandaloneMessages.tsx (94%) create mode 100644 docs/data/chat/basics/messages/demos/standalone-messages/client.ts create mode 100644 docs/data/chat/basics/messages/demos/standalone-messages/index.ts delete mode 100644 docs/data/chat/behavior/attachments/AttachmentValidation.js delete mode 100644 docs/data/chat/behavior/attachments/ChatComposerAttachButtonPlayground.js delete mode 100644 docs/data/chat/behavior/attachments/ChatComposerAttachmentListPlayground.js rename docs/data/chat/behavior/attachments/{ => demos/attachment-validation}/AttachmentValidation.tsx (97%) create mode 100644 docs/data/chat/behavior/attachments/demos/attachment-validation/client.ts create mode 100644 docs/data/chat/behavior/attachments/demos/attachment-validation/index.ts rename docs/data/chat/behavior/attachments/{ => demos/chat-composer-attach-button-playground}/ChatComposerAttachButtonPlayground.tsx (93%) create mode 100644 docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/client.ts create mode 100644 docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/index.ts rename docs/data/chat/behavior/attachments/{ => demos/chat-composer-attachment-list-playground}/ChatComposerAttachmentListPlayground.tsx (91%) create mode 100644 docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/client.ts create mode 100644 docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/index.ts delete mode 100644 docs/data/chat/behavior/error-handling/ChatMessageErrorPlayground.js delete mode 100644 docs/data/chat/behavior/error-handling/RetryRecovery.js rename docs/data/chat/behavior/error-handling/{ => demos/chat-message-error-playground}/ChatMessageErrorPlayground.tsx (95%) create mode 100644 docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/client.ts create mode 100644 docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/index.ts rename docs/data/chat/behavior/error-handling/{ => demos/retry-recovery}/RetryRecovery.tsx (98%) create mode 100644 docs/data/chat/behavior/error-handling/demos/retry-recovery/client.ts create mode 100644 docs/data/chat/behavior/error-handling/demos/retry-recovery/index.ts delete mode 100644 docs/data/chat/behavior/scrolling/AutoScrollBuffer.js delete mode 100644 docs/data/chat/behavior/scrolling/ChatScrollToBottomAffordancePlayground.js rename docs/data/chat/behavior/scrolling/{ => demos/auto-scroll-buffer}/AutoScrollBuffer.tsx (98%) create mode 100644 docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/client.ts create mode 100644 docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/index.ts rename docs/data/chat/behavior/scrolling/{ => demos/chat-scroll-to-bottom-affordance-playground}/ChatScrollToBottomAffordancePlayground.tsx (94%) create mode 100644 docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/client.ts create mode 100644 docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/index.ts delete mode 100644 docs/data/chat/behavior/streaming/ChatStreamingIndicatorDemo.js delete mode 100644 docs/data/chat/behavior/streaming/ChatStreamingPlayground.js rename docs/data/chat/behavior/streaming/{ => demos/chat-streaming-indicator-demo}/ChatStreamingIndicatorDemo.tsx (99%) create mode 100644 docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/client.ts create mode 100644 docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/index.ts rename docs/data/chat/behavior/streaming/{ => demos/chat-streaming-playground}/ChatStreamingPlayground.tsx (99%) create mode 100644 docs/data/chat/behavior/streaming/demos/chat-streaming-playground/client.ts create mode 100644 docs/data/chat/behavior/streaming/demos/chat-streaming-playground/index.ts delete mode 100644 docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.js delete mode 100644 docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.tsx.preview delete mode 100644 docs/data/chat/behavior/suggestions/ChatSuggestionsPlayground.js delete mode 100644 docs/data/chat/behavior/suggestions/SuggestionsAboveComposer.js delete mode 100644 docs/data/chat/behavior/suggestions/SuggestionsWithLabels.js rename docs/data/chat/behavior/suggestions/{ => demos/auto-submit-suggestions}/AutoSubmitSuggestions.tsx (94%) create mode 100644 docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/client.ts create mode 100644 docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/index.ts rename docs/data/chat/behavior/suggestions/{ => demos/chat-suggestions-playground}/ChatSuggestionsPlayground.tsx (94%) create mode 100644 docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/client.ts create mode 100644 docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/index.ts rename docs/data/chat/behavior/suggestions/{ => demos/suggestions-above-composer}/SuggestionsAboveComposer.tsx (94%) create mode 100644 docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/client.ts create mode 100644 docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/index.ts rename docs/data/chat/behavior/suggestions/{ => demos/suggestions-with-labels}/SuggestionsWithLabels.tsx (96%) create mode 100644 docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/client.ts create mode 100644 docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/index.ts delete mode 100644 docs/data/chat/behavior/typing-indicators/ChatTypingIndicatorPlayground.js rename docs/data/chat/behavior/typing-indicators/{ => demos/chat-typing-indicator-playground}/ChatTypingIndicatorPlayground.tsx (91%) create mode 100644 docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/client.ts create mode 100644 docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/index.ts delete mode 100644 docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.js delete mode 100644 docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.tsx.preview rename docs/data/chat/core/examples/advanced-store-access/{ => demos/advanced-store-access-headless-chat}/AdvancedStoreAccessHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/composer/ComposerHeadlessChat.js delete mode 100644 docs/data/chat/core/examples/composer/ComposerHeadlessChat.tsx.preview rename docs/data/chat/core/examples/composer/{ => demos/composer-headless-chat}/ComposerHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/core/examples/composer/demos/composer-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/composer/demos/composer-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat.js rename docs/data/chat/core/examples/controlled-state/{ => demos/controlled-state-headless-chat}/ControlledStateHeadlessChat.tsx (97%) create mode 100644 docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.js delete mode 100644 docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.tsx.preview rename docs/data/chat/core/examples/minimal-chat/{ => demos/minimal-headless-chat}/MinimalHeadlessChat.tsx (96%) create mode 100644 docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.js delete mode 100644 docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.tsx.preview rename docs/data/chat/core/examples/realtime-thread-sync/{ => demos/realtime-thread-sync-headless-chat}/RealtimeThreadSyncHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.js delete mode 100644 docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.tsx.preview rename docs/data/chat/core/examples/realtime/{ => demos/realtime-headless-chat}/RealtimeHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/selector-driven-thread/SelectorDrivenThread.js rename docs/data/chat/core/examples/selector-driven-thread/{ => demos/selector-driven-thread}/SelectorDrivenThread.tsx (97%) create mode 100644 docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/client.ts create mode 100644 docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/index.ts delete mode 100644 docs/data/chat/core/examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.js rename docs/data/chat/core/examples/streaming-lifecycle/{ => demos/streaming-lifecycle-headless-chat}/StreamingLifecycleHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.js delete mode 100644 docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.tsx.preview rename docs/data/chat/core/examples/tool-approval-and-renderers/{ => demos/tool-approval-and-renderers-headless-chat}/ToolApprovalAndRenderersHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/tool-call-events/ToolCallEventsHeadlessChat.js rename docs/data/chat/core/examples/tool-call-events/{ => demos/tool-call-events-headless-chat}/ToolCallEventsHeadlessChat.tsx (97%) create mode 100644 docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/index.ts delete mode 100644 docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.js delete mode 100644 docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.tsx.preview rename docs/data/chat/core/examples/type-augmentation/{ => demos/type-augmentation-headless-chat}/TypeAugmentationHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/client.ts create mode 100644 docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/index.ts delete mode 100644 docs/data/chat/customization/look-and-feel/ComposerVariantsDemo.js delete mode 100644 docs/data/chat/customization/look-and-feel/DensityComparisonDemo.js delete mode 100644 docs/data/chat/customization/look-and-feel/DensityComparisonDemo.tsx.preview delete mode 100644 docs/data/chat/customization/look-and-feel/LookAndFeelPlayground.js delete mode 100644 docs/data/chat/customization/look-and-feel/MessageStatesDemo.js delete mode 100644 docs/data/chat/customization/look-and-feel/MessageVariantsDemo.js delete mode 100644 docs/data/chat/customization/look-and-feel/MessageVariantsDemo.tsx.preview delete mode 100644 docs/data/chat/customization/look-and-feel/ThemeAndSlotsDemo.js rename docs/data/chat/customization/look-and-feel/{ => demos/composer-variants-demo}/ComposerVariantsDemo.tsx (97%) create mode 100644 docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/client.ts create mode 100644 docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/index.ts rename docs/data/chat/customization/look-and-feel/{ => demos/density-comparison-demo}/DensityComparisonDemo.tsx (97%) create mode 100644 docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/client.ts create mode 100644 docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/index.ts rename docs/data/chat/customization/look-and-feel/{ => demos/look-and-feel-playground}/LookAndFeelPlayground.tsx (99%) create mode 100644 docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/client.ts create mode 100644 docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/index.ts rename docs/data/chat/customization/look-and-feel/{ => demos/message-states-demo}/MessageStatesDemo.tsx (98%) create mode 100644 docs/data/chat/customization/look-and-feel/demos/message-states-demo/client.ts create mode 100644 docs/data/chat/customization/look-and-feel/demos/message-states-demo/index.ts rename docs/data/chat/customization/look-and-feel/{ => demos/message-variants-demo}/MessageVariantsDemo.tsx (97%) create mode 100644 docs/data/chat/customization/look-and-feel/demos/message-variants-demo/client.ts create mode 100644 docs/data/chat/customization/look-and-feel/demos/message-variants-demo/index.ts rename docs/data/chat/customization/look-and-feel/{ => demos/theme-and-slots-demo}/ThemeAndSlotsDemo.tsx (97%) create mode 100644 docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/client.ts create mode 100644 docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/index.ts delete mode 100644 docs/data/chat/customization/overview/EightyTwentyDemo.js rename docs/data/chat/customization/overview/{ => demos/eighty-twenty-demo}/EightyTwentyDemo.tsx (97%) create mode 100644 docs/data/chat/customization/overview/demos/eighty-twenty-demo/client.ts create mode 100644 docs/data/chat/customization/overview/demos/eighty-twenty-demo/index.ts delete mode 100644 docs/data/chat/customization/structure/StructureRecipes.js delete mode 100644 docs/data/chat/customization/structure/StructureRecipes.tsx.preview rename docs/data/chat/customization/structure/{ => demos/structure-recipes}/StructureRecipes.tsx (96%) create mode 100644 docs/data/chat/customization/structure/demos/structure-recipes/client.ts create mode 100644 docs/data/chat/customization/structure/demos/structure-recipes/index.ts delete mode 100644 docs/data/chat/display/date-divider/ChatDateDividerPlayground.js delete mode 100644 docs/data/chat/display/date-divider/DateDividerByWeek.js rename docs/data/chat/display/date-divider/{ => demos/chat-date-divider-playground}/ChatDateDividerPlayground.tsx (95%) create mode 100644 docs/data/chat/display/date-divider/demos/chat-date-divider-playground/client.ts create mode 100644 docs/data/chat/display/date-divider/demos/chat-date-divider-playground/index.ts rename docs/data/chat/display/date-divider/{ => demos/date-divider-by-week}/DateDividerByWeek.tsx (98%) create mode 100644 docs/data/chat/display/date-divider/demos/date-divider-by-week/client.ts create mode 100644 docs/data/chat/display/date-divider/demos/date-divider-by-week/index.ts delete mode 100644 docs/data/chat/display/loading-and-empty-states/ChatMessageSkeletonPlayground.js delete mode 100644 docs/data/chat/display/loading-and-empty-states/CustomEmptyState.js delete mode 100644 docs/data/chat/display/loading-and-empty-states/LoadingSkeletonInList.js rename docs/data/chat/display/loading-and-empty-states/{ => demos/chat-message-skeleton-playground}/ChatMessageSkeletonPlayground.tsx (86%) create mode 100644 docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/client.ts create mode 100644 docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/index.ts rename docs/data/chat/display/loading-and-empty-states/{ => demos/custom-empty-state}/CustomEmptyState.tsx (98%) create mode 100644 docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/client.ts create mode 100644 docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/index.ts rename docs/data/chat/display/loading-and-empty-states/{ => demos/loading-skeleton-in-list}/LoadingSkeletonInList.tsx (98%) create mode 100644 docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/client.ts create mode 100644 docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/index.ts delete mode 100644 docs/data/chat/display/message-actions/BasicMessageActions.js delete mode 100644 docs/data/chat/display/message-actions/BasicMessageActions.tsx.preview delete mode 100644 docs/data/chat/display/message-actions/ChatMessageActionsPlayground.js delete mode 100644 docs/data/chat/display/message-actions/ExtraActionsMessageActions.js delete mode 100644 docs/data/chat/display/message-actions/RoleBasedMessageActions.js delete mode 100644 docs/data/chat/display/message-actions/RoleBasedMessageActions.tsx.preview rename docs/data/chat/display/message-actions/{ => demos/basic-message-actions}/BasicMessageActions.tsx (96%) create mode 100644 docs/data/chat/display/message-actions/demos/basic-message-actions/client.ts create mode 100644 docs/data/chat/display/message-actions/demos/basic-message-actions/index.ts rename docs/data/chat/display/message-actions/{ => demos/chat-message-actions-playground}/ChatMessageActionsPlayground.tsx (95%) create mode 100644 docs/data/chat/display/message-actions/demos/chat-message-actions-playground/client.ts create mode 100644 docs/data/chat/display/message-actions/demos/chat-message-actions-playground/index.ts rename docs/data/chat/display/message-actions/{ => demos/extra-actions-message-actions}/ExtraActionsMessageActions.tsx (96%) create mode 100644 docs/data/chat/display/message-actions/demos/extra-actions-message-actions/client.ts create mode 100644 docs/data/chat/display/message-actions/demos/extra-actions-message-actions/index.ts rename docs/data/chat/display/message-actions/{ => demos/role-based-message-actions}/RoleBasedMessageActions.tsx (97%) create mode 100644 docs/data/chat/display/message-actions/demos/role-based-message-actions/client.ts create mode 100644 docs/data/chat/display/message-actions/demos/role-based-message-actions/index.ts delete mode 100644 docs/data/chat/display/message-parts/code-blocks/ChatCodeBlockPlayground.js rename docs/data/chat/display/message-parts/code-blocks/{ => demos/chat-code-block-playground}/ChatCodeBlockPlayground.tsx (94%) create mode 100644 docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/client.ts create mode 100644 docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/index.ts delete mode 100644 docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.js delete mode 100644 docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.tsx.preview rename docs/data/chat/display/message-parts/custom-parts/{ => demos/custom-data-part-chat}/CustomDataPartChat.tsx (98%) create mode 100644 docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/client.ts create mode 100644 docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/index.ts delete mode 100644 docs/data/chat/display/message-parts/files-and-images/ChatFilePartCustomizationDemo.js delete mode 100644 docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.js delete mode 100644 docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.tsx.preview rename docs/data/chat/display/message-parts/files-and-images/{ => demos/chat-file-part-customization-demo}/ChatFilePartCustomizationDemo.tsx (97%) create mode 100644 docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/client.ts create mode 100644 docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/index.ts rename docs/data/chat/display/message-parts/files-and-images/{ => demos/chat-file-parts-demo}/ChatFilePartsDemo.tsx (97%) create mode 100644 docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/client.ts create mode 100644 docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/index.ts delete mode 100644 docs/data/chat/display/message-parts/sources-and-citations/ChatMessageSourcesPlayground.js delete mode 100644 docs/data/chat/display/message-parts/sources-and-citations/SourcePartsDemo.js rename docs/data/chat/display/message-parts/sources-and-citations/{ => demos/chat-message-sources-playground}/ChatMessageSourcesPlayground.tsx (91%) create mode 100644 docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/client.ts create mode 100644 docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/index.ts rename docs/data/chat/display/message-parts/sources-and-citations/{ => demos/source-parts-demo}/SourcePartsDemo.tsx (97%) create mode 100644 docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/client.ts create mode 100644 docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/index.ts delete mode 100644 docs/data/chat/display/message-parts/text-and-markdown/MarkdownPlayground.js delete mode 100644 docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.js delete mode 100644 docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.tsx.preview rename docs/data/chat/display/message-parts/text-and-markdown/{ => demos/markdown-playground}/MarkdownPlayground.tsx (98%) create mode 100644 docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/client.ts create mode 100644 docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/index.ts rename docs/data/chat/display/message-parts/text-and-markdown/{ => demos/streaming-markdown}/StreamingMarkdown.tsx (97%) create mode 100644 docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/client.ts create mode 100644 docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/index.ts delete mode 100644 docs/data/chat/display/unread-marker/ChatUnreadMarkerPlayground.js delete mode 100644 docs/data/chat/display/unread-marker/UnreadMarkerStandalone.js delete mode 100644 docs/data/chat/display/unread-marker/UnreadMarkerStandalone.tsx.preview rename docs/data/chat/display/unread-marker/{ => demos/chat-unread-marker-playground}/ChatUnreadMarkerPlayground.tsx (94%) create mode 100644 docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/client.ts create mode 100644 docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/index.ts rename docs/data/chat/display/unread-marker/{ => demos/unread-marker-standalone}/UnreadMarkerStandalone.tsx (97%) create mode 100644 docs/data/chat/display/unread-marker/demos/unread-marker-standalone/client.ts create mode 100644 docs/data/chat/display/unread-marker/demos/unread-marker-standalone/index.ts delete mode 100644 docs/data/chat/headless/examples/chatgpt-style/ChatGptStyleChat.js rename docs/data/chat/headless/examples/chatgpt-style/{ => demos/chat-gpt-style-chat}/ChatGptStyleChat.tsx (99%) create mode 100644 docs/data/chat/headless/examples/chatgpt-style/demos/chat-gpt-style-chat/client.ts create mode 100644 docs/data/chat/headless/examples/chatgpt-style/demos/chat-gpt-style-chat/index.ts delete mode 100644 docs/data/chat/headless/examples/composer-with-attachments/ComposerWithAttachments.js rename docs/data/chat/headless/examples/composer-with-attachments/{ => demos/composer-with-attachments}/ComposerWithAttachments.tsx (99%) create mode 100644 docs/data/chat/headless/examples/composer-with-attachments/demos/composer-with-attachments/client.ts create mode 100644 docs/data/chat/headless/examples/composer-with-attachments/demos/composer-with-attachments/index.ts delete mode 100644 docs/data/chat/headless/examples/custom-message-part-rendering/CustomMessagePartRendering.js rename docs/data/chat/headless/examples/custom-message-part-rendering/{ => demos/custom-message-part-rendering}/CustomMessagePartRendering.tsx (99%) create mode 100644 docs/data/chat/headless/examples/custom-message-part-rendering/demos/custom-message-part-rendering/client.ts create mode 100644 docs/data/chat/headless/examples/custom-message-part-rendering/demos/custom-message-part-rendering/index.ts delete mode 100644 docs/data/chat/headless/examples/grouped-message-timeline/GroupedMessageTimeline.js rename docs/data/chat/headless/examples/grouped-message-timeline/{ => demos/grouped-message-timeline}/GroupedMessageTimeline.tsx (99%) create mode 100644 docs/data/chat/headless/examples/grouped-message-timeline/demos/grouped-message-timeline/client.ts create mode 100644 docs/data/chat/headless/examples/grouped-message-timeline/demos/grouped-message-timeline/index.ts delete mode 100644 docs/data/chat/headless/examples/indicators-in-context/IndicatorsInContext.js rename docs/data/chat/headless/examples/indicators-in-context/{ => demos/indicators-in-context}/IndicatorsInContext.tsx (99%) create mode 100644 docs/data/chat/headless/examples/indicators-in-context/demos/indicators-in-context/client.ts create mode 100644 docs/data/chat/headless/examples/indicators-in-context/demos/indicators-in-context/index.ts delete mode 100644 docs/data/chat/headless/examples/intercom-style/IntercomStyleChat.js rename docs/data/chat/headless/examples/intercom-style/{ => demos/intercom-style-chat}/IntercomStyleChat.tsx (99%) create mode 100644 docs/data/chat/headless/examples/intercom-style/demos/intercom-style-chat/client.ts create mode 100644 docs/data/chat/headless/examples/intercom-style/demos/intercom-style-chat/index.ts delete mode 100644 docs/data/chat/headless/examples/minimal-shell/MinimalUnstyledShell.js rename docs/data/chat/headless/examples/minimal-shell/{ => demos/minimal-unstyled-shell}/MinimalUnstyledShell.tsx (98%) create mode 100644 docs/data/chat/headless/examples/minimal-shell/demos/minimal-unstyled-shell/client.ts create mode 100644 docs/data/chat/headless/examples/minimal-shell/demos/minimal-unstyled-shell/index.ts delete mode 100644 docs/data/chat/headless/examples/slot-customization/SlotCustomization.js rename docs/data/chat/headless/examples/slot-customization/{ => demos/slot-customization}/SlotCustomization.tsx (99%) create mode 100644 docs/data/chat/headless/examples/slot-customization/demos/slot-customization/client.ts create mode 100644 docs/data/chat/headless/examples/slot-customization/demos/slot-customization/index.ts delete mode 100644 docs/data/chat/headless/examples/two-pane-inbox/TwoPaneInbox.js rename docs/data/chat/headless/examples/two-pane-inbox/{ => demos/two-pane-inbox}/TwoPaneInbox.tsx (99%) create mode 100644 docs/data/chat/headless/examples/two-pane-inbox/demos/two-pane-inbox/client.ts create mode 100644 docs/data/chat/headless/examples/two-pane-inbox/demos/two-pane-inbox/index.ts delete mode 100644 docs/data/chat/material/composer/CompactComposerIdeas.js delete mode 100644 docs/data/chat/material/composer/CompactComposerIdeas.tsx.preview delete mode 100644 docs/data/chat/material/composer/ComposerControlled.js delete mode 100644 docs/data/chat/material/composer/ComposerCustomPlaceholder.js delete mode 100644 docs/data/chat/material/composer/ComposerCustomPlaceholder.tsx.preview delete mode 100644 docs/data/chat/material/composer/ComposerDisabled.js delete mode 100644 docs/data/chat/material/composer/ComposerDisabled.tsx.preview delete mode 100644 docs/data/chat/material/composer/ComposerHiddenAttachButton.js delete mode 100644 docs/data/chat/material/composer/ComposerHiddenAttachButton.tsx.preview rename docs/data/chat/material/composer/{ => demos/compact-composer-ideas}/CompactComposerIdeas.tsx (99%) create mode 100644 docs/data/chat/material/composer/demos/compact-composer-ideas/client.ts create mode 100644 docs/data/chat/material/composer/demos/compact-composer-ideas/index.ts rename docs/data/chat/material/composer/{ => demos/composer-controlled}/ComposerControlled.tsx (96%) create mode 100644 docs/data/chat/material/composer/demos/composer-controlled/client.ts create mode 100644 docs/data/chat/material/composer/demos/composer-controlled/index.ts rename docs/data/chat/material/composer/{ => demos/composer-custom-placeholder}/ComposerCustomPlaceholder.tsx (94%) create mode 100644 docs/data/chat/material/composer/demos/composer-custom-placeholder/client.ts create mode 100644 docs/data/chat/material/composer/demos/composer-custom-placeholder/index.ts rename docs/data/chat/material/composer/{ => demos/composer-disabled}/ComposerDisabled.tsx (94%) create mode 100644 docs/data/chat/material/composer/demos/composer-disabled/client.ts create mode 100644 docs/data/chat/material/composer/demos/composer-disabled/index.ts rename docs/data/chat/material/composer/{ => demos/composer-hidden-attach-button}/ComposerHiddenAttachButton.tsx (93%) create mode 100644 docs/data/chat/material/composer/demos/composer-hidden-attach-button/client.ts create mode 100644 docs/data/chat/material/composer/demos/composer-hidden-attach-button/index.ts delete mode 100644 docs/data/chat/material/context/ChatBoxWithHooks.js delete mode 100644 docs/data/chat/material/context/ChatBoxWithHooks.tsx.preview delete mode 100644 docs/data/chat/material/context/ChatProviderCustomLayout.js delete mode 100644 docs/data/chat/material/context/MultipleInstances.js rename docs/data/chat/material/context/{ => demos/chat-box-with-hooks}/ChatBoxWithHooks.tsx (95%) create mode 100644 docs/data/chat/material/context/demos/chat-box-with-hooks/client.ts create mode 100644 docs/data/chat/material/context/demos/chat-box-with-hooks/index.ts rename docs/data/chat/material/context/{ => demos/chat-provider-custom-layout}/ChatProviderCustomLayout.tsx (98%) create mode 100644 docs/data/chat/material/context/demos/chat-provider-custom-layout/client.ts create mode 100644 docs/data/chat/material/context/demos/chat-provider-custom-layout/index.ts rename docs/data/chat/material/context/{ => demos/multiple-instances}/MultipleInstances.tsx (98%) create mode 100644 docs/data/chat/material/context/demos/multiple-instances/client.ts create mode 100644 docs/data/chat/material/context/demos/multiple-instances/index.ts delete mode 100644 docs/data/chat/material/conversation-list/CompactRow.js delete mode 100644 docs/data/chat/material/conversation-list/FullCustomRow.js delete mode 100644 docs/data/chat/material/conversation-list/RichItemContent.js delete mode 100644 docs/data/chat/material/conversation-list/ThemedAvatar.js rename docs/data/chat/material/conversation-list/{ => demos/compact-row}/CompactRow.tsx (98%) create mode 100644 docs/data/chat/material/conversation-list/demos/compact-row/client.ts create mode 100644 docs/data/chat/material/conversation-list/demos/compact-row/index.ts rename docs/data/chat/material/conversation-list/{ => demos/full-custom-row}/FullCustomRow.tsx (99%) create mode 100644 docs/data/chat/material/conversation-list/demos/full-custom-row/client.ts create mode 100644 docs/data/chat/material/conversation-list/demos/full-custom-row/index.ts rename docs/data/chat/material/conversation-list/{ => demos/rich-item-content}/RichItemContent.tsx (98%) create mode 100644 docs/data/chat/material/conversation-list/demos/rich-item-content/client.ts create mode 100644 docs/data/chat/material/conversation-list/demos/rich-item-content/index.ts rename docs/data/chat/material/conversation-list/{ => demos/themed-avatar}/ThemedAvatar.tsx (98%) create mode 100644 docs/data/chat/material/conversation-list/demos/themed-avatar/client.ts create mode 100644 docs/data/chat/material/conversation-list/demos/themed-avatar/index.ts delete mode 100644 docs/data/chat/material/examples/agentic-code/AgenticCode.js delete mode 100644 docs/data/chat/material/examples/agentic-code/ToolStylingA.js delete mode 100644 docs/data/chat/material/examples/agentic-code/ToolStylingB.js delete mode 100644 docs/data/chat/material/examples/agentic-code/ToolStylingC.js rename docs/data/chat/material/examples/agentic-code/{ => demos/agentic-code}/AgenticCode.tsx (99%) create mode 100644 docs/data/chat/material/examples/agentic-code/demos/agentic-code/client.ts create mode 100644 docs/data/chat/material/examples/agentic-code/demos/agentic-code/index.ts rename docs/data/chat/material/examples/agentic-code/{ => demos/tool-styling-a}/ToolStylingA.tsx (99%) create mode 100644 docs/data/chat/material/examples/agentic-code/demos/tool-styling-a/client.ts create mode 100644 docs/data/chat/material/examples/agentic-code/demos/tool-styling-a/index.ts rename docs/data/chat/material/examples/agentic-code/{ => demos/tool-styling-b}/ToolStylingB.tsx (99%) create mode 100644 docs/data/chat/material/examples/agentic-code/demos/tool-styling-b/client.ts create mode 100644 docs/data/chat/material/examples/agentic-code/demos/tool-styling-b/index.ts rename docs/data/chat/material/examples/agentic-code/{ => demos/tool-styling-c}/ToolStylingC.tsx (99%) create mode 100644 docs/data/chat/material/examples/agentic-code/demos/tool-styling-c/client.ts create mode 100644 docs/data/chat/material/examples/agentic-code/demos/tool-styling-c/index.ts delete mode 100644 docs/data/chat/material/examples/basic-ai-chat/BasicAiChat.js delete mode 100644 docs/data/chat/material/examples/basic-ai-chat/BasicAiChat.tsx.preview rename docs/data/chat/material/examples/basic-ai-chat/{ => demos/basic-ai-chat}/BasicAiChat.tsx (93%) create mode 100644 docs/data/chat/material/examples/basic-ai-chat/demos/basic-ai-chat/client.ts create mode 100644 docs/data/chat/material/examples/basic-ai-chat/demos/basic-ai-chat/index.ts delete mode 100644 docs/data/chat/material/examples/code-block/CodeBlock.js rename docs/data/chat/material/examples/code-block/{ => demos/code-block}/CodeBlock.tsx (98%) create mode 100644 docs/data/chat/material/examples/code-block/demos/code-block/client.ts create mode 100644 docs/data/chat/material/examples/code-block/demos/code-block/index.ts delete mode 100644 docs/data/chat/material/examples/compact-variant/CompactVariant.js delete mode 100644 docs/data/chat/material/examples/compact-variant/CompactVariant.tsx create mode 100644 docs/data/chat/material/examples/compact-variant/demos/compact-variant/CompactVariant.tsx create mode 100644 docs/data/chat/material/examples/compact-variant/demos/compact-variant/client.ts create mode 100644 docs/data/chat/material/examples/compact-variant/demos/compact-variant/index.ts delete mode 100644 docs/data/chat/material/examples/confirmation/Confirmation.js rename docs/data/chat/material/examples/confirmation/{ => demos/confirmation}/Confirmation.tsx (98%) create mode 100644 docs/data/chat/material/examples/confirmation/demos/confirmation/client.ts create mode 100644 docs/data/chat/material/examples/confirmation/demos/confirmation/index.ts delete mode 100644 docs/data/chat/material/examples/custom-theme/CustomTheme.js delete mode 100644 docs/data/chat/material/examples/custom-theme/CustomTheme.tsx.preview rename docs/data/chat/material/examples/custom-theme/{ => demos/custom-theme}/CustomTheme.tsx (96%) create mode 100644 docs/data/chat/material/examples/custom-theme/demos/custom-theme/client.ts create mode 100644 docs/data/chat/material/examples/custom-theme/demos/custom-theme/index.ts delete mode 100644 docs/data/chat/material/examples/empty-state/EmptyState.js delete mode 100644 docs/data/chat/material/examples/empty-state/EmptyState.tsx.preview rename docs/data/chat/material/examples/empty-state/{ => demos/empty-state}/EmptyState.tsx (95%) create mode 100644 docs/data/chat/material/examples/empty-state/demos/empty-state/client.ts create mode 100644 docs/data/chat/material/examples/empty-state/demos/empty-state/index.ts delete mode 100644 docs/data/chat/material/examples/error-state/ErrorState.js rename docs/data/chat/material/examples/error-state/{ => demos/error-state}/ErrorState.tsx (97%) create mode 100644 docs/data/chat/material/examples/error-state/demos/error-state/client.ts create mode 100644 docs/data/chat/material/examples/error-state/demos/error-state/index.ts delete mode 100644 docs/data/chat/material/examples/long-messages/LongMessages.js delete mode 100644 docs/data/chat/material/examples/long-messages/LongMessages.tsx.preview rename docs/data/chat/material/examples/long-messages/{ => demos/long-messages}/LongMessages.tsx (98%) create mode 100644 docs/data/chat/material/examples/long-messages/demos/long-messages/client.ts create mode 100644 docs/data/chat/material/examples/long-messages/demos/long-messages/index.ts delete mode 100644 docs/data/chat/material/examples/many-messages/ManyMessages.js delete mode 100644 docs/data/chat/material/examples/many-messages/ManyMessages.tsx.preview rename docs/data/chat/material/examples/many-messages/{ => demos/many-messages}/ManyMessages.tsx (97%) create mode 100644 docs/data/chat/material/examples/many-messages/demos/many-messages/client.ts create mode 100644 docs/data/chat/material/examples/many-messages/demos/many-messages/index.ts delete mode 100644 docs/data/chat/material/examples/message-feed/MessageFeed.js rename docs/data/chat/material/examples/message-feed/{ => demos/message-feed}/MessageFeed.tsx (98%) create mode 100644 docs/data/chat/material/examples/message-feed/demos/message-feed/client.ts create mode 100644 docs/data/chat/material/examples/message-feed/demos/message-feed/index.ts delete mode 100644 docs/data/chat/material/examples/model-selector/ModelSelector.js delete mode 100644 docs/data/chat/material/examples/model-selector/ModelSelector.tsx.preview rename docs/data/chat/material/examples/model-selector/{ => demos/model-selector}/ModelSelector.tsx (90%) create mode 100644 docs/data/chat/material/examples/model-selector/demos/model-selector/client.ts create mode 100644 docs/data/chat/material/examples/model-selector/demos/model-selector/index.ts delete mode 100644 docs/data/chat/material/examples/multi-conversation/MultiConversation.js rename docs/data/chat/material/examples/multi-conversation/{ => demos/multi-conversation}/MultiConversation.tsx (97%) create mode 100644 docs/data/chat/material/examples/multi-conversation/demos/multi-conversation/client.ts create mode 100644 docs/data/chat/material/examples/multi-conversation/demos/multi-conversation/index.ts delete mode 100644 docs/data/chat/material/examples/no-conversation-history/NoConversationHistory.js rename docs/data/chat/material/examples/no-conversation-history/{ => demos/no-conversation-history}/NoConversationHistory.tsx (98%) create mode 100644 docs/data/chat/material/examples/no-conversation-history/demos/no-conversation-history/client.ts create mode 100644 docs/data/chat/material/examples/no-conversation-history/demos/no-conversation-history/index.ts delete mode 100644 docs/data/chat/material/examples/plan-task/PlanTask.js delete mode 100644 docs/data/chat/material/examples/plan-task/PlanTask.tsx.preview rename docs/data/chat/material/examples/plan-task/{ => demos/plan-task}/PlanTask.tsx (99%) create mode 100644 docs/data/chat/material/examples/plan-task/demos/plan-task/client.ts create mode 100644 docs/data/chat/material/examples/plan-task/demos/plan-task/index.ts delete mode 100644 docs/data/chat/material/examples/slot-overrides/SlotOverrides.js delete mode 100644 docs/data/chat/material/examples/slot-overrides/SlotOverrides.tsx.preview rename docs/data/chat/material/examples/slot-overrides/{ => demos/slot-overrides}/SlotOverrides.tsx (93%) create mode 100644 docs/data/chat/material/examples/slot-overrides/demos/slot-overrides/client.ts create mode 100644 docs/data/chat/material/examples/slot-overrides/demos/slot-overrides/index.ts delete mode 100644 docs/data/chat/material/examples/slow-streaming/SlowStreaming.js delete mode 100644 docs/data/chat/material/examples/slow-streaming/SlowStreaming.tsx.preview rename docs/data/chat/material/examples/slow-streaming/{ => demos/slow-streaming}/SlowStreaming.tsx (97%) create mode 100644 docs/data/chat/material/examples/slow-streaming/demos/slow-streaming/client.ts create mode 100644 docs/data/chat/material/examples/slow-streaming/demos/slow-streaming/index.ts delete mode 100644 docs/data/chat/material/examples/split-layout/SplitLayout.js rename docs/data/chat/material/examples/split-layout/{ => demos/split-layout}/SplitLayout.tsx (98%) create mode 100644 docs/data/chat/material/examples/split-layout/demos/split-layout/client.ts create mode 100644 docs/data/chat/material/examples/split-layout/demos/split-layout/index.ts delete mode 100644 docs/data/chat/material/examples/thread-only/ThreadOnly.js delete mode 100644 docs/data/chat/material/examples/thread-only/ThreadOnly.tsx.preview rename docs/data/chat/material/examples/thread-only/{ => demos/thread-only}/ThreadOnly.tsx (93%) create mode 100644 docs/data/chat/material/examples/thread-only/demos/thread-only/client.ts create mode 100644 docs/data/chat/material/examples/thread-only/demos/thread-only/index.ts delete mode 100644 docs/data/chat/material/hooks/ConversationSidebar.js delete mode 100644 docs/data/chat/material/hooks/CustomComposer.js delete mode 100644 docs/data/chat/material/hooks/CustomComposer.tsx.preview delete mode 100644 docs/data/chat/material/hooks/EfficientThread.js delete mode 100644 docs/data/chat/material/hooks/StatusFooter.js rename docs/data/chat/material/hooks/{ => demos/conversation-sidebar}/ConversationSidebar.tsx (98%) create mode 100644 docs/data/chat/material/hooks/demos/conversation-sidebar/client.ts create mode 100644 docs/data/chat/material/hooks/demos/conversation-sidebar/index.ts rename docs/data/chat/material/hooks/{ => demos/custom-composer}/CustomComposer.tsx (98%) create mode 100644 docs/data/chat/material/hooks/demos/custom-composer/client.ts create mode 100644 docs/data/chat/material/hooks/demos/custom-composer/index.ts rename docs/data/chat/material/hooks/{ => demos/efficient-thread}/EfficientThread.tsx (98%) create mode 100644 docs/data/chat/material/hooks/demos/efficient-thread/client.ts create mode 100644 docs/data/chat/material/hooks/demos/efficient-thread/index.ts rename docs/data/chat/material/hooks/{ => demos/status-footer}/StatusFooter.tsx (97%) create mode 100644 docs/data/chat/material/hooks/demos/status-footer/client.ts create mode 100644 docs/data/chat/material/hooks/demos/status-footer/index.ts delete mode 100644 docs/data/chat/material/message-list/AutoScrollConfig.js delete mode 100644 docs/data/chat/material/message-list/CompactVariant.js delete mode 100644 docs/data/chat/material/message-list/CompactVariant.tsx delete mode 100644 docs/data/chat/material/message-list/CompactVariant.tsx.preview delete mode 100644 docs/data/chat/material/message-list/DateDividerFormat.js delete mode 100644 docs/data/chat/material/message-list/DensityProp.js delete mode 100644 docs/data/chat/material/message-list/KeyboardNavigation.js delete mode 100644 docs/data/chat/material/message-list/KeyboardNavigation.tsx delete mode 100644 docs/data/chat/material/message-list/MessageGrouping.js delete mode 100644 docs/data/chat/material/message-list/MessageGrouping.tsx.preview delete mode 100644 docs/data/chat/material/message-list/StandaloneMessageList.js rename docs/data/chat/material/message-list/{ => demos/auto-scroll-config}/AutoScrollConfig.tsx (96%) create mode 100644 docs/data/chat/material/message-list/demos/auto-scroll-config/client.ts create mode 100644 docs/data/chat/material/message-list/demos/auto-scroll-config/index.ts create mode 100644 docs/data/chat/material/message-list/demos/compact-variant/CompactVariant.tsx create mode 100644 docs/data/chat/material/message-list/demos/compact-variant/client.ts create mode 100644 docs/data/chat/material/message-list/demos/compact-variant/index.ts rename docs/data/chat/material/message-list/{ => demos/date-divider-format}/DateDividerFormat.tsx (97%) create mode 100644 docs/data/chat/material/message-list/demos/date-divider-format/client.ts create mode 100644 docs/data/chat/material/message-list/demos/date-divider-format/index.ts rename docs/data/chat/material/message-list/{ => demos/density-prop}/DensityProp.tsx (96%) create mode 100644 docs/data/chat/material/message-list/demos/density-prop/client.ts create mode 100644 docs/data/chat/material/message-list/demos/density-prop/index.ts create mode 100644 docs/data/chat/material/message-list/demos/keyboard-navigation/KeyboardNavigation.tsx create mode 100644 docs/data/chat/material/message-list/demos/keyboard-navigation/client.ts create mode 100644 docs/data/chat/material/message-list/demos/keyboard-navigation/index.ts rename docs/data/chat/material/message-list/{ => demos/message-grouping}/MessageGrouping.tsx (98%) create mode 100644 docs/data/chat/material/message-list/demos/message-grouping/client.ts create mode 100644 docs/data/chat/material/message-list/demos/message-grouping/index.ts rename docs/data/chat/material/message-list/{ => demos/standalone-message-list}/StandaloneMessageList.tsx (96%) create mode 100644 docs/data/chat/material/message-list/demos/standalone-message-list/client.ts create mode 100644 docs/data/chat/material/message-list/demos/standalone-message-list/index.ts delete mode 100644 docs/data/chat/material/slot-overrides/FeatureFlags.js delete mode 100644 docs/data/chat/material/slot-overrides/SlotBasicReplacement.js delete mode 100644 docs/data/chat/material/slot-overrides/SlotBasicReplacement.tsx.preview delete mode 100644 docs/data/chat/material/slot-overrides/SlotPropsCustomization.js delete mode 100644 docs/data/chat/material/slot-overrides/ThemeAndSlotCombination.js rename docs/data/chat/material/slot-overrides/{ => demos/feature-flags}/FeatureFlags.tsx (94%) create mode 100644 docs/data/chat/material/slot-overrides/demos/feature-flags/client.ts create mode 100644 docs/data/chat/material/slot-overrides/demos/feature-flags/index.ts rename docs/data/chat/material/slot-overrides/{ => demos/slot-basic-replacement}/SlotBasicReplacement.tsx (96%) create mode 100644 docs/data/chat/material/slot-overrides/demos/slot-basic-replacement/client.ts create mode 100644 docs/data/chat/material/slot-overrides/demos/slot-basic-replacement/index.ts rename docs/data/chat/material/slot-overrides/{ => demos/slot-props-customization}/SlotPropsCustomization.tsx (94%) create mode 100644 docs/data/chat/material/slot-overrides/demos/slot-props-customization/client.ts create mode 100644 docs/data/chat/material/slot-overrides/demos/slot-props-customization/index.ts rename docs/data/chat/material/slot-overrides/{ => demos/theme-and-slot-combination}/ThemeAndSlotCombination.tsx (97%) create mode 100644 docs/data/chat/material/slot-overrides/demos/theme-and-slot-combination/client.ts create mode 100644 docs/data/chat/material/slot-overrides/demos/theme-and-slot-combination/index.ts delete mode 100644 docs/data/chat/material/tailwind/TailwindChatDemo.js rename docs/data/chat/material/tailwind/{ => demos/tailwind-chat-demo}/TailwindChatDemo.tsx (99%) create mode 100644 docs/data/chat/material/tailwind/demos/tailwind-chat-demo/client.ts create mode 100644 docs/data/chat/material/tailwind/demos/tailwind-chat-demo/index.ts delete mode 100644 docs/data/chat/material/thread/AdaptiveSendButton.js delete mode 100644 docs/data/chat/material/thread/AdaptiveSendButton.tsx.preview delete mode 100644 docs/data/chat/material/thread/BubbleWithStatus.js delete mode 100644 docs/data/chat/material/thread/BubbleWithStatus.tsx.preview delete mode 100644 docs/data/chat/material/thread/GradientHeader.js delete mode 100644 docs/data/chat/material/thread/GradientHeader.tsx delete mode 100644 docs/data/chat/material/thread/GradientHeader.tsx.preview delete mode 100644 docs/data/chat/material/thread/PaperBubble.js delete mode 100644 docs/data/chat/material/thread/PaperBubble.tsx.preview delete mode 100644 docs/data/chat/material/thread/ThreadRecomposition.js rename docs/data/chat/material/thread/{ => demos/adaptive-send-button}/AdaptiveSendButton.tsx (97%) create mode 100644 docs/data/chat/material/thread/demos/adaptive-send-button/client.ts create mode 100644 docs/data/chat/material/thread/demos/adaptive-send-button/index.ts rename docs/data/chat/material/thread/{ => demos/bubble-with-status}/BubbleWithStatus.tsx (90%) create mode 100644 docs/data/chat/material/thread/demos/bubble-with-status/client.ts create mode 100644 docs/data/chat/material/thread/demos/bubble-with-status/index.ts create mode 100644 docs/data/chat/material/thread/demos/gradient-header/GradientHeader.tsx create mode 100644 docs/data/chat/material/thread/demos/gradient-header/client.ts create mode 100644 docs/data/chat/material/thread/demos/gradient-header/index.ts rename docs/data/chat/material/thread/{ => demos/paper-bubble}/PaperBubble.tsx (90%) create mode 100644 docs/data/chat/material/thread/demos/paper-bubble/client.ts create mode 100644 docs/data/chat/material/thread/demos/paper-bubble/index.ts rename docs/data/chat/material/thread/{ => demos/thread-recomposition}/ThreadRecomposition.tsx (97%) create mode 100644 docs/data/chat/material/thread/demos/thread-recomposition/client.ts create mode 100644 docs/data/chat/material/thread/demos/thread-recomposition/index.ts delete mode 100644 docs/data/chat/multi-conversation/conversation-header/ChatConversationHeaderPlayground.js delete mode 100644 docs/data/chat/multi-conversation/conversation-header/CustomHeaderActions.js delete mode 100644 docs/data/chat/multi-conversation/conversation-header/GradientHeader.js delete mode 100644 docs/data/chat/multi-conversation/conversation-header/GradientHeader.tsx delete mode 100644 docs/data/chat/multi-conversation/conversation-header/GradientHeader.tsx.preview delete mode 100644 docs/data/chat/multi-conversation/conversation-header/LiveTitle.js delete mode 100644 docs/data/chat/multi-conversation/conversation-header/LiveTitle.tsx.preview rename docs/data/chat/multi-conversation/conversation-header/{ => demos/chat-conversation-header-playground}/ChatConversationHeaderPlayground.tsx (96%) create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/chat-conversation-header-playground/client.ts create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/chat-conversation-header-playground/index.ts rename docs/data/chat/multi-conversation/conversation-header/{ => demos/custom-header-actions}/CustomHeaderActions.tsx (98%) create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/custom-header-actions/client.ts create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/custom-header-actions/index.ts create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/gradient-header/GradientHeader.tsx create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/gradient-header/client.ts create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/gradient-header/index.ts rename docs/data/chat/multi-conversation/conversation-header/{ => demos/live-title}/LiveTitle.tsx (97%) create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/live-title/client.ts create mode 100644 docs/data/chat/multi-conversation/conversation-header/demos/live-title/index.ts delete mode 100644 docs/data/chat/multi-conversation/conversation-list/ChatConversationListPlayground.js delete mode 100644 docs/data/chat/multi-conversation/conversation-list/ConversationListFullCustomRow.js delete mode 100644 docs/data/chat/multi-conversation/conversation-list/ConversationListFullCustomRow.tsx.preview delete mode 100644 docs/data/chat/multi-conversation/conversation-list/ConversationListVariants.js rename docs/data/chat/multi-conversation/conversation-list/{ => demos/chat-conversation-list-playground}/ChatConversationListPlayground.tsx (95%) create mode 100644 docs/data/chat/multi-conversation/conversation-list/demos/chat-conversation-list-playground/client.ts create mode 100644 docs/data/chat/multi-conversation/conversation-list/demos/chat-conversation-list-playground/index.ts rename docs/data/chat/multi-conversation/conversation-list/{ => demos/conversation-list-full-custom-row}/ConversationListFullCustomRow.tsx (98%) create mode 100644 docs/data/chat/multi-conversation/conversation-list/demos/conversation-list-full-custom-row/client.ts create mode 100644 docs/data/chat/multi-conversation/conversation-list/demos/conversation-list-full-custom-row/index.ts rename docs/data/chat/multi-conversation/conversation-list/{ => demos/conversation-list-variants}/ConversationListVariants.tsx (97%) create mode 100644 docs/data/chat/multi-conversation/conversation-list/demos/conversation-list-variants/client.ts create mode 100644 docs/data/chat/multi-conversation/conversation-list/demos/conversation-list-variants/index.ts delete mode 100644 docs/data/chat/multi-conversation/history-and-pagination/HistoryPaginationDemo.js delete mode 100644 docs/data/chat/multi-conversation/history-and-pagination/HistoryPaginationDemo.tsx.preview rename docs/data/chat/multi-conversation/history-and-pagination/{ => demos/history-pagination-demo}/HistoryPaginationDemo.tsx (98%) create mode 100644 docs/data/chat/multi-conversation/history-and-pagination/demos/history-pagination-demo/client.ts create mode 100644 docs/data/chat/multi-conversation/history-and-pagination/demos/history-pagination-demo/index.ts delete mode 100644 docs/data/chat/multi-conversation/read-receipts/ReadReceiptsTwoPane.js rename docs/data/chat/multi-conversation/read-receipts/{ => demos/read-receipts-two-pane}/ReadReceiptsTwoPane.tsx (99%) create mode 100644 docs/data/chat/multi-conversation/read-receipts/demos/read-receipts-two-pane/client.ts create mode 100644 docs/data/chat/multi-conversation/read-receipts/demos/read-receipts-two-pane/index.ts delete mode 100644 docs/data/chat/multi-conversation/real-time-sync/RealtimeSyncSimulation.js delete mode 100644 docs/data/chat/multi-conversation/real-time-sync/RealtimeSyncSimulation.tsx.preview rename docs/data/chat/multi-conversation/real-time-sync/{ => demos/realtime-sync-simulation}/RealtimeSyncSimulation.tsx (97%) create mode 100644 docs/data/chat/multi-conversation/real-time-sync/demos/realtime-sync-simulation/client.ts create mode 100644 docs/data/chat/multi-conversation/real-time-sync/demos/realtime-sync-simulation/index.ts delete mode 100644 docs/data/chat/quickstart/RenderChatBox.js delete mode 100644 docs/data/chat/quickstart/RenderChatBox.tsx.preview rename docs/data/chat/quickstart/{ => demos/render-chat-box}/RenderChatBox.tsx (95%) create mode 100644 docs/data/chat/quickstart/demos/render-chat-box/client.ts create mode 100644 docs/data/chat/quickstart/demos/render-chat-box/index.ts delete mode 100644 docs/data/chat/resources/events-and-callbacks/CallbackEventLog.js rename docs/data/chat/resources/events-and-callbacks/{ => demos/callback-event-log}/CallbackEventLog.tsx (99%) create mode 100644 docs/data/chat/resources/events-and-callbacks/demos/callback-event-log/client.ts create mode 100644 docs/data/chat/resources/events-and-callbacks/demos/callback-event-log/index.ts delete mode 100644 docs/data/chat/resources/hooks/HooksHeadlessChat.js rename docs/data/chat/resources/hooks/{ => demos/hooks-headless-chat}/HooksHeadlessChat.tsx (98%) create mode 100644 docs/data/chat/resources/hooks/demos/hooks-headless-chat/client.ts create mode 100644 docs/data/chat/resources/hooks/demos/hooks-headless-chat/index.ts delete mode 100644 docs/data/chat/resources/performance/RenderIsolationComparison.js rename docs/data/chat/resources/performance/{ => demos/render-isolation-comparison}/RenderIsolationComparison.tsx (98%) create mode 100644 docs/data/chat/resources/performance/demos/render-isolation-comparison/client.ts create mode 100644 docs/data/chat/resources/performance/demos/render-isolation-comparison/index.ts delete mode 100644 docs/data/common-concepts/custom-components/CustomSlot.js delete mode 100644 docs/data/common-concepts/custom-components/CustomSlot.tsx.preview delete mode 100644 docs/data/common-concepts/custom-components/CustomSlotAndSlotProps.js delete mode 100644 docs/data/common-concepts/custom-components/CustomSlotAndSlotProps.tsx.preview delete mode 100644 docs/data/common-concepts/custom-components/CustomSlotProps.js delete mode 100644 docs/data/common-concepts/custom-components/CustomSlotProps.tsx.preview delete mode 100644 docs/data/common-concepts/custom-components/CustomSlotPropsCallback.js delete mode 100644 docs/data/common-concepts/custom-components/CustomSlotPropsCallback.tsx.preview delete mode 100644 docs/data/common-concepts/custom-components/TypescriptCasting.js delete mode 100644 docs/data/common-concepts/custom-components/TypescriptCasting.tsx.preview rename docs/data/common-concepts/custom-components/{ => demos/custom-slot-and-slot-props}/CustomSlotAndSlotProps.tsx (92%) create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot-and-slot-props/client.ts create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot-and-slot-props/index.ts rename docs/data/common-concepts/custom-components/{ => demos/custom-slot-props-callback}/CustomSlotPropsCallback.tsx (91%) create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot-props-callback/client.ts create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot-props-callback/index.ts rename docs/data/common-concepts/custom-components/{ => demos/custom-slot-props}/CustomSlotProps.tsx (90%) create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot-props/client.ts create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot-props/index.ts rename docs/data/common-concepts/custom-components/{ => demos/custom-slot}/CustomSlot.tsx (90%) create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot/client.ts create mode 100644 docs/data/common-concepts/custom-components/demos/custom-slot/index.ts rename docs/data/common-concepts/custom-components/{ => demos/typescript-casting}/TypescriptCasting.tsx (91%) create mode 100644 docs/data/common-concepts/custom-components/demos/typescript-casting/client.ts create mode 100644 docs/data/common-concepts/custom-components/demos/typescript-casting/index.ts delete mode 100644 docs/data/data-grid/accessibility/DensitySelectorGrid.js delete mode 100644 docs/data/data-grid/accessibility/DensitySelectorGrid.tsx.preview delete mode 100644 docs/data/data-grid/accessibility/FocusManagement.js delete mode 100644 docs/data/data-grid/accessibility/RowHeaderGrid.js delete mode 100644 docs/data/data-grid/accessibility/RowHeaderGrid.tsx.preview delete mode 100644 docs/data/data-grid/accessibility/TabNavigation.js rename docs/data/data-grid/accessibility/{ => demos/density-selector-grid}/DensitySelectorGrid.tsx (96%) create mode 100644 docs/data/data-grid/accessibility/demos/density-selector-grid/client.ts create mode 100644 docs/data/data-grid/accessibility/demos/density-selector-grid/index.ts rename docs/data/data-grid/accessibility/{ => demos/focus-management}/FocusManagement.tsx (93%) create mode 100644 docs/data/data-grid/accessibility/demos/focus-management/client.ts create mode 100644 docs/data/data-grid/accessibility/demos/focus-management/index.ts rename docs/data/data-grid/accessibility/{ => demos/row-header-grid}/RowHeaderGrid.tsx (84%) create mode 100644 docs/data/data-grid/accessibility/demos/row-header-grid/client.ts create mode 100644 docs/data/data-grid/accessibility/demos/row-header-grid/index.ts rename docs/data/data-grid/accessibility/{ => demos/tab-navigation}/TabNavigation.tsx (97%) create mode 100644 docs/data/data-grid/accessibility/demos/tab-navigation/client.ts create mode 100644 docs/data/data-grid/accessibility/demos/tab-navigation/index.ts delete mode 100644 docs/data/data-grid/aggregation/AggregationColDefAggregable.js delete mode 100644 docs/data/data-grid/aggregation/AggregationColDefAggregable.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationColDefNonAggregable.js delete mode 100644 docs/data/data-grid/aggregation/AggregationColDefNonAggregable.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationControlled.js delete mode 100644 docs/data/data-grid/aggregation/AggregationControlled.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationCustomFunction.js delete mode 100644 docs/data/data-grid/aggregation/AggregationCustomFunction.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationDisabled.js delete mode 100644 docs/data/data-grid/aggregation/AggregationDisabled.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationFiltering.js delete mode 100644 docs/data/data-grid/aggregation/AggregationGetAggregationPosition.js delete mode 100644 docs/data/data-grid/aggregation/AggregationGetAggregationPosition.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationInitialState.js delete mode 100644 docs/data/data-grid/aggregation/AggregationInitialState.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationMultipleRowFields.js delete mode 100644 docs/data/data-grid/aggregation/AggregationMultipleRowFields.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationPinnedRows.js delete mode 100644 docs/data/data-grid/aggregation/AggregationRemoveFunctionAllColumns.js delete mode 100644 docs/data/data-grid/aggregation/AggregationRemoveFunctionAllColumns.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationRemoveFunctionOneColumn.js delete mode 100644 docs/data/data-grid/aggregation/AggregationRemoveFunctionOneColumn.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationRenderCell.js delete mode 100644 docs/data/data-grid/aggregation/AggregationRenderCell.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationRowGrouping.js delete mode 100644 docs/data/data-grid/aggregation/AggregationRowGrouping.tsx.preview delete mode 100644 docs/data/data-grid/aggregation/AggregationTreeData.js delete mode 100644 docs/data/data-grid/aggregation/AggregationValueFormatter.js delete mode 100644 docs/data/data-grid/aggregation/AggregationValueFormatter.tsx.preview rename docs/data/data-grid/aggregation/{ => demos/aggregation-col-def-aggregable}/AggregationColDefAggregable.tsx (86%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-col-def-aggregable/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-col-def-aggregable/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-col-def-non-aggregable}/AggregationColDefNonAggregable.tsx (87%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-col-def-non-aggregable/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-col-def-non-aggregable/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-controlled}/AggregationControlled.tsx (85%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-controlled/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-controlled/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-custom-function}/AggregationCustomFunction.tsx (94%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-custom-function/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-custom-function/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-disabled}/AggregationDisabled.tsx (90%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-disabled/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-disabled/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-filtering}/AggregationFiltering.tsx (87%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-filtering/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-filtering/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-get-aggregation-position}/AggregationGetAggregationPosition.tsx (93%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-get-aggregation-position/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-get-aggregation-position/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-initial-state}/AggregationInitialState.tsx (85%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-initial-state/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-initial-state/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-multiple-row-fields}/AggregationMultipleRowFields.tsx (91%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-multiple-row-fields/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-multiple-row-fields/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-pinned-rows}/AggregationPinnedRows.tsx (98%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-pinned-rows/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-pinned-rows/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-remove-function-all-columns}/AggregationRemoveFunctionAllColumns.tsx (92%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-remove-function-all-columns/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-remove-function-all-columns/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-remove-function-one-column}/AggregationRemoveFunctionOneColumn.tsx (87%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-remove-function-one-column/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-remove-function-one-column/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-render-cell}/AggregationRenderCell.tsx (89%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-render-cell/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-render-cell/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-row-grouping}/AggregationRowGrouping.tsx (95%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-row-grouping/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-row-grouping/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-tree-data}/AggregationTreeData.tsx (95%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-tree-data/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-tree-data/index.ts rename docs/data/data-grid/aggregation/{ => demos/aggregation-value-formatter}/AggregationValueFormatter.tsx (92%) create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-value-formatter/client.ts create mode 100644 docs/data/data-grid/aggregation/demos/aggregation-value-formatter/index.ts delete mode 100644 docs/data/data-grid/ai-assistant/AssistantWithCharts.js delete mode 100644 docs/data/data-grid/ai-assistant/AssistantWithDataSampling.js delete mode 100644 docs/data/data-grid/ai-assistant/AssistantWithDataSource.js delete mode 100644 docs/data/data-grid/ai-assistant/AssistantWithExamples.js rename docs/data/data-grid/ai-assistant/{ => demos/assistant-with-charts}/AssistantWithCharts.tsx (95%) create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-charts/client.ts create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-charts/index.ts rename docs/data/data-grid/ai-assistant/{ => demos/assistant-with-data-sampling}/AssistantWithDataSampling.tsx (97%) create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-data-sampling/client.ts create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-data-sampling/index.ts rename docs/data/data-grid/ai-assistant/{ => demos/assistant-with-data-source}/AssistantWithDataSource.tsx (97%) create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-data-source/client.ts create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-data-source/index.ts rename docs/data/data-grid/ai-assistant/{ => demos/assistant-with-examples}/AssistantWithExamples.tsx (99%) create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-examples/client.ts create mode 100644 docs/data/data-grid/ai-assistant/demos/assistant-with-examples/index.ts delete mode 100644 docs/data/data-grid/api-object/AccessDisabledColumnFeatures.js delete mode 100644 docs/data/data-grid/api-object/AccessDisabledColumnFeatures.tsx.preview delete mode 100644 docs/data/data-grid/api-object/UseGridApiContext.js delete mode 100644 docs/data/data-grid/api-object/UseGridApiContext.tsx.preview delete mode 100644 docs/data/data-grid/api-object/UseGridApiRef.js delete mode 100644 docs/data/data-grid/api-object/UseGridApiRef.tsx.preview rename docs/data/data-grid/api-object/{ => demos/access-disabled-column-features}/AccessDisabledColumnFeatures.tsx (90%) create mode 100644 docs/data/data-grid/api-object/demos/access-disabled-column-features/client.ts create mode 100644 docs/data/data-grid/api-object/demos/access-disabled-column-features/index.ts rename docs/data/data-grid/api-object/{ => demos/use-grid-api-context}/UseGridApiContext.tsx (95%) create mode 100644 docs/data/data-grid/api-object/demos/use-grid-api-context/client.ts create mode 100644 docs/data/data-grid/api-object/demos/use-grid-api-context/index.ts rename docs/data/data-grid/api-object/{ => demos/use-grid-api-ref}/UseGridApiRef.tsx (96%) create mode 100644 docs/data/data-grid/api-object/demos/use-grid-api-ref/client.ts create mode 100644 docs/data/data-grid/api-object/demos/use-grid-api-ref/index.ts delete mode 100644 docs/data/data-grid/cell-selection/CellSelectionApiNoSnap.js delete mode 100644 docs/data/data-grid/cell-selection/CellSelectionFormulaField.js delete mode 100644 docs/data/data-grid/cell-selection/CellSelectionGrid.js delete mode 100644 docs/data/data-grid/cell-selection/CellSelectionGrid.tsx.preview delete mode 100644 docs/data/data-grid/cell-selection/CellSelectionRangeStyling.js delete mode 100644 docs/data/data-grid/cell-selection/CellSelectionRangeStyling.tsx.preview create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-api-no-snap/CellSelectionApiNoSnap.tsx create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-api-no-snap/client.ts create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-api-no-snap/index.ts rename docs/data/data-grid/cell-selection/{ => demos/cell-selection-formula-field}/CellSelectionFormulaField.tsx (95%) create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-formula-field/client.ts create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-formula-field/index.ts rename docs/data/data-grid/cell-selection/{ => demos/cell-selection-grid}/CellSelectionGrid.tsx (94%) create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-grid/client.ts create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-grid/index.ts rename docs/data/data-grid/cell-selection/{ => demos/cell-selection-range-styling}/CellSelectionRangeStyling.tsx (97%) create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-range-styling/client.ts create mode 100644 docs/data/data-grid/cell-selection/demos/cell-selection-range-styling/index.ts delete mode 100644 docs/data/data-grid/cells/LongTextCell.js delete mode 100644 docs/data/data-grid/cells/LongTextCell.tsx.preview rename docs/data/data-grid/cells/{ => demos/long-text-cell}/LongTextCell.tsx (98%) create mode 100644 docs/data/data-grid/cells/demos/long-text-cell/client.ts create mode 100644 docs/data/data-grid/cells/demos/long-text-cell/index.ts delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationBasic.js delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationCustomization.js delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationDataSource.js delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationLiveData.js delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationLocalization.js delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationMultipleCharts.js delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationPivoting.js delete mode 100644 docs/data/data-grid/charts-integration/GridChartsIntegrationRowGrouping.js rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-basic}/GridChartsIntegrationBasic.tsx (97%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-basic/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-basic/index.ts rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-customization}/GridChartsIntegrationCustomization.tsx (96%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-customization/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-customization/index.ts rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-data-source}/GridChartsIntegrationDataSource.tsx (98%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-data-source/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-data-source/index.ts rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-live-data}/GridChartsIntegrationLiveData.tsx (94%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-live-data/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-live-data/index.ts rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-localization}/GridChartsIntegrationLocalization.tsx (97%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-localization/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-localization/index.ts rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-multiple-charts}/GridChartsIntegrationMultipleCharts.tsx (96%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-multiple-charts/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-multiple-charts/index.ts rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-pivoting}/GridChartsIntegrationPivoting.tsx (96%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-pivoting/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-pivoting/index.ts rename docs/data/data-grid/charts-integration/{ => demos/grid-charts-integration-row-grouping}/GridChartsIntegrationRowGrouping.tsx (98%) create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-row-grouping/client.ts create mode 100644 docs/data/data-grid/charts-integration/demos/grid-charts-integration-row-grouping/index.ts delete mode 100644 docs/data/data-grid/clipboard/CellSelectionFillHandle.js delete mode 100644 docs/data/data-grid/clipboard/CellSelectionFillHandle.tsx.preview delete mode 100644 docs/data/data-grid/clipboard/ClipboardCopy.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardCopyAddRows.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardCopyButton.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardPaste.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardPaste.tsx.preview delete mode 100644 docs/data/data-grid/clipboard/ClipboardPasteDelimiter.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardPasteDelimiter.tsx.preview delete mode 100644 docs/data/data-grid/clipboard/ClipboardPasteDisabled.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardPasteDisabled.tsx.preview delete mode 100644 docs/data/data-grid/clipboard/ClipboardPasteEvents.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardPasteIsCellEditable.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardPasteIsCellEditable.tsx.preview delete mode 100644 docs/data/data-grid/clipboard/ClipboardPastePersistence.js delete mode 100644 docs/data/data-grid/clipboard/ClipboardPastePersistence.tsx.preview rename docs/data/data-grid/clipboard/{ => demos/cell-selection-fill-handle}/CellSelectionFillHandle.tsx (92%) create mode 100644 docs/data/data-grid/clipboard/demos/cell-selection-fill-handle/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/cell-selection-fill-handle/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-copy-add-rows}/ClipboardCopyAddRows.tsx (91%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-copy-add-rows/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-copy-add-rows/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-copy-button}/ClipboardCopyButton.tsx (96%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-copy-button/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-copy-button/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-copy}/ClipboardCopy.tsx (96%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-copy/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-copy/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-paste-delimiter}/ClipboardPasteDelimiter.tsx (95%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-delimiter/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-delimiter/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-paste-disabled}/ClipboardPasteDisabled.tsx (90%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-disabled/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-disabled/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-paste-events}/ClipboardPasteEvents.tsx (94%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-events/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-events/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-paste-is-cell-editable}/ClipboardPasteIsCellEditable.tsx (92%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-is-cell-editable/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-is-cell-editable/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-paste-persistence}/ClipboardPastePersistence.tsx (98%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-persistence/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste-persistence/index.ts rename docs/data/data-grid/clipboard/{ => demos/clipboard-paste}/ClipboardPaste.tsx (94%) create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste/client.ts create mode 100644 docs/data/data-grid/clipboard/demos/clipboard-paste/index.ts delete mode 100644 docs/data/data-grid/column-definition/ActionsWithModalGrid.js delete mode 100644 docs/data/data-grid/column-definition/AutogeneratedRows.js delete mode 100644 docs/data/data-grid/column-definition/AutogeneratedRows.tsx.preview delete mode 100644 docs/data/data-grid/column-definition/BasicColumnsGrid.js delete mode 100644 docs/data/data-grid/column-definition/BasicColumnsGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-definition/ColumnTypesGrid.js delete mode 100644 docs/data/data-grid/column-definition/ColumnTypesGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-definition/MultiSelectColumn.js delete mode 100644 docs/data/data-grid/column-definition/MultiSelectColumn.tsx.preview delete mode 100644 docs/data/data-grid/column-definition/MultiSelectKeyboard.js delete mode 100644 docs/data/data-grid/column-definition/MultiSelectKeyboard.tsx.preview delete mode 100644 docs/data/data-grid/column-definition/RenderCellGrid.js delete mode 100644 docs/data/data-grid/column-definition/RenderCellGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-definition/RenderExpandCellGrid.js delete mode 100644 docs/data/data-grid/column-definition/RenderExpandCellGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-definition/ValueFormatterGrid.js delete mode 100644 docs/data/data-grid/column-definition/ValueGetterGrid.js delete mode 100644 docs/data/data-grid/column-definition/ValueGetterGrid.tsx.preview rename docs/data/data-grid/column-definition/{ => demos/actions-with-modal-grid}/ActionsWithModalGrid.tsx (93%) create mode 100644 docs/data/data-grid/column-definition/demos/actions-with-modal-grid/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/actions-with-modal-grid/index.ts rename docs/data/data-grid/column-definition/{ => demos/autogenerated-rows}/AutogeneratedRows.tsx (92%) create mode 100644 docs/data/data-grid/column-definition/demos/autogenerated-rows/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/autogenerated-rows/index.ts rename docs/data/data-grid/column-definition/{ => demos/basic-columns-grid}/BasicColumnsGrid.tsx (89%) create mode 100644 docs/data/data-grid/column-definition/demos/basic-columns-grid/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/basic-columns-grid/index.ts rename docs/data/data-grid/column-definition/{ => demos/column-types-grid}/ColumnTypesGrid.tsx (95%) create mode 100644 docs/data/data-grid/column-definition/demos/column-types-grid/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/column-types-grid/index.ts rename docs/data/data-grid/column-definition/{ => demos/multi-select-column}/MultiSelectColumn.tsx (91%) create mode 100644 docs/data/data-grid/column-definition/demos/multi-select-column/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/multi-select-column/index.ts rename docs/data/data-grid/column-definition/{ => demos/multi-select-keyboard}/MultiSelectKeyboard.tsx (86%) create mode 100644 docs/data/data-grid/column-definition/demos/multi-select-keyboard/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/multi-select-keyboard/index.ts rename docs/data/data-grid/column-definition/{ => demos/render-cell-grid}/RenderCellGrid.tsx (88%) create mode 100644 docs/data/data-grid/column-definition/demos/render-cell-grid/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/render-cell-grid/index.ts rename docs/data/data-grid/column-definition/{ => demos/render-expand-cell-grid}/RenderExpandCellGrid.tsx (97%) create mode 100644 docs/data/data-grid/column-definition/demos/render-expand-cell-grid/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/render-expand-cell-grid/index.ts rename docs/data/data-grid/column-definition/{ => demos/value-formatter-grid}/ValueFormatterGrid.tsx (94%) create mode 100644 docs/data/data-grid/column-definition/demos/value-formatter-grid/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/value-formatter-grid/index.ts rename docs/data/data-grid/column-definition/{ => demos/value-getter-grid}/ValueGetterGrid.tsx (87%) create mode 100644 docs/data/data-grid/column-definition/demos/value-getter-grid/client.ts create mode 100644 docs/data/data-grid/column-definition/demos/value-getter-grid/index.ts delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizing.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingAsync.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingDynamicRowHeight.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingGroupedRows.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingGroupedRows.tsx.preview delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingHeaderFilters.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingHeaderFilters.tsx.preview delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingVirtualized.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnAutosizingVirtualized.tsx.preview delete mode 100644 docs/data/data-grid/column-dimensions/ColumnFluidWidthGrid.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnMinWidthGrid.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnMinWidthGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-dimensions/ColumnSizingGrid.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnSizingGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-dimensions/ColumnWidthGrid.js delete mode 100644 docs/data/data-grid/column-dimensions/ColumnWidthGrid.tsx.preview rename docs/data/data-grid/column-dimensions/{ => demos/column-autosizing-async}/ColumnAutosizingAsync.tsx (90%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-async/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-async/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-autosizing-dynamic-row-height}/ColumnAutosizingDynamicRowHeight.tsx (90%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-dynamic-row-height/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-dynamic-row-height/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-autosizing-grouped-rows}/ColumnAutosizingGroupedRows.tsx (92%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-grouped-rows/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-grouped-rows/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-autosizing-header-filters}/ColumnAutosizingHeaderFilters.tsx (96%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-header-filters/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-header-filters/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-autosizing-virtualized}/ColumnAutosizingVirtualized.tsx (90%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-virtualized/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing-virtualized/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-autosizing}/ColumnAutosizing.tsx (98%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-autosizing/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-fluid-width-grid}/ColumnFluidWidthGrid.tsx (92%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-fluid-width-grid/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-fluid-width-grid/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-min-width-grid}/ColumnMinWidthGrid.tsx (88%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-min-width-grid/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-min-width-grid/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-sizing-grid}/ColumnSizingGrid.tsx (91%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-sizing-grid/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-sizing-grid/index.ts rename docs/data/data-grid/column-dimensions/{ => demos/column-width-grid}/ColumnWidthGrid.tsx (88%) create mode 100644 docs/data/data-grid/column-dimensions/demos/column-width-grid/client.ts create mode 100644 docs/data/data-grid/column-dimensions/demos/column-width-grid/index.ts delete mode 100644 docs/data/data-grid/column-groups/BasicGroupingDemo.js delete mode 100644 docs/data/data-grid/column-groups/BasicGroupingDemo.tsx.preview delete mode 100644 docs/data/data-grid/column-groups/BreakingGroupDemo.js delete mode 100644 docs/data/data-grid/column-groups/BreakingGroupDemo.tsx.preview delete mode 100644 docs/data/data-grid/column-groups/CollapsibleColumnGroups.js delete mode 100644 docs/data/data-grid/column-groups/CollapsibleColumnGroups.tsx.preview delete mode 100644 docs/data/data-grid/column-groups/CustomizationDemo.js delete mode 100644 docs/data/data-grid/column-groups/CustomizationDemo.tsx.preview delete mode 100644 docs/data/data-grid/column-groups/GroupHeaderHeight.js delete mode 100644 docs/data/data-grid/column-groups/GroupHeaderHeight.tsx.preview rename docs/data/data-grid/column-groups/{ => demos/basic-grouping-demo}/BasicGroupingDemo.tsx (90%) create mode 100644 docs/data/data-grid/column-groups/demos/basic-grouping-demo/client.ts create mode 100644 docs/data/data-grid/column-groups/demos/basic-grouping-demo/index.ts rename docs/data/data-grid/column-groups/{ => demos/breaking-group-demo}/BreakingGroupDemo.tsx (91%) create mode 100644 docs/data/data-grid/column-groups/demos/breaking-group-demo/client.ts create mode 100644 docs/data/data-grid/column-groups/demos/breaking-group-demo/index.ts rename docs/data/data-grid/column-groups/{ => demos/collapsible-column-groups}/CollapsibleColumnGroups.tsx (97%) create mode 100644 docs/data/data-grid/column-groups/demos/collapsible-column-groups/client.ts create mode 100644 docs/data/data-grid/column-groups/demos/collapsible-column-groups/index.ts rename docs/data/data-grid/column-groups/{ => demos/customization-demo}/CustomizationDemo.tsx (96%) create mode 100644 docs/data/data-grid/column-groups/demos/customization-demo/client.ts create mode 100644 docs/data/data-grid/column-groups/demos/customization-demo/index.ts rename docs/data/data-grid/column-groups/{ => demos/group-header-height}/GroupHeaderHeight.tsx (90%) create mode 100644 docs/data/data-grid/column-groups/demos/group-header-height/client.ts create mode 100644 docs/data/data-grid/column-groups/demos/group-header-height/index.ts delete mode 100644 docs/data/data-grid/column-header/HeaderColumnsGrid.js delete mode 100644 docs/data/data-grid/column-header/HeaderColumnsGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-header/HeaderHeight.js delete mode 100644 docs/data/data-grid/column-header/HeaderHeight.tsx.preview delete mode 100644 docs/data/data-grid/column-header/RenderHeaderGrid.js delete mode 100644 docs/data/data-grid/column-header/RenderHeaderGrid.tsx.preview rename docs/data/data-grid/column-header/{ => demos/header-columns-grid}/HeaderColumnsGrid.tsx (92%) create mode 100644 docs/data/data-grid/column-header/demos/header-columns-grid/client.ts create mode 100644 docs/data/data-grid/column-header/demos/header-columns-grid/index.ts rename docs/data/data-grid/column-header/{ => demos/header-height}/HeaderHeight.tsx (81%) create mode 100644 docs/data/data-grid/column-header/demos/header-height/client.ts create mode 100644 docs/data/data-grid/column-header/demos/header-height/index.ts rename docs/data/data-grid/column-header/{ => demos/render-header-grid}/RenderHeaderGrid.tsx (84%) create mode 100644 docs/data/data-grid/column-header/demos/render-header-grid/client.ts create mode 100644 docs/data/data-grid/column-header/demos/render-header-grid/index.ts delete mode 100644 docs/data/data-grid/column-menu/AddNewColumnMenuGrid.js delete mode 100644 docs/data/data-grid/column-menu/AddNewColumnMenuGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/ColumnMenuGrid.js delete mode 100644 docs/data/data-grid/column-menu/ColumnMenuGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/ColumnMenuGridPremium.js delete mode 100644 docs/data/data-grid/column-menu/ColumnMenuGridPremium.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/ColumnMenuGridReferencesNoSnap.js delete mode 100644 docs/data/data-grid/column-menu/ColumnMenuGridReferencesNoSnap.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/CustomColumnMenuGrid.js delete mode 100644 docs/data/data-grid/column-menu/CustomColumnMenuGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/DisabledColumnMenuGrid.js delete mode 100644 docs/data/data-grid/column-menu/DisabledColumnMenuGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/HideColumnMenuGrid.js delete mode 100644 docs/data/data-grid/column-menu/HideColumnMenuGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/OverrideColumnMenuGrid.js delete mode 100644 docs/data/data-grid/column-menu/OverrideColumnMenuGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-menu/ReorderColumnMenuGrid.js delete mode 100644 docs/data/data-grid/column-menu/ReorderColumnMenuGrid.tsx.preview rename docs/data/data-grid/column-menu/{ => demos/add-new-column-menu-grid}/AddNewColumnMenuGrid.tsx (88%) create mode 100644 docs/data/data-grid/column-menu/demos/add-new-column-menu-grid/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/add-new-column-menu-grid/index.ts rename docs/data/data-grid/column-menu/{ => demos/column-menu-grid-premium}/ColumnMenuGridPremium.tsx (93%) create mode 100644 docs/data/data-grid/column-menu/demos/column-menu-grid-premium/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/column-menu-grid-premium/index.ts rename docs/data/data-grid/column-menu/{ => demos/column-menu-grid-references-no-snap}/ColumnMenuGridReferencesNoSnap.tsx (95%) create mode 100644 docs/data/data-grid/column-menu/demos/column-menu-grid-references-no-snap/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/column-menu-grid-references-no-snap/index.ts rename docs/data/data-grid/column-menu/{ => demos/column-menu-grid}/ColumnMenuGrid.tsx (88%) create mode 100644 docs/data/data-grid/column-menu/demos/column-menu-grid/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/column-menu-grid/index.ts rename docs/data/data-grid/column-menu/{ => demos/custom-column-menu-grid}/CustomColumnMenuGrid.tsx (91%) create mode 100644 docs/data/data-grid/column-menu/demos/custom-column-menu-grid/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/custom-column-menu-grid/index.ts rename docs/data/data-grid/column-menu/{ => demos/disabled-column-menu-grid}/DisabledColumnMenuGrid.tsx (89%) create mode 100644 docs/data/data-grid/column-menu/demos/disabled-column-menu-grid/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/disabled-column-menu-grid/index.ts rename docs/data/data-grid/column-menu/{ => demos/hide-column-menu-grid}/HideColumnMenuGrid.tsx (77%) create mode 100644 docs/data/data-grid/column-menu/demos/hide-column-menu-grid/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/hide-column-menu-grid/index.ts rename docs/data/data-grid/column-menu/{ => demos/override-column-menu-grid}/OverrideColumnMenuGrid.tsx (86%) create mode 100644 docs/data/data-grid/column-menu/demos/override-column-menu-grid/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/override-column-menu-grid/index.ts rename docs/data/data-grid/column-menu/{ => demos/reorder-column-menu-grid}/ReorderColumnMenuGrid.tsx (81%) create mode 100644 docs/data/data-grid/column-menu/demos/reorder-column-menu-grid/client.ts create mode 100644 docs/data/data-grid/column-menu/demos/reorder-column-menu-grid/index.ts delete mode 100644 docs/data/data-grid/column-ordering/ColumnOrderingDisabledGrid.js delete mode 100644 docs/data/data-grid/column-ordering/ColumnOrderingDisabledGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-ordering/ColumnOrderingGrid.js delete mode 100644 docs/data/data-grid/column-ordering/ColumnOrderingGrid.tsx.preview rename docs/data/data-grid/column-ordering/{ => demos/column-ordering-disabled-grid}/ColumnOrderingDisabledGrid.tsx (89%) create mode 100644 docs/data/data-grid/column-ordering/demos/column-ordering-disabled-grid/client.ts create mode 100644 docs/data/data-grid/column-ordering/demos/column-ordering-disabled-grid/index.ts rename docs/data/data-grid/column-ordering/{ => demos/column-ordering-grid}/ColumnOrderingGrid.tsx (89%) create mode 100644 docs/data/data-grid/column-ordering/demos/column-ordering-grid/client.ts create mode 100644 docs/data/data-grid/column-ordering/demos/column-ordering-grid/index.ts delete mode 100644 docs/data/data-grid/column-pinning/BasicColumnPinning.js delete mode 100644 docs/data/data-grid/column-pinning/BasicColumnPinning.tsx.preview delete mode 100644 docs/data/data-grid/column-pinning/ColumnPinningApiNoSnap.js delete mode 100644 docs/data/data-grid/column-pinning/ColumnPinningAutogeneratedColumns.js delete mode 100644 docs/data/data-grid/column-pinning/ColumnPinningAutogeneratedColumns.tsx.preview delete mode 100644 docs/data/data-grid/column-pinning/ColumnPinningDynamicRowHeight.js delete mode 100644 docs/data/data-grid/column-pinning/ColumnPinningDynamicRowHeight.tsx.preview delete mode 100644 docs/data/data-grid/column-pinning/ColumnPinningSectionSeparator.js delete mode 100644 docs/data/data-grid/column-pinning/ControlPinnedColumns.js delete mode 100644 docs/data/data-grid/column-pinning/ControlPinnedColumns.tsx.preview delete mode 100644 docs/data/data-grid/column-pinning/DisableColumnPinningButtons.js delete mode 100644 docs/data/data-grid/column-pinning/DisableColumnPinningButtons.tsx.preview rename docs/data/data-grid/column-pinning/{ => demos/basic-column-pinning}/BasicColumnPinning.tsx (96%) create mode 100644 docs/data/data-grid/column-pinning/demos/basic-column-pinning/client.ts create mode 100644 docs/data/data-grid/column-pinning/demos/basic-column-pinning/index.ts create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-api-no-snap/ColumnPinningApiNoSnap.tsx create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-api-no-snap/client.ts create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-api-no-snap/index.ts rename docs/data/data-grid/column-pinning/{ => demos/column-pinning-autogenerated-columns}/ColumnPinningAutogeneratedColumns.tsx (95%) create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-autogenerated-columns/client.ts create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-autogenerated-columns/index.ts rename docs/data/data-grid/column-pinning/{ => demos/column-pinning-dynamic-row-height}/ColumnPinningDynamicRowHeight.tsx (95%) create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-dynamic-row-height/client.ts create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-dynamic-row-height/index.ts rename docs/data/data-grid/column-pinning/{ => demos/column-pinning-section-separator}/ColumnPinningSectionSeparator.tsx (96%) create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-section-separator/client.ts create mode 100644 docs/data/data-grid/column-pinning/demos/column-pinning-section-separator/index.ts rename docs/data/data-grid/column-pinning/{ => demos/control-pinned-columns}/ControlPinnedColumns.tsx (95%) create mode 100644 docs/data/data-grid/column-pinning/demos/control-pinned-columns/client.ts create mode 100644 docs/data/data-grid/column-pinning/demos/control-pinned-columns/index.ts rename docs/data/data-grid/column-pinning/{ => demos/disable-column-pinning-buttons}/DisableColumnPinningButtons.tsx (91%) create mode 100644 docs/data/data-grid/column-pinning/demos/disable-column-pinning-buttons/client.ts create mode 100644 docs/data/data-grid/column-pinning/demos/disable-column-pinning-buttons/index.ts delete mode 100644 docs/data/data-grid/column-recipes/ColumnSizingPersistWidthOrder.js delete mode 100644 docs/data/data-grid/column-recipes/ColumnSizingPersistWidthOrder.tsx.preview delete mode 100644 docs/data/data-grid/column-recipes/ColumnSizingPersistWidthPivoting.js delete mode 100644 docs/data/data-grid/column-recipes/LongTextCustomPopupContent.js delete mode 100644 docs/data/data-grid/column-recipes/LongTextCustomPopupContent.tsx.preview delete mode 100644 docs/data/data-grid/column-recipes/MultiSelectCustomChips.js delete mode 100644 docs/data/data-grid/column-recipes/MultiSelectCustomChips.tsx.preview rename docs/data/data-grid/column-recipes/{ => demos/column-sizing-persist-width-order}/ColumnSizingPersistWidthOrder.tsx (96%) create mode 100644 docs/data/data-grid/column-recipes/demos/column-sizing-persist-width-order/client.ts create mode 100644 docs/data/data-grid/column-recipes/demos/column-sizing-persist-width-order/index.ts rename docs/data/data-grid/column-recipes/{ => demos/column-sizing-persist-width-pivoting}/ColumnSizingPersistWidthPivoting.tsx (97%) create mode 100644 docs/data/data-grid/column-recipes/demos/column-sizing-persist-width-pivoting/client.ts create mode 100644 docs/data/data-grid/column-recipes/demos/column-sizing-persist-width-pivoting/index.ts rename docs/data/data-grid/column-recipes/{ => demos/long-text-custom-popup-content}/LongTextCustomPopupContent.tsx (96%) create mode 100644 docs/data/data-grid/column-recipes/demos/long-text-custom-popup-content/client.ts create mode 100644 docs/data/data-grid/column-recipes/demos/long-text-custom-popup-content/index.ts rename docs/data/data-grid/column-recipes/{ => demos/multi-select-custom-chips}/MultiSelectCustomChips.tsx (95%) create mode 100644 docs/data/data-grid/column-recipes/demos/multi-select-custom-chips/client.ts create mode 100644 docs/data/data-grid/column-recipes/demos/multi-select-custom-chips/index.ts delete mode 100644 docs/data/data-grid/column-spanning/ColumnSpanningDerived.js delete mode 100644 docs/data/data-grid/column-spanning/ColumnSpanningDerived.tsx.preview delete mode 100644 docs/data/data-grid/column-spanning/ColumnSpanningFunction.js delete mode 100644 docs/data/data-grid/column-spanning/ColumnSpanningFunction.tsx.preview delete mode 100644 docs/data/data-grid/column-spanning/ColumnSpanningNumber.js delete mode 100644 docs/data/data-grid/column-spanning/ColumnSpanningNumber.tsx.preview rename docs/data/data-grid/column-spanning/{ => demos/column-spanning-derived}/ColumnSpanningDerived.tsx (96%) create mode 100644 docs/data/data-grid/column-spanning/demos/column-spanning-derived/client.ts create mode 100644 docs/data/data-grid/column-spanning/demos/column-spanning-derived/index.ts rename docs/data/data-grid/column-spanning/{ => demos/column-spanning-function}/ColumnSpanningFunction.tsx (94%) create mode 100644 docs/data/data-grid/column-spanning/demos/column-spanning-function/client.ts create mode 100644 docs/data/data-grid/column-spanning/demos/column-spanning-function/index.ts rename docs/data/data-grid/column-spanning/{ => demos/column-spanning-number}/ColumnSpanningNumber.tsx (94%) create mode 100644 docs/data/data-grid/column-spanning/demos/column-spanning-number/client.ts create mode 100644 docs/data/data-grid/column-spanning/demos/column-spanning-number/index.ts delete mode 100644 docs/data/data-grid/column-visibility/ColumnSelectorDisabledGrid.js delete mode 100644 docs/data/data-grid/column-visibility/ColumnSelectorGrid.js delete mode 100644 docs/data/data-grid/column-visibility/ColumnSelectorGrid.tsx.preview delete mode 100644 docs/data/data-grid/column-visibility/ColumnSelectorGridCustomizeColumns.js delete mode 100644 docs/data/data-grid/column-visibility/ColumnSelectorGridCustomizeColumns.tsx.preview delete mode 100644 docs/data/data-grid/column-visibility/ColumnSelectorGridToggleAllMode.js delete mode 100644 docs/data/data-grid/column-visibility/ColumnSelectorGridToggleAllMode.tsx.preview delete mode 100644 docs/data/data-grid/column-visibility/VisibleColumnsBasicExample.js delete mode 100644 docs/data/data-grid/column-visibility/VisibleColumnsBasicExample.tsx.preview delete mode 100644 docs/data/data-grid/column-visibility/VisibleColumnsModelControlled.js delete mode 100644 docs/data/data-grid/column-visibility/VisibleColumnsModelControlled.tsx.preview delete mode 100644 docs/data/data-grid/column-visibility/VisibleColumnsModelInitialState.js delete mode 100644 docs/data/data-grid/column-visibility/VisibleColumnsModelInitialState.tsx.preview rename docs/data/data-grid/column-visibility/{ => demos/column-selector-disabled-grid}/ColumnSelectorDisabledGrid.tsx (92%) create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-disabled-grid/client.ts create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-disabled-grid/index.ts rename docs/data/data-grid/column-visibility/{ => demos/column-selector-grid-customize-columns}/ColumnSelectorGridCustomizeColumns.tsx (91%) create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-grid-customize-columns/client.ts create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-grid-customize-columns/index.ts rename docs/data/data-grid/column-visibility/{ => demos/column-selector-grid-toggle-all-mode}/ColumnSelectorGridToggleAllMode.tsx (92%) create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-grid-toggle-all-mode/client.ts create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-grid-toggle-all-mode/index.ts rename docs/data/data-grid/column-visibility/{ => demos/column-selector-grid}/ColumnSelectorGrid.tsx (89%) create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-grid/client.ts create mode 100644 docs/data/data-grid/column-visibility/demos/column-selector-grid/index.ts rename docs/data/data-grid/column-visibility/{ => demos/visible-columns-basic-example}/VisibleColumnsBasicExample.tsx (91%) create mode 100644 docs/data/data-grid/column-visibility/demos/visible-columns-basic-example/client.ts create mode 100644 docs/data/data-grid/column-visibility/demos/visible-columns-basic-example/index.ts rename docs/data/data-grid/column-visibility/{ => demos/visible-columns-model-controlled}/VisibleColumnsModelControlled.tsx (82%) create mode 100644 docs/data/data-grid/column-visibility/demos/visible-columns-model-controlled/client.ts create mode 100644 docs/data/data-grid/column-visibility/demos/visible-columns-model-controlled/index.ts rename docs/data/data-grid/column-visibility/{ => demos/visible-columns-model-initial-state}/VisibleColumnsModelInitialState.tsx (94%) create mode 100644 docs/data/data-grid/column-visibility/demos/visible-columns-model-initial-state/client.ts create mode 100644 docs/data/data-grid/column-visibility/demos/visible-columns-model-initial-state/index.ts delete mode 100644 docs/data/data-grid/components/CellWithPopover.js delete mode 100644 docs/data/data-grid/components/CustomColumnMenu.js delete mode 100644 docs/data/data-grid/components/CustomColumnsPanel.js delete mode 100644 docs/data/data-grid/components/CustomColumnsPanel.tsx.preview delete mode 100644 docs/data/data-grid/components/CustomFooter.js delete mode 100644 docs/data/data-grid/components/CustomPaginationGrid.js delete mode 100644 docs/data/data-grid/components/CustomPaginationGrid.tsx.preview delete mode 100644 docs/data/data-grid/components/CustomSortIcons.js delete mode 100644 docs/data/data-grid/components/CustomSortIcons.tsx.preview delete mode 100644 docs/data/data-grid/components/CustomToolbarGrid.js delete mode 100644 docs/data/data-grid/components/CustomToolbarGrid.tsx.preview delete mode 100644 docs/data/data-grid/components/RowContextMenu.js delete mode 100644 docs/data/data-grid/components/ToolbarGrid.js delete mode 100644 docs/data/data-grid/components/ToolbarGrid.tsx.preview delete mode 100644 docs/data/data-grid/components/ai-assistant-panel/GridAiAssistantPanelTrigger.js delete mode 100644 docs/data/data-grid/components/ai-assistant-panel/GridAiAssistantPanelTrigger.tsx.preview rename docs/data/data-grid/components/ai-assistant-panel/{ => demos/grid-ai-assistant-panel-trigger}/GridAiAssistantPanelTrigger.tsx (95%) create mode 100644 docs/data/data-grid/components/ai-assistant-panel/demos/grid-ai-assistant-panel-trigger/client.ts create mode 100644 docs/data/data-grid/components/ai-assistant-panel/demos/grid-ai-assistant-panel-trigger/index.ts delete mode 100644 docs/data/data-grid/components/charts-panel/GridChartsPanelTrigger.js rename docs/data/data-grid/components/charts-panel/{ => demos/grid-charts-panel-trigger}/GridChartsPanelTrigger.tsx (97%) create mode 100644 docs/data/data-grid/components/charts-panel/demos/grid-charts-panel-trigger/client.ts create mode 100644 docs/data/data-grid/components/charts-panel/demos/grid-charts-panel-trigger/index.ts delete mode 100644 docs/data/data-grid/components/columns-panel/GridColumnsPanelTrigger.js delete mode 100644 docs/data/data-grid/components/columns-panel/GridColumnsPanelTrigger.tsx.preview rename docs/data/data-grid/components/columns-panel/{ => demos/grid-columns-panel-trigger}/GridColumnsPanelTrigger.tsx (95%) create mode 100644 docs/data/data-grid/components/columns-panel/demos/grid-columns-panel-trigger/client.ts create mode 100644 docs/data/data-grid/components/columns-panel/demos/grid-columns-panel-trigger/index.ts delete mode 100644 docs/data/data-grid/components/computed-columns-panel/GridComputedColumnsPanelTrigger.js rename docs/data/data-grid/components/computed-columns-panel/{ => demos/grid-computed-columns-panel-trigger}/GridComputedColumnsPanelTrigger.tsx (94%) create mode 100644 docs/data/data-grid/components/computed-columns-panel/demos/grid-computed-columns-panel-trigger/client.ts create mode 100644 docs/data/data-grid/components/computed-columns-panel/demos/grid-computed-columns-panel-trigger/index.ts rename docs/data/data-grid/components/{ => demos/cell-with-popover}/CellWithPopover.tsx (97%) create mode 100644 docs/data/data-grid/components/demos/cell-with-popover/client.ts create mode 100644 docs/data/data-grid/components/demos/cell-with-popover/index.ts rename docs/data/data-grid/components/{ => demos/custom-column-menu}/CustomColumnMenu.tsx (94%) create mode 100644 docs/data/data-grid/components/demos/custom-column-menu/client.ts create mode 100644 docs/data/data-grid/components/demos/custom-column-menu/index.ts rename docs/data/data-grid/components/{ => demos/custom-columns-panel}/CustomColumnsPanel.tsx (98%) create mode 100644 docs/data/data-grid/components/demos/custom-columns-panel/client.ts create mode 100644 docs/data/data-grid/components/demos/custom-columns-panel/index.ts rename docs/data/data-grid/components/{ => demos/custom-footer}/CustomFooter.tsx (91%) create mode 100644 docs/data/data-grid/components/demos/custom-footer/client.ts create mode 100644 docs/data/data-grid/components/demos/custom-footer/index.ts rename docs/data/data-grid/components/{ => demos/custom-pagination-grid}/CustomPaginationGrid.tsx (91%) create mode 100644 docs/data/data-grid/components/demos/custom-pagination-grid/client.ts create mode 100644 docs/data/data-grid/components/demos/custom-pagination-grid/index.ts rename docs/data/data-grid/components/{ => demos/custom-sort-icons}/CustomSortIcons.tsx (95%) create mode 100644 docs/data/data-grid/components/demos/custom-sort-icons/client.ts create mode 100644 docs/data/data-grid/components/demos/custom-sort-icons/index.ts rename docs/data/data-grid/components/{ => demos/custom-toolbar-grid}/CustomToolbarGrid.tsx (96%) create mode 100644 docs/data/data-grid/components/demos/custom-toolbar-grid/client.ts create mode 100644 docs/data/data-grid/components/demos/custom-toolbar-grid/index.ts rename docs/data/data-grid/components/{ => demos/row-context-menu}/RowContextMenu.tsx (98%) create mode 100644 docs/data/data-grid/components/demos/row-context-menu/client.ts create mode 100644 docs/data/data-grid/components/demos/row-context-menu/index.ts rename docs/data/data-grid/components/{ => demos/toolbar-grid}/ToolbarGrid.tsx (89%) create mode 100644 docs/data/data-grid/components/demos/toolbar-grid/client.ts create mode 100644 docs/data/data-grid/components/demos/toolbar-grid/index.ts delete mode 100644 docs/data/data-grid/components/export/GridExportMenu.js delete mode 100644 docs/data/data-grid/components/export/GridExportMenu.tsx.preview delete mode 100644 docs/data/data-grid/components/export/GridExportTrigger.js delete mode 100644 docs/data/data-grid/components/export/GridExportTrigger.tsx.preview rename docs/data/data-grid/components/export/{ => demos/grid-export-menu}/GridExportMenu.tsx (97%) create mode 100644 docs/data/data-grid/components/export/demos/grid-export-menu/client.ts create mode 100644 docs/data/data-grid/components/export/demos/grid-export-menu/index.ts rename docs/data/data-grid/components/export/{ => demos/grid-export-trigger}/GridExportTrigger.tsx (96%) create mode 100644 docs/data/data-grid/components/export/demos/grid-export-trigger/client.ts create mode 100644 docs/data/data-grid/components/export/demos/grid-export-trigger/index.ts delete mode 100644 docs/data/data-grid/components/filter-panel/FilterPanelTriggerDescription.js delete mode 100644 docs/data/data-grid/components/filter-panel/FilterPanelTriggerDescription.tsx.preview delete mode 100644 docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.js delete mode 100644 docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.tsx.preview rename docs/data/data-grid/components/filter-panel/{ => demos/filter-panel-trigger-description}/FilterPanelTriggerDescription.tsx (97%) create mode 100644 docs/data/data-grid/components/filter-panel/demos/filter-panel-trigger-description/client.ts create mode 100644 docs/data/data-grid/components/filter-panel/demos/filter-panel-trigger-description/index.ts rename docs/data/data-grid/components/filter-panel/{ => demos/grid-filter-panel-trigger}/GridFilterPanelTrigger.tsx (95%) create mode 100644 docs/data/data-grid/components/filter-panel/demos/grid-filter-panel-trigger/client.ts create mode 100644 docs/data/data-grid/components/filter-panel/demos/grid-filter-panel-trigger/index.ts delete mode 100644 docs/data/data-grid/components/formula-bar/GridFormulaBar.js delete mode 100644 docs/data/data-grid/components/formula-bar/GridFormulaBar.tsx.preview rename docs/data/data-grid/components/formula-bar/{ => demos/grid-formula-bar}/GridFormulaBar.tsx (87%) create mode 100644 docs/data/data-grid/components/formula-bar/demos/grid-formula-bar/client.ts create mode 100644 docs/data/data-grid/components/formula-bar/demos/grid-formula-bar/index.ts delete mode 100644 docs/data/data-grid/components/pivot-panel/GridPivotPanelTrigger.js delete mode 100644 docs/data/data-grid/components/pivot-panel/GridPivotPanelTrigger.tsx.preview rename docs/data/data-grid/components/pivot-panel/{ => demos/grid-pivot-panel-trigger}/GridPivotPanelTrigger.tsx (96%) create mode 100644 docs/data/data-grid/components/pivot-panel/demos/grid-pivot-panel-trigger/client.ts create mode 100644 docs/data/data-grid/components/pivot-panel/demos/grid-pivot-panel-trigger/index.ts delete mode 100644 docs/data/data-grid/components/prompt-field/GridPromptField.js delete mode 100644 docs/data/data-grid/components/prompt-field/GridPromptField.tsx.preview rename docs/data/data-grid/components/prompt-field/{ => demos/grid-prompt-field}/GridPromptField.tsx (99%) create mode 100644 docs/data/data-grid/components/prompt-field/demos/grid-prompt-field/client.ts create mode 100644 docs/data/data-grid/components/prompt-field/demos/grid-prompt-field/index.ts delete mode 100644 docs/data/data-grid/components/quick-filter/GridControlledQuickFilter.js delete mode 100644 docs/data/data-grid/components/quick-filter/GridControlledQuickFilter.tsx.preview delete mode 100644 docs/data/data-grid/components/quick-filter/GridPersistentQuickFilter.js delete mode 100644 docs/data/data-grid/components/quick-filter/GridPersistentQuickFilter.tsx.preview delete mode 100644 docs/data/data-grid/components/quick-filter/GridQuickFilter.js delete mode 100644 docs/data/data-grid/components/quick-filter/GridQuickFilter.tsx.preview delete mode 100644 docs/data/data-grid/components/quick-filter/GridUncontrolledQuickFilter.js delete mode 100644 docs/data/data-grid/components/quick-filter/GridUncontrolledQuickFilter.tsx.preview rename docs/data/data-grid/components/quick-filter/{ => demos/grid-controlled-quick-filter}/GridControlledQuickFilter.tsx (98%) create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-controlled-quick-filter/client.ts create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-controlled-quick-filter/index.ts rename docs/data/data-grid/components/quick-filter/{ => demos/grid-persistent-quick-filter}/GridPersistentQuickFilter.tsx (98%) create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-persistent-quick-filter/client.ts create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-persistent-quick-filter/index.ts rename docs/data/data-grid/components/quick-filter/{ => demos/grid-quick-filter}/GridQuickFilter.tsx (98%) create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-quick-filter/client.ts create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-quick-filter/index.ts rename docs/data/data-grid/components/quick-filter/{ => demos/grid-uncontrolled-quick-filter}/GridUncontrolledQuickFilter.tsx (98%) create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-uncontrolled-quick-filter/client.ts create mode 100644 docs/data/data-grid/components/quick-filter/demos/grid-uncontrolled-quick-filter/index.ts delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbar.js delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbar.tsx.preview delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarCustom.js delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarCustom.tsx.preview delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarCustomPanel.js delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarCustomPanel.tsx.preview delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarFilterBar.js delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarFilterBar.tsx.preview delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarRowGrouping.js delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarRowGrouping.tsx.preview delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarSettingsMenu.js delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarSettingsMenu.tsx.preview delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarStyleReuse.js delete mode 100644 docs/data/data-grid/components/toolbar/GridToolbarStyleReuse.tsx.preview rename docs/data/data-grid/components/toolbar/{ => demos/grid-toolbar-custom-panel}/GridToolbarCustomPanel.tsx (99%) create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-custom-panel/client.ts create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-custom-panel/index.ts rename docs/data/data-grid/components/toolbar/{ => demos/grid-toolbar-custom}/GridToolbarCustom.tsx (97%) create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-custom/client.ts create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-custom/index.ts rename docs/data/data-grid/components/toolbar/{ => demos/grid-toolbar-filter-bar}/GridToolbarFilterBar.tsx (97%) create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-filter-bar/client.ts create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-filter-bar/index.ts rename docs/data/data-grid/components/toolbar/{ => demos/grid-toolbar-row-grouping}/GridToolbarRowGrouping.tsx (99%) create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-row-grouping/client.ts create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-row-grouping/index.ts rename docs/data/data-grid/components/toolbar/{ => demos/grid-toolbar-settings-menu}/GridToolbarSettingsMenu.tsx (96%) create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-settings-menu/client.ts create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-settings-menu/index.ts rename docs/data/data-grid/components/toolbar/{ => demos/grid-toolbar-style-reuse}/GridToolbarStyleReuse.tsx (95%) create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-style-reuse/client.ts create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar-style-reuse/index.ts rename docs/data/data-grid/components/toolbar/{ => demos/grid-toolbar}/GridToolbar.tsx (99%) create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar/client.ts create mode 100644 docs/data/data-grid/components/toolbar/demos/grid-toolbar/index.ts delete mode 100644 docs/data/data-grid/custom-columns/CustomColumnFullExample.js delete mode 100644 docs/data/data-grid/custom-columns/CustomColumnFullExample.tsx.preview delete mode 100644 docs/data/data-grid/custom-columns/CustomColumnTypesGrid.js delete mode 100644 docs/data/data-grid/custom-columns/CustomColumnTypesGrid.tsx.preview delete mode 100644 docs/data/data-grid/custom-columns/EditingWithDatePickers.js delete mode 100644 docs/data/data-grid/custom-columns/EditingWithDatePickers.tsx.preview delete mode 100644 docs/data/data-grid/custom-columns/SparklineColumn.js delete mode 100644 docs/data/data-grid/custom-columns/SparklineColumn.tsx.preview rename docs/data/data-grid/custom-columns/{ => demos/custom-column-full-example}/CustomColumnFullExample.tsx (84%) create mode 100644 docs/data/data-grid/custom-columns/demos/custom-column-full-example/client.ts create mode 100644 docs/data/data-grid/custom-columns/demos/custom-column-full-example/index.ts rename docs/data/data-grid/custom-columns/{ => demos/custom-column-types-grid}/CustomColumnTypesGrid.tsx (88%) create mode 100644 docs/data/data-grid/custom-columns/demos/custom-column-types-grid/client.ts create mode 100644 docs/data/data-grid/custom-columns/demos/custom-column-types-grid/index.ts rename docs/data/data-grid/custom-columns/{ => demos/editing-with-date-pickers}/EditingWithDatePickers.tsx (98%) create mode 100644 docs/data/data-grid/custom-columns/demos/editing-with-date-pickers/client.ts create mode 100644 docs/data/data-grid/custom-columns/demos/editing-with-date-pickers/index.ts rename docs/data/data-grid/custom-columns/{ => demos/sparkline-column}/SparklineColumn.tsx (98%) create mode 100644 docs/data/data-grid/custom-columns/demos/sparkline-column/client.ts create mode 100644 docs/data/data-grid/custom-columns/demos/sparkline-column/index.ts delete mode 100644 docs/data/data-grid/editing/AskConfirmationBeforeSave.js delete mode 100644 docs/data/data-grid/editing/AskConfirmationBeforeSave.tsx.preview delete mode 100644 docs/data/data-grid/editing/AutoStopEditComponent.js delete mode 100644 docs/data/data-grid/editing/AutoStopEditComponent.tsx.preview delete mode 100644 docs/data/data-grid/editing/BasicEditingGrid.js delete mode 100644 docs/data/data-grid/editing/BasicEditingGrid.tsx.preview delete mode 100644 docs/data/data-grid/editing/BasicRowEditingGrid.js delete mode 100644 docs/data/data-grid/editing/BasicRowEditingGrid.tsx.preview delete mode 100644 docs/data/data-grid/editing/CustomEditComponent.js delete mode 100644 docs/data/data-grid/editing/CustomEditComponent.tsx.preview delete mode 100644 docs/data/data-grid/editing/DisableStopEditModeOnFocusOut.js delete mode 100644 docs/data/data-grid/editing/DisableStopEditModeOnFocusOut.tsx.preview delete mode 100644 docs/data/data-grid/editing/EditApiNoSnap.js delete mode 100644 docs/data/data-grid/editing/FullFeaturedCrudGrid.js delete mode 100644 docs/data/data-grid/editing/FullFeaturedCrudGrid.tsx.preview delete mode 100644 docs/data/data-grid/editing/IsCellEditableGrid.js delete mode 100644 docs/data/data-grid/editing/IsCellEditableGrid.tsx.preview delete mode 100644 docs/data/data-grid/editing/ServerSidePersistence.js delete mode 100644 docs/data/data-grid/editing/ServerSidePersistence.tsx.preview delete mode 100644 docs/data/data-grid/editing/StartEditButtonGrid.js delete mode 100644 docs/data/data-grid/editing/ValidateServerNameGrid.js delete mode 100644 docs/data/data-grid/editing/ValidateServerNameGrid.tsx.preview delete mode 100644 docs/data/data-grid/editing/ValueParserSetterGrid.js delete mode 100644 docs/data/data-grid/editing/ValueParserSetterGrid.tsx.preview rename docs/data/data-grid/editing/{ => demos/ask-confirmation-before-save}/AskConfirmationBeforeSave.tsx (96%) create mode 100644 docs/data/data-grid/editing/demos/ask-confirmation-before-save/client.ts create mode 100644 docs/data/data-grid/editing/demos/ask-confirmation-before-save/index.ts rename docs/data/data-grid/editing/{ => demos/auto-stop-edit-component}/AutoStopEditComponent.tsx (84%) create mode 100644 docs/data/data-grid/editing/demos/auto-stop-edit-component/client.ts create mode 100644 docs/data/data-grid/editing/demos/auto-stop-edit-component/index.ts rename docs/data/data-grid/editing/{ => demos/basic-editing-grid}/BasicEditingGrid.tsx (93%) create mode 100644 docs/data/data-grid/editing/demos/basic-editing-grid/client.ts create mode 100644 docs/data/data-grid/editing/demos/basic-editing-grid/index.ts rename docs/data/data-grid/editing/{ => demos/basic-row-editing-grid}/BasicRowEditingGrid.tsx (93%) create mode 100644 docs/data/data-grid/editing/demos/basic-row-editing-grid/client.ts create mode 100644 docs/data/data-grid/editing/demos/basic-row-editing-grid/index.ts rename docs/data/data-grid/editing/{ => demos/custom-edit-component}/CustomEditComponent.tsx (92%) create mode 100644 docs/data/data-grid/editing/demos/custom-edit-component/client.ts create mode 100644 docs/data/data-grid/editing/demos/custom-edit-component/index.ts rename docs/data/data-grid/editing/{ => demos/disable-stop-edit-mode-on-focus-out}/DisableStopEditModeOnFocusOut.tsx (93%) create mode 100644 docs/data/data-grid/editing/demos/disable-stop-edit-mode-on-focus-out/client.ts create mode 100644 docs/data/data-grid/editing/demos/disable-stop-edit-mode-on-focus-out/index.ts create mode 100644 docs/data/data-grid/editing/demos/edit-api-no-snap/EditApiNoSnap.tsx create mode 100644 docs/data/data-grid/editing/demos/edit-api-no-snap/client.ts create mode 100644 docs/data/data-grid/editing/demos/edit-api-no-snap/index.ts rename docs/data/data-grid/editing/{ => demos/full-featured-crud-grid}/FullFeaturedCrudGrid.tsx (98%) create mode 100644 docs/data/data-grid/editing/demos/full-featured-crud-grid/client.ts create mode 100644 docs/data/data-grid/editing/demos/full-featured-crud-grid/index.ts rename docs/data/data-grid/editing/{ => demos/is-cell-editable-grid}/IsCellEditableGrid.tsx (91%) create mode 100644 docs/data/data-grid/editing/demos/is-cell-editable-grid/client.ts create mode 100644 docs/data/data-grid/editing/demos/is-cell-editable-grid/index.ts rename docs/data/data-grid/editing/{ => demos/server-side-persistence}/ServerSidePersistence.tsx (94%) create mode 100644 docs/data/data-grid/editing/demos/server-side-persistence/client.ts create mode 100644 docs/data/data-grid/editing/demos/server-side-persistence/index.ts rename docs/data/data-grid/editing/{ => demos/start-edit-button-grid}/StartEditButtonGrid.tsx (97%) create mode 100644 docs/data/data-grid/editing/demos/start-edit-button-grid/client.ts create mode 100644 docs/data/data-grid/editing/demos/start-edit-button-grid/index.ts rename docs/data/data-grid/editing/{ => demos/validate-server-name-grid}/ValidateServerNameGrid.tsx (92%) create mode 100644 docs/data/data-grid/editing/demos/validate-server-name-grid/client.ts create mode 100644 docs/data/data-grid/editing/demos/validate-server-name-grid/index.ts rename docs/data/data-grid/editing/{ => demos/value-parser-setter-grid}/ValueParserSetterGrid.tsx (95%) create mode 100644 docs/data/data-grid/editing/demos/value-parser-setter-grid/client.ts create mode 100644 docs/data/data-grid/editing/demos/value-parser-setter-grid/index.ts delete mode 100644 docs/data/data-grid/events/CatalogOfEventsNoSnap.js delete mode 100644 docs/data/data-grid/events/DoubleClickWithCtrlToEdit.js delete mode 100644 docs/data/data-grid/events/DoubleClickWithCtrlToEdit.tsx.preview delete mode 100644 docs/data/data-grid/events/SubscribeToEventsApiRef.js delete mode 100644 docs/data/data-grid/events/SubscribeToEventsApiRef.tsx.preview delete mode 100644 docs/data/data-grid/events/SubscribeToEventsHook.js delete mode 100644 docs/data/data-grid/events/SubscribeToEventsHook.tsx.preview delete mode 100644 docs/data/data-grid/events/SubscribeToEventsProp.js delete mode 100644 docs/data/data-grid/events/SubscribeToEventsProp.tsx.preview create mode 100644 docs/data/data-grid/events/demos/catalog-of-events-no-snap/CatalogOfEventsNoSnap.tsx create mode 100644 docs/data/data-grid/events/demos/catalog-of-events-no-snap/client.ts create mode 100644 docs/data/data-grid/events/demos/catalog-of-events-no-snap/index.ts rename docs/data/data-grid/events/{ => demos/double-click-with-ctrl-to-edit}/DoubleClickWithCtrlToEdit.tsx (92%) create mode 100644 docs/data/data-grid/events/demos/double-click-with-ctrl-to-edit/client.ts create mode 100644 docs/data/data-grid/events/demos/double-click-with-ctrl-to-edit/index.ts rename docs/data/data-grid/events/{ => demos/subscribe-to-events-api-ref}/SubscribeToEventsApiRef.tsx (84%) create mode 100644 docs/data/data-grid/events/demos/subscribe-to-events-api-ref/client.ts create mode 100644 docs/data/data-grid/events/demos/subscribe-to-events-api-ref/index.ts rename docs/data/data-grid/events/{ => demos/subscribe-to-events-hook}/SubscribeToEventsHook.tsx (90%) create mode 100644 docs/data/data-grid/events/demos/subscribe-to-events-hook/client.ts create mode 100644 docs/data/data-grid/events/demos/subscribe-to-events-hook/index.ts rename docs/data/data-grid/events/{ => demos/subscribe-to-events-prop}/SubscribeToEventsProp.tsx (83%) create mode 100644 docs/data/data-grid/events/demos/subscribe-to-events-prop/client.ts create mode 100644 docs/data/data-grid/events/demos/subscribe-to-events-prop/index.ts delete mode 100644 docs/data/data-grid/export/CsvExportApiNoSnap.js delete mode 100644 docs/data/data-grid/export/CsvGetRowsToExport.js delete mode 100644 docs/data/data-grid/export/CsvGetRowsToExportRowGrouping.js delete mode 100644 docs/data/data-grid/export/CsvGetRowsToExportRowGrouping.tsx.preview delete mode 100644 docs/data/data-grid/export/CustomExport.js delete mode 100644 docs/data/data-grid/export/CustomExport.tsx.preview delete mode 100644 docs/data/data-grid/export/ExcelCustomExport.js delete mode 100644 docs/data/data-grid/export/ExcelCustomExport.tsx.preview delete mode 100644 docs/data/data-grid/export/ExcelExport.js delete mode 100644 docs/data/data-grid/export/ExcelExport.tsx.preview delete mode 100644 docs/data/data-grid/export/ExcelExportApiNoSnap.js delete mode 100644 docs/data/data-grid/export/ExcelExportWithWebWorker.js delete mode 100644 docs/data/data-grid/export/ExportDefaultToolbar.js delete mode 100644 docs/data/data-grid/export/ExportDefaultToolbar.tsx.preview delete mode 100644 docs/data/data-grid/export/ExportServerSideData.js delete mode 100644 docs/data/data-grid/export/ExportServerSideData.tsx.preview delete mode 100644 docs/data/data-grid/export/PrintExportApiNoSnap.js delete mode 100644 docs/data/data-grid/export/RemovePrintExport.js delete mode 100644 docs/data/data-grid/export/RemovePrintExport.tsx.preview create mode 100644 docs/data/data-grid/export/demos/csv-export-api-no-snap/CsvExportApiNoSnap.tsx create mode 100644 docs/data/data-grid/export/demos/csv-export-api-no-snap/client.ts create mode 100644 docs/data/data-grid/export/demos/csv-export-api-no-snap/index.ts rename docs/data/data-grid/export/{ => demos/csv-get-rows-to-export-row-grouping}/CsvGetRowsToExportRowGrouping.tsx (95%) create mode 100644 docs/data/data-grid/export/demos/csv-get-rows-to-export-row-grouping/client.ts create mode 100644 docs/data/data-grid/export/demos/csv-get-rows-to-export-row-grouping/index.ts rename docs/data/data-grid/export/{ => demos/csv-get-rows-to-export}/CsvGetRowsToExport.tsx (96%) create mode 100644 docs/data/data-grid/export/demos/csv-get-rows-to-export/client.ts create mode 100644 docs/data/data-grid/export/demos/csv-get-rows-to-export/index.ts rename docs/data/data-grid/export/{ => demos/custom-export}/CustomExport.tsx (97%) create mode 100644 docs/data/data-grid/export/demos/custom-export/client.ts create mode 100644 docs/data/data-grid/export/demos/custom-export/index.ts rename docs/data/data-grid/export/{ => demos/excel-custom-export}/ExcelCustomExport.tsx (97%) create mode 100644 docs/data/data-grid/export/demos/excel-custom-export/client.ts create mode 100644 docs/data/data-grid/export/demos/excel-custom-export/index.ts create mode 100644 docs/data/data-grid/export/demos/excel-export-api-no-snap/ExcelExportApiNoSnap.tsx create mode 100644 docs/data/data-grid/export/demos/excel-export-api-no-snap/client.ts create mode 100644 docs/data/data-grid/export/demos/excel-export-api-no-snap/index.ts rename docs/data/data-grid/export/{ => demos/excel-export-with-web-worker}/ExcelExportWithWebWorker.tsx (86%) create mode 100644 docs/data/data-grid/export/demos/excel-export-with-web-worker/client.ts create mode 100644 docs/data/data-grid/export/demos/excel-export-with-web-worker/index.ts rename docs/data/data-grid/export/{ => demos/excel-export}/ExcelExport.tsx (94%) create mode 100644 docs/data/data-grid/export/demos/excel-export/client.ts create mode 100644 docs/data/data-grid/export/demos/excel-export/index.ts rename docs/data/data-grid/export/{ => demos/export-default-toolbar}/ExportDefaultToolbar.tsx (89%) create mode 100644 docs/data/data-grid/export/demos/export-default-toolbar/client.ts create mode 100644 docs/data/data-grid/export/demos/export-default-toolbar/index.ts rename docs/data/data-grid/export/{ => demos/export-server-side-data}/ExportServerSideData.tsx (98%) create mode 100644 docs/data/data-grid/export/demos/export-server-side-data/client.ts create mode 100644 docs/data/data-grid/export/demos/export-server-side-data/index.ts create mode 100644 docs/data/data-grid/export/demos/print-export-api-no-snap/PrintExportApiNoSnap.tsx create mode 100644 docs/data/data-grid/export/demos/print-export-api-no-snap/client.ts create mode 100644 docs/data/data-grid/export/demos/print-export-api-no-snap/index.ts rename docs/data/data-grid/export/{ => demos/remove-print-export}/RemovePrintExport.tsx (92%) create mode 100644 docs/data/data-grid/export/demos/remove-print-export/client.ts create mode 100644 docs/data/data-grid/export/demos/remove-print-export/index.ts delete mode 100644 docs/data/data-grid/features/PopularFeaturesDemo.js rename docs/data/data-grid/features/{ => demos/popular-features-demo}/PopularFeaturesDemo.tsx (88%) create mode 100644 docs/data/data-grid/features/demos/popular-features-demo/client.ts create mode 100644 docs/data/data-grid/features/demos/popular-features-demo/index.ts delete mode 100644 docs/data/data-grid/filtering-recipes/FilterPresetsPanel.js delete mode 100644 docs/data/data-grid/filtering-recipes/FilterPresetsPanel.tsx.preview delete mode 100644 docs/data/data-grid/filtering-recipes/FilteredRowCount.js delete mode 100644 docs/data/data-grid/filtering-recipes/FilteringLocalStorage.js delete mode 100644 docs/data/data-grid/filtering-recipes/FilteringLocalStorage.tsx.preview delete mode 100644 docs/data/data-grid/filtering-recipes/PasteListIntoIsAnyOf.js delete mode 100644 docs/data/data-grid/filtering-recipes/PasteListIntoIsAnyOf.tsx.preview delete mode 100644 docs/data/data-grid/filtering-recipes/QuickFilterOutsideOfGrid.js rename docs/data/data-grid/filtering-recipes/{ => demos/filter-presets-panel}/FilterPresetsPanel.tsx (99%) create mode 100644 docs/data/data-grid/filtering-recipes/demos/filter-presets-panel/client.ts create mode 100644 docs/data/data-grid/filtering-recipes/demos/filter-presets-panel/index.ts rename docs/data/data-grid/filtering-recipes/{ => demos/filtered-row-count}/FilteredRowCount.tsx (93%) create mode 100644 docs/data/data-grid/filtering-recipes/demos/filtered-row-count/client.ts create mode 100644 docs/data/data-grid/filtering-recipes/demos/filtered-row-count/index.ts rename docs/data/data-grid/filtering-recipes/{ => demos/filtering-local-storage}/FilteringLocalStorage.tsx (93%) create mode 100644 docs/data/data-grid/filtering-recipes/demos/filtering-local-storage/client.ts create mode 100644 docs/data/data-grid/filtering-recipes/demos/filtering-local-storage/index.ts rename docs/data/data-grid/filtering-recipes/{ => demos/paste-list-into-is-any-of}/PasteListIntoIsAnyOf.tsx (97%) create mode 100644 docs/data/data-grid/filtering-recipes/demos/paste-list-into-is-any-of/client.ts create mode 100644 docs/data/data-grid/filtering-recipes/demos/paste-list-into-is-any-of/index.ts rename docs/data/data-grid/filtering-recipes/{ => demos/quick-filter-outside-of-grid}/QuickFilterOutsideOfGrid.tsx (98%) create mode 100644 docs/data/data-grid/filtering-recipes/demos/quick-filter-outside-of-grid/client.ts create mode 100644 docs/data/data-grid/filtering-recipes/demos/quick-filter-outside-of-grid/index.ts delete mode 100644 docs/data/data-grid/filtering/ApplyFiltersOnDemand.js delete mode 100644 docs/data/data-grid/filtering/ApplyFiltersOnDemand.tsx.preview delete mode 100644 docs/data/data-grid/filtering/BasicExampleDataGrid.js delete mode 100644 docs/data/data-grid/filtering/BasicExampleDataGrid.tsx delete mode 100644 docs/data/data-grid/filtering/BasicExampleDataGrid.tsx.preview delete mode 100644 docs/data/data-grid/filtering/BasicExampleDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/BasicExampleDataGridPro.tsx delete mode 100644 docs/data/data-grid/filtering/BasicExampleDataGridPro.tsx.preview delete mode 100644 docs/data/data-grid/filtering/ControlledFilters.js delete mode 100644 docs/data/data-grid/filtering/ControlledFilters.tsx.preview delete mode 100644 docs/data/data-grid/filtering/CustomFilterColumnInput.js delete mode 100644 docs/data/data-grid/filtering/CustomFilterColumnInput.tsx.preview delete mode 100644 docs/data/data-grid/filtering/CustomFilterPanelContent.js delete mode 100644 docs/data/data-grid/filtering/CustomFilterPanelPosition.js delete mode 100644 docs/data/data-grid/filtering/CustomFilterPanelPosition.tsx.preview delete mode 100644 docs/data/data-grid/filtering/CustomHeaderFilterDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/CustomHeaderFilterOperatorDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/CustomHeaderFilterOperatorDataGridPro.tsx.preview delete mode 100644 docs/data/data-grid/filtering/CustomHeaderFilterSingleDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/CustomHeaderFilterSingleDataGridPro.tsx.preview delete mode 100644 docs/data/data-grid/filtering/CustomInputComponent.js delete mode 100644 docs/data/data-grid/filtering/CustomInputComponent.tsx.preview delete mode 100644 docs/data/data-grid/filtering/CustomMultiValueOperator.js delete mode 100644 docs/data/data-grid/filtering/CustomMultiValueOperator.tsx.preview delete mode 100644 docs/data/data-grid/filtering/CustomRatingOperator.js delete mode 100644 docs/data/data-grid/filtering/CustomSelectionOperator.js delete mode 100644 docs/data/data-grid/filtering/CustomSelectionOperator.tsx.preview delete mode 100644 docs/data/data-grid/filtering/DisableActionButtonsDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/DisableActionButtonsDataGridPro.tsx.preview delete mode 100644 docs/data/data-grid/filtering/DisableFilteringGridAllColumns.js delete mode 100644 docs/data/data-grid/filtering/DisableFilteringGridAllColumns.tsx.preview delete mode 100644 docs/data/data-grid/filtering/DisableFilteringGridSomeColumns.js delete mode 100644 docs/data/data-grid/filtering/DisableFilteringGridSomeColumns.tsx.preview delete mode 100644 docs/data/data-grid/filtering/DisableMultiFiltersDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/DisableMultiFiltersDataGridPro.tsx.preview delete mode 100644 docs/data/data-grid/filtering/FilterApiNoSnap.js delete mode 100644 docs/data/data-grid/filtering/HeaderFilteringDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/HeaderFilteringDataGridPro.tsx.preview delete mode 100644 docs/data/data-grid/filtering/HeaderFilteringInlineClearDataGridPro.js delete mode 100644 docs/data/data-grid/filtering/InitialFilters.js delete mode 100644 docs/data/data-grid/filtering/QuickFilteringCustomLogic.js delete mode 100644 docs/data/data-grid/filtering/QuickFilteringCustomLogic.tsx.preview delete mode 100644 docs/data/data-grid/filtering/QuickFilteringCustomizedGrid.js delete mode 100644 docs/data/data-grid/filtering/QuickFilteringDiacritics.js delete mode 100644 docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js delete mode 100644 docs/data/data-grid/filtering/QuickFilteringGrid.js delete mode 100644 docs/data/data-grid/filtering/QuickFilteringGrid.tsx.preview delete mode 100644 docs/data/data-grid/filtering/QuickFilteringInitialize.js delete mode 100644 docs/data/data-grid/filtering/QuickFilteringInitialize.tsx.preview delete mode 100644 docs/data/data-grid/filtering/ReadOnlyFilters.js delete mode 100644 docs/data/data-grid/filtering/ReadOnlyFilters.tsx.preview delete mode 100644 docs/data/data-grid/filtering/RemoveBuiltInOperators.js delete mode 100644 docs/data/data-grid/filtering/RemoveBuiltInOperators.tsx.preview delete mode 100644 docs/data/data-grid/filtering/ServerFilterGrid.js delete mode 100644 docs/data/data-grid/filtering/ServerFilterGrid.tsx.preview delete mode 100644 docs/data/data-grid/filtering/SimpleHeaderFilteringDataGridPro.js rename docs/data/data-grid/filtering/{ => demos/apply-filters-on-demand}/ApplyFiltersOnDemand.tsx (99%) create mode 100644 docs/data/data-grid/filtering/demos/apply-filters-on-demand/client.ts create mode 100644 docs/data/data-grid/filtering/demos/apply-filters-on-demand/index.ts create mode 100644 docs/data/data-grid/filtering/demos/basic-example-data-grid-pro/BasicExampleDataGridPro.tsx create mode 100644 docs/data/data-grid/filtering/demos/basic-example-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/basic-example-data-grid-pro/index.ts create mode 100644 docs/data/data-grid/filtering/demos/basic-example-data-grid/BasicExampleDataGrid.tsx create mode 100644 docs/data/data-grid/filtering/demos/basic-example-data-grid/client.ts create mode 100644 docs/data/data-grid/filtering/demos/basic-example-data-grid/index.ts rename docs/data/data-grid/filtering/{ => demos/controlled-filters}/ControlledFilters.tsx (84%) create mode 100644 docs/data/data-grid/filtering/demos/controlled-filters/client.ts create mode 100644 docs/data/data-grid/filtering/demos/controlled-filters/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-filter-column-input}/CustomFilterColumnInput.tsx (97%) create mode 100644 docs/data/data-grid/filtering/demos/custom-filter-column-input/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-filter-column-input/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-filter-panel-content}/CustomFilterPanelContent.tsx (98%) create mode 100644 docs/data/data-grid/filtering/demos/custom-filter-panel-content/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-filter-panel-content/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-filter-panel-position}/CustomFilterPanelPosition.tsx (93%) create mode 100644 docs/data/data-grid/filtering/demos/custom-filter-panel-position/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-filter-panel-position/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-header-filter-data-grid-pro}/CustomHeaderFilterDataGridPro.tsx (97%) create mode 100644 docs/data/data-grid/filtering/demos/custom-header-filter-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-header-filter-data-grid-pro/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-header-filter-operator-data-grid-pro}/CustomHeaderFilterOperatorDataGridPro.tsx (88%) create mode 100644 docs/data/data-grid/filtering/demos/custom-header-filter-operator-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-header-filter-operator-data-grid-pro/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-header-filter-single-data-grid-pro}/CustomHeaderFilterSingleDataGridPro.tsx (93%) create mode 100644 docs/data/data-grid/filtering/demos/custom-header-filter-single-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-header-filter-single-data-grid-pro/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-input-component}/CustomInputComponent.tsx (89%) create mode 100644 docs/data/data-grid/filtering/demos/custom-input-component/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-input-component/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-multi-value-operator}/CustomMultiValueOperator.tsx (94%) create mode 100644 docs/data/data-grid/filtering/demos/custom-multi-value-operator/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-multi-value-operator/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-rating-operator}/CustomRatingOperator.tsx (92%) create mode 100644 docs/data/data-grid/filtering/demos/custom-rating-operator/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-rating-operator/index.ts rename docs/data/data-grid/filtering/{ => demos/custom-selection-operator}/CustomSelectionOperator.tsx (95%) create mode 100644 docs/data/data-grid/filtering/demos/custom-selection-operator/client.ts create mode 100644 docs/data/data-grid/filtering/demos/custom-selection-operator/index.ts rename docs/data/data-grid/filtering/{ => demos/disable-action-buttons-data-grid-pro}/DisableActionButtonsDataGridPro.tsx (94%) create mode 100644 docs/data/data-grid/filtering/demos/disable-action-buttons-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/disable-action-buttons-data-grid-pro/index.ts rename docs/data/data-grid/filtering/{ => demos/disable-filtering-grid-all-columns}/DisableFilteringGridAllColumns.tsx (92%) create mode 100644 docs/data/data-grid/filtering/demos/disable-filtering-grid-all-columns/client.ts create mode 100644 docs/data/data-grid/filtering/demos/disable-filtering-grid-all-columns/index.ts rename docs/data/data-grid/filtering/{ => demos/disable-filtering-grid-some-columns}/DisableFilteringGridSomeColumns.tsx (94%) create mode 100644 docs/data/data-grid/filtering/demos/disable-filtering-grid-some-columns/client.ts create mode 100644 docs/data/data-grid/filtering/demos/disable-filtering-grid-some-columns/index.ts rename docs/data/data-grid/filtering/{ => demos/disable-multi-filters-data-grid-pro}/DisableMultiFiltersDataGridPro.tsx (93%) create mode 100644 docs/data/data-grid/filtering/demos/disable-multi-filters-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/disable-multi-filters-data-grid-pro/index.ts create mode 100644 docs/data/data-grid/filtering/demos/filter-api-no-snap/FilterApiNoSnap.tsx create mode 100644 docs/data/data-grid/filtering/demos/filter-api-no-snap/client.ts create mode 100644 docs/data/data-grid/filtering/demos/filter-api-no-snap/index.ts rename docs/data/data-grid/filtering/{ => demos/header-filtering-data-grid-pro}/HeaderFilteringDataGridPro.tsx (93%) create mode 100644 docs/data/data-grid/filtering/demos/header-filtering-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/header-filtering-data-grid-pro/index.ts rename docs/data/data-grid/filtering/{ => demos/header-filtering-inline-clear-data-grid-pro}/HeaderFilteringInlineClearDataGridPro.tsx (96%) create mode 100644 docs/data/data-grid/filtering/demos/header-filtering-inline-clear-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/header-filtering-inline-clear-data-grid-pro/index.ts rename docs/data/data-grid/filtering/{ => demos/initial-filters}/InitialFilters.tsx (95%) create mode 100644 docs/data/data-grid/filtering/demos/initial-filters/client.ts create mode 100644 docs/data/data-grid/filtering/demos/initial-filters/index.ts rename docs/data/data-grid/filtering/{ => demos/quick-filtering-custom-logic}/QuickFilteringCustomLogic.tsx (91%) create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-custom-logic/client.ts create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-custom-logic/index.ts rename docs/data/data-grid/filtering/{ => demos/quick-filtering-customized-grid}/QuickFilteringCustomizedGrid.tsx (97%) create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-customized-grid/client.ts create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-customized-grid/index.ts rename docs/data/data-grid/filtering/{ => demos/quick-filtering-diacritics}/QuickFilteringDiacritics.tsx (91%) create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-diacritics/client.ts create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-diacritics/index.ts rename docs/data/data-grid/filtering/{ => demos/quick-filtering-exclude-hidden-columns}/QuickFilteringExcludeHiddenColumns.tsx (93%) create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-exclude-hidden-columns/client.ts create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-exclude-hidden-columns/index.ts rename docs/data/data-grid/filtering/{ => demos/quick-filtering-grid}/QuickFilteringGrid.tsx (94%) create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-grid/client.ts create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-grid/index.ts rename docs/data/data-grid/filtering/{ => demos/quick-filtering-initialize}/QuickFilteringInitialize.tsx (95%) create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-initialize/client.ts create mode 100644 docs/data/data-grid/filtering/demos/quick-filtering-initialize/index.ts rename docs/data/data-grid/filtering/{ => demos/read-only-filters}/ReadOnlyFilters.tsx (87%) create mode 100644 docs/data/data-grid/filtering/demos/read-only-filters/client.ts create mode 100644 docs/data/data-grid/filtering/demos/read-only-filters/index.ts rename docs/data/data-grid/filtering/{ => demos/remove-built-in-operators}/RemoveBuiltInOperators.tsx (96%) create mode 100644 docs/data/data-grid/filtering/demos/remove-built-in-operators/client.ts create mode 100644 docs/data/data-grid/filtering/demos/remove-built-in-operators/index.ts rename docs/data/data-grid/filtering/{ => demos/server-filter-grid}/ServerFilterGrid.tsx (83%) create mode 100644 docs/data/data-grid/filtering/demos/server-filter-grid/client.ts create mode 100644 docs/data/data-grid/filtering/demos/server-filter-grid/index.ts rename docs/data/data-grid/filtering/{ => demos/simple-header-filtering-data-grid-pro}/SimpleHeaderFilteringDataGridPro.tsx (94%) create mode 100644 docs/data/data-grid/filtering/demos/simple-header-filtering-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/filtering/demos/simple-header-filtering-data-grid-pro/index.ts delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsApiNoSnap.js delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsBasic.js delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsBasic.tsx.preview delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsControlled.js delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsErrors.js delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsErrors.tsx.preview delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsReadOnly.js delete mode 100644 docs/data/data-grid/formulas/ComputedColumnsReadOnly.tsx.preview delete mode 100644 docs/data/data-grid/formulas/FormulaAutocomplete.js delete mode 100644 docs/data/data-grid/formulas/FormulaAutocomplete.tsx.preview delete mode 100644 docs/data/data-grid/formulas/FormulaBarBasic.js delete mode 100644 docs/data/data-grid/formulas/FormulaBarBasic.tsx.preview delete mode 100644 docs/data/data-grid/formulas/FormulaBasic.js delete mode 100644 docs/data/data-grid/formulas/FormulaBasic.tsx.preview delete mode 100644 docs/data/data-grid/formulas/FormulaExcelExport.js delete mode 100644 docs/data/data-grid/formulas/FormulaFillHandle.js delete mode 100644 docs/data/data-grid/formulas/FormulaFillHandle.tsx.preview delete mode 100644 docs/data/data-grid/formulas/FormulaReferenceHighlighting.js delete mode 100644 docs/data/data-grid/formulas/FormulaReferenceHighlighting.tsx.preview create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-api-no-snap/ComputedColumnsApiNoSnap.tsx create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-api-no-snap/client.ts create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-api-no-snap/index.ts rename docs/data/data-grid/formulas/{ => demos/computed-columns-basic}/ComputedColumnsBasic.tsx (95%) create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-basic/client.ts create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-basic/index.ts rename docs/data/data-grid/formulas/{ => demos/computed-columns-controlled}/ComputedColumnsControlled.tsx (96%) create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-controlled/client.ts create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-controlled/index.ts rename docs/data/data-grid/formulas/{ => demos/computed-columns-errors}/ComputedColumnsErrors.tsx (94%) create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-errors/client.ts create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-errors/index.ts rename docs/data/data-grid/formulas/{ => demos/computed-columns-read-only}/ComputedColumnsReadOnly.tsx (93%) create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-read-only/client.ts create mode 100644 docs/data/data-grid/formulas/demos/computed-columns-read-only/index.ts rename docs/data/data-grid/formulas/{ => demos/formula-autocomplete}/FormulaAutocomplete.tsx (96%) create mode 100644 docs/data/data-grid/formulas/demos/formula-autocomplete/client.ts create mode 100644 docs/data/data-grid/formulas/demos/formula-autocomplete/index.ts rename docs/data/data-grid/formulas/{ => demos/formula-bar-basic}/FormulaBarBasic.tsx (92%) create mode 100644 docs/data/data-grid/formulas/demos/formula-bar-basic/client.ts create mode 100644 docs/data/data-grid/formulas/demos/formula-bar-basic/index.ts rename docs/data/data-grid/formulas/{ => demos/formula-basic}/FormulaBasic.tsx (94%) create mode 100644 docs/data/data-grid/formulas/demos/formula-basic/client.ts create mode 100644 docs/data/data-grid/formulas/demos/formula-basic/index.ts rename docs/data/data-grid/formulas/{ => demos/formula-excel-export}/FormulaExcelExport.tsx (93%) create mode 100644 docs/data/data-grid/formulas/demos/formula-excel-export/client.ts create mode 100644 docs/data/data-grid/formulas/demos/formula-excel-export/index.ts rename docs/data/data-grid/formulas/{ => demos/formula-fill-handle}/FormulaFillHandle.tsx (91%) create mode 100644 docs/data/data-grid/formulas/demos/formula-fill-handle/client.ts create mode 100644 docs/data/data-grid/formulas/demos/formula-fill-handle/index.ts rename docs/data/data-grid/formulas/{ => demos/formula-reference-highlighting}/FormulaReferenceHighlighting.tsx (94%) create mode 100644 docs/data/data-grid/formulas/demos/formula-reference-highlighting/client.ts create mode 100644 docs/data/data-grid/formulas/demos/formula-reference-highlighting/index.ts delete mode 100644 docs/data/data-grid/layout/AutoHeightGrid.js delete mode 100644 docs/data/data-grid/layout/AutoHeightGrid.tsx.preview delete mode 100644 docs/data/data-grid/layout/FixedSizeGrid.js delete mode 100644 docs/data/data-grid/layout/FixedSizeGrid.tsx.preview delete mode 100644 docs/data/data-grid/layout/FlexGrid.js delete mode 100644 docs/data/data-grid/layout/FlexGrid.tsx.preview delete mode 100644 docs/data/data-grid/layout/GridOverlayHeight.js delete mode 100644 docs/data/data-grid/layout/GridOverlayHeight.tsx.preview delete mode 100644 docs/data/data-grid/layout/HeightGrid.js delete mode 100644 docs/data/data-grid/layout/HeightGrid.tsx.preview delete mode 100644 docs/data/data-grid/layout/MinMaxHeightGrid.js rename docs/data/data-grid/layout/{ => demos/auto-height-grid}/AutoHeightGrid.tsx (95%) create mode 100644 docs/data/data-grid/layout/demos/auto-height-grid/client.ts create mode 100644 docs/data/data-grid/layout/demos/auto-height-grid/index.ts rename docs/data/data-grid/layout/{ => demos/fixed-size-grid}/FixedSizeGrid.tsx (90%) create mode 100644 docs/data/data-grid/layout/demos/fixed-size-grid/client.ts create mode 100644 docs/data/data-grid/layout/demos/fixed-size-grid/index.ts rename docs/data/data-grid/layout/{ => demos/flex-grid}/FlexGrid.tsx (95%) create mode 100644 docs/data/data-grid/layout/demos/flex-grid/client.ts create mode 100644 docs/data/data-grid/layout/demos/flex-grid/index.ts rename docs/data/data-grid/layout/{ => demos/grid-overlay-height}/GridOverlayHeight.tsx (98%) create mode 100644 docs/data/data-grid/layout/demos/grid-overlay-height/client.ts create mode 100644 docs/data/data-grid/layout/demos/grid-overlay-height/index.ts rename docs/data/data-grid/layout/{ => demos/height-grid}/HeightGrid.tsx (86%) create mode 100644 docs/data/data-grid/layout/demos/height-grid/client.ts create mode 100644 docs/data/data-grid/layout/demos/height-grid/index.ts rename docs/data/data-grid/layout/{ => demos/min-max-height-grid}/MinMaxHeightGrid.tsx (98%) create mode 100644 docs/data/data-grid/layout/demos/min-max-height-grid/client.ts create mode 100644 docs/data/data-grid/layout/demos/min-max-height-grid/index.ts delete mode 100644 docs/data/data-grid/list-view/ListView.js delete mode 100644 docs/data/data-grid/list-view/ListViewAdvanced.js delete mode 100644 docs/data/data-grid/list-view/ListViewEdit.js delete mode 100644 docs/data/data-grid/list-view/ListViewEdit.tsx.preview delete mode 100644 docs/data/data-grid/list-view/ListViewMediaQuery.js delete mode 100644 docs/data/data-grid/list-view/ListViewMediaQuery.tsx.preview rename docs/data/data-grid/list-view/{ => demos/list-view-advanced}/ListViewAdvanced.tsx (94%) create mode 100644 docs/data/data-grid/list-view/demos/list-view-advanced/client.ts create mode 100644 docs/data/data-grid/list-view/demos/list-view-advanced/index.ts rename docs/data/data-grid/list-view/{ => demos/list-view-edit}/ListViewEdit.tsx (97%) create mode 100644 docs/data/data-grid/list-view/demos/list-view-edit/client.ts create mode 100644 docs/data/data-grid/list-view/demos/list-view-edit/index.ts rename docs/data/data-grid/list-view/{ => demos/list-view-media-query}/ListViewMediaQuery.tsx (90%) create mode 100644 docs/data/data-grid/list-view/demos/list-view-media-query/client.ts create mode 100644 docs/data/data-grid/list-view/demos/list-view-media-query/index.ts rename docs/data/data-grid/list-view/{ => demos/list-view}/ListView.tsx (98%) create mode 100644 docs/data/data-grid/list-view/demos/list-view/client.ts create mode 100644 docs/data/data-grid/list-view/demos/list-view/index.ts delete mode 100644 docs/data/data-grid/localization/CustomLocaleTextGrid.js delete mode 100644 docs/data/data-grid/localization/CustomLocaleTextGrid.tsx.preview delete mode 100644 docs/data/data-grid/localization/DataGridLocalisationTableNoSnap.js delete mode 100644 docs/data/data-grid/localization/DataGridRTL.js delete mode 100644 docs/data/data-grid/localization/DataGridRTL.tsx.preview delete mode 100644 docs/data/data-grid/localization/PaginationNumberFormatting.js delete mode 100644 docs/data/data-grid/localization/PaginationNumberFormatting.tsx.preview rename docs/data/data-grid/localization/{ => demos/custom-locale-text-grid}/CustomLocaleTextGrid.tsx (91%) create mode 100644 docs/data/data-grid/localization/demos/custom-locale-text-grid/client.ts create mode 100644 docs/data/data-grid/localization/demos/custom-locale-text-grid/index.ts create mode 100644 docs/data/data-grid/localization/demos/data-grid-localisation-table-no-snap/DataGridLocalisationTableNoSnap.tsx create mode 100644 docs/data/data-grid/localization/demos/data-grid-localisation-table-no-snap/client.ts create mode 100644 docs/data/data-grid/localization/demos/data-grid-localisation-table-no-snap/index.ts rename docs/data/data-grid/localization/{ => demos/data-grid-rtl}/DataGridRTL.tsx (93%) create mode 100644 docs/data/data-grid/localization/demos/data-grid-rtl/client.ts create mode 100644 docs/data/data-grid/localization/demos/data-grid-rtl/index.ts rename docs/data/data-grid/localization/{ => demos/pagination-number-formatting}/PaginationNumberFormatting.tsx (97%) create mode 100644 docs/data/data-grid/localization/demos/pagination-number-formatting/client.ts create mode 100644 docs/data/data-grid/localization/demos/pagination-number-formatting/index.ts delete mode 100644 docs/data/data-grid/master-detail/ControlMasterDetail.js delete mode 100644 docs/data/data-grid/master-detail/CustomizeDetailPanelToggle.js delete mode 100644 docs/data/data-grid/master-detail/CustomizeDetailPanelToggle.tsx.preview delete mode 100644 docs/data/data-grid/master-detail/DetailPanelApiNoSnap.js delete mode 100644 docs/data/data-grid/master-detail/DetailPanelAutoHeight.js delete mode 100644 docs/data/data-grid/master-detail/DetailPanelAutoHeight.tsx.preview delete mode 100644 docs/data/data-grid/master-detail/DetailPanelConditional.js delete mode 100644 docs/data/data-grid/master-detail/DetailPanelConditional.tsx.preview delete mode 100644 docs/data/data-grid/master-detail/FormDetailPanel.js delete mode 100644 docs/data/data-grid/master-detail/FormDetailPanel.tsx.preview delete mode 100644 docs/data/data-grid/master-detail/FullWidthDetailPanel.js delete mode 100644 docs/data/data-grid/master-detail/FullWidthDetailPanel.tsx.preview delete mode 100644 docs/data/data-grid/master-detail/LazyLoadingDetailPanel.js delete mode 100644 docs/data/data-grid/master-detail/LazyLoadingDetailPanel.tsx.preview delete mode 100644 docs/data/data-grid/master-detail/MasterDetailEmailExample.js delete mode 100644 docs/data/data-grid/master-detail/MasterDetailEmailExample.tsx.preview rename docs/data/data-grid/master-detail/{ => demos/control-master-detail}/ControlMasterDetail.tsx (95%) create mode 100644 docs/data/data-grid/master-detail/demos/control-master-detail/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/control-master-detail/index.ts rename docs/data/data-grid/master-detail/{ => demos/customize-detail-panel-toggle}/CustomizeDetailPanelToggle.tsx (97%) create mode 100644 docs/data/data-grid/master-detail/demos/customize-detail-panel-toggle/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/customize-detail-panel-toggle/index.ts create mode 100644 docs/data/data-grid/master-detail/demos/detail-panel-api-no-snap/DetailPanelApiNoSnap.tsx create mode 100644 docs/data/data-grid/master-detail/demos/detail-panel-api-no-snap/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/detail-panel-api-no-snap/index.ts rename docs/data/data-grid/master-detail/{ => demos/detail-panel-auto-height}/DetailPanelAutoHeight.tsx (98%) create mode 100644 docs/data/data-grid/master-detail/demos/detail-panel-auto-height/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/detail-panel-auto-height/index.ts rename docs/data/data-grid/master-detail/{ => demos/detail-panel-conditional}/DetailPanelConditional.tsx (90%) create mode 100644 docs/data/data-grid/master-detail/demos/detail-panel-conditional/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/detail-panel-conditional/index.ts rename docs/data/data-grid/master-detail/{ => demos/form-detail-panel}/FormDetailPanel.tsx (96%) create mode 100644 docs/data/data-grid/master-detail/demos/form-detail-panel/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/form-detail-panel/index.ts rename docs/data/data-grid/master-detail/{ => demos/full-width-detail-panel}/FullWidthDetailPanel.tsx (97%) create mode 100644 docs/data/data-grid/master-detail/demos/full-width-detail-panel/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/full-width-detail-panel/index.ts rename docs/data/data-grid/master-detail/{ => demos/lazy-loading-detail-panel}/LazyLoadingDetailPanel.tsx (95%) create mode 100644 docs/data/data-grid/master-detail/demos/lazy-loading-detail-panel/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/lazy-loading-detail-panel/index.ts rename docs/data/data-grid/master-detail/{ => demos/master-detail-email-example}/MasterDetailEmailExample.tsx (97%) create mode 100644 docs/data/data-grid/master-detail/demos/master-detail-email-example/client.ts create mode 100644 docs/data/data-grid/master-detail/demos/master-detail-email-example/index.ts delete mode 100644 docs/data/data-grid/overlays/EmptyPivotOverlay.js delete mode 100644 docs/data/data-grid/overlays/EmptyPivotOverlay.tsx.preview delete mode 100644 docs/data/data-grid/overlays/LoadingOverlayCircularProgress.js delete mode 100644 docs/data/data-grid/overlays/LoadingOverlayCircularProgress.tsx.preview delete mode 100644 docs/data/data-grid/overlays/LoadingOverlayCustom.js delete mode 100644 docs/data/data-grid/overlays/LoadingOverlayCustom.tsx.preview delete mode 100644 docs/data/data-grid/overlays/LoadingOverlayLinearProgress.js delete mode 100644 docs/data/data-grid/overlays/LoadingOverlayLinearProgress.tsx.preview delete mode 100644 docs/data/data-grid/overlays/LoadingOverlaySkeleton.js delete mode 100644 docs/data/data-grid/overlays/LoadingOverlaySkeleton.tsx.preview delete mode 100644 docs/data/data-grid/overlays/NoColumnsOverlay.js delete mode 100644 docs/data/data-grid/overlays/NoColumnsOverlay.tsx.preview delete mode 100644 docs/data/data-grid/overlays/NoColumnsOverlayCustom.js delete mode 100644 docs/data/data-grid/overlays/NoColumnsOverlayCustom.tsx.preview delete mode 100644 docs/data/data-grid/overlays/NoResultsOverlay.js delete mode 100644 docs/data/data-grid/overlays/NoResultsOverlay.tsx.preview delete mode 100644 docs/data/data-grid/overlays/NoResultsOverlayCustom.js delete mode 100644 docs/data/data-grid/overlays/NoResultsOverlayCustom.tsx.preview delete mode 100644 docs/data/data-grid/overlays/NoRowsOverlay.js delete mode 100644 docs/data/data-grid/overlays/NoRowsOverlay.tsx.preview delete mode 100644 docs/data/data-grid/overlays/NoRowsOverlayCustom.js delete mode 100644 docs/data/data-grid/overlays/NoRowsOverlayCustom.tsx.preview rename docs/data/data-grid/overlays/{ => demos/empty-pivot-overlay}/EmptyPivotOverlay.tsx (93%) create mode 100644 docs/data/data-grid/overlays/demos/empty-pivot-overlay/client.ts create mode 100644 docs/data/data-grid/overlays/demos/empty-pivot-overlay/index.ts rename docs/data/data-grid/overlays/{ => demos/loading-overlay-circular-progress}/LoadingOverlayCircularProgress.tsx (93%) create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-circular-progress/client.ts create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-circular-progress/index.ts rename docs/data/data-grid/overlays/{ => demos/loading-overlay-custom}/LoadingOverlayCustom.tsx (91%) create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-custom/client.ts create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-custom/index.ts rename docs/data/data-grid/overlays/{ => demos/loading-overlay-linear-progress}/LoadingOverlayLinearProgress.tsx (92%) create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-linear-progress/client.ts create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-linear-progress/index.ts rename docs/data/data-grid/overlays/{ => demos/loading-overlay-skeleton}/LoadingOverlaySkeleton.tsx (92%) create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-skeleton/client.ts create mode 100644 docs/data/data-grid/overlays/demos/loading-overlay-skeleton/index.ts rename docs/data/data-grid/overlays/{ => demos/no-columns-overlay-custom}/NoColumnsOverlayCustom.tsx (98%) create mode 100644 docs/data/data-grid/overlays/demos/no-columns-overlay-custom/client.ts create mode 100644 docs/data/data-grid/overlays/demos/no-columns-overlay-custom/index.ts rename docs/data/data-grid/overlays/{ => demos/no-columns-overlay}/NoColumnsOverlay.tsx (94%) create mode 100644 docs/data/data-grid/overlays/demos/no-columns-overlay/client.ts create mode 100644 docs/data/data-grid/overlays/demos/no-columns-overlay/index.ts rename docs/data/data-grid/overlays/{ => demos/no-results-overlay-custom}/NoResultsOverlayCustom.tsx (98%) create mode 100644 docs/data/data-grid/overlays/demos/no-results-overlay-custom/client.ts create mode 100644 docs/data/data-grid/overlays/demos/no-results-overlay-custom/index.ts rename docs/data/data-grid/overlays/{ => demos/no-results-overlay}/NoResultsOverlay.tsx (93%) create mode 100644 docs/data/data-grid/overlays/demos/no-results-overlay/client.ts create mode 100644 docs/data/data-grid/overlays/demos/no-results-overlay/index.ts rename docs/data/data-grid/overlays/{ => demos/no-rows-overlay-custom}/NoRowsOverlayCustom.tsx (98%) create mode 100644 docs/data/data-grid/overlays/demos/no-rows-overlay-custom/client.ts create mode 100644 docs/data/data-grid/overlays/demos/no-rows-overlay-custom/index.ts rename docs/data/data-grid/overlays/{ => demos/no-rows-overlay}/NoRowsOverlay.tsx (89%) create mode 100644 docs/data/data-grid/overlays/demos/no-rows-overlay/client.ts create mode 100644 docs/data/data-grid/overlays/demos/no-rows-overlay/index.ts delete mode 100644 docs/data/data-grid/overview/DataGridDemo.js delete mode 100644 docs/data/data-grid/overview/DataGridDemo.tsx.preview delete mode 100644 docs/data/data-grid/overview/DataGridPremiumDemo.js delete mode 100644 docs/data/data-grid/overview/DataGridPremiumDemo.tsx.preview delete mode 100644 docs/data/data-grid/overview/DataGridProDemo.js delete mode 100644 docs/data/data-grid/overview/DataGridProDemo.tsx.preview rename docs/data/data-grid/overview/{ => demos/data-grid-demo}/DataGridDemo.tsx (92%) create mode 100644 docs/data/data-grid/overview/demos/data-grid-demo/client.ts create mode 100644 docs/data/data-grid/overview/demos/data-grid-demo/index.ts rename docs/data/data-grid/overview/{ => demos/data-grid-premium-demo}/DataGridPremiumDemo.tsx (96%) create mode 100644 docs/data/data-grid/overview/demos/data-grid-premium-demo/client.ts create mode 100644 docs/data/data-grid/overview/demos/data-grid-premium-demo/index.ts rename docs/data/data-grid/overview/{ => demos/data-grid-pro-demo}/DataGridProDemo.tsx (92%) create mode 100644 docs/data/data-grid/overview/demos/data-grid-pro-demo/client.ts create mode 100644 docs/data/data-grid/overview/demos/data-grid-pro-demo/index.ts delete mode 100644 docs/data/data-grid/pagination/CursorPaginationGrid.js delete mode 100644 docs/data/data-grid/pagination/PageSizeAuto.js delete mode 100644 docs/data/data-grid/pagination/PageSizeAutoPremium.js delete mode 100644 docs/data/data-grid/pagination/PageSizeAutoPremium.tsx.preview delete mode 100644 docs/data/data-grid/pagination/PageSizeCustomOptions.js delete mode 100644 docs/data/data-grid/pagination/PageSizeCustomOptions.tsx.preview delete mode 100644 docs/data/data-grid/pagination/PaginationApiNoSnap.js delete mode 100644 docs/data/data-grid/pagination/PaginationCommunityNoSnap.js delete mode 100644 docs/data/data-grid/pagination/PaginationCommunityNoSnap.tsx.preview delete mode 100644 docs/data/data-grid/pagination/PaginationModelControlled.js delete mode 100644 docs/data/data-grid/pagination/PaginationModelControlled.tsx.preview delete mode 100644 docs/data/data-grid/pagination/PaginationModelInitialState.js delete mode 100644 docs/data/data-grid/pagination/PaginationModelInitialState.tsx.preview delete mode 100644 docs/data/data-grid/pagination/ServerPaginationFilterSortGrid.js delete mode 100644 docs/data/data-grid/pagination/ServerPaginationFilterSortGrid.tsx.preview delete mode 100644 docs/data/data-grid/pagination/ServerPaginationGrid.js delete mode 100644 docs/data/data-grid/pagination/ServerPaginationGrid.tsx.preview delete mode 100644 docs/data/data-grid/pagination/ServerPaginationGridEstimated.js delete mode 100644 docs/data/data-grid/pagination/ServerPaginationGridNoRowCount.js delete mode 100644 docs/data/data-grid/pagination/ServerPaginationGridNoRowCount.tsx.preview rename docs/data/data-grid/pagination/{ => demos/cursor-pagination-grid}/CursorPaginationGrid.tsx (97%) create mode 100644 docs/data/data-grid/pagination/demos/cursor-pagination-grid/client.ts create mode 100644 docs/data/data-grid/pagination/demos/cursor-pagination-grid/index.ts rename docs/data/data-grid/pagination/{ => demos/page-size-auto-premium}/PageSizeAutoPremium.tsx (94%) create mode 100644 docs/data/data-grid/pagination/demos/page-size-auto-premium/client.ts create mode 100644 docs/data/data-grid/pagination/demos/page-size-auto-premium/index.ts rename docs/data/data-grid/pagination/{ => demos/page-size-auto}/PageSizeAuto.tsx (96%) create mode 100644 docs/data/data-grid/pagination/demos/page-size-auto/client.ts create mode 100644 docs/data/data-grid/pagination/demos/page-size-auto/index.ts rename docs/data/data-grid/pagination/{ => demos/page-size-custom-options}/PageSizeCustomOptions.tsx (93%) create mode 100644 docs/data/data-grid/pagination/demos/page-size-custom-options/client.ts create mode 100644 docs/data/data-grid/pagination/demos/page-size-custom-options/index.ts create mode 100644 docs/data/data-grid/pagination/demos/pagination-api-no-snap/PaginationApiNoSnap.tsx create mode 100644 docs/data/data-grid/pagination/demos/pagination-api-no-snap/client.ts create mode 100644 docs/data/data-grid/pagination/demos/pagination-api-no-snap/index.ts rename docs/data/data-grid/pagination/{ => demos/pagination-community-no-snap}/PaginationCommunityNoSnap.tsx (89%) create mode 100644 docs/data/data-grid/pagination/demos/pagination-community-no-snap/client.ts create mode 100644 docs/data/data-grid/pagination/demos/pagination-community-no-snap/index.ts rename docs/data/data-grid/pagination/{ => demos/pagination-model-controlled}/PaginationModelControlled.tsx (93%) create mode 100644 docs/data/data-grid/pagination/demos/pagination-model-controlled/client.ts create mode 100644 docs/data/data-grid/pagination/demos/pagination-model-controlled/index.ts rename docs/data/data-grid/pagination/{ => demos/pagination-model-initial-state}/PaginationModelInitialState.tsx (94%) create mode 100644 docs/data/data-grid/pagination/demos/pagination-model-initial-state/client.ts create mode 100644 docs/data/data-grid/pagination/demos/pagination-model-initial-state/index.ts rename docs/data/data-grid/pagination/{ => demos/server-pagination-filter-sort-grid}/ServerPaginationFilterSortGrid.tsx (91%) create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-filter-sort-grid/client.ts create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-filter-sort-grid/index.ts rename docs/data/data-grid/pagination/{ => demos/server-pagination-grid-estimated}/ServerPaginationGridEstimated.tsx (97%) create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-grid-estimated/client.ts create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-grid-estimated/index.ts rename docs/data/data-grid/pagination/{ => demos/server-pagination-grid-no-row-count}/ServerPaginationGridNoRowCount.tsx (89%) create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-grid-no-row-count/client.ts create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-grid-no-row-count/index.ts rename docs/data/data-grid/pagination/{ => demos/server-pagination-grid}/ServerPaginationGrid.tsx (96%) create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-grid/client.ts create mode 100644 docs/data/data-grid/pagination/demos/server-pagination-grid/index.ts delete mode 100644 docs/data/data-grid/performance/GridVisualization.js delete mode 100644 docs/data/data-grid/performance/GridVisualization.tsx.preview rename docs/data/data-grid/performance/{ => demos/grid-visualization}/GridVisualization.tsx (97%) create mode 100644 docs/data/data-grid/performance/demos/grid-visualization/client.ts create mode 100644 docs/data/data-grid/performance/demos/grid-visualization/index.ts delete mode 100644 docs/data/data-grid/pivoting/GridGetPivotDerivedColumns.js delete mode 100644 docs/data/data-grid/pivoting/GridNonPivotableColumns.js delete mode 100644 docs/data/data-grid/pivoting/GridNonPivotableColumns.tsx.preview delete mode 100644 docs/data/data-grid/pivoting/GridNonPivoted.js delete mode 100644 docs/data/data-grid/pivoting/GridNonPivoted.tsx.preview delete mode 100644 docs/data/data-grid/pivoting/GridPivotingColumns.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingColumns.tsx.preview delete mode 100644 docs/data/data-grid/pivoting/GridPivotingCommodities.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingControlled.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingFinancial.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingInitialState.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingInitialState.tsx.preview delete mode 100644 docs/data/data-grid/pivoting/GridPivotingMovies.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingMultipleValues.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingMultipleValues.tsx.preview delete mode 100644 docs/data/data-grid/pivoting/GridPivotingQuickStart.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingQuickStart.tsx.preview delete mode 100644 docs/data/data-grid/pivoting/GridPivotingRows.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingRows.tsx.preview delete mode 100644 docs/data/data-grid/pivoting/GridPivotingValues.js delete mode 100644 docs/data/data-grid/pivoting/GridPivotingValues.tsx.preview rename docs/data/data-grid/pivoting/{ => demos/grid-get-pivot-derived-columns}/GridGetPivotDerivedColumns.tsx (96%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-get-pivot-derived-columns/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-get-pivot-derived-columns/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-non-pivotable-columns}/GridNonPivotableColumns.tsx (93%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-non-pivotable-columns/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-non-pivotable-columns/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-non-pivoted}/GridNonPivoted.tsx (92%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-non-pivoted/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-non-pivoted/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-columns}/GridPivotingColumns.tsx (93%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-columns/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-columns/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-commodities}/GridPivotingCommodities.tsx (95%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-commodities/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-commodities/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-controlled}/GridPivotingControlled.tsx (94%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-controlled/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-controlled/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-financial}/GridPivotingFinancial.tsx (93%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-financial/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-financial/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-initial-state}/GridPivotingInitialState.tsx (93%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-initial-state/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-initial-state/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-movies}/GridPivotingMovies.tsx (90%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-movies/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-movies/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-multiple-values}/GridPivotingMultipleValues.tsx (93%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-multiple-values/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-multiple-values/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-quick-start}/GridPivotingQuickStart.tsx (95%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-quick-start/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-quick-start/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-rows}/GridPivotingRows.tsx (93%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-rows/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-rows/index.ts rename docs/data/data-grid/pivoting/{ => demos/grid-pivoting-values}/GridPivotingValues.tsx (93%) create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-values/client.ts create mode 100644 docs/data/data-grid/pivoting/demos/grid-pivoting-values/index.ts delete mode 100644 docs/data/data-grid/quickstart/RenderComponent.js delete mode 100644 docs/data/data-grid/quickstart/RenderComponent.tsx.preview rename docs/data/data-grid/quickstart/{ => demos/render-component}/RenderComponent.tsx (81%) create mode 100644 docs/data/data-grid/quickstart/demos/render-component/client.ts create mode 100644 docs/data/data-grid/quickstart/demos/render-component/index.ts delete mode 100644 docs/data/data-grid/recipes-editing/AutocompleteEditing.js delete mode 100644 docs/data/data-grid/recipes-editing/AutocompleteEditing.tsx.preview delete mode 100644 docs/data/data-grid/recipes-editing/BulkEditing.js delete mode 100644 docs/data/data-grid/recipes-editing/BulkEditingPremiumNoSnap.js delete mode 100644 docs/data/data-grid/recipes-editing/ConditionalValidationGrid.js delete mode 100644 docs/data/data-grid/recipes-editing/ConditionalValidationGrid.tsx.preview delete mode 100644 docs/data/data-grid/recipes-editing/LinkedFieldsCellEditing.js delete mode 100644 docs/data/data-grid/recipes-editing/LinkedFieldsCellEditing.tsx.preview delete mode 100644 docs/data/data-grid/recipes-editing/LinkedFieldsRowEditing.js delete mode 100644 docs/data/data-grid/recipes-editing/LinkedFieldsRowEditing.tsx.preview delete mode 100644 docs/data/data-grid/recipes-editing/MultilineEditing.js delete mode 100644 docs/data/data-grid/recipes-editing/MultilineEditing.tsx.preview delete mode 100644 docs/data/data-grid/recipes-editing/SingleClickEditing.js delete mode 100644 docs/data/data-grid/recipes-editing/SingleClickEditing.tsx.preview rename docs/data/data-grid/recipes-editing/{ => demos/autocomplete-editing}/AutocompleteEditing.tsx (91%) create mode 100644 docs/data/data-grid/recipes-editing/demos/autocomplete-editing/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/autocomplete-editing/index.ts rename docs/data/data-grid/recipes-editing/{ => demos/bulk-editing-premium-no-snap}/BulkEditingPremiumNoSnap.tsx (98%) create mode 100644 docs/data/data-grid/recipes-editing/demos/bulk-editing-premium-no-snap/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/bulk-editing-premium-no-snap/index.ts rename docs/data/data-grid/recipes-editing/{ => demos/bulk-editing}/BulkEditing.tsx (98%) create mode 100644 docs/data/data-grid/recipes-editing/demos/bulk-editing/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/bulk-editing/index.ts rename docs/data/data-grid/recipes-editing/{ => demos/conditional-validation-grid}/ConditionalValidationGrid.tsx (93%) create mode 100644 docs/data/data-grid/recipes-editing/demos/conditional-validation-grid/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/conditional-validation-grid/index.ts rename docs/data/data-grid/recipes-editing/{ => demos/linked-fields-cell-editing}/LinkedFieldsCellEditing.tsx (97%) create mode 100644 docs/data/data-grid/recipes-editing/demos/linked-fields-cell-editing/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/linked-fields-cell-editing/index.ts rename docs/data/data-grid/recipes-editing/{ => demos/linked-fields-row-editing}/LinkedFieldsRowEditing.tsx (96%) create mode 100644 docs/data/data-grid/recipes-editing/demos/linked-fields-row-editing/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/linked-fields-row-editing/index.ts rename docs/data/data-grid/recipes-editing/{ => demos/multiline-editing}/MultilineEditing.tsx (95%) create mode 100644 docs/data/data-grid/recipes-editing/demos/multiline-editing/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/multiline-editing/index.ts rename docs/data/data-grid/recipes-editing/{ => demos/single-click-editing}/SingleClickEditing.tsx (96%) create mode 100644 docs/data/data-grid/recipes-editing/demos/single-click-editing/client.ts create mode 100644 docs/data/data-grid/recipes-editing/demos/single-click-editing/index.ts delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingChildRowCount.js delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingChildRowCount.tsx.preview delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingExpandOnRowClick.js delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingExpandOnRowClick.tsx.preview delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingMultipleFields.js delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingMultipleFields.tsx.preview delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingPinning.js delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingPinning.tsx.preview delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingSortByChildRows.js delete mode 100644 docs/data/data-grid/recipes-row-grouping/RowGroupingSortByChildRows.tsx.preview rename docs/data/data-grid/recipes-row-grouping/{ => demos/row-grouping-child-row-count}/RowGroupingChildRowCount.tsx (92%) create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-child-row-count/client.ts create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-child-row-count/index.ts rename docs/data/data-grid/recipes-row-grouping/{ => demos/row-grouping-expand-on-row-click}/RowGroupingExpandOnRowClick.tsx (91%) create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-expand-on-row-click/client.ts create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-expand-on-row-click/index.ts rename docs/data/data-grid/recipes-row-grouping/{ => demos/row-grouping-multiple-fields}/RowGroupingMultipleFields.tsx (93%) create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-multiple-fields/client.ts create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-multiple-fields/index.ts rename docs/data/data-grid/recipes-row-grouping/{ => demos/row-grouping-pinning}/RowGroupingPinning.tsx (94%) create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-pinning/client.ts create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-pinning/index.ts rename docs/data/data-grid/recipes-row-grouping/{ => demos/row-grouping-sort-by-child-rows}/RowGroupingSortByChildRows.tsx (95%) create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-sort-by-child-rows/client.ts create mode 100644 docs/data/data-grid/recipes-row-grouping/demos/row-grouping-sort-by-child-rows/index.ts delete mode 100644 docs/data/data-grid/row-definition/RowsGrid.js delete mode 100644 docs/data/data-grid/row-definition/RowsGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-definition/RowsGridWithGetRowId.js delete mode 100644 docs/data/data-grid/row-definition/RowsGridWithGetRowId.tsx.preview rename docs/data/data-grid/row-definition/{ => demos/rows-grid-with-get-row-id}/RowsGridWithGetRowId.tsx (88%) create mode 100644 docs/data/data-grid/row-definition/demos/rows-grid-with-get-row-id/client.ts create mode 100644 docs/data/data-grid/row-definition/demos/rows-grid-with-get-row-id/index.ts rename docs/data/data-grid/row-definition/{ => demos/rows-grid}/RowsGrid.tsx (86%) create mode 100644 docs/data/data-grid/row-definition/demos/rows-grid/client.ts create mode 100644 docs/data/data-grid/row-definition/demos/rows-grid/index.ts delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingApiNoSnap.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingBasicExample.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingBasicExample.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingColDefCanBeGrouped.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingColDefCanBeGrouped.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingControlled.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingControlled.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomCell.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomCell.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomCellDefault.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomCellDefault.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomCellIndent.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomCellIndent.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomGroupingColDefCallback.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomGroupingColDefObject.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingCustomGroupingColDefObject.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingDefaultExpansionDepth.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingDefaultExpansionDepth.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingDisabled.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingDisabled.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingFilteringSingleGroupingColDef.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingFullExample.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingGetRowGroupChildren.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingGroupingValueGetter.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingGroupingValueGetter.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingGroupingValueSetter.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingGroupingValueSetter.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingHideDescendantCount.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingHideDescendantCount.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingInitialState.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingInitialState.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingIsGroupExpandedByDefault.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingIsGroupExpandedByDefault.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingLeafWithValue.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingLeafWithValue.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingMultipleGroupingCol.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingMultipleGroupingCol.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingReadOnly.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingReadOnly.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingReordering.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingReordering.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingRowsWithMissingGroups.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingRowsWithMissingGroups.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingSingleGroupingCol.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingSingleGroupingCol.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingSortingMultipleGroupingColDef.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingSortingMultipleGroupingColDef.tsx.preview delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingUseKeepGroupedColumnsHidden.js delete mode 100644 docs/data/data-grid/row-grouping/RowGroupingUseKeepGroupedColumnsHidden.tsx.preview create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-api-no-snap/RowGroupingApiNoSnap.tsx create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-api-no-snap/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-api-no-snap/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-basic-example}/RowGroupingBasicExample.tsx (93%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-basic-example/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-basic-example/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-col-def-can-be-grouped}/RowGroupingColDefCanBeGrouped.tsx (90%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-col-def-can-be-grouped/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-col-def-can-be-grouped/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-controlled}/RowGroupingControlled.tsx (75%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-controlled/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-controlled/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-custom-cell-default}/RowGroupingCustomCellDefault.tsx (86%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-cell-default/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-cell-default/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-custom-cell-indent}/RowGroupingCustomCellIndent.tsx (94%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-cell-indent/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-cell-indent/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-custom-cell}/RowGroupingCustomCell.tsx (87%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-cell/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-cell/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-custom-grouping-col-def-callback}/RowGroupingCustomGroupingColDefCallback.tsx (96%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-grouping-col-def-callback/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-grouping-col-def-callback/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-custom-grouping-col-def-object}/RowGroupingCustomGroupingColDefObject.tsx (90%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-grouping-col-def-object/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-custom-grouping-col-def-object/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-default-expansion-depth}/RowGroupingDefaultExpansionDepth.tsx (94%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-default-expansion-depth/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-default-expansion-depth/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-disabled}/RowGroupingDisabled.tsx (88%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-disabled/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-disabled/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-filtering-single-grouping-col-def}/RowGroupingFilteringSingleGroupingColDef.tsx (95%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-filtering-single-grouping-col-def/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-filtering-single-grouping-col-def/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-full-example}/RowGroupingFullExample.tsx (92%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-full-example/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-full-example/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-get-row-group-children}/RowGroupingGetRowGroupChildren.tsx (89%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-get-row-group-children/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-get-row-group-children/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-grouping-value-getter}/RowGroupingGroupingValueGetter.tsx (92%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-grouping-value-getter/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-grouping-value-getter/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-grouping-value-setter}/RowGroupingGroupingValueSetter.tsx (88%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-grouping-value-setter/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-grouping-value-setter/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-hide-descendant-count}/RowGroupingHideDescendantCount.tsx (90%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-hide-descendant-count/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-hide-descendant-count/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-initial-state}/RowGroupingInitialState.tsx (91%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-initial-state/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-initial-state/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-is-group-expanded-by-default}/RowGroupingIsGroupExpandedByDefault.tsx (89%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-is-group-expanded-by-default/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-is-group-expanded-by-default/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-leaf-with-value}/RowGroupingLeafWithValue.tsx (91%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-leaf-with-value/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-leaf-with-value/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-multiple-grouping-col}/RowGroupingMultipleGroupingCol.tsx (93%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-multiple-grouping-col/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-multiple-grouping-col/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-propagate-selection}/RowGroupingPropagateSelection.tsx (94%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-propagate-selection/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-propagate-selection/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-read-only}/RowGroupingReadOnly.tsx (80%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-read-only/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-read-only/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-reordering}/RowGroupingReordering.tsx (93%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-reordering/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-reordering/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-rows-with-missing-groups}/RowGroupingRowsWithMissingGroups.tsx (93%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-rows-with-missing-groups/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-rows-with-missing-groups/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-set-children-expansion}/RowGroupingSetChildrenExpansion.tsx (93%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-set-children-expansion/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-set-children-expansion/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-single-grouping-col}/RowGroupingSingleGroupingCol.tsx (93%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-single-grouping-col/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-single-grouping-col/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-sorting-multiple-grouping-col-def}/RowGroupingSortingMultipleGroupingColDef.tsx (88%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-sorting-multiple-grouping-col-def/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-sorting-multiple-grouping-col-def/index.ts rename docs/data/data-grid/row-grouping/{ => demos/row-grouping-use-keep-grouped-columns-hidden}/RowGroupingUseKeepGroupedColumnsHidden.tsx (93%) create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-use-keep-grouped-columns-hidden/client.ts create mode 100644 docs/data/data-grid/row-grouping/demos/row-grouping-use-keep-grouped-columns-hidden/index.ts delete mode 100644 docs/data/data-grid/row-height/DenseHeightGrid.js delete mode 100644 docs/data/data-grid/row-height/DenseHeightGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-height/DynamicRowHeightGrid.js delete mode 100644 docs/data/data-grid/row-height/DynamicRowHeightGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-height/ExpandableCells.js delete mode 100644 docs/data/data-grid/row-height/RowMarginGrid.js delete mode 100644 docs/data/data-grid/row-height/RowMarginGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-height/VariableRowHeightGrid.js delete mode 100644 docs/data/data-grid/row-height/VariableRowHeightGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-height/VirtualizeColumnsWithAutoRowHeight.js delete mode 100644 docs/data/data-grid/row-height/VirtualizeColumnsWithAutoRowHeight.tsx.preview rename docs/data/data-grid/row-height/{ => demos/dense-height-grid}/DenseHeightGrid.tsx (89%) create mode 100644 docs/data/data-grid/row-height/demos/dense-height-grid/client.ts create mode 100644 docs/data/data-grid/row-height/demos/dense-height-grid/index.ts rename docs/data/data-grid/row-height/{ => demos/dynamic-row-height-grid}/DynamicRowHeightGrid.tsx (91%) create mode 100644 docs/data/data-grid/row-height/demos/dynamic-row-height-grid/client.ts create mode 100644 docs/data/data-grid/row-height/demos/dynamic-row-height-grid/index.ts rename docs/data/data-grid/row-height/{ => demos/expandable-cells}/ExpandableCells.tsx (93%) create mode 100644 docs/data/data-grid/row-height/demos/expandable-cells/client.ts create mode 100644 docs/data/data-grid/row-height/demos/expandable-cells/index.ts rename docs/data/data-grid/row-height/{ => demos/row-margin-grid}/RowMarginGrid.tsx (83%) create mode 100644 docs/data/data-grid/row-height/demos/row-margin-grid/client.ts create mode 100644 docs/data/data-grid/row-height/demos/row-margin-grid/index.ts rename docs/data/data-grid/row-height/{ => demos/variable-row-height-grid}/VariableRowHeightGrid.tsx (95%) create mode 100644 docs/data/data-grid/row-height/demos/variable-row-height-grid/client.ts create mode 100644 docs/data/data-grid/row-height/demos/variable-row-height-grid/index.ts rename docs/data/data-grid/row-height/{ => demos/virtualize-columns-with-auto-row-height}/VirtualizeColumnsWithAutoRowHeight.tsx (88%) create mode 100644 docs/data/data-grid/row-height/demos/virtualize-columns-with-auto-row-height/client.ts create mode 100644 docs/data/data-grid/row-height/demos/virtualize-columns-with-auto-row-height/index.ts delete mode 100644 docs/data/data-grid/row-ordering/RowOrderingGrid.js delete mode 100644 docs/data/data-grid/row-ordering/RowOrderingGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-ordering/RowReorderingDisabled.js delete mode 100644 docs/data/data-grid/row-ordering/RowReorderingDisabled.tsx.preview delete mode 100644 docs/data/data-grid/row-ordering/RowReorderingValidation.js delete mode 100644 docs/data/data-grid/row-ordering/RowReorderingValidation.tsx.preview rename docs/data/data-grid/row-ordering/{ => demos/row-ordering-grid}/RowOrderingGrid.tsx (89%) create mode 100644 docs/data/data-grid/row-ordering/demos/row-ordering-grid/client.ts create mode 100644 docs/data/data-grid/row-ordering/demos/row-ordering-grid/index.ts rename docs/data/data-grid/row-ordering/{ => demos/row-reordering-disabled}/RowReorderingDisabled.tsx (77%) create mode 100644 docs/data/data-grid/row-ordering/demos/row-reordering-disabled/client.ts create mode 100644 docs/data/data-grid/row-ordering/demos/row-reordering-disabled/index.ts rename docs/data/data-grid/row-ordering/{ => demos/row-reordering-validation}/RowReorderingValidation.tsx (92%) create mode 100644 docs/data/data-grid/row-ordering/demos/row-reordering-validation/client.ts create mode 100644 docs/data/data-grid/row-ordering/demos/row-reordering-validation/index.ts delete mode 100644 docs/data/data-grid/row-pinning/RowPinning.js delete mode 100644 docs/data/data-grid/row-pinning/RowPinning.tsx.preview delete mode 100644 docs/data/data-grid/row-pinning/RowPinningSectionSeparator.js delete mode 100644 docs/data/data-grid/row-pinning/RowPinningWithActions.js delete mode 100644 docs/data/data-grid/row-pinning/RowPinningWithActions.tsx.preview delete mode 100644 docs/data/data-grid/row-pinning/RowPinningWithPagination.js delete mode 100644 docs/data/data-grid/row-pinning/RowPinningWithPagination.tsx.preview rename docs/data/data-grid/row-pinning/{ => demos/row-pinning-section-separator}/RowPinningSectionSeparator.tsx (93%) create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning-section-separator/client.ts create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning-section-separator/index.ts rename docs/data/data-grid/row-pinning/{ => demos/row-pinning-with-actions}/RowPinningWithActions.tsx (98%) create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning-with-actions/client.ts create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning-with-actions/index.ts rename docs/data/data-grid/row-pinning/{ => demos/row-pinning-with-pagination}/RowPinningWithPagination.tsx (96%) create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning-with-pagination/client.ts create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning-with-pagination/index.ts rename docs/data/data-grid/row-pinning/{ => demos/row-pinning}/RowPinning.tsx (87%) create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning/client.ts create mode 100644 docs/data/data-grid/row-pinning/demos/row-pinning/index.ts delete mode 100644 docs/data/data-grid/row-recipes/AccessingLoadingState.js delete mode 100644 docs/data/data-grid/row-recipes/AccessingLoadingState.tsx.preview delete mode 100644 docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.js delete mode 100644 docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.tsx.preview delete mode 100644 docs/data/data-grid/row-recipes/DetailPanelExpandOnRowClick.js delete mode 100644 docs/data/data-grid/row-recipes/DetailPanelExpandOnRowClick.tsx.preview delete mode 100644 docs/data/data-grid/row-recipes/DetailPanelOneExpandedRow.js delete mode 100644 docs/data/data-grid/row-recipes/DetailPanelOneExpandedRow.tsx.preview delete mode 100644 docs/data/data-grid/row-recipes/LazyLoadingAutoHeightDetailPanel.js delete mode 100644 docs/data/data-grid/row-recipes/LazyLoadingAutoHeightDetailPanel.tsx.preview delete mode 100644 docs/data/data-grid/row-recipes/RowReorderingWithPagination.js delete mode 100644 docs/data/data-grid/row-recipes/RowReorderingWithPagination.tsx.preview rename docs/data/data-grid/row-recipes/{ => demos/accessing-loading-state}/AccessingLoadingState.tsx (95%) create mode 100644 docs/data/data-grid/row-recipes/demos/accessing-loading-state/client.ts create mode 100644 docs/data/data-grid/row-recipes/demos/accessing-loading-state/index.ts rename docs/data/data-grid/row-recipes/{ => demos/detail-panel-expand-collapse-all}/DetailPanelExpandCollapseAll.tsx (97%) create mode 100644 docs/data/data-grid/row-recipes/demos/detail-panel-expand-collapse-all/client.ts create mode 100644 docs/data/data-grid/row-recipes/demos/detail-panel-expand-collapse-all/index.ts rename docs/data/data-grid/row-recipes/{ => demos/detail-panel-expand-on-row-click}/DetailPanelExpandOnRowClick.tsx (97%) create mode 100644 docs/data/data-grid/row-recipes/demos/detail-panel-expand-on-row-click/client.ts create mode 100644 docs/data/data-grid/row-recipes/demos/detail-panel-expand-on-row-click/index.ts rename docs/data/data-grid/row-recipes/{ => demos/detail-panel-one-expanded-row}/DetailPanelOneExpandedRow.tsx (96%) create mode 100644 docs/data/data-grid/row-recipes/demos/detail-panel-one-expanded-row/client.ts create mode 100644 docs/data/data-grid/row-recipes/demos/detail-panel-one-expanded-row/index.ts rename docs/data/data-grid/row-recipes/{ => demos/lazy-loading-auto-height-detail-panel}/LazyLoadingAutoHeightDetailPanel.tsx (96%) create mode 100644 docs/data/data-grid/row-recipes/demos/lazy-loading-auto-height-detail-panel/client.ts create mode 100644 docs/data/data-grid/row-recipes/demos/lazy-loading-auto-height-detail-panel/index.ts rename docs/data/data-grid/row-recipes/{ => demos/row-reordering-with-pagination}/RowReorderingWithPagination.tsx (98%) create mode 100644 docs/data/data-grid/row-recipes/demos/row-reordering-with-pagination/client.ts create mode 100644 docs/data/data-grid/row-recipes/demos/row-reordering-with-pagination/index.ts delete mode 100644 docs/data/data-grid/row-selection/CheckboxSelectionCustom.js delete mode 100644 docs/data/data-grid/row-selection/CheckboxSelectionCustom.tsx.preview delete mode 100644 docs/data/data-grid/row-selection/CheckboxSelectionGrid.js delete mode 100644 docs/data/data-grid/row-selection/CheckboxSelectionVisibleOnlyGrid.js delete mode 100644 docs/data/data-grid/row-selection/ControlledSelectionGrid.js delete mode 100644 docs/data/data-grid/row-selection/ControlledSelectionGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-selection/ControlledSelectionServerPaginationGrid.js delete mode 100644 docs/data/data-grid/row-selection/DisableClickSelectionGrid.js delete mode 100644 docs/data/data-grid/row-selection/DisableClickSelectionGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-selection/DisableRowSelection.js delete mode 100644 docs/data/data-grid/row-selection/DisableRowSelection.tsx.preview delete mode 100644 docs/data/data-grid/row-selection/KeepNonExistentRowsSelected.js delete mode 100644 docs/data/data-grid/row-selection/KeepNonExistentRowsSelected.tsx.preview delete mode 100644 docs/data/data-grid/row-selection/MultipleRowSelectionGrid.js delete mode 100644 docs/data/data-grid/row-selection/MultipleRowSelectionGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-selection/RowSelectionApiNoSnap.js delete mode 100644 docs/data/data-grid/row-selection/SingleRowSelectionGrid.js delete mode 100644 docs/data/data-grid/row-selection/SingleRowSelectionGrid.tsx.preview rename docs/data/data-grid/row-selection/{ => demos/checkbox-selection-custom}/CheckboxSelectionCustom.tsx (93%) create mode 100644 docs/data/data-grid/row-selection/demos/checkbox-selection-custom/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/checkbox-selection-custom/index.ts rename docs/data/data-grid/row-selection/{ => demos/checkbox-selection-grid}/CheckboxSelectionGrid.tsx (97%) create mode 100644 docs/data/data-grid/row-selection/demos/checkbox-selection-grid/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/checkbox-selection-grid/index.ts rename docs/data/data-grid/row-selection/{ => demos/checkbox-selection-visible-only-grid}/CheckboxSelectionVisibleOnlyGrid.tsx (96%) create mode 100644 docs/data/data-grid/row-selection/demos/checkbox-selection-visible-only-grid/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/checkbox-selection-visible-only-grid/index.ts rename docs/data/data-grid/row-selection/{ => demos/controlled-selection-grid}/ControlledSelectionGrid.tsx (82%) create mode 100644 docs/data/data-grid/row-selection/demos/controlled-selection-grid/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/controlled-selection-grid/index.ts rename docs/data/data-grid/row-selection/{ => demos/controlled-selection-server-pagination-grid}/ControlledSelectionServerPaginationGrid.tsx (85%) create mode 100644 docs/data/data-grid/row-selection/demos/controlled-selection-server-pagination-grid/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/controlled-selection-server-pagination-grid/index.ts rename docs/data/data-grid/row-selection/{ => demos/disable-click-selection-grid}/DisableClickSelectionGrid.tsx (90%) create mode 100644 docs/data/data-grid/row-selection/demos/disable-click-selection-grid/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/disable-click-selection-grid/index.ts rename docs/data/data-grid/row-selection/{ => demos/disable-row-selection}/DisableRowSelection.tsx (76%) create mode 100644 docs/data/data-grid/row-selection/demos/disable-row-selection/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/disable-row-selection/index.ts rename docs/data/data-grid/row-selection/{ => demos/keep-non-existent-rows-selected}/KeepNonExistentRowsSelected.tsx (91%) create mode 100644 docs/data/data-grid/row-selection/demos/keep-non-existent-rows-selected/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/keep-non-existent-rows-selected/index.ts rename docs/data/data-grid/row-selection/{ => demos/multiple-row-selection-grid}/MultipleRowSelectionGrid.tsx (93%) create mode 100644 docs/data/data-grid/row-selection/demos/multiple-row-selection-grid/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/multiple-row-selection-grid/index.ts create mode 100644 docs/data/data-grid/row-selection/demos/row-selection-api-no-snap/RowSelectionApiNoSnap.tsx create mode 100644 docs/data/data-grid/row-selection/demos/row-selection-api-no-snap/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/row-selection-api-no-snap/index.ts rename docs/data/data-grid/row-selection/{ => demos/single-row-selection-grid}/SingleRowSelectionGrid.tsx (89%) create mode 100644 docs/data/data-grid/row-selection/demos/single-row-selection-grid/client.ts create mode 100644 docs/data/data-grid/row-selection/demos/single-row-selection-grid/index.ts delete mode 100644 docs/data/data-grid/row-spanning/RowSpanning.js delete mode 100644 docs/data/data-grid/row-spanning/RowSpanningCalendar.js delete mode 100644 docs/data/data-grid/row-spanning/RowSpanningCalendar.tsx.preview delete mode 100644 docs/data/data-grid/row-spanning/RowSpanningClassSchedule.js delete mode 100644 docs/data/data-grid/row-spanning/RowSpanningCustom.js delete mode 100644 docs/data/data-grid/row-spanning/RowSpanningCustom.tsx.preview rename docs/data/data-grid/row-spanning/{ => demos/row-spanning-calendar}/RowSpanningCalendar.tsx (95%) create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning-calendar/client.ts create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning-calendar/index.ts rename docs/data/data-grid/row-spanning/{ => demos/row-spanning-class-schedule}/RowSpanningClassSchedule.tsx (95%) create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning-class-schedule/client.ts create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning-class-schedule/index.ts rename docs/data/data-grid/row-spanning/{ => demos/row-spanning-custom}/RowSpanningCustom.tsx (92%) create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning-custom/client.ts create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning-custom/index.ts rename docs/data/data-grid/row-spanning/{ => demos/row-spanning}/RowSpanning.tsx (95%) create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning/client.ts create mode 100644 docs/data/data-grid/row-spanning/demos/row-spanning/index.ts delete mode 100644 docs/data/data-grid/row-updates/InfiniteLoadingGrid.js delete mode 100644 docs/data/data-grid/row-updates/LazyLoadingGrid.js delete mode 100644 docs/data/data-grid/row-updates/LazyLoadingGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-updates/ThrottledRowsGrid.js delete mode 100644 docs/data/data-grid/row-updates/ThrottledRowsGrid.tsx.preview delete mode 100644 docs/data/data-grid/row-updates/UpdateRowsApiRef.js delete mode 100644 docs/data/data-grid/row-updates/UpdateRowsProp.js rename docs/data/data-grid/row-updates/{ => demos/infinite-loading-grid}/InfiniteLoadingGrid.tsx (96%) create mode 100644 docs/data/data-grid/row-updates/demos/infinite-loading-grid/client.ts create mode 100644 docs/data/data-grid/row-updates/demos/infinite-loading-grid/index.ts rename docs/data/data-grid/row-updates/{ => demos/lazy-loading-grid}/LazyLoadingGrid.tsx (89%) create mode 100644 docs/data/data-grid/row-updates/demos/lazy-loading-grid/client.ts create mode 100644 docs/data/data-grid/row-updates/demos/lazy-loading-grid/index.ts rename docs/data/data-grid/row-updates/{ => demos/throttled-rows-grid}/ThrottledRowsGrid.tsx (88%) create mode 100644 docs/data/data-grid/row-updates/demos/throttled-rows-grid/client.ts create mode 100644 docs/data/data-grid/row-updates/demos/throttled-rows-grid/index.ts rename docs/data/data-grid/row-updates/{ => demos/update-rows-api-ref}/UpdateRowsApiRef.tsx (92%) create mode 100644 docs/data/data-grid/row-updates/demos/update-rows-api-ref/client.ts create mode 100644 docs/data/data-grid/row-updates/demos/update-rows-api-ref/index.ts rename docs/data/data-grid/row-updates/{ => demos/update-rows-prop}/UpdateRowsProp.tsx (93%) create mode 100644 docs/data/data-grid/row-updates/demos/update-rows-prop/client.ts create mode 100644 docs/data/data-grid/row-updates/demos/update-rows-prop/index.ts delete mode 100644 docs/data/data-grid/scrolling/ScrollApiNoSnap.js delete mode 100644 docs/data/data-grid/scrolling/ScrollPlayground.js delete mode 100644 docs/data/data-grid/scrolling/ScrollRestoration.js delete mode 100644 docs/data/data-grid/scrolling/ScrollRestoration.tsx.preview create mode 100644 docs/data/data-grid/scrolling/demos/scroll-api-no-snap/ScrollApiNoSnap.tsx create mode 100644 docs/data/data-grid/scrolling/demos/scroll-api-no-snap/client.ts create mode 100644 docs/data/data-grid/scrolling/demos/scroll-api-no-snap/index.ts rename docs/data/data-grid/scrolling/{ => demos/scroll-playground}/ScrollPlayground.tsx (97%) create mode 100644 docs/data/data-grid/scrolling/demos/scroll-playground/client.ts create mode 100644 docs/data/data-grid/scrolling/demos/scroll-playground/index.ts rename docs/data/data-grid/scrolling/{ => demos/scroll-restoration}/ScrollRestoration.tsx (93%) create mode 100644 docs/data/data-grid/scrolling/demos/scroll-restoration/client.ts create mode 100644 docs/data/data-grid/scrolling/demos/scroll-restoration/index.ts delete mode 100644 docs/data/data-grid/server-side-data/ServerSideCursorBlocking.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideCursorBlocking.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideCursorNonBlocking.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGrid.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGrid.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregation.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregation.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationLazyLoading.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationLazyLoading.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationPivoting.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationPivoting.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationRowGrouping.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationRowGrouping.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationTreeData.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridAggregationTreeData.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridKeepPreviousData.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridKeepPreviousData.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridRevalidation.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridRevalidation.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridTTL.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideDataGridTTL.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideEditing.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideErrorHandling.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingErrorHandling.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingFullyReplaced.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingInfinite.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingModeUpdate.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingRequestThrottle.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingRevalidationTabs.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingRowGroupingGroupExpansion.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingRowGroupingGroupExpansion.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingTreeDataGroupExpansion.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingTreeDataGroupExpansion.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideLazyLoadingViewport.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingColumnStructureComplex.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingColumnStructureComplex.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingColumnStructureSimple.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingColumnStructureSimple.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingDataGrid.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingDataGrid.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingDerivedColumns.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingDerivedColumns.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingErrorHandling.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingGroupExpansion.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSidePivotingGroupExpansion.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingDataGrid.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingErrorHandling.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingExpansionPersistence.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingFullDataGrid.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingFullDataGrid.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingGroupExpansion.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingNestedLazyLoading.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideRowGroupingNestedLazyLoading.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeData.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeData.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataCustomCache.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataCustomCache.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataErrorHandling.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataExpansionPersistence.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataGroupExpansion.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataGroupExpansion.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataNestedLazyLoading.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataNestedLazyLoading.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataNestedPagination.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataNestedPagination.tsx.preview delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataRevalidation.js delete mode 100644 docs/data/data-grid/server-side-data/ServerSideTreeDataRevalidation.tsx.preview rename docs/data/data-grid/server-side-data/{ => demos/server-side-cursor-blocking}/ServerSideCursorBlocking.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-cursor-blocking/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-cursor-blocking/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-cursor-non-blocking}/ServerSideCursorNonBlocking.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-cursor-non-blocking/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-cursor-non-blocking/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-aggregation-lazy-loading}/ServerSideDataGridAggregationLazyLoading.tsx (90%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-lazy-loading/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-lazy-loading/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-aggregation-pivoting}/ServerSideDataGridAggregationPivoting.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-pivoting/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-pivoting/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-aggregation-row-grouping}/ServerSideDataGridAggregationRowGrouping.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-row-grouping/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-row-grouping/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-aggregation-tree-data}/ServerSideDataGridAggregationTreeData.tsx (91%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-tree-data/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation-tree-data/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-aggregation}/ServerSideDataGridAggregation.tsx (92%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-aggregation/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-keep-previous-data}/ServerSideDataGridKeepPreviousData.tsx (90%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-keep-previous-data/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-keep-previous-data/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-no-cache}/ServerSideDataGridNoCache.tsx (91%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-no-cache/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-no-cache/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-revalidation}/ServerSideDataGridRevalidation.tsx (97%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-revalidation/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-revalidation/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid-ttl}/ServerSideDataGridTTL.tsx (89%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-ttl/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid-ttl/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-data-grid}/ServerSideDataGrid.tsx (89%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-data-grid/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-editing}/ServerSideEditing.tsx (91%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-editing/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-editing/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-error-handling}/ServerSideErrorHandling.tsx (93%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-error-handling/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-error-handling/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-error-handling}/ServerSideLazyLoadingErrorHandling.tsx (94%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-error-handling/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-error-handling/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-fully-replaced}/ServerSideLazyLoadingFullyReplaced.tsx (98%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-fully-replaced/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-fully-replaced/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-infinite}/ServerSideLazyLoadingInfinite.tsx (91%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-infinite/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-infinite/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-mode-update}/ServerSideLazyLoadingModeUpdate.tsx (97%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-mode-update/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-mode-update/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-request-throttle}/ServerSideLazyLoadingRequestThrottle.tsx (97%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-request-throttle/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-request-throttle/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-revalidation-tabs}/ServerSideLazyLoadingRevalidationTabs.tsx (86%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-revalidation-tabs/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-revalidation-tabs/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-row-grouping-group-expansion}/ServerSideLazyLoadingRowGroupingGroupExpansion.tsx (94%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-row-grouping-group-expansion/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-row-grouping-group-expansion/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-tree-data-group-expansion}/ServerSideLazyLoadingTreeDataGroupExpansion.tsx (90%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-tree-data-group-expansion/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-tree-data-group-expansion/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-lazy-loading-viewport}/ServerSideLazyLoadingViewport.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-viewport/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-lazy-loading-viewport/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-pivoting-column-structure-complex}/ServerSidePivotingColumnStructureComplex.tsx (96%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-column-structure-complex/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-column-structure-complex/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-pivoting-column-structure-simple}/ServerSidePivotingColumnStructureSimple.tsx (96%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-column-structure-simple/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-column-structure-simple/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-pivoting-data-grid}/ServerSidePivotingDataGrid.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-data-grid/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-data-grid/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-pivoting-derived-columns}/ServerSidePivotingDerivedColumns.tsx (97%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-derived-columns/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-derived-columns/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-pivoting-error-handling}/ServerSidePivotingErrorHandling.tsx (98%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-error-handling/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-error-handling/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-pivoting-group-expansion}/ServerSidePivotingGroupExpansion.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-group-expansion/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-pivoting-group-expansion/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-row-grouping-data-grid}/ServerSideRowGroupingDataGrid.tsx (94%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-data-grid/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-data-grid/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-row-grouping-error-handling}/ServerSideRowGroupingErrorHandling.tsx (96%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-error-handling/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-error-handling/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-row-grouping-expansion-persistence}/ServerSideRowGroupingExpansionPersistence.tsx (94%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-expansion-persistence/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-expansion-persistence/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-row-grouping-full-data-grid}/ServerSideRowGroupingFullDataGrid.tsx (96%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-full-data-grid/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-full-data-grid/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-row-grouping-group-expansion}/ServerSideRowGroupingGroupExpansion.tsx (94%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-group-expansion/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-group-expansion/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-row-grouping-nested-lazy-loading}/ServerSideRowGroupingNestedLazyLoading.tsx (94%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-nested-lazy-loading/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-row-grouping-nested-lazy-loading/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data-custom-cache}/ServerSideTreeDataCustomCache.tsx (95%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-custom-cache/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-custom-cache/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data-error-handling}/ServerSideTreeDataErrorHandling.tsx (96%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-error-handling/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-error-handling/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data-expansion-persistence}/ServerSideTreeDataExpansionPersistence.tsx (96%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-expansion-persistence/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-expansion-persistence/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data-group-expansion}/ServerSideTreeDataGroupExpansion.tsx (91%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-group-expansion/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-group-expansion/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data-nested-lazy-loading}/ServerSideTreeDataNestedLazyLoading.tsx (90%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-nested-lazy-loading/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-nested-lazy-loading/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data-nested-pagination}/ServerSideTreeDataNestedPagination.tsx (88%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-nested-pagination/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-nested-pagination/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data-revalidation}/ServerSideTreeDataRevalidation.tsx (99%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-revalidation/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data-revalidation/index.ts rename docs/data/data-grid/server-side-data/{ => demos/server-side-tree-data}/ServerSideTreeData.tsx (92%) create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data/client.ts create mode 100644 docs/data/data-grid/server-side-data/demos/server-side-tree-data/index.ts delete mode 100644 docs/data/data-grid/sorting/BasicExampleDataGrid.js delete mode 100644 docs/data/data-grid/sorting/BasicExampleDataGrid.tsx delete mode 100644 docs/data/data-grid/sorting/BasicExampleDataGrid.tsx.preview delete mode 100644 docs/data/data-grid/sorting/BasicExampleDataGridPro.js delete mode 100644 docs/data/data-grid/sorting/BasicExampleDataGridPro.tsx delete mode 100644 docs/data/data-grid/sorting/BasicExampleDataGridPro.tsx.preview delete mode 100644 docs/data/data-grid/sorting/ControlledSort.js delete mode 100644 docs/data/data-grid/sorting/ControlledSort.tsx.preview delete mode 100644 docs/data/data-grid/sorting/DisableSortingGrid.js delete mode 100644 docs/data/data-grid/sorting/DisableSortingGrid.tsx.preview delete mode 100644 docs/data/data-grid/sorting/DisableSortingGridAllColumns.js delete mode 100644 docs/data/data-grid/sorting/DisableSortingGridAllColumns.tsx.preview delete mode 100644 docs/data/data-grid/sorting/ExtendedSortComparator.js delete mode 100644 docs/data/data-grid/sorting/FullyCustomSortComparator.js delete mode 100644 docs/data/data-grid/sorting/GetSortComparator.js delete mode 100644 docs/data/data-grid/sorting/GetSortComparator.tsx.preview delete mode 100644 docs/data/data-grid/sorting/InitialSort.js delete mode 100644 docs/data/data-grid/sorting/InitialSort.tsx.preview delete mode 100644 docs/data/data-grid/sorting/MultiSortingWithoutModifier.js delete mode 100644 docs/data/data-grid/sorting/MultiSortingWithoutModifier.tsx.preview delete mode 100644 docs/data/data-grid/sorting/OrderSortingGrid.js delete mode 100644 docs/data/data-grid/sorting/OrderSortingPerColumnGrid.js delete mode 100644 docs/data/data-grid/sorting/OrderSortingPerColumnGrid.tsx.preview delete mode 100644 docs/data/data-grid/sorting/ReadOnlySortingGrid.js delete mode 100644 docs/data/data-grid/sorting/ReadOnlySortingGrid.tsx.preview delete mode 100644 docs/data/data-grid/sorting/ServerSortingGrid.js delete mode 100644 docs/data/data-grid/sorting/ServerSortingGrid.tsx.preview delete mode 100644 docs/data/data-grid/sorting/SortingApiNoSnap.js create mode 100644 docs/data/data-grid/sorting/demos/basic-example-data-grid-pro/BasicExampleDataGridPro.tsx create mode 100644 docs/data/data-grid/sorting/demos/basic-example-data-grid-pro/client.ts create mode 100644 docs/data/data-grid/sorting/demos/basic-example-data-grid-pro/index.ts create mode 100644 docs/data/data-grid/sorting/demos/basic-example-data-grid/BasicExampleDataGrid.tsx create mode 100644 docs/data/data-grid/sorting/demos/basic-example-data-grid/client.ts create mode 100644 docs/data/data-grid/sorting/demos/basic-example-data-grid/index.ts rename docs/data/data-grid/sorting/{ => demos/controlled-sort}/ControlledSort.tsx (83%) create mode 100644 docs/data/data-grid/sorting/demos/controlled-sort/client.ts create mode 100644 docs/data/data-grid/sorting/demos/controlled-sort/index.ts rename docs/data/data-grid/sorting/{ => demos/disable-sorting-grid-all-columns}/DisableSortingGridAllColumns.tsx (91%) create mode 100644 docs/data/data-grid/sorting/demos/disable-sorting-grid-all-columns/client.ts create mode 100644 docs/data/data-grid/sorting/demos/disable-sorting-grid-all-columns/index.ts rename docs/data/data-grid/sorting/{ => demos/disable-sorting-grid}/DisableSortingGrid.tsx (94%) create mode 100644 docs/data/data-grid/sorting/demos/disable-sorting-grid/client.ts create mode 100644 docs/data/data-grid/sorting/demos/disable-sorting-grid/index.ts rename docs/data/data-grid/sorting/{ => demos/extended-sort-comparator}/ExtendedSortComparator.tsx (94%) create mode 100644 docs/data/data-grid/sorting/demos/extended-sort-comparator/client.ts create mode 100644 docs/data/data-grid/sorting/demos/extended-sort-comparator/index.ts rename docs/data/data-grid/sorting/{ => demos/fully-custom-sort-comparator}/FullyCustomSortComparator.tsx (88%) create mode 100644 docs/data/data-grid/sorting/demos/fully-custom-sort-comparator/client.ts create mode 100644 docs/data/data-grid/sorting/demos/fully-custom-sort-comparator/index.ts rename docs/data/data-grid/sorting/{ => demos/get-sort-comparator}/GetSortComparator.tsx (89%) create mode 100644 docs/data/data-grid/sorting/demos/get-sort-comparator/client.ts create mode 100644 docs/data/data-grid/sorting/demos/get-sort-comparator/index.ts rename docs/data/data-grid/sorting/{ => demos/initial-sort}/InitialSort.tsx (94%) create mode 100644 docs/data/data-grid/sorting/demos/initial-sort/client.ts create mode 100644 docs/data/data-grid/sorting/demos/initial-sort/index.ts rename docs/data/data-grid/sorting/{ => demos/multi-sorting-without-modifier}/MultiSortingWithoutModifier.tsx (82%) create mode 100644 docs/data/data-grid/sorting/demos/multi-sorting-without-modifier/client.ts create mode 100644 docs/data/data-grid/sorting/demos/multi-sorting-without-modifier/index.ts rename docs/data/data-grid/sorting/{ => demos/order-sorting-grid}/OrderSortingGrid.tsx (94%) create mode 100644 docs/data/data-grid/sorting/demos/order-sorting-grid/client.ts create mode 100644 docs/data/data-grid/sorting/demos/order-sorting-grid/index.ts rename docs/data/data-grid/sorting/{ => demos/order-sorting-per-column-grid}/OrderSortingPerColumnGrid.tsx (86%) create mode 100644 docs/data/data-grid/sorting/demos/order-sorting-per-column-grid/client.ts create mode 100644 docs/data/data-grid/sorting/demos/order-sorting-per-column-grid/index.ts rename docs/data/data-grid/sorting/{ => demos/read-only-sorting-grid}/ReadOnlySortingGrid.tsx (95%) create mode 100644 docs/data/data-grid/sorting/demos/read-only-sorting-grid/client.ts create mode 100644 docs/data/data-grid/sorting/demos/read-only-sorting-grid/index.ts rename docs/data/data-grid/sorting/{ => demos/server-sorting-grid}/ServerSortingGrid.tsx (76%) create mode 100644 docs/data/data-grid/sorting/demos/server-sorting-grid/client.ts create mode 100644 docs/data/data-grid/sorting/demos/server-sorting-grid/index.ts create mode 100644 docs/data/data-grid/sorting/demos/sorting-api-no-snap/SortingApiNoSnap.tsx create mode 100644 docs/data/data-grid/sorting/demos/sorting-api-no-snap/client.ts create mode 100644 docs/data/data-grid/sorting/demos/sorting-api-no-snap/index.ts delete mode 100644 docs/data/data-grid/state/DirectSelector.js delete mode 100644 docs/data/data-grid/state/InitialState.js delete mode 100644 docs/data/data-grid/state/InitialState.tsx.preview delete mode 100644 docs/data/data-grid/state/RestoreStateApiRef.js delete mode 100644 docs/data/data-grid/state/RestoreStateApiRef.tsx.preview delete mode 100644 docs/data/data-grid/state/RestoreStateInitialState.js delete mode 100644 docs/data/data-grid/state/SaveAndRestoreStateInitialState.js delete mode 100644 docs/data/data-grid/state/SaveAndRestoreStateInitialState.tsx.preview delete mode 100644 docs/data/data-grid/state/SelectorInEventHandler.js delete mode 100644 docs/data/data-grid/state/SelectorInEventHandler.tsx.preview delete mode 100644 docs/data/data-grid/state/UseGridSelector.js delete mode 100644 docs/data/data-grid/state/UseGridSelector.tsx.preview rename docs/data/data-grid/state/{ => demos/direct-selector}/DirectSelector.tsx (96%) create mode 100644 docs/data/data-grid/state/demos/direct-selector/client.ts create mode 100644 docs/data/data-grid/state/demos/direct-selector/index.ts rename docs/data/data-grid/state/{ => demos/initial-state}/InitialState.tsx (94%) create mode 100644 docs/data/data-grid/state/demos/initial-state/client.ts create mode 100644 docs/data/data-grid/state/demos/initial-state/index.ts rename docs/data/data-grid/state/{ => demos/restore-state-api-ref}/RestoreStateApiRef.tsx (98%) create mode 100644 docs/data/data-grid/state/demos/restore-state-api-ref/client.ts create mode 100644 docs/data/data-grid/state/demos/restore-state-api-ref/index.ts rename docs/data/data-grid/state/{ => demos/restore-state-initial-state}/RestoreStateInitialState.tsx (97%) create mode 100644 docs/data/data-grid/state/demos/restore-state-initial-state/client.ts create mode 100644 docs/data/data-grid/state/demos/restore-state-initial-state/index.ts rename docs/data/data-grid/state/{ => demos/save-and-restore-state-initial-state}/SaveAndRestoreStateInitialState.tsx (89%) create mode 100644 docs/data/data-grid/state/demos/save-and-restore-state-initial-state/client.ts create mode 100644 docs/data/data-grid/state/demos/save-and-restore-state-initial-state/index.ts rename docs/data/data-grid/state/{ => demos/selector-in-event-handler}/SelectorInEventHandler.tsx (87%) create mode 100644 docs/data/data-grid/state/demos/selector-in-event-handler/client.ts create mode 100644 docs/data/data-grid/state/demos/selector-in-event-handler/index.ts rename docs/data/data-grid/state/{ => demos/use-grid-selector}/UseGridSelector.tsx (96%) create mode 100644 docs/data/data-grid/state/demos/use-grid-selector/client.ts create mode 100644 docs/data/data-grid/state/demos/use-grid-selector/index.ts delete mode 100644 docs/data/data-grid/style-recipes/CellFocusNoOutline.js delete mode 100644 docs/data/data-grid/style-recipes/CellFocusNoOutline.tsx.preview delete mode 100644 docs/data/data-grid/style-recipes/ColumnHeaderHideSeparator.js delete mode 100644 docs/data/data-grid/style-recipes/ColumnHeaderHideSeparator.tsx.preview delete mode 100644 docs/data/data-grid/style-recipes/StylingAllCellsButAggregation.js rename docs/data/data-grid/style-recipes/{ => demos/cell-focus-no-outline}/CellFocusNoOutline.tsx (94%) create mode 100644 docs/data/data-grid/style-recipes/demos/cell-focus-no-outline/client.ts create mode 100644 docs/data/data-grid/style-recipes/demos/cell-focus-no-outline/index.ts rename docs/data/data-grid/style-recipes/{ => demos/column-header-hide-separator}/ColumnHeaderHideSeparator.tsx (80%) create mode 100644 docs/data/data-grid/style-recipes/demos/column-header-hide-separator/client.ts create mode 100644 docs/data/data-grid/style-recipes/demos/column-header-hide-separator/index.ts rename docs/data/data-grid/style-recipes/{ => demos/styling-all-cells-but-aggregation}/StylingAllCellsButAggregation.tsx (93%) create mode 100644 docs/data/data-grid/style-recipes/demos/styling-all-cells-but-aggregation/client.ts create mode 100644 docs/data/data-grid/style-recipes/demos/styling-all-cells-but-aggregation/index.ts delete mode 100644 docs/data/data-grid/style/AntDesignGrid.js delete mode 100644 docs/data/data-grid/style/AntDesignGrid.tsx.preview delete mode 100644 docs/data/data-grid/style/BackgroundColorsGrid.js delete mode 100644 docs/data/data-grid/style/RowGroupingStyling.js delete mode 100644 docs/data/data-grid/style/StripedGrid.js delete mode 100644 docs/data/data-grid/style/StripedGrid.tsx.preview delete mode 100644 docs/data/data-grid/style/StylingAllCells.js delete mode 100644 docs/data/data-grid/style/StylingAllCells.tsx.preview delete mode 100644 docs/data/data-grid/style/StylingCellsGrid.js delete mode 100644 docs/data/data-grid/style/StylingCellsGrid.tsx.preview delete mode 100644 docs/data/data-grid/style/StylingHeaderGrid.js delete mode 100644 docs/data/data-grid/style/StylingHeaderGrid.tsx.preview delete mode 100644 docs/data/data-grid/style/StylingRowsGrid.js delete mode 100644 docs/data/data-grid/style/StylingRowsGrid.tsx.preview delete mode 100644 docs/data/data-grid/style/SxProp.js delete mode 100644 docs/data/data-grid/style/SxProp.tsx.preview rename docs/data/data-grid/style/{ => demos/ant-design-grid}/AntDesignGrid.tsx (96%) create mode 100644 docs/data/data-grid/style/demos/ant-design-grid/client.ts create mode 100644 docs/data/data-grid/style/demos/ant-design-grid/index.ts rename docs/data/data-grid/style/{ => demos/background-colors-grid}/BackgroundColorsGrid.tsx (97%) create mode 100644 docs/data/data-grid/style/demos/background-colors-grid/client.ts create mode 100644 docs/data/data-grid/style/demos/background-colors-grid/index.ts rename docs/data/data-grid/style/{ => demos/row-grouping-styling}/RowGroupingStyling.tsx (95%) create mode 100644 docs/data/data-grid/style/demos/row-grouping-styling/client.ts create mode 100644 docs/data/data-grid/style/demos/row-grouping-styling/index.ts rename docs/data/data-grid/style/{ => demos/striped-grid}/StripedGrid.tsx (97%) create mode 100644 docs/data/data-grid/style/demos/striped-grid/client.ts create mode 100644 docs/data/data-grid/style/demos/striped-grid/index.ts rename docs/data/data-grid/style/{ => demos/styling-all-cells}/StylingAllCells.tsx (88%) create mode 100644 docs/data/data-grid/style/demos/styling-all-cells/client.ts create mode 100644 docs/data/data-grid/style/demos/styling-all-cells/index.ts rename docs/data/data-grid/style/{ => demos/styling-cells-grid}/StylingCellsGrid.tsx (90%) create mode 100644 docs/data/data-grid/style/demos/styling-cells-grid/client.ts create mode 100644 docs/data/data-grid/style/demos/styling-cells-grid/index.ts rename docs/data/data-grid/style/{ => demos/styling-header-grid}/StylingHeaderGrid.tsx (87%) create mode 100644 docs/data/data-grid/style/demos/styling-header-grid/client.ts create mode 100644 docs/data/data-grid/style/demos/styling-header-grid/index.ts rename docs/data/data-grid/style/{ => demos/styling-rows-grid}/StylingRowsGrid.tsx (93%) create mode 100644 docs/data/data-grid/style/demos/styling-rows-grid/client.ts create mode 100644 docs/data/data-grid/style/demos/styling-rows-grid/index.ts rename docs/data/data-grid/style/{ => demos/sx-prop}/SxProp.tsx (92%) create mode 100644 docs/data/data-grid/style/demos/sx-prop/client.ts create mode 100644 docs/data/data-grid/style/demos/sx-prop/index.ts delete mode 100644 docs/data/data-grid/tree-data/TreeDataCustomGroupingColumn.js delete mode 100644 docs/data/data-grid/tree-data/TreeDataCustomGroupingColumn.tsx.preview delete mode 100644 docs/data/data-grid/tree-data/TreeDataDisableChildrenFiltering.js delete mode 100644 docs/data/data-grid/tree-data/TreeDataDisableChildrenSorting.js delete mode 100644 docs/data/data-grid/tree-data/TreeDataFullExample.js delete mode 100644 docs/data/data-grid/tree-data/TreeDataFullExample.tsx.preview delete mode 100644 docs/data/data-grid/tree-data/TreeDataReordering.js delete mode 100644 docs/data/data-grid/tree-data/TreeDataReordering.tsx.preview delete mode 100644 docs/data/data-grid/tree-data/TreeDataSyncRowData.js delete mode 100644 docs/data/data-grid/tree-data/TreeDataWithGap.js delete mode 100644 docs/data/data-grid/tree-data/TreeDataWithGap.tsx.preview rename docs/data/data-grid/tree-data/{ => demos/tree-data-custom-grouping-column}/TreeDataCustomGroupingColumn.tsx (95%) create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-custom-grouping-column/client.ts create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-custom-grouping-column/index.ts rename docs/data/data-grid/tree-data/{ => demos/tree-data-disable-children-filtering}/TreeDataDisableChildrenFiltering.tsx (96%) create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-disable-children-filtering/client.ts create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-disable-children-filtering/index.ts rename docs/data/data-grid/tree-data/{ => demos/tree-data-disable-children-sorting}/TreeDataDisableChildrenSorting.tsx (97%) create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-disable-children-sorting/client.ts create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-disable-children-sorting/index.ts rename docs/data/data-grid/tree-data/{ => demos/tree-data-full-example}/TreeDataFullExample.tsx (94%) create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-full-example/client.ts create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-full-example/index.ts rename docs/data/data-grid/tree-data/{ => demos/tree-data-reordering}/TreeDataReordering.tsx (83%) create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-reordering/client.ts create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-reordering/index.ts rename docs/data/data-grid/tree-data/{ => demos/tree-data-sync-row-data}/TreeDataSyncRowData.tsx (89%) create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-sync-row-data/client.ts create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-sync-row-data/index.ts rename docs/data/data-grid/tree-data/{ => demos/tree-data-with-gap}/TreeDataWithGap.tsx (93%) create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-with-gap/client.ts create mode 100644 docs/data/data-grid/tree-data/demos/tree-data-with-gap/index.ts delete mode 100644 docs/data/data-grid/undo-redo/AddFilterHandler.js delete mode 100644 docs/data/data-grid/undo-redo/AddFilterHandler.tsx.preview delete mode 100644 docs/data/data-grid/undo-redo/BasicUndoRedo.js delete mode 100644 docs/data/data-grid/undo-redo/BasicUndoRedo.tsx.preview delete mode 100644 docs/data/data-grid/undo-redo/CustomHandlers.js delete mode 100644 docs/data/data-grid/undo-redo/DataSourceUndoRedo.js delete mode 100644 docs/data/data-grid/undo-redo/DataSourceUndoRedo.tsx.preview delete mode 100644 docs/data/data-grid/undo-redo/ToggleUndoRedo.js rename docs/data/data-grid/undo-redo/{ => demos/add-filter-handler}/AddFilterHandler.tsx (96%) create mode 100644 docs/data/data-grid/undo-redo/demos/add-filter-handler/client.ts create mode 100644 docs/data/data-grid/undo-redo/demos/add-filter-handler/index.ts rename docs/data/data-grid/undo-redo/{ => demos/basic-undo-redo}/BasicUndoRedo.tsx (93%) create mode 100644 docs/data/data-grid/undo-redo/demos/basic-undo-redo/client.ts create mode 100644 docs/data/data-grid/undo-redo/demos/basic-undo-redo/index.ts rename docs/data/data-grid/undo-redo/{ => demos/custom-handlers}/CustomHandlers.tsx (89%) create mode 100644 docs/data/data-grid/undo-redo/demos/custom-handlers/client.ts create mode 100644 docs/data/data-grid/undo-redo/demos/custom-handlers/index.ts rename docs/data/data-grid/undo-redo/{ => demos/data-source-undo-redo}/DataSourceUndoRedo.tsx (90%) create mode 100644 docs/data/data-grid/undo-redo/demos/data-source-undo-redo/client.ts create mode 100644 docs/data/data-grid/undo-redo/demos/data-source-undo-redo/index.ts rename docs/data/data-grid/undo-redo/{ => demos/toggle-undo-redo}/ToggleUndoRedo.tsx (96%) create mode 100644 docs/data/data-grid/undo-redo/demos/toggle-undo-redo/client.ts create mode 100644 docs/data/data-grid/undo-redo/demos/toggle-undo-redo/index.ts delete mode 100644 docs/data/data-grid/virtualization/ColumnVirtualizationGrid.js delete mode 100644 docs/data/data-grid/virtualization/ColumnVirtualizationGrid.tsx.preview delete mode 100644 docs/data/data-grid/virtualization/VirtualizerLayoutMode.js rename docs/data/data-grid/virtualization/{ => demos/column-virtualization-grid}/ColumnVirtualizationGrid.tsx (88%) create mode 100644 docs/data/data-grid/virtualization/demos/column-virtualization-grid/client.ts create mode 100644 docs/data/data-grid/virtualization/demos/column-virtualization-grid/index.ts rename docs/data/data-grid/virtualization/{ => demos/virtualizer-layout-mode}/VirtualizerLayoutMode.tsx (97%) create mode 100644 docs/data/data-grid/virtualization/demos/virtualizer-layout-mode/client.ts create mode 100644 docs/data/data-grid/virtualization/demos/virtualizer-layout-mode/index.ts delete mode 100644 docs/data/date-pickers/adapters-locale/AmPMCustomization.js delete mode 100644 docs/data/date-pickers/adapters-locale/CustomCalendarHeaderFormat.js delete mode 100644 docs/data/date-pickers/adapters-locale/CustomCalendarHeaderFormat.tsx.preview delete mode 100644 docs/data/date-pickers/adapters-locale/CustomDayOfWeekFormat.js delete mode 100644 docs/data/date-pickers/adapters-locale/CustomDayOfWeekFormat.tsx.preview delete mode 100644 docs/data/date-pickers/adapters-locale/CustomFieldFormat.js delete mode 100644 docs/data/date-pickers/adapters-locale/CustomFieldFormat.tsx.preview delete mode 100644 docs/data/date-pickers/adapters-locale/CustomToolbarFormat.js delete mode 100644 docs/data/date-pickers/adapters-locale/CustomToolbarFormat.tsx.preview delete mode 100644 docs/data/date-pickers/adapters-locale/FieldPlaceholder.js delete mode 100644 docs/data/date-pickers/adapters-locale/FieldPlaceholder.tsx.preview delete mode 100644 docs/data/date-pickers/adapters-locale/LocalizationDateFns.js delete mode 100644 docs/data/date-pickers/adapters-locale/LocalizationDayjs.js delete mode 100644 docs/data/date-pickers/adapters-locale/LocalizationLuxon.js delete mode 100644 docs/data/date-pickers/adapters-locale/LocalizationMoment.js delete mode 100644 docs/data/date-pickers/adapters-locale/PickersRTL.js delete mode 100644 docs/data/date-pickers/adapters-locale/RespectLeadingZerosFieldFormat.js delete mode 100644 docs/data/date-pickers/adapters-locale/RespectLeadingZerosFieldFormat.tsx.preview rename docs/data/date-pickers/adapters-locale/{ => demos/am-pm-customization}/AmPMCustomization.tsx (97%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/am-pm-customization/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/am-pm-customization/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/custom-calendar-header-format}/CustomCalendarHeaderFormat.tsx (95%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-calendar-header-format/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-calendar-header-format/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/custom-day-of-week-format}/CustomDayOfWeekFormat.tsx (85%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-day-of-week-format/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-day-of-week-format/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/custom-field-format}/CustomFieldFormat.tsx (94%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-field-format/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-field-format/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/custom-toolbar-format}/CustomToolbarFormat.tsx (92%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-toolbar-format/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/custom-toolbar-format/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/field-placeholder}/FieldPlaceholder.tsx (96%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/field-placeholder/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/field-placeholder/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/localization-date-fns}/LocalizationDateFns.tsx (97%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-date-fns/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-date-fns/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/localization-dayjs}/LocalizationDayjs.tsx (97%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-dayjs/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-dayjs/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/localization-luxon}/LocalizationLuxon.tsx (97%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-luxon/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-luxon/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/localization-moment}/LocalizationMoment.tsx (97%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-moment/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/localization-moment/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/pickers-rtl}/PickersRTL.tsx (97%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/pickers-rtl/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/pickers-rtl/index.ts rename docs/data/date-pickers/adapters-locale/{ => demos/respect-leading-zeros-field-format}/RespectLeadingZerosFieldFormat.tsx (95%) create mode 100644 docs/data/date-pickers/adapters-locale/demos/respect-leading-zeros-field-format/client.ts create mode 100644 docs/data/date-pickers/adapters-locale/demos/respect-leading-zeros-field-format/index.ts delete mode 100644 docs/data/date-pickers/base-concepts/BasicDateCalendar.js delete mode 100644 docs/data/date-pickers/base-concepts/BasicDateCalendar.tsx delete mode 100644 docs/data/date-pickers/base-concepts/BasicDateCalendar.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/BasicDateField.js delete mode 100644 docs/data/date-pickers/base-concepts/BasicDateField.tsx delete mode 100644 docs/data/date-pickers/base-concepts/BasicDateField.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/BasicDatePicker.js delete mode 100644 docs/data/date-pickers/base-concepts/BasicDatePicker.tsx delete mode 100644 docs/data/date-pickers/base-concepts/BasicDatePicker.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/ComponentExplorerNoSnap.js delete mode 100644 docs/data/date-pickers/base-concepts/ComponentFamilies.js delete mode 100644 docs/data/date-pickers/base-concepts/ControlledComponent.js delete mode 100644 docs/data/date-pickers/base-concepts/ControlledComponent.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/CustomSlots.js delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateDefaultBehavior.js delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateDefaultBehavior.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateExplicitDateTimePicker.js delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateExplicitDateTimePicker.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateExplicitTimePicker.js delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateExplicitTimePicker.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateRange.js delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateRange.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateUsingValue.js delete mode 100644 docs/data/date-pickers/base-concepts/ReferenceDateUsingValue.tsx.preview delete mode 100644 docs/data/date-pickers/base-concepts/ResponsivePickers.js delete mode 100644 docs/data/date-pickers/base-concepts/ResponsivePickers.tsx.preview create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-calendar/BasicDateCalendar.tsx create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-calendar/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-calendar/index.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-field/BasicDateField.tsx create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-field/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-field/index.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-picker/BasicDatePicker.tsx create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-picker/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/basic-date-picker/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/component-explorer-no-snap}/ComponentExplorerNoSnap.tsx (99%) create mode 100644 docs/data/date-pickers/base-concepts/demos/component-explorer-no-snap/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/component-explorer-no-snap/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/component-families}/ComponentFamilies.tsx (98%) create mode 100644 docs/data/date-pickers/base-concepts/demos/component-families/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/component-families/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/controlled-component}/ControlledComponent.tsx (89%) create mode 100644 docs/data/date-pickers/base-concepts/demos/controlled-component/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/controlled-component/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/custom-slots}/CustomSlots.tsx (96%) create mode 100644 docs/data/date-pickers/base-concepts/demos/custom-slots/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/custom-slots/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/reference-date-default-behavior}/ReferenceDateDefaultBehavior.tsx (94%) create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-default-behavior/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-default-behavior/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/reference-date-explicit-date-time-picker}/ReferenceDateExplicitDateTimePicker.tsx (89%) create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-explicit-date-time-picker/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-explicit-date-time-picker/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/reference-date-explicit-time-picker}/ReferenceDateExplicitTimePicker.tsx (88%) create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-explicit-time-picker/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-explicit-time-picker/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/reference-date-range}/ReferenceDateRange.tsx (91%) create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-range/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-range/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/reference-date-using-value}/ReferenceDateUsingValue.tsx (92%) create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-using-value/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/reference-date-using-value/index.ts rename docs/data/date-pickers/base-concepts/{ => demos/responsive-pickers}/ResponsivePickers.tsx (95%) create mode 100644 docs/data/date-pickers/base-concepts/demos/responsive-pickers/client.ts create mode 100644 docs/data/date-pickers/base-concepts/demos/responsive-pickers/index.ts delete mode 100644 docs/data/date-pickers/calendar-systems/AdapterBuddhist.js delete mode 100644 docs/data/date-pickers/calendar-systems/AdapterBuddhist.tsx.preview delete mode 100644 docs/data/date-pickers/calendar-systems/AdapterHijri.js delete mode 100644 docs/data/date-pickers/calendar-systems/AdapterJalali.js delete mode 100644 docs/data/date-pickers/calendar-systems/AdapterMomentJalali.js rename docs/data/date-pickers/calendar-systems/{ => demos/adapter-buddhist}/AdapterBuddhist.tsx (92%) create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-buddhist/client.ts create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-buddhist/index.ts rename docs/data/date-pickers/calendar-systems/{ => demos/adapter-hijri}/AdapterHijri.tsx (96%) create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-hijri/client.ts create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-hijri/index.ts rename docs/data/date-pickers/calendar-systems/{ => demos/adapter-jalali}/AdapterJalali.tsx (97%) create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-jalali/client.ts create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-jalali/index.ts rename docs/data/date-pickers/calendar-systems/{ => demos/adapter-moment-jalali}/AdapterMomentJalali.tsx (97%) create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-moment-jalali/client.ts create mode 100644 docs/data/date-pickers/calendar-systems/demos/adapter-moment-jalali/index.ts delete mode 100644 docs/data/date-pickers/custom-components/ActionBarComponent.js delete mode 100644 docs/data/date-pickers/custom-components/ActionBarComponent.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/ActionBarComponentProps.js delete mode 100644 docs/data/date-pickers/custom-components/ActionBarComponentProps.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/ArrowSwitcherComponent.js delete mode 100644 docs/data/date-pickers/custom-components/ArrowSwitcherComponentProps.js delete mode 100644 docs/data/date-pickers/custom-components/CalendarHeaderComponent.js delete mode 100644 docs/data/date-pickers/custom-components/CalendarHeaderComponent.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.js delete mode 100644 docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.js delete mode 100644 docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/MonthButtonComponent.js delete mode 100644 docs/data/date-pickers/custom-components/MonthButtonComponent.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/MonthButtonComponentProps.js delete mode 100644 docs/data/date-pickers/custom-components/MonthButtonComponentProps.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/PickerDayDemoCSSVars.js delete mode 100644 docs/data/date-pickers/custom-components/PickerDayDemoCSSVars.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/PickerDayDemoCustomTheme.js delete mode 100644 docs/data/date-pickers/custom-components/PickerDayDemoCustomTheme.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/Tabs.js delete mode 100644 docs/data/date-pickers/custom-components/Tabs.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/ToolbarComponent.js delete mode 100644 docs/data/date-pickers/custom-components/ToolbarComponent.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/UsePickerAdapter.js delete mode 100644 docs/data/date-pickers/custom-components/UsePickerAdapter.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/YearButtonComponent.js delete mode 100644 docs/data/date-pickers/custom-components/YearButtonComponent.tsx.preview delete mode 100644 docs/data/date-pickers/custom-components/YearButtonComponentProps.js delete mode 100644 docs/data/date-pickers/custom-components/YearButtonComponentProps.tsx.preview rename docs/data/date-pickers/custom-components/{ => demos/action-bar-component-props}/ActionBarComponentProps.tsx (92%) create mode 100644 docs/data/date-pickers/custom-components/demos/action-bar-component-props/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/action-bar-component-props/index.ts rename docs/data/date-pickers/custom-components/{ => demos/action-bar-component}/ActionBarComponent.tsx (97%) create mode 100644 docs/data/date-pickers/custom-components/demos/action-bar-component/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/action-bar-component/index.ts rename docs/data/date-pickers/custom-components/{ => demos/arrow-switcher-component-props}/ArrowSwitcherComponentProps.tsx (93%) create mode 100644 docs/data/date-pickers/custom-components/demos/arrow-switcher-component-props/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/arrow-switcher-component-props/index.ts rename docs/data/date-pickers/custom-components/{ => demos/arrow-switcher-component}/ArrowSwitcherComponent.tsx (93%) create mode 100644 docs/data/date-pickers/custom-components/demos/arrow-switcher-component/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/arrow-switcher-component/index.ts rename docs/data/date-pickers/custom-components/{ => demos/calendar-header-component-props}/CalendarHeaderComponentProps.tsx (92%) create mode 100644 docs/data/date-pickers/custom-components/demos/calendar-header-component-props/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/calendar-header-component-props/index.ts rename docs/data/date-pickers/custom-components/{ => demos/calendar-header-component-range}/CalendarHeaderComponentRange.tsx (93%) create mode 100644 docs/data/date-pickers/custom-components/demos/calendar-header-component-range/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/calendar-header-component-range/index.ts rename docs/data/date-pickers/custom-components/{ => demos/calendar-header-component}/CalendarHeaderComponent.tsx (94%) create mode 100644 docs/data/date-pickers/custom-components/demos/calendar-header-component/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/calendar-header-component/index.ts rename docs/data/date-pickers/custom-components/{ => demos/month-button-component-props}/MonthButtonComponentProps.tsx (94%) create mode 100644 docs/data/date-pickers/custom-components/demos/month-button-component-props/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/month-button-component-props/index.ts rename docs/data/date-pickers/custom-components/{ => demos/month-button-component}/MonthButtonComponent.tsx (94%) create mode 100644 docs/data/date-pickers/custom-components/demos/month-button-component/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/month-button-component/index.ts rename docs/data/date-pickers/custom-components/{ => demos/picker-day-demo-css-vars}/PickerDayDemoCSSVars.tsx (93%) create mode 100644 docs/data/date-pickers/custom-components/demos/picker-day-demo-css-vars/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/picker-day-demo-css-vars/index.ts rename docs/data/date-pickers/custom-components/{ => demos/picker-day-demo-custom-theme}/PickerDayDemoCustomTheme.tsx (88%) create mode 100644 docs/data/date-pickers/custom-components/demos/picker-day-demo-custom-theme/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/picker-day-demo-custom-theme/index.ts rename docs/data/date-pickers/custom-components/{ => demos/tabs}/Tabs.tsx (83%) create mode 100644 docs/data/date-pickers/custom-components/demos/tabs/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/tabs/index.ts rename docs/data/date-pickers/custom-components/{ => demos/toolbar-component}/ToolbarComponent.tsx (86%) create mode 100644 docs/data/date-pickers/custom-components/demos/toolbar-component/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/toolbar-component/index.ts rename docs/data/date-pickers/custom-components/{ => demos/use-picker-adapter}/UsePickerAdapter.tsx (95%) create mode 100644 docs/data/date-pickers/custom-components/demos/use-picker-adapter/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/use-picker-adapter/index.ts rename docs/data/date-pickers/custom-components/{ => demos/year-button-component-props}/YearButtonComponentProps.tsx (94%) create mode 100644 docs/data/date-pickers/custom-components/demos/year-button-component-props/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/year-button-component-props/index.ts rename docs/data/date-pickers/custom-components/{ => demos/year-button-component}/YearButtonComponent.tsx (93%) create mode 100644 docs/data/date-pickers/custom-components/demos/year-button-component/client.ts create mode 100644 docs/data/date-pickers/custom-components/demos/year-button-component/index.ts delete mode 100644 docs/data/date-pickers/custom-field/BrowserField.js delete mode 100644 docs/data/date-pickers/custom-field/BrowserField.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/BrowserMultiInputRangeField.js delete mode 100644 docs/data/date-pickers/custom-field/BrowserMultiInputRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/BrowserSingleInputRangeField.js delete mode 100644 docs/data/date-pickers/custom-field/BrowserSingleInputRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/FieldFormatDensity.js delete mode 100644 docs/data/date-pickers/custom-field/FieldFormatDensity.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/MaterialFieldWrapped.js delete mode 100644 docs/data/date-pickers/custom-field/MaterialFieldWrapped.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/MultiInputDateRangePicker.js delete mode 100644 docs/data/date-pickers/custom-field/MultiInputDateRangePicker.tsx delete mode 100644 docs/data/date-pickers/custom-field/MultiInputDateRangePicker.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/MultiInputDateRangePickerWrapped.js delete mode 100644 docs/data/date-pickers/custom-field/MultiInputDateRangePickerWrapped.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/MultiInputFieldSeparatorSlotProps.js delete mode 100644 docs/data/date-pickers/custom-field/MultiInputFieldSeparatorSlotProps.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/MultiInputFieldTextFieldProps.js delete mode 100644 docs/data/date-pickers/custom-field/RangeFieldDateSeparator.js delete mode 100644 docs/data/date-pickers/custom-field/RangeFieldDateSeparator.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/TextFieldSlotProps.js delete mode 100644 docs/data/date-pickers/custom-field/TextFieldSlotProps.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/behavior-autocomplete/MaterialDatePicker.js delete mode 100644 docs/data/date-pickers/custom-field/behavior-autocomplete/MaterialDatePicker.tsx delete mode 100644 docs/data/date-pickers/custom-field/behavior-autocomplete/MaterialDatePicker.tsx.preview create mode 100644 docs/data/date-pickers/custom-field/behavior-autocomplete/demos/material-date-picker/MaterialDatePicker.tsx create mode 100644 docs/data/date-pickers/custom-field/behavior-autocomplete/demos/material-date-picker/client.ts create mode 100644 docs/data/date-pickers/custom-field/behavior-autocomplete/demos/material-date-picker/index.ts delete mode 100644 docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.js delete mode 100644 docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.tsx delete mode 100644 docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.tsx.preview delete mode 100644 docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.js delete mode 100644 docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.tsx.preview create mode 100644 docs/data/date-pickers/custom-field/behavior-button/demos/material-date-picker/MaterialDatePicker.tsx create mode 100644 docs/data/date-pickers/custom-field/behavior-button/demos/material-date-picker/client.ts create mode 100644 docs/data/date-pickers/custom-field/behavior-button/demos/material-date-picker/index.ts rename docs/data/date-pickers/custom-field/behavior-button/{ => demos/material-date-range-picker}/MaterialDateRangePicker.tsx (89%) create mode 100644 docs/data/date-pickers/custom-field/behavior-button/demos/material-date-range-picker/client.ts create mode 100644 docs/data/date-pickers/custom-field/behavior-button/demos/material-date-range-picker/index.ts delete mode 100644 docs/data/date-pickers/custom-field/behavior-masked-text-field/MaskedMaterialTextField.js delete mode 100644 docs/data/date-pickers/custom-field/behavior-masked-text-field/MaskedMaterialTextField.tsx.preview rename docs/data/date-pickers/custom-field/behavior-masked-text-field/{ => demos/masked-material-text-field}/MaskedMaterialTextField.tsx (96%) create mode 100644 docs/data/date-pickers/custom-field/behavior-masked-text-field/demos/masked-material-text-field/client.ts create mode 100644 docs/data/date-pickers/custom-field/behavior-masked-text-field/demos/masked-material-text-field/index.ts delete mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-mobile-text-field/MaterialDatePicker.js delete mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-mobile-text-field/MaterialDatePicker.tsx delete mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-mobile-text-field/MaterialDatePicker.tsx.preview create mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-mobile-text-field/demos/material-date-picker/MaterialDatePicker.tsx create mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-mobile-text-field/demos/material-date-picker/client.ts create mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-mobile-text-field/demos/material-date-picker/index.ts delete mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.js delete mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.tsx delete mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.tsx.preview create mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-text-field/demos/material-date-picker/MaterialDatePicker.tsx create mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-text-field/demos/material-date-picker/client.ts create mode 100644 docs/data/date-pickers/custom-field/behavior-read-only-text-field/demos/material-date-picker/index.ts delete mode 100644 docs/data/date-pickers/custom-field/behavior-tutorial/MaterialDatePicker.js delete mode 100644 docs/data/date-pickers/custom-field/behavior-tutorial/MaterialDatePicker.tsx delete mode 100644 docs/data/date-pickers/custom-field/behavior-tutorial/MaterialDatePicker.tsx.preview create mode 100644 docs/data/date-pickers/custom-field/behavior-tutorial/demos/material-date-picker/MaterialDatePicker.tsx create mode 100644 docs/data/date-pickers/custom-field/behavior-tutorial/demos/material-date-picker/client.ts create mode 100644 docs/data/date-pickers/custom-field/behavior-tutorial/demos/material-date-picker/index.ts rename docs/data/date-pickers/custom-field/{ => demos/browser-field}/BrowserField.tsx (96%) create mode 100644 docs/data/date-pickers/custom-field/demos/browser-field/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/browser-field/index.ts rename docs/data/date-pickers/custom-field/{ => demos/browser-multi-input-range-field}/BrowserMultiInputRangeField.tsx (92%) create mode 100644 docs/data/date-pickers/custom-field/demos/browser-multi-input-range-field/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/browser-multi-input-range-field/index.ts rename docs/data/date-pickers/custom-field/{ => demos/browser-single-input-range-field}/BrowserSingleInputRangeField.tsx (96%) create mode 100644 docs/data/date-pickers/custom-field/demos/browser-single-input-range-field/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/browser-single-input-range-field/index.ts rename docs/data/date-pickers/custom-field/{ => demos/field-format-density}/FieldFormatDensity.tsx (93%) create mode 100644 docs/data/date-pickers/custom-field/demos/field-format-density/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/field-format-density/index.ts rename docs/data/date-pickers/custom-field/{ => demos/material-field-wrapped}/MaterialFieldWrapped.tsx (81%) create mode 100644 docs/data/date-pickers/custom-field/demos/material-field-wrapped/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/material-field-wrapped/index.ts rename docs/data/date-pickers/custom-field/{ => demos/multi-input-date-range-picker-wrapped}/MultiInputDateRangePickerWrapped.tsx (77%) create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-date-range-picker-wrapped/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-date-range-picker-wrapped/index.ts create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-date-range-picker/MultiInputDateRangePicker.tsx create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-date-range-picker/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-date-range-picker/index.ts rename docs/data/date-pickers/custom-field/{ => demos/multi-input-field-separator-slot-props}/MultiInputFieldSeparatorSlotProps.tsx (95%) create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-field-separator-slot-props/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-field-separator-slot-props/index.ts rename docs/data/date-pickers/custom-field/{ => demos/multi-input-field-text-field-props}/MultiInputFieldTextFieldProps.tsx (92%) create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-field-text-field-props/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/multi-input-field-text-field-props/index.ts rename docs/data/date-pickers/custom-field/{ => demos/range-field-date-separator}/RangeFieldDateSeparator.tsx (94%) create mode 100644 docs/data/date-pickers/custom-field/demos/range-field-date-separator/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/range-field-date-separator/index.ts rename docs/data/date-pickers/custom-field/{ => demos/text-field-slot-props}/TextFieldSlotProps.tsx (94%) create mode 100644 docs/data/date-pickers/custom-field/demos/text-field-slot-props/client.ts create mode 100644 docs/data/date-pickers/custom-field/demos/text-field-slot-props/index.ts delete mode 100644 docs/data/date-pickers/custom-layout/AddComponent.js delete mode 100644 docs/data/date-pickers/custom-layout/AddComponent.tsx.preview delete mode 100644 docs/data/date-pickers/custom-layout/LayoutBlocks.js delete mode 100644 docs/data/date-pickers/custom-layout/MovingActions.js delete mode 100644 docs/data/date-pickers/custom-layout/MovingActions.tsx.preview rename docs/data/date-pickers/custom-layout/{ => demos/add-component}/AddComponent.tsx (92%) create mode 100644 docs/data/date-pickers/custom-layout/demos/add-component/client.ts create mode 100644 docs/data/date-pickers/custom-layout/demos/add-component/index.ts create mode 100644 docs/data/date-pickers/custom-layout/demos/layout-blocks/LayoutBlocks.tsx create mode 100644 docs/data/date-pickers/custom-layout/demos/layout-blocks/client.ts create mode 100644 docs/data/date-pickers/custom-layout/demos/layout-blocks/index.ts rename docs/data/date-pickers/custom-layout/{ => demos/moving-actions}/MovingActions.tsx (93%) create mode 100644 docs/data/date-pickers/custom-layout/demos/moving-actions/client.ts create mode 100644 docs/data/date-pickers/custom-layout/demos/moving-actions/index.ts delete mode 100644 docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalid.js delete mode 100644 docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalid.tsx.preview delete mode 100644 docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.js delete mode 100644 docs/data/date-pickers/custom-opening-button/CustomOpeningIcon.js delete mode 100644 docs/data/date-pickers/custom-opening-button/CustomOpeningIcon.tsx.preview delete mode 100644 docs/data/date-pickers/custom-opening-button/CustomOpeningIconConditional.js delete mode 100644 docs/data/date-pickers/custom-opening-button/CustomOpeningIconConditional.tsx.preview delete mode 100644 docs/data/date-pickers/custom-opening-button/CustomPropsOpeningButton.js delete mode 100644 docs/data/date-pickers/custom-opening-button/CustomPropsOpeningButton.tsx.preview delete mode 100644 docs/data/date-pickers/custom-opening-button/StartEdgeOpeningButton.js delete mode 100644 docs/data/date-pickers/custom-opening-button/StartEdgeOpeningButton.tsx.preview rename docs/data/date-pickers/custom-opening-button/{ => demos/add-warning-icon-when-invalid-range}/AddWarningIconWhenInvalidRange.tsx (86%) create mode 100644 docs/data/date-pickers/custom-opening-button/demos/add-warning-icon-when-invalid-range/client.ts create mode 100644 docs/data/date-pickers/custom-opening-button/demos/add-warning-icon-when-invalid-range/index.ts rename docs/data/date-pickers/custom-opening-button/{ => demos/add-warning-icon-when-invalid}/AddWarningIconWhenInvalid.tsx (86%) create mode 100644 docs/data/date-pickers/custom-opening-button/demos/add-warning-icon-when-invalid/client.ts create mode 100644 docs/data/date-pickers/custom-opening-button/demos/add-warning-icon-when-invalid/index.ts rename docs/data/date-pickers/custom-opening-button/{ => demos/custom-opening-icon-conditional}/CustomOpeningIconConditional.tsx (92%) create mode 100644 docs/data/date-pickers/custom-opening-button/demos/custom-opening-icon-conditional/client.ts create mode 100644 docs/data/date-pickers/custom-opening-button/demos/custom-opening-icon-conditional/index.ts rename docs/data/date-pickers/custom-opening-button/{ => demos/custom-opening-icon}/CustomOpeningIcon.tsx (96%) create mode 100644 docs/data/date-pickers/custom-opening-button/demos/custom-opening-icon/client.ts create mode 100644 docs/data/date-pickers/custom-opening-button/demos/custom-opening-icon/index.ts rename docs/data/date-pickers/custom-opening-button/{ => demos/custom-props-opening-button}/CustomPropsOpeningButton.tsx (94%) create mode 100644 docs/data/date-pickers/custom-opening-button/demos/custom-props-opening-button/client.ts create mode 100644 docs/data/date-pickers/custom-opening-button/demos/custom-props-opening-button/index.ts rename docs/data/date-pickers/custom-opening-button/{ => demos/start-edge-opening-button}/StartEdgeOpeningButton.tsx (92%) create mode 100644 docs/data/date-pickers/custom-opening-button/demos/start-edge-opening-button/client.ts create mode 100644 docs/data/date-pickers/custom-opening-button/demos/start-edge-opening-button/index.ts delete mode 100644 docs/data/date-pickers/date-calendar/AddWeekNumber.js delete mode 100644 docs/data/date-pickers/date-calendar/AddWeekNumber.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/BasicDateCalendar.js delete mode 100644 docs/data/date-pickers/date-calendar/BasicDateCalendar.tsx delete mode 100644 docs/data/date-pickers/date-calendar/BasicDateCalendar.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/CustomMonthLayout.js delete mode 100644 docs/data/date-pickers/date-calendar/CustomMonthLayout.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarFormProps.js delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarFormProps.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarReferenceDate.js delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarReferenceDate.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarServerRequest.js delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarServerRequest.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarValue.js delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarValue.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarViews.js delete mode 100644 docs/data/date-pickers/date-calendar/DateCalendarViews.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/WeekPicker.js delete mode 100644 docs/data/date-pickers/date-calendar/WeekPicker.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/YearMonthCalendar.js delete mode 100644 docs/data/date-pickers/date-calendar/YearMonthCalendar.tsx.preview delete mode 100644 docs/data/date-pickers/date-calendar/YearsOrderDescendingCalendar.js delete mode 100644 docs/data/date-pickers/date-calendar/YearsOrderDescendingCalendar.tsx.preview rename docs/data/date-pickers/date-calendar/{ => demos/add-week-number}/AddWeekNumber.tsx (91%) create mode 100644 docs/data/date-pickers/date-calendar/demos/add-week-number/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/add-week-number/index.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/basic-date-calendar/BasicDateCalendar.tsx create mode 100644 docs/data/date-pickers/date-calendar/demos/basic-date-calendar/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/basic-date-calendar/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/custom-month-layout}/CustomMonthLayout.tsx (89%) create mode 100644 docs/data/date-pickers/date-calendar/demos/custom-month-layout/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/custom-month-layout/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/date-calendar-form-props}/DateCalendarFormProps.tsx (94%) create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-form-props/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-form-props/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/date-calendar-reference-date}/DateCalendarReferenceDate.tsx (93%) create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-reference-date/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-reference-date/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/date-calendar-server-request}/DateCalendarServerRequest.tsx (93%) create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-server-request/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-server-request/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/date-calendar-value}/DateCalendarValue.tsx (89%) create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-value/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-value/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/date-calendar-views}/DateCalendarViews.tsx (95%) create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-views/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/date-calendar-views/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/week-picker}/WeekPicker.tsx (92%) create mode 100644 docs/data/date-pickers/date-calendar/demos/week-picker/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/week-picker/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/year-month-calendar}/YearMonthCalendar.tsx (94%) create mode 100644 docs/data/date-pickers/date-calendar/demos/year-month-calendar/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/year-month-calendar/index.ts rename docs/data/date-pickers/date-calendar/{ => demos/years-order-descending-calendar}/YearsOrderDescendingCalendar.tsx (93%) create mode 100644 docs/data/date-pickers/date-calendar/demos/years-order-descending-calendar/client.ts create mode 100644 docs/data/date-pickers/date-calendar/demos/years-order-descending-calendar/index.ts delete mode 100644 docs/data/date-pickers/date-field/BasicDateField.js delete mode 100644 docs/data/date-pickers/date-field/BasicDateField.tsx delete mode 100644 docs/data/date-pickers/date-field/BasicDateField.tsx.preview delete mode 100644 docs/data/date-pickers/date-field/CustomDateFormat.js delete mode 100644 docs/data/date-pickers/date-field/CustomDateFormat.tsx.preview delete mode 100644 docs/data/date-pickers/date-field/DateFieldValue.js delete mode 100644 docs/data/date-pickers/date-field/DateFieldValue.tsx.preview create mode 100644 docs/data/date-pickers/date-field/demos/basic-date-field/BasicDateField.tsx create mode 100644 docs/data/date-pickers/date-field/demos/basic-date-field/client.ts create mode 100644 docs/data/date-pickers/date-field/demos/basic-date-field/index.ts rename docs/data/date-pickers/date-field/{ => demos/custom-date-format}/CustomDateFormat.tsx (94%) create mode 100644 docs/data/date-pickers/date-field/demos/custom-date-format/client.ts create mode 100644 docs/data/date-pickers/date-field/demos/custom-date-format/index.ts rename docs/data/date-pickers/date-field/{ => demos/date-field-value}/DateFieldValue.tsx (88%) create mode 100644 docs/data/date-pickers/date-field/demos/date-field-value/client.ts create mode 100644 docs/data/date-pickers/date-field/demos/date-field-value/index.ts delete mode 100644 docs/data/date-pickers/date-picker/BasicDatePicker.js delete mode 100644 docs/data/date-pickers/date-picker/BasicDatePicker.tsx delete mode 100644 docs/data/date-pickers/date-picker/BasicDatePicker.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/ClearableProp.js delete mode 100644 docs/data/date-pickers/date-picker/CustomizationExamplesNoSnap.js delete mode 100644 docs/data/date-pickers/date-picker/DatePickerOpenTo.js delete mode 100644 docs/data/date-pickers/date-picker/DatePickerOpenTo.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/DatePickerValue.js delete mode 100644 docs/data/date-pickers/date-picker/DatePickerValue.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/DatePickerViews.js delete mode 100644 docs/data/date-pickers/date-picker/DatePickerViews.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/DatePickerYearsOrder.js delete mode 100644 docs/data/date-pickers/date-picker/DatePickerYearsOrder.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/FormPropsDatePickers.js delete mode 100644 docs/data/date-pickers/date-picker/FormPropsDatePickers.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/HelperText.js delete mode 100644 docs/data/date-pickers/date-picker/HelperText.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/ResponsiveDatePickers.js delete mode 100644 docs/data/date-pickers/date-picker/ResponsiveDatePickers.tsx.preview delete mode 100644 docs/data/date-pickers/date-picker/StaticDatePickerLandscape.js delete mode 100644 docs/data/date-pickers/date-picker/StaticDatePickerLandscape.tsx.preview create mode 100644 docs/data/date-pickers/date-picker/demos/basic-date-picker/BasicDatePicker.tsx create mode 100644 docs/data/date-pickers/date-picker/demos/basic-date-picker/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/basic-date-picker/index.ts rename docs/data/date-pickers/date-picker/{ => demos/clearable-prop}/ClearableProp.tsx (97%) create mode 100644 docs/data/date-pickers/date-picker/demos/clearable-prop/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/clearable-prop/index.ts create mode 100644 docs/data/date-pickers/date-picker/demos/customization-examples-no-snap/CustomizationExamplesNoSnap.tsx create mode 100644 docs/data/date-pickers/date-picker/demos/customization-examples-no-snap/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/customization-examples-no-snap/index.ts rename docs/data/date-pickers/date-picker/{ => demos/date-picker-open-to}/DatePickerOpenTo.tsx (93%) create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-open-to/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-open-to/index.ts rename docs/data/date-pickers/date-picker/{ => demos/date-picker-value}/DatePickerValue.tsx (88%) create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-value/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-value/index.ts rename docs/data/date-pickers/date-picker/{ => demos/date-picker-views}/DatePickerViews.tsx (94%) create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-views/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-views/index.ts rename docs/data/date-pickers/date-picker/{ => demos/date-picker-years-order}/DatePickerYearsOrder.tsx (92%) create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-years-order/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/date-picker-years-order/index.ts rename docs/data/date-pickers/date-picker/{ => demos/form-props-date-pickers}/FormPropsDatePickers.tsx (93%) create mode 100644 docs/data/date-pickers/date-picker/demos/form-props-date-pickers/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/form-props-date-pickers/index.ts rename docs/data/date-pickers/date-picker/{ => demos/helper-text}/HelperText.tsx (91%) create mode 100644 docs/data/date-pickers/date-picker/demos/helper-text/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/helper-text/index.ts rename docs/data/date-pickers/date-picker/{ => demos/responsive-date-pickers}/ResponsiveDatePickers.tsx (96%) create mode 100644 docs/data/date-pickers/date-picker/demos/responsive-date-pickers/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/responsive-date-pickers/index.ts rename docs/data/date-pickers/date-picker/{ => demos/static-date-picker-landscape}/StaticDatePickerLandscape.tsx (89%) create mode 100644 docs/data/date-pickers/date-picker/demos/static-date-picker-landscape/client.ts create mode 100644 docs/data/date-pickers/date-picker/demos/static-date-picker-landscape/index.ts delete mode 100644 docs/data/date-pickers/date-range-calendar/BasicDateRangeCalendar.js delete mode 100644 docs/data/date-pickers/date-range-calendar/BasicDateRangeCalendar.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-calendar/CustomDateRangePickerDay.js delete mode 100644 docs/data/date-pickers/date-range-calendar/CustomDateRangePickerDay.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarCalendarsProp.js delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarCalendarsProp.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarCurrentMonthCalendarPositionProp.js delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarCurrentMonthCalendarPositionProp.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarFormProps.js delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarFormProps.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarValue.js delete mode 100644 docs/data/date-pickers/date-range-calendar/DateRangeCalendarValue.tsx.preview rename docs/data/date-pickers/date-range-calendar/{ => demos/basic-date-range-calendar}/BasicDateRangeCalendar.tsx (91%) create mode 100644 docs/data/date-pickers/date-range-calendar/demos/basic-date-range-calendar/client.ts create mode 100644 docs/data/date-pickers/date-range-calendar/demos/basic-date-range-calendar/index.ts rename docs/data/date-pickers/date-range-calendar/{ => demos/custom-date-range-picker-day}/CustomDateRangePickerDay.tsx (88%) create mode 100644 docs/data/date-pickers/date-range-calendar/demos/custom-date-range-picker-day/client.ts create mode 100644 docs/data/date-pickers/date-range-calendar/demos/custom-date-range-picker-day/index.ts rename docs/data/date-pickers/date-range-calendar/{ => demos/date-range-calendar-calendars-prop}/DateRangeCalendarCalendarsProp.tsx (94%) create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-calendars-prop/client.ts create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-calendars-prop/index.ts rename docs/data/date-pickers/date-range-calendar/{ => demos/date-range-calendar-current-month-calendar-position-prop}/DateRangeCalendarCurrentMonthCalendarPositionProp.tsx (92%) create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-current-month-calendar-position-prop/client.ts create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-current-month-calendar-position-prop/index.ts rename docs/data/date-pickers/date-range-calendar/{ => demos/date-range-calendar-form-props}/DateRangeCalendarFormProps.tsx (95%) create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-form-props/client.ts create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-form-props/index.ts rename docs/data/date-pickers/date-range-calendar/{ => demos/date-range-calendar-value}/DateRangeCalendarValue.tsx (86%) create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-value/client.ts create mode 100644 docs/data/date-pickers/date-range-calendar/demos/date-range-calendar-value/index.ts delete mode 100644 docs/data/date-pickers/date-range-field/BasicDateRangeField.js delete mode 100644 docs/data/date-pickers/date-range-field/BasicDateRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-field/DateRangeFieldValue.js delete mode 100644 docs/data/date-pickers/date-range-field/DateRangeFieldValue.tsx.preview rename docs/data/date-pickers/date-range-field/{ => demos/basic-date-range-field}/BasicDateRangeField.tsx (95%) create mode 100644 docs/data/date-pickers/date-range-field/demos/basic-date-range-field/client.ts create mode 100644 docs/data/date-pickers/date-range-field/demos/basic-date-range-field/index.ts rename docs/data/date-pickers/date-range-field/{ => demos/date-range-field-value}/DateRangeFieldValue.tsx (85%) create mode 100644 docs/data/date-pickers/date-range-field/demos/date-range-field-value/client.ts create mode 100644 docs/data/date-pickers/date-range-field/demos/date-range-field-value/index.ts delete mode 100644 docs/data/date-pickers/date-range-picker/BasicDateRangePicker.js delete mode 100644 docs/data/date-pickers/date-range-picker/BasicDateRangePicker.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-picker/BasicRangeShortcuts.js delete mode 100644 docs/data/date-pickers/date-range-picker/BasicRangeShortcuts.tsx delete mode 100644 docs/data/date-pickers/date-range-picker/BasicRangeShortcuts.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-picker/DateRangePickerCalendarProp.js delete mode 100644 docs/data/date-pickers/date-range-picker/DateRangePickerCalendarProp.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-picker/DateRangePickerValue.js delete mode 100644 docs/data/date-pickers/date-range-picker/DateRangePickerValue.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-picker/FormPropsDateRangePickers.js delete mode 100644 docs/data/date-pickers/date-range-picker/FormPropsDateRangePickers.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-picker/MultiInputDateRangePicker.js delete mode 100644 docs/data/date-pickers/date-range-picker/MultiInputDateRangePicker.tsx delete mode 100644 docs/data/date-pickers/date-range-picker/MultiInputDateRangePicker.tsx.preview delete mode 100644 docs/data/date-pickers/date-range-picker/ResponsiveDateRangePickers.js rename docs/data/date-pickers/date-range-picker/{ => demos/basic-date-range-picker}/BasicDateRangePicker.tsx (91%) create mode 100644 docs/data/date-pickers/date-range-picker/demos/basic-date-range-picker/client.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/basic-date-range-picker/index.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/basic-range-shortcuts/BasicRangeShortcuts.tsx create mode 100644 docs/data/date-pickers/date-range-picker/demos/basic-range-shortcuts/client.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/basic-range-shortcuts/index.ts rename docs/data/date-pickers/date-range-picker/{ => demos/date-range-picker-calendar-prop}/DateRangePickerCalendarProp.tsx (95%) create mode 100644 docs/data/date-pickers/date-range-picker/demos/date-range-picker-calendar-prop/client.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/date-range-picker-calendar-prop/index.ts rename docs/data/date-pickers/date-range-picker/{ => demos/date-range-picker-value}/DateRangePickerValue.tsx (86%) create mode 100644 docs/data/date-pickers/date-range-picker/demos/date-range-picker-value/client.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/date-range-picker-value/index.ts rename docs/data/date-pickers/date-range-picker/{ => demos/form-props-date-range-pickers}/FormPropsDateRangePickers.tsx (93%) create mode 100644 docs/data/date-pickers/date-range-picker/demos/form-props-date-range-pickers/client.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/form-props-date-range-pickers/index.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/multi-input-date-range-picker/MultiInputDateRangePicker.tsx create mode 100644 docs/data/date-pickers/date-range-picker/demos/multi-input-date-range-picker/client.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/multi-input-date-range-picker/index.ts rename docs/data/date-pickers/date-range-picker/{ => demos/responsive-date-range-pickers}/ResponsiveDateRangePickers.tsx (97%) create mode 100644 docs/data/date-pickers/date-range-picker/demos/responsive-date-range-pickers/client.ts create mode 100644 docs/data/date-pickers/date-range-picker/demos/responsive-date-range-pickers/index.ts delete mode 100644 docs/data/date-pickers/date-time-field/BasicDateTimeField.js delete mode 100644 docs/data/date-pickers/date-time-field/BasicDateTimeField.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-field/CustomDateTimeFormat.js delete mode 100644 docs/data/date-pickers/date-time-field/CustomDateTimeFormat.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-field/DateTimeFieldValue.js delete mode 100644 docs/data/date-pickers/date-time-field/DateTimeFieldValue.tsx.preview rename docs/data/date-pickers/date-time-field/{ => demos/basic-date-time-field}/BasicDateTimeField.tsx (91%) create mode 100644 docs/data/date-pickers/date-time-field/demos/basic-date-time-field/client.ts create mode 100644 docs/data/date-pickers/date-time-field/demos/basic-date-time-field/index.ts rename docs/data/date-pickers/date-time-field/{ => demos/custom-date-time-format}/CustomDateTimeFormat.tsx (95%) create mode 100644 docs/data/date-pickers/date-time-field/demos/custom-date-time-format/client.ts create mode 100644 docs/data/date-pickers/date-time-field/demos/custom-date-time-format/index.ts rename docs/data/date-pickers/date-time-field/{ => demos/date-time-field-value}/DateTimeFieldValue.tsx (89%) create mode 100644 docs/data/date-pickers/date-time-field/demos/date-time-field-value/client.ts create mode 100644 docs/data/date-pickers/date-time-field/demos/date-time-field-value/index.ts delete mode 100644 docs/data/date-pickers/date-time-picker/BasicDateTimePicker.js delete mode 100644 docs/data/date-pickers/date-time-picker/BasicDateTimePicker.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.js delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerValue.js delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerValue.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerViewRenderers.js delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerViewRenderers.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerViews.js delete mode 100644 docs/data/date-pickers/date-time-picker/DateTimePickerViews.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-picker/FormPropsDateTimePickers.js delete mode 100644 docs/data/date-pickers/date-time-picker/FormPropsDateTimePickers.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-picker/ResponsiveDateTimePickers.js delete mode 100644 docs/data/date-pickers/date-time-picker/ResponsiveDateTimePickers.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-picker/StaticDateTimePickerLandscape.js delete mode 100644 docs/data/date-pickers/date-time-picker/StaticDateTimePickerLandscape.tsx.preview rename docs/data/date-pickers/date-time-picker/{ => demos/basic-date-time-picker}/BasicDateTimePicker.tsx (92%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/basic-date-time-picker/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/basic-date-time-picker/index.ts rename docs/data/date-pickers/date-time-picker/{ => demos/date-time-picker-open-to}/DateTimePickerOpenTo.tsx (93%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-open-to/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-open-to/index.ts rename docs/data/date-pickers/date-time-picker/{ => demos/date-time-picker-value}/DateTimePickerValue.tsx (89%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-value/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-value/index.ts rename docs/data/date-pickers/date-time-picker/{ => demos/date-time-picker-view-renderers}/DateTimePickerViewRenderers.tsx (95%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-view-renderers/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-view-renderers/index.ts rename docs/data/date-pickers/date-time-picker/{ => demos/date-time-picker-views}/DateTimePickerViews.tsx (95%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-views/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/date-time-picker-views/index.ts rename docs/data/date-pickers/date-time-picker/{ => demos/form-props-date-time-pickers}/FormPropsDateTimePickers.tsx (93%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/form-props-date-time-pickers/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/form-props-date-time-pickers/index.ts rename docs/data/date-pickers/date-time-picker/{ => demos/responsive-date-time-pickers}/ResponsiveDateTimePickers.tsx (96%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/responsive-date-time-pickers/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/responsive-date-time-pickers/index.ts rename docs/data/date-pickers/date-time-picker/{ => demos/static-date-time-picker-landscape}/StaticDateTimePickerLandscape.tsx (90%) create mode 100644 docs/data/date-pickers/date-time-picker/demos/static-date-time-picker-landscape/client.ts create mode 100644 docs/data/date-pickers/date-time-picker/demos/static-date-time-picker-landscape/index.ts delete mode 100644 docs/data/date-pickers/date-time-range-field/BasicDateTimeRangeField.js delete mode 100644 docs/data/date-pickers/date-time-range-field/BasicDateTimeRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-range-field/DateTimeRangeFieldValue.js delete mode 100644 docs/data/date-pickers/date-time-range-field/DateTimeRangeFieldValue.tsx.preview rename docs/data/date-pickers/date-time-range-field/{ => demos/basic-date-time-range-field}/BasicDateTimeRangeField.tsx (95%) create mode 100644 docs/data/date-pickers/date-time-range-field/demos/basic-date-time-range-field/client.ts create mode 100644 docs/data/date-pickers/date-time-range-field/demos/basic-date-time-range-field/index.ts rename docs/data/date-pickers/date-time-range-field/{ => demos/date-time-range-field-value}/DateTimeRangeFieldValue.tsx (86%) create mode 100644 docs/data/date-pickers/date-time-range-field/demos/date-time-range-field-value/client.ts create mode 100644 docs/data/date-pickers/date-time-range-field/demos/date-time-range-field-value/index.ts delete mode 100644 docs/data/date-pickers/date-time-range-picker/BasicDateTimeRangePicker.js delete mode 100644 docs/data/date-pickers/date-time-range-picker/BasicDateTimeRangePicker.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-range-picker/DateTimeRangePickerCalendarProp.js delete mode 100644 docs/data/date-pickers/date-time-range-picker/DateTimeRangePickerCalendarProp.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-range-picker/DateTimeRangePickerValue.js delete mode 100644 docs/data/date-pickers/date-time-range-picker/DateTimeRangePickerValue.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-range-picker/DateTimeRangePickerViewRenderer.js delete mode 100644 docs/data/date-pickers/date-time-range-picker/DateTimeRangePickerViewRenderer.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-range-picker/FormPropsDateTimeRangePickers.js delete mode 100644 docs/data/date-pickers/date-time-range-picker/FormPropsDateTimeRangePickers.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-range-picker/MultiInputDateTimeRangePicker.js delete mode 100644 docs/data/date-pickers/date-time-range-picker/MultiInputDateTimeRangePicker.tsx.preview delete mode 100644 docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.js delete mode 100644 docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx.preview rename docs/data/date-pickers/date-time-range-picker/{ => demos/basic-date-time-range-picker}/BasicDateTimeRangePicker.tsx (92%) create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/basic-date-time-range-picker/client.ts create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/basic-date-time-range-picker/index.ts rename docs/data/date-pickers/date-time-range-picker/{ => demos/date-time-range-picker-calendar-prop}/DateTimeRangePickerCalendarProp.tsx (95%) create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/date-time-range-picker-calendar-prop/client.ts create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/date-time-range-picker-calendar-prop/index.ts rename docs/data/date-pickers/date-time-range-picker/{ => demos/date-time-range-picker-value}/DateTimeRangePickerValue.tsx (87%) create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/date-time-range-picker-value/client.ts create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/date-time-range-picker-value/index.ts rename docs/data/date-pickers/date-time-range-picker/{ => demos/date-time-range-picker-view-renderer}/DateTimeRangePickerViewRenderer.tsx (96%) create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/date-time-range-picker-view-renderer/client.ts create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/date-time-range-picker-view-renderer/index.ts rename docs/data/date-pickers/date-time-range-picker/{ => demos/form-props-date-time-range-pickers}/FormPropsDateTimeRangePickers.tsx (94%) create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/form-props-date-time-range-pickers/client.ts create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/form-props-date-time-range-pickers/index.ts rename docs/data/date-pickers/date-time-range-picker/{ => demos/multi-input-date-time-range-picker}/MultiInputDateTimeRangePicker.tsx (93%) create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/multi-input-date-time-range-picker/client.ts create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/multi-input-date-time-range-picker/index.ts rename docs/data/date-pickers/date-time-range-picker/{ => demos/responsive-date-time-range-pickers}/ResponsiveDateTimeRangePickers.tsx (96%) create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/responsive-date-time-range-pickers/client.ts create mode 100644 docs/data/date-pickers/date-time-range-picker/demos/responsive-date-time-range-pickers/index.ts delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockAmPm.js delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockBasic.js delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockBasic.tsx.preview delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockFormProps.js delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockSkipDisabled.js delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockSkipDisabled.tsx.preview delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockTimeStep.js delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockTimeStep.tsx.preview delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockValue.js delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockViews.js delete mode 100644 docs/data/date-pickers/digital-clock/DigitalClockViews.tsx.preview rename docs/data/date-pickers/digital-clock/{ => demos/digital-clock-am-pm}/DigitalClockAmPm.tsx (98%) create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-am-pm/client.ts create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-am-pm/index.ts rename docs/data/date-pickers/digital-clock/{ => demos/digital-clock-basic}/DigitalClockBasic.tsx (94%) create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-basic/client.ts create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-basic/index.ts rename docs/data/date-pickers/digital-clock/{ => demos/digital-clock-form-props}/DigitalClockFormProps.tsx (97%) create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-form-props/client.ts create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-form-props/index.ts rename docs/data/date-pickers/digital-clock/{ => demos/digital-clock-skip-disabled}/DigitalClockSkipDisabled.tsx (88%) create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-skip-disabled/client.ts create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-skip-disabled/index.ts rename docs/data/date-pickers/digital-clock/{ => demos/digital-clock-time-step}/DigitalClockTimeStep.tsx (95%) create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-time-step/client.ts create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-time-step/index.ts rename docs/data/date-pickers/digital-clock/{ => demos/digital-clock-value}/DigitalClockValue.tsx (94%) create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-value/client.ts create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-value/index.ts rename docs/data/date-pickers/digital-clock/{ => demos/digital-clock-views}/DigitalClockViews.tsx (95%) create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-views/client.ts create mode 100644 docs/data/date-pickers/digital-clock/demos/digital-clock-views/index.ts delete mode 100644 docs/data/date-pickers/fields/ClearableBehavior.js delete mode 100644 docs/data/date-pickers/fields/ControlledSelectedSections.js delete mode 100644 docs/data/date-pickers/fields/ControlledSelectedSections.tsx.preview delete mode 100644 docs/data/date-pickers/fields/ControlledSelectedSectionsMultiInputRangeField.js delete mode 100644 docs/data/date-pickers/fields/ControlledSelectedSectionsMultiInputRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.js delete mode 100644 docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/fields/CustomizeClearIcon.js delete mode 100644 docs/data/date-pickers/fields/CustomizeClearIcon.tsx.preview delete mode 100644 docs/data/date-pickers/fields/DateRangeFieldExamples.js delete mode 100644 docs/data/date-pickers/fields/ImperativeClear.js delete mode 100644 docs/data/date-pickers/fields/SingleDateFieldExamples.js delete mode 100644 docs/data/date-pickers/fields/SingleDateFieldExamples.tsx.preview rename docs/data/date-pickers/fields/{ => demos/clearable-behavior}/ClearableBehavior.tsx (95%) create mode 100644 docs/data/date-pickers/fields/demos/clearable-behavior/client.ts create mode 100644 docs/data/date-pickers/fields/demos/clearable-behavior/index.ts rename docs/data/date-pickers/fields/{ => demos/controlled-selected-sections-multi-input-range-field}/ControlledSelectedSectionsMultiInputRangeField.tsx (91%) create mode 100644 docs/data/date-pickers/fields/demos/controlled-selected-sections-multi-input-range-field/client.ts create mode 100644 docs/data/date-pickers/fields/demos/controlled-selected-sections-multi-input-range-field/index.ts rename docs/data/date-pickers/fields/{ => demos/controlled-selected-sections-single-input-range-field}/ControlledSelectedSectionsSingleInputRangeField.tsx (92%) create mode 100644 docs/data/date-pickers/fields/demos/controlled-selected-sections-single-input-range-field/client.ts create mode 100644 docs/data/date-pickers/fields/demos/controlled-selected-sections-single-input-range-field/index.ts rename docs/data/date-pickers/fields/{ => demos/controlled-selected-sections}/ControlledSelectedSections.tsx (92%) create mode 100644 docs/data/date-pickers/fields/demos/controlled-selected-sections/client.ts create mode 100644 docs/data/date-pickers/fields/demos/controlled-selected-sections/index.ts rename docs/data/date-pickers/fields/{ => demos/customize-clear-icon}/CustomizeClearIcon.tsx (95%) create mode 100644 docs/data/date-pickers/fields/demos/customize-clear-icon/client.ts create mode 100644 docs/data/date-pickers/fields/demos/customize-clear-icon/index.ts rename docs/data/date-pickers/fields/{ => demos/date-range-field-examples}/DateRangeFieldExamples.tsx (98%) create mode 100644 docs/data/date-pickers/fields/demos/date-range-field-examples/client.ts create mode 100644 docs/data/date-pickers/fields/demos/date-range-field-examples/index.ts rename docs/data/date-pickers/fields/{ => demos/imperative-clear}/ImperativeClear.tsx (96%) create mode 100644 docs/data/date-pickers/fields/demos/imperative-clear/client.ts create mode 100644 docs/data/date-pickers/fields/demos/imperative-clear/index.ts rename docs/data/date-pickers/fields/{ => demos/single-date-field-examples}/SingleDateFieldExamples.tsx (95%) create mode 100644 docs/data/date-pickers/fields/demos/single-date-field-examples/client.ts create mode 100644 docs/data/date-pickers/fields/demos/single-date-field-examples/index.ts delete mode 100644 docs/data/date-pickers/lifecycle/KeepOpenDuringFieldFocus.js delete mode 100644 docs/data/date-pickers/lifecycle/KeepOpenDuringFieldFocus.tsx.preview delete mode 100644 docs/data/date-pickers/lifecycle/LifeCycleDateFieldEmpty.js delete mode 100644 docs/data/date-pickers/lifecycle/LifeCycleDateFieldEmpty.tsx.preview delete mode 100644 docs/data/date-pickers/lifecycle/LifeCycleDateRangeField.js delete mode 100644 docs/data/date-pickers/lifecycle/LifeCycleDateRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/lifecycle/LifeCycleIgnoreInvalidValue.js delete mode 100644 docs/data/date-pickers/lifecycle/LifeCycleIgnoreInvalidValue.tsx.preview delete mode 100644 docs/data/date-pickers/lifecycle/ServerInteraction.js rename docs/data/date-pickers/lifecycle/{ => demos/keep-open-during-field-focus}/KeepOpenDuringFieldFocus.tsx (94%) create mode 100644 docs/data/date-pickers/lifecycle/demos/keep-open-during-field-focus/client.ts create mode 100644 docs/data/date-pickers/lifecycle/demos/keep-open-during-field-focus/index.ts rename docs/data/date-pickers/lifecycle/{ => demos/life-cycle-date-field-empty}/LifeCycleDateFieldEmpty.tsx (89%) create mode 100644 docs/data/date-pickers/lifecycle/demos/life-cycle-date-field-empty/client.ts create mode 100644 docs/data/date-pickers/lifecycle/demos/life-cycle-date-field-empty/index.ts rename docs/data/date-pickers/lifecycle/{ => demos/life-cycle-date-range-field}/LifeCycleDateRangeField.tsx (85%) create mode 100644 docs/data/date-pickers/lifecycle/demos/life-cycle-date-range-field/client.ts create mode 100644 docs/data/date-pickers/lifecycle/demos/life-cycle-date-range-field/index.ts rename docs/data/date-pickers/lifecycle/{ => demos/life-cycle-ignore-invalid-value}/LifeCycleIgnoreInvalidValue.tsx (89%) create mode 100644 docs/data/date-pickers/lifecycle/demos/life-cycle-ignore-invalid-value/client.ts create mode 100644 docs/data/date-pickers/lifecycle/demos/life-cycle-ignore-invalid-value/index.ts rename docs/data/date-pickers/lifecycle/{ => demos/server-interaction}/ServerInteraction.tsx (94%) create mode 100644 docs/data/date-pickers/lifecycle/demos/server-interaction/client.ts create mode 100644 docs/data/date-pickers/lifecycle/demos/server-interaction/index.ts delete mode 100644 docs/data/date-pickers/localization/PickersLocalisationTableNoSnap.js create mode 100644 docs/data/date-pickers/localization/demos/pickers-localisation-table-no-snap/PickersLocalisationTableNoSnap.tsx create mode 100644 docs/data/date-pickers/localization/demos/pickers-localisation-table-no-snap/client.ts create mode 100644 docs/data/date-pickers/localization/demos/pickers-localisation-table-no-snap/index.ts delete mode 100644 docs/data/date-pickers/playground/PickersPlaygroundWrapper.js create mode 100644 docs/data/date-pickers/playground/demos/pickers-playground-wrapper/PickersPlaygroundWrapper.tsx create mode 100644 docs/data/date-pickers/playground/demos/pickers-playground-wrapper/client.ts create mode 100644 docs/data/date-pickers/playground/demos/pickers-playground-wrapper/index.ts delete mode 100644 docs/data/date-pickers/quickstart/FirstComponent.js delete mode 100644 docs/data/date-pickers/quickstart/FirstComponent.tsx.preview rename docs/data/date-pickers/quickstart/{ => demos/first-component}/FirstComponent.tsx (88%) create mode 100644 docs/data/date-pickers/quickstart/demos/first-component/client.ts create mode 100644 docs/data/date-pickers/quickstart/demos/first-component/index.ts delete mode 100644 docs/data/date-pickers/shortcuts/AdvancedRangeShortcuts.js delete mode 100644 docs/data/date-pickers/shortcuts/AdvancedRangeShortcuts.tsx.preview delete mode 100644 docs/data/date-pickers/shortcuts/BasicRangeShortcuts.js delete mode 100644 docs/data/date-pickers/shortcuts/BasicRangeShortcuts.tsx delete mode 100644 docs/data/date-pickers/shortcuts/BasicRangeShortcuts.tsx.preview delete mode 100644 docs/data/date-pickers/shortcuts/BasicShortcuts.js delete mode 100644 docs/data/date-pickers/shortcuts/BasicShortcuts.tsx.preview delete mode 100644 docs/data/date-pickers/shortcuts/ChangeImportance.js delete mode 100644 docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.js delete mode 100644 docs/data/date-pickers/shortcuts/DisabledDatesShortcuts.js delete mode 100644 docs/data/date-pickers/shortcuts/DisabledDatesShortcuts.tsx.preview delete mode 100644 docs/data/date-pickers/shortcuts/OnChangeShortcutLabel.js delete mode 100644 docs/data/date-pickers/shortcuts/OnChangeShortcutLabel.tsx.preview delete mode 100644 docs/data/date-pickers/shortcuts/RTLShortcuts.js delete mode 100644 docs/data/date-pickers/shortcuts/RTLShortcuts.tsx.preview rename docs/data/date-pickers/shortcuts/{ => demos/advanced-range-shortcuts}/AdvancedRangeShortcuts.tsx (89%) create mode 100644 docs/data/date-pickers/shortcuts/demos/advanced-range-shortcuts/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/advanced-range-shortcuts/index.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/basic-range-shortcuts/BasicRangeShortcuts.tsx create mode 100644 docs/data/date-pickers/shortcuts/demos/basic-range-shortcuts/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/basic-range-shortcuts/index.ts rename docs/data/date-pickers/shortcuts/{ => demos/basic-shortcuts}/BasicShortcuts.tsx (91%) create mode 100644 docs/data/date-pickers/shortcuts/demos/basic-shortcuts/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/basic-shortcuts/index.ts rename docs/data/date-pickers/shortcuts/{ => demos/change-importance}/ChangeImportance.tsx (91%) create mode 100644 docs/data/date-pickers/shortcuts/demos/change-importance/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/change-importance/index.ts rename docs/data/date-pickers/shortcuts/{ => demos/customized-range-shortcuts}/CustomizedRangeShortcuts.tsx (94%) create mode 100644 docs/data/date-pickers/shortcuts/demos/customized-range-shortcuts/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/customized-range-shortcuts/index.ts rename docs/data/date-pickers/shortcuts/{ => demos/disabled-dates-shortcuts}/DisabledDatesShortcuts.tsx (92%) create mode 100644 docs/data/date-pickers/shortcuts/demos/disabled-dates-shortcuts/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/disabled-dates-shortcuts/index.ts rename docs/data/date-pickers/shortcuts/{ => demos/on-change-shortcut-label}/OnChangeShortcutLabel.tsx (95%) create mode 100644 docs/data/date-pickers/shortcuts/demos/on-change-shortcut-label/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/on-change-shortcut-label/index.ts rename docs/data/date-pickers/shortcuts/{ => demos/rtl-shortcuts}/RTLShortcuts.tsx (93%) create mode 100644 docs/data/date-pickers/shortcuts/demos/rtl-shortcuts/client.ts create mode 100644 docs/data/date-pickers/shortcuts/demos/rtl-shortcuts/index.ts delete mode 100644 docs/data/date-pickers/time-clock/BasicTimeClock.js delete mode 100644 docs/data/date-pickers/time-clock/BasicTimeClock.tsx.preview delete mode 100644 docs/data/date-pickers/time-clock/TimeClockAmPm.js delete mode 100644 docs/data/date-pickers/time-clock/TimeClockAmPm.tsx.preview delete mode 100644 docs/data/date-pickers/time-clock/TimeClockFormProps.js delete mode 100644 docs/data/date-pickers/time-clock/TimeClockFormProps.tsx.preview delete mode 100644 docs/data/date-pickers/time-clock/TimeClockValue.js delete mode 100644 docs/data/date-pickers/time-clock/TimeClockValue.tsx.preview delete mode 100644 docs/data/date-pickers/time-clock/TimeClockViews.js delete mode 100644 docs/data/date-pickers/time-clock/TimeClockViews.tsx.preview rename docs/data/date-pickers/time-clock/{ => demos/basic-time-clock}/BasicTimeClock.tsx (88%) create mode 100644 docs/data/date-pickers/time-clock/demos/basic-time-clock/client.ts create mode 100644 docs/data/date-pickers/time-clock/demos/basic-time-clock/index.ts rename docs/data/date-pickers/time-clock/{ => demos/time-clock-am-pm}/TimeClockAmPm.tsx (95%) create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-am-pm/client.ts create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-am-pm/index.ts rename docs/data/date-pickers/time-clock/{ => demos/time-clock-form-props}/TimeClockFormProps.tsx (94%) create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-form-props/client.ts create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-form-props/index.ts rename docs/data/date-pickers/time-clock/{ => demos/time-clock-value}/TimeClockValue.tsx (89%) create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-value/client.ts create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-value/index.ts rename docs/data/date-pickers/time-clock/{ => demos/time-clock-views}/TimeClockViews.tsx (94%) create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-views/client.ts create mode 100644 docs/data/date-pickers/time-clock/demos/time-clock-views/index.ts delete mode 100644 docs/data/date-pickers/time-field/BasicTimeField.js delete mode 100644 docs/data/date-pickers/time-field/BasicTimeField.tsx.preview delete mode 100644 docs/data/date-pickers/time-field/CustomTimeFormat.js delete mode 100644 docs/data/date-pickers/time-field/CustomTimeFormat.tsx.preview delete mode 100644 docs/data/date-pickers/time-field/TimeFieldValue.js delete mode 100644 docs/data/date-pickers/time-field/TimeFieldValue.tsx.preview rename docs/data/date-pickers/time-field/{ => demos/basic-time-field}/BasicTimeField.tsx (91%) create mode 100644 docs/data/date-pickers/time-field/demos/basic-time-field/client.ts create mode 100644 docs/data/date-pickers/time-field/demos/basic-time-field/index.ts rename docs/data/date-pickers/time-field/{ => demos/custom-time-format}/CustomTimeFormat.tsx (95%) create mode 100644 docs/data/date-pickers/time-field/demos/custom-time-format/client.ts create mode 100644 docs/data/date-pickers/time-field/demos/custom-time-format/index.ts rename docs/data/date-pickers/time-field/{ => demos/time-field-value}/TimeFieldValue.tsx (89%) create mode 100644 docs/data/date-pickers/time-field/demos/time-field-value/client.ts create mode 100644 docs/data/date-pickers/time-field/demos/time-field-value/index.ts delete mode 100644 docs/data/date-pickers/time-picker/BasicTimePicker.js delete mode 100644 docs/data/date-pickers/time-picker/BasicTimePicker.tsx.preview delete mode 100644 docs/data/date-pickers/time-picker/FormPropsTimePickers.js delete mode 100644 docs/data/date-pickers/time-picker/FormPropsTimePickers.tsx.preview delete mode 100644 docs/data/date-pickers/time-picker/ResponsiveTimePickers.js delete mode 100644 docs/data/date-pickers/time-picker/ResponsiveTimePickers.tsx.preview delete mode 100644 docs/data/date-pickers/time-picker/StaticTimePickerLandscape.js delete mode 100644 docs/data/date-pickers/time-picker/StaticTimePickerLandscape.tsx.preview delete mode 100644 docs/data/date-pickers/time-picker/TimePickerOpenTo.js delete mode 100644 docs/data/date-pickers/time-picker/TimePickerOpenTo.tsx.preview delete mode 100644 docs/data/date-pickers/time-picker/TimePickerValue.js delete mode 100644 docs/data/date-pickers/time-picker/TimePickerValue.tsx.preview delete mode 100644 docs/data/date-pickers/time-picker/TimePickerViewRenderers.js delete mode 100644 docs/data/date-pickers/time-picker/TimePickerViewRenderers.tsx.preview delete mode 100644 docs/data/date-pickers/time-picker/TimePickerViews.js delete mode 100644 docs/data/date-pickers/time-picker/TimePickerViews.tsx.preview rename docs/data/date-pickers/time-picker/{ => demos/basic-time-picker}/BasicTimePicker.tsx (91%) create mode 100644 docs/data/date-pickers/time-picker/demos/basic-time-picker/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/basic-time-picker/index.ts rename docs/data/date-pickers/time-picker/{ => demos/form-props-time-pickers}/FormPropsTimePickers.tsx (93%) create mode 100644 docs/data/date-pickers/time-picker/demos/form-props-time-pickers/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/form-props-time-pickers/index.ts rename docs/data/date-pickers/time-picker/{ => demos/responsive-time-pickers}/ResponsiveTimePickers.tsx (96%) create mode 100644 docs/data/date-pickers/time-picker/demos/responsive-time-pickers/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/responsive-time-pickers/index.ts rename docs/data/date-pickers/time-picker/{ => demos/static-time-picker-landscape}/StaticTimePickerLandscape.tsx (89%) create mode 100644 docs/data/date-pickers/time-picker/demos/static-time-picker-landscape/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/static-time-picker-landscape/index.ts rename docs/data/date-pickers/time-picker/{ => demos/time-picker-open-to}/TimePickerOpenTo.tsx (93%) create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-open-to/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-open-to/index.ts rename docs/data/date-pickers/time-picker/{ => demos/time-picker-value}/TimePickerValue.tsx (89%) create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-value/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-value/index.ts rename docs/data/date-pickers/time-picker/{ => demos/time-picker-view-renderers}/TimePickerViewRenderers.tsx (94%) create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-view-renderers/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-view-renderers/index.ts rename docs/data/date-pickers/time-picker/{ => demos/time-picker-views}/TimePickerViews.tsx (94%) create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-views/client.ts create mode 100644 docs/data/date-pickers/time-picker/demos/time-picker-views/index.ts delete mode 100644 docs/data/date-pickers/time-range-field/BasicTimeRangeField.js delete mode 100644 docs/data/date-pickers/time-range-field/BasicTimeRangeField.tsx.preview delete mode 100644 docs/data/date-pickers/time-range-field/TimeRangeFieldValue.js delete mode 100644 docs/data/date-pickers/time-range-field/TimeRangeFieldValue.tsx.preview rename docs/data/date-pickers/time-range-field/{ => demos/basic-time-range-field}/BasicTimeRangeField.tsx (95%) create mode 100644 docs/data/date-pickers/time-range-field/demos/basic-time-range-field/client.ts create mode 100644 docs/data/date-pickers/time-range-field/demos/basic-time-range-field/index.ts rename docs/data/date-pickers/time-range-field/{ => demos/time-range-field-value}/TimeRangeFieldValue.tsx (86%) create mode 100644 docs/data/date-pickers/time-range-field/demos/time-range-field-value/client.ts create mode 100644 docs/data/date-pickers/time-range-field/demos/time-range-field-value/index.ts delete mode 100644 docs/data/date-pickers/time-range-picker/BasicTimeRangePicker.js delete mode 100644 docs/data/date-pickers/time-range-picker/BasicTimeRangePicker.tsx.preview delete mode 100644 docs/data/date-pickers/time-range-picker/CustomizedBehaviorTimeRangePicker.js delete mode 100644 docs/data/date-pickers/time-range-picker/FormPropsTimeRangePickers.js delete mode 100644 docs/data/date-pickers/time-range-picker/FormPropsTimeRangePickers.tsx.preview delete mode 100644 docs/data/date-pickers/time-range-picker/MultiInputTimeRangePicker.js delete mode 100644 docs/data/date-pickers/time-range-picker/MultiInputTimeRangePicker.tsx.preview delete mode 100644 docs/data/date-pickers/time-range-picker/ResponsiveTimeRangePickers.js delete mode 100644 docs/data/date-pickers/time-range-picker/ResponsiveTimeRangePickers.tsx.preview delete mode 100644 docs/data/date-pickers/time-range-picker/TimeRangePickerValue.js delete mode 100644 docs/data/date-pickers/time-range-picker/TimeRangePickerValue.tsx.preview rename docs/data/date-pickers/time-range-picker/{ => demos/basic-time-range-picker}/BasicTimeRangePicker.tsx (91%) create mode 100644 docs/data/date-pickers/time-range-picker/demos/basic-time-range-picker/client.ts create mode 100644 docs/data/date-pickers/time-range-picker/demos/basic-time-range-picker/index.ts rename docs/data/date-pickers/time-range-picker/{ => demos/customized-behavior-time-range-picker}/CustomizedBehaviorTimeRangePicker.tsx (87%) create mode 100644 docs/data/date-pickers/time-range-picker/demos/customized-behavior-time-range-picker/client.ts create mode 100644 docs/data/date-pickers/time-range-picker/demos/customized-behavior-time-range-picker/index.ts rename docs/data/date-pickers/time-range-picker/{ => demos/form-props-time-range-pickers}/FormPropsTimeRangePickers.tsx (93%) create mode 100644 docs/data/date-pickers/time-range-picker/demos/form-props-time-range-pickers/client.ts create mode 100644 docs/data/date-pickers/time-range-picker/demos/form-props-time-range-pickers/index.ts rename docs/data/date-pickers/time-range-picker/{ => demos/multi-input-time-range-picker}/MultiInputTimeRangePicker.tsx (93%) create mode 100644 docs/data/date-pickers/time-range-picker/demos/multi-input-time-range-picker/client.ts create mode 100644 docs/data/date-pickers/time-range-picker/demos/multi-input-time-range-picker/index.ts rename docs/data/date-pickers/time-range-picker/{ => demos/responsive-time-range-pickers}/ResponsiveTimeRangePickers.tsx (96%) create mode 100644 docs/data/date-pickers/time-range-picker/demos/responsive-time-range-pickers/client.ts create mode 100644 docs/data/date-pickers/time-range-picker/demos/responsive-time-range-pickers/index.ts rename docs/data/date-pickers/time-range-picker/{ => demos/time-range-picker-value}/TimeRangePickerValue.tsx (86%) create mode 100644 docs/data/date-pickers/time-range-picker/demos/time-range-picker-value/client.ts create mode 100644 docs/data/date-pickers/time-range-picker/demos/time-range-picker-value/index.ts delete mode 100644 docs/data/date-pickers/timezone/BasicTimezoneProp.js delete mode 100644 docs/data/date-pickers/timezone/BasicTimezoneProp.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/BasicValueProp.js delete mode 100644 docs/data/date-pickers/timezone/BasicValueProp.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/DayjsTimezone.js delete mode 100644 docs/data/date-pickers/timezone/DayjsTimezone.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/DayjsUTC.js delete mode 100644 docs/data/date-pickers/timezone/DayjsUTC.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/LuxonTimezone.js delete mode 100644 docs/data/date-pickers/timezone/LuxonTimezone.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/LuxonUTC.js delete mode 100644 docs/data/date-pickers/timezone/LuxonUTC.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/MomentTimezone.js delete mode 100644 docs/data/date-pickers/timezone/MomentTimezone.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/MomentUTC.js delete mode 100644 docs/data/date-pickers/timezone/MomentUTC.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/StoreUTCButDisplayOtherTimezone.js delete mode 100644 docs/data/date-pickers/timezone/StoreUTCButDisplayOtherTimezone.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/StoreUTCButDisplaySystemTimezone.js delete mode 100644 docs/data/date-pickers/timezone/StoreUTCButDisplaySystemTimezone.tsx.preview delete mode 100644 docs/data/date-pickers/timezone/TimezonePlayground.js rename docs/data/date-pickers/timezone/{ => demos/basic-timezone-prop}/BasicTimezoneProp.tsx (91%) create mode 100644 docs/data/date-pickers/timezone/demos/basic-timezone-prop/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/basic-timezone-prop/index.ts rename docs/data/date-pickers/timezone/{ => demos/basic-value-prop}/BasicValueProp.tsx (90%) create mode 100644 docs/data/date-pickers/timezone/demos/basic-value-prop/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/basic-value-prop/index.ts rename docs/data/date-pickers/timezone/{ => demos/dayjs-timezone}/DayjsTimezone.tsx (89%) create mode 100644 docs/data/date-pickers/timezone/demos/dayjs-timezone/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/dayjs-timezone/index.ts rename docs/data/date-pickers/timezone/{ => demos/dayjs-utc}/DayjsUTC.tsx (88%) create mode 100644 docs/data/date-pickers/timezone/demos/dayjs-utc/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/dayjs-utc/index.ts rename docs/data/date-pickers/timezone/{ => demos/luxon-timezone}/LuxonTimezone.tsx (95%) create mode 100644 docs/data/date-pickers/timezone/demos/luxon-timezone/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/luxon-timezone/index.ts rename docs/data/date-pickers/timezone/{ => demos/luxon-utc}/LuxonUTC.tsx (94%) create mode 100644 docs/data/date-pickers/timezone/demos/luxon-utc/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/luxon-utc/index.ts rename docs/data/date-pickers/timezone/{ => demos/moment-timezone}/MomentTimezone.tsx (87%) create mode 100644 docs/data/date-pickers/timezone/demos/moment-timezone/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/moment-timezone/index.ts rename docs/data/date-pickers/timezone/{ => demos/moment-utc}/MomentUTC.tsx (88%) create mode 100644 docs/data/date-pickers/timezone/demos/moment-utc/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/moment-utc/index.ts rename docs/data/date-pickers/timezone/{ => demos/store-utc-but-display-other-timezone}/StoreUTCButDisplayOtherTimezone.tsx (90%) create mode 100644 docs/data/date-pickers/timezone/demos/store-utc-but-display-other-timezone/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/store-utc-but-display-other-timezone/index.ts rename docs/data/date-pickers/timezone/{ => demos/store-utc-but-display-system-timezone}/StoreUTCButDisplaySystemTimezone.tsx (89%) create mode 100644 docs/data/date-pickers/timezone/demos/store-utc-but-display-system-timezone/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/store-utc-but-display-system-timezone/index.ts rename docs/data/date-pickers/timezone/{ => demos/timezone-playground}/TimezonePlayground.tsx (91%) create mode 100644 docs/data/date-pickers/timezone/demos/timezone-playground/client.ts create mode 100644 docs/data/date-pickers/timezone/demos/timezone-playground/index.ts delete mode 100644 docs/data/date-pickers/validation/DateRangeValidationShouldDisableDate.js delete mode 100644 docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.js delete mode 100644 docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx.preview delete mode 100644 docs/data/date-pickers/validation/DateTimeValidationMinDateTime.js delete mode 100644 docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx.preview delete mode 100644 docs/data/date-pickers/validation/DateValidationDisableFuture.js delete mode 100644 docs/data/date-pickers/validation/DateValidationDisablePast.js delete mode 100644 docs/data/date-pickers/validation/DateValidationMaxDate.js delete mode 100644 docs/data/date-pickers/validation/DateValidationMinDate.js delete mode 100644 docs/data/date-pickers/validation/DateValidationShouldDisableDate.js delete mode 100644 docs/data/date-pickers/validation/DateValidationShouldDisableMonth.js delete mode 100644 docs/data/date-pickers/validation/DateValidationShouldDisableMonth.tsx.preview delete mode 100644 docs/data/date-pickers/validation/DateValidationShouldDisableYear.js delete mode 100644 docs/data/date-pickers/validation/DateValidationShouldDisableYear.tsx.preview delete mode 100644 docs/data/date-pickers/validation/RenderErrorUnderField.js delete mode 100644 docs/data/date-pickers/validation/RenderErrorUnderField.tsx.preview delete mode 100644 docs/data/date-pickers/validation/TimeValidationMaxTime.js delete mode 100644 docs/data/date-pickers/validation/TimeValidationMaxTime.tsx.preview delete mode 100644 docs/data/date-pickers/validation/TimeValidationMinTime.js delete mode 100644 docs/data/date-pickers/validation/TimeValidationMinTime.tsx.preview delete mode 100644 docs/data/date-pickers/validation/TimeValidationShouldDisableTime.js delete mode 100644 docs/data/date-pickers/validation/ValidationBehaviorInput.js delete mode 100644 docs/data/date-pickers/validation/ValidationBehaviorInput.tsx.preview delete mode 100644 docs/data/date-pickers/validation/ValidationBehaviorView.js delete mode 100644 docs/data/date-pickers/validation/ValidationBehaviorView.tsx.preview rename docs/data/date-pickers/validation/{ => demos/date-range-validation-should-disable-date}/DateRangeValidationShouldDisableDate.tsx (93%) create mode 100644 docs/data/date-pickers/validation/demos/date-range-validation-should-disable-date/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-range-validation-should-disable-date/index.ts rename docs/data/date-pickers/validation/{ => demos/date-time-validation-max-date-time}/DateTimeValidationMaxDateTime.tsx (95%) create mode 100644 docs/data/date-pickers/validation/demos/date-time-validation-max-date-time/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-time-validation-max-date-time/index.ts rename docs/data/date-pickers/validation/{ => demos/date-time-validation-min-date-time}/DateTimeValidationMinDateTime.tsx (95%) create mode 100644 docs/data/date-pickers/validation/demos/date-time-validation-min-date-time/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-time-validation-min-date-time/index.ts rename docs/data/date-pickers/validation/{ => demos/date-validation-disable-future}/DateValidationDisableFuture.tsx (97%) create mode 100644 docs/data/date-pickers/validation/demos/date-validation-disable-future/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-validation-disable-future/index.ts rename docs/data/date-pickers/validation/{ => demos/date-validation-disable-past}/DateValidationDisablePast.tsx (97%) create mode 100644 docs/data/date-pickers/validation/demos/date-validation-disable-past/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-validation-disable-past/index.ts rename docs/data/date-pickers/validation/{ => demos/date-validation-max-date}/DateValidationMaxDate.tsx (97%) create mode 100644 docs/data/date-pickers/validation/demos/date-validation-max-date/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-validation-max-date/index.ts rename docs/data/date-pickers/validation/{ => demos/date-validation-min-date}/DateValidationMinDate.tsx (97%) create mode 100644 docs/data/date-pickers/validation/demos/date-validation-min-date/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-validation-min-date/index.ts rename docs/data/date-pickers/validation/{ => demos/date-validation-should-disable-date}/DateValidationShouldDisableDate.tsx (94%) create mode 100644 docs/data/date-pickers/validation/demos/date-validation-should-disable-date/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-validation-should-disable-date/index.ts rename docs/data/date-pickers/validation/{ => demos/date-validation-should-disable-month}/DateValidationShouldDisableMonth.tsx (91%) create mode 100644 docs/data/date-pickers/validation/demos/date-validation-should-disable-month/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-validation-should-disable-month/index.ts rename docs/data/date-pickers/validation/{ => demos/date-validation-should-disable-year}/DateValidationShouldDisableYear.tsx (89%) create mode 100644 docs/data/date-pickers/validation/demos/date-validation-should-disable-year/client.ts create mode 100644 docs/data/date-pickers/validation/demos/date-validation-should-disable-year/index.ts rename docs/data/date-pickers/validation/{ => demos/render-error-under-field}/RenderErrorUnderField.tsx (91%) create mode 100644 docs/data/date-pickers/validation/demos/render-error-under-field/client.ts create mode 100644 docs/data/date-pickers/validation/demos/render-error-under-field/index.ts rename docs/data/date-pickers/validation/{ => demos/time-validation-max-time}/TimeValidationMaxTime.tsx (97%) create mode 100644 docs/data/date-pickers/validation/demos/time-validation-max-time/client.ts create mode 100644 docs/data/date-pickers/validation/demos/time-validation-max-time/index.ts rename docs/data/date-pickers/validation/{ => demos/time-validation-min-time}/TimeValidationMinTime.tsx (97%) create mode 100644 docs/data/date-pickers/validation/demos/time-validation-min-time/client.ts create mode 100644 docs/data/date-pickers/validation/demos/time-validation-min-time/index.ts rename docs/data/date-pickers/validation/{ => demos/time-validation-should-disable-time}/TimeValidationShouldDisableTime.tsx (91%) create mode 100644 docs/data/date-pickers/validation/demos/time-validation-should-disable-time/client.ts create mode 100644 docs/data/date-pickers/validation/demos/time-validation-should-disable-time/index.ts rename docs/data/date-pickers/validation/{ => demos/validation-behavior-input}/ValidationBehaviorInput.tsx (90%) create mode 100644 docs/data/date-pickers/validation/demos/validation-behavior-input/client.ts create mode 100644 docs/data/date-pickers/validation/demos/validation-behavior-input/index.ts rename docs/data/date-pickers/validation/{ => demos/validation-behavior-view}/ValidationBehaviorView.tsx (95%) create mode 100644 docs/data/date-pickers/validation/demos/validation-behavior-view/client.ts create mode 100644 docs/data/date-pickers/validation/demos/validation-behavior-view/index.ts delete mode 100644 docs/data/introduction/support/SupportedVersions.js rename docs/data/introduction/support/{ => demos/supported-versions}/SupportedVersions.tsx (98%) create mode 100644 docs/data/introduction/support/demos/supported-versions/client.ts create mode 100644 docs/data/introduction/support/demos/supported-versions/index.ts delete mode 100644 docs/data/migration/migration-data-grid-v6/ColDefChangesGridNoSnap.js create mode 100644 docs/data/migration/migration-data-grid-v6/demos/col-def-changes-grid-no-snap/ColDefChangesGridNoSnap.tsx create mode 100644 docs/data/migration/migration-data-grid-v6/demos/col-def-changes-grid-no-snap/client.ts create mode 100644 docs/data/migration/migration-data-grid-v6/demos/col-def-changes-grid-no-snap/index.ts delete mode 100644 docs/data/migration/migration-pickers-v5/MobileKeyboardView.js delete mode 100644 docs/data/migration/migration-pickers-v5/MobileKeyboardView.tsx.preview rename docs/data/migration/migration-pickers-v5/{ => demos/mobile-keyboard-view}/MobileKeyboardView.tsx (92%) create mode 100644 docs/data/migration/migration-pickers-v5/demos/mobile-keyboard-view/client.ts create mode 100644 docs/data/migration/migration-pickers-v5/demos/mobile-keyboard-view/index.ts delete mode 100644 docs/data/scheduler/components/event-dialog/CustomGeneralTab.js delete mode 100644 docs/data/scheduler/components/event-dialog/CustomGeneralTab.tsx.preview delete mode 100644 docs/data/scheduler/components/event-dialog/CustomValidation.js delete mode 100644 docs/data/scheduler/components/event-dialog/CustomValidation.tsx.preview delete mode 100644 docs/data/scheduler/components/event-dialog/ReorderAndOmitSections.js delete mode 100644 docs/data/scheduler/components/event-dialog/ReorderAndOmitSections.tsx.preview rename docs/data/scheduler/components/event-dialog/{ => demos/custom-general-tab}/CustomGeneralTab.tsx (95%) create mode 100644 docs/data/scheduler/components/event-dialog/demos/custom-general-tab/client.ts create mode 100644 docs/data/scheduler/components/event-dialog/demos/custom-general-tab/index.ts rename docs/data/scheduler/components/event-dialog/{ => demos/custom-validation}/CustomValidation.tsx (95%) create mode 100644 docs/data/scheduler/components/event-dialog/demos/custom-validation/client.ts create mode 100644 docs/data/scheduler/components/event-dialog/demos/custom-validation/index.ts rename docs/data/scheduler/components/event-dialog/{ => demos/reorder-and-omit-sections}/ReorderAndOmitSections.tsx (93%) create mode 100644 docs/data/scheduler/components/event-dialog/demos/reorder-and-omit-sections/client.ts create mode 100644 docs/data/scheduler/components/event-dialog/demos/reorder-and-omit-sections/index.ts delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/BasicDragAndDrop.js delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/BasicDragAndDrop.tsx delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/BasicDragAndDrop.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/DisableDragging.js delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/DisableDragging.tsx delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/DisableDragging.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/DisableResizing.js delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/DisableResizing.tsx delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/DisableResizing.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/ExternalDragAndDrop.js delete mode 100644 docs/data/scheduler/event-calendar/drag-interactions/ExternalDragAndDrop.tsx create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/basic-drag-and-drop/BasicDragAndDrop.tsx create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/basic-drag-and-drop/client.ts create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/basic-drag-and-drop/index.ts create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/disable-dragging/DisableDragging.tsx create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/disable-dragging/client.ts create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/disable-dragging/index.ts create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/disable-resizing/DisableResizing.tsx create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/disable-resizing/client.ts create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/disable-resizing/index.ts create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/external-drag-and-drop/ExternalDragAndDrop.tsx create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/external-drag-and-drop/client.ts create mode 100644 docs/data/scheduler/event-calendar/drag-interactions/demos/external-drag-and-drop/index.ts delete mode 100644 docs/data/scheduler/event-calendar/editing/CustomEditingUI.js delete mode 100644 docs/data/scheduler/event-calendar/editing/CustomEditingUI.tsx delete mode 100644 docs/data/scheduler/event-calendar/editing/EventCreationDuration.js delete mode 100644 docs/data/scheduler/event-calendar/editing/EventCreationDuration.tsx delete mode 100644 docs/data/scheduler/event-calendar/editing/EventCreationDuration.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/editing/EventCreationInteraction.js delete mode 100644 docs/data/scheduler/event-calendar/editing/EventCreationInteraction.tsx delete mode 100644 docs/data/scheduler/event-calendar/editing/EventCreationInteraction.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDeletionConfirmation.js delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDeletionConfirmation.tsx delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDeletionConfirmation.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDeletionDisabled.js delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDeletionDisabled.tsx delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDeletionDisabled.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDialog.js delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDialog.tsx delete mode 100644 docs/data/scheduler/event-calendar/editing/EventDialog.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/editing/ReadOnly.js delete mode 100644 docs/data/scheduler/event-calendar/editing/ReadOnly.tsx delete mode 100644 docs/data/scheduler/event-calendar/editing/ReadOnly.tsx.preview create mode 100644 docs/data/scheduler/event-calendar/editing/demos/custom-editing-ui/CustomEditingUI.tsx create mode 100644 docs/data/scheduler/event-calendar/editing/demos/custom-editing-ui/client.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/custom-editing-ui/index.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-creation-duration/EventCreationDuration.tsx create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-creation-duration/client.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-creation-duration/index.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-creation-interaction/EventCreationInteraction.tsx create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-creation-interaction/client.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-creation-interaction/index.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-deletion-confirmation/EventDeletionConfirmation.tsx create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-deletion-confirmation/client.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-deletion-confirmation/index.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-deletion-disabled/EventDeletionDisabled.tsx create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-deletion-disabled/client.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-deletion-disabled/index.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-dialog/EventDialog.tsx create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-dialog/client.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/event-dialog/index.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/read-only/ReadOnly.tsx create mode 100644 docs/data/scheduler/event-calendar/editing/demos/read-only/client.ts create mode 100644 docs/data/scheduler/event-calendar/editing/demos/read-only/index.ts delete mode 100644 docs/data/scheduler/event-calendar/events/AllDay.js delete mode 100644 docs/data/scheduler/event-calendar/events/AllDay.tsx delete mode 100644 docs/data/scheduler/event-calendar/events/AllDay.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/events/ClassNameProperty.js delete mode 100644 docs/data/scheduler/event-calendar/events/ClassNameProperty.tsx delete mode 100644 docs/data/scheduler/event-calendar/events/ColorPalettes.js delete mode 100644 docs/data/scheduler/event-calendar/events/ColorPalettes.tsx delete mode 100644 docs/data/scheduler/event-calendar/events/ColorPalettes.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/events/DynamicResourceProperty.js delete mode 100644 docs/data/scheduler/event-calendar/events/DynamicResourceProperty.tsx delete mode 100644 docs/data/scheduler/event-calendar/events/TitleProperty.js delete mode 100644 docs/data/scheduler/event-calendar/events/TitleProperty.tsx delete mode 100644 docs/data/scheduler/event-calendar/events/TitleProperty.tsx.preview create mode 100644 docs/data/scheduler/event-calendar/events/demos/all-day/AllDay.tsx create mode 100644 docs/data/scheduler/event-calendar/events/demos/all-day/client.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/all-day/index.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/class-name-property/ClassNameProperty.tsx create mode 100644 docs/data/scheduler/event-calendar/events/demos/class-name-property/client.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/class-name-property/index.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/color-palettes/ColorPalettes.tsx create mode 100644 docs/data/scheduler/event-calendar/events/demos/color-palettes/client.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/color-palettes/index.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/dynamic-resource-property/DynamicResourceProperty.tsx create mode 100644 docs/data/scheduler/event-calendar/events/demos/dynamic-resource-property/client.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/dynamic-resource-property/index.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/title-property/TitleProperty.tsx create mode 100644 docs/data/scheduler/event-calendar/events/demos/title-property/client.ts create mode 100644 docs/data/scheduler/event-calendar/events/demos/title-property/index.ts delete mode 100644 docs/data/scheduler/event-calendar/lazy-loading/BasicDataSource.js delete mode 100644 docs/data/scheduler/event-calendar/lazy-loading/BasicDataSource.tsx delete mode 100644 docs/data/scheduler/event-calendar/lazy-loading/BasicDataSource.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/lazy-loading/ErrorHandling.js delete mode 100644 docs/data/scheduler/event-calendar/lazy-loading/ErrorHandling.tsx create mode 100644 docs/data/scheduler/event-calendar/lazy-loading/demos/basic-data-source/BasicDataSource.tsx create mode 100644 docs/data/scheduler/event-calendar/lazy-loading/demos/basic-data-source/client.ts create mode 100644 docs/data/scheduler/event-calendar/lazy-loading/demos/basic-data-source/index.ts create mode 100644 docs/data/scheduler/event-calendar/lazy-loading/demos/error-handling/ErrorHandling.tsx create mode 100644 docs/data/scheduler/event-calendar/lazy-loading/demos/error-handling/client.ts create mode 100644 docs/data/scheduler/event-calendar/lazy-loading/demos/error-handling/index.ts delete mode 100644 docs/data/scheduler/event-calendar/localization/CustomLocaleTextCalendar.js delete mode 100644 docs/data/scheduler/event-calendar/localization/CustomLocaleTextCalendar.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/localization/DateLocaleCalendar.js delete mode 100644 docs/data/scheduler/event-calendar/localization/DateLocaleCalendar.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/localization/LocaleTextCalendar.js delete mode 100644 docs/data/scheduler/event-calendar/localization/LocaleTextCalendar.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/localization/RTLCalendar.js delete mode 100644 docs/data/scheduler/event-calendar/localization/RTLCalendar.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/localization/SchedulerLocalisationTableNoSnap.js rename docs/data/scheduler/event-calendar/localization/{ => demos/custom-locale-text-calendar}/CustomLocaleTextCalendar.tsx (83%) create mode 100644 docs/data/scheduler/event-calendar/localization/demos/custom-locale-text-calendar/client.ts create mode 100644 docs/data/scheduler/event-calendar/localization/demos/custom-locale-text-calendar/index.ts rename docs/data/scheduler/event-calendar/localization/{ => demos/date-locale-calendar}/DateLocaleCalendar.tsx (86%) create mode 100644 docs/data/scheduler/event-calendar/localization/demos/date-locale-calendar/client.ts create mode 100644 docs/data/scheduler/event-calendar/localization/demos/date-locale-calendar/index.ts rename docs/data/scheduler/event-calendar/localization/{ => demos/locale-text-calendar}/LocaleTextCalendar.tsx (85%) create mode 100644 docs/data/scheduler/event-calendar/localization/demos/locale-text-calendar/client.ts create mode 100644 docs/data/scheduler/event-calendar/localization/demos/locale-text-calendar/index.ts rename docs/data/scheduler/event-calendar/localization/{ => demos/rtl-calendar}/RTLCalendar.tsx (96%) create mode 100644 docs/data/scheduler/event-calendar/localization/demos/rtl-calendar/client.ts create mode 100644 docs/data/scheduler/event-calendar/localization/demos/rtl-calendar/index.ts create mode 100644 docs/data/scheduler/event-calendar/localization/demos/scheduler-localisation-table-no-snap/SchedulerLocalisationTableNoSnap.tsx create mode 100644 docs/data/scheduler/event-calendar/localization/demos/scheduler-localisation-table-no-snap/client.ts create mode 100644 docs/data/scheduler/event-calendar/localization/demos/scheduler-localisation-table-no-snap/index.ts delete mode 100644 docs/data/scheduler/event-calendar/navigation/ApiMethodSetVisibleDate.js delete mode 100644 docs/data/scheduler/event-calendar/navigation/ApiMethodSetVisibleDate.tsx delete mode 100644 docs/data/scheduler/event-calendar/navigation/DefaultVisibleDate.js delete mode 100644 docs/data/scheduler/event-calendar/navigation/DefaultVisibleDate.tsx delete mode 100644 docs/data/scheduler/event-calendar/navigation/DefaultVisibleDate.tsx.preview create mode 100644 docs/data/scheduler/event-calendar/navigation/demos/api-method-set-visible-date/ApiMethodSetVisibleDate.tsx create mode 100644 docs/data/scheduler/event-calendar/navigation/demos/api-method-set-visible-date/client.ts create mode 100644 docs/data/scheduler/event-calendar/navigation/demos/api-method-set-visible-date/index.ts create mode 100644 docs/data/scheduler/event-calendar/navigation/demos/default-visible-date/DefaultVisibleDate.tsx create mode 100644 docs/data/scheduler/event-calendar/navigation/demos/default-visible-date/client.ts create mode 100644 docs/data/scheduler/event-calendar/navigation/demos/default-visible-date/index.ts delete mode 100644 docs/data/scheduler/event-calendar/preferences/DefaultPreferences.js delete mode 100644 docs/data/scheduler/event-calendar/preferences/DefaultPreferences.tsx delete mode 100644 docs/data/scheduler/event-calendar/preferences/DefaultPreferences.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/preferences/PreferencesMenu.js delete mode 100644 docs/data/scheduler/event-calendar/preferences/PreferencesMenu.tsx.preview create mode 100644 docs/data/scheduler/event-calendar/preferences/demos/default-preferences/DefaultPreferences.tsx create mode 100644 docs/data/scheduler/event-calendar/preferences/demos/default-preferences/client.ts create mode 100644 docs/data/scheduler/event-calendar/preferences/demos/default-preferences/index.ts rename docs/data/scheduler/event-calendar/preferences/{ => demos/preferences-menu}/PreferencesMenu.tsx (82%) create mode 100644 docs/data/scheduler/event-calendar/preferences/demos/preferences-menu/client.ts create mode 100644 docs/data/scheduler/event-calendar/preferences/demos/preferences-menu/index.ts delete mode 100644 docs/data/scheduler/event-calendar/resources/ColorPalettes.js delete mode 100644 docs/data/scheduler/event-calendar/resources/ColorPalettes.tsx delete mode 100644 docs/data/scheduler/event-calendar/resources/ColorPalettes.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/resources/DefaultCollapsedResources.js delete mode 100644 docs/data/scheduler/event-calendar/resources/DefaultCollapsedResources.tsx delete mode 100644 docs/data/scheduler/event-calendar/resources/DefaultCollapsedResources.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/resources/DefaultVisibleResources.js delete mode 100644 docs/data/scheduler/event-calendar/resources/DefaultVisibleResources.tsx delete mode 100644 docs/data/scheduler/event-calendar/resources/DefaultVisibleResources.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/resources/MultipleResourcesPerEvent.js delete mode 100644 docs/data/scheduler/event-calendar/resources/MultipleResourcesPerEvent.tsx delete mode 100644 docs/data/scheduler/event-calendar/resources/MultipleResourcesPerEvent.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/resources/NestedResources.js delete mode 100644 docs/data/scheduler/event-calendar/resources/NestedResources.tsx delete mode 100644 docs/data/scheduler/event-calendar/resources/NestedResources.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/resources/TitleProperty.js delete mode 100644 docs/data/scheduler/event-calendar/resources/TitleProperty.tsx delete mode 100644 docs/data/scheduler/event-calendar/resources/TitleProperty.tsx.preview create mode 100644 docs/data/scheduler/event-calendar/resources/demos/color-palettes/ColorPalettes.tsx create mode 100644 docs/data/scheduler/event-calendar/resources/demos/color-palettes/client.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/color-palettes/index.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/default-collapsed-resources/DefaultCollapsedResources.tsx create mode 100644 docs/data/scheduler/event-calendar/resources/demos/default-collapsed-resources/client.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/default-collapsed-resources/index.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/default-visible-resources/DefaultVisibleResources.tsx create mode 100644 docs/data/scheduler/event-calendar/resources/demos/default-visible-resources/client.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/default-visible-resources/index.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/multiple-resources-per-event/MultipleResourcesPerEvent.tsx create mode 100644 docs/data/scheduler/event-calendar/resources/demos/multiple-resources-per-event/client.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/multiple-resources-per-event/index.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/nested-resources/NestedResources.tsx create mode 100644 docs/data/scheduler/event-calendar/resources/demos/nested-resources/client.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/nested-resources/index.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/title-property/TitleProperty.tsx create mode 100644 docs/data/scheduler/event-calendar/resources/demos/title-property/client.ts create mode 100644 docs/data/scheduler/event-calendar/resources/demos/title-property/index.ts delete mode 100644 docs/data/scheduler/event-calendar/responsiveness/ResponsiveTypographyDemo.js rename docs/data/scheduler/event-calendar/responsiveness/{ => demos/responsive-typography-demo}/ResponsiveTypographyDemo.tsx (90%) create mode 100644 docs/data/scheduler/event-calendar/responsiveness/demos/responsive-typography-demo/client.ts create mode 100644 docs/data/scheduler/event-calendar/responsiveness/demos/responsive-typography-demo/index.ts delete mode 100644 docs/data/scheduler/event-calendar/views/AgendaViewDayCount.js delete mode 100644 docs/data/scheduler/event-calendar/views/AgendaViewDayCount.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/BasicAgendaView.js delete mode 100644 docs/data/scheduler/event-calendar/views/BasicAgendaView.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/BasicDayView.js delete mode 100644 docs/data/scheduler/event-calendar/views/BasicDayView.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/BasicMonthView.js delete mode 100644 docs/data/scheduler/event-calendar/views/BasicMonthView.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/BasicWeekView.js delete mode 100644 docs/data/scheduler/event-calendar/views/BasicWeekView.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/DayViewInitialScrollTime.js delete mode 100644 docs/data/scheduler/event-calendar/views/DayViewInitialScrollTime.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/DayViewStartEndTime.js delete mode 100644 docs/data/scheduler/event-calendar/views/DayViewStartEndTime.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/DayViewTimeGridEvents.js delete mode 100644 docs/data/scheduler/event-calendar/views/DefaultView.js delete mode 100644 docs/data/scheduler/event-calendar/views/DefaultView.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/RemoveViews.js delete mode 100644 docs/data/scheduler/event-calendar/views/RemoveViews.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/WeekViewInitialScrollTime.js delete mode 100644 docs/data/scheduler/event-calendar/views/WeekViewInitialScrollTime.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/WeekViewStartEndTime.js delete mode 100644 docs/data/scheduler/event-calendar/views/WeekViewStartEndTime.tsx.preview delete mode 100644 docs/data/scheduler/event-calendar/views/WeekViewTimeGridEvents.js rename docs/data/scheduler/event-calendar/views/{ => demos/agenda-view-day-count}/AgendaViewDayCount.tsx (79%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/agenda-view-day-count/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/agenda-view-day-count/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/basic-agenda-view}/BasicAgendaView.tsx (77%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-agenda-view/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-agenda-view/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/basic-day-view}/BasicDayView.tsx (77%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-day-view/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-day-view/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/basic-month-view}/BasicMonthView.tsx (77%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-month-view/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-month-view/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/basic-week-view}/BasicWeekView.tsx (77%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-week-view/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/basic-week-view/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/day-view-initial-scroll-time}/DayViewInitialScrollTime.tsx (78%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/day-view-initial-scroll-time/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/day-view-initial-scroll-time/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/day-view-start-end-time}/DayViewStartEndTime.tsx (79%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/day-view-start-end-time/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/day-view-start-end-time/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/day-view-time-grid-events}/DayViewTimeGridEvents.tsx (93%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/day-view-time-grid-events/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/day-view-time-grid-events/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/default-view}/DefaultView.tsx (79%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/default-view/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/default-view/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/remove-views}/RemoveViews.tsx (79%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/remove-views/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/remove-views/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/week-view-initial-scroll-time}/WeekViewInitialScrollTime.tsx (80%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/week-view-initial-scroll-time/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/week-view-initial-scroll-time/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/week-view-start-end-time}/WeekViewStartEndTime.tsx (79%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/week-view-start-end-time/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/week-view-start-end-time/index.ts rename docs/data/scheduler/event-calendar/views/{ => demos/week-view-time-grid-events}/WeekViewTimeGridEvents.tsx (94%) create mode 100644 docs/data/scheduler/event-calendar/views/demos/week-view-time-grid-events/client.ts create mode 100644 docs/data/scheduler/event-calendar/views/demos/week-view-time-grid-events/index.ts delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/BasicDragAndDrop.js delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/BasicDragAndDrop.tsx delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/BasicDragAndDrop.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/DisableDragging.js delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/DisableDragging.tsx delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/DisableDragging.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/DisableResizing.js delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/DisableResizing.tsx delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/DisableResizing.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/ExternalDragAndDrop.js delete mode 100644 docs/data/scheduler/event-timeline/drag-interactions/ExternalDragAndDrop.tsx create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/basic-drag-and-drop/BasicDragAndDrop.tsx create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/basic-drag-and-drop/client.ts create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/basic-drag-and-drop/index.ts create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/disable-dragging/DisableDragging.tsx create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/disable-dragging/client.ts create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/disable-dragging/index.ts create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/disable-resizing/DisableResizing.tsx create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/disable-resizing/client.ts create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/disable-resizing/index.ts create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/external-drag-and-drop/ExternalDragAndDrop.tsx create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/external-drag-and-drop/client.ts create mode 100644 docs/data/scheduler/event-timeline/drag-interactions/demos/external-drag-and-drop/index.ts delete mode 100644 docs/data/scheduler/event-timeline/editing/CustomEditingUI.js delete mode 100644 docs/data/scheduler/event-timeline/editing/CustomEditingUI.tsx delete mode 100644 docs/data/scheduler/event-timeline/editing/EventCreationDuration.js delete mode 100644 docs/data/scheduler/event-timeline/editing/EventCreationDuration.tsx delete mode 100644 docs/data/scheduler/event-timeline/editing/EventCreationDuration.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/editing/EventCreationInteraction.js delete mode 100644 docs/data/scheduler/event-timeline/editing/EventCreationInteraction.tsx delete mode 100644 docs/data/scheduler/event-timeline/editing/EventCreationInteraction.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDeletionConfirmation.js delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDeletionConfirmation.tsx delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDeletionConfirmation.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDeletionDisabled.js delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDeletionDisabled.tsx delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDeletionDisabled.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDialog.js delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDialog.tsx delete mode 100644 docs/data/scheduler/event-timeline/editing/EventDialog.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/editing/ReadOnly.js delete mode 100644 docs/data/scheduler/event-timeline/editing/ReadOnly.tsx delete mode 100644 docs/data/scheduler/event-timeline/editing/ReadOnly.tsx.preview create mode 100644 docs/data/scheduler/event-timeline/editing/demos/custom-editing-ui/CustomEditingUI.tsx create mode 100644 docs/data/scheduler/event-timeline/editing/demos/custom-editing-ui/client.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/custom-editing-ui/index.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-creation-duration/EventCreationDuration.tsx create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-creation-duration/client.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-creation-duration/index.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-creation-interaction/EventCreationInteraction.tsx create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-creation-interaction/client.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-creation-interaction/index.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-deletion-confirmation/EventDeletionConfirmation.tsx create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-deletion-confirmation/client.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-deletion-confirmation/index.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-deletion-disabled/EventDeletionDisabled.tsx create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-deletion-disabled/client.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-deletion-disabled/index.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-dialog/EventDialog.tsx create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-dialog/client.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/event-dialog/index.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/read-only/ReadOnly.tsx create mode 100644 docs/data/scheduler/event-timeline/editing/demos/read-only/client.ts create mode 100644 docs/data/scheduler/event-timeline/editing/demos/read-only/index.ts delete mode 100644 docs/data/scheduler/event-timeline/events/AllDay.js delete mode 100644 docs/data/scheduler/event-timeline/events/AllDay.tsx delete mode 100644 docs/data/scheduler/event-timeline/events/AllDay.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/events/ClassNameProperty.js delete mode 100644 docs/data/scheduler/event-timeline/events/ClassNameProperty.tsx delete mode 100644 docs/data/scheduler/event-timeline/events/ColorPalettes.js delete mode 100644 docs/data/scheduler/event-timeline/events/ColorPalettes.tsx delete mode 100644 docs/data/scheduler/event-timeline/events/ColorPalettes.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/events/DynamicResourceProperty.js delete mode 100644 docs/data/scheduler/event-timeline/events/DynamicResourceProperty.tsx delete mode 100644 docs/data/scheduler/event-timeline/events/EventContentSlot.js delete mode 100644 docs/data/scheduler/event-timeline/events/EventContentSlot.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/events/TitleProperty.js delete mode 100644 docs/data/scheduler/event-timeline/events/TitleProperty.tsx delete mode 100644 docs/data/scheduler/event-timeline/events/TitleProperty.tsx.preview create mode 100644 docs/data/scheduler/event-timeline/events/demos/all-day/AllDay.tsx create mode 100644 docs/data/scheduler/event-timeline/events/demos/all-day/client.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/all-day/index.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/class-name-property/ClassNameProperty.tsx create mode 100644 docs/data/scheduler/event-timeline/events/demos/class-name-property/client.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/class-name-property/index.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/color-palettes/ColorPalettes.tsx create mode 100644 docs/data/scheduler/event-timeline/events/demos/color-palettes/client.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/color-palettes/index.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/dynamic-resource-property/DynamicResourceProperty.tsx create mode 100644 docs/data/scheduler/event-timeline/events/demos/dynamic-resource-property/client.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/dynamic-resource-property/index.ts rename docs/data/scheduler/event-timeline/events/{ => demos/event-content-slot}/EventContentSlot.tsx (82%) create mode 100644 docs/data/scheduler/event-timeline/events/demos/event-content-slot/client.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/event-content-slot/index.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/title-property/TitleProperty.tsx create mode 100644 docs/data/scheduler/event-timeline/events/demos/title-property/client.ts create mode 100644 docs/data/scheduler/event-timeline/events/demos/title-property/index.ts delete mode 100644 docs/data/scheduler/event-timeline/lazy-loading/BasicDataSource.js delete mode 100644 docs/data/scheduler/event-timeline/lazy-loading/BasicDataSource.tsx delete mode 100644 docs/data/scheduler/event-timeline/lazy-loading/ErrorHandling.js delete mode 100644 docs/data/scheduler/event-timeline/lazy-loading/ErrorHandling.tsx create mode 100644 docs/data/scheduler/event-timeline/lazy-loading/demos/basic-data-source/BasicDataSource.tsx create mode 100644 docs/data/scheduler/event-timeline/lazy-loading/demos/basic-data-source/client.ts create mode 100644 docs/data/scheduler/event-timeline/lazy-loading/demos/basic-data-source/index.ts create mode 100644 docs/data/scheduler/event-timeline/lazy-loading/demos/error-handling/ErrorHandling.tsx create mode 100644 docs/data/scheduler/event-timeline/lazy-loading/demos/error-handling/client.ts create mode 100644 docs/data/scheduler/event-timeline/lazy-loading/demos/error-handling/index.ts delete mode 100644 docs/data/scheduler/event-timeline/localization/CustomLocaleTextTimeline.js delete mode 100644 docs/data/scheduler/event-timeline/localization/CustomLocaleTextTimeline.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/localization/DateLocaleTimeline.js delete mode 100644 docs/data/scheduler/event-timeline/localization/DateLocaleTimeline.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/localization/LocaleTextTimeline.js delete mode 100644 docs/data/scheduler/event-timeline/localization/LocaleTextTimeline.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/localization/RTLTimeline.js delete mode 100644 docs/data/scheduler/event-timeline/localization/RTLTimeline.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/localization/SchedulerLocalisationTableNoSnap.js rename docs/data/scheduler/event-timeline/localization/{ => demos/custom-locale-text-timeline}/CustomLocaleTextTimeline.tsx (82%) create mode 100644 docs/data/scheduler/event-timeline/localization/demos/custom-locale-text-timeline/client.ts create mode 100644 docs/data/scheduler/event-timeline/localization/demos/custom-locale-text-timeline/index.ts rename docs/data/scheduler/event-timeline/localization/{ => demos/date-locale-timeline}/DateLocaleTimeline.tsx (86%) create mode 100644 docs/data/scheduler/event-timeline/localization/demos/date-locale-timeline/client.ts create mode 100644 docs/data/scheduler/event-timeline/localization/demos/date-locale-timeline/index.ts rename docs/data/scheduler/event-timeline/localization/{ => demos/locale-text-timeline}/LocaleTextTimeline.tsx (86%) create mode 100644 docs/data/scheduler/event-timeline/localization/demos/locale-text-timeline/client.ts create mode 100644 docs/data/scheduler/event-timeline/localization/demos/locale-text-timeline/index.ts rename docs/data/scheduler/event-timeline/localization/{ => demos/rtl-timeline}/RTLTimeline.tsx (96%) create mode 100644 docs/data/scheduler/event-timeline/localization/demos/rtl-timeline/client.ts create mode 100644 docs/data/scheduler/event-timeline/localization/demos/rtl-timeline/index.ts create mode 100644 docs/data/scheduler/event-timeline/localization/demos/scheduler-localisation-table-no-snap/SchedulerLocalisationTableNoSnap.tsx create mode 100644 docs/data/scheduler/event-timeline/localization/demos/scheduler-localisation-table-no-snap/client.ts create mode 100644 docs/data/scheduler/event-timeline/localization/demos/scheduler-localisation-table-no-snap/index.ts delete mode 100644 docs/data/scheduler/event-timeline/navigation/ApiMethodSetVisibleDate.js delete mode 100644 docs/data/scheduler/event-timeline/navigation/ApiMethodSetVisibleDate.tsx delete mode 100644 docs/data/scheduler/event-timeline/navigation/DefaultVisibleDate.js delete mode 100644 docs/data/scheduler/event-timeline/navigation/DefaultVisibleDate.tsx delete mode 100644 docs/data/scheduler/event-timeline/navigation/DefaultVisibleDate.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/navigation/ExternalNavigation.js create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/api-method-set-visible-date/ApiMethodSetVisibleDate.tsx create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/api-method-set-visible-date/client.ts create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/api-method-set-visible-date/index.ts create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/default-visible-date/DefaultVisibleDate.tsx create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/default-visible-date/client.ts create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/default-visible-date/index.ts rename docs/data/scheduler/event-timeline/navigation/{ => demos/external-navigation}/ExternalNavigation.tsx (90%) create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/external-navigation/client.ts create mode 100644 docs/data/scheduler/event-timeline/navigation/demos/external-navigation/index.ts delete mode 100644 docs/data/scheduler/event-timeline/preferences/DefaultPreferences.js delete mode 100644 docs/data/scheduler/event-timeline/preferences/DefaultPreferences.tsx delete mode 100644 docs/data/scheduler/event-timeline/preferences/DefaultPreferences.tsx.preview create mode 100644 docs/data/scheduler/event-timeline/preferences/demos/default-preferences/DefaultPreferences.tsx create mode 100644 docs/data/scheduler/event-timeline/preferences/demos/default-preferences/client.ts create mode 100644 docs/data/scheduler/event-timeline/preferences/demos/default-preferences/index.ts delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndHourPreset.js delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndHourPreset.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndHourStartEndTime.js delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndHourStartEndTime.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndMonthPreset.js delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndMonthPreset.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndWeekPreset.js delete mode 100644 docs/data/scheduler/event-timeline/presets/DayAndWeekPreset.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/presets/MonthAndYearPreset.js delete mode 100644 docs/data/scheduler/event-timeline/presets/MonthAndYearPreset.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/presets/YearPreset.js delete mode 100644 docs/data/scheduler/event-timeline/presets/YearPreset.tsx.preview rename docs/data/scheduler/event-timeline/presets/{ => demos/day-and-hour-preset}/DayAndHourPreset.tsx (81%) create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-hour-preset/client.ts create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-hour-preset/index.ts rename docs/data/scheduler/event-timeline/presets/{ => demos/day-and-hour-start-end-time}/DayAndHourStartEndTime.tsx (82%) create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-hour-start-end-time/client.ts create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-hour-start-end-time/index.ts rename docs/data/scheduler/event-timeline/presets/{ => demos/day-and-month-preset}/DayAndMonthPreset.tsx (80%) create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-month-preset/client.ts create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-month-preset/index.ts rename docs/data/scheduler/event-timeline/presets/{ => demos/day-and-week-preset}/DayAndWeekPreset.tsx (80%) create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-week-preset/client.ts create mode 100644 docs/data/scheduler/event-timeline/presets/demos/day-and-week-preset/index.ts rename docs/data/scheduler/event-timeline/presets/{ => demos/month-and-year-preset}/MonthAndYearPreset.tsx (81%) create mode 100644 docs/data/scheduler/event-timeline/presets/demos/month-and-year-preset/client.ts create mode 100644 docs/data/scheduler/event-timeline/presets/demos/month-and-year-preset/index.ts rename docs/data/scheduler/event-timeline/presets/{ => demos/year-preset}/YearPreset.tsx (80%) create mode 100644 docs/data/scheduler/event-timeline/presets/demos/year-preset/client.ts create mode 100644 docs/data/scheduler/event-timeline/presets/demos/year-preset/index.ts delete mode 100644 docs/data/scheduler/event-timeline/resources/ColorPalettes.js delete mode 100644 docs/data/scheduler/event-timeline/resources/ColorPalettes.tsx delete mode 100644 docs/data/scheduler/event-timeline/resources/ColorPalettes.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/resources/DefaultCollapsedResources.js delete mode 100644 docs/data/scheduler/event-timeline/resources/DefaultCollapsedResources.tsx delete mode 100644 docs/data/scheduler/event-timeline/resources/DefaultCollapsedResources.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/resources/DefaultVisibleResources.js delete mode 100644 docs/data/scheduler/event-timeline/resources/DefaultVisibleResources.tsx delete mode 100644 docs/data/scheduler/event-timeline/resources/DefaultVisibleResources.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/resources/MultipleResourcesPerEvent.js delete mode 100644 docs/data/scheduler/event-timeline/resources/MultipleResourcesPerEvent.tsx delete mode 100644 docs/data/scheduler/event-timeline/resources/MultipleResourcesPerEvent.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/resources/NestedResources.js delete mode 100644 docs/data/scheduler/event-timeline/resources/NestedResources.tsx delete mode 100644 docs/data/scheduler/event-timeline/resources/NestedResources.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/resources/ResourceColumnLabel.js delete mode 100644 docs/data/scheduler/event-timeline/resources/ResourceColumnLabel.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/resources/ResourceTitleSlot.js delete mode 100644 docs/data/scheduler/event-timeline/resources/ResourceTitleSlot.tsx.preview delete mode 100644 docs/data/scheduler/event-timeline/resources/TitleProperty.js delete mode 100644 docs/data/scheduler/event-timeline/resources/TitleProperty.tsx delete mode 100644 docs/data/scheduler/event-timeline/resources/TitleProperty.tsx.preview create mode 100644 docs/data/scheduler/event-timeline/resources/demos/color-palettes/ColorPalettes.tsx create mode 100644 docs/data/scheduler/event-timeline/resources/demos/color-palettes/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/color-palettes/index.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/default-collapsed-resources/DefaultCollapsedResources.tsx create mode 100644 docs/data/scheduler/event-timeline/resources/demos/default-collapsed-resources/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/default-collapsed-resources/index.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/default-visible-resources/DefaultVisibleResources.tsx create mode 100644 docs/data/scheduler/event-timeline/resources/demos/default-visible-resources/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/default-visible-resources/index.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/multiple-resources-per-event/MultipleResourcesPerEvent.tsx create mode 100644 docs/data/scheduler/event-timeline/resources/demos/multiple-resources-per-event/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/multiple-resources-per-event/index.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/nested-resources/NestedResources.tsx create mode 100644 docs/data/scheduler/event-timeline/resources/demos/nested-resources/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/nested-resources/index.ts rename docs/data/scheduler/event-timeline/resources/{ => demos/resource-column-label}/ResourceColumnLabel.tsx (80%) create mode 100644 docs/data/scheduler/event-timeline/resources/demos/resource-column-label/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/resource-column-label/index.ts rename docs/data/scheduler/event-timeline/resources/{ => demos/resource-title-slot}/ResourceTitleSlot.tsx (86%) create mode 100644 docs/data/scheduler/event-timeline/resources/demos/resource-title-slot/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/resource-title-slot/index.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/title-property/TitleProperty.tsx create mode 100644 docs/data/scheduler/event-timeline/resources/demos/title-property/client.ts create mode 100644 docs/data/scheduler/event-timeline/resources/demos/title-property/index.ts delete mode 100644 docs/data/scheduler/quickstart/RenderEventCalendar.js delete mode 100644 docs/data/scheduler/quickstart/RenderEventCalendar.tsx.preview delete mode 100644 docs/data/scheduler/quickstart/RenderEventTimelinePremium.js delete mode 100644 docs/data/scheduler/quickstart/RenderEventTimelinePremium.tsx.preview rename docs/data/scheduler/quickstart/{ => demos/render-event-calendar}/RenderEventCalendar.tsx (88%) create mode 100644 docs/data/scheduler/quickstart/demos/render-event-calendar/client.ts create mode 100644 docs/data/scheduler/quickstart/demos/render-event-calendar/index.ts rename docs/data/scheduler/quickstart/{ => demos/render-event-timeline-premium}/RenderEventTimelinePremium.tsx (88%) create mode 100644 docs/data/scheduler/quickstart/demos/render-event-timeline-premium/client.ts create mode 100644 docs/data/scheduler/quickstart/demos/render-event-timeline-premium/index.ts delete mode 100644 docs/data/scheduler/recurring-events/RecurringEventsDataset.js delete mode 100644 docs/data/scheduler/recurring-events/RecurringEventsDataset.tsx.preview rename docs/data/scheduler/recurring-events/{ => demos/recurring-events-dataset}/RecurringEventsDataset.tsx (81%) create mode 100644 docs/data/scheduler/recurring-events/demos/recurring-events-dataset/client.ts create mode 100644 docs/data/scheduler/recurring-events/demos/recurring-events-dataset/index.ts delete mode 100644 docs/data/scheduler/timezone/TimezoneDatasetWallTime.js delete mode 100644 docs/data/scheduler/timezone/TimezoneDatasetWallTime.tsx.preview delete mode 100644 docs/data/scheduler/timezone/TimezoneInstantBased.js delete mode 100644 docs/data/scheduler/timezone/TimezoneInstantBased.tsx.preview delete mode 100644 docs/data/scheduler/timezone/TimezoneRecurringEvents.js delete mode 100644 docs/data/scheduler/timezone/TimezoneRecurringEvents.tsx.preview rename docs/data/scheduler/timezone/{ => demos/timezone-dataset-wall-time}/TimezoneDatasetWallTime.tsx (86%) create mode 100644 docs/data/scheduler/timezone/demos/timezone-dataset-wall-time/client.ts create mode 100644 docs/data/scheduler/timezone/demos/timezone-dataset-wall-time/index.ts rename docs/data/scheduler/timezone/{ => demos/timezone-instant-based}/TimezoneInstantBased.tsx (85%) create mode 100644 docs/data/scheduler/timezone/demos/timezone-instant-based/client.ts create mode 100644 docs/data/scheduler/timezone/demos/timezone-instant-based/index.ts rename docs/data/scheduler/timezone/{ => demos/timezone-recurring-events}/TimezoneRecurringEvents.tsx (88%) create mode 100644 docs/data/scheduler/timezone/demos/timezone-recurring-events/client.ts create mode 100644 docs/data/scheduler/timezone/demos/timezone-recurring-events/index.ts delete mode 100644 docs/data/tree-view/quickstart/BasicRichTreeView.js delete mode 100644 docs/data/tree-view/quickstart/BasicRichTreeView.tsx delete mode 100644 docs/data/tree-view/quickstart/BasicRichTreeView.tsx.preview delete mode 100644 docs/data/tree-view/quickstart/BasicRichTreeViewPro.js delete mode 100644 docs/data/tree-view/quickstart/BasicRichTreeViewPro.tsx.preview delete mode 100644 docs/data/tree-view/quickstart/BasicSimpleTreeView.js delete mode 100644 docs/data/tree-view/quickstart/BasicSimpleTreeView.tsx rename docs/data/tree-view/quickstart/{ => demos/basic-rich-tree-view-pro}/BasicRichTreeViewPro.tsx (77%) create mode 100644 docs/data/tree-view/quickstart/demos/basic-rich-tree-view-pro/client.ts create mode 100644 docs/data/tree-view/quickstart/demos/basic-rich-tree-view-pro/index.ts create mode 100644 docs/data/tree-view/quickstart/demos/basic-rich-tree-view/BasicRichTreeView.tsx create mode 100644 docs/data/tree-view/quickstart/demos/basic-rich-tree-view/client.ts create mode 100644 docs/data/tree-view/quickstart/demos/basic-rich-tree-view/index.ts create mode 100644 docs/data/tree-view/quickstart/demos/basic-simple-tree-view/BasicSimpleTreeView.tsx create mode 100644 docs/data/tree-view/quickstart/demos/basic-simple-tree-view/client.ts create mode 100644 docs/data/tree-view/quickstart/demos/basic-simple-tree-view/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomAnimation.js delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomIcons.js delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomStyling.js delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomStylingRichTreeViewPro.js delete mode 100644 docs/data/tree-view/rich-tree-view/customization/CustomStylingRichTreeViewPro.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/customization/FileExplorer.js delete mode 100644 docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.js delete mode 100644 docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/customization/StickyHeaders.js delete mode 100644 docs/data/tree-view/rich-tree-view/customization/StickyHeaders.tsx.preview create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-animation/CustomAnimation.tsx create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-animation/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-animation/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-icons/CustomIcons.tsx create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-icons/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-icons/index.ts rename docs/data/tree-view/rich-tree-view/customization/{ => demos/custom-styling-rich-tree-view-pro}/CustomStylingRichTreeViewPro.tsx (95%) create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-styling-rich-tree-view-pro/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-styling-rich-tree-view-pro/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-styling/CustomStyling.tsx create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-styling/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/custom-styling/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/file-explorer/FileExplorer.tsx create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/file-explorer/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/file-explorer/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/headless-api/HeadlessAPI.tsx create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/headless-api/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/headless-api/index.ts rename docs/data/tree-view/rich-tree-view/customization/{ => demos/sticky-headers}/StickyHeaders.tsx (91%) create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/sticky-headers/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/customization/demos/sticky-headers/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/editing/ApiMethodSetEditedItem.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/ApiMethodSetEditedItem.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/ApiMethodUpdateItemLabel.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/ApiMethodUpdateItemLabel.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/CustomBehavior.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/CustomBehavior.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/CustomLabelInput.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/CustomLabelInput.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/EditLeaves.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/EditLeaves.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/EditWithIcons.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/EditWithIcons.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/EditingCallback.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/EditingCallback.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/LabelEditingAllItems.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/LabelEditingAllItems.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/LabelEditingSomeItems.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/LabelEditingSomeItems.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/editing/Validation.js delete mode 100644 docs/data/tree-view/rich-tree-view/editing/Validation.tsx.preview rename docs/data/tree-view/rich-tree-view/editing/{ => demos/api-method-set-edited-item}/ApiMethodSetEditedItem.tsx (96%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/api-method-set-edited-item/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/api-method-set-edited-item/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/api-method-update-item-label}/ApiMethodUpdateItemLabel.tsx (90%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/api-method-update-item-label/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/api-method-update-item-label/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/custom-behavior}/CustomBehavior.tsx (76%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/custom-behavior/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/custom-behavior/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/custom-label-input}/CustomLabelInput.tsx (95%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/custom-label-input/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/custom-label-input/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/edit-leaves}/EditLeaves.tsx (84%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/edit-leaves/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/edit-leaves/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/edit-with-icons}/EditWithIcons.tsx (93%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/edit-with-icons/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/edit-with-icons/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/editing-callback}/EditingCallback.tsx (90%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/editing-callback/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/editing-callback/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/label-editing-all-items}/LabelEditingAllItems.tsx (75%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/label-editing-all-items/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/label-editing-all-items/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/label-editing-some-items}/LabelEditingSomeItems.tsx (76%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/label-editing-some-items/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/label-editing-some-items/index.ts rename docs/data/tree-view/rich-tree-view/editing/{ => demos/validation}/Validation.tsx (90%) create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/validation/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/editing/demos/validation/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ApiMethodIsItemExpanded.js delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ApiMethodIsItemExpanded.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ApiMethodIsItemExpanded.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.js delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.js delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/IconExpansionTreeView.js delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/IconExpansionTreeView.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/IconExpansionTreeView.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.js delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx.preview create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/api-method-is-item-expanded/ApiMethodIsItemExpanded.tsx create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/api-method-is-item-expanded/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/api-method-is-item-expanded/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/api-method-set-item-expansion/ApiMethodSetItemExpansion.tsx create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/api-method-set-item-expansion/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/api-method-set-item-expansion/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/controlled-expansion/ControlledExpansion.tsx create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/controlled-expansion/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/controlled-expansion/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/icon-expansion-tree-view/IconExpansionTreeView.tsx create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/icon-expansion-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/icon-expansion-tree-view/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/track-item-expansion-toggle/TrackItemExpansionToggle.tsx create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/track-item-expansion-toggle/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/expansion/demos/track-item-expansion-toggle/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.js delete mode 100644 docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx.preview create mode 100644 docs/data/tree-view/rich-tree-view/focus/demos/api-method-focus-item/ApiMethodFocusItem.tsx create mode 100644 docs/data/tree-view/rich-tree-view/focus/demos/api-method-focus-item/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/focus/demos/api-method-focus-item/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodAddItems.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItemDOMElement.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItemDOMElement.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItemDOMElement.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItemOrderedChildrenIds.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItemOrderedChildrenIds.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItemTree.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/ApiMethodGetItemTree.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/DisableTreeItemPublicAPI.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/DisableTreeItemPublicAPI.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/items/DisabledPropItem.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/DisabledPropItem.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/items/DisabledPropItem.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetItemChildren.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetItemChildren.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetItemId.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetItemId.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetItemLabel.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetItemLabel.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetParentIdPublicAPI.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/GetParentIdPublicAPI.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/ItemHeight.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/ItemHeight.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/items/ItemHeight.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/LoadingCustomIndicator.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/LoadingCustomIndicator.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/LoadingCustomRows.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/LoadingCustomRows.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/LoadingRichTreeView.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/LoadingRichTreeView.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/OnItemClick.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/OnItemClick.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/items/OnItemClick.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/items/RootElementRef.js delete mode 100644 docs/data/tree-view/rich-tree-view/items/RootElementRef.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/items/RootElementRef.tsx.preview rename docs/data/tree-view/rich-tree-view/items/{ => demos/api-method-add-items}/ApiMethodAddItems.tsx (93%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-add-items/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-add-items/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item-dom-element/ApiMethodGetItemDOMElement.tsx create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item-dom-element/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item-dom-element/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/api-method-get-item-ordered-children-ids}/ApiMethodGetItemOrderedChildrenIds.tsx (92%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item-ordered-children-ids/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item-ordered-children-ids/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/api-method-get-item-tree}/ApiMethodGetItemTree.tsx (91%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item-tree/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item-tree/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/api-method-get-item}/ApiMethodGetItem.tsx (86%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/api-method-get-item/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/basic-rich-tree-view/BasicRichTreeView.tsx create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/basic-rich-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/basic-rich-tree-view/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/disable-tree-item-public-api}/DisableTreeItemPublicAPI.tsx (85%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disable-tree-item-public-api/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disable-tree-item-public-api/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disabled-items-focusable/DisabledItemsFocusable.tsx create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disabled-items-focusable/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disabled-items-focusable/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disabled-prop-item/DisabledPropItem.tsx create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disabled-prop-item/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/disabled-prop-item/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/get-item-children}/GetItemChildren.tsx (92%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-item-children/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-item-children/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/get-item-id}/GetItemId.tsx (98%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-item-id/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-item-id/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/get-item-label}/GetItemLabel.tsx (98%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-item-label/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-item-label/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/get-parent-id-public-api}/GetParentIdPublicAPI.tsx (91%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-parent-id-public-api/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/get-parent-id-public-api/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/item-height/ItemHeight.tsx create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/item-height/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/item-height/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/loading-custom-indicator}/LoadingCustomIndicator.tsx (95%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/loading-custom-indicator/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/loading-custom-indicator/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/loading-custom-rows}/LoadingCustomRows.tsx (84%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/loading-custom-rows/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/loading-custom-rows/index.ts rename docs/data/tree-view/rich-tree-view/items/{ => demos/loading-rich-tree-view}/LoadingRichTreeView.tsx (87%) create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/loading-rich-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/loading-rich-tree-view/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/on-item-click/OnItemClick.tsx create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/on-item-click/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/on-item-click/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/root-element-ref/RootElementRef.tsx create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/root-element-ref/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/items/demos/root-element-ref/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ApiMethodUpdateItemChildren.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ApiMethodUpdateItemChildren.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/AutoExpandLazyLoadedItems.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/BasicLazyLoading.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ChildrenLoadingRows.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ChildrenLoadingRows.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/CustomizedLazyLoading.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/CustomizedLazyLoading.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ErrorManagement.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ErrorManagement.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/FetchingWithReactQuery.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/FetchingWithReactQuery.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LazyLoadingAndAddingItems.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LazyLoadingAndAddingItems.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LazyLoadingAndLabelEditing.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LazyLoadingAndLabelEditing.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LazyLoadingInitialState.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LazyLoadingInitialState.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LowTTLCache.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/LowTTLCache.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ReactQueryCache.js delete mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/ReactQueryCache.tsx.preview rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/api-method-update-item-children}/ApiMethodUpdateItemChildren.tsx (94%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/api-method-update-item-children/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/api-method-update-item-children/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/auto-expand-lazy-loaded-items}/AutoExpandLazyLoadedItems.tsx (98%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/auto-expand-lazy-loaded-items/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/auto-expand-lazy-loaded-items/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/basic-lazy-loading}/BasicLazyLoading.tsx (97%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/basic-lazy-loading/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/basic-lazy-loading/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/children-loading-rows}/ChildrenLoadingRows.tsx (95%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/children-loading-rows/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/children-loading-rows/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/customized-lazy-loading}/CustomizedLazyLoading.tsx (95%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/customized-lazy-loading/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/customized-lazy-loading/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/error-management}/ErrorManagement.tsx (91%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/error-management/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/error-management/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/fetching-with-react-query}/FetchingWithReactQuery.tsx (97%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/fetching-with-react-query/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/fetching-with-react-query/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/lazy-loading-and-adding-items}/LazyLoadingAndAddingItems.tsx (96%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/lazy-loading-and-adding-items/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/lazy-loading-and-adding-items/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/lazy-loading-and-label-editing}/LazyLoadingAndLabelEditing.tsx (94%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/lazy-loading-and-label-editing/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/lazy-loading-and-label-editing/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/lazy-loading-initial-state}/LazyLoadingInitialState.tsx (85%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/lazy-loading-initial-state/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/lazy-loading-initial-state/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/low-ttl-cache}/LowTTLCache.tsx (95%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/low-ttl-cache/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/low-ttl-cache/index.ts rename docs/data/tree-view/rich-tree-view/lazy-loading/{ => demos/react-query-cache}/ReactQueryCache.tsx (93%) create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/react-query-cache/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/lazy-loading/demos/react-query-cache/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/CanMoveItemByType.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/CanMoveItemByType.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/DragAndDrop.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/DragAndDrop.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/FileExplorer.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/FileExplorer.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/OnItemPositionChange.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/OnlyReorderFromDragHandle.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/OnlyReorderFromDragHandle.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/OnlyReorderInSameParent.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/OnlyReorderInSameParent.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/OnlyReorderLeaves.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/OnlyReorderLeaves.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/SendAllItemsToServer.js delete mode 100644 docs/data/tree-view/rich-tree-view/ordering/SendAllItemsToServer.tsx.preview rename docs/data/tree-view/rich-tree-view/ordering/{ => demos/can-move-item-by-type}/CanMoveItemByType.tsx (96%) create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/can-move-item-by-type/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/can-move-item-by-type/index.ts rename docs/data/tree-view/rich-tree-view/ordering/{ => demos/drag-and-drop}/DragAndDrop.tsx (75%) create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/drag-and-drop/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/drag-and-drop/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/file-explorer/FileExplorer.tsx create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/file-explorer/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/file-explorer/index.ts rename docs/data/tree-view/rich-tree-view/ordering/{ => demos/on-item-position-change}/OnItemPositionChange.tsx (82%) create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/on-item-position-change/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/on-item-position-change/index.ts rename docs/data/tree-view/rich-tree-view/ordering/{ => demos/only-reorder-from-drag-handle}/OnlyReorderFromDragHandle.tsx (91%) create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/only-reorder-from-drag-handle/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/only-reorder-from-drag-handle/index.ts rename docs/data/tree-view/rich-tree-view/ordering/{ => demos/only-reorder-in-same-parent}/OnlyReorderInSameParent.tsx (81%) create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/only-reorder-in-same-parent/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/only-reorder-in-same-parent/index.ts rename docs/data/tree-view/rich-tree-view/ordering/{ => demos/only-reorder-leaves}/OnlyReorderLeaves.tsx (85%) create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/only-reorder-leaves/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/only-reorder-leaves/index.ts rename docs/data/tree-view/rich-tree-view/ordering/{ => demos/send-all-items-to-server}/SendAllItemsToServer.tsx (89%) create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/send-all-items-to-server/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/ordering/demos/send-all-items-to-server/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodGetItemSelection.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodGetItemSelection.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodSetItemSelection.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodSetItemSelection.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodSetItemSelection.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodSetItemSelectionKeepExistingSelection.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodSetItemSelectionKeepExistingSelection.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ApiMethodSetItemSelectionKeepExistingSelection.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ControlledSelection.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/DisableSelection.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/DisableSelection.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/DisableSelection.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectableItems.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectableItems.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectableItems.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectionPropagation.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectionPropagationDisabled.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectionPropagationDisabled.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectionPropagationMount.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SelectionPropagationMount.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.js delete mode 100644 docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx delete mode 100644 docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx.preview create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-get-item-selection/ApiMethodGetItemSelection.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-get-item-selection/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-get-item-selection/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-set-item-selection-keep-existing-selection/ApiMethodSetItemSelectionKeepExistingSelection.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-set-item-selection-keep-existing-selection/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-set-item-selection-keep-existing-selection/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-set-item-selection/ApiMethodSetItemSelection.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-set-item-selection/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/api-method-set-item-selection/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/checkbox-multi-selection/CheckboxMultiSelection.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/checkbox-multi-selection/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/checkbox-multi-selection/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/checkbox-selection/CheckboxSelection.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/checkbox-selection/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/checkbox-selection/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/controlled-selection/ControlledSelection.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/controlled-selection/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/controlled-selection/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/disable-selection/DisableSelection.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/disable-selection/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/disable-selection/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/multi-select-tree-view/MultiSelectTreeView.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/multi-select-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/multi-select-tree-view/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selectable-items/SelectableItems.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selectable-items/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selectable-items/index.ts rename docs/data/tree-view/rich-tree-view/selection/{ => demos/selection-propagation-disabled}/SelectionPropagationDisabled.tsx (89%) create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selection-propagation-disabled/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selection-propagation-disabled/index.ts rename docs/data/tree-view/rich-tree-view/selection/{ => demos/selection-propagation-mount}/SelectionPropagationMount.tsx (91%) create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selection-propagation-mount/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selection-propagation-mount/index.ts rename docs/data/tree-view/rich-tree-view/selection/{ => demos/selection-propagation}/SelectionPropagation.tsx (90%) create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selection-propagation/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/selection-propagation/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/single-select-tree-view/SingleSelectTreeView.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/single-select-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/single-select-tree-view/index.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/track-item-selection-toggle/TrackItemSelectionToggle.tsx create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/track-item-selection-toggle/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/selection/demos/track-item-selection-toggle/index.ts delete mode 100644 docs/data/tree-view/rich-tree-view/virtualization/BasicVirtualizedRichTreeViewPro.js delete mode 100644 docs/data/tree-view/rich-tree-view/virtualization/BasicVirtualizedRichTreeViewPro.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/virtualization/FixedSizeRichTreeView.js delete mode 100644 docs/data/tree-view/rich-tree-view/virtualization/FixedSizeRichTreeView.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/virtualization/FlexRichTreeView.js delete mode 100644 docs/data/tree-view/rich-tree-view/virtualization/FlexRichTreeView.tsx.preview delete mode 100644 docs/data/tree-view/rich-tree-view/virtualization/MinMaxHeightRichTreeView.js rename docs/data/tree-view/rich-tree-view/virtualization/{ => demos/basic-virtualized-rich-tree-view-pro}/BasicVirtualizedRichTreeViewPro.tsx (89%) create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/basic-virtualized-rich-tree-view-pro/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/basic-virtualized-rich-tree-view-pro/index.ts rename docs/data/tree-view/rich-tree-view/virtualization/{ => demos/fixed-size-rich-tree-view}/FixedSizeRichTreeView.tsx (77%) create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/fixed-size-rich-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/fixed-size-rich-tree-view/index.ts rename docs/data/tree-view/rich-tree-view/virtualization/{ => demos/flex-rich-tree-view}/FlexRichTreeView.tsx (89%) create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/flex-rich-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/flex-rich-tree-view/index.ts rename docs/data/tree-view/rich-tree-view/virtualization/{ => demos/min-max-height-rich-tree-view}/MinMaxHeightRichTreeView.tsx (95%) create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/min-max-height-rich-tree-view/client.ts create mode 100644 docs/data/tree-view/rich-tree-view/virtualization/demos/min-max-height-rich-tree-view/index.ts delete mode 100644 docs/data/tree-view/simple-tree-view/customization/BorderedTreeView.js delete mode 100644 docs/data/tree-view/simple-tree-view/customization/CustomAnimation.js delete mode 100644 docs/data/tree-view/simple-tree-view/customization/CustomAnimation.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/customization/CustomIcons.js delete mode 100644 docs/data/tree-view/simple-tree-view/customization/CustomIcons.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/customization/CustomStyling.js delete mode 100644 docs/data/tree-view/simple-tree-view/customization/CustomStyling.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/customization/GmailTreeView.js delete mode 100644 docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.js delete mode 100644 docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx.preview rename docs/data/tree-view/simple-tree-view/customization/{ => demos/bordered-tree-view}/BorderedTreeView.tsx (98%) create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/bordered-tree-view/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/bordered-tree-view/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-animation/CustomAnimation.tsx create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-animation/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-animation/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-icons/CustomIcons.tsx create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-icons/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-icons/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-styling/CustomStyling.tsx create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-styling/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/custom-styling/index.ts rename docs/data/tree-view/simple-tree-view/customization/{ => demos/gmail-tree-view}/GmailTreeView.tsx (96%) create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/gmail-tree-view/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/gmail-tree-view/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/headless-api/HeadlessAPI.tsx create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/headless-api/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/customization/demos/headless-api/index.ts delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/ApiMethodIsItemExpanded.js delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/ApiMethodIsItemExpanded.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.js delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.js delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/IconExpansionTreeView.js delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/IconExpansionTreeView.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.js delete mode 100644 docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.tsx create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/api-method-is-item-expanded/ApiMethodIsItemExpanded.tsx create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/api-method-is-item-expanded/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/api-method-is-item-expanded/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/api-method-set-item-expansion/ApiMethodSetItemExpansion.tsx create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/api-method-set-item-expansion/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/api-method-set-item-expansion/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/controlled-expansion/ControlledExpansion.tsx create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/controlled-expansion/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/controlled-expansion/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/icon-expansion-tree-view/IconExpansionTreeView.tsx create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/icon-expansion-tree-view/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/icon-expansion-tree-view/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/track-item-expansion-toggle/TrackItemExpansionToggle.tsx create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/track-item-expansion-toggle/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/expansion/demos/track-item-expansion-toggle/index.ts delete mode 100644 docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.js delete mode 100644 docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.tsx create mode 100644 docs/data/tree-view/simple-tree-view/focus/demos/api-method-focus-item/ApiMethodFocusItem.tsx create mode 100644 docs/data/tree-view/simple-tree-view/focus/demos/api-method-focus-item/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/focus/demos/api-method-focus-item/index.ts delete mode 100644 docs/data/tree-view/simple-tree-view/items/ApiMethodGetItemDOMElement.js delete mode 100644 docs/data/tree-view/simple-tree-view/items/ApiMethodGetItemDOMElement.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.js delete mode 100644 docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.js delete mode 100644 docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.js delete mode 100644 docs/data/tree-view/simple-tree-view/items/ItemHeight.js delete mode 100644 docs/data/tree-view/simple-tree-view/items/ItemHeight.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/items/OnItemClick.js delete mode 100644 docs/data/tree-view/simple-tree-view/items/OnItemClick.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/items/RootElementRef.js delete mode 100644 docs/data/tree-view/simple-tree-view/items/RootElementRef.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/items/RootElementRef.tsx.preview create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/api-method-get-item-dom-element/ApiMethodGetItemDOMElement.tsx create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/api-method-get-item-dom-element/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/api-method-get-item-dom-element/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/basic-simple-tree-view/BasicSimpleTreeView.tsx create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/basic-simple-tree-view/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/basic-simple-tree-view/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/disabled-items-focusable/DisabledItemsFocusable.tsx create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/disabled-items-focusable/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/disabled-items-focusable/index.ts rename docs/data/tree-view/simple-tree-view/items/{ => demos/disabled-jsx-item}/DisabledJSXItem.tsx (95%) create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/disabled-jsx-item/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/disabled-jsx-item/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/item-height/ItemHeight.tsx create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/item-height/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/item-height/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/on-item-click/OnItemClick.tsx create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/on-item-click/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/on-item-click/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/root-element-ref/RootElementRef.tsx create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/root-element-ref/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/items/demos/root-element-ref/index.ts delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ApiMethodGetItemSelection.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ApiMethodGetItemSelection.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ApiMethodSetItemSelection.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ApiMethodSetItemSelection.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ApiMethodSetItemSelectionKeepExistingSelection.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ApiMethodSetItemSelectionKeepExistingSelection.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ControlledSelection.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/ControlledSelection.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/DisableSelection.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/DisableSelection.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/SelectableItems.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/SelectableItems.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.tsx delete mode 100644 docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.js delete mode 100644 docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-get-item-selection/ApiMethodGetItemSelection.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-get-item-selection/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-get-item-selection/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-set-item-selection-keep-existing-selection/ApiMethodSetItemSelectionKeepExistingSelection.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-set-item-selection-keep-existing-selection/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-set-item-selection-keep-existing-selection/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-set-item-selection/ApiMethodSetItemSelection.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-set-item-selection/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/api-method-set-item-selection/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/checkbox-multi-selection/CheckboxMultiSelection.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/checkbox-multi-selection/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/checkbox-multi-selection/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/checkbox-selection/CheckboxSelection.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/checkbox-selection/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/checkbox-selection/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/controlled-selection/ControlledSelection.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/controlled-selection/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/controlled-selection/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/disable-selection/DisableSelection.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/disable-selection/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/disable-selection/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/multi-select-tree-view/MultiSelectTreeView.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/multi-select-tree-view/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/multi-select-tree-view/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/selectable-items/SelectableItems.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/selectable-items/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/selectable-items/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/single-select-tree-view/SingleSelectTreeView.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/single-select-tree-view/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/single-select-tree-view/index.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/track-item-selection-toggle/TrackItemSelectionToggle.tsx create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/track-item-selection-toggle/client.ts create mode 100644 docs/data/tree-view/simple-tree-view/selection/demos/track-item-selection-toggle/index.ts delete mode 100644 docs/data/tree-view/tree-item-customization/CheckboxSlot.js delete mode 100644 docs/data/tree-view/tree-item-customization/CheckboxSlot.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/CheckboxSlotProps.js delete mode 100644 docs/data/tree-view/tree-item-customization/CheckboxSlotProps.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/ContentSlot.js delete mode 100644 docs/data/tree-view/tree-item-customization/ContentSlot.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/ContentSlotProps.js delete mode 100644 docs/data/tree-view/tree-item-customization/ContentSlotProps.tsx delete mode 100644 docs/data/tree-view/tree-item-customization/ContentSlotProps.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/HandleCheckboxSelectionDemo.js delete mode 100644 docs/data/tree-view/tree-item-customization/HandleCheckboxSelectionDemo.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/HandleExpansionDemo.js delete mode 100644 docs/data/tree-view/tree-item-customization/HandleExpansionDemo.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/HandleSelectionDemo.js delete mode 100644 docs/data/tree-view/tree-item-customization/HandleSelectionDemo.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.js delete mode 100644 docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/LabelSlot.js delete mode 100644 docs/data/tree-view/tree-item-customization/LabelSlot.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/LabelSlotProps.js delete mode 100644 docs/data/tree-view/tree-item-customization/LabelSlotProps.tsx delete mode 100644 docs/data/tree-view/tree-item-customization/LabelSlotProps.tsx.preview rename docs/data/tree-view/tree-item-customization/{ => demos/checkbox-slot-props}/CheckboxSlotProps.tsx (78%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/checkbox-slot-props/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/checkbox-slot-props/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/checkbox-slot}/CheckboxSlot.tsx (78%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/checkbox-slot/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/checkbox-slot/index.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/content-slot-props/ContentSlotProps.tsx create mode 100644 docs/data/tree-view/tree-item-customization/demos/content-slot-props/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/content-slot-props/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/content-slot}/ContentSlot.tsx (84%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/content-slot/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/content-slot/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/handle-checkbox-selection-demo}/HandleCheckboxSelectionDemo.tsx (77%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/handle-checkbox-selection-demo/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/handle-checkbox-selection-demo/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/handle-expansion-demo}/HandleExpansionDemo.tsx (94%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/handle-expansion-demo/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/handle-expansion-demo/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/handle-selection-demo}/HandleSelectionDemo.tsx (89%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/handle-selection-demo/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/handle-selection-demo/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/item-children-indentation-prop}/ItemChildrenIndentationProp.tsx (76%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/item-children-indentation-prop/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/item-children-indentation-prop/index.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/label-slot-props/LabelSlotProps.tsx create mode 100644 docs/data/tree-view/tree-item-customization/demos/label-slot-props/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/label-slot-props/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/label-slot}/LabelSlot.tsx (93%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/label-slot/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/label-slot/index.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/use-tree-item-hook-properties/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/use-tree-item-hook-properties/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/use-tree-item-hook-properties}/useTreeItemHookProperties.tsx (91%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/use-tree-item-hook-public-api/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/use-tree-item-hook-public-api/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/use-tree-item-hook-public-api}/useTreeItemHookPublicAPI.tsx (89%) create mode 100644 docs/data/tree-view/tree-item-customization/demos/use-tree-item-hook-status/client.ts create mode 100644 docs/data/tree-view/tree-item-customization/demos/use-tree-item-hook-status/index.ts rename docs/data/tree-view/tree-item-customization/{ => demos/use-tree-item-hook-status}/useTreeItemHookStatus.tsx (95%) delete mode 100644 docs/data/tree-view/tree-item-customization/useTreeItemHookProperties.js delete mode 100644 docs/data/tree-view/tree-item-customization/useTreeItemHookProperties.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/useTreeItemHookPublicAPI.js delete mode 100644 docs/data/tree-view/tree-item-customization/useTreeItemHookPublicAPI.tsx.preview delete mode 100644 docs/data/tree-view/tree-item-customization/useTreeItemHookStatus.js delete mode 100644 docs/data/tree-view/tree-item-customization/useTreeItemHookStatus.tsx.preview delete mode 100644 docs/src/pages/production-error/ErrorDecoder.js create mode 100644 docs/src/pages/production-error/demos/error-decoder/ErrorDecoder.tsx create mode 100644 docs/src/pages/production-error/demos/error-decoder/client.ts create mode 100644 docs/src/pages/production-error/demos/error-decoder/index.ts diff --git a/docs/data/charts/accessibility/KeyboardActivation.js b/docs/data/charts/accessibility/KeyboardActivation.js deleted file mode 100644 index a1f682235024c..0000000000000 --- a/docs/data/charts/accessibility/KeyboardActivation.js +++ /dev/null @@ -1,77 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; - -import { LineChart } from '@mui/x-charts/LineChart'; - -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const lineChartsParams = { - series: [ - { id: 'series-1', data: [3, 4, 1, 6, 5], label: 'A', showMark: true }, - { id: 'series-2', data: [4, 3, 1, 5, 8], label: 'B', showMark: true }, - ], - xAxis: [{ data: [0, 3, 6, 9, 12], scaleType: 'linear' }], - height: 400, -}; - -export default function KeyboardActivation() { - const [itemData, setItemData] = React.useState(); - const [axisData, setAxisData] = React.useState(); - - return ( - - - setItemData(d)} - onLineClick={(event, d) => setItemData(d)} - onMarkClick={(event, d) => setItemData(d)} - onAxisClick={(event, d) => setAxisData(d)} - /> - - - - - - Focus the chart, then press Enter - - { - setItemData(undefined); - setAxisData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/accessibility/KeyboardNavigation.js b/docs/data/charts/accessibility/KeyboardNavigation.js deleted file mode 100644 index 78420dcde94e8..0000000000000 --- a/docs/data/charts/accessibility/KeyboardNavigation.js +++ /dev/null @@ -1,155 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import Select from '@mui/material/Select'; -import InputLabel from '@mui/material/InputLabel'; -import FormControl from '@mui/material/FormControl'; -import MenuItem from '@mui/material/MenuItem'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { data } from './randomData'; - -const highlightScope = { highlight: 'item', fade: 'global' }; - -const scatterSeries = [ - { - label: 'Series A', - data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), - highlightScope, - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), - highlightScope, - }, -]; - -const series = [ - { label: 'Series A', data: data.map((p) => p.y1), highlightScope }, - { label: 'Series B', data: data.map((p) => p.y2), highlightScope }, -]; - -export default function KeyboardNavigation() { - const [chartType, setChartType] = React.useState('line'); - const [focusItemOnClick, setFocusItemOnClick] = React.useState(false); - const chartRef = React.useRef(null); - - const handleChange = (event) => setChartType(event.target.value); - - return ( - - - - Chart Type - - - - setFocusItemOnClick(event.target.checked)} - /> - } - label="focusItemOnClick" - /> - - - - ); -} - -function Chart({ chartRef, type, focusItemOnClick }) { - switch (type) { - case 'scatter': - return ( - - ); - - case 'line': - return ( - p.x1).toSorted((a, b) => a - b) }]} - series={series} - slotProps={{ tooltip: { trigger: 'item' } }} - focusItemOnClick={focusItemOnClick} - /> - ); - - case 'bar': - return ( - Math.round(p.x1)).toSorted((a, b) => a - b) }, - ]} - slotProps={{ tooltip: { trigger: 'item' } }} - series={series} - focusItemOnClick={focusItemOnClick} - /> - ); - - case 'pie': - return ( - - ); - - default: - throw new Error(`Unknown chart type: ${type}`); - } -} diff --git a/docs/data/charts/accessibility/KeyboardNavigation.tsx b/docs/data/charts/accessibility/KeyboardNavigation.tsx deleted file mode 100644 index 6e8d922f9639d..0000000000000 --- a/docs/data/charts/accessibility/KeyboardNavigation.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import Select, { SelectChangeEvent } from '@mui/material/Select'; -import InputLabel from '@mui/material/InputLabel'; -import FormControl from '@mui/material/FormControl'; -import MenuItem from '@mui/material/MenuItem'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { data } from './randomData'; - -const highlightScope = { highlight: 'item', fade: 'global' } as const; - -const scatterSeries = [ - { - label: 'Series A', - data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), - highlightScope, - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), - highlightScope, - }, -]; -const series = [ - { label: 'Series A', data: data.map((p) => p.y1), highlightScope }, - { label: 'Series B', data: data.map((p) => p.y2), highlightScope }, -]; - -type ChartType = 'scatter' | 'line' | 'bar' | 'pie'; - -export default function KeyboardNavigation() { - const [chartType, setChartType] = React.useState('line'); - const [focusItemOnClick, setFocusItemOnClick] = React.useState(false); - const chartRef = React.useRef(null); - - const handleChange = (event: SelectChangeEvent) => - setChartType(event.target.value as ChartType); - - return ( - - - - Chart Type - - - - setFocusItemOnClick(event.target.checked)} - /> - } - label="focusItemOnClick" - /> - - - - ); -} - -function Chart({ - chartRef, - type, - focusItemOnClick, -}: { - chartRef: React.RefObject; - type: T; - focusItemOnClick: boolean; -}) { - switch (type) { - case 'scatter': - return ( - - ); - case 'line': - return ( - p.x1).toSorted((a, b) => a - b) }]} - series={series} - slotProps={{ tooltip: { trigger: 'item' } }} - focusItemOnClick={focusItemOnClick} - /> - ); - case 'bar': - return ( - Math.round(p.x1)).toSorted((a, b) => a - b) }, - ]} - slotProps={{ tooltip: { trigger: 'item' } }} - series={series} - focusItemOnClick={focusItemOnClick} - /> - ); - case 'pie': - return ( - - ); - - default: - throw new Error(`Unknown chart type: ${type}`); - } -} diff --git a/docs/data/charts/accessibility/accessibility.md b/docs/data/charts/accessibility/accessibility.md index 8b217c060b2c4..4f9687e67efc6 100644 --- a/docs/data/charts/accessibility/accessibility.md +++ b/docs/data/charts/accessibility/accessibility.md @@ -64,7 +64,7 @@ components: { } ``` -{{"demo": "KeyboardNavigation.js"}} +{{"component": "file://./demos/keyboard-navigation/index.ts"}} This feature is currently supported by the following charts: line, bar, pie, scatter, sparkline, funnel, radar, heatmap, sankey, map, radial bar, radial line, and range bar. @@ -167,7 +167,7 @@ import type {} from '@mui/x-charts/moduleAugmentation/keyboardActivation'; The click callbacks then receive `MouseEvent | KeyboardEvent`, and you can narrow with `event instanceof KeyboardEvent` before reading pointer-only properties such as `clientX`. Both become the default in v10. -{{"demo": "KeyboardActivation.js"}} +{{"component": "file://./demos/keyboard-activation/index.ts"}} When a chart exposes several item callbacks, activation fires the one a pointer would reach first on the focused data point: line charts try `onMarkClick`, then `onLineClick`, then `onAreaClick`; radar charts try `onMarkClick`, then `onAreaClick`; and Sankey charts call `onNodeClick` or `onLinkClick` depending on the focused element. Only one of them fires. diff --git a/docs/data/charts/accessibility/KeyboardActivation.tsx b/docs/data/charts/accessibility/demos/keyboard-activation/KeyboardActivation.tsx similarity index 95% rename from docs/data/charts/accessibility/KeyboardActivation.tsx rename to docs/data/charts/accessibility/demos/keyboard-activation/KeyboardActivation.tsx index 8573b903f5d52..8f5a63aa6a7d0 100644 --- a/docs/data/charts/accessibility/KeyboardActivation.tsx +++ b/docs/data/charts/accessibility/demos/keyboard-activation/KeyboardActivation.tsx @@ -8,7 +8,7 @@ import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; import { LineChart } from '@mui/x-charts/LineChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { ChartsAxisData, LineItemIdentifier } from '@mui/x-charts/models'; +import type { ChartsAxisData, LineItemIdentifier } from '@mui/x-charts/models'; const lineChartsParams = { series: [ @@ -20,6 +20,7 @@ const lineChartsParams = { } as const; export default function KeyboardActivation() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); const [axisData, setAxisData] = React.useState(); @@ -75,4 +76,5 @@ ${axisData ? JSON.stringify(axisData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/accessibility/demos/keyboard-activation/client.ts b/docs/data/charts/accessibility/demos/keyboard-activation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/accessibility/demos/keyboard-activation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/accessibility/demos/keyboard-activation/index.ts b/docs/data/charts/accessibility/demos/keyboard-activation/index.ts new file mode 100644 index 0000000000000..a2fb76241e5a8 --- /dev/null +++ b/docs/data/charts/accessibility/demos/keyboard-activation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import KeyboardActivation from './KeyboardActivation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, KeyboardActivation, { ClientProvider }); diff --git a/docs/data/charts/accessibility/demos/keyboard-navigation/KeyboardNavigation.tsx b/docs/data/charts/accessibility/demos/keyboard-navigation/KeyboardNavigation.tsx new file mode 100644 index 0000000000000..5b62164a171f3 --- /dev/null +++ b/docs/data/charts/accessibility/demos/keyboard-navigation/KeyboardNavigation.tsx @@ -0,0 +1,167 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import Button from '@mui/material/Button'; +import type { SelectChangeEvent } from '@mui/material/Select'; +import Select from '@mui/material/Select'; +import InputLabel from '@mui/material/InputLabel'; +import FormControl from '@mui/material/FormControl'; +import MenuItem from '@mui/material/MenuItem'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import { BarChart } from '@mui/x-charts/BarChart'; +import { LineChart } from '@mui/x-charts/LineChart'; +import { PieChart } from '@mui/x-charts/PieChart'; +import { data } from '../../randomData'; + +const highlightScope = { highlight: 'item', fade: 'global' } as const; + +const scatterSeries = [ + { + label: 'Series A', + data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), + highlightScope, + }, + { + label: 'Series B', + data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), + highlightScope, + }, +]; +const series = [ + { label: 'Series A', data: data.map((p) => p.y1), highlightScope }, + { label: 'Series B', data: data.map((p) => p.y2), highlightScope }, +]; + +type ChartType = 'scatter' | 'line' | 'bar' | 'pie'; + +export default function KeyboardNavigation() { + // @focus-start @padding 1 + const [chartType, setChartType] = React.useState('line'); + const [focusItemOnClick, setFocusItemOnClick] = React.useState(false); + const chartRef = React.useRef(null); + + const handleChange = (event: SelectChangeEvent) => + setChartType(event.target.value as ChartType); + + return ( + + + + Chart Type + + + + setFocusItemOnClick(event.target.checked)} + /> + } + label="focusItemOnClick" + /> + + + + ); + // @focus-end +} + +function Chart({ + chartRef, + type, + focusItemOnClick, +}: { + chartRef: React.RefObject; + type: T; + focusItemOnClick: boolean; +}) { + switch (type) { + case 'scatter': + return ( + + ); + case 'line': + return ( + p.x1).toSorted((a, b) => a - b) }]} + series={series} + slotProps={{ tooltip: { trigger: 'item' } }} + focusItemOnClick={focusItemOnClick} + /> + ); + case 'bar': + return ( + Math.round(p.x1)).toSorted((a, b) => a - b) }, + ]} + slotProps={{ tooltip: { trigger: 'item' } }} + series={series} + focusItemOnClick={focusItemOnClick} + /> + ); + case 'pie': + return ( + + ); + + default: + throw new Error(`Unknown chart type: ${type}`); + } +} diff --git a/docs/data/charts/accessibility/demos/keyboard-navigation/client.ts b/docs/data/charts/accessibility/demos/keyboard-navigation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/accessibility/demos/keyboard-navigation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/accessibility/demos/keyboard-navigation/index.ts b/docs/data/charts/accessibility/demos/keyboard-navigation/index.ts new file mode 100644 index 0000000000000..c24218e691986 --- /dev/null +++ b/docs/data/charts/accessibility/demos/keyboard-navigation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import KeyboardNavigation from './KeyboardNavigation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, KeyboardNavigation, { ClientProvider }); diff --git a/docs/data/charts/animation/CSSAnimationCustomization.js b/docs/data/charts/animation/CSSAnimationCustomization.js deleted file mode 100644 index 2d52921ed12fc..0000000000000 --- a/docs/data/charts/animation/CSSAnimationCustomization.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as React from 'react'; -import { pieClasses, PieChart } from '@mui/x-charts/PieChart'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; - -const data = [ - { id: 0, value: 10, label: 'series A' }, - { id: 1, value: 15, label: 'series B' }, - { id: 2, value: 20, label: 'series C' }, -]; - -export default function CSSAnimationCustomization() { - const [key, rerender] = React.useReducer((x) => x + 1, 0); - - return ( - - `${item.value}` }]} - width={200} - height={200} - hideLegend - sx={{ - [`& .${pieClasses.arcLabel}.${pieClasses.animate}`]: { - animationDuration: '2s', - }, - }} - /> - - - ); -} diff --git a/docs/data/charts/animation/CSSAnimationCustomization.tsx.preview b/docs/data/charts/animation/CSSAnimationCustomization.tsx.preview deleted file mode 100644 index 7a008baf03714..0000000000000 --- a/docs/data/charts/animation/CSSAnimationCustomization.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - `${item.value}` }]} - width={200} - height={200} - hideLegend - sx={{ - [`& .${pieClasses.arcLabel}.${pieClasses.animate}`]: { - animationDuration: '2s', - }, - }} -/> - \ No newline at end of file diff --git a/docs/data/charts/animation/JSAnimationCustomization.js b/docs/data/charts/animation/JSAnimationCustomization.js deleted file mode 100644 index e5f8997010997..0000000000000 --- a/docs/data/charts/animation/JSAnimationCustomization.js +++ /dev/null @@ -1,78 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import * as React from 'react'; -import { useAnimate } from '@mui/x-charts/hooks'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import { interpolateObject } from '@mui/x-charts-vendor/d3-interpolate'; - -export default function JSAnimationCustomization() { - const [key, animate] = React.useReducer((v) => v + 1, 0); - - return ( - - - - - ); -} - -function AnimatedBarLabel(props) { - const { - seriesId, - dataIndex, - color, - isFaded, - isHighlighted, - classes, - xOrigin, - yOrigin, - x, - y, - width, - height, - layout, - skipAnimation, - ...otherProps - } = props; - - const animatedProps = useAnimate( - { x: x + width / 2, y: y - 2 }, - { - initialProps: { x: x + width / 2, y: yOrigin }, - createInterpolator: interpolateObject, - transformProps: (p) => p, - applyProps: (element, p) => { - element.setAttribute('x', p.x.toString()); - element.setAttribute('y', p.y.toString()); - }, - skip: skipAnimation, - }, - ); - - return ( - - ); -} diff --git a/docs/data/charts/animation/JSDefaultAnimation.js b/docs/data/charts/animation/JSDefaultAnimation.js deleted file mode 100644 index 8938598e8f25e..0000000000000 --- a/docs/data/charts/animation/JSDefaultAnimation.js +++ /dev/null @@ -1,86 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import * as React from 'react'; -import { useAnimateBarLabel } from '@mui/x-charts/hooks'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import { styled } from '@mui/material/styles'; - -export default function JSDefaultAnimation() { - const [key, animate] = React.useReducer((v) => v + 1, 0); - - return ( - - - - - ); -} - -const Text = styled('text')(({ theme }) => ({ - ...theme?.typography?.body2, - stroke: 'none', - fill: (theme.vars || theme)?.palette?.text?.primary, -})); - -function AnimatedBarLabel(props) { - const { - seriesId, - dataIndex, - color, - isFaded, - isHighlighted, - classes, - xOrigin, - yOrigin, - x, - y, - width, - height, - layout, - skipAnimation, - ...otherProps - } = props; - - const animatedProps = useAnimateBarLabel({ - xOrigin, - x, - yOrigin, - y, - width, - height, - layout, - skipAnimation, - }); - - return ( - - ); -} diff --git a/docs/data/charts/animation/MotionAnimationCustomization.js b/docs/data/charts/animation/MotionAnimationCustomization.js deleted file mode 100644 index 5a9ce341c630b..0000000000000 --- a/docs/data/charts/animation/MotionAnimationCustomization.js +++ /dev/null @@ -1,67 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import * as React from 'react'; -import { motion } from 'motion/react'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; - -export default function MotionAnimationCustomization() { - const [key, animate] = React.useReducer((v) => v + 1, 0); - - return ( - - - - - ); -} - -function AnimatedLine({ d, ownerState, skipAnimation }) { - return ( - - ); -} - -function AnimatedMark({ x, y, color, skipAnimation }) { - return ( - - ); -} diff --git a/docs/data/charts/animation/ReactSpringAnimationCustomization.js b/docs/data/charts/animation/ReactSpringAnimationCustomization.js deleted file mode 100644 index 46b465d0016a2..0000000000000 --- a/docs/data/charts/animation/ReactSpringAnimationCustomization.js +++ /dev/null @@ -1,77 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import * as React from 'react'; -import { animated, useSpring } from '@react-spring/web'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; - -export default function ReactSpringAnimationCustomization() { - const [key, animate] = React.useReducer((v) => v + 1, 0); - - return ( - - - - - ); -} - -function AnimatedBarLabel(props) { - const { - seriesId, - dataIndex, - color, - isFaded, - isHighlighted, - classes, - xOrigin, - yOrigin, - x, - y, - width, - height, - layout, - skipAnimation, - ...otherProps - } = props; - - const style = useSpring({ - from: { y: yOrigin }, - to: { y: y - 4 }, - config: { tension: 100, friction: 10 }, - }); - - return ( - - ); -} diff --git a/docs/data/charts/animation/animation.md b/docs/data/charts/animation/animation.md index 97aff10b7223f..65c8290a80e8b 100644 --- a/docs/data/charts/animation/animation.md +++ b/docs/data/charts/animation/animation.md @@ -20,7 +20,7 @@ To customize Chart animations, you may need to override CSS classes or implement You can override the default CSS classes to customize CSS-based animations. The demo below shows how you can increase the label's animation duration to two seconds: -{{"demo": "CSSAnimationCustomization.js"}} +{{"component": "file://./demos/css-animation-customization/index.ts"}} ## Customizing JavaScript animations @@ -37,7 +37,7 @@ The Charts package provides the following animation hooks: The demo below illustrates how to use these hooks by animating the bar labels to match the bar animation—click **Run Animation** to see it in action: -{{"demo": "JSDefaultAnimation.js"}} +{{"component": "file://./demos/js-default-animation/index.ts"}} ### The useAnimate() hook @@ -60,7 +60,7 @@ You can find more detailed explanations in the hook's JSDoc. In the example below, labels are positioned above the bars they refer to and are animated with the `useAnimate()` hook: -{{"demo": "JSAnimationCustomization.js"}} +{{"component": "file://./demos/js-animation-customization/index.ts"}} ## Third-party animation libraries @@ -75,10 +75,10 @@ It's essential to test the performance of your charts with your chosen animation The demo below shows how to integrate [React Spring](https://www.react-spring.dev/docs/getting-started) to add a bounce effect to the bar label animation: -{{"demo": "ReactSpringAnimationCustomization.js"}} +{{"component": "file://./demos/react-spring-animation-customization/index.ts"}} ### Motion The following demo uses the [Motion library](https://motion.dev/docs/react) for a fade-in effect on the points and lines in the chart: -{{"demo": "MotionAnimationCustomization.js"}} +{{"component": "file://./demos/motion-animation-customization/index.ts"}} diff --git a/docs/data/charts/animation/CSSAnimationCustomization.tsx b/docs/data/charts/animation/demos/css-animation-customization/CSSAnimationCustomization.tsx similarity index 95% rename from docs/data/charts/animation/CSSAnimationCustomization.tsx rename to docs/data/charts/animation/demos/css-animation-customization/CSSAnimationCustomization.tsx index 2d52921ed12fc..8bfa15b0164fe 100644 --- a/docs/data/charts/animation/CSSAnimationCustomization.tsx +++ b/docs/data/charts/animation/demos/css-animation-customization/CSSAnimationCustomization.tsx @@ -10,6 +10,7 @@ const data = [ ]; export default function CSSAnimationCustomization() { + // @focus-start @padding 1 const [key, rerender] = React.useReducer((x) => x + 1, 0); return ( @@ -29,4 +30,5 @@ export default function CSSAnimationCustomization() { ); + // @focus-end } diff --git a/docs/data/charts/animation/demos/css-animation-customization/client.ts b/docs/data/charts/animation/demos/css-animation-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/animation/demos/css-animation-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/animation/demos/css-animation-customization/index.ts b/docs/data/charts/animation/demos/css-animation-customization/index.ts new file mode 100644 index 0000000000000..5a7c240ae443c --- /dev/null +++ b/docs/data/charts/animation/demos/css-animation-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CSSAnimationCustomization from './CSSAnimationCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CSSAnimationCustomization, { ClientProvider }); diff --git a/docs/data/charts/animation/JSAnimationCustomization.tsx b/docs/data/charts/animation/demos/js-animation-customization/JSAnimationCustomization.tsx similarity index 91% rename from docs/data/charts/animation/JSAnimationCustomization.tsx rename to docs/data/charts/animation/demos/js-animation-customization/JSAnimationCustomization.tsx index da37b5060df5c..dae0c51fb4d27 100644 --- a/docs/data/charts/animation/JSAnimationCustomization.tsx +++ b/docs/data/charts/animation/demos/js-animation-customization/JSAnimationCustomization.tsx @@ -1,4 +1,5 @@ -import { BarChart, BarLabelProps } from '@mui/x-charts/BarChart'; +import type { BarLabelProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; import * as React from 'react'; import { useAnimate } from '@mui/x-charts/hooks'; import Stack from '@mui/material/Stack'; @@ -6,6 +7,7 @@ import Button from '@mui/material/Button'; import { interpolateObject } from '@mui/x-charts-vendor/d3-interpolate'; export default function JSAnimationCustomization() { + // @focus-start @padding 1 const [key, animate] = React.useReducer((v) => v + 1, 0); return ( @@ -37,6 +39,7 @@ export default function JSAnimationCustomization() { ); + // @focus-end } function AnimatedBarLabel(props: BarLabelProps) { diff --git a/docs/data/charts/animation/demos/js-animation-customization/client.ts b/docs/data/charts/animation/demos/js-animation-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/animation/demos/js-animation-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/animation/demos/js-animation-customization/index.ts b/docs/data/charts/animation/demos/js-animation-customization/index.ts new file mode 100644 index 0000000000000..8f3ad39454bfd --- /dev/null +++ b/docs/data/charts/animation/demos/js-animation-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import JSAnimationCustomization from './JSAnimationCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, JSAnimationCustomization, { ClientProvider }); diff --git a/docs/data/charts/animation/JSDefaultAnimation.tsx b/docs/data/charts/animation/demos/js-default-animation/JSDefaultAnimation.tsx similarity index 91% rename from docs/data/charts/animation/JSDefaultAnimation.tsx rename to docs/data/charts/animation/demos/js-default-animation/JSDefaultAnimation.tsx index e5bb5296408a3..146aed9ae8cc0 100644 --- a/docs/data/charts/animation/JSDefaultAnimation.tsx +++ b/docs/data/charts/animation/demos/js-default-animation/JSDefaultAnimation.tsx @@ -1,4 +1,5 @@ -import { BarChart, BarLabelProps } from '@mui/x-charts/BarChart'; +import type { BarLabelProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; import * as React from 'react'; import { useAnimateBarLabel } from '@mui/x-charts/hooks'; import Stack from '@mui/material/Stack'; @@ -6,6 +7,7 @@ import Button from '@mui/material/Button'; import { styled } from '@mui/material/styles'; export default function JSDefaultAnimation() { + // @focus-start @padding 1 const [key, animate] = React.useReducer((v) => v + 1, 0); return ( @@ -37,6 +39,7 @@ export default function JSDefaultAnimation() { ); + // @focus-end } const Text = styled('text')(({ theme }) => ({ diff --git a/docs/data/charts/animation/demos/js-default-animation/client.ts b/docs/data/charts/animation/demos/js-default-animation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/animation/demos/js-default-animation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/animation/demos/js-default-animation/index.ts b/docs/data/charts/animation/demos/js-default-animation/index.ts new file mode 100644 index 0000000000000..319270ae17b26 --- /dev/null +++ b/docs/data/charts/animation/demos/js-default-animation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import JSDefaultAnimation from './JSDefaultAnimation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, JSDefaultAnimation, { ClientProvider }); diff --git a/docs/data/charts/animation/MotionAnimationCustomization.tsx b/docs/data/charts/animation/demos/motion-animation-customization/MotionAnimationCustomization.tsx similarity index 89% rename from docs/data/charts/animation/MotionAnimationCustomization.tsx rename to docs/data/charts/animation/demos/motion-animation-customization/MotionAnimationCustomization.tsx index f70dd4d3075bf..204d4419853a7 100644 --- a/docs/data/charts/animation/MotionAnimationCustomization.tsx +++ b/docs/data/charts/animation/demos/motion-animation-customization/MotionAnimationCustomization.tsx @@ -1,14 +1,12 @@ -import { - LineChart, - type AnimatedLineProps, - type MarkElementProps, -} from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; +import type { AnimatedLineProps, MarkElementProps } from '@mui/x-charts/LineChart'; import * as React from 'react'; import { motion } from 'motion/react'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; export default function MotionAnimationCustomization() { + // @focus-start @padding 1 const [key, animate] = React.useReducer((v) => v + 1, 0); return ( @@ -36,6 +34,7 @@ export default function MotionAnimationCustomization() { ); + // @focus-end } function AnimatedLine({ d, ownerState, skipAnimation }: AnimatedLineProps) { diff --git a/docs/data/charts/animation/demos/motion-animation-customization/client.ts b/docs/data/charts/animation/demos/motion-animation-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/animation/demos/motion-animation-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/animation/demos/motion-animation-customization/index.ts b/docs/data/charts/animation/demos/motion-animation-customization/index.ts new file mode 100644 index 0000000000000..bef4051418db6 --- /dev/null +++ b/docs/data/charts/animation/demos/motion-animation-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MotionAnimationCustomization from './MotionAnimationCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MotionAnimationCustomization, { ClientProvider }); diff --git a/docs/data/charts/animation/ReactSpringAnimationCustomization.tsx b/docs/data/charts/animation/demos/react-spring-animation-customization/ReactSpringAnimationCustomization.tsx similarity index 90% rename from docs/data/charts/animation/ReactSpringAnimationCustomization.tsx rename to docs/data/charts/animation/demos/react-spring-animation-customization/ReactSpringAnimationCustomization.tsx index 998e410c8ff8d..5c8a92c4ad5a7 100644 --- a/docs/data/charts/animation/ReactSpringAnimationCustomization.tsx +++ b/docs/data/charts/animation/demos/react-spring-animation-customization/ReactSpringAnimationCustomization.tsx @@ -1,10 +1,12 @@ -import { BarChart, BarLabelProps } from '@mui/x-charts/BarChart'; +import type { BarLabelProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; import * as React from 'react'; import { animated, useSpring } from '@react-spring/web'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; export default function ReactSpringAnimationCustomization() { + // @focus-start @padding 1 const [key, animate] = React.useReducer((v) => v + 1, 0); return ( @@ -37,6 +39,7 @@ export default function ReactSpringAnimationCustomization() { ); + // @focus-end } function AnimatedBarLabel(props: BarLabelProps) { diff --git a/docs/data/charts/animation/demos/react-spring-animation-customization/client.ts b/docs/data/charts/animation/demos/react-spring-animation-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/animation/demos/react-spring-animation-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/animation/demos/react-spring-animation-customization/index.ts b/docs/data/charts/animation/demos/react-spring-animation-customization/index.ts new file mode 100644 index 0000000000000..4f53df168baf9 --- /dev/null +++ b/docs/data/charts/animation/demos/react-spring-animation-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReactSpringAnimationCustomization from './ReactSpringAnimationCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReactSpringAnimationCustomization, { ClientProvider }); diff --git a/docs/data/charts/areas-demo/AreaChartConnectNulls.js b/docs/data/charts/areas-demo/AreaChartConnectNulls.js deleted file mode 100644 index bec1d4f8651d5..0000000000000 --- a/docs/data/charts/areas-demo/AreaChartConnectNulls.js +++ /dev/null @@ -1,23 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const data = [4000, 3000, 2000, null, 1890, 2390, 3490]; -const xData = ['Page A', 'Page B', 'Page C', 'Page D', 'Page E', 'Page F', 'Page G']; -const margin = { right: 24 }; - -export default function AreaChartConnectNulls() { - return ( - - - - - ); -} diff --git a/docs/data/charts/areas-demo/AreaChartConnectNulls.tsx.preview b/docs/data/charts/areas-demo/AreaChartConnectNulls.tsx.preview deleted file mode 100644 index d38e83e2beec5..0000000000000 --- a/docs/data/charts/areas-demo/AreaChartConnectNulls.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/areas-demo/AreaChartFillByValue.js b/docs/data/charts/areas-demo/AreaChartFillByValue.js deleted file mode 100644 index 7b0272d9ae7f0..0000000000000 --- a/docs/data/charts/areas-demo/AreaChartFillByValue.js +++ /dev/null @@ -1,165 +0,0 @@ -import { green, red } from '@mui/material/colors'; -import Stack from '@mui/material/Stack'; -import { useYScale, useDrawingArea } from '@mui/x-charts/hooks'; -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; - -const margin = { right: 24, bottom: 0 }; -const data = [4000, 3000, -1000, 500, -2100, -250, 3490]; -const xData = ['Page A', 'Page B', 'Page C', 'Page D', 'Page E', 'Page F', 'Page G']; - -function ColorSwitch({ threshold, color1, color2, id }) { - const { top, height, bottom } = useDrawingArea(); - const svgHeight = top + bottom + height; - - const scale = useYScale(); // You can provide the axis Id if you have multiple ones - const y0 = scale(threshold); // The coordinate of the origin - const off = y0 !== undefined ? y0 / svgHeight : 0; - - return ( - - - - - - - ); -} - -export default function AreaChartFillByValue() { - return ( - - - - - - - - - - - ); -} - -function ColorPalette({ id }) { - const { top, height, bottom } = useDrawingArea(); - const svgHeight = top + bottom + height; - - const scale = useYScale(); // You can provide the axis Id if you have multiple ones - - return ( - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/areas-demo/PercentAreaChart.js b/docs/data/charts/areas-demo/PercentAreaChart.js deleted file mode 100644 index 678069a191c58..0000000000000 --- a/docs/data/charts/areas-demo/PercentAreaChart.js +++ /dev/null @@ -1,60 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import Box from '@mui/material/Box'; - -const time = [ - new Date(2015, 1, 0), - new Date(2015, 2, 0), - new Date(2015, 3, 0), - new Date(2015, 4, 0), - new Date(2015, 5, 0), - new Date(2015, 6, 0), - new Date(2015, 7, 0), -]; - -const a = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const b = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const c = [2400, 2210, 2290, 2000, 2181, 2500, 2100]; - -const getPercents = (array) => - array.map((v, index) => (100 * v) / (a[index] + b[index] + c[index])); - -export default function PercentAreaChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/areas-demo/SimpleAreaChart.js b/docs/data/charts/areas-demo/SimpleAreaChart.js deleted file mode 100644 index 160ce578a2173..0000000000000 --- a/docs/data/charts/areas-demo/SimpleAreaChart.js +++ /dev/null @@ -1,31 +0,0 @@ -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; -import Box from '@mui/material/Box'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function SimpleAreaChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/areas-demo/SimpleAreaChart.tsx.preview b/docs/data/charts/areas-demo/SimpleAreaChart.tsx.preview deleted file mode 100644 index 5b5c61d1f17bb..0000000000000 --- a/docs/data/charts/areas-demo/SimpleAreaChart.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/areas-demo/StackedAreaChart.js b/docs/data/charts/areas-demo/StackedAreaChart.js deleted file mode 100644 index b17891e8f89da..0000000000000 --- a/docs/data/charts/areas-demo/StackedAreaChart.js +++ /dev/null @@ -1,43 +0,0 @@ -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; -import Box from '@mui/material/Box'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const amtData = [2400, 2210, 0, 2000, 2181, 2500, 2100]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function StackedAreaChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/areas-demo/TinyAreaChart.js b/docs/data/charts/areas-demo/TinyAreaChart.js deleted file mode 100644 index 79aca4b1bf4df..0000000000000 --- a/docs/data/charts/areas-demo/TinyAreaChart.js +++ /dev/null @@ -1,34 +0,0 @@ -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { AreaPlot } from '@mui/x-charts/LineChart'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function TinyAreaChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/areas-demo/TinyAreaChart.tsx.preview b/docs/data/charts/areas-demo/TinyAreaChart.tsx.preview deleted file mode 100644 index 4b7024e25a0e4..0000000000000 --- a/docs/data/charts/areas-demo/TinyAreaChart.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/charts/areas-demo/areas-demo.md b/docs/data/charts/areas-demo/areas-demo.md index 7affde856ea5f..193bbe2dec1ad 100644 --- a/docs/data/charts/areas-demo/areas-demo.md +++ b/docs/data/charts/areas-demo/areas-demo.md @@ -10,23 +10,23 @@ components: LineChart, LineElement, LineHighlightElement, LineHighlightPlot, Lin ## SimpleAreaChart -{{"demo": "SimpleAreaChart.js"}} +{{"component": "file://./demos/simple-area-chart/index.ts"}} ## StackedAreaChart -{{"demo": "StackedAreaChart.js"}} +{{"component": "file://./demos/stacked-area-chart/index.ts"}} ## TinyAreaChart -{{"demo": "TinyAreaChart.js"}} +{{"component": "file://./demos/tiny-area-chart/index.ts"}} ## PercentAreaChart -{{"demo": "PercentAreaChart.js"}} +{{"component": "file://./demos/percent-area-chart/index.ts"}} ## AreaChartConnectNulls -{{"demo": "AreaChartConnectNulls.js"}} +{{"component": "file://./demos/area-chart-connect-nulls/index.ts"}} ## AreaChartFillByValue @@ -46,4 +46,4 @@ The `` offset is a ratio of gradient vector. That's why you need to divide the coordinate by the SVG height. ::: -{{"demo": "AreaChartFillByValue.js"}} +{{"component": "file://./demos/area-chart-fill-by-value/index.ts"}} diff --git a/docs/data/charts/areas-demo/AreaChartConnectNulls.tsx b/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/AreaChartConnectNulls.tsx similarity index 93% rename from docs/data/charts/areas-demo/AreaChartConnectNulls.tsx rename to docs/data/charts/areas-demo/demos/area-chart-connect-nulls/AreaChartConnectNulls.tsx index bec1d4f8651d5..3df6db0ca4696 100644 --- a/docs/data/charts/areas-demo/AreaChartConnectNulls.tsx +++ b/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/AreaChartConnectNulls.tsx @@ -8,6 +8,7 @@ const margin = { right: 24 }; export default function AreaChartConnectNulls() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/client.ts b/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/index.ts b/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/index.ts new file mode 100644 index 0000000000000..019e9a43b3fd0 --- /dev/null +++ b/docs/data/charts/areas-demo/demos/area-chart-connect-nulls/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AreaChartConnectNulls from './AreaChartConnectNulls'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AreaChartConnectNulls, { ClientProvider }); diff --git a/docs/data/charts/areas-demo/AreaChartFillByValue.tsx b/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/AreaChartFillByValue.tsx similarity index 97% rename from docs/data/charts/areas-demo/AreaChartFillByValue.tsx rename to docs/data/charts/areas-demo/demos/area-chart-fill-by-value/AreaChartFillByValue.tsx index e2dfb920d04a7..6d11e6556681e 100644 --- a/docs/data/charts/areas-demo/AreaChartFillByValue.tsx +++ b/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/AreaChartFillByValue.tsx @@ -1,4 +1,4 @@ -import { ScaleLinear } from '@mui/x-charts-vendor/d3-scale'; +import type { ScaleLinear } from '@mui/x-charts-vendor/d3-scale'; import { green, red } from '@mui/material/colors'; import Stack from '@mui/material/Stack'; import { useYScale, useDrawingArea } from '@mui/x-charts/hooks'; @@ -43,6 +43,7 @@ function ColorSwitch({ threshold, color1, color2, id }: ColorSwitchProps) { export default function AreaChartFillByValue() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/client.ts b/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/index.ts b/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/index.ts new file mode 100644 index 0000000000000..d8e72aea99929 --- /dev/null +++ b/docs/data/charts/areas-demo/demos/area-chart-fill-by-value/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AreaChartFillByValue from './AreaChartFillByValue'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AreaChartFillByValue, { ClientProvider }); diff --git a/docs/data/charts/areas-demo/PercentAreaChart.tsx b/docs/data/charts/areas-demo/demos/percent-area-chart/PercentAreaChart.tsx similarity index 96% rename from docs/data/charts/areas-demo/PercentAreaChart.tsx rename to docs/data/charts/areas-demo/demos/percent-area-chart/PercentAreaChart.tsx index 9f1241bc0be2c..ffdb2bf33cce7 100644 --- a/docs/data/charts/areas-demo/PercentAreaChart.tsx +++ b/docs/data/charts/areas-demo/demos/percent-area-chart/PercentAreaChart.tsx @@ -20,6 +20,7 @@ const getPercents = (array: number[]) => export default function PercentAreaChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/areas-demo/demos/percent-area-chart/client.ts b/docs/data/charts/areas-demo/demos/percent-area-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/areas-demo/demos/percent-area-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/areas-demo/demos/percent-area-chart/index.ts b/docs/data/charts/areas-demo/demos/percent-area-chart/index.ts new file mode 100644 index 0000000000000..c284616543dc6 --- /dev/null +++ b/docs/data/charts/areas-demo/demos/percent-area-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PercentAreaChart from './PercentAreaChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PercentAreaChart, { ClientProvider }); diff --git a/docs/data/charts/areas-demo/SimpleAreaChart.tsx b/docs/data/charts/areas-demo/demos/simple-area-chart/SimpleAreaChart.tsx similarity index 93% rename from docs/data/charts/areas-demo/SimpleAreaChart.tsx rename to docs/data/charts/areas-demo/demos/simple-area-chart/SimpleAreaChart.tsx index 160ce578a2173..7ca8ea71cd3cb 100644 --- a/docs/data/charts/areas-demo/SimpleAreaChart.tsx +++ b/docs/data/charts/areas-demo/demos/simple-area-chart/SimpleAreaChart.tsx @@ -16,6 +16,7 @@ const xLabels = [ export default function SimpleAreaChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/areas-demo/demos/simple-area-chart/client.ts b/docs/data/charts/areas-demo/demos/simple-area-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/areas-demo/demos/simple-area-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/areas-demo/demos/simple-area-chart/index.ts b/docs/data/charts/areas-demo/demos/simple-area-chart/index.ts new file mode 100644 index 0000000000000..38e09cde9833c --- /dev/null +++ b/docs/data/charts/areas-demo/demos/simple-area-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SimpleAreaChart from './SimpleAreaChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SimpleAreaChart, { ClientProvider }); diff --git a/docs/data/charts/areas-demo/StackedAreaChart.tsx b/docs/data/charts/areas-demo/demos/stacked-area-chart/StackedAreaChart.tsx similarity index 95% rename from docs/data/charts/areas-demo/StackedAreaChart.tsx rename to docs/data/charts/areas-demo/demos/stacked-area-chart/StackedAreaChart.tsx index b17891e8f89da..73f824601c4d6 100644 --- a/docs/data/charts/areas-demo/StackedAreaChart.tsx +++ b/docs/data/charts/areas-demo/demos/stacked-area-chart/StackedAreaChart.tsx @@ -18,6 +18,7 @@ const xLabels = [ export default function StackedAreaChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/areas-demo/demos/stacked-area-chart/client.ts b/docs/data/charts/areas-demo/demos/stacked-area-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/areas-demo/demos/stacked-area-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/areas-demo/demos/stacked-area-chart/index.ts b/docs/data/charts/areas-demo/demos/stacked-area-chart/index.ts new file mode 100644 index 0000000000000..97b9ef1ab0e01 --- /dev/null +++ b/docs/data/charts/areas-demo/demos/stacked-area-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackedAreaChart from './StackedAreaChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackedAreaChart, { ClientProvider }); diff --git a/docs/data/charts/areas-demo/TinyAreaChart.tsx b/docs/data/charts/areas-demo/demos/tiny-area-chart/TinyAreaChart.tsx similarity index 93% rename from docs/data/charts/areas-demo/TinyAreaChart.tsx rename to docs/data/charts/areas-demo/demos/tiny-area-chart/TinyAreaChart.tsx index 79aca4b1bf4df..4f5d7cf0cdeb0 100644 --- a/docs/data/charts/areas-demo/TinyAreaChart.tsx +++ b/docs/data/charts/areas-demo/demos/tiny-area-chart/TinyAreaChart.tsx @@ -14,6 +14,7 @@ const xLabels = [ export default function TinyAreaChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/areas-demo/demos/tiny-area-chart/client.ts b/docs/data/charts/areas-demo/demos/tiny-area-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/areas-demo/demos/tiny-area-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/areas-demo/demos/tiny-area-chart/index.ts b/docs/data/charts/areas-demo/demos/tiny-area-chart/index.ts new file mode 100644 index 0000000000000..ae3135477c474 --- /dev/null +++ b/docs/data/charts/areas-demo/demos/tiny-area-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TinyAreaChart from './TinyAreaChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TinyAreaChart, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/AxisCustomization.js b/docs/data/charts/axis-customization/AxisCustomization.js deleted file mode 100644 index 41f0fed1d2870..0000000000000 --- a/docs/data/charts/axis-customization/AxisCustomization.js +++ /dev/null @@ -1,67 +0,0 @@ -import Box from '@mui/material/Box'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { Chance } from 'chance'; - -const chance = new Chance(42); - -const data = Array.from({ length: 200 }, () => ({ - x: chance.floating({ min: -25, max: 25 }), - y: chance.floating({ min: -25, max: 25 }), -})).map((d, index) => ({ ...d, id: index })); - -const defaultXAxis = { - disableLine: false, - disableTicks: false, - fontSize: 12, - label: 'My axis', - tickSize: 6, -}; -export default function AxisCustomization() { - return ( - ( - - - - )} - getCode={({ - props, - }) => `import { ScatterChart } from '@mui/x-charts/ScatterChart'; - - -`} - /> - ); -} diff --git a/docs/data/charts/axis-customization/AxisIdStyling.js b/docs/data/charts/axis-customization/AxisIdStyling.js deleted file mode 100644 index 68caf346ae455..0000000000000 --- a/docs/data/charts/axis-customization/AxisIdStyling.js +++ /dev/null @@ -1,40 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { axisClasses } from '@mui/x-charts/ChartsAxis'; - -const years = [2010, 2011, 2012, 2013, 2014, 2015]; -const revenue = [4000, 3000, 2000, 2780, 1890, 2390]; -const profit = [24, 13, 98, 39, 48, 38]; - -const chartConfig = { - xAxis: [{ data: years, scaleType: 'point' }], - yAxis: [ - { id: 'revenue-axis', label: 'Revenue ($)' }, - { id: 'profit-axis', label: 'Profit (%)', position: 'right' }, - ], - series: [ - { data: revenue, label: 'Revenue', yAxisId: 'revenue-axis', color: '#02b2af' }, - { data: profit, label: 'Profit', yAxisId: 'profit-axis', color: '#2e96ff' }, - ], - height: 300, -}; - -export default function AxisIdStyling() { - return ( - - ); -} diff --git a/docs/data/charts/axis-customization/AxisIdStyling.tsx.preview b/docs/data/charts/axis-customization/AxisIdStyling.tsx.preview deleted file mode 100644 index 11b9107ff4d92..0000000000000 --- a/docs/data/charts/axis-customization/AxisIdStyling.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis-customization/AxisTextCustomization.js b/docs/data/charts/axis-customization/AxisTextCustomization.js deleted file mode 100644 index b4100dde50f23..0000000000000 --- a/docs/data/charts/axis-customization/AxisTextCustomization.js +++ /dev/null @@ -1,91 +0,0 @@ -import Box from '@mui/material/Box'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const chartSetting = { - height: 300, -}; - -export default function AxisTextCustomization() { - return ( - ( - - - - )} - getCode={({ props }) => `import { BarChart } from '@mui/x-charts/BarChart'; - -`} - /> - ); -} diff --git a/docs/data/charts/axis-customization/CustomAxisTicks.js b/docs/data/charts/axis-customization/CustomAxisTicks.js deleted file mode 100644 index 5d6555a14aa4b..0000000000000 --- a/docs/data/charts/axis-customization/CustomAxisTicks.js +++ /dev/null @@ -1,89 +0,0 @@ -import * as React from 'react'; -import { useTheme } from '@mui/material/styles'; -import { BarChart } from '@mui/x-charts/BarChart'; - -import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; -import { useYAxes, useYAxisCoordinates, useYAxisTicks } from '@mui/x-charts/hooks'; - -const labels = [ - 'Server Products', - 'Enterprise Services', - 'M365 Commercial', - 'M365 Consumer', - 'LinkedIn', - 'Dynamics', - 'Gaming', - 'Windows & Devices', - 'Search & News Ads', -]; - -const data = [98.4, 7.7, 87.7, 7.4, 17.8, 7.8, 23.4, 17.3, 13.8]; - -const chartSetting = { - height: 400, - margin: { left: 0 }, - layout: 'horizontal', - xAxis: [{ id: 'x' }], - yAxis: [{ id: 'y', scaleType: 'band', data: labels, width: 4 }], -}; - -export default function CustomAxisTicks() { - const theme = useTheme(); - const seriesColor = rainbowSurgePalette(theme.palette.mode)[ - theme.palette.mode === 'dark' ? 0 : 1 - ]; - - return ( - - ); -} - -function YAxis(props) { - const theme = useTheme(); - const { yAxisIds } = useYAxes(); - const axisId = props.axisId ?? yAxisIds[0]; - - // The top, left, right, bottom of the axis according to the charts settings - const axisCoordinates = useYAxisCoordinates(axisId); - - // The array of ticks to place according to the settings - const ticks = useYAxisTicks(axisId); - - if (!axisCoordinates) { - return null; - } - - return ( - - - {ticks.map((tick, index) => ( - - - - {tick.formattedValue ?? ''} - - - ))} - - ); -} diff --git a/docs/data/charts/axis-customization/CustomAxisTicks.tsx.preview b/docs/data/charts/axis-customization/CustomAxisTicks.tsx.preview deleted file mode 100644 index 4be1eb2d1fe4a..0000000000000 --- a/docs/data/charts/axis-customization/CustomAxisTicks.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis-customization/GroupedAxesStyling.js b/docs/data/charts/axis-customization/GroupedAxesStyling.js deleted file mode 100644 index d54aaffd0c084..0000000000000 --- a/docs/data/charts/axis-customization/GroupedAxesStyling.js +++ /dev/null @@ -1,87 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import { axisClasses } from '@mui/x-charts/ChartsAxis'; - -export default function GroupedAxesStyling() { - return ( - - ); -} -const getMonth = (date) => date.toLocaleDateString('en-US', { month: 'short' }); -const formatQuarterYear = (date) => { - const quarter = Math.floor(date.getMonth() / 3) + 1; - const year = date.getFullYear().toString().slice(-2); - return `Q${quarter} '${year}`; -}; - -const valueFormatter = (v) => - v.toLocaleDateString('en-US', { - month: 'short', - year: 'numeric', - }); - -const data = [ - new Date(2015, 0, 1), - new Date(2015, 1, 1), - new Date(2015, 2, 1), - new Date(2015, 3, 1), - new Date(2015, 4, 1), - new Date(2015, 5, 1), - new Date(2015, 6, 1), - new Date(2015, 7, 1), - new Date(2015, 8, 1), - new Date(2015, 9, 1), - new Date(2015, 10, 1), - new Date(2015, 11, 1), - new Date(2016, 0, 1), -]; - -const a = [ - 4000, 3000, 2000, 2780, 1890, 2390, 3490, 2400, 1398, 9800, 3908, 4800, 2040, -]; - -const b = [ - 2400, 1398, 9800, 3908, 4800, 3800, 4300, 2181, 2500, 2100, 3000, 2000, 2040, -]; - -const getPercents = (array) => - array.map((v, index) => (100 * v) / (a[index] + b[index])); - -const chartConfig = { - height: 200, - margin: { left: 0 }, - series: [ - { - data: getPercents(a), - label: 'Income', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - { - data: getPercents(b), - label: 'Expenses', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - ], - yAxis: [ - { - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - ], -}; diff --git a/docs/data/charts/axis-customization/GroupedAxesTickSize.js b/docs/data/charts/axis-customization/GroupedAxesTickSize.js deleted file mode 100644 index 8a0e55aaa7c47..0000000000000 --- a/docs/data/charts/axis-customization/GroupedAxesTickSize.js +++ /dev/null @@ -1,83 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function GroupedAxesTickSize() { - return ( - - ); -} - -const getMonth = (date) => date.toLocaleDateString('en-US', { month: 'short' }); - -const formatQuarterYear = (date) => { - const quarter = Math.floor(date.getMonth() / 3) + 1; - const year = date.getFullYear().toString().slice(-2); - return `Q${quarter} '${year}`; -}; - -const valueFormatter = (v) => - v.toLocaleDateString('en-US', { - month: 'short', - year: 'numeric', - }); - -const data = [ - new Date(2015, 0, 1), - new Date(2015, 1, 1), - new Date(2015, 2, 1), - new Date(2015, 3, 1), - new Date(2015, 4, 1), - new Date(2015, 5, 1), - new Date(2015, 6, 1), - new Date(2015, 7, 1), - new Date(2015, 8, 1), - new Date(2015, 9, 1), - new Date(2015, 10, 1), - new Date(2015, 11, 1), -]; - -const a = [4000, 3000, 2000, 2780, 1890, 2390, 3490, 2400, 1398, 9800, 3908, 4800]; -const b = [2400, 1398, 9800, 3908, 4800, 3800, 4300, 2181, 2500, 2100, 3000, 2000]; - -const getPercents = (array) => - array.map((v, index) => (100 * v) / (a[index] + b[index])); - -const chartConfig = { - height: 200, - margin: { left: 0 }, - series: [ - { - data: getPercents(a), - label: 'Income', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - { - data: getPercents(b), - label: 'Expenses', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - ], - yAxis: [ - { - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - ], -}; diff --git a/docs/data/charts/axis-customization/MarginAndLabelPosition.js b/docs/data/charts/axis-customization/MarginAndLabelPosition.js deleted file mode 100644 index eb1925b6f9a28..0000000000000 --- a/docs/data/charts/axis-customization/MarginAndLabelPosition.js +++ /dev/null @@ -1,241 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function MarginAndLabelPosition() { - const [fixMargin, setFixMargin] = React.useState(true); - - return ( - - - setFixMargin(event.target.checked)} /> - } - label="Increase axes size" - labelPlacement="end" - /> - - - - context.location === 'tick' - ? value.split('').join('\n') - : usAirportPassengers.find((item) => item.code === value).fullName, - label: 'airports', - height: fixMargin ? 75 : undefined, - }, - ]} - // Other props - height={300} - dataset={usAirportPassengers} - series={[ - { dataKey: '2018', label: '2018' }, - { dataKey: '2019', label: '2019' }, - { dataKey: '2020', label: '2020' }, - { dataKey: '2021', label: '2021' }, - { dataKey: '2022', label: '2022' }, - ]} - hideLegend - yAxis={[ - { - valueFormatter: (value) => `${(value / 1000).toLocaleString()}k`, - label: 'passengers', - width: fixMargin ? 85 : undefined, - }, - ]} - /> - - ); -} - -const usAirportPassengers = [ - { - fullName: 'Hartsfield–Jackson Atlanta International Airport', - code: 'ATL', - 2022: 45396001, - 2021: 36676010, - 2020: 20559866, - 2019: 53505795, - 2018: 51865797, - }, - { - fullName: 'Dallas/Fort Worth International Airport', - code: 'DFW', - 2022: 35345138, - 2021: 30005266, - 2020: 18593421, - 2019: 35778573, - 2018: 32821799, - }, - { - fullName: 'Denver International Airport', - code: 'DEN', - 2022: 33773832, - 2021: 28645527, - 2020: 16243216, - 2019: 33592945, - 2018: 31362941, - }, - { - fullName: "O'Hare International Airport", - code: 'ORD', - 2022: 33120474, - 2021: 26350976, - 2020: 14606034, - 2019: 40871223, - 2018: 39873927, - }, - { - fullName: 'Los Angeles International Airport', - code: 'LAX', - 2022: 32326616, - 2021: 23663410, - 2020: 14055777, - 2019: 42939104, - 2018: 42624050, - }, - { - fullName: 'John F. Kennedy International Airport', - code: 'JFK', - 2022: 26919982, - 2021: 15273342, - 2020: 8269819, - 2019: 31036655, - 2018: 30620769, - }, - { - fullName: 'Harry Reid International Airport', - code: 'LAS', - 2022: 25480500, - 2021: 19160342, - 2020: 10584059, - 2019: 24728361, - 2018: 23795012, - }, - { - fullName: 'Orlando International Airport', - code: 'MCO', - 2022: 24469733, - 2021: 19618838, - 2020: 10467728, - 2019: 24562271, - 2018: 23202480, - }, - { - fullName: 'Miami International Airport', - code: 'MIA', - 2022: 23949892, - 2021: 17500096, - 2020: 8786007, - 2019: 21421031, - 2018: 21021640, - }, - { - fullName: 'Charlotte Douglas International Airport', - code: 'CLT', - 2022: 23100300, - 2021: 20900875, - 2020: 12952869, - 2019: 24199688, - 2018: 22281949, - }, - { - fullName: 'Seattle–Tacoma International Airport', - code: 'SEA', - 2022: 22157862, - 2021: 17430195, - 2020: 9462411, - 2019: 25001762, - 2018: 24024908, - }, - { - fullName: 'Phoenix Sky Harbor International Airport', - code: 'PHX', - 2022: 21852586, - 2021: 18940287, - 2020: 10531436, - 2019: 22433552, - 2018: 21622580, - }, - { - fullName: 'Newark Liberty International Airport', - code: 'EWR', - 2022: 21572147, - 2021: 14514049, - 2020: 7985474, - 2019: 23160763, - 2018: 22797602, - }, - { - fullName: 'San Francisco International Airport', - code: 'SFO', - 2022: 20411420, - 2021: 11725347, - 2020: 7745057, - 2019: 27779230, - 2018: 27790717, - }, - { - fullName: 'George Bush Intercontinental Airport', - code: 'IAH', - 2022: 19814052, - 2021: 16242821, - 2020: 8682558, - 2019: 21905309, - 2018: 21157398, - }, - { - fullName: 'Logan International Airport', - code: 'BOS', - 2022: 17443775, - 2021: 10909817, - 2020: 6035452, - 2019: 20699377, - 2018: 20006521, - }, - { - fullName: 'Fort Lauderdale–Hollywood International Airport', - code: 'FLL', - 2022: 15370165, - 2021: 13598994, - 2020: 8015744, - 2019: 17950989, - 2018: 17612331, - }, - { - fullName: 'Minneapolis–Saint Paul International Airport', - code: 'MSP', - 2022: 15242089, - 2021: 12211409, - 2020: 7069720, - 2019: 19192917, - 2018: 18361942, - }, - { - fullName: 'LaGuardia Airport', - code: 'LGA', - 2022: 14367463, - 2021: 7827307, - 2020: 4147116, - 2019: 15393601, - 2018: 15058501, - }, - { - fullName: 'Detroit Metropolitan Airport', - code: 'DTW', - 2022: 13751197, - 2021: 11517696, - 2020: 6822324, - 2019: 18143040, - 2018: 17436837, - }, -]; diff --git a/docs/data/charts/axis-customization/TickLabelImage.js b/docs/data/charts/axis-customization/TickLabelImage.js deleted file mode 100644 index 7c8fce5ef1420..0000000000000 --- a/docs/data/charts/axis-customization/TickLabelImage.js +++ /dev/null @@ -1,79 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; - -import { iconMap } from '../dataset/company.icons'; - -function CustomTick(props) { - const { x, y, text } = props; - const logo = iconMap[text]; - - return ( - - -
- - {logo && ( - {text} - )} - -
-
-
- ); -} - -export default function TickLabelImage() { - return ( - - - - - - - - ); -} diff --git a/docs/data/charts/axis-customization/axis-customization.md b/docs/data/charts/axis-customization/axis-customization.md index 52f4aa7c1104d..9d61227ebed75 100644 --- a/docs/data/charts/axis-customization/axis-customization.md +++ b/docs/data/charts/axis-customization/axis-customization.md @@ -17,7 +17,7 @@ This is useful when you have multiple axes and want to style them differently. In the example below, the revenue axis label is styled with a teal color and the profit axis label with a blue color to match their respective series. -{{"demo": "AxisIdStyling.js"}} +{{"component": "file://./demos/axis-id-styling/index.ts"}} ## Styling grouped axes @@ -27,14 +27,14 @@ You can customize the tick size for each [grouped axis](/x/react-charts/axis/#gr The `tickSize` also affects the tick label position. Each item in the array corresponds to a group defined in the `getValue()` function. -{{"demo": "GroupedAxesTickSize.js", "defaultCodeOpen": false}} +{{"component": "file://./demos/grouped-axes-tick-size/index.ts", "collapseToEmpty": true}} ### Selecting groups To target a specific group, use the `data-group-index` attribute as a selector. The example below has a yellow tick color for the last group and blue text for the first group. -{{"demo": "GroupedAxesStyling.js", "defaultCodeOpen": false}} +{{"component": "file://./demos/grouped-axes-styling/index.ts", "collapseToEmpty": true}} ## Fixing tick label overflow issues @@ -45,13 +45,13 @@ In the demo below, the size of the x- and y-axes is modified to increase the spa The first and last tick labels may bleed into the margin, and if that margin is not enough to display the label, it might be clipped. To avoid this, you can use the `margin` prop to increase the space between the chart and the edge of the container. -{{"demo": "MarginAndLabelPosition.js"}} +{{"component": "file://./demos/margin-and-label-position/index.ts"}} ## Passing props The demo below illustrates all of the props available to customize axis rendering: -{{"demo": "AxisCustomization.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/axis-customization/index.ts", "hideToolbar": true, "bg": "playground"}} ## Text customization @@ -60,7 +60,7 @@ To customize the text elements (tick labels and axis labels), use the `tickLabel When not set, the default values for the `textAnchor` and `dominantBaseline` properties depend on the value of the `angle` property. You can test how these values behave and relate to one another in the demo below: -{{"demo": "AxisTextCustomization.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/axis-text-customization/index.ts", "hideToolbar": true, "bg": "playground"}} ## Adding tick label icons @@ -68,7 +68,7 @@ A `foreignObject` element can be used to render non-SVG elements inside SVGs. Yo Bear in mind that using `foreignObject` might prevent charts from being [exported](/x/react-charts/export/). -{{"demo": "TickLabelImage.js"}} +{{"component": "file://./demos/tick-label-image/index.ts"}} ## Custom axis rendering @@ -77,4 +77,4 @@ For more information about how to create custom axes, refer to the [composition The same technique can move the tick labels inside the plot, as shown in [Labels on the grid](/x/react-charts/axis-ticks/#labels-on-the-grid). -{{"demo": "CustomAxisTicks.js"}} +{{"component": "file://./demos/custom-axis-ticks/index.ts"}} diff --git a/docs/data/charts/axis-customization/AxisCustomization.tsx b/docs/data/charts/axis-customization/demos/axis-customization/AxisCustomization.tsx similarity index 97% rename from docs/data/charts/axis-customization/AxisCustomization.tsx rename to docs/data/charts/axis-customization/demos/axis-customization/AxisCustomization.tsx index 41f0fed1d2870..24e33998a7339 100644 --- a/docs/data/charts/axis-customization/AxisCustomization.tsx +++ b/docs/data/charts/axis-customization/demos/axis-customization/AxisCustomization.tsx @@ -19,6 +19,7 @@ const defaultXAxis = { }; export default function AxisCustomization() { return ( + // @focus-start @padding 2 `} /> + // @focus-end ); } diff --git a/docs/data/charts/axis-customization/demos/axis-customization/client.ts b/docs/data/charts/axis-customization/demos/axis-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/axis-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/axis-customization/index.ts b/docs/data/charts/axis-customization/demos/axis-customization/index.ts new file mode 100644 index 0000000000000..bc2d2c1ef597b --- /dev/null +++ b/docs/data/charts/axis-customization/demos/axis-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisCustomization from './AxisCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisCustomization, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/AxisIdStyling.tsx b/docs/data/charts/axis-customization/demos/axis-id-styling/AxisIdStyling.tsx similarity index 87% rename from docs/data/charts/axis-customization/AxisIdStyling.tsx rename to docs/data/charts/axis-customization/demos/axis-id-styling/AxisIdStyling.tsx index fb7e27433abac..297e81fe42314 100644 --- a/docs/data/charts/axis-customization/AxisIdStyling.tsx +++ b/docs/data/charts/axis-customization/demos/axis-id-styling/AxisIdStyling.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; -import { LineChart, type LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; import { axisClasses } from '@mui/x-charts/ChartsAxis'; const years = [2010, 2011, 2012, 2013, 2014, 2015]; @@ -21,6 +22,7 @@ const chartConfig: LineChartProps = { export default function AxisIdStyling() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis-customization/demos/axis-id-styling/client.ts b/docs/data/charts/axis-customization/demos/axis-id-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/axis-id-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/axis-id-styling/index.ts b/docs/data/charts/axis-customization/demos/axis-id-styling/index.ts new file mode 100644 index 0000000000000..8ff8658d97cc7 --- /dev/null +++ b/docs/data/charts/axis-customization/demos/axis-id-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisIdStyling from './AxisIdStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisIdStyling, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/AxisTextCustomization.tsx b/docs/data/charts/axis-customization/demos/axis-text-customization/AxisTextCustomization.tsx similarity index 95% rename from docs/data/charts/axis-customization/AxisTextCustomization.tsx rename to docs/data/charts/axis-customization/demos/axis-text-customization/AxisTextCustomization.tsx index 2c448d39d48be..4e1343dd21557 100644 --- a/docs/data/charts/axis-customization/AxisTextCustomization.tsx +++ b/docs/data/charts/axis-customization/demos/axis-text-customization/AxisTextCustomization.tsx @@ -1,7 +1,7 @@ import Box from '@mui/material/Box'; import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { dataset, valueFormatter } from '../../../dataset/weather'; const chartSetting = { height: 300, @@ -9,6 +9,7 @@ const chartSetting = { export default function AxisTextCustomization() { return ( + // @focus-start @padding 2 `} /> + // @focus-end ); } diff --git a/docs/data/charts/axis-customization/demos/axis-text-customization/client.ts b/docs/data/charts/axis-customization/demos/axis-text-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/axis-text-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/axis-text-customization/index.ts b/docs/data/charts/axis-customization/demos/axis-text-customization/index.ts new file mode 100644 index 0000000000000..9319285b1c825 --- /dev/null +++ b/docs/data/charts/axis-customization/demos/axis-text-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisTextCustomization from './AxisTextCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisTextCustomization, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/CustomAxisTicks.tsx b/docs/data/charts/axis-customization/demos/custom-axis-ticks/CustomAxisTicks.tsx similarity index 91% rename from docs/data/charts/axis-customization/CustomAxisTicks.tsx rename to docs/data/charts/axis-customization/demos/custom-axis-ticks/CustomAxisTicks.tsx index 9e4f1b6002d4e..cbf992f4ae85c 100644 --- a/docs/data/charts/axis-customization/CustomAxisTicks.tsx +++ b/docs/data/charts/axis-customization/demos/custom-axis-ticks/CustomAxisTicks.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import { useTheme } from '@mui/material/styles'; -import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; -import { ChartsYAxisProps } from '@mui/x-charts/models'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; +import type { ChartsYAxisProps } from '@mui/x-charts/models'; import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; import { useYAxes, useYAxisCoordinates, useYAxisTicks } from '@mui/x-charts/hooks'; @@ -28,6 +29,7 @@ const chartSetting = { } satisfies Partial; export default function CustomAxisTicks() { + // @focus-start @padding 1 const theme = useTheme(); const seriesColor = rainbowSurgePalette(theme.palette.mode)[ theme.palette.mode === 'dark' ? 0 : 1 @@ -40,6 +42,7 @@ export default function CustomAxisTicks() { series={[{ data, color: seriesColor }]} /> ); + // @focus-end } function YAxis(props: ChartsYAxisProps) { diff --git a/docs/data/charts/axis-customization/demos/custom-axis-ticks/client.ts b/docs/data/charts/axis-customization/demos/custom-axis-ticks/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/custom-axis-ticks/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/custom-axis-ticks/index.ts b/docs/data/charts/axis-customization/demos/custom-axis-ticks/index.ts new file mode 100644 index 0000000000000..a3637e643e3c0 --- /dev/null +++ b/docs/data/charts/axis-customization/demos/custom-axis-ticks/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomAxisTicks from './CustomAxisTicks'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomAxisTicks, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/GroupedAxesStyling.tsx b/docs/data/charts/axis-customization/demos/grouped-axes-styling/GroupedAxesStyling.tsx similarity index 97% rename from docs/data/charts/axis-customization/GroupedAxesStyling.tsx rename to docs/data/charts/axis-customization/demos/grouped-axes-styling/GroupedAxesStyling.tsx index 4a18ed2fa8dbe..213295c084add 100644 --- a/docs/data/charts/axis-customization/GroupedAxesStyling.tsx +++ b/docs/data/charts/axis-customization/demos/grouped-axes-styling/GroupedAxesStyling.tsx @@ -3,6 +3,7 @@ import { axisClasses } from '@mui/x-charts/ChartsAxis'; export default function GroupedAxesStyling() { return ( + // @focus-start @padding 2 + // @focus-end ); } const getMonth = (date: Date) => diff --git a/docs/data/charts/axis-customization/demos/grouped-axes-styling/client.ts b/docs/data/charts/axis-customization/demos/grouped-axes-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/grouped-axes-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/grouped-axes-styling/index.ts b/docs/data/charts/axis-customization/demos/grouped-axes-styling/index.ts new file mode 100644 index 0000000000000..0cd0cf263d6df --- /dev/null +++ b/docs/data/charts/axis-customization/demos/grouped-axes-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GroupedAxesStyling from './GroupedAxesStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GroupedAxesStyling, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/GroupedAxesTickSize.tsx b/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/GroupedAxesTickSize.tsx similarity index 97% rename from docs/data/charts/axis-customization/GroupedAxesTickSize.tsx rename to docs/data/charts/axis-customization/demos/grouped-axes-tick-size/GroupedAxesTickSize.tsx index 497a268e8dad3..8f0dc02e153c2 100644 --- a/docs/data/charts/axis-customization/GroupedAxesTickSize.tsx +++ b/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/GroupedAxesTickSize.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function GroupedAxesTickSize() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/client.ts b/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/index.ts b/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/index.ts new file mode 100644 index 0000000000000..fcba9c0779194 --- /dev/null +++ b/docs/data/charts/axis-customization/demos/grouped-axes-tick-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GroupedAxesTickSize from './GroupedAxesTickSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GroupedAxesTickSize, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/MarginAndLabelPosition.tsx b/docs/data/charts/axis-customization/demos/margin-and-label-position/MarginAndLabelPosition.tsx similarity index 99% rename from docs/data/charts/axis-customization/MarginAndLabelPosition.tsx rename to docs/data/charts/axis-customization/demos/margin-and-label-position/MarginAndLabelPosition.tsx index 5a616b96964b2..e17dfd443eb68 100644 --- a/docs/data/charts/axis-customization/MarginAndLabelPosition.tsx +++ b/docs/data/charts/axis-customization/demos/margin-and-label-position/MarginAndLabelPosition.tsx @@ -6,6 +6,7 @@ import Checkbox from '@mui/material/Checkbox'; import { BarChart } from '@mui/x-charts/BarChart'; export default function MarginAndLabelPosition() { + // @focus-start @padding 1 const [fixMargin, setFixMargin] = React.useState(true); return ( @@ -55,6 +56,7 @@ export default function MarginAndLabelPosition() { /> ); + // @focus-end } const usAirportPassengers = [ diff --git a/docs/data/charts/axis-customization/demos/margin-and-label-position/client.ts b/docs/data/charts/axis-customization/demos/margin-and-label-position/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/margin-and-label-position/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/margin-and-label-position/index.ts b/docs/data/charts/axis-customization/demos/margin-and-label-position/index.ts new file mode 100644 index 0000000000000..3f8624ac1c74b --- /dev/null +++ b/docs/data/charts/axis-customization/demos/margin-and-label-position/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MarginAndLabelPosition from './MarginAndLabelPosition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MarginAndLabelPosition, { ClientProvider }); diff --git a/docs/data/charts/axis-customization/TickLabelImage.tsx b/docs/data/charts/axis-customization/demos/tick-label-image/TickLabelImage.tsx similarity index 92% rename from docs/data/charts/axis-customization/TickLabelImage.tsx rename to docs/data/charts/axis-customization/demos/tick-label-image/TickLabelImage.tsx index 7f5eb6150302a..17e1557ce4128 100644 --- a/docs/data/charts/axis-customization/TickLabelImage.tsx +++ b/docs/data/charts/axis-customization/demos/tick-label-image/TickLabelImage.tsx @@ -4,8 +4,8 @@ import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; import { BarPlot } from '@mui/x-charts/BarChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsTextProps } from '@mui/x-charts/ChartsText'; -import { iconMap } from '../dataset/company.icons'; +import type { ChartsTextProps } from '@mui/x-charts/ChartsText'; +import { iconMap } from '../../../dataset/company.icons.ts'; function CustomTick(props: ChartsTextProps) { const { x, y, text } = props; @@ -52,6 +52,7 @@ function CustomTick(props: ChartsTextProps) { export default function TickLabelImage() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis-customization/demos/tick-label-image/client.ts b/docs/data/charts/axis-customization/demos/tick-label-image/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-customization/demos/tick-label-image/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-customization/demos/tick-label-image/index.ts b/docs/data/charts/axis-customization/demos/tick-label-image/index.ts new file mode 100644 index 0000000000000..70ec26f16bcc1 --- /dev/null +++ b/docs/data/charts/axis-customization/demos/tick-label-image/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TickLabelImage from './TickLabelImage'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TickLabelImage, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/CustomTickFrequency.js b/docs/data/charts/axis-ticks/CustomTickFrequency.js deleted file mode 100644 index 9342ef1da00ac..0000000000000 --- a/docs/data/charts/axis-ticks/CustomTickFrequency.js +++ /dev/null @@ -1,74 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; - -import { tickFrequencies } from '@mui/x-charts/utils'; -import alphabetStock from '../dataset/GOOGL.json'; - -export default function CustomTickFrequency() { - return ( - - - - ); -} - -const quarterFormat = (d) => `Q${Math.floor(d.getMonth() / 3) + 1}`; -const weekFormat = (d) => `W${getWeekNumber(d)}`; - -const zoom = { minSpan: 1, filterMode: 'discard' }; - -const xAxis = { - id: 'date', - data: alphabetStock.map((day) => new Date(day.date)), - scaleType: 'band', - zoom, - valueFormatter: (value) => value.toLocaleDateString(), - height: 30, - tickNumber: 15, -}; - -const barSettings = { - height: 200, - hideLegend: true, - margin: { bottom: 5 }, - series: [ - { - type: 'bar', - yAxisId: 'volume', - label: 'Volume', - color: 'lightgray', - data: alphabetStock.map((day) => day.volume), - }, - ], - yAxis: [ - { - id: 'volume', - scaleType: 'linear', - position: 'left', - valueFormatter: (value) => `${(value / 1000000).toLocaleString()}M`, - width: 55, - }, - ], - grid: { vertical: true, horizontal: true }, -}; - -function getWeekNumber(date) { - const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); - const dayNum = d.getUTCDay() || 7; - d.setUTCDate(d.getUTCDate() + 4 - dayNum); - const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); - return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7); -} diff --git a/docs/data/charts/axis-ticks/CustomTickFrequency.tsx.preview b/docs/data/charts/axis-ticks/CustomTickFrequency.tsx.preview deleted file mode 100644 index 1713cc9daf976..0000000000000 --- a/docs/data/charts/axis-ticks/CustomTickFrequency.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis-ticks/GridDemo.js b/docs/data/charts/axis-ticks/GridDemo.js deleted file mode 100644 index 1d30b28f9fc7d..0000000000000 --- a/docs/data/charts/axis-ticks/GridDemo.js +++ /dev/null @@ -1,23 +0,0 @@ -import { chartsGridClasses } from '@mui/x-charts/ChartsGrid'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const chartSetting = { - yAxis: [{ label: 'rainfall (mm)', width: 60 }], - height: 300, -}; - -export default function GridDemo() { - return ( - - ); -} diff --git a/docs/data/charts/axis-ticks/GridDemo.tsx b/docs/data/charts/axis-ticks/GridDemo.tsx deleted file mode 100644 index 1d30b28f9fc7d..0000000000000 --- a/docs/data/charts/axis-ticks/GridDemo.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { chartsGridClasses } from '@mui/x-charts/ChartsGrid'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const chartSetting = { - yAxis: [{ label: 'rainfall (mm)', width: 60 }], - height: 300, -}; - -export default function GridDemo() { - return ( - - ); -} diff --git a/docs/data/charts/axis-ticks/GridDemo.tsx.preview b/docs/data/charts/axis-ticks/GridDemo.tsx.preview deleted file mode 100644 index 0790666ba08eb..0000000000000 --- a/docs/data/charts/axis-ticks/GridDemo.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis-ticks/GridLabels.js b/docs/data/charts/axis-ticks/GridLabels.js deleted file mode 100644 index e56f13df32020..0000000000000 --- a/docs/data/charts/axis-ticks/GridLabels.js +++ /dev/null @@ -1,63 +0,0 @@ -import * as React from 'react'; -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; -import { chartsGridClasses } from '@mui/x-charts/ChartsGrid'; - -import { useDrawingArea, useYAxes, useYAxisTicks } from '@mui/x-charts/hooks'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const LABEL_GAP = 4; - -function GridLabelsYAxis(props) { - const { yAxisIds } = useYAxes(); - const axisId = props.axisId ?? yAxisIds[0]; - - const ticks = useYAxisTicks(axisId); - const { left } = useDrawingArea(); - - return ( - - {ticks.map((tick) => ( - - {tick.formattedValue} - - ))} - - ); -} - -export default function GridLabels() { - return ( - ({ - [`& .${chartsGridClasses.horizontalLine}`]: { strokeDasharray: '4 4' }, - // A lighter area keeps the grid and its labels visible behind the data. - [`& .${lineClasses.area}`]: { fillOpacity: 0.3 }, - '& .grid-label': { - fill: (theme.vars || theme).palette.text.secondary, - fontSize: 12, - // Outline the text so that it stays readable over the area. - stroke: (theme.vars || theme).palette.background.paper, - strokeWidth: 3, - paintOrder: 'stroke', - }, - })} - /> - ); -} diff --git a/docs/data/charts/axis-ticks/OrdinalTickPlacement.js b/docs/data/charts/axis-ticks/OrdinalTickPlacement.js deleted file mode 100644 index ead8e297128c6..0000000000000 --- a/docs/data/charts/axis-ticks/OrdinalTickPlacement.js +++ /dev/null @@ -1,83 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; - -import alphabetStock from '../dataset/GOOGL.json'; -import SelectTimeFrequency from './SelectTimeFrequency'; - -const tickFrequencies = [ - 'years', - 'quarterly', - 'months', - 'biweekly', - 'weeks', - 'days', -]; - -export default function OrdinalTickPlacement() { - const [ordinalTimeTicks, setOrdinalTimeTicks] = React.useState(defaultTicks); - const [tickNumber, setTickNumber] = React.useState(5); - - return ( - - - ordinalTimeTicks[frequency], - ), - }, - ]} - /> - - ); -} - -const defaultTicks = Object.fromEntries( - tickFrequencies.map((frequency) => [frequency, true]), -); - -const zoom = { minSpan: 1, filterMode: 'discard' }; - -const xAxis = { - id: 'date', - data: alphabetStock.map((day) => new Date(day.date)), - scaleType: 'band', - zoom, - valueFormatter: (value) => value.toLocaleDateString(), - height: 30, -}; - -const barSettings = { - height: 200, - hideLegend: true, - margin: { bottom: 5 }, - series: [ - { - type: 'bar', - yAxisId: 'volume', - label: 'Volume', - color: 'lightgray', - data: alphabetStock.map((day) => day.volume), - }, - ], - yAxis: [ - { - id: 'volume', - scaleType: 'linear', - position: 'left', - valueFormatter: (value) => `${(value / 1000000).toLocaleString()}M`, - width: 55, - }, - ], -}; diff --git a/docs/data/charts/axis-ticks/SelectTimeFrequency.tsx b/docs/data/charts/axis-ticks/SelectTimeFrequency.tsx index 0abcd0e5290c1..25d6cd2442a22 100644 --- a/docs/data/charts/axis-ticks/SelectTimeFrequency.tsx +++ b/docs/data/charts/axis-ticks/SelectTimeFrequency.tsx @@ -5,7 +5,7 @@ import FormLabel from '@mui/material/FormLabel'; import FormGroup from '@mui/material/FormGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Slider from '@mui/material/Slider'; -import { TickFrequency } from '@mui/x-charts/models'; +import type { TickFrequency } from '@mui/x-charts/models'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; diff --git a/docs/data/charts/axis-ticks/TickLabelPosition.js b/docs/data/charts/axis-ticks/TickLabelPosition.js deleted file mode 100644 index 6d404c108af3b..0000000000000 --- a/docs/data/charts/axis-ticks/TickLabelPosition.js +++ /dev/null @@ -1,96 +0,0 @@ -import Box from '@mui/material/Box'; - -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function TickLabelPosition() { - return ( - - [0, 12].includes(time.getHours()), - tickLabelInterval: (time) => time.getHours() === 0, - position: 'bottom', - }, - { - ...xAxisCommon, - id: 'topAxis', - scaleType: 'point', - position: 'top', - }, - ]} - yAxis={[{ position: 'none' }]} - {...config} - /> - - ); -} - -const valueFormatter = (date) => - date.toLocaleDateString('fr-FR', { - month: '2-digit', - day: '2-digit', - }); - -const timeData = [ - new Date(2023, 7, 31), - new Date(2023, 7, 31, 3), - new Date(2023, 7, 31, 6), - new Date(2023, 7, 31, 9), - new Date(2023, 7, 31, 12), - new Date(2023, 7, 31, 15), - new Date(2023, 7, 31, 18), - new Date(2023, 8, 1), - new Date(2023, 8, 1, 3), - new Date(2023, 8, 1, 6), - new Date(2023, 8, 1, 9), - new Date(2023, 8, 1, 12), - new Date(2023, 8, 1, 15), - new Date(2023, 8, 1, 18), - new Date(2023, 8, 2), - new Date(2023, 8, 2, 3), - new Date(2023, 8, 2, 6), - new Date(2023, 8, 2, 9), - new Date(2023, 8, 2, 12), - new Date(2023, 8, 2, 15), - new Date(2023, 8, 2, 18), - new Date(2023, 8, 3), - new Date(2023, 8, 3, 3), - new Date(2023, 8, 3, 6), - new Date(2023, 8, 3, 9), - new Date(2023, 8, 3, 12), - new Date(2023, 8, 3, 15), - new Date(2023, 8, 3, 18), - new Date(2023, 8, 4), -]; - -const y1 = [ - 5, 5.5, 5.3, 4.9, 5, 6.2, 8.9, 10, 15, 30, 80, 90, 94, 93, 85, 86, 75, 70, 68, 50, - 20, 30, 35, 28, 25, 27, 30, 28, 25, -]; - -const y2 = [ - 90, 93, 89, 84, 85, 83, 73, 70, 63, 32, 30, 25, 18, 19, 23, 30, 32, 36, 40, 40, 42, - 45, 46, 42, 39, 40, 41, 43, 50, -]; - -const showMark = (params) => { - const { position } = params; - return position.getHours() === 0; -}; - -const config = { - series: [ - { data: y1, showMark }, - { data: y2, showMark }, - ], - height: 300, -}; -const xAxisCommon = { - data: timeData, - scaleType: 'time', - valueFormatter, -}; diff --git a/docs/data/charts/axis-ticks/TickNumber.js b/docs/data/charts/axis-ticks/TickNumber.js deleted file mode 100644 index 33403a8e9a4cc..0000000000000 --- a/docs/data/charts/axis-ticks/TickNumber.js +++ /dev/null @@ -1,59 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const timeData = [ - new Date(2023, 7, 31), - new Date(2023, 7, 31, 12), - new Date(2023, 8, 1), - new Date(2023, 8, 1, 12), - new Date(2023, 8, 2), - new Date(2023, 8, 2, 12), - new Date(2023, 8, 3), - new Date(2023, 8, 3, 12), - new Date(2023, 8, 4), -]; - -const y1 = [5, 5, 10, 90, 85, 70, 30, 25, 25]; -const y2 = [90, 85, 70, 25, 23, 40, 45, 40, 50]; - -const valueFormatter = (date) => - date.getHours() === 0 - ? date.toLocaleDateString('fr-FR', { - month: '2-digit', - day: '2-digit', - }) - : date.toLocaleTimeString('fr-FR', { - hour: '2-digit', - }); - -const config = { - series: [{ data: y1 }, { data: y2 }], - height: 300, -}; -const xAxisCommon = { - data: timeData, - scaleType: 'time', - valueFormatter, -}; -export default function TickNumber() { - return ( - - - - ); -} diff --git a/docs/data/charts/axis-ticks/TickNumber.tsx.preview b/docs/data/charts/axis-ticks/TickNumber.tsx.preview deleted file mode 100644 index 74a9c0907e28c..0000000000000 --- a/docs/data/charts/axis-ticks/TickNumber.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis-ticks/TickPosition.js b/docs/data/charts/axis-ticks/TickPosition.js deleted file mode 100644 index 68baba4f4cf7b..0000000000000 --- a/docs/data/charts/axis-ticks/TickPosition.js +++ /dev/null @@ -1,93 +0,0 @@ -import Box from '@mui/material/Box'; - -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function TickPosition() { - return ( - - time.getHours() === 0, - position: 'bottom', - }, - { - ...xAxisCommon, - scaleType: 'point', - position: 'top', - }, - ]} - {...config} - /> - - ); -} - -const valueFormatter = (date) => - date.toLocaleDateString('fr-FR', { - month: '2-digit', - day: '2-digit', - }); - -const timeData = [ - new Date(2023, 7, 31), - new Date(2023, 7, 31, 3), - new Date(2023, 7, 31, 6), - new Date(2023, 7, 31, 9), - new Date(2023, 7, 31, 12), - new Date(2023, 7, 31, 15), - new Date(2023, 7, 31, 18), - new Date(2023, 8, 1), - new Date(2023, 8, 1, 3), - new Date(2023, 8, 1, 6), - new Date(2023, 8, 1, 9), - new Date(2023, 8, 1, 12), - new Date(2023, 8, 1, 15), - new Date(2023, 8, 1, 18), - new Date(2023, 8, 2), - new Date(2023, 8, 2, 3), - new Date(2023, 8, 2, 6), - new Date(2023, 8, 2, 9), - new Date(2023, 8, 2, 12), - new Date(2023, 8, 2, 15), - new Date(2023, 8, 2, 18), - new Date(2023, 8, 3), - new Date(2023, 8, 3, 3), - new Date(2023, 8, 3, 6), - new Date(2023, 8, 3, 9), - new Date(2023, 8, 3, 12), - new Date(2023, 8, 3, 15), - new Date(2023, 8, 3, 18), - new Date(2023, 8, 4), -]; - -const y1 = [ - 5, 5.5, 5.3, 4.9, 5, 6.2, 8.9, 10, 15, 30, 80, 90, 94, 93, 85, 86, 75, 70, 68, 50, - 20, 30, 35, 28, 25, 27, 30, 28, 25, -]; - -const y2 = [ - 90, 93, 89, 84, 85, 83, 73, 70, 63, 32, 30, 25, 18, 19, 23, 30, 32, 36, 40, 40, 42, - 45, 46, 42, 39, 40, 41, 43, 50, -]; - -const showMark = (params) => { - const { position } = params; - return position.getHours() === 0; -}; - -const config = { - series: [ - { data: y1, showMark }, - { data: y2, showMark }, - ], - height: 300, - yAxis: [{ position: 'none' }], -}; -const xAxisCommon = { - data: timeData, - scaleType: 'time', - valueFormatter, -}; diff --git a/docs/data/charts/axis-ticks/TickPosition.tsx.preview b/docs/data/charts/axis-ticks/TickPosition.tsx.preview deleted file mode 100644 index 29e40c659c5db..0000000000000 --- a/docs/data/charts/axis-ticks/TickPosition.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - time.getHours() === 0, - position: 'bottom', - }, - { - ...xAxisCommon, - scaleType: 'point', - position: 'top', - }, - ]} - {...config} -/> \ No newline at end of file diff --git a/docs/data/charts/axis-ticks/TickSpacing.js b/docs/data/charts/axis-ticks/TickSpacing.js deleted file mode 100644 index 3b2c004b3461b..0000000000000 --- a/docs/data/charts/axis-ticks/TickSpacing.js +++ /dev/null @@ -1,52 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Slider from '@mui/material/Slider'; -import Typography from '@mui/material/Typography'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import data from '../dataset/sp500-intraday.json'; - -const tickLabelDateFormatter = new Intl.DateTimeFormat(undefined, { - month: 'short', - day: 'numeric', -}); - -export default function TickSpacing() { - const [tickSpacing, setTickSpacing] = React.useState(50); - - return ( - - - - Tick Spacing - - setTickSpacing(value)} - valueLabelDisplay="auto" - min={0} - max={100} - step={5} - sx={{ mt: 2 }} - aria-labelledby="tickSpacing" - /> - - new Date(Date.parse(d.date))), - valueFormatter: (v) => tickLabelDateFormatter.format(v), - tickSpacing, - tickPlacement: 'middle', - zoom: true, - }, - ]} - series={[{ data: data.map((d) => d.close), label: 'Close' }]} - height={300} - /> - - ); -} diff --git a/docs/data/charts/axis-ticks/axis-ticks.md b/docs/data/charts/axis-ticks/axis-ticks.md index 051d5b7a16b59..25bf01fa2afc9 100644 --- a/docs/data/charts/axis-ticks/axis-ticks.md +++ b/docs/data/charts/axis-ticks/axis-ticks.md @@ -25,7 +25,7 @@ If you use composition you can pass these as props to the `` compo In this Demo the horizontal grid is customized with some CSS selectors. -{{"demo": "GridDemo.js", "defaultCodeOpen": false}} +{{"component": "file://./demos/grid-demo/index.ts", "collapseToEmpty": true}} ### Labels on the grid @@ -39,7 +39,7 @@ Together, they let you place one label above each grid line. Setting `position: 'none'` also frees the space, but the axis is then removed from the chart, and the `yAxis` slot is no longer rendered. ::: -{{"demo": "GridLabels.js"}} +{{"component": "file://./demos/grid-labels/index.ts"}} ## Tick position @@ -58,7 +58,7 @@ To better control how the ticks render, you can also provide `tickMinStep` and ` In the demo below, the top axis has a `tickMinStep` of half a day, and the bottom axis has a `tickMinStep` of a full day. -{{"demo": "TickNumber.js"}} +{{"component": "file://./demos/tick-number/index.ts"}} ### Tick spacing @@ -68,7 +68,7 @@ Having a minimum space between ticks improves the readability of the axis and ca This property defaults to 0 and is only available for ordinal axes, that is, axes with a band or point scale. -{{"demo": "TickSpacing.js"}} +{{"component": "file://./demos/tick-spacing/index.ts"}} ### Fixed tick position @@ -81,7 +81,7 @@ In the demo below, both axes are set to `scaleType='point'`. The top axis demonstrates the default behavior with a tick for each point. The bottom axis uses a filtering function to only display a tick at the beginning of a day. -{{"demo": "TickPosition.js"}} +{{"component": "file://./demos/tick-position/index.ts"}} ### Filtering tick labels @@ -99,7 +99,7 @@ You can override this behavior with `tickLabelInterval: () => true` which forces In the example below, the top axis is a reference for the default behavior: tick labels don't overflow. At the bottom, you can see one tick for the beginning and the middle of the day, but the tick label is only displayed for the beginning of the day. -{{"demo": "TickLabelPosition.js"}} +{{"component": "file://./demos/tick-label-position/index.ts"}} ### Ordinal tick management @@ -117,7 +117,7 @@ When using `ordinalTimeTicks` the property `tickPlacement` is ignored, and compu In the following demo, you can modify the `ordinalTimeTicks` based on built-in frequencies and see how it impacts zoom behavior. -{{"demo": "OrdinalTickPlacement.js"}} +{{"component": "file://./demos/ordinal-tick-placement/index.ts"}} The `TickFrequencyDefinition` is an object made of following properties: @@ -129,4 +129,4 @@ The built-in frequency definitions are exported as `tickFrequencies` from `'@mui In the following demo, we use the `tickFrequencies` to display quarters and weeks with different labels. -{{"demo": "CustomTickFrequency.js"}} +{{"component": "file://./demos/custom-tick-frequency/index.ts"}} diff --git a/docs/data/charts/axis-ticks/CustomTickFrequency.tsx b/docs/data/charts/axis-ticks/demos/custom-tick-frequency/CustomTickFrequency.tsx similarity index 90% rename from docs/data/charts/axis-ticks/CustomTickFrequency.tsx rename to docs/data/charts/axis-ticks/demos/custom-tick-frequency/CustomTickFrequency.tsx index a2e25a16bf36d..f3eff1fb386b4 100644 --- a/docs/data/charts/axis-ticks/CustomTickFrequency.tsx +++ b/docs/data/charts/axis-ticks/demos/custom-tick-frequency/CustomTickFrequency.tsx @@ -1,13 +1,19 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { BarSeriesType, XAxis, YAxis, ZoomOptions } from '@mui/x-charts-pro/models'; +import type { + BarSeriesType, + XAxis, + YAxis, + ZoomOptions, +} from '@mui/x-charts-pro/models'; import { tickFrequencies } from '@mui/x-charts/utils'; -import alphabetStock from '../dataset/GOOGL.json'; +import alphabetStock from '../../../dataset/GOOGL.json'; export default function CustomTickFrequency() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis-ticks/demos/custom-tick-frequency/client.ts b/docs/data/charts/axis-ticks/demos/custom-tick-frequency/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/custom-tick-frequency/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/custom-tick-frequency/index.ts b/docs/data/charts/axis-ticks/demos/custom-tick-frequency/index.ts new file mode 100644 index 0000000000000..8b870817376b9 --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/custom-tick-frequency/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomTickFrequency from './CustomTickFrequency'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomTickFrequency, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/demos/grid-demo/GridDemo.tsx b/docs/data/charts/axis-ticks/demos/grid-demo/GridDemo.tsx new file mode 100644 index 0000000000000..f2bafc1b9adb6 --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/grid-demo/GridDemo.tsx @@ -0,0 +1,25 @@ +import { chartsGridClasses } from '@mui/x-charts/ChartsGrid'; +import { BarChart } from '@mui/x-charts/BarChart'; +import { dataset, valueFormatter } from '../../../dataset/weather'; + +const chartSetting = { + yAxis: [{ label: 'rainfall (mm)', width: 60 }], + height: 300, +}; + +export default function GridDemo() { + return ( + // @focus-start @padding 2 + + // @focus-end + ); +} diff --git a/docs/data/charts/axis-ticks/demos/grid-demo/client.ts b/docs/data/charts/axis-ticks/demos/grid-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/grid-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/grid-demo/index.ts b/docs/data/charts/axis-ticks/demos/grid-demo/index.ts new file mode 100644 index 0000000000000..7686107ff7e74 --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/grid-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GridDemo from './GridDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GridDemo, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/GridLabels.tsx b/docs/data/charts/axis-ticks/demos/grid-labels/GridLabels.tsx similarity index 91% rename from docs/data/charts/axis-ticks/GridLabels.tsx rename to docs/data/charts/axis-ticks/demos/grid-labels/GridLabels.tsx index 6444082a7ed2c..4e57eef2474bd 100644 --- a/docs/data/charts/axis-ticks/GridLabels.tsx +++ b/docs/data/charts/axis-ticks/demos/grid-labels/GridLabels.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; import { chartsGridClasses } from '@mui/x-charts/ChartsGrid'; -import { ChartsYAxisProps } from '@mui/x-charts/models'; +import type { ChartsYAxisProps } from '@mui/x-charts/models'; import { useDrawingArea, useYAxes, useYAxisTicks } from '@mui/x-charts/hooks'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { dataset, valueFormatter } from '../../../dataset/weather'; const LABEL_GAP = 4; @@ -33,6 +33,7 @@ function GridLabelsYAxis(props: ChartsYAxisProps) { export default function GridLabels() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis-ticks/demos/grid-labels/client.ts b/docs/data/charts/axis-ticks/demos/grid-labels/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/grid-labels/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/grid-labels/index.ts b/docs/data/charts/axis-ticks/demos/grid-labels/index.ts new file mode 100644 index 0000000000000..01863c68eb4e6 --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/grid-labels/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GridLabels from './GridLabels'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GridLabels, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/OrdinalTickPlacement.tsx b/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/OrdinalTickPlacement.tsx similarity index 86% rename from docs/data/charts/axis-ticks/OrdinalTickPlacement.tsx rename to docs/data/charts/axis-ticks/demos/ordinal-tick-placement/OrdinalTickPlacement.tsx index 6f0e4f2ba1e0f..dafa23da5baf8 100644 --- a/docs/data/charts/axis-ticks/OrdinalTickPlacement.tsx +++ b/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/OrdinalTickPlacement.tsx @@ -1,10 +1,15 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { BarSeriesType, XAxis, YAxis, ZoomOptions } from '@mui/x-charts-pro/models'; -import { TickFrequency } from '@mui/x-charts/models'; -import alphabetStock from '../dataset/GOOGL.json'; -import SelectTimeFrequency from './SelectTimeFrequency'; +import type { + BarSeriesType, + XAxis, + YAxis, + ZoomOptions, +} from '@mui/x-charts-pro/models'; +import type { TickFrequency } from '@mui/x-charts/models'; +import alphabetStock from '../../../dataset/GOOGL.json'; +import SelectTimeFrequency from '../../SelectTimeFrequency'; const tickFrequencies: TickFrequency[] = [ 'years', @@ -16,6 +21,7 @@ const tickFrequencies: TickFrequency[] = [ ]; export default function OrdinalTickPlacement() { + // @focus-start @padding 1 const [ordinalTimeTicks, setOrdinalTimeTicks] = React.useState(defaultTicks); const [tickNumber, setTickNumber] = React.useState(5); @@ -45,6 +51,7 @@ export default function OrdinalTickPlacement() { /> ); + // @focus-end } type FilteredTicksState = Record; diff --git a/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/client.ts b/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/index.ts b/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/index.ts new file mode 100644 index 0000000000000..7a949aff4e64c --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/ordinal-tick-placement/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import OrdinalTickPlacement from './OrdinalTickPlacement'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, OrdinalTickPlacement, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/TickLabelPosition.tsx b/docs/data/charts/axis-ticks/demos/tick-label-position/TickLabelPosition.tsx similarity index 95% rename from docs/data/charts/axis-ticks/TickLabelPosition.tsx rename to docs/data/charts/axis-ticks/demos/tick-label-position/TickLabelPosition.tsx index ed24b99a6f49b..e8778a6100644 100644 --- a/docs/data/charts/axis-ticks/TickLabelPosition.tsx +++ b/docs/data/charts/axis-ticks/demos/tick-label-position/TickLabelPosition.tsx @@ -1,10 +1,11 @@ import Box from '@mui/material/Box'; -import { ShowMarkParams } from '@mui/x-charts/models'; +import type { ShowMarkParams } from '@mui/x-charts/models'; import { LineChart } from '@mui/x-charts/LineChart'; export default function TickLabelPosition() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis-ticks/demos/tick-label-position/client.ts b/docs/data/charts/axis-ticks/demos/tick-label-position/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-label-position/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/tick-label-position/index.ts b/docs/data/charts/axis-ticks/demos/tick-label-position/index.ts new file mode 100644 index 0000000000000..4f01e78105503 --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-label-position/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TickLabelPosition from './TickLabelPosition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TickLabelPosition, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/TickNumber.tsx b/docs/data/charts/axis-ticks/demos/tick-number/TickNumber.tsx similarity index 96% rename from docs/data/charts/axis-ticks/TickNumber.tsx rename to docs/data/charts/axis-ticks/demos/tick-number/TickNumber.tsx index b46fd368c37b7..b504f98eb79c3 100644 --- a/docs/data/charts/axis-ticks/TickNumber.tsx +++ b/docs/data/charts/axis-ticks/demos/tick-number/TickNumber.tsx @@ -38,6 +38,7 @@ const xAxisCommon = { export default function TickNumber() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis-ticks/demos/tick-number/client.ts b/docs/data/charts/axis-ticks/demos/tick-number/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-number/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/tick-number/index.ts b/docs/data/charts/axis-ticks/demos/tick-number/index.ts new file mode 100644 index 0000000000000..97994377e7537 --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-number/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TickNumber from './TickNumber'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TickNumber, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/TickPosition.tsx b/docs/data/charts/axis-ticks/demos/tick-position/TickPosition.tsx similarity index 95% rename from docs/data/charts/axis-ticks/TickPosition.tsx rename to docs/data/charts/axis-ticks/demos/tick-position/TickPosition.tsx index c8578c14c9399..027f6355c15b2 100644 --- a/docs/data/charts/axis-ticks/TickPosition.tsx +++ b/docs/data/charts/axis-ticks/demos/tick-position/TickPosition.tsx @@ -1,10 +1,11 @@ import Box from '@mui/material/Box'; -import { ShowMarkParams } from '@mui/x-charts/models'; +import type { ShowMarkParams } from '@mui/x-charts/models'; import { LineChart } from '@mui/x-charts/LineChart'; export default function TickPosition() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis-ticks/demos/tick-position/client.ts b/docs/data/charts/axis-ticks/demos/tick-position/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-position/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/tick-position/index.ts b/docs/data/charts/axis-ticks/demos/tick-position/index.ts new file mode 100644 index 0000000000000..cf9e5afad44ea --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-position/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TickPosition from './TickPosition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TickPosition, { ClientProvider }); diff --git a/docs/data/charts/axis-ticks/TickSpacing.tsx b/docs/data/charts/axis-ticks/demos/tick-spacing/TickSpacing.tsx similarity index 93% rename from docs/data/charts/axis-ticks/TickSpacing.tsx rename to docs/data/charts/axis-ticks/demos/tick-spacing/TickSpacing.tsx index 6938289a9442c..dac2fb98b1c75 100644 --- a/docs/data/charts/axis-ticks/TickSpacing.tsx +++ b/docs/data/charts/axis-ticks/demos/tick-spacing/TickSpacing.tsx @@ -3,7 +3,7 @@ import Stack from '@mui/material/Stack'; import Slider from '@mui/material/Slider'; import Typography from '@mui/material/Typography'; import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import data from '../dataset/sp500-intraday.json'; +import data from '../../../dataset/sp500-intraday.json'; const tickLabelDateFormatter = new Intl.DateTimeFormat(undefined, { month: 'short', @@ -11,6 +11,7 @@ const tickLabelDateFormatter = new Intl.DateTimeFormat(undefined, { }); export default function TickSpacing() { + // @focus-start @padding 1 const [tickSpacing, setTickSpacing] = React.useState(50); return ( @@ -49,4 +50,5 @@ export default function TickSpacing() { /> ); + // @focus-end } diff --git a/docs/data/charts/axis-ticks/demos/tick-spacing/client.ts b/docs/data/charts/axis-ticks/demos/tick-spacing/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-spacing/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis-ticks/demos/tick-spacing/index.ts b/docs/data/charts/axis-ticks/demos/tick-spacing/index.ts new file mode 100644 index 0000000000000..4062ab403c45e --- /dev/null +++ b/docs/data/charts/axis-ticks/demos/tick-spacing/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TickSpacing from './TickSpacing'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TickSpacing, { ClientProvider }); diff --git a/docs/data/charts/axis/AxisAutoSize.js b/docs/data/charts/axis/AxisAutoSize.js deleted file mode 100644 index 1448bcb39389e..0000000000000 --- a/docs/data/charts/axis/AxisAutoSize.js +++ /dev/null @@ -1,65 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const currencyFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - maximumFractionDigits: 0, -}); - -export default function AxisAutoSize() { - const [useAutoSize, setUseAutoSize] = React.useState(true); - - return ( - - - setUseAutoSize(event.target.checked)} /> - } - label="Use auto-sizing" - labelPlacement="end" - /> - - - currencyFormatter.format(value), - label: 'Revenue', - width: useAutoSize ? 'auto' : undefined, - }, - ]} - height={350} - dataset={dataset} - series={[ - { dataKey: 'q1', label: 'Q1' }, - { dataKey: 'q2', label: 'Q2' }, - { dataKey: 'q3', label: 'Q3' }, - { dataKey: 'q4', label: 'Q4' }, - ]} - /> - - ); -} - -const dataset = [ - { product: 'Electronics', q1: 125000, q2: 142000, q3: 158000, q4: 189000 }, - { product: 'Clothing', q1: 89000, q2: 95000, q3: 112000, q4: 145000 }, - { product: 'Home & Garden', q1: 67000, q2: 78000, q3: 85000, q4: 92000 }, - { product: 'Sports', q1: 45000, q2: 52000, q3: 68000, q4: 71000 }, - { product: 'Books', q1: 23000, q2: 28000, q3: 31000, q4: 42000 }, -]; diff --git a/docs/data/charts/axis/AxisAutoSizeRotated.js b/docs/data/charts/axis/AxisAutoSizeRotated.js deleted file mode 100644 index 915239b170b3c..0000000000000 --- a/docs/data/charts/axis/AxisAutoSizeRotated.js +++ /dev/null @@ -1,75 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Slider from '@mui/material/Slider'; -import Typography from '@mui/material/Typography'; -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function AxisAutoSizeRotated() { - const [angle, setAngle] = React.useState(-45); - - return ( - - - Tick label angle: {angle}° - - setAngle(value)} - min={-90} - max={90} - step={5} - marks={[ - { value: -90, label: '-90°' }, - { value: -45, label: '-45°' }, - { value: 0, label: '0°' }, - { value: 45, label: '45°' }, - { value: 90, label: '90°' }, - ]} - sx={{ mb: 2, maxWidth: 400 }} - /> - - - ); -} - -const months = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', -]; - -const temperatureData = [3, 5, 10, 15, 20, 25, 28, 27, 22, 15, 8, 4]; diff --git a/docs/data/charts/axis/AxisCoordinatesDemo.js b/docs/data/charts/axis/AxisCoordinatesDemo.js deleted file mode 100644 index 3b7d24d385abf..0000000000000 --- a/docs/data/charts/axis/AxisCoordinatesDemo.js +++ /dev/null @@ -1,152 +0,0 @@ -import * as React from 'react'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { - useXAxis, - useXAxisCoordinates, - useYAxis, - useYAxisCoordinates, -} from '@mui/x-charts/hooks'; - -import { useTheme } from '@mui/material/styles'; - -const lineData = [2, 5, 3, 8, 4]; -const xAxisData = [1, 2, 3, 4, 5]; - -const colors = [ - '#e63946', // red - '#f4a261', // orange - '#e9c46a', // yellow - '#2a9d8f', // teal - '#264653', // dark blue - '#8338ec', // purple - '#3a86ff', // blue - '#06d6a0', // green -]; - -export default function AxisCoordinatesDemo() { - return ( - - - - - - - - - - - {/* Render the actual axes */} - - - - - - ); -} - -function XAxisPositionIndicator({ axisId, color }) { - const xPosition = useXAxisCoordinates(axisId); - const xAxis = useXAxis(axisId); - - if (!xPosition) { - return null; - } - - return ( - - ); -} - -function YAxisPositionIndicator({ axisId, color }) { - const yPosition = useYAxisCoordinates(axisId); - const yAxis = useYAxis(axisId); - - if (!yPosition) { - return null; - } - - return ( - - ); -} - -function AxisPositionIndicator({ axisId, position, direction, coordinates, color }) { - const theme = useTheme(); - - if (position === 'none') { - return null; - } - - const centerX = coordinates.left + (coordinates.right - coordinates.left) / 2; - const centerY = coordinates.top + (coordinates.bottom - coordinates.top) / 2; - - return ( - - - - {axisId} - - - ); -} diff --git a/docs/data/charts/axis/AxisWithComposition.js b/docs/data/charts/axis/AxisWithComposition.js deleted file mode 100644 index cf54703d41beb..0000000000000 --- a/docs/data/charts/axis/AxisWithComposition.js +++ /dev/null @@ -1,59 +0,0 @@ -import Box from '@mui/material/Box'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; - -export default function AxisWithComposition() { - return ( - - - - - - - - - - ); -} diff --git a/docs/data/charts/axis/CustomDomainYAxis.js b/docs/data/charts/axis/CustomDomainYAxis.js deleted file mode 100644 index 1f653151fd722..0000000000000 --- a/docs/data/charts/axis/CustomDomainYAxis.js +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; - -const settings = { - height: 220, - series: [{ data: [60, -15, 66, 68, 87, 82, 83, 85, 92, 75, 76, 50, 91] }], - margin: { top: 20, bottom: 10 }, -}; - -// Extend a value to match a multiple of the step. -function extend(value, step) { - if (value > 0) { - // If >0 go to the next step - return step * Math.ceil(value / step); - } - // If <0 go to the previous step - return step * Math.floor(value / step); -} - -export default function CustomDomainYAxis() { - const [domainLimit, setDomainLimit] = React.useState('nice'); - - return ( - - setDomainLimit(event.target.value)} - label="domain limit" - sx={{ minWidth: 150, mb: 2 }} - > - nice - strict - function - - ({ - min: extend(min.valueOf(), 10), - max: extend(max.valueOf(), 10), - }) - : domainLimit, - }, - ]} - {...settings} - /> - - ); -} diff --git a/docs/data/charts/axis/CustomDomainYAxis.tsx b/docs/data/charts/axis/CustomDomainYAxis.tsx deleted file mode 100644 index d790f51756de1..0000000000000 --- a/docs/data/charts/axis/CustomDomainYAxis.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; - -const settings = { - height: 220, - series: [{ data: [60, -15, 66, 68, 87, 82, 83, 85, 92, 75, 76, 50, 91] }], - margin: { top: 20, bottom: 10 }, -} as const; - -// Extend a value to match a multiple of the step. -function extend(value: number, step: number) { - if (value > 0) { - // If >0 go to the next step - return step * Math.ceil(value / step); - } - // If <0 go to the previous step - return step * Math.floor(value / step); -} - -export default function CustomDomainYAxis() { - const [domainLimit, setDomainLimit] = React.useState< - 'nice' | 'strict' | 'function' - >('nice'); - - return ( - - - setDomainLimit(event.target.value as 'nice' | 'strict' | 'function') - } - label="domain limit" - sx={{ minWidth: 150, mb: 2 }} - > - nice - strict - function - - ({ - min: extend(min.valueOf(), 10), - max: extend(max.valueOf(), 10), - }) - : domainLimit, - }, - ]} - {...settings} - /> - - ); -} diff --git a/docs/data/charts/axis/FormatterD3.js b/docs/data/charts/axis/FormatterD3.js deleted file mode 100644 index 43f2654b45bee..0000000000000 --- a/docs/data/charts/axis/FormatterD3.js +++ /dev/null @@ -1,59 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; - -const otherSetting = { - height: 300, - grid: { horizontal: true, vertical: true }, -}; - -// https://en.wikipedia.org/wiki/Low-pass_filter -const f0 = 440; -const frequencyResponse = (f) => 5 / Math.sqrt(1 + (f / f0) ** 2); - -const dataset = [ - 0.1, 0.5, 0.8, 1, 5, 8, 10, 50, 80, 100, 500, 800, 1_000, 5_000, 8_000, 10_000, - 50_000, 80_000, 100_000, 500_000, 800_000, 1_000_000, -].map((f) => ({ frequency: f, voltage: frequencyResponse(f) })); - -export default function FormatterD3() { - return ( - { - if (context.location === 'tick') { - const d3Text = context.scale.tickFormat(context.tickNumber, 'e')(f); - - return d3Text; - } - return `${f.toLocaleString()}Hz`; - }, - }, - ]} - yAxis={[ - { - scaleType: 'log', - label: 'Vo/Vi', - width: 60, - valueFormatter: (f, context) => { - if (context.location === 'tick') { - const d3Text = context.scale.tickFormat(30, 'f')(f); - - return d3Text; - } - return f.toLocaleString(); - }, - }, - ]} - series={[{ dataKey: 'voltage' }]} - {...otherSetting} - > - - - ); -} diff --git a/docs/data/charts/axis/FormatterDemo.js b/docs/data/charts/axis/FormatterDemo.js deleted file mode 100644 index 47935608b6c5b..0000000000000 --- a/docs/data/charts/axis/FormatterDemo.js +++ /dev/null @@ -1,117 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -const otherSetting = { - height: 300, - yAxis: [{ label: 'rainfall (mm)', width: 60 }], - grid: { horizontal: true }, -}; - -const dataset = [ - { - london: 59, - paris: 57, - newYork: 86, - seoul: 21, - month: 'January', - }, - { - london: 50, - paris: 52, - newYork: 78, - seoul: 28, - month: 'February', - }, - { - london: 47, - paris: 53, - newYork: 106, - seoul: 41, - month: 'March', - }, - { - london: 54, - paris: 56, - newYork: 92, - seoul: 73, - month: 'April', - }, - { - london: 57, - paris: 69, - newYork: 92, - seoul: 99, - month: 'May', - }, - { - london: 60, - paris: 63, - newYork: 103, - seoul: 144, - month: 'June', - }, - { - london: 59, - paris: 60, - newYork: 105, - seoul: 319, - month: 'July', - }, - { - london: 65, - paris: 60, - newYork: 106, - seoul: 249, - month: 'August', - }, - { - london: 51, - paris: 51, - newYork: 95, - seoul: 131, - month: 'September', - }, - { - london: 60, - paris: 65, - newYork: 97, - seoul: 55, - month: 'October', - }, - { - london: 67, - paris: 64, - newYork: 76, - seoul: 48, - month: 'November', - }, - { - london: 61, - paris: 70, - newYork: 103, - seoul: 25, - month: 'December', - }, -]; - -const valueFormatter = (value) => `${value}mm`; - -export default function FormatterDemo() { - return ( - - context.location === 'tick' - ? `${month.slice(0, 3)} \n2023` - : `${month} 2023`, - height: 40, - }, - ]} - series={[{ dataKey: 'seoul', label: 'Seoul rainfall', valueFormatter }]} - {...otherSetting} - /> - ); -} diff --git a/docs/data/charts/axis/FormatterDemo.tsx.preview b/docs/data/charts/axis/FormatterDemo.tsx.preview deleted file mode 100644 index ac42e4e2a9ebd..0000000000000 --- a/docs/data/charts/axis/FormatterDemo.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - - context.location === 'tick' - ? `${month.slice(0, 3)} \n2023` - : `${month} 2023`, - height: 40, - }, - ]} - series={[{ dataKey: 'seoul', label: 'Seoul rainfall', valueFormatter }]} - {...otherSetting} -/> \ No newline at end of file diff --git a/docs/data/charts/axis/GroupedAxes.js b/docs/data/charts/axis/GroupedAxes.js deleted file mode 100644 index 5e6885f36c9e8..0000000000000 --- a/docs/data/charts/axis/GroupedAxes.js +++ /dev/null @@ -1,84 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function GroupedAxes() { - return ( - - ); -} - -const getMonth = (date) => date.toLocaleDateString('en-US', { month: 'short' }); -const getQuarter = (date) => `Q${Math.floor(date.getMonth() / 3) + 1}`; - -const getYear = (date) => date.toLocaleDateString('en-US', { year: 'numeric' }); - -const valueFormatter = (v) => - v.toLocaleDateString('en-US', { - month: 'short', - year: 'numeric', - }); - -const data = [ - new Date(2014, 11, 1), - new Date(2015, 0, 1), - new Date(2015, 1, 1), - new Date(2015, 2, 1), - new Date(2015, 3, 1), - new Date(2015, 4, 1), - new Date(2015, 5, 1), - new Date(2015, 6, 1), - new Date(2015, 7, 1), - new Date(2015, 8, 1), - new Date(2015, 9, 1), - new Date(2015, 10, 1), - new Date(2015, 11, 1), - new Date(2016, 0, 1), -]; - -const a = [ - 3190, 4000, 3000, 2000, 2780, 1890, 2390, 3490, 2400, 1398, 9800, 3908, 4800, 2040, -]; - -const b = [ - 1200, 2400, 1398, 9800, 3908, 4800, 3800, 4300, 2181, 2500, 2100, 3000, 2000, 2040, -]; - -const getPercents = (array) => - array.map((v, index) => (100 * v) / (a[index] + b[index])); - -const chartConfig = { - height: 200, - margin: { left: 0 }, - series: [ - { - data: getPercents(a), - label: 'Income', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - { - data: getPercents(b), - label: 'Expenses', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - ], - yAxis: [ - { - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - ], -}; diff --git a/docs/data/charts/axis/GroupedAxes.tsx.preview b/docs/data/charts/axis/GroupedAxes.tsx.preview deleted file mode 100644 index 261973de69a71..0000000000000 --- a/docs/data/charts/axis/GroupedAxes.tsx.preview +++ /dev/null @@ -1,17 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis/GroupedAxesAutoSize.js b/docs/data/charts/axis/GroupedAxesAutoSize.js deleted file mode 100644 index c3074233e9421..0000000000000 --- a/docs/data/charts/axis/GroupedAxesAutoSize.js +++ /dev/null @@ -1,166 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { - useXAxisCoordinates, - useXAxis, - useYAxisCoordinates, - useYAxis, -} from '@mui/x-charts/hooks'; - -export default function GroupedAxesAutoSize() { - const [useAutoSize, setUseAutoSize] = React.useState(true); - - return ( - - - setUseAutoSize(event.target.checked)} /> - } - label="Use auto-sizing" - labelPlacement="end" - /> - - - `${value.toFixed(0)}%`, - }, - ]} - height={300} - margin={{ bottom: 0, left: 0 }} - series={[ - { - data: getPercents(revenue), - label: 'Revenue', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - { - data: getPercents(expenses), - label: 'Expenses', - valueFormatter: (value) => `${(value ?? 0).toFixed(0)}%`, - }, - ]} - > - - - - - ); -} - -const getMonth = (date) => date.toLocaleDateString('en-US', { month: 'short' }); - -const getQuarter = (date) => `Q${Math.floor(date.getMonth() / 3) + 1}`; - -const getYear = (date) => date.toLocaleDateString('en-US', { year: 'numeric' }); - -const valueFormatter = (v) => - v.toLocaleDateString('en-US', { - month: 'short', - year: 'numeric', - }); - -const data = [ - new Date(2014, 11, 1), - new Date(2015, 0, 1), - new Date(2015, 1, 1), - new Date(2015, 2, 1), - new Date(2015, 3, 1), - new Date(2015, 4, 1), - new Date(2015, 5, 1), - new Date(2015, 6, 1), - new Date(2015, 7, 1), - new Date(2015, 8, 1), - new Date(2015, 9, 1), - new Date(2015, 10, 1), - new Date(2015, 11, 1), - new Date(2016, 0, 1), -]; - -const revenue = [ - 3190, 4000, 3000, 2000, 2780, 1890, 2390, 3490, 2400, 1398, 9800, 3908, 4800, 2040, -]; - -const expenses = [ - 1200, 2400, 1398, 9800, 3908, 4800, 3800, 4300, 2181, 2500, 2100, 3000, 2000, 2040, -]; - -const getPercents = (array) => - array.map((v, index) => (100 * v) / (revenue[index] + expenses[index])); - -function XAxisPositionIndicator({ axisId, color }) { - const xPosition = useXAxisCoordinates(axisId); - const xAxis = useXAxis(axisId); - - if (!xPosition) { - return null; - } - - return ( - - ); -} - -function YAxisPositionIndicator({ axisId, color }) { - const yPosition = useYAxisCoordinates(axisId); - const yAxis = useYAxis(axisId); - - if (!yPosition) { - return null; - } - - return ( - - ); -} - -function AxisPositionIndicator({ position, coordinates, color }) { - if (position === 'none') { - return null; - } - - return ( - - ); -} diff --git a/docs/data/charts/axis/GroupedYAxes.js b/docs/data/charts/axis/GroupedYAxes.js deleted file mode 100644 index dfe4f30f11b92..0000000000000 --- a/docs/data/charts/axis/GroupedYAxes.js +++ /dev/null @@ -1,63 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function GroupedYAxes() { - return ( - category[1] }, - // Extract subcategory - { - getValue: (category) => category[0], - tickSize: 120, - tickLabelStyle: { - angle: -90, - textAnchor: 'middle', - }, - }, - ], - valueFormatter: (value) => value.join(' - '), - }, - ]} - {...chartConfig} - /> - ); -} - -const categoryData = [ - ['Technology', 'Software'], - ['Technology', 'Hardware'], - ['Technology', 'AI/ML'], - ['Finance', 'Banking'], - ['Finance', 'Insurance'], - ['Finance', 'Investment'], - ['Healthcare', 'Pharmaceuticals'], - ['Healthcare', 'Medical Devices'], - ['Healthcare', 'Telemedicine'], -]; - -const salesData = [150, 120, 200, 180, 90, 160, 140, 110, 85]; -const profitData = [45, 35, 80, 65, 25, 55, 50, 40, 30]; - -const chartConfig = { - height: 400, - xAxis: [{ valueFormatter: (value) => `${value}K` }], - series: [ - { - data: salesData, - label: 'Sales', - valueFormatter: (value) => `${value}K`, - }, - { - data: profitData, - label: 'Profit', - valueFormatter: (value) => `${value}K`, - }, - ], -}; diff --git a/docs/data/charts/axis/GroupedYAxes.tsx.preview b/docs/data/charts/axis/GroupedYAxes.tsx.preview deleted file mode 100644 index 5efdf24a02703..0000000000000 --- a/docs/data/charts/axis/GroupedYAxes.tsx.preview +++ /dev/null @@ -1,25 +0,0 @@ - category[1] }, - // Extract subcategory - { - getValue: (category) => category[0], - tickSize: 120, - tickLabelStyle: { - angle: -90, - textAnchor: 'middle', - }, - }, - ], - valueFormatter: (value) => value.join(' - '), - }, - ]} - {...chartConfig} -/> \ No newline at end of file diff --git a/docs/data/charts/axis/HidingAxis.js b/docs/data/charts/axis/HidingAxis.js deleted file mode 100644 index 22d2ba92cf97d..0000000000000 --- a/docs/data/charts/axis/HidingAxis.js +++ /dev/null @@ -1,13 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function HidingAxis() { - return ( - - ); -} diff --git a/docs/data/charts/axis/HidingAxis.tsx.preview b/docs/data/charts/axis/HidingAxis.tsx.preview deleted file mode 100644 index e9e7cbfe821a8..0000000000000 --- a/docs/data/charts/axis/HidingAxis.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis/MinMaxExample.js b/docs/data/charts/axis/MinMaxExample.js deleted file mode 100644 index be83321ddcc85..0000000000000 --- a/docs/data/charts/axis/MinMaxExample.js +++ /dev/null @@ -1,59 +0,0 @@ -import * as React from 'react'; -import Slider from '@mui/material/Slider'; -import Box from '@mui/material/Box'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { Chance } from 'chance'; - -const chance = new Chance(42); - -const data = Array.from({ length: 200 }, () => ({ - x: chance.floating({ min: -25, max: 25 }), - y: chance.floating({ min: -25, max: 25 }), -})).map((d, index) => ({ ...d, id: index })); - -const minDistance = 10; - -export default function MinMaxExample() { - const [value, setValue] = React.useState([-25, 25]); - - const handleChange = (event, newValue, activeThumb) => { - if (!Array.isArray(newValue)) { - return; - } - - if (newValue[1] - newValue[0] < minDistance) { - if (activeThumb === 0) { - const clamped = Math.min(newValue[0], 100 - minDistance); - setValue([clamped, clamped + minDistance]); - } else { - const clamped = Math.max(newValue[1], minDistance); - setValue([clamped - minDistance, clamped]); - } - } else { - setValue(newValue); - } - }; - - return ( - - - - - ); -} diff --git a/docs/data/charts/axis/ModifyAxisPosition.js b/docs/data/charts/axis/ModifyAxisPosition.js deleted file mode 100644 index 3d3f537cfdd89..0000000000000 --- a/docs/data/charts/axis/ModifyAxisPosition.js +++ /dev/null @@ -1,27 +0,0 @@ -import Box from '@mui/material/Box'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { Chance } from 'chance'; - -const chance = new Chance(42); - -const data = Array.from({ length: 200 }, () => ({ - x: chance.floating({ min: -25, max: 25 }), - y: chance.floating({ min: -25, max: 25 }), -})).map((d, index) => ({ ...d, id: index })); - -const params = { - series: [{ data }], - height: 300, - margin: { top: 12, right: 12, bottom: 20, left: 12 }, -}; -export default function ModifyAxisPosition() { - return ( - - - - ); -} diff --git a/docs/data/charts/axis/ModifyAxisPosition.tsx.preview b/docs/data/charts/axis/ModifyAxisPosition.tsx.preview deleted file mode 100644 index ee5341e08a9d2..0000000000000 --- a/docs/data/charts/axis/ModifyAxisPosition.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis/MultipleAxes.js b/docs/data/charts/axis/MultipleAxes.js deleted file mode 100644 index 739f565d3f06e..0000000000000 --- a/docs/data/charts/axis/MultipleAxes.js +++ /dev/null @@ -1,23 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const sample = [1, 10, 30, 50, 70, 90, 100]; - -export default function MultipleAxes() { - return ( - - - - ); -} diff --git a/docs/data/charts/axis/MultipleAxes.tsx.preview b/docs/data/charts/axis/MultipleAxes.tsx.preview deleted file mode 100644 index 9ad6d224f9a77..0000000000000 --- a/docs/data/charts/axis/MultipleAxes.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis/ReferenceLine.js b/docs/data/charts/axis/ReferenceLine.js deleted file mode 100644 index 71f6a92a089ba..0000000000000 --- a/docs/data/charts/axis/ReferenceLine.js +++ /dev/null @@ -1,65 +0,0 @@ -import Box from '@mui/material/Box'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot } from '@mui/x-charts/LineChart'; - -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; - -const timeData = [ - new Date(2023, 7, 31), - new Date(2023, 7, 31, 12), - new Date(2023, 8, 1), - new Date(2023, 8, 1, 12), - new Date(2023, 8, 2), - new Date(2023, 8, 2, 12), - new Date(2023, 8, 3), - new Date(2023, 8, 3, 12), - new Date(2023, 8, 4), -]; - -const y1 = [5, 5, 10, 90, 85, 70, 30, 25, 25]; -const y2 = [90, 85, 70, 25, 23, 40, 45, 40, 50]; - -const config = { - series: [ - { type: 'line', data: y1 }, - { type: 'line', data: y2 }, - ], - height: 400, - xAxis: [ - { - data: timeData, - scaleType: 'time', - valueFormatter: (date) => - date.getHours() === 0 - ? date.toLocaleDateString('fr-FR', { - month: '2-digit', - day: '2-digit', - }) - : date.toLocaleTimeString('fr-FR', { - hour: '2-digit', - }), - }, - ], -}; - -export default function ReferenceLine() { - return ( - - - - - - - - - - ); -} diff --git a/docs/data/charts/axis/ReferenceLine.tsx.preview b/docs/data/charts/axis/ReferenceLine.tsx.preview deleted file mode 100644 index f3a81ebb34ef8..0000000000000 --- a/docs/data/charts/axis/ReferenceLine.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/docs/data/charts/axis/ReverseExample.js b/docs/data/charts/axis/ReverseExample.js deleted file mode 100644 index e644616d0f742..0000000000000 --- a/docs/data/charts/axis/ReverseExample.js +++ /dev/null @@ -1,99 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsGrid } from '@mui/x-charts/ChartsGrid'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; - -const dataset = [ - { min: -12, max: -4, precip: 79, month: 'Jan' }, - { min: -11, max: -3, precip: 66, month: 'Feb' }, - { min: -6, max: 2, precip: 76, month: 'Mar' }, - { min: 1, max: 9, precip: 106, month: 'Apr' }, - { min: 8, max: 17, precip: 105, month: 'Mai' }, - { min: 15, max: 24, precip: 114, month: 'Jun' }, - { min: 18, max: 26, precip: 106, month: 'Jul' }, - { min: 17, max: 26, precip: 105, month: 'Aug' }, - { min: 13, max: 21, precip: 100, month: 'Sept' }, - { min: 6, max: 13, precip: 116, month: 'Oct' }, - { min: 0, max: 6, precip: 93, month: 'Nov' }, - { min: -8, max: -1, precip: 93, month: 'Dec' }, -]; - -const series = [ - { type: 'line', dataKey: 'min', color: '#577399', showMark: true }, - { type: 'line', dataKey: 'max', color: '#fe5f55', showMark: true }, - { type: 'bar', dataKey: 'precip', color: '#bfdbf7', yAxisId: 'rightAxis' }, -]; - -export default function ReverseExample() { - const [reverseX, setReverseX] = React.useState(false); - const [reverseLeft, setReverseLeft] = React.useState(false); - const [reverseRight, setReverseRight] = React.useState(false); - - return ( - - - setReverseX(event.target.checked)} /> - } - label="reverse x-axis" - labelPlacement="end" - /> - setReverseLeft(event.target.checked)} /> - } - label="reverse left axis" - labelPlacement="end" - /> - setReverseRight(event.target.checked)} /> - } - label="reverse right axis" - labelPlacement="end" - /> - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/axis/ScaleExample.js b/docs/data/charts/axis/ScaleExample.js deleted file mode 100644 index 0b7f83a5a1b97..0000000000000 --- a/docs/data/charts/axis/ScaleExample.js +++ /dev/null @@ -1,23 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const sample = [1, 10, 30, 50, 70, 90, 100]; - -export default function ScaleExample() { - return ( - - - - ); -} diff --git a/docs/data/charts/axis/ScaleExample.tsx.preview b/docs/data/charts/axis/ScaleExample.tsx.preview deleted file mode 100644 index 8320ebde304af..0000000000000 --- a/docs/data/charts/axis/ScaleExample.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/axis/SymlogScale.js b/docs/data/charts/axis/SymlogScale.js deleted file mode 100644 index c91c919861ff0..0000000000000 --- a/docs/data/charts/axis/SymlogScale.js +++ /dev/null @@ -1,67 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function SymlogScale() { - const [chartType, setChartType] = React.useState('bar'); - - const handleChartType = (event, newChartType) => { - if (newChartType !== null) { - setChartType(newChartType); - } - }; - - return ( - - - {['bar', 'area'].map((type) => ( - - {type} - - ))} - - {chartType === 'bar' && } - {chartType === 'area' && } - - ); -} - -function SymlogBarChart() { - return ( - - ); -} - -function SymlogAreaChart() { - return ( - - ); -} diff --git a/docs/data/charts/axis/SymlogScale.tsx.preview b/docs/data/charts/axis/SymlogScale.tsx.preview deleted file mode 100644 index 4cf6617f27dfe..0000000000000 --- a/docs/data/charts/axis/SymlogScale.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - {['bar', 'area'].map((type) => ( - - {type} - - ))} - -{chartType === 'bar' && } -{chartType === 'area' && } \ No newline at end of file diff --git a/docs/data/charts/axis/TicksWithoutLabels.js b/docs/data/charts/axis/TicksWithoutLabels.js deleted file mode 100644 index ab7a462ef612f..0000000000000 --- a/docs/data/charts/axis/TicksWithoutLabels.js +++ /dev/null @@ -1,97 +0,0 @@ -import * as React from 'react'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; - -import { earthquakeData } from '../dataset/earthquakeData'; - -const settings = { - height: 400, - grid: { horizontal: true }, -}; -const data = Object.entries(earthquakeData).reduce((acc, [magnitude, events]) => { - acc.push({ x: Number.parseFloat(magnitude), y: events }); - - return acc; -}, []); - -const formatter = new Intl.NumberFormat('en-US', { - notation: 'compact', - maximumFractionDigits: 1, -}); - -function valueFormatterIgnoreEmpty(value, context) { - if (context.location === 'tick' && context.defaultTickLabel === '') { - return ''; - } - - return formatter.format(value); -} - -function valueFormatterShowAll(value) { - return formatter.format(value); -} - -export default function TicksWithoutLabels() { - const [tickFormatter, setTickFormatter] = React.useState( - () => valueFormatterIgnoreEmpty, - ); - - return ( - - - - Worldwide Earthquake Count and Magnitude, 2020-2024 - - - Source: US Geological Survey - - - Tick Format - - setTickFormatter(() => - event.target.value === 'empty' - ? valueFormatterIgnoreEmpty - : valueFormatterShowAll, - ) - } - > - } - label="Ignore empty ticks" - /> - } - label="Show all values" - /> - - - - ); -} diff --git a/docs/data/charts/axis/axis.md b/docs/data/charts/axis/axis.md index 0d7ba19a0c3b4..516a122fdc59f 100644 --- a/docs/data/charts/axis/axis.md +++ b/docs/data/charts/axis/axis.md @@ -21,7 +21,7 @@ One has a linear y-axis and the other has a logarithmic one. Each axis definition is identified by its property `id`. Then each series specifies the axis it uses with the `xAxisId` and `yAxisId` properties. -{{"demo": "ScaleExample.js"}} +{{"component": "file://./demos/scale-example/index.ts"}} :::info ID management, as shown in the example above, is not necessary for most common use cases. @@ -56,7 +56,7 @@ The formatter's second argument provides rendering context for advanced use case In the demo below, `valueFormatter` is used to shorten months and introduce a new line for ticks. It uses the `context.location` to determine where the value is rendered. -{{"demo": "FormatterDemo.js"}} +{{"component": "file://./demos/formatter-demo/index.ts"}} ### Ticks without labels @@ -66,14 +66,14 @@ For example, it's common to use ticks to indicate a logarithmic scale but omit t The default tick formatter achieves this by rendering an empty string for ticks that should not show labels. If you want to customize the formatting, but want to keep the default behavior for ticks without labels, you can check that the `context.defaultTickLabel` property is different from the empty string: -{{"demo": "TicksWithoutLabels.js"}} +{{"component": "file://./demos/ticks-without-labels/index.ts"}} ### Using the D3 formatter The context gives you access to the axis scale, the number of ticks (if applicable), and the default formatted value. You can use the D3 [`tickFormat(tickNumber, specifier)`](https://d3js.org/d3-scale/linear#tickFormat) method to adapt the tick format based on the scale properties as shown below: -{{"demo": "FormatterD3.js"}} +{{"component": "file://./demos/formatter-d3/index.ts"}} ## Axis subdomain @@ -89,7 +89,7 @@ xAxis={[ ]} ``` -{{"demo": "MinMaxExample.js"}} +{{"component": "file://./demos/min-max-example/index.ts"}} ### Relative axis subdomain @@ -102,14 +102,14 @@ This expects one of three possible values: The demo below illustrates these differences in behavior, showing data ranging from -15 to 92 with different domain limits: -{{"demo": "CustomDomainYAxis.js"}} +{{"component": "file://./demos/custom-domain-y-axis/index.ts"}} ## Axis direction By default, the axes run from left to right and from bottom to top. You can apply the `reverse` property to change this: -{{"demo": "ReverseExample.js"}} +{{"component": "file://./demos/reverse-example/index.ts"}} ## Position @@ -120,21 +120,21 @@ This property expects the following values: - `'left'` or `'right'` for the y-axis - `'none'` to hide the axis -{{"demo": "ModifyAxisPosition.js"}} +{{"component": "file://./demos/modify-axis-position/index.ts"}} ### Hiding axes To hide an axis, set its `position` to `'none'`. Note that the axis is still computed and used for scaling. -{{"demo": "HidingAxis.js"}} +{{"component": "file://./demos/hiding-axis/index.ts"}} ### Multiple axes on one side You can display multiple axes on one side. If two or more axes share the same `position`, they're displayed in the order they're defined from closest to farthest away from the chart. -{{"demo": "MultipleAxes.js"}} +{{"component": "file://./demos/multiple-axes/index.ts"}} ### Coordinates @@ -142,7 +142,7 @@ You can obtain the coordinates of the axis by calling the `useXAxisCoordinates() Below is an example of how to use the these hooks to get the coordinates of several axes and render rectangles delineating their area. -{{"demo": "AxisCoordinatesDemo.js"}} +{{"component": "file://./demos/axis-coordinates-demo/index.ts"}} ## Grouped axes @@ -159,26 +159,26 @@ The demos below show the feature with: - The x-axis grouped by month, quarter, and year. - The y-axis is grouped by category and subcategory. -{{"demo": "GroupedAxes.js", "defaultCodeOpen": false}} +{{"component": "file://./demos/grouped-axes/index.ts", "collapseToEmpty": true}} -{{"demo": "GroupedYAxes.js", "defaultCodeOpen": false}} +{{"component": "file://./demos/grouped-y-axes/index.ts", "collapseToEmpty": true}} ## Auto-sizing axes You can set the axis `height` (for x-axes) or `width` (for y-axes) to `'auto'` to automatically calculate the axis dimension based on the tick label measurements. This is useful when your tick labels have varying lengths or when you use rotated labels. -{{"demo": "AxisAutoSize.js"}} +{{"component": "file://./demos/axis-auto-size/index.ts"}} Auto-sizing works well with rotated tick labels. In the demo below, adjust the angle slider to see how the axis height automatically adapts to accommodate the rotated labels. -{{"demo": "AxisAutoSizeRotated.js"}} +{{"component": "file://./demos/axis-auto-size-rotated/index.ts"}} Auto-sizing also works with grouped axes. When an axis has `groups` defined, the auto-size calculation accounts for each group level's tick labels and tick sizes. -{{"demo": "GroupedAxesAutoSize.js"}} +{{"component": "file://./demos/grouped-axes-auto-size/index.ts"}} :::info Auto-sizing is computed on the client side after hydration. @@ -191,7 +191,7 @@ A log scale cannot plot zero because log(0) is undefined. To overcome this, you can use a symlog scale, which uses a linear scale for values close to zero and a logarithmic scale for the rest. You can customize the value where the scale switches from linear to logarithmic using the `constant` property, which defaults to 1. -{{"demo": "SymlogScale.js"}} +{{"component": "file://./demos/symlog-scale/index.ts"}} ## Composition @@ -202,7 +202,7 @@ In turn, those components require an `axisId` prop to link them to an axis you d You can choose their position with the `position` prop which accepts `'top'`/`'bottom'` for `` and `'left'`/`'right'` for ``. The props described in the [rendering playground](/x/react-charts/axis-customization/#custom-axis-rendering) are also available. -{{"demo": "AxisWithComposition.js"}} +{{"component": "file://./demos/axis-with-composition/index.ts"}} ## Reference line @@ -214,4 +214,4 @@ Elements can be styled with the `lineStyle` and `labelStyle` props. More examples are available in [docs page about references](/x/react-charts/references/). -{{"demo": "ReferenceLine.js"}} +{{"component": "file://./demos/reference-line/index.ts"}} diff --git a/docs/data/charts/axis/AxisAutoSizeRotated.tsx b/docs/data/charts/axis/demos/axis-auto-size-rotated/AxisAutoSizeRotated.tsx similarity index 97% rename from docs/data/charts/axis/AxisAutoSizeRotated.tsx rename to docs/data/charts/axis/demos/axis-auto-size-rotated/AxisAutoSizeRotated.tsx index 1b8dca350e70a..3e160991bfdd0 100644 --- a/docs/data/charts/axis/AxisAutoSizeRotated.tsx +++ b/docs/data/charts/axis/demos/axis-auto-size-rotated/AxisAutoSizeRotated.tsx @@ -5,6 +5,7 @@ import Typography from '@mui/material/Typography'; import { LineChart } from '@mui/x-charts/LineChart'; export default function AxisAutoSizeRotated() { + // @focus-start @padding 1 const [angle, setAngle] = React.useState(-45); return ( @@ -56,6 +57,7 @@ export default function AxisAutoSizeRotated() { /> ); + // @focus-end } const months = [ diff --git a/docs/data/charts/axis/demos/axis-auto-size-rotated/client.ts b/docs/data/charts/axis/demos/axis-auto-size-rotated/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/axis-auto-size-rotated/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/axis-auto-size-rotated/index.ts b/docs/data/charts/axis/demos/axis-auto-size-rotated/index.ts new file mode 100644 index 0000000000000..ea5fbbfc5d678 --- /dev/null +++ b/docs/data/charts/axis/demos/axis-auto-size-rotated/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisAutoSizeRotated from './AxisAutoSizeRotated'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisAutoSizeRotated, { ClientProvider }); diff --git a/docs/data/charts/axis/AxisAutoSize.tsx b/docs/data/charts/axis/demos/axis-auto-size/AxisAutoSize.tsx similarity index 97% rename from docs/data/charts/axis/AxisAutoSize.tsx rename to docs/data/charts/axis/demos/axis-auto-size/AxisAutoSize.tsx index b20adb7af53ca..c2a6e6d493102 100644 --- a/docs/data/charts/axis/AxisAutoSize.tsx +++ b/docs/data/charts/axis/demos/axis-auto-size/AxisAutoSize.tsx @@ -12,6 +12,7 @@ const currencyFormatter = new Intl.NumberFormat('en-US', { }); export default function AxisAutoSize() { + // @focus-start @padding 1 const [useAutoSize, setUseAutoSize] = React.useState(true); return ( @@ -54,6 +55,7 @@ export default function AxisAutoSize() { /> ); + // @focus-end } const dataset = [ diff --git a/docs/data/charts/axis/demos/axis-auto-size/client.ts b/docs/data/charts/axis/demos/axis-auto-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/axis-auto-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/axis-auto-size/index.ts b/docs/data/charts/axis/demos/axis-auto-size/index.ts new file mode 100644 index 0000000000000..0887115ce1ff8 --- /dev/null +++ b/docs/data/charts/axis/demos/axis-auto-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisAutoSize from './AxisAutoSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisAutoSize, { ClientProvider }); diff --git a/docs/data/charts/axis/AxisCoordinatesDemo.tsx b/docs/data/charts/axis/demos/axis-coordinates-demo/AxisCoordinatesDemo.tsx similarity index 96% rename from docs/data/charts/axis/AxisCoordinatesDemo.tsx rename to docs/data/charts/axis/demos/axis-coordinates-demo/AxisCoordinatesDemo.tsx index 5da0bdba864c0..01e9795face56 100644 --- a/docs/data/charts/axis/AxisCoordinatesDemo.tsx +++ b/docs/data/charts/axis/demos/axis-coordinates-demo/AxisCoordinatesDemo.tsx @@ -8,9 +8,9 @@ import { useXAxisCoordinates, useYAxis, useYAxisCoordinates, - type AxisCoordinates, } from '@mui/x-charts/hooks'; -import { AxisId } from '@mui/x-charts/internals'; +import type { AxisCoordinates } from '@mui/x-charts/hooks'; +import type { AxisId } from '@mui/x-charts/internals'; import { useTheme } from '@mui/material/styles'; const lineData = [2, 5, 3, 8, 4]; @@ -29,6 +29,7 @@ const colors = [ export default function AxisCoordinatesDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis/demos/axis-coordinates-demo/client.ts b/docs/data/charts/axis/demos/axis-coordinates-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/axis-coordinates-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/axis-coordinates-demo/index.ts b/docs/data/charts/axis/demos/axis-coordinates-demo/index.ts new file mode 100644 index 0000000000000..5c741d4849021 --- /dev/null +++ b/docs/data/charts/axis/demos/axis-coordinates-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisCoordinatesDemo from './AxisCoordinatesDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisCoordinatesDemo, { ClientProvider }); diff --git a/docs/data/charts/axis/AxisWithComposition.tsx b/docs/data/charts/axis/demos/axis-with-composition/AxisWithComposition.tsx similarity index 96% rename from docs/data/charts/axis/AxisWithComposition.tsx rename to docs/data/charts/axis/demos/axis-with-composition/AxisWithComposition.tsx index cf54703d41beb..abc49eaad56d1 100644 --- a/docs/data/charts/axis/AxisWithComposition.tsx +++ b/docs/data/charts/axis/demos/axis-with-composition/AxisWithComposition.tsx @@ -8,6 +8,7 @@ import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; export default function AxisWithComposition() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis/demos/axis-with-composition/client.ts b/docs/data/charts/axis/demos/axis-with-composition/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/axis-with-composition/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/axis-with-composition/index.ts b/docs/data/charts/axis/demos/axis-with-composition/index.ts new file mode 100644 index 0000000000000..17b74efba976e --- /dev/null +++ b/docs/data/charts/axis/demos/axis-with-composition/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisWithComposition from './AxisWithComposition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisWithComposition, { ClientProvider }); diff --git a/docs/data/charts/axis/demos/custom-domain-y-axis/CustomDomainYAxis.tsx b/docs/data/charts/axis/demos/custom-domain-y-axis/CustomDomainYAxis.tsx new file mode 100644 index 0000000000000..e85d2a34dba8e --- /dev/null +++ b/docs/data/charts/axis/demos/custom-domain-y-axis/CustomDomainYAxis.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { BarChart } from '@mui/x-charts/BarChart'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; + +const settings = { + height: 220, + series: [{ data: [60, -15, 66, 68, 87, 82, 83, 85, 92, 75, 76, 50, 91] }], + margin: { top: 20, bottom: 10 }, +} as const; + +// Extend a value to match a multiple of the step. +function extend(value: number, step: number) { + if (value > 0) { + // If >0 go to the next step + return step * Math.ceil(value / step); + } + // If <0 go to the previous step + return step * Math.floor(value / step); +} + +export default function CustomDomainYAxis() { + // @focus-start @padding 1 + const [domainLimit, setDomainLimit] = React.useState< + 'nice' | 'strict' | 'function' + >('nice'); + + return ( + + + setDomainLimit(event.target.value as 'nice' | 'strict' | 'function') + } + label="domain limit" + sx={{ minWidth: 150, mb: 2 }} + > + nice + strict + function + + ({ + min: extend(min.valueOf(), 10), + max: extend(max.valueOf(), 10), + }) + : domainLimit, + }, + ]} + {...settings} + /> + + ); + // @focus-end +} diff --git a/docs/data/charts/axis/demos/custom-domain-y-axis/client.ts b/docs/data/charts/axis/demos/custom-domain-y-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/custom-domain-y-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/custom-domain-y-axis/index.ts b/docs/data/charts/axis/demos/custom-domain-y-axis/index.ts new file mode 100644 index 0000000000000..22009d536a290 --- /dev/null +++ b/docs/data/charts/axis/demos/custom-domain-y-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomDomainYAxis from './CustomDomainYAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomDomainYAxis, { ClientProvider }); diff --git a/docs/data/charts/axis/FormatterD3.tsx b/docs/data/charts/axis/demos/formatter-d3/FormatterD3.tsx similarity index 93% rename from docs/data/charts/axis/FormatterD3.tsx rename to docs/data/charts/axis/demos/formatter-d3/FormatterD3.tsx index c7f14a4d76fa5..9e7cc46549225 100644 --- a/docs/data/charts/axis/FormatterD3.tsx +++ b/docs/data/charts/axis/demos/formatter-d3/FormatterD3.tsx @@ -1,4 +1,4 @@ -import { ScaleLogarithmic } from '@mui/x-charts-vendor/d3-scale'; +import type { ScaleLogarithmic } from '@mui/x-charts-vendor/d3-scale'; import { LineChart } from '@mui/x-charts/LineChart'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; @@ -18,6 +18,7 @@ const dataset = [ export default function FormatterD3() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis/demos/formatter-d3/client.ts b/docs/data/charts/axis/demos/formatter-d3/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/formatter-d3/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/formatter-d3/index.ts b/docs/data/charts/axis/demos/formatter-d3/index.ts new file mode 100644 index 0000000000000..c2fde8dfe92a1 --- /dev/null +++ b/docs/data/charts/axis/demos/formatter-d3/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FormatterD3 from './FormatterD3'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FormatterD3, { ClientProvider }); diff --git a/docs/data/charts/axis/FormatterDemo.tsx b/docs/data/charts/axis/demos/formatter-demo/FormatterDemo.tsx similarity index 97% rename from docs/data/charts/axis/FormatterDemo.tsx rename to docs/data/charts/axis/demos/formatter-demo/FormatterDemo.tsx index da40f70f33e66..06e10bfc86530 100644 --- a/docs/data/charts/axis/FormatterDemo.tsx +++ b/docs/data/charts/axis/demos/formatter-demo/FormatterDemo.tsx @@ -97,6 +97,7 @@ const valueFormatter = (value: number | null) => `${value}mm`; export default function FormatterDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis/demos/formatter-demo/client.ts b/docs/data/charts/axis/demos/formatter-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/formatter-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/formatter-demo/index.ts b/docs/data/charts/axis/demos/formatter-demo/index.ts new file mode 100644 index 0000000000000..9be00da611e6b --- /dev/null +++ b/docs/data/charts/axis/demos/formatter-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FormatterDemo from './FormatterDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FormatterDemo, { ClientProvider }); diff --git a/docs/data/charts/axis/GroupedAxesAutoSize.tsx b/docs/data/charts/axis/demos/grouped-axes-auto-size/GroupedAxesAutoSize.tsx similarity index 97% rename from docs/data/charts/axis/GroupedAxesAutoSize.tsx rename to docs/data/charts/axis/demos/grouped-axes-auto-size/GroupedAxesAutoSize.tsx index 54da418579e0d..a42935388971d 100644 --- a/docs/data/charts/axis/GroupedAxesAutoSize.tsx +++ b/docs/data/charts/axis/demos/grouped-axes-auto-size/GroupedAxesAutoSize.tsx @@ -9,10 +9,11 @@ import { useXAxis, useYAxisCoordinates, useYAxis, - type AxisCoordinates, } from '@mui/x-charts/hooks'; +import type { AxisCoordinates } from '@mui/x-charts/hooks'; export default function GroupedAxesAutoSize() { + // @focus-start @padding 1 const [useAutoSize, setUseAutoSize] = React.useState(true); return ( @@ -71,6 +72,7 @@ export default function GroupedAxesAutoSize() { ); + // @focus-end } const getMonth = (date: Date) => diff --git a/docs/data/charts/axis/demos/grouped-axes-auto-size/client.ts b/docs/data/charts/axis/demos/grouped-axes-auto-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/grouped-axes-auto-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/grouped-axes-auto-size/index.ts b/docs/data/charts/axis/demos/grouped-axes-auto-size/index.ts new file mode 100644 index 0000000000000..07540cc4a4c35 --- /dev/null +++ b/docs/data/charts/axis/demos/grouped-axes-auto-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GroupedAxesAutoSize from './GroupedAxesAutoSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GroupedAxesAutoSize, { ClientProvider }); diff --git a/docs/data/charts/axis/GroupedAxes.tsx b/docs/data/charts/axis/demos/grouped-axes/GroupedAxes.tsx similarity index 97% rename from docs/data/charts/axis/GroupedAxes.tsx rename to docs/data/charts/axis/demos/grouped-axes/GroupedAxes.tsx index b3af0fc3ce027..9f9d5e1e46b25 100644 --- a/docs/data/charts/axis/GroupedAxes.tsx +++ b/docs/data/charts/axis/demos/grouped-axes/GroupedAxes.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function GroupedAxes() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis/demos/grouped-axes/client.ts b/docs/data/charts/axis/demos/grouped-axes/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/grouped-axes/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/grouped-axes/index.ts b/docs/data/charts/axis/demos/grouped-axes/index.ts new file mode 100644 index 0000000000000..4912e36145769 --- /dev/null +++ b/docs/data/charts/axis/demos/grouped-axes/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GroupedAxes from './GroupedAxes'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GroupedAxes, { ClientProvider }); diff --git a/docs/data/charts/axis/GroupedYAxes.tsx b/docs/data/charts/axis/demos/grouped-y-axes/GroupedYAxes.tsx similarity index 96% rename from docs/data/charts/axis/GroupedYAxes.tsx rename to docs/data/charts/axis/demos/grouped-y-axes/GroupedYAxes.tsx index 243413ceed05b..39c0aee2ed34b 100644 --- a/docs/data/charts/axis/GroupedYAxes.tsx +++ b/docs/data/charts/axis/demos/grouped-y-axes/GroupedYAxes.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function GroupedYAxes() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis/demos/grouped-y-axes/client.ts b/docs/data/charts/axis/demos/grouped-y-axes/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/grouped-y-axes/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/grouped-y-axes/index.ts b/docs/data/charts/axis/demos/grouped-y-axes/index.ts new file mode 100644 index 0000000000000..f81c8c9d595d5 --- /dev/null +++ b/docs/data/charts/axis/demos/grouped-y-axes/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GroupedYAxes from './GroupedYAxes'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GroupedYAxes, { ClientProvider }); diff --git a/docs/data/charts/axis/HidingAxis.tsx b/docs/data/charts/axis/demos/hiding-axis/HidingAxis.tsx similarity index 85% rename from docs/data/charts/axis/HidingAxis.tsx rename to docs/data/charts/axis/demos/hiding-axis/HidingAxis.tsx index 22d2ba92cf97d..59bbf6d747bbb 100644 --- a/docs/data/charts/axis/HidingAxis.tsx +++ b/docs/data/charts/axis/demos/hiding-axis/HidingAxis.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function HidingAxis() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/axis/demos/hiding-axis/client.ts b/docs/data/charts/axis/demos/hiding-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/hiding-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/hiding-axis/index.ts b/docs/data/charts/axis/demos/hiding-axis/index.ts new file mode 100644 index 0000000000000..1cdc8f2911125 --- /dev/null +++ b/docs/data/charts/axis/demos/hiding-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HidingAxis from './HidingAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HidingAxis, { ClientProvider }); diff --git a/docs/data/charts/axis/MinMaxExample.tsx b/docs/data/charts/axis/demos/min-max-example/MinMaxExample.tsx similarity index 97% rename from docs/data/charts/axis/MinMaxExample.tsx rename to docs/data/charts/axis/demos/min-max-example/MinMaxExample.tsx index 521e187f5e21a..68140db56b0e7 100644 --- a/docs/data/charts/axis/MinMaxExample.tsx +++ b/docs/data/charts/axis/demos/min-max-example/MinMaxExample.tsx @@ -14,6 +14,7 @@ const data = Array.from({ length: 200 }, () => ({ const minDistance = 10; export default function MinMaxExample() { + // @focus-start @padding 1 const [value, setValue] = React.useState([-25, 25]); const handleChange = ( @@ -60,4 +61,5 @@ export default function MinMaxExample() { /> ); + // @focus-end } diff --git a/docs/data/charts/axis/demos/min-max-example/client.ts b/docs/data/charts/axis/demos/min-max-example/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/min-max-example/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/min-max-example/index.ts b/docs/data/charts/axis/demos/min-max-example/index.ts new file mode 100644 index 0000000000000..e361d69861b9d --- /dev/null +++ b/docs/data/charts/axis/demos/min-max-example/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MinMaxExample from './MinMaxExample'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MinMaxExample, { ClientProvider }); diff --git a/docs/data/charts/axis/ModifyAxisPosition.tsx b/docs/data/charts/axis/demos/modify-axis-position/ModifyAxisPosition.tsx similarity index 93% rename from docs/data/charts/axis/ModifyAxisPosition.tsx rename to docs/data/charts/axis/demos/modify-axis-position/ModifyAxisPosition.tsx index 3d3f537cfdd89..ffc80c1377b5c 100644 --- a/docs/data/charts/axis/ModifyAxisPosition.tsx +++ b/docs/data/charts/axis/demos/modify-axis-position/ModifyAxisPosition.tsx @@ -17,11 +17,13 @@ const params = { export default function ModifyAxisPosition() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis/demos/modify-axis-position/client.ts b/docs/data/charts/axis/demos/modify-axis-position/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/modify-axis-position/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/modify-axis-position/index.ts b/docs/data/charts/axis/demos/modify-axis-position/index.ts new file mode 100644 index 0000000000000..6fe5fe913a9cf --- /dev/null +++ b/docs/data/charts/axis/demos/modify-axis-position/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ModifyAxisPosition from './ModifyAxisPosition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ModifyAxisPosition, { ClientProvider }); diff --git a/docs/data/charts/axis/MultipleAxes.tsx b/docs/data/charts/axis/demos/multiple-axes/MultipleAxes.tsx similarity index 93% rename from docs/data/charts/axis/MultipleAxes.tsx rename to docs/data/charts/axis/demos/multiple-axes/MultipleAxes.tsx index 739f565d3f06e..911003c200f0b 100644 --- a/docs/data/charts/axis/MultipleAxes.tsx +++ b/docs/data/charts/axis/demos/multiple-axes/MultipleAxes.tsx @@ -6,6 +6,7 @@ const sample = [1, 10, 30, 50, 70, 90, 100]; export default function MultipleAxes() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis/demos/multiple-axes/client.ts b/docs/data/charts/axis/demos/multiple-axes/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/multiple-axes/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/multiple-axes/index.ts b/docs/data/charts/axis/demos/multiple-axes/index.ts new file mode 100644 index 0000000000000..8646d0708b692 --- /dev/null +++ b/docs/data/charts/axis/demos/multiple-axes/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MultipleAxes from './MultipleAxes'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MultipleAxes, { ClientProvider }); diff --git a/docs/data/charts/axis/ReferenceLine.tsx b/docs/data/charts/axis/demos/reference-line/ReferenceLine.tsx similarity index 94% rename from docs/data/charts/axis/ReferenceLine.tsx rename to docs/data/charts/axis/demos/reference-line/ReferenceLine.tsx index efe76857f2a7c..7faf6e7bd5d86 100644 --- a/docs/data/charts/axis/ReferenceLine.tsx +++ b/docs/data/charts/axis/demos/reference-line/ReferenceLine.tsx @@ -1,7 +1,7 @@ import Box from '@mui/material/Box'; import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; import { LinePlot } from '@mui/x-charts/LineChart'; -import { LineSeriesType } from '@mui/x-charts/models'; +import type { LineSeriesType } from '@mui/x-charts/models'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; @@ -47,6 +47,7 @@ const config = { export default function ReferenceLine() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis/demos/reference-line/client.ts b/docs/data/charts/axis/demos/reference-line/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/reference-line/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/reference-line/index.ts b/docs/data/charts/axis/demos/reference-line/index.ts new file mode 100644 index 0000000000000..e4eda4f9ff0e6 --- /dev/null +++ b/docs/data/charts/axis/demos/reference-line/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReferenceLine from './ReferenceLine'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReferenceLine, { ClientProvider }); diff --git a/docs/data/charts/axis/ReverseExample.tsx b/docs/data/charts/axis/demos/reverse-example/ReverseExample.tsx similarity index 98% rename from docs/data/charts/axis/ReverseExample.tsx rename to docs/data/charts/axis/demos/reverse-example/ReverseExample.tsx index a20195f24c04b..86a221751ebac 100644 --- a/docs/data/charts/axis/ReverseExample.tsx +++ b/docs/data/charts/axis/demos/reverse-example/ReverseExample.tsx @@ -34,6 +34,7 @@ const series = [ ] as const; export default function ReverseExample() { + // @focus-start @padding 1 const [reverseX, setReverseX] = React.useState(false); const [reverseLeft, setReverseLeft] = React.useState(false); const [reverseRight, setReverseRight] = React.useState(false); @@ -97,4 +98,5 @@ export default function ReverseExample() { ); + // @focus-end } diff --git a/docs/data/charts/axis/demos/reverse-example/client.ts b/docs/data/charts/axis/demos/reverse-example/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/reverse-example/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/reverse-example/index.ts b/docs/data/charts/axis/demos/reverse-example/index.ts new file mode 100644 index 0000000000000..9d109106f5fb4 --- /dev/null +++ b/docs/data/charts/axis/demos/reverse-example/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReverseExample from './ReverseExample'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReverseExample, { ClientProvider }); diff --git a/docs/data/charts/axis/ScaleExample.tsx b/docs/data/charts/axis/demos/scale-example/ScaleExample.tsx similarity index 93% rename from docs/data/charts/axis/ScaleExample.tsx rename to docs/data/charts/axis/demos/scale-example/ScaleExample.tsx index 0b7f83a5a1b97..51be96ba02461 100644 --- a/docs/data/charts/axis/ScaleExample.tsx +++ b/docs/data/charts/axis/demos/scale-example/ScaleExample.tsx @@ -6,6 +6,7 @@ const sample = [1, 10, 30, 50, 70, 90, 100]; export default function ScaleExample() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/axis/demos/scale-example/client.ts b/docs/data/charts/axis/demos/scale-example/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/scale-example/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/scale-example/index.ts b/docs/data/charts/axis/demos/scale-example/index.ts new file mode 100644 index 0000000000000..7444c7f0d6e72 --- /dev/null +++ b/docs/data/charts/axis/demos/scale-example/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScaleExample from './ScaleExample'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScaleExample, { ClientProvider }); diff --git a/docs/data/charts/axis/SymlogScale.tsx b/docs/data/charts/axis/demos/symlog-scale/SymlogScale.tsx similarity index 97% rename from docs/data/charts/axis/SymlogScale.tsx rename to docs/data/charts/axis/demos/symlog-scale/SymlogScale.tsx index 32a1f0e65bd0c..32016626d5c14 100644 --- a/docs/data/charts/axis/SymlogScale.tsx +++ b/docs/data/charts/axis/demos/symlog-scale/SymlogScale.tsx @@ -6,6 +6,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; import { LineChart } from '@mui/x-charts/LineChart'; export default function SymlogScale() { + // @focus-start @padding 1 const [chartType, setChartType] = React.useState('bar'); const handleChartType = (event: any, newChartType: string) => { @@ -33,6 +34,7 @@ export default function SymlogScale() { {chartType === 'area' && } ); + // @focus-end } function SymlogBarChart() { diff --git a/docs/data/charts/axis/demos/symlog-scale/client.ts b/docs/data/charts/axis/demos/symlog-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/symlog-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/symlog-scale/index.ts b/docs/data/charts/axis/demos/symlog-scale/index.ts new file mode 100644 index 0000000000000..3b79762878186 --- /dev/null +++ b/docs/data/charts/axis/demos/symlog-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SymlogScale from './SymlogScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SymlogScale, { ClientProvider }); diff --git a/docs/data/charts/axis/TicksWithoutLabels.tsx b/docs/data/charts/axis/demos/ticks-without-labels/TicksWithoutLabels.tsx similarity index 93% rename from docs/data/charts/axis/TicksWithoutLabels.tsx rename to docs/data/charts/axis/demos/ticks-without-labels/TicksWithoutLabels.tsx index af4aeed6940f1..b1294a2b66183 100644 --- a/docs/data/charts/axis/TicksWithoutLabels.tsx +++ b/docs/data/charts/axis/demos/ticks-without-labels/TicksWithoutLabels.tsx @@ -7,8 +7,11 @@ import FormControlLabel from '@mui/material/FormControlLabel'; import Radio from '@mui/material/Radio'; import FormControl from '@mui/material/FormControl'; import FormLabel from '@mui/material/FormLabel'; -import { AxisValueFormatterContext, ScatterValueType } from '@mui/x-charts/models'; -import { earthquakeData } from '../dataset/earthquakeData'; +import type { + AxisValueFormatterContext, + ScatterValueType, +} from '@mui/x-charts/models'; +import { earthquakeData } from '../../../dataset/earthquakeData'; const settings = { height: 400, @@ -41,6 +44,7 @@ function valueFormatterShowAll(value: any) { } export default function TicksWithoutLabels() { + // @focus-start @padding 1 const [tickFormatter, setTickFormatter] = React.useState( () => valueFormatterIgnoreEmpty, ); @@ -97,4 +101,5 @@ export default function TicksWithoutLabels() { ); + // @focus-end } diff --git a/docs/data/charts/axis/demos/ticks-without-labels/client.ts b/docs/data/charts/axis/demos/ticks-without-labels/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/axis/demos/ticks-without-labels/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/axis/demos/ticks-without-labels/index.ts b/docs/data/charts/axis/demos/ticks-without-labels/index.ts new file mode 100644 index 0000000000000..7b91d3b2eb25e --- /dev/null +++ b/docs/data/charts/axis/demos/ticks-without-labels/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TicksWithoutLabels from './TicksWithoutLabels'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TicksWithoutLabels, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/BarChartStackedBySign.js b/docs/data/charts/bar-demo/BarChartStackedBySign.js deleted file mode 100644 index c2beb3c2a76c9..0000000000000 --- a/docs/data/charts/bar-demo/BarChartStackedBySign.js +++ /dev/null @@ -1,30 +0,0 @@ -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const pData = [2400, 1398, -9800, 3908, 4800, -3800, 4300]; -const uData = [4000, -3000, -2000, 2780, -1890, 2390, 3490]; - -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function BarChartStackedBySign() { - return ( - - - - ); -} diff --git a/docs/data/charts/bar-demo/BarChartStackedBySign.tsx.preview b/docs/data/charts/bar-demo/BarChartStackedBySign.tsx.preview deleted file mode 100644 index 772c2a77bd731..0000000000000 --- a/docs/data/charts/bar-demo/BarChartStackedBySign.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bar-demo/BiaxialBarChart.js b/docs/data/charts/bar-demo/BiaxialBarChart.js deleted file mode 100644 index 6f18fedbbc8b6..0000000000000 --- a/docs/data/charts/bar-demo/BiaxialBarChart.js +++ /dev/null @@ -1,43 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import Box from '@mui/material/Box'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; - -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function BiaxialBarChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/bar-demo/HistogramBarChart.js b/docs/data/charts/bar-demo/HistogramBarChart.js deleted file mode 100644 index ff6ec4016f38e..0000000000000 --- a/docs/data/charts/bar-demo/HistogramBarChart.js +++ /dev/null @@ -1,96 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Slider from '@mui/material/Slider'; -import Typography from '@mui/material/Typography'; -import { BarChart, barClasses } from '@mui/x-charts/BarChart'; - -/** - * Split `values` into `binCount` equal-width bins. - * Each bin reports its [x0, x1) range and how many values fall into it. - * - * Feed the returned array to a BarChart whose x-axis uses - * `scaleType: 'band'` and zero gaps, so adjacent bars touch like a histogram. - */ -function computeBins(values, binCount) { - const min = Math.min(...values); - const max = Math.max(...values); - const step = (max - min) / binCount; - const bins = Array.from({ length: binCount }, (_, i) => ({ - x0: min + i * step, - x1: min + (i + 1) * step, - count: 0, - })); - for (const value of values) { - const index = Math.min(Math.floor((value - min) / step), binCount - 1); - bins[index].count += 1; - } - return bins; -} - -// --------------------------------------------------------------------------- -// Replace this section with your own data source — an array of numbers from -// your API, file, or calculation. Anything `computeBins` can iterate over. -// -// The demo synthesizes 1,000 samples from a normal distribution (μ=50, σ=12) -// with a seeded random generator so the chart is deterministic across SSR -// and client hydration. -function createSeededRandom(seed) { - let state = seed; - return () => { - state = (state * 1664525 + 1013904223) % 4294967296; - return state / 4294967296; - }; -} - -const random = createSeededRandom(42); -const data = Array.from({ length: 1000 }, () => { - const u = 1 - random(); - const v = random(); - return 50 + 12 * Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v); -}); -// --------------------------------------------------------------------------- - -export default function HistogramBarChart() { - const [binCount, setBinCount] = React.useState(20); - - const dataset = React.useMemo( - () => - computeBins(data, binCount).map((bin) => ({ - bin: `${bin.x0.toFixed(1)}–${bin.x1.toFixed(1)}`, - count: bin.count, - })), - [binCount], - ); - - return ( - - - - Bin count - - setBinCount(value)} - valueLabelDisplay="auto" - min={5} - max={60} - aria-labelledby="histogram-bin-count" - /> - - ); -} diff --git a/docs/data/charts/bar-demo/MixedBarChart.js b/docs/data/charts/bar-demo/MixedBarChart.js deleted file mode 100644 index 48ec879570244..0000000000000 --- a/docs/data/charts/bar-demo/MixedBarChart.js +++ /dev/null @@ -1,32 +0,0 @@ -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const amtData = [2400, 2210, 2290, 2000, 2181, 2500, 2100]; - -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function MixedBarChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/bar-demo/MixedBarChart.tsx.preview b/docs/data/charts/bar-demo/MixedBarChart.tsx.preview deleted file mode 100644 index 937fe69460e4a..0000000000000 --- a/docs/data/charts/bar-demo/MixedBarChart.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bar-demo/PopulationPyramidBarChart.js b/docs/data/charts/bar-demo/PopulationPyramidBarChart.js deleted file mode 100644 index 797bc0b99bf65..0000000000000 --- a/docs/data/charts/bar-demo/PopulationPyramidBarChart.js +++ /dev/null @@ -1,107 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const ageGroups = [ - '100+ yrs', - '95-99 yrs', - '90-94 yrs', - '85-89 yrs', - '80-84 yrs', - '75-79 yrs', - '70-74 yrs', - '65-69 yrs', - '60-64 yrs', - '55-59 yrs', - '50-54 yrs', - '45-49 yrs', - '40-44 yrs', - '35-39 yrs', - '30-34 yrs', - '25-29 yrs', - '20-24 yrs', - '15-19 yrs', - '10-14 yrs', - '5-9 yrs', - '0-4 yrs', -]; - -const male = [ - 1139, 8291, 50323, 201240, 476263, 696606, 1012668, 1478069, 2042614, 2068112, - 2258061, 2061862, 2067075, 1808706, 1796779, 1933726, 1620461, 1183580, 1189663, - 1097221, 766227, -]; - -const female = [ - 5770, 36739, 168603, 445118, 762492, 899933, 1152098, 1585781, 2105499, 2045845, - 2231491, 2000130, 1967944, 1673805, 1593655, 1695058, 1484776, 1104293, 1122176, - 1044863, 727814, -]; - -const numberFormatter = Intl.NumberFormat('en-US', { - useGrouping: true, -}); -const numberWithSuffixFormatter = new Intl.NumberFormat('en-US', { - notation: 'compact', -}); -const valueFormatter = (population) => - population ? `${numberFormatter.format(Math.abs(population))}` : ''; - -export default function PopulationPyramidBarChart() { - return ( - - - South Korea Population Pyramid - 2022 - - -population), - label: 'Male', - type: 'bar', - valueFormatter, - stack: 'stack', - }, - { - data: female, - label: 'Female', - type: 'bar', - valueFormatter, - stack: 'stack', - }, - ]} - yAxis={[ - { - data: ageGroups, - width: 60, - tickLabelInterval: (value, index) => index % 2 === 0, - disableLine: true, - disableTicks: true, - }, - ]} - xAxis={[ - { - valueFormatter: (population) => - numberWithSuffixFormatter.format(Math.abs(population)), - disableLine: true, - disableTicks: true, - domainLimit(min, max) { - const extremum = Math.max(-min.valueOf(), max.valueOf()); - const roundedExtremum = Math.ceil(extremum / 100_000) * 100_000; - return { min: -roundedExtremum, max: roundedExtremum }; - }, - }, - ]} - grid={{ vertical: true }} - /> - Source: KOSIS - - ); -} diff --git a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.js b/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.js deleted file mode 100644 index fbecdb826ce69..0000000000000 --- a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.js +++ /dev/null @@ -1,30 +0,0 @@ -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, -9800, 3908, 4800, -3800, 4300]; - -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function PositiveAndNegativeBarChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx.preview b/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx.preview deleted file mode 100644 index 10fe40be215d5..0000000000000 --- a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bar-demo/SimpleBarChart.js b/docs/data/charts/bar-demo/SimpleBarChart.js deleted file mode 100644 index 1cb216754aa58..0000000000000 --- a/docs/data/charts/bar-demo/SimpleBarChart.js +++ /dev/null @@ -1,29 +0,0 @@ -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function SimpleBarChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/bar-demo/SimpleBarChart.tsx.preview b/docs/data/charts/bar-demo/SimpleBarChart.tsx.preview deleted file mode 100644 index 5e0944ccf8bf9..0000000000000 --- a/docs/data/charts/bar-demo/SimpleBarChart.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bar-demo/StackedBarChart.js b/docs/data/charts/bar-demo/StackedBarChart.js deleted file mode 100644 index a561995bcd031..0000000000000 --- a/docs/data/charts/bar-demo/StackedBarChart.js +++ /dev/null @@ -1,29 +0,0 @@ -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function StackedBarChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/bar-demo/StackedBarChart.tsx.preview b/docs/data/charts/bar-demo/StackedBarChart.tsx.preview deleted file mode 100644 index 620f9e9b525ef..0000000000000 --- a/docs/data/charts/bar-demo/StackedBarChart.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bar-demo/TinyBarChart.js b/docs/data/charts/bar-demo/TinyBarChart.js deleted file mode 100644 index 2cdc96f1b830d..0000000000000 --- a/docs/data/charts/bar-demo/TinyBarChart.js +++ /dev/null @@ -1,26 +0,0 @@ -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarPlot } from '@mui/x-charts/BarChart'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function TinyBarChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/bar-demo/TinyBarChart.tsx.preview b/docs/data/charts/bar-demo/TinyBarChart.tsx.preview deleted file mode 100644 index 2711f54ce7a08..0000000000000 --- a/docs/data/charts/bar-demo/TinyBarChart.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/charts/bar-demo/WaterfallChart.js b/docs/data/charts/bar-demo/WaterfallChart.js deleted file mode 100644 index bd69afdf7ab29..0000000000000 --- a/docs/data/charts/bar-demo/WaterfallChart.js +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from 'react'; -import { useTheme } from '@mui/system'; -import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; - -const dollarFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - compactDisplay: 'short', - currency: 'USD', - maximumFractionDigits: 0, -}); - -export default function WaterfallChart() { - const theme = useTheme(); - const palette = rainbowSurgePalette(theme.palette.mode); - const blue = palette[0]; - const red = palette[2]; - const green = palette[4]; - - return ( - dollarFormatter.format(value), - }, - ]} - series={[ - { - type: 'rangeBar', - data: [ - [0, 500_000], - [500_000, 650_000], - [650_000, 730_000], - [730_000, 530_000], - [530_000, 455_000], - [455_000, 335_000], - [335_000, 280_000], - [0, 280_000], - ], - valueFormatter: (value) => - value === null ? null : dollarFormatter.format(value[1] - value[0]), - colorGetter: (data) => { - const value = data?.value; - - if (value == null || value[0] === 0) { - return blue; - } - - return value[1] - value[0] >= 0 ? green : red; - }, - }, - ]} - height={300} - /> - ); -} diff --git a/docs/data/charts/bar-demo/bar-demo.md b/docs/data/charts/bar-demo/bar-demo.md index 1129121a7511c..5cf2038c74289 100644 --- a/docs/data/charts/bar-demo/bar-demo.md +++ b/docs/data/charts/bar-demo/bar-demo.md @@ -10,41 +10,41 @@ components: BarChart, BarElement, BarPlot ## TinyBarChart -{{"demo": "TinyBarChart.js"}} +{{"component": "file://./demos/tiny-bar-chart/index.ts"}} ## SimpleBarChart -{{"demo": "SimpleBarChart.js"}} +{{"component": "file://./demos/simple-bar-chart/index.ts"}} ## StackedBarChart -{{"demo": "StackedBarChart.js"}} +{{"component": "file://./demos/stacked-bar-chart/index.ts"}} ## MixedBarChart -{{"demo": "MixedBarChart.js"}} +{{"component": "file://./demos/mixed-bar-chart/index.ts"}} ## PositiveAndNegativeBarChart -{{"demo": "PositiveAndNegativeBarChart.js"}} +{{"component": "file://./demos/positive-and-negative-bar-chart/index.ts"}} ## BarChartStackedBySign -{{"demo": "BarChartStackedBySign.js"}} +{{"component": "file://./demos/bar-chart-stacked-by-sign/index.ts"}} ## BiaxialBarChart -{{"demo": "BiaxialBarChart.js"}} +{{"component": "file://./demos/biaxial-bar-chart/index.ts"}} ## Population pyramid -{{"demo": "PopulationPyramidBarChart.js"}} +{{"component": "file://./demos/population-pyramid-bar-chart/index.ts"}} ## Waterfall chart [](/x/introduction/licensing/#premium-plan 'Premium plan') The following demo shows a waterfall chart built with a [range bar chart](/x/react-charts/range-bar/). -{{"demo": "WaterfallChart.js"}} +{{"component": "file://./demos/waterfall-chart/index.ts"}} ## Histogram @@ -54,4 +54,4 @@ The Bar Chart has no built-in histogram, so split your dataset into equal-width Use a `band` x-axis with `categoryGapRatio` and `barGapRatio` set to `0` so adjacent bars touch — what makes a histogram readable. To avoid artifacts between bars, set the `shape-rendering` to `'crispEdges'` for the bars. -{{"demo": "HistogramBarChart.js"}} +{{"component": "file://./demos/histogram-bar-chart/index.ts"}} diff --git a/docs/data/charts/bar-demo/BarChartStackedBySign.tsx b/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/BarChartStackedBySign.tsx similarity index 93% rename from docs/data/charts/bar-demo/BarChartStackedBySign.tsx rename to docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/BarChartStackedBySign.tsx index c2beb3c2a76c9..66b1cdca4cad0 100644 --- a/docs/data/charts/bar-demo/BarChartStackedBySign.tsx +++ b/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/BarChartStackedBySign.tsx @@ -17,6 +17,7 @@ const xLabels = [ export default function BarChartStackedBySign() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/client.ts b/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/index.ts b/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/index.ts new file mode 100644 index 0000000000000..d2a0b1a012780 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/bar-chart-stacked-by-sign/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarChartStackedBySign from './BarChartStackedBySign'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarChartStackedBySign, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/BiaxialBarChart.tsx b/docs/data/charts/bar-demo/demos/biaxial-bar-chart/BiaxialBarChart.tsx similarity index 94% rename from docs/data/charts/bar-demo/BiaxialBarChart.tsx rename to docs/data/charts/bar-demo/demos/biaxial-bar-chart/BiaxialBarChart.tsx index 6cff1a84c43cf..2316aa5fed568 100644 --- a/docs/data/charts/bar-demo/BiaxialBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/biaxial-bar-chart/BiaxialBarChart.tsx @@ -17,6 +17,7 @@ const xLabels = [ export default function BiaxialBarChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bar-demo/demos/biaxial-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/biaxial-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/biaxial-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/biaxial-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/biaxial-bar-chart/index.ts new file mode 100644 index 0000000000000..f629c2c471441 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/biaxial-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BiaxialBarChart from './BiaxialBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BiaxialBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/HistogramBarChart.tsx b/docs/data/charts/bar-demo/demos/histogram-bar-chart/HistogramBarChart.tsx similarity index 98% rename from docs/data/charts/bar-demo/HistogramBarChart.tsx rename to docs/data/charts/bar-demo/demos/histogram-bar-chart/HistogramBarChart.tsx index c55f4b101d4d2..0348be5551bc6 100644 --- a/docs/data/charts/bar-demo/HistogramBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/histogram-bar-chart/HistogramBarChart.tsx @@ -53,6 +53,7 @@ const data = Array.from({ length: 1000 }, () => { // --------------------------------------------------------------------------- export default function HistogramBarChart() { + // @focus-start @padding 1 const [binCount, setBinCount] = React.useState(20); const dataset = React.useMemo( @@ -95,4 +96,5 @@ export default function HistogramBarChart() { /> ); + // @focus-end } diff --git a/docs/data/charts/bar-demo/demos/histogram-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/histogram-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/histogram-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/histogram-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/histogram-bar-chart/index.ts new file mode 100644 index 0000000000000..f46915f43e526 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/histogram-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HistogramBarChart from './HistogramBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HistogramBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/MixedBarChart.tsx b/docs/data/charts/bar-demo/demos/mixed-bar-chart/MixedBarChart.tsx similarity index 93% rename from docs/data/charts/bar-demo/MixedBarChart.tsx rename to docs/data/charts/bar-demo/demos/mixed-bar-chart/MixedBarChart.tsx index 48ec879570244..2656c0aaf0c8c 100644 --- a/docs/data/charts/bar-demo/MixedBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/mixed-bar-chart/MixedBarChart.tsx @@ -18,6 +18,7 @@ const xLabels = [ export default function MixedBarChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bar-demo/demos/mixed-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/mixed-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/mixed-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/mixed-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/mixed-bar-chart/index.ts new file mode 100644 index 0000000000000..ba46a7d70ca71 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/mixed-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MixedBarChart from './MixedBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MixedBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/PopulationPyramidBarChart.tsx b/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/PopulationPyramidBarChart.tsx similarity index 98% rename from docs/data/charts/bar-demo/PopulationPyramidBarChart.tsx rename to docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/PopulationPyramidBarChart.tsx index ea148593cf099..cba00cf8e8a30 100644 --- a/docs/data/charts/bar-demo/PopulationPyramidBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/PopulationPyramidBarChart.tsx @@ -50,6 +50,7 @@ const valueFormatter = (population: number | null) => export default function PopulationPyramidBarChart() { return ( + {/* @focus-start */} Source: KOSIS + {/* @focus-end */} ); } diff --git a/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/index.ts new file mode 100644 index 0000000000000..cafb90cbe6992 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/population-pyramid-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PopulationPyramidBarChart from './PopulationPyramidBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PopulationPyramidBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx b/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/PositiveAndNegativeBarChart.tsx similarity index 92% rename from docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx rename to docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/PositiveAndNegativeBarChart.tsx index fbecdb826ce69..78d1f693d9343 100644 --- a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/PositiveAndNegativeBarChart.tsx @@ -17,6 +17,7 @@ const xLabels = [ export default function PositiveAndNegativeBarChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/index.ts new file mode 100644 index 0000000000000..e835d3b76ce82 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/positive-and-negative-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PositiveAndNegativeBarChart from './PositiveAndNegativeBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PositiveAndNegativeBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/SimpleBarChart.tsx b/docs/data/charts/bar-demo/demos/simple-bar-chart/SimpleBarChart.tsx similarity index 92% rename from docs/data/charts/bar-demo/SimpleBarChart.tsx rename to docs/data/charts/bar-demo/demos/simple-bar-chart/SimpleBarChart.tsx index 1cb216754aa58..9ef43e156cfd0 100644 --- a/docs/data/charts/bar-demo/SimpleBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/simple-bar-chart/SimpleBarChart.tsx @@ -16,6 +16,7 @@ const xLabels = [ export default function SimpleBarChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bar-demo/demos/simple-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/simple-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/simple-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/simple-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/simple-bar-chart/index.ts new file mode 100644 index 0000000000000..1a87c781036bd --- /dev/null +++ b/docs/data/charts/bar-demo/demos/simple-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SimpleBarChart from './SimpleBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SimpleBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/StackedBarChart.tsx b/docs/data/charts/bar-demo/demos/stacked-bar-chart/StackedBarChart.tsx similarity index 93% rename from docs/data/charts/bar-demo/StackedBarChart.tsx rename to docs/data/charts/bar-demo/demos/stacked-bar-chart/StackedBarChart.tsx index a561995bcd031..f005f80c11ef2 100644 --- a/docs/data/charts/bar-demo/StackedBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/stacked-bar-chart/StackedBarChart.tsx @@ -16,6 +16,7 @@ const xLabels = [ export default function StackedBarChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bar-demo/demos/stacked-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/stacked-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/stacked-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/stacked-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/stacked-bar-chart/index.ts new file mode 100644 index 0000000000000..ab510a215a684 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/stacked-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackedBarChart from './StackedBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackedBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/TinyBarChart.tsx b/docs/data/charts/bar-demo/demos/tiny-bar-chart/TinyBarChart.tsx similarity index 91% rename from docs/data/charts/bar-demo/TinyBarChart.tsx rename to docs/data/charts/bar-demo/demos/tiny-bar-chart/TinyBarChart.tsx index 2cdc96f1b830d..3d3deb0de57f0 100644 --- a/docs/data/charts/bar-demo/TinyBarChart.tsx +++ b/docs/data/charts/bar-demo/demos/tiny-bar-chart/TinyBarChart.tsx @@ -14,6 +14,7 @@ const xLabels = [ export default function TinyBarChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bar-demo/demos/tiny-bar-chart/client.ts b/docs/data/charts/bar-demo/demos/tiny-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/tiny-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/tiny-bar-chart/index.ts b/docs/data/charts/bar-demo/demos/tiny-bar-chart/index.ts new file mode 100644 index 0000000000000..4338e738c4d32 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/tiny-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TinyBarChart from './TinyBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TinyBarChart, { ClientProvider }); diff --git a/docs/data/charts/bar-demo/WaterfallChart.tsx b/docs/data/charts/bar-demo/demos/waterfall-chart/WaterfallChart.tsx similarity index 97% rename from docs/data/charts/bar-demo/WaterfallChart.tsx rename to docs/data/charts/bar-demo/demos/waterfall-chart/WaterfallChart.tsx index 082e7c61605db..6dbaf4835b3c4 100644 --- a/docs/data/charts/bar-demo/WaterfallChart.tsx +++ b/docs/data/charts/bar-demo/demos/waterfall-chart/WaterfallChart.tsx @@ -11,6 +11,7 @@ const dollarFormatter = new Intl.NumberFormat('en-US', { }); export default function WaterfallChart() { + // @focus-start @padding 1 const theme = useTheme(); const palette = rainbowSurgePalette(theme.palette.mode); const blue = palette[0]; @@ -68,4 +69,5 @@ export default function WaterfallChart() { height={300} /> ); + // @focus-end } diff --git a/docs/data/charts/bar-demo/demos/waterfall-chart/client.ts b/docs/data/charts/bar-demo/demos/waterfall-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bar-demo/demos/waterfall-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bar-demo/demos/waterfall-chart/index.ts b/docs/data/charts/bar-demo/demos/waterfall-chart/index.ts new file mode 100644 index 0000000000000..f843a1c95ab40 --- /dev/null +++ b/docs/data/charts/bar-demo/demos/waterfall-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import WaterfallChart from './WaterfallChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, WaterfallChart, { ClientProvider }); diff --git a/docs/data/charts/bars/BarAnimation.js b/docs/data/charts/bars/BarAnimation.js deleted file mode 100644 index b315a40e30519..0000000000000 --- a/docs/data/charts/bars/BarAnimation.js +++ /dev/null @@ -1,147 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import Slider from '@mui/material/Slider'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function BarAnimation() { - const [seriesNb, setSeriesNb] = React.useState(2); - const [itemNb, setItemNb] = React.useState(5); - const [skipAnimation, setSkipAnimation] = React.useState(false); - - const handleItemNbChange = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setItemNb(newValue); - }; - const handleSeriesNbChange = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setSeriesNb(newValue); - }; - - return ( - - ({ ...s, data: s.data.slice(0, itemNb) }))} - skipAnimation={skipAnimation} - margin={{ left: 0 }} - /> - setSkipAnimation(event.target.checked)} /> - } - label="skipAnimation" - labelPlacement="end" - /> - - Number of items - - - - Number of series - - - - ); -} - -const highlightScope = { - highlight: 'series', - fade: 'global', -}; - -const series = [ - { - label: 'series 1', - data: [ - 2423, 2210, 764, 1879, 1478, 1373, 1891, 2171, 620, 1269, 724, 1707, 1188, - 1879, 626, 1635, 2177, 516, 1793, 1598, - ], - }, - { - label: 'series 2', - data: [ - 2362, 2254, 1962, 1336, 586, 1069, 2194, 1629, 2173, 2031, 1757, 862, 2446, - 910, 2430, 2300, 805, 1835, 1684, 2197, - ], - }, - { - label: 'series 3', - data: [ - 1145, 1214, 975, 2266, 1768, 2341, 747, 1282, 1780, 1766, 2115, 1720, 1057, - 2000, 1716, 2253, 619, 1626, 1209, 1786, - ], - }, - { - label: 'series 4', - data: [ - 2361, 979, 2430, 1768, 1913, 2342, 1868, 1319, 1038, 2139, 1691, 935, 2262, - 1580, 692, 1559, 1344, 1442, 1593, 1889, - ], - }, - { - label: 'series 5', - data: [ - 968, 1371, 1381, 1060, 1327, 934, 1779, 1361, 878, 1055, 1737, 2380, 875, 2408, - 1066, 1802, 1442, 1567, 1552, 1742, - ], - }, - { - label: 'series 6', - data: [ - 2316, 1845, 2057, 1479, 1859, 1015, 1569, 1448, 1354, 1007, 799, 1748, 1454, - 1968, 1129, 1196, 2158, 540, 1482, 880, - ], - }, - { - label: 'series 7', - data: [ - 2140, 2082, 708, 2032, 554, 1365, 2121, 1639, 2430, 2440, 814, 1328, 883, 1811, - 2322, 1743, 700, 2131, 1473, 957, - ], - }, - { - label: 'series 8', - data: [ - 1074, 744, 2487, 823, 2252, 2317, 2139, 1818, 2256, 1769, 1123, 1461, 672, - 1335, 960, 1871, 2305, 1231, 2005, 908, - ], - }, - { - label: 'series 9', - data: [ - 1792, 886, 2472, 1546, 2164, 2323, 2435, 1268, 2368, 2158, 2200, 1316, 552, - 1874, 1771, 1038, 1838, 2029, 1793, 1117, - ], - }, - { - label: 'series 10', - data: [ - 1433, 1161, 1107, 1517, 1410, 1058, 676, 1280, 1936, 1774, 698, 1721, 1421, - 785, 1752, 800, 990, 1809, 1985, 665, - ], - }, -].map((s) => ({ ...s, highlightScope })); diff --git a/docs/data/charts/bars/BarBatchRenderer.js b/docs/data/charts/bars/BarBatchRenderer.js deleted file mode 100644 index 0bef9cdd92161..0000000000000 --- a/docs/data/charts/bars/BarBatchRenderer.js +++ /dev/null @@ -1,74 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import data from '../dataset/sp500-intraday.json'; - -const tickLabelDateFormatter = new Intl.DateTimeFormat(undefined, { - month: 'short', - day: 'numeric', -}); - -export default function BarBatchRenderer() { - const [renderer, setRenderer] = React.useState('svg-batch'); - - return ( - - - Rendering Strategy - setRenderer(event.target.value)} - > - } - label="Individual Bars (default)" - /> - } - label="Batch Bar Rendering" - /> - - - new Date(d.date)), - valueFormatter: (v) => tickLabelDateFormatter.format(v), - zoom: true, - ordinalTimeTicks: [ - 'years', - 'quarterly', - 'months', - 'biweekly', - 'weeks', - 'days', - ], - }, - ]} - series={[ - { - data: data.map((d) => d.close), - label: 'Close', - highlightScope: { highlight: 'item', fade: 'global' }, - }, - { - data: data.map((d) => d.open), - label: 'Open', - highlightScope: { highlight: 'item', fade: 'global' }, - }, - ]} - height={300} - renderer={renderer} - /> - - ); -} diff --git a/docs/data/charts/bars/BarClick.js b/docs/data/charts/bars/BarClick.js deleted file mode 100644 index f49a2c5dec940..0000000000000 --- a/docs/data/charts/bars/BarClick.js +++ /dev/null @@ -1,97 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; - -import { BarChart } from '@mui/x-charts/BarChart'; - -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const barChartsParams = { - series: [ - { - id: 'series-1', - data: [3, 4, 1, 6, 5], - label: 'A', - stack: 'total', - highlightScope: { - highlight: 'item', - }, - }, - { - id: 'series-2', - data: [4, 3, 1, 5, 8], - label: 'B', - stack: 'total', - highlightScope: { - highlight: 'item', - }, - }, - { - id: 'series-3', - data: [4, 2, 5, 4, 1], - label: 'C', - highlightScope: { - highlight: 'item', - }, - }, - ], - xAxis: [{ data: ['0', '3', '6', '9', '12'], id: 'axis1' }], - height: 400, - margin: { left: 0 }, -}; - -export default function BarClick() { - const [itemData, setItemData] = React.useState(); - const [axisData, setAxisData] = React.useState(); - - return ( - - - setItemData(d)} - onAxisClick={(event, d) => setAxisData(d)} - /> - - - - - Click on the chart - { - setItemData(undefined); - setAxisData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/bars/BarGap.js b/docs/data/charts/bars/BarGap.js deleted file mode 100644 index 7779ab80bf8d9..0000000000000 --- a/docs/data/charts/bars/BarGap.js +++ /dev/null @@ -1,68 +0,0 @@ -import Typography from '@mui/material/Typography'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { balanceSheet, addLabels } from './netflixsBalanceSheet'; - -const series = addLabels([ - { dataKey: 'totAss' }, - { dataKey: 'totLia', stack: 'passive' }, - { dataKey: 'totEq', stack: 'passive' }, -]); - -export default function BarGap() { - return ( - ( -
- Netflix balance sheet - `$ ${v / 1000000}B` }]} - hideLegend - /> -
- )} - getCode={({ props }) => { - return `import { BarChart } from '@mui/x-charts/BarChart'; - -`; - }} - /> - ); -} diff --git a/docs/data/charts/bars/BarGradient.js b/docs/data/charts/bars/BarGradient.js deleted file mode 100644 index 99fb3d53e4594..0000000000000 --- a/docs/data/charts/bars/BarGradient.js +++ /dev/null @@ -1,42 +0,0 @@ -import * as React from 'react'; -import { BarChart, barClasses } from '@mui/x-charts/BarChart'; - -const settings = { - xAxis: [{ data: ['group A', 'group B', 'group C'] }], - series: [ - { id: '1', data: [4, 3, 5], barLabel: 'value' }, - { id: '2', data: [1, 6, 3], barLabel: 'value' }, - { id: '3', data: [2, 5, 6], barLabel: 'value' }, - ], - height: 300, - margin: { left: 0 }, -}; - -export default function BarGradient() { - return ( - - - - - - ); -} - -function Gradient(props) { - return ( - - - - - ); -} diff --git a/docs/data/charts/bars/BarGradient.tsx.preview b/docs/data/charts/bars/BarGradient.tsx.preview deleted file mode 100644 index 7af48b4a75696..0000000000000 --- a/docs/data/charts/bars/BarGradient.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/data/charts/bars/BarLabel.js b/docs/data/charts/bars/BarLabel.js deleted file mode 100644 index 6250494e67997..0000000000000 --- a/docs/data/charts/bars/BarLabel.js +++ /dev/null @@ -1,26 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -const dollarFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - maximumFractionDigits: 0, -}); - -export default function BarLabel() { - return ( - dollarFormatter.format(item.value), - }, - { data: [2, 5, 6] }, - ]} - height={300} - margin={{ left: 0 }} - yAxis={[{ width: 30 }]} - /> - ); -} diff --git a/docs/data/charts/bars/BarLabel.tsx.preview b/docs/data/charts/bars/BarLabel.tsx.preview deleted file mode 100644 index 4c896788826ac..0000000000000 --- a/docs/data/charts/bars/BarLabel.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - dollarFormatter.format(item.value!), - }, - { data: [2, 5, 6] }, - ]} - height={300} - margin={{ left: 0 }} - yAxis={[{ width: 30 }]} -/> \ No newline at end of file diff --git a/docs/data/charts/bars/BarLabelPlacement.js b/docs/data/charts/bars/BarLabelPlacement.js deleted file mode 100644 index d7d3567ad53a2..0000000000000 --- a/docs/data/charts/bars/BarLabelPlacement.js +++ /dev/null @@ -1,16 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function BarLabelPlacement() { - return ( - - ); -} diff --git a/docs/data/charts/bars/BarLabelPlacement.tsx.preview b/docs/data/charts/bars/BarLabelPlacement.tsx.preview deleted file mode 100644 index bf763cfc31124..0000000000000 --- a/docs/data/charts/bars/BarLabelPlacement.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bars/BarOECDHouseholdSavings.js b/docs/data/charts/bars/BarOECDHouseholdSavings.js deleted file mode 100644 index c229c5c07b7d2..0000000000000 --- a/docs/data/charts/bars/BarOECDHouseholdSavings.js +++ /dev/null @@ -1,110 +0,0 @@ -import * as React from 'react'; -import { BarChart, barClasses } from '@mui/x-charts/BarChart'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import { countryData } from '../dataset/countryData'; -import householdSavings from '../dataset/oecdHouseholdSavings2024.json'; - -/* Source: https://www.oecd.org/en/data/indicators/household-savings.html */ -const savings = Object.entries(householdSavings) - .map(([country, value]) => ({ - country, - value, - })) - .sort((a, b) => a.value - b.value); - -const percentageFormatter = new Intl.NumberFormat('en-US', { - style: 'percent', - maximumFractionDigits: 1, -}); - -const settings = { - height: 600, - xAxis: [{ label: 'Household Savings (%)' }], - layout: 'horizontal', - hideLegend: true, -}; - -export default function BarOECDHouseholdSavings() { - const [gradientUnits, setGradientUnits] = React.useState('userSpaceOnUse'); - - return ( - - - Household Savings in OECD Countries (2016) - - - Gradient Units - setGradientUnits(event.target.value)} - > - } - label="objectBoundingBox (default)" - /> - } - label="userSpaceOnUse" - /> - - - v.country), - valueFormatter: (value) => countryData[value].country, - width: 100, - }, - ]} - series={[ - { - label: 'Household Savings', - data: savings.map((v) => v.value), - color: 'url(#savings-gradient)', - valueFormatter: (value) => percentageFormatter.format(value / 100), - }, - ]} - sx={ - gradientUnits === 'userSpaceOnUse' - ? { - [`.${barClasses.element}`]: { - fill: 'url(#savings-gradient-user-space)', - }, - } - : undefined - } - > - - - - Source: Our World in Data - - ); -} - -function Gradient(props) { - return ( - - - - - - ); -} diff --git a/docs/data/charts/bars/BarScatterCompostion.js b/docs/data/charts/bars/BarScatterCompostion.js deleted file mode 100644 index de0425f7e8de2..0000000000000 --- a/docs/data/charts/bars/BarScatterCompostion.js +++ /dev/null @@ -1,110 +0,0 @@ -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { BarPlot, FocusedBar } from '@mui/x-charts/BarChart'; -import { ScatterPlot, FocusedScatterMark } from '@mui/x-charts/ScatterChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsGrid } from '@mui/x-charts/ChartsGrid'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { legendClasses, ChartsLegend } from '@mui/x-charts/ChartsLegend'; -import { GDPdata } from '../dataset/gdpGrowth'; - -const chartSetting = { - xAxis: [ - { - id: 'bar', - label: 'GDP growth rate', - dataKey: '2024', - colorMap: { - type: 'piecewise', - thresholds: [0], - colors: ['#ff4d4f', '#1976d2'], - }, - }, - { - id: 'scatter', - label: '2010-19 Average', - dataKey: '2010_19', - color: '#FFFF00', - }, - ], - height: 800, -}; - -const valueFormatter = (value) => (value ? `${value.toFixed(2)}%` : ''); - -const scatterValueFormatter = (value) => (value ? `${value.x.toFixed(2)}%` : ''); - -function Gradient() { - return ( - - - - - - - ); -} - -export default function BarScatterCompostion() { - return ( - - - GDP growth rate comparison (2024 vs 2010-19 Avg) - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/bars/BarsDataset.js b/docs/data/charts/bars/BarsDataset.js deleted file mode 100644 index be5ee89fdd40b..0000000000000 --- a/docs/data/charts/bars/BarsDataset.js +++ /dev/null @@ -1,28 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const chartSetting = { - yAxis: [ - { - label: 'rainfall (mm)', - width: 60, - }, - ], - height: 300, -}; - -export default function BarsDataset() { - return ( - - ); -} diff --git a/docs/data/charts/bars/BarsDataset.tsx.preview b/docs/data/charts/bars/BarsDataset.tsx.preview deleted file mode 100644 index 2521da3863779..0000000000000 --- a/docs/data/charts/bars/BarsDataset.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bars/BasicBars.js b/docs/data/charts/bars/BasicBars.js deleted file mode 100644 index 84f7ec7b0acc4..0000000000000 --- a/docs/data/charts/bars/BasicBars.js +++ /dev/null @@ -1,11 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function BasicBars() { - return ( - - ); -} diff --git a/docs/data/charts/bars/BasicBars.tsx.preview b/docs/data/charts/bars/BasicBars.tsx.preview deleted file mode 100644 index 87f1f16a3bfe8..0000000000000 --- a/docs/data/charts/bars/BasicBars.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bars/BorderRadius.js b/docs/data/charts/bars/BorderRadius.js deleted file mode 100644 index 7c18f6e155875..0000000000000 --- a/docs/data/charts/bars/BorderRadius.js +++ /dev/null @@ -1,102 +0,0 @@ -import * as React from 'react'; -import { BarChart } from '@mui/x-charts/BarChart'; -import Stack from '@mui/material/Stack'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import Slider from '@mui/material/Slider'; -import Typography from '@mui/material/Typography'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; - -export default function BorderRadius() { - const [layout, setLayout] = React.useState('vertical'); - const [radius, setRadius] = React.useState(10); - const [reverse, setReverse] = React.useState(false); - - return ( - - - - Border Radius - setRadius(value)} - valueLabelDisplay="auto" - min={0} - max={50} - sx={{ mt: 2 }} - /> - - setLayout(event.target.value)} - > - Horizontal - Vertical - - setReverse(event.target.checked)} /> - } - label="Reverse" - labelPlacement="end" - /> - - - `} - language="jsx" - copyButtonHidden - /> - - ); -} - -const dataset = [ - [3, -7, '1st'], - [0, -5, '2nd'], - [10, 0, '3rd'], - [9, 6, '4th'], -].map(([high, low, order]) => ({ - high, - low, - order, -})); - -function getChartSettings(layout, reverse) { - return { - dataset, - height: 300, - xAxis: layout === 'horizontal' ? [{ reverse }] : [{ dataKey: 'order' }], - yAxis: - layout === 'horizontal' - ? [{ scaleType: 'band', dataKey: 'order' }] - : [{ reverse }], - slotProps: { - legend: { - direction: 'horizontal', - position: { vertical: 'bottom', horizontal: 'center' }, - }, - }, - }; -} diff --git a/docs/data/charts/bars/ColorScale.js b/docs/data/charts/bars/ColorScale.js deleted file mode 100644 index b661eed8be619..0000000000000 --- a/docs/data/charts/bars/ColorScale.js +++ /dev/null @@ -1,173 +0,0 @@ -import * as React from 'react'; -import { BarChart } from '@mui/x-charts/BarChart'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const series = [{ data: [-2, -9, 12, 11, 6, -4] }]; - -export default function ColorScale() { - const [colorX, setColorX] = React.useState('piecewise'); - const [colorY, setColorY] = React.useState('None'); - - return ( - - - setColorX(event.target.value)} - > - None - piecewise - continuous - ordinal - - setColorY(event.target.value)} - > - None - piecewise - continuous - - - - value.getFullYear().toString(), - colorMap: - (colorX === 'ordinal' && { - type: 'ordinal', - colors: [ - '#ccebc5', - '#a8ddb5', - '#7bccc4', - '#4eb3d3', - '#2b8cbe', - '#08589e', - ], - }) || - (colorX === 'continuous' && { - type: 'continuous', - min: new Date(2019, 1, 1), - max: new Date(2024, 1, 1), - color: ['green', 'orange'], - }) || - (colorX === 'piecewise' && { - type: 'piecewise', - thresholds: [new Date(2021, 1, 1), new Date(2023, 1, 1)], - colors: ['blue', 'red', 'blue'], - }) || - undefined, - }, - ]} - margin={{ left: 0 }} - /> - `, - ].join('\n')} - language="jsx" - copyButtonHidden - /> - - ); -} diff --git a/docs/data/charts/bars/ColorScale.tsx b/docs/data/charts/bars/ColorScale.tsx deleted file mode 100644 index e6da10f7a1ad1..0000000000000 --- a/docs/data/charts/bars/ColorScale.tsx +++ /dev/null @@ -1,184 +0,0 @@ -import * as React from 'react'; -import { BarChart } from '@mui/x-charts/BarChart'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const series = [{ data: [-2, -9, 12, 11, 6, -4] }]; - -export default function ColorScale() { - const [colorX, setColorX] = React.useState< - 'None' | 'piecewise' | 'continuous' | 'ordinal' - >('piecewise'); - const [colorY, setColorY] = React.useState<'None' | 'piecewise' | 'continuous'>( - 'None', - ); - - return ( - - - - setColorX( - event.target.value as 'None' | 'piecewise' | 'continuous' | 'ordinal', - ) - } - > - None - piecewise - continuous - ordinal - - - setColorY(event.target.value as 'None' | 'piecewise' | 'continuous') - } - > - None - piecewise - continuous - - - - value.getFullYear().toString(), - colorMap: - (colorX === 'ordinal' && { - type: 'ordinal', - colors: [ - '#ccebc5', - '#a8ddb5', - '#7bccc4', - '#4eb3d3', - '#2b8cbe', - '#08589e', - ], - }) || - (colorX === 'continuous' && { - type: 'continuous', - min: new Date(2019, 1, 1), - max: new Date(2024, 1, 1), - color: ['green', 'orange'], - }) || - (colorX === 'piecewise' && { - type: 'piecewise', - thresholds: [new Date(2021, 1, 1), new Date(2023, 1, 1)], - colors: ['blue', 'red', 'blue'], - }) || - undefined, - }, - ]} - margin={{ left: 0 }} - /> - `, - ].join('\n')} - language="jsx" - copyButtonHidden - /> - - ); -} diff --git a/docs/data/charts/bars/CustomLabels.js b/docs/data/charts/bars/CustomLabels.js deleted file mode 100644 index dd9c6383cffd5..0000000000000 --- a/docs/data/charts/bars/CustomLabels.js +++ /dev/null @@ -1,36 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -function barLabel(item, context) { - if ((item.value ?? 0) > 10) { - return 'High'; - } - return context.bar.height < 60 ? null : item.value?.toString(); -} - -export default function CustomLabels() { - return ( - - ); -} diff --git a/docs/data/charts/bars/GridDemo.js b/docs/data/charts/bars/GridDemo.js deleted file mode 100644 index a6a250d30aa7d..0000000000000 --- a/docs/data/charts/bars/GridDemo.js +++ /dev/null @@ -1,21 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const chartSetting = { - xAxis: [{ label: 'rainfall (mm)' }], - height: 400, - margin: { left: 0 }, -}; - -export default function GridDemo() { - return ( - - ); -} diff --git a/docs/data/charts/bars/GridDemo.tsx b/docs/data/charts/bars/GridDemo.tsx deleted file mode 100644 index a6a250d30aa7d..0000000000000 --- a/docs/data/charts/bars/GridDemo.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const chartSetting = { - xAxis: [{ label: 'rainfall (mm)' }], - height: 400, - margin: { left: 0 }, -}; - -export default function GridDemo() { - return ( - - ); -} diff --git a/docs/data/charts/bars/GridDemo.tsx.preview b/docs/data/charts/bars/GridDemo.tsx.preview deleted file mode 100644 index 16f5e9ea3a1eb..0000000000000 --- a/docs/data/charts/bars/GridDemo.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bars/HorizontalBars.js b/docs/data/charts/bars/HorizontalBars.js deleted file mode 100644 index fea24ab705ced..0000000000000 --- a/docs/data/charts/bars/HorizontalBars.js +++ /dev/null @@ -1,24 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const chartSetting = { - xAxis: [ - { - label: 'rainfall (mm)', - }, - ], - height: 400, - margin: { left: 0 }, -}; - -export default function HorizontalBars() { - return ( - - ); -} diff --git a/docs/data/charts/bars/HorizontalBars.tsx.preview b/docs/data/charts/bars/HorizontalBars.tsx.preview deleted file mode 100644 index a357038ab0b33..0000000000000 --- a/docs/data/charts/bars/HorizontalBars.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bars/LabelsAboveBars.js b/docs/data/charts/bars/LabelsAboveBars.js deleted file mode 100644 index fec8812016c22..0000000000000 --- a/docs/data/charts/bars/LabelsAboveBars.js +++ /dev/null @@ -1,71 +0,0 @@ -import { useAnimate } from '@mui/x-charts/hooks'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { styled } from '@mui/material/styles'; -import { interpolateObject } from '@mui/x-charts-vendor/d3-interpolate'; - -export default function LabelsAboveBars() { - return ( - - - - - - ); -} - -const Text = styled('text')(({ theme }) => ({ - ...theme?.typography?.body2, - stroke: 'none', - fill: (theme.vars || theme)?.palette?.text?.primary, - transition: 'opacity 0.2s ease-in, fill 0.2s ease-in', - textAnchor: 'middle', - dominantBaseline: 'central', - pointerEvents: 'none', -})); - -function BarLabel(props) { - const { - seriesId, - dataIndex, - color, - isFaded, - isHighlighted, - classes, - xOrigin, - yOrigin, - x, - y, - width, - height, - layout, - skipAnimation, - ...otherProps - } = props; - - const animatedProps = useAnimate( - { x: x + width / 2, y: y - 8 }, - { - initialProps: { x: x + width / 2, y: yOrigin }, - createInterpolator: interpolateObject, - transformProps: (p) => p, - applyProps: (element, p) => { - element.setAttribute('x', p.x.toString()); - element.setAttribute('y', p.y.toString()); - }, - skip: skipAnimation, - }, - ); - - return ( - - ); -} diff --git a/docs/data/charts/bars/LabelsAboveBars.tsx.preview b/docs/data/charts/bars/LabelsAboveBars.tsx.preview deleted file mode 100644 index 1260850517ead..0000000000000 --- a/docs/data/charts/bars/LabelsAboveBars.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/data/charts/bars/MinBarSize.js b/docs/data/charts/bars/MinBarSize.js deleted file mode 100644 index 5d55c39f8e5b6..0000000000000 --- a/docs/data/charts/bars/MinBarSize.js +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import Slider from '@mui/material/Slider'; -import { BarChart } from '@mui/x-charts/BarChart'; - -// Create sparse data where some bars would be very small -const sparseData = [0.02, 5, null, 7, 0.01, 0, -0.03]; - -export default function MinBarSize() { - const [minBarSize, setMinBarSize] = React.useState(10); - - const handleChange = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setMinBarSize(newValue); - }; - - return ( - - - minBarSize: {minBarSize}px - - - `${v}`), scaleType: 'band' }]} - series={[{ data: sparseData, minBarSize }]} - height={300} - width={400} - /> - - ); -} diff --git a/docs/data/charts/bars/ShinyBarChartHorizontal.js b/docs/data/charts/bars/ShinyBarChartHorizontal.js deleted file mode 100644 index e36fad4d0bdb3..0000000000000 --- a/docs/data/charts/bars/ShinyBarChartHorizontal.js +++ /dev/null @@ -1,157 +0,0 @@ -import * as React from 'react'; -import { useTheme, styled } from '@mui/material/styles'; -import Typography from '@mui/material/Typography'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { useAnimate, useAnimateBar, useDrawingArea } from '@mui/x-charts/hooks'; -import { PiecewiseColorLegend } from '@mui/x-charts/ChartsLegend'; -import { interpolateObject } from '@mui/x-charts-vendor/d3-interpolate'; -import Box from '@mui/material/Box'; -import votesTurnout from '../dataset/votes.json'; - -export default function ShinyBarChartHorizontal() { - return ( - - - European countries with lowest & highest voter turnout - - `${value}%`, - barLabel: (v) => `${v.value}%`, - }, - ]} - layout="horizontal" - xAxis={[ - { - id: 'color', - min: 0, - max: 100, - colorMap: { - type: 'piecewise', - thresholds: [50, 85], - colors: ['#d32f2f', '#78909c', '#1976d2'], - }, - valueFormatter: (value) => `${value}%`, - }, - ]} - yAxis={[ - { - scaleType: 'band', - dataKey: 'country', - width: 140, - }, - ]} - slots={{ - legend: PiecewiseColorLegend, - barLabel: BarLabelAtBase, - bar: BarShadedBackground, - }} - slotProps={{ - legend: { - axisDirection: 'x', - markType: 'square', - labelPosition: 'inline-start', - labelFormatter: ({ index }) => { - if (index === 0) { - return 'lowest turnout'; - } - if (index === 1) { - return 'average'; - } - return 'highest turnout'; - }, - }, - }} - /> - - ); -} - -export function BarShadedBackground(props) { - const { - ownerState, - skipAnimation, - id, - dataIndex, - xOrigin, - yOrigin, - seriesId, - ...other - } = props; - const theme = useTheme(); - - const animatedProps = useAnimateBar(props); - const { width } = useDrawingArea(); - return ( - - - - - ); -} - -const Text = styled('text')(({ theme }) => ({ - ...theme?.typography?.body2, - stroke: 'none', - fill: (theme.vars || theme).palette.common.white, - transition: 'opacity 0.2s ease-in, fill 0.2s ease-in', - textAnchor: 'start', - dominantBaseline: 'central', - pointerEvents: 'none', - fontWeight: 600, -})); - -function BarLabelAtBase(props) { - const { - seriesId, - dataIndex, - color, - isFaded, - isHighlighted, - classes, - xOrigin, - yOrigin, - x, - y, - width, - height, - layout, - skipAnimation, - ...otherProps - } = props; - - const animatedProps = useAnimate( - { x: xOrigin + 8, y: y + height / 2 }, - { - initialProps: { x: xOrigin, y: y + height / 2 }, - createInterpolator: interpolateObject, - transformProps: (p) => p, - applyProps: (element, p) => { - element.setAttribute('x', p.x.toString()); - element.setAttribute('y', p.y.toString()); - }, - skip: skipAnimation, - }, - ); - - return ; -} diff --git a/docs/data/charts/bars/StackBars.js b/docs/data/charts/bars/StackBars.js deleted file mode 100644 index 8bd6e801f281d..0000000000000 --- a/docs/data/charts/bars/StackBars.js +++ /dev/null @@ -1,32 +0,0 @@ -import Typography from '@mui/material/Typography'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { addLabels, balanceSheet, valueFormatter } from './netflixsBalanceSheet'; - -export default function StackBars() { - return ( -
- Netflix balance sheet - -
- ); -} - -const config = { - height: 350, - margin: { left: 0 }, - yAxis: [{ width: 50, valueFormatter }], - hideLegend: true, -}; diff --git a/docs/data/charts/bars/StackBars.tsx.preview b/docs/data/charts/bars/StackBars.tsx.preview deleted file mode 100644 index 817d37a64945b..0000000000000 --- a/docs/data/charts/bars/StackBars.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ -Netflix balance sheet - \ No newline at end of file diff --git a/docs/data/charts/bars/StackTotalLabels.js b/docs/data/charts/bars/StackTotalLabels.js deleted file mode 100644 index 061a8a45442b6..0000000000000 --- a/docs/data/charts/bars/StackTotalLabels.js +++ /dev/null @@ -1,79 +0,0 @@ -import * as React from 'react'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { - getValueToPositionMapper, - useBarSeries, - useXScale, - useYScale, -} from '@mui/x-charts/hooks'; -import { styled } from '@mui/material/styles'; - -export default function StackTotalLabels() { - return ( - - - - - - - ); -} - -function StackTotals() { - const xScale = useXScale(); - const yScale = useYScale(); - const barSeries = useBarSeries(); - - const xMapper = getValueToPositionMapper(xScale); - const yMapper = getValueToPositionMapper(yScale); - - return ( - - {xScale.domain().map((category, dataIndex) => { - const total = barSeries.reduce( - (acc, series) => - acc + (series.stack === 'total' ? (series.data[dataIndex] ?? 0) : 0), - 0, - ); - - return ( - - {total} - - ); - })} - - ); -} - -const TotalLabel = styled('text')(({ theme }) => ({ - ...theme?.typography?.body2, - fontWeight: 600, - stroke: 'none', - fill: (theme.vars || theme)?.palette?.text?.primary, - textAnchor: 'middle', - dominantBaseline: 'auto', - pointerEvents: 'none', -})); diff --git a/docs/data/charts/bars/TickPlacementBars.js b/docs/data/charts/bars/TickPlacementBars.js deleted file mode 100644 index 479e490bb2e65..0000000000000 --- a/docs/data/charts/bars/TickPlacementBars.js +++ /dev/null @@ -1,93 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -function TickParamsSelector({ - tickPlacement, - tickLabelPlacement, - setTickPlacement, - setTickLabelPlacement, -}) { - return ( - - - - tickPlacement - - setTickPlacement(event.target.value)} - > - } label="start" /> - } label="end" /> - } label="middle" /> - } - label="extremities" - /> - - - - - tickLabelPlacement - - setTickLabelPlacement(event.target.value)} - > - } label="tick" /> - } label="middle" /> - - - - ); -} - -const chartSetting = { - yAxis: [ - { - label: 'rainfall (mm)', - width: 60, - }, - ], - series: [{ dataKey: 'seoul', label: 'Seoul rainfall', valueFormatter }], - height: 300, - margin: { left: 0 }, -}; - -export default function TickPlacementBars() { - const [tickPlacement, setTickPlacement] = React.useState('middle'); - const [tickLabelPlacement, setTickLabelPlacement] = React.useState('middle'); - - return ( -
- - -
- ); -} diff --git a/docs/data/charts/bars/TickPlacementBars.tsx.preview b/docs/data/charts/bars/TickPlacementBars.tsx.preview deleted file mode 100644 index 046c0d6725a05..0000000000000 --- a/docs/data/charts/bars/TickPlacementBars.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/bars/WebGLBars.js b/docs/data/charts/bars/WebGLBars.js deleted file mode 100644 index 21ec42a88e07a..0000000000000 --- a/docs/data/charts/bars/WebGLBars.js +++ /dev/null @@ -1,64 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; - -const POINTS = 10000; - -function generateData(seed) { - const data = new Array(POINTS); - let value = 50; - for (let i = 0; i < POINTS; i += 1) { - // Deterministic pseudo-random walk. value-in-sin breaks linear predictability. - value += Math.sin(value * i * seed * 0.13) * 4; - data[i] = Math.max(0, Math.round(value)); - } - return data; -} - -const xData = Array.from({ length: POINTS }, (_, i) => i); -const seriesA = generateData(1); -const seriesB = generateData(7); - -export default function WebGLBars() { - const [renderer, setRenderer] = React.useState('webgl'); - - return ( - - - Rendering Strategy - setRenderer(event.target.value)} - > - } - label="Individual Bars (default)" - /> - } - label="Batch Bar Rendering" - /> - } label="WebGL" /> - - - - - ); -} diff --git a/docs/data/charts/bars/bars.md b/docs/data/charts/bars/bars.md index 23d1fe19e99ec..b92dfc6e4de3d 100644 --- a/docs/data/charts/bars/bars.md +++ b/docs/data/charts/bars/bars.md @@ -16,7 +16,7 @@ Categories can be progressive (for example, time periods) or independent (for ex The horizontal bar chart below compares voter turnout in several European countries. -{{"demo": "ShinyBarChartHorizontal.js"}} +{{"component": "file://./demos/shiny-bar-chart-horizontal/index.ts"}} ## Basics @@ -30,7 +30,7 @@ Bar chart series must contain a `data` property with an array of values. You can specify bar ticks with the `xAxis` prop. The category axis uses `scaleType='band'` and its `data` should have the same length as your series. -{{"demo": "BasicBars.js"}} +{{"component": "file://./demos/basic-bars/index.ts"}} ### Using a dataset @@ -40,7 +40,7 @@ It accepts an array of objects such as `dataset={[{x: 1, y: 32}, {x: 2, y: 41}, You can reuse this data when defining the series and axes by using the `dataKey` property. For example, `xAxis={[{ dataKey: 'x' }]}` or `series={[{ dataKey: 'y' }]}`. -{{"demo": "BarsDataset.js"}} +{{"component": "file://./demos/bars-dataset/index.ts"}} ## Bar size @@ -54,14 +54,14 @@ It's the size of the gap divided by the size of the bar. So a value of `1` will result in a gap between bars equal to the bar width. A value of `-1` will make bars overlap. -{{"demo": "BarGap.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/bar-gap/index.ts", "hideToolbar": true, "bg": "playground"}} ## Stacking Bar series accept a string property called `stack`. Series with the same `stack` value are stacked on top of each other. -{{"demo": "StackBars.js"}} +{{"component": "file://./demos/stack-bars/index.ts"}} ### Stacking strategy @@ -78,7 +78,7 @@ See [Stacking](/x/react-charts/stacking/) for more details. Use the `layout="horizontal"` prop to render bar charts in a horizontal layout. If you're composing a custom component, set the `layout: 'horizontal'` property on each bar series object. -{{"demo": "HorizontalBars.js"}} +{{"component": "file://./demos/horizontal-bars/index.ts"}} ### Tick placement @@ -89,7 +89,7 @@ When using a `"band"` scale, the axis has some additional customization properti You can test all configuration options in the following demo: -{{"demo": "TickPlacementBars.js"}} +{{"component": "file://./demos/tick-placement-bars/index.ts"}} ### Date axis @@ -106,7 +106,7 @@ This property is useful when you want to ensure that bars are always visible, ev The `minBarSize` property is ignored if the series value is `null` or `0`. It also doesn't work with stacked series. -{{"demo": "MinBarSize.js"}} +{{"component": "file://./demos/min-bar-size/index.ts"}} ### Log scale @@ -122,7 +122,7 @@ You can add a grid in the background of the chart with the `grid` prop. See [Axis—Grid](/x/react-charts/axis-ticks/#grid) for details. -{{"demo": "GridDemo.js"}} +{{"component": "file://./demos/grid-demo/index.ts"}} ### Color scale @@ -137,7 +137,7 @@ Bar charts use the following, in order of priority: See [Styling—Value-based colors](/x/react-charts/styling/#value-based-colors) for the `colorMap` properties. -{{"demo": "ColorScale.js"}} +{{"component": "file://./demos/color-scale/index.ts"}} ### Border radius @@ -146,7 +146,7 @@ It works with any positive value and is properly applied to horizontal layouts, When composing a custom component, you can set the `borderRadius` prop on the `BarPlot` component. -{{"demo": "BorderRadius.js"}} +{{"component": "file://./demos/border-radius/index.ts"}} ### CSS @@ -155,7 +155,7 @@ You can customize the bar chart elements using CSS selectors. Each series renders a `g` element that contains a `data-series` attribute. You can use this attribute to target elements based on their series. -{{"demo": "BarGradient.js"}} +{{"component": "file://./demos/bar-gradient/index.ts"}} ### Gradients @@ -174,7 +174,7 @@ In the example below, there are two gradients: The first gradient is used for elements showing the whole gradient, such as tooltips and legend. The second one is shown in the bars themselves that display the part of the gradient that corresponds to their value. -{{"demo": "BarOECDHouseholdSavings.js"}} +{{"component": "file://./demos/bar-oecd-household-savings/index.ts"}} ## Labels @@ -187,7 +187,7 @@ Alternatively, the `barLabel` property accepts a function that is called with th In the example below, the value of the first series is displayed using the default formatter, and the value of the second series is formatted as US dollars. The labels of the third series are hidden. -{{"demo": "BarLabel.js"}} +{{"component": "file://./demos/bar-label/index.ts"}} ### Label placement @@ -198,7 +198,7 @@ To customize the position of the bar label, set a series' `barLabelPlacement` pr For a vertical positive bar, the label is above its top edge. For a horizontal negative bar, the label is to the left of its leftmost limit. -{{"demo": "BarLabelPlacement.js"}} +{{"component": "file://./demos/bar-label-placement/index.ts"}} :::info When using `outside` placement, if the label doesn't fit in the chart area, it will be clipped. @@ -212,12 +212,12 @@ Labels are not displayed if the function returns `null`. The example below displays the text `'High'` on values higher than 10 and hides values when the generated bar height is lower than 60px. -{{"demo": "CustomLabels.js"}} +{{"component": "file://./demos/custom-labels/index.ts"}} You can further customize the labels by providing a component to the `barLabel` slot. The example below positions the labels above the bars they refer to. -{{"demo": "LabelsAboveBars.js"}} +{{"component": "file://./demos/labels-above-bars/index.ts"}} ### Stack total labels @@ -226,7 +226,7 @@ To show it, render a custom component as a child of the chart container. The example below sums the series with the [`useBarSeries`](/x/react-charts/hooks/use-series/) hook and positions each total with the [`useXScale`](/x/react-charts/hooks/use-scale/) and [`useYScale`](/x/react-charts/hooks/use-scale/) scales. -{{"demo": "StackTotalLabels.js"}} +{{"component": "file://./demos/stack-total-labels/index.ts"}} ## Click events @@ -244,7 +244,7 @@ const clickHandler = ( ) => {}; ``` -{{"demo": "BarClick.js"}} +{{"component": "file://./demos/bar-click/index.ts"}} :::info There is a slight difference between the `event` of `onItemClick` and `onAxisClick`: @@ -280,7 +280,7 @@ When you set `skipAnimation` to `true`, the chart renders without animations. ``` -{{"demo": "BarAnimation.js"}} +{{"component": "file://./demos/bar-animation/index.ts"}} ## Performance @@ -301,7 +301,7 @@ This has some trade-offs: The example below uses the `renderer` prop to improve performance when rendering a dataset with 500 data points. -{{"demo": "BarBatchRenderer.js"}} +{{"component": "file://./demos/bar-batch-renderer/index.ts"}} ### WebGL renderer [](/x/introduction/licensing/#premium-plan 'Premium plan') @@ -314,7 +314,7 @@ The WebGL renderer has the same trade-offs as the batch renderer, plus a few add - The WebGL canvas only draws the bar shapes. Axes, grid, highlights, focus outlines, and bar labels continue to rely on SVG. - Requires a browser with WebGL 2 support. -{{"demo": "WebGLBars.js"}} +{{"component": "file://./demos/web-gl-bars/index.ts"}} ### Sampling [](/x/introduction/licensing/#pro-plan 'Pro plan') @@ -351,4 +351,4 @@ Here's how the bar chart is composed: ``` -{{"demo": "BarScatterCompostion.js"}} +{{"component": "file://./demos/bar-scatter-compostion/index.ts"}} diff --git a/docs/data/charts/bars/BarAnimation.tsx b/docs/data/charts/bars/demos/bar-animation/BarAnimation.tsx similarity index 97% rename from docs/data/charts/bars/BarAnimation.tsx rename to docs/data/charts/bars/demos/bar-animation/BarAnimation.tsx index 46018688437d1..ccdcfd1c5409f 100644 --- a/docs/data/charts/bars/BarAnimation.tsx +++ b/docs/data/charts/bars/demos/bar-animation/BarAnimation.tsx @@ -5,9 +5,10 @@ import Slider from '@mui/material/Slider'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import { BarChart } from '@mui/x-charts/BarChart'; -import { HighlightScope } from '@mui/x-charts/context'; +import type { HighlightScope } from '@mui/x-charts/context'; export default function BarAnimation() { + // @focus-start @padding 1 const [seriesNb, setSeriesNb] = React.useState(2); const [itemNb, setItemNb] = React.useState(5); const [skipAnimation, setSkipAnimation] = React.useState(false); @@ -67,6 +68,7 @@ export default function BarAnimation() { /> ); + // @focus-end } const highlightScope: HighlightScope<'bar'> = { diff --git a/docs/data/charts/bars/demos/bar-animation/client.ts b/docs/data/charts/bars/demos/bar-animation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-animation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-animation/index.ts b/docs/data/charts/bars/demos/bar-animation/index.ts new file mode 100644 index 0000000000000..814b83ff986e5 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-animation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarAnimation from './BarAnimation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarAnimation, { ClientProvider }); diff --git a/docs/data/charts/bars/BarBatchRenderer.tsx b/docs/data/charts/bars/demos/bar-batch-renderer/BarBatchRenderer.tsx similarity index 95% rename from docs/data/charts/bars/BarBatchRenderer.tsx rename to docs/data/charts/bars/demos/bar-batch-renderer/BarBatchRenderer.tsx index c280a2b95dd85..9f22bae46a39b 100644 --- a/docs/data/charts/bars/BarBatchRenderer.tsx +++ b/docs/data/charts/bars/demos/bar-batch-renderer/BarBatchRenderer.tsx @@ -6,7 +6,7 @@ import FormLabel from '@mui/material/FormLabel'; import RadioGroup from '@mui/material/RadioGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Radio from '@mui/material/Radio'; -import data from '../dataset/sp500-intraday.json'; +import data from '../../../dataset/sp500-intraday.json'; const tickLabelDateFormatter = new Intl.DateTimeFormat(undefined, { month: 'short', @@ -14,6 +14,7 @@ const tickLabelDateFormatter = new Intl.DateTimeFormat(undefined, { }); export default function BarBatchRenderer() { + // @focus-start @padding 1 const [renderer, setRenderer] = React.useState<'svg-single' | 'svg-batch'>( 'svg-batch', ); @@ -75,4 +76,5 @@ export default function BarBatchRenderer() { /> ); + // @focus-end } diff --git a/docs/data/charts/bars/demos/bar-batch-renderer/client.ts b/docs/data/charts/bars/demos/bar-batch-renderer/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-batch-renderer/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-batch-renderer/index.ts b/docs/data/charts/bars/demos/bar-batch-renderer/index.ts new file mode 100644 index 0000000000000..2ef30d78e8b74 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-batch-renderer/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarBatchRenderer from './BarBatchRenderer'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarBatchRenderer, { ClientProvider }); diff --git a/docs/data/charts/bars/BarClick.tsx b/docs/data/charts/bars/demos/bar-click/BarClick.tsx similarity index 95% rename from docs/data/charts/bars/BarClick.tsx rename to docs/data/charts/bars/demos/bar-click/BarClick.tsx index 86de70f7607eb..4d49b71a04136 100644 --- a/docs/data/charts/bars/BarClick.tsx +++ b/docs/data/charts/bars/demos/bar-click/BarClick.tsx @@ -8,7 +8,7 @@ import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; import { BarChart } from '@mui/x-charts/BarChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { BarItemIdentifier, ChartsAxisData } from '@mui/x-charts/models'; +import type { BarItemIdentifier, ChartsAxisData } from '@mui/x-charts/models'; const barChartsParams = { series: [ @@ -45,6 +45,7 @@ const barChartsParams = { } as const; export default function BarClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); const [axisData, setAxisData] = React.useState(); @@ -95,4 +96,5 @@ ${axisData ? JSON.stringify(axisData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/bars/demos/bar-click/client.ts b/docs/data/charts/bars/demos/bar-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-click/index.ts b/docs/data/charts/bars/demos/bar-click/index.ts new file mode 100644 index 0000000000000..955ca17874b1d --- /dev/null +++ b/docs/data/charts/bars/demos/bar-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarClick from './BarClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarClick, { ClientProvider }); diff --git a/docs/data/charts/bars/BarGap.tsx b/docs/data/charts/bars/demos/bar-gap/BarGap.tsx similarity index 93% rename from docs/data/charts/bars/BarGap.tsx rename to docs/data/charts/bars/demos/bar-gap/BarGap.tsx index 509c812d0bf1e..500f8765a6fc9 100644 --- a/docs/data/charts/bars/BarGap.tsx +++ b/docs/data/charts/bars/demos/bar-gap/BarGap.tsx @@ -1,7 +1,7 @@ import Typography from '@mui/material/Typography'; import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import { BarChart } from '@mui/x-charts/BarChart'; -import { balanceSheet, addLabels } from './netflixsBalanceSheet'; +import { balanceSheet, addLabels } from '../../netflixsBalanceSheet'; const series = addLabels([ { dataKey: 'totAss' }, @@ -11,6 +11,7 @@ const series = addLabels([ export default function BarGap() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/bar-gap/client.ts b/docs/data/charts/bars/demos/bar-gap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-gap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-gap/index.ts b/docs/data/charts/bars/demos/bar-gap/index.ts new file mode 100644 index 0000000000000..a5128426a9147 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-gap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarGap from './BarGap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarGap, { ClientProvider }); diff --git a/docs/data/charts/bars/BarGradient.tsx b/docs/data/charts/bars/demos/bar-gradient/BarGradient.tsx similarity index 95% rename from docs/data/charts/bars/BarGradient.tsx rename to docs/data/charts/bars/demos/bar-gradient/BarGradient.tsx index 25a7194fec83d..6e44d49653dec 100644 --- a/docs/data/charts/bars/BarGradient.tsx +++ b/docs/data/charts/bars/demos/bar-gradient/BarGradient.tsx @@ -14,6 +14,7 @@ const settings = { export default function BarGradient() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/bar-gradient/client.ts b/docs/data/charts/bars/demos/bar-gradient/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-gradient/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-gradient/index.ts b/docs/data/charts/bars/demos/bar-gradient/index.ts new file mode 100644 index 0000000000000..3a753147ab553 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-gradient/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarGradient from './BarGradient'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarGradient, { ClientProvider }); diff --git a/docs/data/charts/bars/BarLabelPlacement.tsx b/docs/data/charts/bars/demos/bar-label-placement/BarLabelPlacement.tsx similarity index 90% rename from docs/data/charts/bars/BarLabelPlacement.tsx rename to docs/data/charts/bars/demos/bar-label-placement/BarLabelPlacement.tsx index d7d3567ad53a2..80b87ae150757 100644 --- a/docs/data/charts/bars/BarLabelPlacement.tsx +++ b/docs/data/charts/bars/demos/bar-label-placement/BarLabelPlacement.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function BarLabelPlacement() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/bar-label-placement/client.ts b/docs/data/charts/bars/demos/bar-label-placement/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-label-placement/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-label-placement/index.ts b/docs/data/charts/bars/demos/bar-label-placement/index.ts new file mode 100644 index 0000000000000..f450b504d0f11 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-label-placement/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarLabelPlacement from './BarLabelPlacement'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarLabelPlacement, { ClientProvider }); diff --git a/docs/data/charts/bars/BarLabel.tsx b/docs/data/charts/bars/demos/bar-label/BarLabel.tsx similarity index 92% rename from docs/data/charts/bars/BarLabel.tsx rename to docs/data/charts/bars/demos/bar-label/BarLabel.tsx index 8bb68e2bae5e9..3896dfeac2954 100644 --- a/docs/data/charts/bars/BarLabel.tsx +++ b/docs/data/charts/bars/demos/bar-label/BarLabel.tsx @@ -8,6 +8,7 @@ const dollarFormatter = new Intl.NumberFormat('en-US', { export default function BarLabel() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/bar-label/client.ts b/docs/data/charts/bars/demos/bar-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-label/index.ts b/docs/data/charts/bars/demos/bar-label/index.ts new file mode 100644 index 0000000000000..84ee567980af2 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarLabel from './BarLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarLabel, { ClientProvider }); diff --git a/docs/data/charts/bars/BarOECDHouseholdSavings.tsx b/docs/data/charts/bars/demos/bar-oecd-household-savings/BarOECDHouseholdSavings.tsx similarity index 91% rename from docs/data/charts/bars/BarOECDHouseholdSavings.tsx rename to docs/data/charts/bars/demos/bar-oecd-household-savings/BarOECDHouseholdSavings.tsx index da10ccbe1f8d2..b928fbfef8d2a 100644 --- a/docs/data/charts/bars/BarOECDHouseholdSavings.tsx +++ b/docs/data/charts/bars/demos/bar-oecd-household-savings/BarOECDHouseholdSavings.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; -import { BarChart, BarChartProps, barClasses } from '@mui/x-charts/BarChart'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart, barClasses } from '@mui/x-charts/BarChart'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import FormControl from '@mui/material/FormControl'; @@ -7,8 +8,8 @@ import FormLabel from '@mui/material/FormLabel'; import RadioGroup from '@mui/material/RadioGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Radio from '@mui/material/Radio'; -import { countryData } from '../dataset/countryData'; -import householdSavings from '../dataset/oecdHouseholdSavings2024.json'; +import { countryData } from '../../../dataset/countryData'; +import householdSavings from '../../../dataset/oecdHouseholdSavings2024.json'; /* Source: https://www.oecd.org/en/data/indicators/household-savings.html */ const savings = Object.entries(householdSavings) @@ -31,6 +32,7 @@ const settings = { } satisfies Partial; export default function BarOECDHouseholdSavings() { + // @focus-start @padding 1 const [gradientUnits, setGradientUnits] = React.useState< 'objectBoundingBox' | 'userSpaceOnUse' >('userSpaceOnUse'); @@ -104,6 +106,7 @@ export default function BarOECDHouseholdSavings() { Source: Our World in Data ); + // @focus-end } function Gradient(props: React.SVGProps) { diff --git a/docs/data/charts/bars/demos/bar-oecd-household-savings/client.ts b/docs/data/charts/bars/demos/bar-oecd-household-savings/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-oecd-household-savings/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-oecd-household-savings/index.ts b/docs/data/charts/bars/demos/bar-oecd-household-savings/index.ts new file mode 100644 index 0000000000000..7869ac863b508 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-oecd-household-savings/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarOECDHouseholdSavings from './BarOECDHouseholdSavings'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarOECDHouseholdSavings, { ClientProvider }); diff --git a/docs/data/charts/bars/BarScatterCompostion.tsx b/docs/data/charts/bars/demos/bar-scatter-compostion/BarScatterCompostion.tsx similarity index 96% rename from docs/data/charts/bars/BarScatterCompostion.tsx rename to docs/data/charts/bars/demos/bar-scatter-compostion/BarScatterCompostion.tsx index d0aeb7b0e0259..7b119bfb80ad6 100644 --- a/docs/data/charts/bars/BarScatterCompostion.tsx +++ b/docs/data/charts/bars/demos/bar-scatter-compostion/BarScatterCompostion.tsx @@ -9,7 +9,7 @@ import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; import { legendClasses, ChartsLegend } from '@mui/x-charts/ChartsLegend'; -import { GDPdata } from '../dataset/gdpGrowth'; +import { GDPdata } from '../../../dataset/gdpGrowth'; const chartSetting = { xAxis: [ @@ -61,6 +61,7 @@ export default function BarScatterCompostion() { alignItems: 'center', }} > + {/* @focus-start */} GDP growth rate comparison (2024 vs 2010-19 Avg) @@ -107,6 +108,7 @@ export default function BarScatterCompostion() { + {/* @focus-end */} ); } diff --git a/docs/data/charts/bars/demos/bar-scatter-compostion/client.ts b/docs/data/charts/bars/demos/bar-scatter-compostion/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bar-scatter-compostion/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bar-scatter-compostion/index.ts b/docs/data/charts/bars/demos/bar-scatter-compostion/index.ts new file mode 100644 index 0000000000000..0a22612ebd517 --- /dev/null +++ b/docs/data/charts/bars/demos/bar-scatter-compostion/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarScatterCompostion from './BarScatterCompostion'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarScatterCompostion, { ClientProvider }); diff --git a/docs/data/charts/bars/BarsDataset.tsx b/docs/data/charts/bars/demos/bars-dataset/BarsDataset.tsx similarity index 83% rename from docs/data/charts/bars/BarsDataset.tsx rename to docs/data/charts/bars/demos/bars-dataset/BarsDataset.tsx index be5ee89fdd40b..c22c13cc3d44a 100644 --- a/docs/data/charts/bars/BarsDataset.tsx +++ b/docs/data/charts/bars/demos/bars-dataset/BarsDataset.tsx @@ -1,5 +1,5 @@ import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { dataset, valueFormatter } from '../../../dataset/weather'; const chartSetting = { yAxis: [ @@ -13,6 +13,7 @@ const chartSetting = { export default function BarsDataset() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/bars-dataset/client.ts b/docs/data/charts/bars/demos/bars-dataset/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/bars-dataset/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/bars-dataset/index.ts b/docs/data/charts/bars/demos/bars-dataset/index.ts new file mode 100644 index 0000000000000..e566183731747 --- /dev/null +++ b/docs/data/charts/bars/demos/bars-dataset/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarsDataset from './BarsDataset'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarsDataset, { ClientProvider }); diff --git a/docs/data/charts/bars/BasicBars.tsx b/docs/data/charts/bars/demos/basic-bars/BasicBars.tsx similarity index 85% rename from docs/data/charts/bars/BasicBars.tsx rename to docs/data/charts/bars/demos/basic-bars/BasicBars.tsx index 84f7ec7b0acc4..50903aea5b3c3 100644 --- a/docs/data/charts/bars/BasicBars.tsx +++ b/docs/data/charts/bars/demos/basic-bars/BasicBars.tsx @@ -2,10 +2,12 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function BasicBars() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/basic-bars/client.ts b/docs/data/charts/bars/demos/basic-bars/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/basic-bars/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/basic-bars/index.ts b/docs/data/charts/bars/demos/basic-bars/index.ts new file mode 100644 index 0000000000000..dd62e96aaea97 --- /dev/null +++ b/docs/data/charts/bars/demos/basic-bars/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicBars from './BasicBars'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicBars, { ClientProvider }); diff --git a/docs/data/charts/bars/BorderRadius.tsx b/docs/data/charts/bars/demos/border-radius/BorderRadius.tsx similarity index 95% rename from docs/data/charts/bars/BorderRadius.tsx rename to docs/data/charts/bars/demos/border-radius/BorderRadius.tsx index e37b31453df96..cb8250ff8dfec 100644 --- a/docs/data/charts/bars/BorderRadius.tsx +++ b/docs/data/charts/bars/demos/border-radius/BorderRadius.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; -import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; import Stack from '@mui/material/Stack'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; import TextField from '@mui/material/TextField'; @@ -10,6 +11,7 @@ import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; export default function BorderRadius() { + // @focus-start @padding 1 const [layout, setLayout] = React.useState<'horizontal' | 'vertical'>('vertical'); const [radius, setRadius] = React.useState(10); const [reverse, setReverse] = React.useState(false); @@ -72,6 +74,7 @@ export default function BorderRadius() { /> ); + // @focus-end } const dataset = [ diff --git a/docs/data/charts/bars/demos/border-radius/client.ts b/docs/data/charts/bars/demos/border-radius/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/border-radius/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/border-radius/index.ts b/docs/data/charts/bars/demos/border-radius/index.ts new file mode 100644 index 0000000000000..238f5322bfccd --- /dev/null +++ b/docs/data/charts/bars/demos/border-radius/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BorderRadius from './BorderRadius'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BorderRadius, { ClientProvider }); diff --git a/docs/data/charts/bars/demos/color-scale/ColorScale.tsx b/docs/data/charts/bars/demos/color-scale/ColorScale.tsx new file mode 100644 index 0000000000000..6773c8cac0377 --- /dev/null +++ b/docs/data/charts/bars/demos/color-scale/ColorScale.tsx @@ -0,0 +1,186 @@ +import * as React from 'react'; +import { BarChart } from '@mui/x-charts/BarChart'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; + +const series = [{ data: [-2, -9, 12, 11, 6, -4] }]; + +export default function ColorScale() { + // @focus-start @padding 1 + const [colorX, setColorX] = React.useState< + 'None' | 'piecewise' | 'continuous' | 'ordinal' + >('piecewise'); + const [colorY, setColorY] = React.useState<'None' | 'piecewise' | 'continuous'>( + 'None', + ); + + return ( + + + + setColorX( + event.target.value as 'None' | 'piecewise' | 'continuous' | 'ordinal', + ) + } + > + None + piecewise + continuous + ordinal + + + setColorY(event.target.value as 'None' | 'piecewise' | 'continuous') + } + > + None + piecewise + continuous + + + + value.getFullYear().toString(), + colorMap: + (colorX === 'ordinal' && { + type: 'ordinal', + colors: [ + '#ccebc5', + '#a8ddb5', + '#7bccc4', + '#4eb3d3', + '#2b8cbe', + '#08589e', + ], + }) || + (colorX === 'continuous' && { + type: 'continuous', + min: new Date(2019, 1, 1), + max: new Date(2024, 1, 1), + color: ['green', 'orange'], + }) || + (colorX === 'piecewise' && { + type: 'piecewise', + thresholds: [new Date(2021, 1, 1), new Date(2023, 1, 1)], + colors: ['blue', 'red', 'blue'], + }) || + undefined, + }, + ]} + margin={{ left: 0 }} + /> + `, + ].join('\n')} + language="jsx" + copyButtonHidden + /> + + ); + // @focus-end +} diff --git a/docs/data/charts/bars/demos/color-scale/client.ts b/docs/data/charts/bars/demos/color-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/color-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/color-scale/index.ts b/docs/data/charts/bars/demos/color-scale/index.ts new file mode 100644 index 0000000000000..141c61df022b8 --- /dev/null +++ b/docs/data/charts/bars/demos/color-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorScale from './ColorScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorScale, { ClientProvider }); diff --git a/docs/data/charts/bars/CustomLabels.tsx b/docs/data/charts/bars/demos/custom-labels/CustomLabels.tsx similarity index 80% rename from docs/data/charts/bars/CustomLabels.tsx rename to docs/data/charts/bars/demos/custom-labels/CustomLabels.tsx index 66025bf3f56cc..723db979afc0c 100644 --- a/docs/data/charts/bars/CustomLabels.tsx +++ b/docs/data/charts/bars/demos/custom-labels/CustomLabels.tsx @@ -1,4 +1,5 @@ -import { BarChart, BarItem, BarLabelContext } from '@mui/x-charts/BarChart'; +import type { BarItem, BarLabelContext } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; function barLabel(item: BarItem, context: BarLabelContext) { if ((item.value ?? 0) > 10) { @@ -9,6 +10,7 @@ function barLabel(item: BarItem, context: BarLabelContext) { export default function CustomLabels() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/custom-labels/client.ts b/docs/data/charts/bars/demos/custom-labels/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/custom-labels/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/custom-labels/index.ts b/docs/data/charts/bars/demos/custom-labels/index.ts new file mode 100644 index 0000000000000..4457184769e25 --- /dev/null +++ b/docs/data/charts/bars/demos/custom-labels/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomLabels from './CustomLabels'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomLabels, { ClientProvider }); diff --git a/docs/data/charts/bars/demos/grid-demo/GridDemo.tsx b/docs/data/charts/bars/demos/grid-demo/GridDemo.tsx new file mode 100644 index 0000000000000..dfa111171d64c --- /dev/null +++ b/docs/data/charts/bars/demos/grid-demo/GridDemo.tsx @@ -0,0 +1,23 @@ +import { BarChart } from '@mui/x-charts/BarChart'; +import { dataset, valueFormatter } from '../../../dataset/weather'; + +const chartSetting = { + xAxis: [{ label: 'rainfall (mm)' }], + height: 400, + margin: { left: 0 }, +}; + +export default function GridDemo() { + return ( + // @focus-start @padding 2 + + // @focus-end + ); +} diff --git a/docs/data/charts/bars/demos/grid-demo/client.ts b/docs/data/charts/bars/demos/grid-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/grid-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/grid-demo/index.ts b/docs/data/charts/bars/demos/grid-demo/index.ts new file mode 100644 index 0000000000000..7686107ff7e74 --- /dev/null +++ b/docs/data/charts/bars/demos/grid-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GridDemo from './GridDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GridDemo, { ClientProvider }); diff --git a/docs/data/charts/bars/HorizontalBars.tsx b/docs/data/charts/bars/demos/horizontal-bars/HorizontalBars.tsx similarity index 79% rename from docs/data/charts/bars/HorizontalBars.tsx rename to docs/data/charts/bars/demos/horizontal-bars/HorizontalBars.tsx index fea24ab705ced..42a34785ec7e3 100644 --- a/docs/data/charts/bars/HorizontalBars.tsx +++ b/docs/data/charts/bars/demos/horizontal-bars/HorizontalBars.tsx @@ -1,5 +1,5 @@ import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { dataset, valueFormatter } from '../../../dataset/weather'; const chartSetting = { xAxis: [ @@ -13,6 +13,7 @@ const chartSetting = { export default function HorizontalBars() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/horizontal-bars/client.ts b/docs/data/charts/bars/demos/horizontal-bars/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/horizontal-bars/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/horizontal-bars/index.ts b/docs/data/charts/bars/demos/horizontal-bars/index.ts new file mode 100644 index 0000000000000..b00a984d678f0 --- /dev/null +++ b/docs/data/charts/bars/demos/horizontal-bars/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HorizontalBars from './HorizontalBars'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HorizontalBars, { ClientProvider }); diff --git a/docs/data/charts/bars/LabelsAboveBars.tsx b/docs/data/charts/bars/demos/labels-above-bars/LabelsAboveBars.tsx similarity index 92% rename from docs/data/charts/bars/LabelsAboveBars.tsx rename to docs/data/charts/bars/demos/labels-above-bars/LabelsAboveBars.tsx index 62a504da9f4fe..19d7b304a1473 100644 --- a/docs/data/charts/bars/LabelsAboveBars.tsx +++ b/docs/data/charts/bars/demos/labels-above-bars/LabelsAboveBars.tsx @@ -1,6 +1,7 @@ import { useAnimate } from '@mui/x-charts/hooks'; import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarLabelProps, BarPlot } from '@mui/x-charts/BarChart'; +import type { BarLabelProps } from '@mui/x-charts/BarChart'; +import { BarPlot } from '@mui/x-charts/BarChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; import { styled } from '@mui/material/styles'; @@ -8,6 +9,7 @@ import { interpolateObject } from '@mui/x-charts-vendor/d3-interpolate'; export default function LabelsAboveBars() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/labels-above-bars/client.ts b/docs/data/charts/bars/demos/labels-above-bars/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/labels-above-bars/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/labels-above-bars/index.ts b/docs/data/charts/bars/demos/labels-above-bars/index.ts new file mode 100644 index 0000000000000..6245d4015b3d2 --- /dev/null +++ b/docs/data/charts/bars/demos/labels-above-bars/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LabelsAboveBars from './LabelsAboveBars'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LabelsAboveBars, { ClientProvider }); diff --git a/docs/data/charts/bars/MinBarSize.tsx b/docs/data/charts/bars/demos/min-bar-size/MinBarSize.tsx similarity index 96% rename from docs/data/charts/bars/MinBarSize.tsx rename to docs/data/charts/bars/demos/min-bar-size/MinBarSize.tsx index ea184d44bcce9..b91142da85862 100644 --- a/docs/data/charts/bars/MinBarSize.tsx +++ b/docs/data/charts/bars/demos/min-bar-size/MinBarSize.tsx @@ -8,6 +8,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; const sparseData: (number | null)[] = [0.02, 5, null, 7, 0.01, 0, -0.03]; export default function MinBarSize(): React.JSX.Element { + // @focus-start @padding 1 const [minBarSize, setMinBarSize] = React.useState(10); const handleChange = (event: Event, newValue: number | number[]) => { @@ -38,4 +39,5 @@ export default function MinBarSize(): React.JSX.Element { /> ); + // @focus-end } diff --git a/docs/data/charts/bars/demos/min-bar-size/client.ts b/docs/data/charts/bars/demos/min-bar-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/min-bar-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/min-bar-size/index.ts b/docs/data/charts/bars/demos/min-bar-size/index.ts new file mode 100644 index 0000000000000..44e7c71fd18aa --- /dev/null +++ b/docs/data/charts/bars/demos/min-bar-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MinBarSize from './MinBarSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MinBarSize, { ClientProvider }); diff --git a/docs/data/charts/bars/ShinyBarChartHorizontal.tsx b/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/ShinyBarChartHorizontal.tsx similarity index 94% rename from docs/data/charts/bars/ShinyBarChartHorizontal.tsx rename to docs/data/charts/bars/demos/shiny-bar-chart-horizontal/ShinyBarChartHorizontal.tsx index 7de24d97b44f4..50431e7aab90a 100644 --- a/docs/data/charts/bars/ShinyBarChartHorizontal.tsx +++ b/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/ShinyBarChartHorizontal.tsx @@ -1,16 +1,18 @@ import * as React from 'react'; import { useTheme, styled } from '@mui/material/styles'; import Typography from '@mui/material/Typography'; -import { BarChart, type BarLabelProps, type BarProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; +import type { BarLabelProps, BarProps } from '@mui/x-charts/BarChart'; import { useAnimate, useAnimateBar, useDrawingArea } from '@mui/x-charts/hooks'; import { PiecewiseColorLegend } from '@mui/x-charts/ChartsLegend'; import { interpolateObject } from '@mui/x-charts-vendor/d3-interpolate'; import Box from '@mui/material/Box'; -import votesTurnout from '../dataset/votes.json'; +import votesTurnout from '../../../dataset/votes.json'; export default function ShinyBarChartHorizontal() { return ( + {/* @focus-start */} European countries with lowest & highest voter turnout @@ -69,6 +71,7 @@ export default function ShinyBarChartHorizontal() { }, }} /> + {/* @focus-end */} ); } diff --git a/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/client.ts b/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/index.ts b/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/index.ts new file mode 100644 index 0000000000000..2b7bd805215e0 --- /dev/null +++ b/docs/data/charts/bars/demos/shiny-bar-chart-horizontal/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ShinyBarChartHorizontal from './ShinyBarChartHorizontal'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ShinyBarChartHorizontal, { ClientProvider }); diff --git a/docs/data/charts/bars/StackBars.tsx b/docs/data/charts/bars/demos/stack-bars/StackBars.tsx similarity index 77% rename from docs/data/charts/bars/StackBars.tsx rename to docs/data/charts/bars/demos/stack-bars/StackBars.tsx index 9e66559074d79..30fe7cba1e4f4 100644 --- a/docs/data/charts/bars/StackBars.tsx +++ b/docs/data/charts/bars/demos/stack-bars/StackBars.tsx @@ -1,10 +1,12 @@ import Typography from '@mui/material/Typography'; -import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; -import { addLabels, balanceSheet, valueFormatter } from './netflixsBalanceSheet'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; +import { addLabels, balanceSheet, valueFormatter } from '../../netflixsBalanceSheet'; export default function StackBars() { return (
+ {/* @focus-start */} Netflix balance sheet + {/* @focus-end */}
); } diff --git a/docs/data/charts/bars/demos/stack-bars/client.ts b/docs/data/charts/bars/demos/stack-bars/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/stack-bars/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/stack-bars/index.ts b/docs/data/charts/bars/demos/stack-bars/index.ts new file mode 100644 index 0000000000000..7eaadca6918d0 --- /dev/null +++ b/docs/data/charts/bars/demos/stack-bars/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackBars from './StackBars'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackBars, { ClientProvider }); diff --git a/docs/data/charts/bars/StackTotalLabels.tsx b/docs/data/charts/bars/demos/stack-total-labels/StackTotalLabels.tsx similarity index 97% rename from docs/data/charts/bars/StackTotalLabels.tsx rename to docs/data/charts/bars/demos/stack-total-labels/StackTotalLabels.tsx index 061a8a45442b6..7d15815414e0c 100644 --- a/docs/data/charts/bars/StackTotalLabels.tsx +++ b/docs/data/charts/bars/demos/stack-total-labels/StackTotalLabels.tsx @@ -13,6 +13,7 @@ import { styled } from '@mui/material/styles'; export default function StackTotalLabels() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bars/demos/stack-total-labels/client.ts b/docs/data/charts/bars/demos/stack-total-labels/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/stack-total-labels/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/stack-total-labels/index.ts b/docs/data/charts/bars/demos/stack-total-labels/index.ts new file mode 100644 index 0000000000000..c0b475f5d1843 --- /dev/null +++ b/docs/data/charts/bars/demos/stack-total-labels/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackTotalLabels from './StackTotalLabels'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackTotalLabels, { ClientProvider }); diff --git a/docs/data/charts/bars/TickPlacementBars.tsx b/docs/data/charts/bars/demos/tick-placement-bars/TickPlacementBars.tsx similarity index 96% rename from docs/data/charts/bars/TickPlacementBars.tsx rename to docs/data/charts/bars/demos/tick-placement-bars/TickPlacementBars.tsx index 2936af6ecb439..07f909393a5b7 100644 --- a/docs/data/charts/bars/TickPlacementBars.tsx +++ b/docs/data/charts/bars/demos/tick-placement-bars/TickPlacementBars.tsx @@ -6,7 +6,7 @@ import RadioGroup from '@mui/material/RadioGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Radio from '@mui/material/Radio'; import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { dataset, valueFormatter } from '../../../dataset/weather'; type TickParamsSelectorProps = { tickPlacement: 'end' | 'start' | 'middle' | 'extremities'; @@ -87,6 +87,7 @@ const chartSetting = { }; export default function TickPlacementBars() { + // @focus-start @padding 1 const [tickPlacement, setTickPlacement] = React.useState< 'start' | 'end' | 'middle' | 'extremities' >('middle'); @@ -109,4 +110,5 @@ export default function TickPlacementBars() { /> ); + // @focus-end } diff --git a/docs/data/charts/bars/demos/tick-placement-bars/client.ts b/docs/data/charts/bars/demos/tick-placement-bars/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/tick-placement-bars/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/tick-placement-bars/index.ts b/docs/data/charts/bars/demos/tick-placement-bars/index.ts new file mode 100644 index 0000000000000..6ebab4716ac98 --- /dev/null +++ b/docs/data/charts/bars/demos/tick-placement-bars/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TickPlacementBars from './TickPlacementBars'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TickPlacementBars, { ClientProvider }); diff --git a/docs/data/charts/bars/WebGLBars.tsx b/docs/data/charts/bars/demos/web-gl-bars/WebGLBars.tsx similarity index 97% rename from docs/data/charts/bars/WebGLBars.tsx rename to docs/data/charts/bars/demos/web-gl-bars/WebGLBars.tsx index dafbfa9594aa5..7a7edbcfc3b63 100644 --- a/docs/data/charts/bars/WebGLBars.tsx +++ b/docs/data/charts/bars/demos/web-gl-bars/WebGLBars.tsx @@ -27,6 +27,7 @@ const seriesA = generateData(1); const seriesB = generateData(7); export default function WebGLBars() { + // @focus-start @padding 1 const [renderer, setRenderer] = React.useState('webgl'); return ( @@ -63,4 +64,5 @@ export default function WebGLBars() { /> ); + // @focus-end } diff --git a/docs/data/charts/bars/demos/web-gl-bars/client.ts b/docs/data/charts/bars/demos/web-gl-bars/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bars/demos/web-gl-bars/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bars/demos/web-gl-bars/index.ts b/docs/data/charts/bars/demos/web-gl-bars/index.ts new file mode 100644 index 0000000000000..14f9cf8eb288e --- /dev/null +++ b/docs/data/charts/bars/demos/web-gl-bars/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import WebGLBars from './WebGLBars'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, WebGLBars, { ClientProvider }); diff --git a/docs/data/charts/brush/BrushBasic.js b/docs/data/charts/brush/BrushBasic.js deleted file mode 100644 index eb4779133ac62..0000000000000 --- a/docs/data/charts/brush/BrushBasic.js +++ /dev/null @@ -1,42 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; -import { ChartsBrushOverlay } from '@mui/x-charts/ChartsBrushOverlay'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; - -export default function BrushBasic() { - return ( - - - Click and drag on the chart to see the brush selection overlay. - - - - - - ); -} - -const xAxisData = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec', -]; diff --git a/docs/data/charts/brush/BrushBasic.tsx.preview b/docs/data/charts/brush/BrushBasic.tsx.preview deleted file mode 100644 index 641137696eaa6..0000000000000 --- a/docs/data/charts/brush/BrushBasic.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - - Click and drag on the chart to see the brush selection overlay. - - - - \ No newline at end of file diff --git a/docs/data/charts/brush/BrushCustomOverlay.js b/docs/data/charts/brush/BrushCustomOverlay.js deleted file mode 100644 index 1478bbe1ff397..0000000000000 --- a/docs/data/charts/brush/BrushCustomOverlay.js +++ /dev/null @@ -1,200 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import { - useBrush, - useDrawingArea, - useLineSeries, - useXScale, -} from '@mui/x-charts/hooks'; -import { useTheme } from '@mui/material/styles'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; - -function CustomBrushOverlay() { - const theme = useTheme(); - const drawingArea = useDrawingArea(); - const brush = useBrush(); - const xScale = useXScale(); - const series = useLineSeries('marketValue'); - - if (!brush || !series) { - return null; - } - - const { left, top, width, height } = drawingArea; - - // Clamp coordinates to drawing area - const clampX = (x) => Math.max(left, Math.min(left + width, x)); - const clampedStartX = clampX(brush.start.x); - const clampedCurrentX = clampX(brush.current.x); - - const minX = Math.min(clampedStartX, clampedCurrentX); - const maxX = Math.max(clampedStartX, clampedCurrentX); - const rectWidth = maxX - minX; - - const color = theme.palette.primary.main; - - if (rectWidth < 1) { - return null; - } - - const getIndex = (x) => - Math.floor( - (x - Math.min(...xScale.range()) + xScale.step() / 2) / xScale.step(), - ); - // Calculate the approximate data indices based on x position - const startIndex = getIndex(clampedStartX); - const currentIndex = getIndex(clampedCurrentX); - - const startValue = series.data[startIndex]; - const currentValue = series.data[currentIndex]; - const difference = currentValue - startValue; - const percentChange = ((difference / startValue) * 100).toFixed(2); - - // Get the date labels - const startDate = xScale.domain()[startIndex] || ''; - const currentDate = xScale.domain()[currentIndex] || ''; - - return ( - - {/* Start line */} - - {/* Current line */} - - {/* Selection rectangle */} - - {/* Start label */} - - - {/* Date label */} - - {startDate} - - {/* Value label */} - - {startValue.toFixed(2)} - - - - {/* End label */} - - - {/* Date label */} - - {currentDate} - - {/* Value label */} - - {currentValue.toFixed(2)} - - - - {/* Difference label in the middle */} - - = 0 ? theme.palette.success.main : theme.palette.error.main - } - rx={4} - /> - - {difference >= 0 ? '+' : ''} - {difference.toFixed(2)} ({percentChange}%) - - - - ); -} - -const marketData = [ - 100, 96.56, 97.04, 98.95, 102.66, 106.18, 107.76, 109.78, 113.57, 111.54, 107.69, - 104.58, 106.62, 103.81, 104.46, 105.14, 108.94, 112.81, 112.62, 117.52, 122.17, - 122.11, 121.44, 122.5, 125.42, 127.46, 129.21, 124.71, 125.0, 125.28, 125.15, - 125.06, 120.48, 115.83, 116.47, 119.58, 118.99, 123.46, 126.83, 130.84, 131.12, - 131.31, 129.14, 133.35, 130.15, 129.02, 132.57, 136.1, 139.33, 139.66, -]; - -const dates = Array.from({ length: 50 }, (_, i) => { - const date = new Date(2024, 0, i + 1); - return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); -}); - -export default function BrushCustomOverlay() { - return ( - - - Custom brush overlay showing the values at start and end positions, and the - difference between them. - - - - - - ); -} diff --git a/docs/data/charts/brush/BrushScatterList.js b/docs/data/charts/brush/BrushScatterList.js deleted file mode 100644 index 28606b0daad15..0000000000000 --- a/docs/data/charts/brush/BrushScatterList.js +++ /dev/null @@ -1,155 +0,0 @@ -import * as React from 'react'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ScatterPlot } from '@mui/x-charts/ScatterChart'; -import { ChartsAxis } from '@mui/x-charts/ChartsAxis'; -import { - useBrush, - useScatterSeries, - useXScale, - useYScale, -} from '@mui/x-charts/hooks'; -import { ChartsBrushOverlay } from '@mui/x-charts/ChartsBrushOverlay'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import Chip from '@mui/material/Chip'; -import Stack from '@mui/material/Stack'; - -const scatterData = [ - { x: 5, y: 12, id: 1 }, - { x: 12, y: 18, id: 2 }, - { x: 18, y: 9, id: 3 }, - { x: 25, y: 22, id: 4 }, - { x: 32, y: 15, id: 5 }, - { x: 40, y: 28, id: 6 }, - { x: 48, y: 20, id: 7 }, - { x: 55, y: 35, id: 8 }, - { x: 62, y: 25, id: 9 }, - { x: 70, y: 40, id: 10 }, - { x: 78, y: 32, id: 11 }, - { x: 85, y: 45, id: 12 }, - { x: 15, y: 30, id: 13 }, - { x: 35, y: 38, id: 14 }, - { x: 50, y: 42, id: 15 }, - { x: 65, y: 36, id: 16 }, - { x: 22, y: 25, id: 17 }, - { x: 44, y: 33, id: 18 }, - { x: 58, y: 29, id: 19 }, - { x: 72, y: 37, id: 20 }, -]; - -const empty = []; - -function ChartContent() { - return ( - - - - - - ); -} - -function SelectedPointsList() { - const brush = useBrush(); - const series = useScatterSeries('data'); - const xScale = useXScale(); - const yScale = useYScale(); - - const selectedData = React.useMemo(() => { - if (!brush || !series || !xScale || !yScale) { - return empty; - } - - const { start, current } = brush; - - // Get the min/max x and y positions - const minX = Math.min(start.x, current.x); - const maxX = Math.max(start.x, current.x); - const minY = Math.min(start.y, current.y); - const maxY = Math.max(start.y, current.y); - - // Convert pixel coordinates back to data values - const minDataX = xScale.invert(minX); - const maxDataX = xScale.invert(maxX); - const minDataY = yScale.invert(maxY); - const maxDataY = yScale.invert(minY); - - // Filter data points within the brush selection - const d = series.data - .map((point, index) => ({ - x: point.x, - y: point.y, - id: point.id ?? index + 1, - })) - .filter((point) => { - return ( - point.x >= minDataX && - point.x <= maxDataX && - point.y >= minDataY && - point.y <= maxDataY - ); - }); - - return d; - }, [brush, series, xScale, yScale]); - - if (selectedData.length === 0) { - return ( - - - No points selected. Drag on the chart to select data points. - - - ); - } - - return ( - - - Selected Points ({selectedData.length}): - - - {selectedData.map((point) => ( - - ))} - - - ); -} - -export default function BrushScatterList() { - return ( - - - Drag to select points on the scatter chart. Selected points will be displayed - below. - - - - - - - - - ); -} diff --git a/docs/data/charts/brush/brush.md b/docs/data/charts/brush/brush.md index e2a5d062391dc..bf09476a58c79 100644 --- a/docs/data/charts/brush/brush.md +++ b/docs/data/charts/brush/brush.md @@ -35,7 +35,7 @@ To display the selected area, you can add the `ChartsBrushOverlay` component as To create a custom interaction, you can use the `useBrush()` hook as shown in the [Custom overlay](#custom-overlay) section below. -{{"demo": "BrushBasic.js"}} +{{"component": "file://./demos/brush-basic/index.ts"}} ## Customization examples @@ -44,14 +44,14 @@ To create a custom interaction, you can use the `useBrush()` hook as shown in th You can create a custom brush overlay by building your own component that uses the `useBrush()` hook. The example below displays the values at the start and end positions, along with the difference and percentage change between them. -{{"demo": "BrushCustomOverlay.js"}} +{{"component": "file://./demos/brush-custom-overlay/index.ts"}} ### Data selection You can use the brush to select and display data points within the selection area. The example below shows a scatter chart where you can select points by dragging, and the selected points are displayed below the chart. -{{"demo": "BrushScatterList.js"}} +{{"component": "file://./demos/brush-scatter-list/index.ts"}} ### Using the `useBrush()` hook diff --git a/docs/data/charts/brush/BrushBasic.tsx b/docs/data/charts/brush/demos/brush-basic/BrushBasic.tsx similarity index 94% rename from docs/data/charts/brush/BrushBasic.tsx rename to docs/data/charts/brush/demos/brush-basic/BrushBasic.tsx index eb4779133ac62..26434770e769b 100644 --- a/docs/data/charts/brush/BrushBasic.tsx +++ b/docs/data/charts/brush/demos/brush-basic/BrushBasic.tsx @@ -6,6 +6,7 @@ import Typography from '@mui/material/Typography'; export default function BrushBasic() { return ( + {/* @focus-start */} Click and drag on the chart to see the brush selection overlay. @@ -22,6 +23,7 @@ export default function BrushBasic() { >
+ {/* @focus-end */} ); } diff --git a/docs/data/charts/brush/demos/brush-basic/client.ts b/docs/data/charts/brush/demos/brush-basic/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/brush/demos/brush-basic/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/brush/demos/brush-basic/index.ts b/docs/data/charts/brush/demos/brush-basic/index.ts new file mode 100644 index 0000000000000..963e85058dec5 --- /dev/null +++ b/docs/data/charts/brush/demos/brush-basic/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BrushBasic from './BrushBasic'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BrushBasic, { ClientProvider }); diff --git a/docs/data/charts/brush/BrushCustomOverlay.tsx b/docs/data/charts/brush/demos/brush-custom-overlay/BrushCustomOverlay.tsx similarity index 99% rename from docs/data/charts/brush/BrushCustomOverlay.tsx rename to docs/data/charts/brush/demos/brush-custom-overlay/BrushCustomOverlay.tsx index a63e0e33ee1a5..5dc2d79fca9a5 100644 --- a/docs/data/charts/brush/BrushCustomOverlay.tsx +++ b/docs/data/charts/brush/demos/brush-custom-overlay/BrushCustomOverlay.tsx @@ -174,6 +174,7 @@ const dates = Array.from({ length: 50 }, (_, i) => { export default function BrushCustomOverlay() { return ( + {/* @focus-start */} Custom brush overlay showing the values at start and end positions, and the difference between them. @@ -197,6 +198,7 @@ export default function BrushCustomOverlay() { >
+ {/* @focus-end */} ); } diff --git a/docs/data/charts/brush/demos/brush-custom-overlay/client.ts b/docs/data/charts/brush/demos/brush-custom-overlay/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/brush/demos/brush-custom-overlay/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/brush/demos/brush-custom-overlay/index.ts b/docs/data/charts/brush/demos/brush-custom-overlay/index.ts new file mode 100644 index 0000000000000..241a012b11bc9 --- /dev/null +++ b/docs/data/charts/brush/demos/brush-custom-overlay/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BrushCustomOverlay from './BrushCustomOverlay'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BrushCustomOverlay, { ClientProvider }); diff --git a/docs/data/charts/brush/BrushScatterList.tsx b/docs/data/charts/brush/demos/brush-scatter-list/BrushScatterList.tsx similarity index 98% rename from docs/data/charts/brush/BrushScatterList.tsx rename to docs/data/charts/brush/demos/brush-scatter-list/BrushScatterList.tsx index 8d17bd8ee3b74..c60185633a905 100644 --- a/docs/data/charts/brush/BrushScatterList.tsx +++ b/docs/data/charts/brush/demos/brush-scatter-list/BrushScatterList.tsx @@ -127,6 +127,7 @@ function SelectedPointsList() { export default function BrushScatterList() { return ( + {/* @focus-start */} Drag to select points on the scatter chart. Selected points will be displayed below. @@ -150,6 +151,7 @@ export default function BrushScatterList() { + {/* @focus-end */} ); } diff --git a/docs/data/charts/brush/demos/brush-scatter-list/client.ts b/docs/data/charts/brush/demos/brush-scatter-list/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/brush/demos/brush-scatter-list/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/brush/demos/brush-scatter-list/index.ts b/docs/data/charts/brush/demos/brush-scatter-list/index.ts new file mode 100644 index 0000000000000..067b7ca12c0d7 --- /dev/null +++ b/docs/data/charts/brush/demos/brush-scatter-list/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BrushScatterList from './BrushScatterList'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BrushScatterList, { ClientProvider }); diff --git a/docs/data/charts/bubble/BubbleChartCO2Emissions.js b/docs/data/charts/bubble/BubbleChartCO2Emissions.js deleted file mode 100644 index 4133d86a8b8b6..0000000000000 --- a/docs/data/charts/bubble/BubbleChartCO2Emissions.js +++ /dev/null @@ -1,204 +0,0 @@ -import * as React from 'react'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import { scatterClasses } from '@mui/x-charts-pro/ScatterChart'; -import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; -import Box from '@mui/material/Box'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { globalCo2GdpPopulation } from '../dataset/globalCo2GdpPopulation'; - -const regions = [ - 'Africa', - 'Asia', - 'Europe', - 'North America', - 'Oceania', - 'South America', -]; - -const regionColors = [ - '#e6194B', - '#3cb44b', - '#4363d8', - '#f58231', - '#911eb4', - '#42d4f4', -]; - -const compactCurrencyFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - notation: 'compact', - maximumFractionDigits: 1, -}); - -const compactNumberFormatter = new Intl.NumberFormat('en-US', { - notation: 'compact', -}); - -function TooltipRow({ label, value }) { - return ( - - - {label} - - - {value} - - - ); -} - -function CountryBubbleTooltipContent() { - const item = useItemTooltip(); - - if (!item) { - return null; - } - const country = globalCo2GdpPopulation[item.identifier.dataIndex]; - return ( - - - - {country.name} - - {country.region} - - - - - - - - - ); -} - -function CountryBubbleTooltip() { - return ( - - - - ); -} - -export default function BubbleChartCO2Emissions() { - return ( - - compactCurrencyFormatter.format(value), - zoom: true, - }, - ]} - yAxis={[ - { - label: 'CO₂ emissions (t per person)', - width: 50, - zoom: true, - }, - ]} - zAxis={[ - { - // Maps the population to the marker radius (continuous scale). - id: 'population', - dataKey: 'population', - sizeMap: { - type: 'continuous', - min: 1_000, - max: 1_500_000_000, - size: [3, 25], - }, - }, - { - // Maps the region to a marker color (ordinal scale). - id: 'region', - dataKey: 'region', - colorMap: { - type: 'ordinal', - values: regions, - colors: regionColors, - }, - }, - ]} - hitAreaRadius="item" - series={[ - { - datasetKeys: { x: 'gdpPerCapita', y: 'co2_emission', id: 'code' }, - sizeAxisId: 'population', - colorAxisId: 'region', - highlightScope: { highlight: 'item', fade: 'none' }, - }, - ]} - /> - - {regions.map((region, index) => ( - - - {region} - - ))} - - - Bubble size is proportional to the population · Data for 2023, Our World in - Data - - - ); -} diff --git a/docs/data/charts/bubble/ColorScale.js b/docs/data/charts/bubble/ColorScale.js deleted file mode 100644 index 29bdbe8a38dc3..0000000000000 --- a/docs/data/charts/bubble/ColorScale.js +++ /dev/null @@ -1,285 +0,0 @@ -import * as React from 'react'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; - -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { Chance } from 'chance'; - -const POINTS_NUMBER = 50; -const chance = new Chance(42); - -export default function ColorScale() { - const [colorX, setColorX] = React.useState('piecewise'); - const [colorY, setColorY] = React.useState('None'); - const [colorZ, setColorZ] = React.useState('None'); - - return ( - - div': { - display: 'flex', - flexDirection: 'column', - }, - }} - > -
- x-axis colorMap - setColorX(value)} - aria-label="Platform" - > - None - piecewise - continuous - -
-
- y-axis colorMap - setColorY(value)} - aria-label="Platform" - > - None - piecewise - continuous - -
-
- z-axis colorMap - setColorZ(value)} - aria-label="Platform" - > - None - piecewise - continuous - ordinal - -
-
- 'A'), - ...[...Array(POINTS_NUMBER)].map(() => 'B'), - ...[...Array(POINTS_NUMBER)].map(() => 'C'), - ...[...Array(POINTS_NUMBER)].map(() => 'D'), - ] - : undefined, - colorMap: - (colorZ === 'continuous' && { - type: 'continuous', - min: -2, - max: 2, - color: ['green', 'orange'], - }) || - (colorZ === 'piecewise' && { - type: 'piecewise', - thresholds: [-1.5, 0, 1.5], - colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'], - }) || - (colorZ === 'ordinal' && { - type: 'ordinal', - values: ['A', 'B', 'C', 'D'], - colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'], - }) || - undefined, - }, - ]} - /> - ({...point, colorValue: point.x + point.y})) }]}', - // ColorX - ...(colorX === 'None' ? [' xAxis={[{}]}'] : []), - ...(colorX === 'continuous' - ? [ - ' xAxis={[{', - ` colorMap: {`, - ` type: 'continuous',`, - ` min: -2,`, - ` max: 2,`, - ` color: ['green', 'orange']`, - ` }`, - ' }]}', - ] - : []), - ...(colorX === 'piecewise' - ? [ - ' xAxis={[{', - ` colorMap: {`, - ` type: 'piecewise',`, - ` thresholds: [-1.5, 0, 1.5],`, - ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, - ` }`, - ' }]}', - ] - : []), - // ColorY - ...(colorY === 'None' ? [' yAxis={[{}]}'] : []), - ...(colorY === 'continuous' - ? [ - ' yAxis={[{', - ` colorMap: {`, - ` type: 'continuous',`, - ` min: -2,`, - ` max: 2,`, - ` color: ['blue', 'red']`, - ` }`, - ' }]}', - ] - : []), - ...(colorY === 'piecewise' - ? [ - ' yAxis={[{', - ` colorMap: {`, - ` type: 'piecewise',`, - ` thresholds: [-1.5, 0, 1.5],`, - ` colors: ['lightblue', 'blue', 'orange', 'red'],`, - ` }`, - ' }]}', - ] - : []), - // ColorZ - ...(colorZ === 'None' ? [' zAxis={[{}]}'] : []), - ...(colorZ === 'continuous' - ? [ - ' zAxis={[{', - ` colorMap: {`, - ` type: 'continuous',`, - ` min: -2,`, - ` max: 2,`, - ` color: ['green', 'orange'],`, - ` }`, - ' }]}', - ] - : []), - ...(colorZ === 'piecewise' - ? [ - ' zAxis={[{', - ` colorMap: {`, - ` type: 'piecewise',`, - ` thresholds: [-1.5, 0, 1.5],`, - ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, - ` }`, - ' }]}', - ] - : []), - ...(colorZ === 'ordinal' - ? [ - ' zAxis={[{', - ` data: ['A', ..., 'B', ..., 'C', ..., 'D', ...],`, - ` colorMap: {`, - ` type: 'ordinal',`, - ` values: ['A', 'B', 'C', 'D'],`, - ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, - ` }`, - ' }]}', - ] - : []), - `/>`, - ].join('\n')} - language="jsx" - copyButtonHidden - /> -
- ); -} - -const series = [ - { - data: [ - ...getGaussianSeriesData([-1, -1]), - ...getGaussianSeriesData([-1, 1]), - ...getGaussianSeriesData([1, 1]), - ...getGaussianSeriesData([1, -1]), - ], - }, -].map((s) => ({ - ...s, - valueFormatter: (v) => v && `(${v.x.toFixed(1)}, ${v.y.toFixed(1)})`, -})); - -function getGaussianSeriesData(mean, stdev = [0.5, 0.5], N = 50) { - return [...Array(N)].map((_, i) => { - const x = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[0] + - mean[0]; - const y = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[1] + - mean[1]; - return { x, y, colorValue: x + y, id: `${mean.join(',')}${i}` }; - }); -} diff --git a/docs/data/charts/bubble/ColorScale.tsx b/docs/data/charts/bubble/ColorScale.tsx deleted file mode 100644 index fb55dea2e8b48..0000000000000 --- a/docs/data/charts/bubble/ColorScale.tsx +++ /dev/null @@ -1,306 +0,0 @@ -import * as React from 'react'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { ScatterValueType } from '@mui/x-charts/models'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { Chance } from 'chance'; - -const POINTS_NUMBER = 50; -const chance = new Chance(42); - -export default function ColorScale() { - const [colorX, setColorX] = React.useState<'None' | 'piecewise' | 'continuous'>( - 'piecewise', - ); - const [colorY, setColorY] = React.useState<'None' | 'piecewise' | 'continuous'>( - 'None', - ); - const [colorZ, setColorZ] = React.useState< - 'None' | 'piecewise' | 'continuous' | 'ordinal' - >('None'); - - return ( - - div': { - display: 'flex', - flexDirection: 'column', - }, - }} - > -
- x-axis colorMap - - setColorX(value) - } - aria-label="Platform" - > - None - piecewise - continuous - -
-
- y-axis colorMap - - setColorY(value) - } - aria-label="Platform" - > - None - piecewise - continuous - -
-
- z-axis colorMap - - setColorZ(value) - } - aria-label="Platform" - > - None - piecewise - continuous - ordinal - -
-
- 'A'), - ...[...Array(POINTS_NUMBER)].map(() => 'B'), - ...[...Array(POINTS_NUMBER)].map(() => 'C'), - ...[...Array(POINTS_NUMBER)].map(() => 'D'), - ] - : undefined, - colorMap: - (colorZ === 'continuous' && { - type: 'continuous', - min: -2, - max: 2, - color: ['green', 'orange'], - }) || - (colorZ === 'piecewise' && { - type: 'piecewise', - thresholds: [-1.5, 0, 1.5], - colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'], - }) || - (colorZ === 'ordinal' && { - type: 'ordinal', - - values: ['A', 'B', 'C', 'D'], - colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'], - }) || - undefined, - }, - ]} - /> - ({...point, colorValue: point.x + point.y})) }]}', - // ColorX - ...(colorX === 'None' ? [' xAxis={[{}]}'] : []), - ...(colorX === 'continuous' - ? [ - ' xAxis={[{', - ` colorMap: {`, - ` type: 'continuous',`, - ` min: -2,`, - ` max: 2,`, - ` color: ['green', 'orange']`, - ` }`, - ' }]}', - ] - : []), - ...(colorX === 'piecewise' - ? [ - ' xAxis={[{', - ` colorMap: {`, - ` type: 'piecewise',`, - ` thresholds: [-1.5, 0, 1.5],`, - ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, - ` }`, - ' }]}', - ] - : []), - - // ColorY - ...(colorY === 'None' ? [' yAxis={[{}]}'] : []), - ...(colorY === 'continuous' - ? [ - ' yAxis={[{', - ` colorMap: {`, - ` type: 'continuous',`, - ` min: -2,`, - ` max: 2,`, - ` color: ['blue', 'red']`, - ` }`, - ' }]}', - ] - : []), - ...(colorY === 'piecewise' - ? [ - ' yAxis={[{', - ` colorMap: {`, - ` type: 'piecewise',`, - ` thresholds: [-1.5, 0, 1.5],`, - ` colors: ['lightblue', 'blue', 'orange', 'red'],`, - ` }`, - ' }]}', - ] - : []), - - // ColorZ - ...(colorZ === 'None' ? [' zAxis={[{}]}'] : []), - ...(colorZ === 'continuous' - ? [ - ' zAxis={[{', - ` colorMap: {`, - ` type: 'continuous',`, - ` min: -2,`, - ` max: 2,`, - ` color: ['green', 'orange'],`, - ` }`, - ' }]}', - ] - : []), - ...(colorZ === 'piecewise' - ? [ - ' zAxis={[{', - ` colorMap: {`, - ` type: 'piecewise',`, - ` thresholds: [-1.5, 0, 1.5],`, - ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, - ` }`, - ' }]}', - ] - : []), - ...(colorZ === 'ordinal' - ? [ - ' zAxis={[{', - ` data: ['A', ..., 'B', ..., 'C', ..., 'D', ...],`, - ` colorMap: {`, - ` type: 'ordinal',`, - ` values: ['A', 'B', 'C', 'D'],`, - ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, - ` }`, - ' }]}', - ] - : []), - `/>`, - ].join('\n')} - language="jsx" - copyButtonHidden - /> -
- ); -} - -const series = [ - { - data: [ - ...getGaussianSeriesData([-1, -1]), - ...getGaussianSeriesData([-1, 1]), - ...getGaussianSeriesData([1, 1]), - ...getGaussianSeriesData([1, -1]), - ], - }, -].map((s) => ({ - ...s, - valueFormatter: (v: ScatterValueType | null) => - v && `(${v.x.toFixed(1)}, ${v.y.toFixed(1)})`, -})); - -function getGaussianSeriesData( - mean: [number, number], - stdev: [number, number] = [0.5, 0.5], - N: number = 50, -) { - return [...Array(N)].map((_, i) => { - const x = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[0] + - mean[0]; - const y = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[1] + - mean[1]; - return { x, y, colorValue: x + y, id: `${mean.join(',')}${i}` }; - }); -} diff --git a/docs/data/charts/bubble/DifferentSizeScale.js b/docs/data/charts/bubble/DifferentSizeScale.js deleted file mode 100644 index 2f04a8b01e88f..0000000000000 --- a/docs/data/charts/bubble/DifferentSizeScale.js +++ /dev/null @@ -1,59 +0,0 @@ -import * as React from 'react'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import { ChartsReferenceLine } from '@mui/x-charts-pro/ChartsReferenceLine'; - -const values = [1, 2, 3, 5, 7, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100]; - -const scales = ['linear', 'sqrt', 'log']; -const series = scales.map((interpolator) => ({ - data: values.map((v) => ({ x: v, y: interpolator, sizeValue: v })), - sizeAxisId: interpolator, -})); - -export default function DifferentSizeScale() { - return ( - null }} - > - - - ); -} diff --git a/docs/data/charts/bubble/ScatterZAxis.js b/docs/data/charts/bubble/ScatterZAxis.js deleted file mode 100644 index 7c12737353c33..0000000000000 --- a/docs/data/charts/bubble/ScatterZAxis.js +++ /dev/null @@ -1,207 +0,0 @@ -import * as React from 'react'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Divider from '@mui/material/Divider'; -import Paper from '@mui/material/Paper'; -import Typography from '@mui/material/Typography'; -import { useZAxis } from '@mui/x-charts/hooks'; -import { irisData } from '../dataset/irisDataset'; - -const species = ['Setosa', 'Versicolor', 'Virginica']; -const speciesColors = ['#2e7d32', '#ed6c02', '#9c27b0']; -const speciesPredictionColors = ['#5aa35e', '#be7f4b', '#ba68c9']; - -function IrisMarker(props) { - const { x, y, color, size, isHighlighted, isFaded, dataIndex, ...other } = props; - - // Get and use color/size scale to determine stroke color and width based on prediction and confidence z-axes. - const predictionAxis = useZAxis('prediction'); - const confidenceAxis = useZAxis('confidence'); - const strokeWidth = - confidenceAxis?.sizeScale?.(confidenceAxis.data?.[dataIndex]) ?? 0; - const strokeColor = - predictionAxis?.colorScale?.(predictionAxis.data?.[dataIndex]) ?? 'gray'; - - const r = (isHighlighted ? 1.2 : 1) * size; - return ( - - ); -} - -/** - * Explains how the scatter plot encodes multiple dimensions of the dataset. - */ -function IrisAnnotation() { - return ( - - Fill color represents the actual species, stroke color represents the predicted - species, bubble size represents petal length, and stroke width represents - prediction confidence. - - ); -} - -function IrisTooltip() { - return ( - - - - ); -} - -function IrisTooltipContent() { - const item = useItemTooltip(); - - function numberFormatter(value) { - if (typeof value === 'number') { - return new Intl.NumberFormat('en-US').format(value); - } - return String(value); - } - - // Get the full data item from irisData using dataIndex from identifier - const dataIndex = item?.identifier.dataIndex; - const dataItem = dataIndex !== undefined ? irisData[dataIndex] : null; - - if (!item || !dataItem) { - return null; - } - - return ( - - - - {dataItem.species} - - - - - Sepal Length: - - {numberFormatter(dataItem.sepalLength)} cm - - - - Sepal Width: - - {numberFormatter(dataItem.sepalWidth)} cm - - - - Petal Length: - - {numberFormatter(dataItem.petalLength)} cm - - - - Petal Width: - - {numberFormatter(dataItem.petalWidth)} cm - - - - - Predicted: - - {dataItem.prediction} - - - - Confidence: - - {numberFormatter(dataItem.confidence)}% - - - - - ); -} - -export default function ScatterZAxis() { - return ( - - item.confidence)), - max: 100, - size: [0.5, 3], - }, - }, - ]} - slots={{ marker: IrisMarker, tooltip: IrisTooltip }} - > - - - ); -} diff --git a/docs/data/charts/bubble/SizeScale.js b/docs/data/charts/bubble/SizeScale.js deleted file mode 100644 index fac2f4c970ab1..0000000000000 --- a/docs/data/charts/bubble/SizeScale.js +++ /dev/null @@ -1,33 +0,0 @@ -import * as React from 'react'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; - -const data = [ - { x: 1, y: 2, sizeValue: 2 }, - { x: 2.4, y: 1.5, sizeValue: 8 }, - { x: 3.1, y: 3.4, sizeValue: 14 }, - { x: 1.8, y: 4.2, sizeValue: 5 }, - { x: 4.5, y: 2.8, sizeValue: 20 }, - { x: 3.7, y: 1.2, sizeValue: 11 }, - { x: 2.1, y: 3.9, sizeValue: 17 }, - { x: 4.9, y: 4.6, sizeValue: 3 }, - { x: 0.8, y: 1.1, sizeValue: 9 }, - { x: 3.3, y: 2.2, sizeValue: 25 }, - { x: 2.7, y: 4.8, sizeValue: 6 }, - { x: 4.1, y: 3.1, sizeValue: 13 }, -]; - -export default function SizeScale() { - return ( - - ); -} diff --git a/docs/data/charts/bubble/SizeScale.tsx.preview b/docs/data/charts/bubble/SizeScale.tsx.preview deleted file mode 100644 index e5e2b30217c31..0000000000000 --- a/docs/data/charts/bubble/SizeScale.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/bubble/bubble.md b/docs/data/charts/bubble/bubble.md index 5125076669127..970a0f727b4ad 100644 --- a/docs/data/charts/bubble/bubble.md +++ b/docs/data/charts/bubble/bubble.md @@ -13,7 +13,7 @@ components: ScatterChart, ScatterChartPro, ScatterChartPremium A bubble chart is a scatter chart where each point can have a variable size and color determined by data values. The x and y positions encode two variables, while the bubble size and color encode additional ones. -{{"demo": "BubbleChartCO2Emissions.js"}} +{{"component": "file://./demos/bubble-chart-co2-emissions/index.ts"}} ## Mapping data to color @@ -50,7 +50,7 @@ You can set the color value in three ways: See [Styling—Value-based colors](/x/react-charts/styling/#value-based-colors) for the `colorMap` properties. -{{"demo": "ColorScale.js"}} +{{"component": "file://./demos/color-scale/index.ts"}} ## Mapping data to size @@ -62,7 +62,7 @@ The mapped value comes from the `sizeValue` property on each data point, or from The `sizeMap` supports the same `continuous`, `piecewise`, and `ordinal` types as `colorMap`, but it maps values to a marker radius in pixels. A series can set both `colorAxisId` and `sizeAxisId` to style points by two values at once. -{{"demo": "SizeScale.js"}} +{{"component": "file://./demos/size-scale/index.ts"}} ### Using zAxis in custom components @@ -80,7 +80,7 @@ It uses 4 z-axes to map: - The petal length to the size of the mark - The confidence to the stroke width -{{"demo": "ScatterZAxis.js"}} +{{"component": "file://./demos/scatter-z-axis/index.ts"}} ### Different size scales @@ -91,4 +91,4 @@ You can change that behavior with `sizeMap.interpolator: 'log' | 'linear' | 'sqr When you do, make the choice explicit in the copy so the size encoding is not misleading. -{{"demo": "DifferentSizeScale.js"}} +{{"component": "file://./demos/different-size-scale/index.ts"}} diff --git a/docs/data/charts/bubble/BubbleChartCO2Emissions.tsx b/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/BubbleChartCO2Emissions.tsx similarity index 97% rename from docs/data/charts/bubble/BubbleChartCO2Emissions.tsx rename to docs/data/charts/bubble/demos/bubble-chart-co2-emissions/BubbleChartCO2Emissions.tsx index d8ec56e365ba1..2995e37678f93 100644 --- a/docs/data/charts/bubble/BubbleChartCO2Emissions.tsx +++ b/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/BubbleChartCO2Emissions.tsx @@ -6,7 +6,7 @@ import Box from '@mui/material/Box'; import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; -import { globalCo2GdpPopulation } from '../dataset/globalCo2GdpPopulation'; +import { globalCo2GdpPopulation } from '../../../dataset/globalCo2GdpPopulation'; const regions = [ 'Africa', @@ -110,6 +110,7 @@ function CountryBubbleTooltip() { export default function BubbleChartCO2Emissions() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/client.ts b/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/index.ts b/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/index.ts new file mode 100644 index 0000000000000..74ee7e24df991 --- /dev/null +++ b/docs/data/charts/bubble/demos/bubble-chart-co2-emissions/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BubbleChartCO2Emissions from './BubbleChartCO2Emissions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BubbleChartCO2Emissions, { ClientProvider }); diff --git a/docs/data/charts/bubble/demos/color-scale/ColorScale.tsx b/docs/data/charts/bubble/demos/color-scale/ColorScale.tsx new file mode 100644 index 0000000000000..b359f18c3bb46 --- /dev/null +++ b/docs/data/charts/bubble/demos/color-scale/ColorScale.tsx @@ -0,0 +1,308 @@ +import * as React from 'react'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import type { ScatterValueType } from '@mui/x-charts/models'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import ToggleButton from '@mui/material/ToggleButton'; +import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; +import { Chance } from 'chance'; + +const POINTS_NUMBER = 50; +const chance = new Chance(42); + +export default function ColorScale() { + // @focus-start @padding 1 + const [colorX, setColorX] = React.useState<'None' | 'piecewise' | 'continuous'>( + 'piecewise', + ); + const [colorY, setColorY] = React.useState<'None' | 'piecewise' | 'continuous'>( + 'None', + ); + const [colorZ, setColorZ] = React.useState< + 'None' | 'piecewise' | 'continuous' | 'ordinal' + >('None'); + + return ( + + div': { + display: 'flex', + flexDirection: 'column', + }, + }} + > +
+ x-axis colorMap + + setColorX(value) + } + aria-label="Platform" + > + None + piecewise + continuous + +
+
+ y-axis colorMap + + setColorY(value) + } + aria-label="Platform" + > + None + piecewise + continuous + +
+
+ z-axis colorMap + + setColorZ(value) + } + aria-label="Platform" + > + None + piecewise + continuous + ordinal + +
+
+ 'A'), + ...[...Array(POINTS_NUMBER)].map(() => 'B'), + ...[...Array(POINTS_NUMBER)].map(() => 'C'), + ...[...Array(POINTS_NUMBER)].map(() => 'D'), + ] + : undefined, + colorMap: + (colorZ === 'continuous' && { + type: 'continuous', + min: -2, + max: 2, + color: ['green', 'orange'], + }) || + (colorZ === 'piecewise' && { + type: 'piecewise', + thresholds: [-1.5, 0, 1.5], + colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'], + }) || + (colorZ === 'ordinal' && { + type: 'ordinal', + + values: ['A', 'B', 'C', 'D'], + colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'], + }) || + undefined, + }, + ]} + /> + ({...point, colorValue: point.x + point.y})) }]}', + // ColorX + ...(colorX === 'None' ? [' xAxis={[{}]}'] : []), + ...(colorX === 'continuous' + ? [ + ' xAxis={[{', + ` colorMap: {`, + ` type: 'continuous',`, + ` min: -2,`, + ` max: 2,`, + ` color: ['green', 'orange']`, + ` }`, + ' }]}', + ] + : []), + ...(colorX === 'piecewise' + ? [ + ' xAxis={[{', + ` colorMap: {`, + ` type: 'piecewise',`, + ` thresholds: [-1.5, 0, 1.5],`, + ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, + ` }`, + ' }]}', + ] + : []), + + // ColorY + ...(colorY === 'None' ? [' yAxis={[{}]}'] : []), + ...(colorY === 'continuous' + ? [ + ' yAxis={[{', + ` colorMap: {`, + ` type: 'continuous',`, + ` min: -2,`, + ` max: 2,`, + ` color: ['blue', 'red']`, + ` }`, + ' }]}', + ] + : []), + ...(colorY === 'piecewise' + ? [ + ' yAxis={[{', + ` colorMap: {`, + ` type: 'piecewise',`, + ` thresholds: [-1.5, 0, 1.5],`, + ` colors: ['lightblue', 'blue', 'orange', 'red'],`, + ` }`, + ' }]}', + ] + : []), + + // ColorZ + ...(colorZ === 'None' ? [' zAxis={[{}]}'] : []), + ...(colorZ === 'continuous' + ? [ + ' zAxis={[{', + ` colorMap: {`, + ` type: 'continuous',`, + ` min: -2,`, + ` max: 2,`, + ` color: ['green', 'orange'],`, + ` }`, + ' }]}', + ] + : []), + ...(colorZ === 'piecewise' + ? [ + ' zAxis={[{', + ` colorMap: {`, + ` type: 'piecewise',`, + ` thresholds: [-1.5, 0, 1.5],`, + ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, + ` }`, + ' }]}', + ] + : []), + ...(colorZ === 'ordinal' + ? [ + ' zAxis={[{', + ` data: ['A', ..., 'B', ..., 'C', ..., 'D', ...],`, + ` colorMap: {`, + ` type: 'ordinal',`, + ` values: ['A', 'B', 'C', 'D'],`, + ` colors: ['#d01c8b', '#f1b6da', '#b8e186', '#4dac26'],`, + ` }`, + ' }]}', + ] + : []), + `/>`, + ].join('\n')} + language="jsx" + copyButtonHidden + /> +
+ ); + // @focus-end +} + +const series = [ + { + data: [ + ...getGaussianSeriesData([-1, -1]), + ...getGaussianSeriesData([-1, 1]), + ...getGaussianSeriesData([1, 1]), + ...getGaussianSeriesData([1, -1]), + ], + }, +].map((s) => ({ + ...s, + valueFormatter: (v: ScatterValueType | null) => + v && `(${v.x.toFixed(1)}, ${v.y.toFixed(1)})`, +})); + +function getGaussianSeriesData( + mean: [number, number], + stdev: [number, number] = [0.5, 0.5], + N: number = 50, +) { + return [...Array(N)].map((_, i) => { + const x = + Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * + Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * + stdev[0] + + mean[0]; + const y = + Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * + Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * + stdev[1] + + mean[1]; + return { x, y, colorValue: x + y, id: `${mean.join(',')}${i}` }; + }); +} diff --git a/docs/data/charts/bubble/demos/color-scale/client.ts b/docs/data/charts/bubble/demos/color-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bubble/demos/color-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bubble/demos/color-scale/index.ts b/docs/data/charts/bubble/demos/color-scale/index.ts new file mode 100644 index 0000000000000..141c61df022b8 --- /dev/null +++ b/docs/data/charts/bubble/demos/color-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorScale from './ColorScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorScale, { ClientProvider }); diff --git a/docs/data/charts/bubble/DifferentSizeScale.tsx b/docs/data/charts/bubble/demos/different-size-scale/DifferentSizeScale.tsx similarity index 97% rename from docs/data/charts/bubble/DifferentSizeScale.tsx rename to docs/data/charts/bubble/demos/different-size-scale/DifferentSizeScale.tsx index a80f8eeaf2829..63cce5094ea3e 100644 --- a/docs/data/charts/bubble/DifferentSizeScale.tsx +++ b/docs/data/charts/bubble/demos/different-size-scale/DifferentSizeScale.tsx @@ -12,6 +12,7 @@ const series = scales.map((interpolator) => ({ export default function DifferentSizeScale() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bubble/demos/different-size-scale/client.ts b/docs/data/charts/bubble/demos/different-size-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bubble/demos/different-size-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bubble/demos/different-size-scale/index.ts b/docs/data/charts/bubble/demos/different-size-scale/index.ts new file mode 100644 index 0000000000000..46c8401df989d --- /dev/null +++ b/docs/data/charts/bubble/demos/different-size-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DifferentSizeScale from './DifferentSizeScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DifferentSizeScale, { ClientProvider }); diff --git a/docs/data/charts/bubble/ScatterZAxis.tsx b/docs/data/charts/bubble/demos/scatter-z-axis/ScatterZAxis.tsx similarity index 96% rename from docs/data/charts/bubble/ScatterZAxis.tsx rename to docs/data/charts/bubble/demos/scatter-z-axis/ScatterZAxis.tsx index dd50950b15f56..87718a58cd211 100644 --- a/docs/data/charts/bubble/ScatterZAxis.tsx +++ b/docs/data/charts/bubble/demos/scatter-z-axis/ScatterZAxis.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; -import { ScatterChart, ScatterMarkerProps } from '@mui/x-charts/ScatterChart'; +import type { ScatterMarkerProps } from '@mui/x-charts/ScatterChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; @@ -7,7 +8,7 @@ import Divider from '@mui/material/Divider'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import { useZAxis } from '@mui/x-charts/hooks'; -import { irisData } from '../dataset/irisDataset'; +import { irisData } from '../../../dataset/irisDataset'; const species = ['Setosa', 'Versicolor', 'Virginica']; const speciesColors = ['#2e7d32', '#ed6c02', '#9c27b0']; @@ -144,6 +145,7 @@ function IrisTooltipContent() { export default function ScatterZAxis() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/bubble/demos/scatter-z-axis/client.ts b/docs/data/charts/bubble/demos/scatter-z-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bubble/demos/scatter-z-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bubble/demos/scatter-z-axis/index.ts b/docs/data/charts/bubble/demos/scatter-z-axis/index.ts new file mode 100644 index 0000000000000..b6a15c296fdde --- /dev/null +++ b/docs/data/charts/bubble/demos/scatter-z-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterZAxis from './ScatterZAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterZAxis, { ClientProvider }); diff --git a/docs/data/charts/bubble/SizeScale.tsx b/docs/data/charts/bubble/demos/size-scale/SizeScale.tsx similarity index 94% rename from docs/data/charts/bubble/SizeScale.tsx rename to docs/data/charts/bubble/demos/size-scale/SizeScale.tsx index fac2f4c970ab1..2b52c7f03e4e1 100644 --- a/docs/data/charts/bubble/SizeScale.tsx +++ b/docs/data/charts/bubble/demos/size-scale/SizeScale.tsx @@ -18,6 +18,7 @@ const data = [ export default function SizeScale() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/bubble/demos/size-scale/client.ts b/docs/data/charts/bubble/demos/size-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/bubble/demos/size-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/bubble/demos/size-scale/index.ts b/docs/data/charts/bubble/demos/size-scale/index.ts new file mode 100644 index 0000000000000..da63f2bc761c7 --- /dev/null +++ b/docs/data/charts/bubble/demos/size-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SizeScale from './SizeScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SizeScale, { ClientProvider }); diff --git a/docs/data/charts/candlestick/BasicCandlestick.js b/docs/data/charts/candlestick/BasicCandlestick.js deleted file mode 100644 index a82ac83d4943e..0000000000000 --- a/docs/data/charts/candlestick/BasicCandlestick.js +++ /dev/null @@ -1,17 +0,0 @@ -import { CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; - -import sp500 from '../dataset/sp500-intraday.json'; - -const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); - -const data = sp500.map((entry) => [entry.open, entry.high, entry.low, entry.close]); - -export default function BasicCandlestick() { - return ( - - ); -} diff --git a/docs/data/charts/candlestick/BasicCandlestick.tsx b/docs/data/charts/candlestick/BasicCandlestick.tsx deleted file mode 100644 index 1abf893cc8e14..0000000000000 --- a/docs/data/charts/candlestick/BasicCandlestick.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { CandlestickChart as CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; -import sp500 from '../dataset/sp500-intraday.json'; - -const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); - -const data: Array = sp500.map((entry) => [ - entry.open, - entry.high, - entry.low, - entry.close, -]); - -export default function BasicCandlestick() { - return ( - - ); -} diff --git a/docs/data/charts/candlestick/BasicCandlestick.tsx.preview b/docs/data/charts/candlestick/BasicCandlestick.tsx.preview deleted file mode 100644 index 0b6189171efcb..0000000000000 --- a/docs/data/charts/candlestick/BasicCandlestick.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/candlestick/CandlestickComposition.js b/docs/data/charts/candlestick/CandlestickComposition.js deleted file mode 100644 index 4d73c3dd0bcf4..0000000000000 --- a/docs/data/charts/candlestick/CandlestickComposition.js +++ /dev/null @@ -1,238 +0,0 @@ -import * as React from 'react'; -import { useTheme } from '@mui/material/styles'; -import Stack from '@mui/material/Stack'; -import useId from '@mui/utils/useId'; -import { ChartsClipPath } from '@mui/x-charts-premium/ChartsClipPath'; -import { CandlestickPlot } from '@mui/x-charts-premium/CandlestickChart'; -import { LinePlot } from '@mui/x-charts-premium/LineChart'; -import { BarPlot } from '@mui/x-charts-premium/BarChart'; -import { ChartsXAxis } from '@mui/x-charts-premium/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts-premium/ChartsYAxis'; -import { useAxesTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { ChartsLegend } from '@mui/x-charts-premium/ChartsLegend'; - -import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; -import { ChartsWrapper } from '@mui/x-charts-premium/ChartsWrapper'; -import { ChartsAxisHighlight } from '@mui/x-charts-premium/ChartsAxisHighlight'; -import { ChartsGrid } from '@mui/x-charts-premium/ChartsGrid'; -import { useDrawingArea } from '@mui/x-charts-premium/hooks'; -import { ChartsWebGLLayer } from '@mui/x-charts-premium/ChartsWebGLLayer'; -import { ChartsLayerContainer } from '@mui/x-charts/ChartsLayerContainer'; -import { ChartsSvgLayer } from '@mui/x-charts/ChartsSvgLayer'; -import sp500ohlcv from '../dataset/sp500-2025-ohlcv.json'; // Source: Yahoo Finance - -const xData = sp500ohlcv.map((entry) => new Date(Date.parse(entry.date))); - -const ohlcData = sp500ohlcv.map((entry) => [ - entry.open, - entry.high, - entry.low, - entry.close, -]); - -// Extract volume data -const volumeData = sp500ohlcv.map((entry) => entry.volume); - -// Calculate 20-day moving average from closing prices -const movingAverage = []; -const windowSize = 20; -for (let i = 0; i < sp500ohlcv.length; i += 1) { - if (i < windowSize - 1) { - movingAverage.push(null); - } else { - const sum = sp500ohlcv - .slice(i - windowSize + 1, i + 1) - .reduce((acc, entry) => acc + entry.close, 0); - movingAverage.push(sum / windowSize); - } -} - -const formatVolume = (value) => - value.toLocaleString('en-US', { - maximumSignificantDigits: 3, - notation: 'compact', - compactDisplay: 'short', - }); - -const formatTooltipDollarValue = (value) => - value.toLocaleString('en-US', { - minimumFractionDigits: 0, - maximumFractionDigits: 2, - }); - -const formatAsDollar = (value) => - value.toLocaleString('en-US', { - currency: 'USD', - style: 'currency', - maximumFractionDigits: 0, - }); - -export default function CandlestickComposition() { - const id = useId(); - const clipPathId = `${id}-clip-path`; - const theme = useTheme(); - - const volumeBarColorGetter = ({ dataIndex }) => { - if (dataIndex === 0) { - return theme.palette.success.main; - } - - // Color the volume bar green if the closing price is higher than or equal to the previous day's close, - // red otherwise. This is how Yahoo Finance colors their volume bars. - return sp500ohlcv[dataIndex].close >= sp500ohlcv[dataIndex - 1].close - ? theme.palette.success.main - : theme.palette.error.main; - }; - - return ( - - value.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }), - zoom: { filterMode: 'discard' }, - }, - ]} - yAxis={[ - { - id: 'price', - valueFormatter: formatAsDollar, - width: 48, - position: 'right', - }, - { - id: 'volume', - // Ensures that volume bars only take up to 20% of the chart height - domainLimit: (min, max) => ({ min: 0, max: max.valueOf() * 5 }), - }, - ]} - height={400} - > - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -function CandlestickTooltip() { - const drawingArea = useDrawingArea(); - const axesTooltipData = useAxesTooltip({ - directions: ['x'], - }); - - const tooltipData = axesTooltipData?.[0]; - - if (!tooltipData) { - return null; - } - - const ohlcItem = tooltipData.seriesItems.find((item) => item.seriesId === 'ohlc'); - const movingAverageItem = tooltipData.seriesItems.find( - (item) => item.seriesId === 'moving-average', - ); - const volumeItem = tooltipData.seriesItems.find( - (item) => item.seriesId === 'volume', - ); - - return ( - - ({ - ...theme.typography.caption, - pointerEvents: 'none', - marginLeft: theme.spacing(1), - marginTop: theme.spacing(1), - gap: 0.5, - })} - > - ({ - width: 'min-content', - paddingX: theme.spacing(1), - paddingY: theme.spacing(0.5), - background: theme.palette.background.paper, - gap: 1, - })} - > - O:{formatTooltipDollarValue(ohlcItem.value.open)} - H:{formatTooltipDollarValue(ohlcItem.value.high)} - L:{formatTooltipDollarValue(ohlcItem.value.low)} - C:{formatTooltipDollarValue(ohlcItem.value.close)} - V:{formatVolume(volumeItem.value)} - - {movingAverageItem.value != null && ( - ({ - width: 'min-content', - paddingX: theme.spacing(1), - paddingY: theme.spacing(0.5), - background: theme.palette.background.paper, - })} - > - MA:{formatTooltipDollarValue(movingAverageItem.value)} - - )} - - - ); -} diff --git a/docs/data/charts/candlestick/CandlestickOverview.js b/docs/data/charts/candlestick/CandlestickOverview.js deleted file mode 100644 index 43ce263158bbf..0000000000000 --- a/docs/data/charts/candlestick/CandlestickOverview.js +++ /dev/null @@ -1,452 +0,0 @@ -import * as React from 'react'; -import { useTheme } from '@mui/material/styles'; -import Stack from '@mui/material/Stack'; -import Checkbox from '@mui/material/Checkbox'; -import Menu from '@mui/material/Menu'; -import MenuItem from '@mui/material/MenuItem'; -import Select from '@mui/material/Select'; -import Typography from '@mui/material/Typography'; -import FileDownloadIcon from '@mui/icons-material/FileDownload'; -import useId from '@mui/utils/useId'; -import { ChartsClipPath } from '@mui/x-charts-premium/ChartsClipPath'; -import { CandlestickPlot } from '@mui/x-charts-premium/CandlestickChart'; -import { LinePlot } from '@mui/x-charts-premium/LineChart'; -import { BarPlot } from '@mui/x-charts-premium/BarChart'; -import { ChartsXAxis } from '@mui/x-charts-premium/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts-premium/ChartsYAxis'; -import { useAxesTooltip } from '@mui/x-charts-premium/ChartsTooltip'; - -import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; -import { ChartsWrapper } from '@mui/x-charts-premium/ChartsWrapper'; -import { ChartsAxisHighlight } from '@mui/x-charts-premium/ChartsAxisHighlight'; -import { ChartsGrid } from '@mui/x-charts-premium/ChartsGrid'; -import { useDrawingArea, useXScale } from '@mui/x-charts-premium/hooks'; -import { ChartsWebGLLayer } from '@mui/x-charts-premium/ChartsWebGLLayer'; -import { ChartsLayerContainer } from '@mui/x-charts-premium/ChartsLayerContainer'; -import { ChartsSvgLayer } from '@mui/x-charts-premium/ChartsSvgLayer'; -import { ChartsZoomSlider } from '@mui/x-charts-premium/ChartsZoomSlider'; -import { - ChartsToolbarImageExportTrigger, - ChartsToolbarPrintExportTrigger, -} from '@mui/x-charts-premium/ChartsToolbarPro'; -import { Toolbar, ToolbarButton } from '@mui/x-charts-premium/Toolbar'; -import ohlcv from '../dataset/ibkr-2025-ohlcv.json'; // Source: Yahoo Finance - -const dividends = [ - { date: '2025-02-28T00:00:00', amount: 0.0625 }, - { date: '2025-05-30T00:00:00', amount: 0.08 }, - { date: '2025-08-29T00:00:00', amount: 0.08 }, - { date: '2025-12-01T00:00:00', amount: 0.08 }, -]; - -const stockSplits = [{ date: '2025-06-18T00:00:00', ratio: 4 }]; - -const xData = ohlcv.map((entry) => new Date(Date.parse(entry.date))); - -const ohlcData = ohlcv.map((entry) => [ - entry.open, - entry.high, - entry.low, - entry.close, -]); - -// Extract volume data -const volumeData = ohlcv.map((entry) => entry.volume); - -function calcMovingAverage(windowSize) { - return ohlcv.map((_, i) => { - if (i < windowSize - 1) { - return null; - } - const sum = ohlcv - .slice(i - windowSize + 1, i + 1) - .reduce((acc, entry) => acc + entry.close, 0); - return sum / windowSize; - }); -} - -const formatVolume = (value) => - value.toLocaleString('en-US', { - maximumSignificantDigits: 3, - notation: 'compact', - compactDisplay: 'short', - }); - -const formatTooltipDollarValue = (value) => - value.toLocaleString('en-US', { - minimumFractionDigits: 0, - maximumFractionDigits: 2, - }); - -const formatAsDollar = (value) => - value.toLocaleString('en-US', { - currency: 'USD', - style: 'currency', - maximumFractionDigits: 0, - }); - -export default function CandlestickOverview() { - const id = useId(); - const clipPathId = `${id}-clip-path`; - const theme = useTheme(); - const [movingAverageWindow, setMovingAverageWindow] = React.useState(20); - const [visibleAnnotations, setVisibleAnnotations] = React.useState([ - 'dividends', - 'splits', - ]); - const movingAverageData = React.useMemo( - () => - movingAverageWindow !== null ? calcMovingAverage(movingAverageWindow) : null, - [movingAverageWindow], - ); - - const volumeBarColorGetter = ({ dataIndex }) => { - if (dataIndex === 0) { - return theme.palette.success.main; - } - - // Color the volume bar green if the closing price is higher than or equal to the previous day's close, - // red otherwise. This is how Yahoo Finance colors their volume bars. - return ohlcv[dataIndex].close >= ohlcv[dataIndex - 1].close - ? theme.palette.success.main - : theme.palette.error.main; - }; - - return ( - - - Interactive Brokers Stock Price - 2025 - - - value.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }), - zoom: { - filterMode: 'discard', - slider: { enabled: true, preview: { seriesIds: ['ohlc'] } }, - }, - }, - ]} - yAxis={[ - { - id: 'price', - valueFormatter: formatAsDollar, - width: 32, - position: 'right', - }, - { - id: 'volume', - // Ensures that volume bars only take up to 20% of the chart height - domainLimit: (min, max) => ({ min: 0, max: max.valueOf() * 5 }), - }, - ]} - height={400} - margin={{ top: 8, bottom: 0, left: 8, right: 0 }} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - Source: Yahoo Finance - - ); -} - -function CandlestickToolbar({ - movingAverageWindow, - onMovingAverageWindowChange, - visibleAnnotations, - onVisibleAnnotationsChange, -}) { - const [anchorEl, setAnchorEl] = React.useState(null); - const open = Boolean(anchorEl); - const menuId = useId(); - const buttonId = useId(); - - const handleOpen = (event) => { - setAnchorEl(event.currentTarget); - }; - const handleClose = () => setAnchorEl(null); - - return ( - - - - - - - - } - onClick={handleClose} - > - Print - - } - options={{ type: 'image/png' }} - onClick={handleClose} - > - Download as PNG - - - - ); -} - -function CandlestickTooltip() { - const drawingArea = useDrawingArea(); - const axesTooltipData = useAxesTooltip({ - directions: ['x'], - }); - - const tooltipData = axesTooltipData?.[0]; - - if (!tooltipData) { - return null; - } - - const ohlcItem = tooltipData.seriesItems.find((item) => item.seriesId === 'ohlc'); - const movingAverageItem = tooltipData.seriesItems.find( - (item) => item.seriesId === 'moving-average', - ); - const volumeItem = tooltipData.seriesItems.find( - (item) => item.seriesId === 'volume', - ); - - return ( - - ({ - gap: 0.5, - ...theme.typography.caption, - pointerEvents: 'none', - marginLeft: theme.spacing(1), - marginTop: theme.spacing(1), - })} - > - ({ - gap: 1, - width: 'min-content', - paddingX: theme.spacing(1), - paddingY: theme.spacing(0.5), - background: theme.palette.background.paper, - })} - > - O:{formatTooltipDollarValue(ohlcItem.value.open)} - H:{formatTooltipDollarValue(ohlcItem.value.high)} - L:{formatTooltipDollarValue(ohlcItem.value.low)} - C:{formatTooltipDollarValue(ohlcItem.value.close)} - V:{formatVolume(volumeItem.value)} - - {movingAverageItem?.value != null && ( - ({ - width: 'min-content', - paddingX: theme.spacing(1), - paddingY: theme.spacing(0.5), - background: theme.palette.background.paper, - })} - > - MA:{formatTooltipDollarValue(movingAverageItem.value)} - - )} - - - ); -} - -function CandlestickAnnotations({ showDividends, showSplits }) { - const drawingArea = useDrawingArea(); - const xScale = useXScale(); - const bandwidth = xScale.bandwidth(); - - const getX = (dateStr) => { - const match = xData.find((d) => d.getTime() === Date.parse(dateStr)); - if (!match) { - return null; - } - const pos = xScale(match); - return pos === undefined ? null : pos + bandwidth / 2; - }; - - return ( - - {showDividends && - dividends.map(({ date, amount }) => { - const x = getX(date); - if (x === null) { - return null; - } - return ( - - - - D ${amount} - - - ); - })} - {showSplits && - stockSplits.map(({ date, ratio }) => { - const x = getX(date); - if (x === null) { - return null; - } - return ( - - - - Split {ratio}:1 - - - ); - })} - - ); -} diff --git a/docs/data/charts/candlestick/CandlestickValueFormatter.js b/docs/data/charts/candlestick/CandlestickValueFormatter.js deleted file mode 100644 index 77c1b2c39ea4a..0000000000000 --- a/docs/data/charts/candlestick/CandlestickValueFormatter.js +++ /dev/null @@ -1,54 +0,0 @@ -import { CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; - -import sp500 from '../dataset/sp500-intraday.json'; - -const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); - -const data = [...sp500] - .reverse() - .map((entry) => [entry.open, entry.high, entry.low, entry.close]); - -const dollarFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', -}); - -const dateFormatter = new Intl.DateTimeFormat('en-US', { - weekday: 'short', - year: 'numeric', - month: 'short', - day: 'numeric', -}); - -const chartSettings = { - xAxis: [ - { - data: xData, - valueFormatter: (date) => dateFormatter.format(date), - zoom: { minSpan: 1, filterMode: 'discard' }, - }, - ], - series: [], - height: 400, -}; - -export default function CandlestickValueFormatter() { - return ( - // prettier-ignore - { - if (value === null) {return '';} - if (field === 'open') {return `⇒ ${dollarFormatter.format(value)}`;} - if (field === 'close') {return `⇐ ${dollarFormatter.format(value)}`;} - if (field === 'high') {return `⇗ ${dollarFormatter.format(value)}`;} - if (field === 'low') {return `⇙ ${dollarFormatter.format(value)}`;} - return dollarFormatter.format(value); - } - }] - } /> - ); -} diff --git a/docs/data/charts/candlestick/CandlestickValueFormatter.tsx.preview b/docs/data/charts/candlestick/CandlestickValueFormatter.tsx.preview deleted file mode 100644 index 0ba23f7ea880c..0000000000000 --- a/docs/data/charts/candlestick/CandlestickValueFormatter.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - { - if (value === null) { return ''; } - if (field === 'open') { return `⇒ ${dollarFormatter.format(value)}`; } - if (field === 'close') { return `⇐ ${dollarFormatter.format(value)}`; } - if (field === 'high') { return `⇗ ${dollarFormatter.format(value)}`; } - if (field === 'low') { return `⇙ ${dollarFormatter.format(value)}`; } - return dollarFormatter.format(value); - }, - }, - ]} -/> \ No newline at end of file diff --git a/docs/data/charts/candlestick/ColorCandlestick.js b/docs/data/charts/candlestick/ColorCandlestick.js deleted file mode 100644 index 87b80a2a9095b..0000000000000 --- a/docs/data/charts/candlestick/ColorCandlestick.js +++ /dev/null @@ -1,23 +0,0 @@ -import { CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; - -import sp500 from '../dataset/sp500-intraday.json'; - -const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); - -const data = sp500.map((entry) => [entry.open, entry.high, entry.low, entry.close]); - -export default function ColorCandlestick() { - return ( - (mode === 'dark' ? '#f7be85' : '#F28C28'), - }, - ]} - height={400} - /> - ); -} diff --git a/docs/data/charts/candlestick/ColorCandlestick.tsx.preview b/docs/data/charts/candlestick/ColorCandlestick.tsx.preview deleted file mode 100644 index 39da34f280d47..0000000000000 --- a/docs/data/charts/candlestick/ColorCandlestick.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - - mode === 'dark' ? '#f7be85' : '#F28C28', - }, - ]} - height={400} -/> \ No newline at end of file diff --git a/docs/data/charts/candlestick/CustomizedCandlestick.js b/docs/data/charts/candlestick/CustomizedCandlestick.js deleted file mode 100644 index cae81c1075955..0000000000000 --- a/docs/data/charts/candlestick/CustomizedCandlestick.js +++ /dev/null @@ -1,43 +0,0 @@ -import { CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; - -import sp500 from '../dataset/sp500-intraday.json'; - -const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); - -const data = [...sp500] - .reverse() - .map((entry) => [entry.open, entry.high, entry.low, entry.close]); - -const dollarFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - maximumFractionDigits: 0, -}); - -const dateFormatter = new Intl.DateTimeFormat('en-US', { - weekday: 'short', - year: 'numeric', - month: 'short', - day: 'numeric', -}); - -const chartSettings = { - series: [{ data }], - height: 400, -}; - -export default function CustomizedCandlestick() { - return ( - dateFormatter.format(date), - zoom: { minSpan: 1, filterMode: 'discard' }, - }, - ]} - yAxis={[{ valueFormatter: (value) => dollarFormatter.format(value) }]} - /> - ); -} diff --git a/docs/data/charts/candlestick/CustomizedCandlestick.tsx b/docs/data/charts/candlestick/CustomizedCandlestick.tsx deleted file mode 100644 index 5b17a14fed946..0000000000000 --- a/docs/data/charts/candlestick/CustomizedCandlestick.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { - CandlestickChart as CandlestickChart, - type CandlestickChartProps, -} from '@mui/x-charts-premium/CandlestickChart'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; -import sp500 from '../dataset/sp500-intraday.json'; - -const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); - -const data: Array = [...sp500] - .reverse() - .map((entry) => [entry.open, entry.high, entry.low, entry.close]); - -const dollarFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - maximumFractionDigits: 0, -}); - -const dateFormatter = new Intl.DateTimeFormat('en-US', { - weekday: 'short', - year: 'numeric', - month: 'short', - day: 'numeric', -}); - -const chartSettings = { - series: [{ data }], - height: 400, -} satisfies CandlestickChartProps; - -export default function CustomizedCandlestick() { - return ( - dateFormatter.format(date), - zoom: { minSpan: 1, filterMode: 'discard' }, - }, - ]} - yAxis={[{ valueFormatter: (value: number) => dollarFormatter.format(value) }]} - /> - ); -} diff --git a/docs/data/charts/candlestick/CustomizedCandlestick.tsx.preview b/docs/data/charts/candlestick/CustomizedCandlestick.tsx.preview deleted file mode 100644 index ec0c3750c2399..0000000000000 --- a/docs/data/charts/candlestick/CustomizedCandlestick.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - dateFormatter.format(date), - zoom: { minSpan: 1, filterMode: 'discard' }, - }, - ]} - yAxis={[{ valueFormatter: (value: number) => dollarFormatter.format(value) }]} -/> \ No newline at end of file diff --git a/docs/data/charts/candlestick/DatasetCandlestick.js b/docs/data/charts/candlestick/DatasetCandlestick.js deleted file mode 100644 index 52a6f00553e98..0000000000000 --- a/docs/data/charts/candlestick/DatasetCandlestick.js +++ /dev/null @@ -1,27 +0,0 @@ -import { CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; -import GOOGL from '../dataset/GOOGL.json'; - -const dataset = GOOGL.map((entry) => ({ - ...entry, - date: new Date(Date.parse(entry.date)), -})); - -export default function DatasetCandlestick() { - return ( - - ); -} diff --git a/docs/data/charts/candlestick/DatasetCandlestick.tsx.preview b/docs/data/charts/candlestick/DatasetCandlestick.tsx.preview deleted file mode 100644 index 25e633bb4f063..0000000000000 --- a/docs/data/charts/candlestick/DatasetCandlestick.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/candlestick/candlestick.md b/docs/data/charts/candlestick/candlestick.md index b6d230dc41b52..4d16735863963 100644 --- a/docs/data/charts/candlestick/candlestick.md +++ b/docs/data/charts/candlestick/candlestick.md @@ -16,7 +16,7 @@ Each candlestick represents a time period and shows where the price started, whe This makes it easier to understand overall trends, compare price movements, and see how buying and selling activity evolves. -{{"demo": "CandlestickOverview.js"}} +{{"component": "file://./demos/candlestick-overview/index.ts"}} ## Basics @@ -36,7 +36,7 @@ const data = [ You can specify the time period with the `xAxis` prop. This axis must have a band scale and its data should have the same length as your series. -{{"demo": "BasicCandlestick.js"}} +{{"component": "file://./demos/basic-candlestick/index.ts"}} ### Using a dataset @@ -44,7 +44,7 @@ You can use the `dataset` prop to provide OHLC data and `datasetKeys` on the ser See the [Dataset](/x/react-charts/dataset/) page to learn more. -{{"demo": "DatasetCandlestick.js"}} +{{"component": "file://./demos/dataset-candlestick/index.ts"}} ## Value formatting @@ -53,7 +53,7 @@ Use the series `valueFormatter` to customize how OHLC values appear in the toolt The `valueFormatter` receives the individual field value (a number) and a context object with `dataIndex` and `field` properties. The `field` property indicates which OHLC component is being formatted: `'open'`, `'high'`, `'low'`, or `'close'`. -{{"demo": "CandlestickValueFormatter.js"}} +{{"component": "file://./demos/candlestick-value-formatter/index.ts"}} ## Customization @@ -61,7 +61,7 @@ Similarly to other chart types, you can customize the appearance and behavior of The example below shows how to define the formatting of values in both axes. -{{"demo": "CustomizedCandlestick.js"}} +{{"component": "file://./demos/customized-candlestick/index.ts"}} ### Color @@ -70,7 +70,7 @@ The `upColor` is used when the close price is greater than or equal to the open Those properties accept callback with type `(mode: 'light' | 'dark') => string`. -{{"demo": "ColorCandlestick.js"}} +{{"component": "file://./demos/color-candlestick/index.ts"}} ### Custom tooltip @@ -107,4 +107,4 @@ A candlestick series requires a band x-axis, so you need to set the `scaleType` Since the candlestick plot is a WebGL canvas, you need to render it inside a `ChartsWebGLLayer`. You can read more about layering in the [Layering](/x/react-charts/composition/#layering) documentation. -{{"demo": "CandlestickComposition.js"}} +{{"component": "file://./demos/candlestick-composition/index.ts"}} diff --git a/docs/data/charts/candlestick/demos/basic-candlestick/BasicCandlestick.tsx b/docs/data/charts/candlestick/demos/basic-candlestick/BasicCandlestick.tsx new file mode 100644 index 0000000000000..99a14c4400d34 --- /dev/null +++ b/docs/data/charts/candlestick/demos/basic-candlestick/BasicCandlestick.tsx @@ -0,0 +1,24 @@ +import { CandlestickChart as CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; +import sp500 from '../../../dataset/sp500-intraday.json'; + +const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); + +const data: Array = sp500.map((entry) => [ + entry.open, + entry.high, + entry.low, + entry.close, +]); + +export default function BasicCandlestick() { + return ( + // @focus-start @padding 2 + + // @focus-end + ); +} diff --git a/docs/data/charts/candlestick/demos/basic-candlestick/client.ts b/docs/data/charts/candlestick/demos/basic-candlestick/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/basic-candlestick/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/candlestick/demos/basic-candlestick/index.ts b/docs/data/charts/candlestick/demos/basic-candlestick/index.ts new file mode 100644 index 0000000000000..7661b0e485464 --- /dev/null +++ b/docs/data/charts/candlestick/demos/basic-candlestick/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicCandlestick from './BasicCandlestick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicCandlestick, { ClientProvider }); diff --git a/docs/data/charts/candlestick/CandlestickComposition.tsx b/docs/data/charts/candlestick/demos/candlestick-composition/CandlestickComposition.tsx similarity index 95% rename from docs/data/charts/candlestick/CandlestickComposition.tsx rename to docs/data/charts/candlestick/demos/candlestick-composition/CandlestickComposition.tsx index 755116c24a1ff..5d5872b9bb61c 100644 --- a/docs/data/charts/candlestick/CandlestickComposition.tsx +++ b/docs/data/charts/candlestick/demos/candlestick-composition/CandlestickComposition.tsx @@ -8,9 +8,10 @@ import { LinePlot } from '@mui/x-charts-premium/LineChart'; import { BarPlot } from '@mui/x-charts-premium/BarChart'; import { ChartsXAxis } from '@mui/x-charts-premium/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts-premium/ChartsYAxis'; -import { SeriesItem, useAxesTooltip } from '@mui/x-charts-premium/ChartsTooltip'; +import type { SeriesItem } from '@mui/x-charts-premium/ChartsTooltip'; +import { useAxesTooltip } from '@mui/x-charts-premium/ChartsTooltip'; import { ChartsLegend } from '@mui/x-charts-premium/ChartsLegend'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; import { ChartsWrapper } from '@mui/x-charts-premium/ChartsWrapper'; import { ChartsAxisHighlight } from '@mui/x-charts-premium/ChartsAxisHighlight'; @@ -19,7 +20,7 @@ import { useDrawingArea } from '@mui/x-charts-premium/hooks'; import { ChartsWebGLLayer } from '@mui/x-charts-premium/ChartsWebGLLayer'; import { ChartsLayerContainer } from '@mui/x-charts/ChartsLayerContainer'; import { ChartsSvgLayer } from '@mui/x-charts/ChartsSvgLayer'; -import sp500ohlcv from '../dataset/sp500-2025-ohlcv.json'; // Source: Yahoo Finance +import sp500ohlcv from '../../../dataset/sp500-2025-ohlcv.json'; // Source: Yahoo Finance const xData = sp500ohlcv.map((entry) => new Date(Date.parse(entry.date))); @@ -68,6 +69,7 @@ const formatAsDollar = (value: number) => }); export default function CandlestickComposition() { + // @focus-start @padding 1 const id = useId(); const clipPathId = `${id}-clip-path`; const theme = useTheme(); @@ -165,6 +167,7 @@ export default function CandlestickComposition() { ); + // @focus-end } function CandlestickTooltip() { diff --git a/docs/data/charts/candlestick/demos/candlestick-composition/client.ts b/docs/data/charts/candlestick/demos/candlestick-composition/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/candlestick-composition/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/candlestick/demos/candlestick-composition/index.ts b/docs/data/charts/candlestick/demos/candlestick-composition/index.ts new file mode 100644 index 0000000000000..151b46c7480a3 --- /dev/null +++ b/docs/data/charts/candlestick/demos/candlestick-composition/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CandlestickComposition from './CandlestickComposition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CandlestickComposition, { ClientProvider }); diff --git a/docs/data/charts/candlestick/CandlestickOverview.tsx b/docs/data/charts/candlestick/demos/candlestick-overview/CandlestickOverview.tsx similarity index 97% rename from docs/data/charts/candlestick/CandlestickOverview.tsx rename to docs/data/charts/candlestick/demos/candlestick-overview/CandlestickOverview.tsx index a61e92a28f9b2..8cd2db5f74011 100644 --- a/docs/data/charts/candlestick/CandlestickOverview.tsx +++ b/docs/data/charts/candlestick/demos/candlestick-overview/CandlestickOverview.tsx @@ -14,8 +14,9 @@ import { LinePlot } from '@mui/x-charts-premium/LineChart'; import { BarPlot } from '@mui/x-charts-premium/BarChart'; import { ChartsXAxis } from '@mui/x-charts-premium/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts-premium/ChartsYAxis'; -import { SeriesItem, useAxesTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; +import type { SeriesItem } from '@mui/x-charts-premium/ChartsTooltip'; +import { useAxesTooltip } from '@mui/x-charts-premium/ChartsTooltip'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; import { ChartsWrapper } from '@mui/x-charts-premium/ChartsWrapper'; import { ChartsAxisHighlight } from '@mui/x-charts-premium/ChartsAxisHighlight'; @@ -30,7 +31,7 @@ import { ChartsToolbarPrintExportTrigger, } from '@mui/x-charts-premium/ChartsToolbarPro'; import { Toolbar, ToolbarButton } from '@mui/x-charts-premium/Toolbar'; -import ohlcv from '../dataset/ibkr-2025-ohlcv.json'; // Source: Yahoo Finance +import ohlcv from '../../../dataset/ibkr-2025-ohlcv.json'; // Source: Yahoo Finance const dividends = [ { date: '2025-02-28T00:00:00', amount: 0.0625 }, @@ -85,6 +86,7 @@ const formatAsDollar = (value: number) => }); export default function CandlestickOverview() { + // @focus-start @padding 1 const id = useId(); const clipPathId = `${id}-clip-path`; const theme = useTheme(); @@ -218,6 +220,7 @@ export default function CandlestickOverview() { Source: Yahoo Finance ); + // @focus-end } function CandlestickToolbar({ diff --git a/docs/data/charts/candlestick/demos/candlestick-overview/client.ts b/docs/data/charts/candlestick/demos/candlestick-overview/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/candlestick-overview/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/candlestick/demos/candlestick-overview/index.ts b/docs/data/charts/candlestick/demos/candlestick-overview/index.ts new file mode 100644 index 0000000000000..c8d6c6f72c691 --- /dev/null +++ b/docs/data/charts/candlestick/demos/candlestick-overview/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CandlestickOverview from './CandlestickOverview'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CandlestickOverview, { ClientProvider }); diff --git a/docs/data/charts/candlestick/CandlestickValueFormatter.tsx b/docs/data/charts/candlestick/demos/candlestick-value-formatter/CandlestickValueFormatter.tsx similarity index 79% rename from docs/data/charts/candlestick/CandlestickValueFormatter.tsx rename to docs/data/charts/candlestick/demos/candlestick-value-formatter/CandlestickValueFormatter.tsx index 2e18d9f8633f7..aa0fddf59252b 100644 --- a/docs/data/charts/candlestick/CandlestickValueFormatter.tsx +++ b/docs/data/charts/candlestick/demos/candlestick-value-formatter/CandlestickValueFormatter.tsx @@ -1,9 +1,7 @@ -import { - CandlestickChart as CandlestickChart, - type CandlestickChartProps, -} from '@mui/x-charts-premium/CandlestickChart'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; -import sp500 from '../dataset/sp500-intraday.json'; +import { CandlestickChart as CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; +import type { CandlestickChartProps } from '@mui/x-charts-premium/CandlestickChart'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; +import sp500 from '../../../dataset/sp500-intraday.json'; const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); @@ -38,6 +36,7 @@ const chartSettings = { export default function CandlestickValueFormatter() { return ( // prettier-ignore + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/candlestick/demos/candlestick-value-formatter/client.ts b/docs/data/charts/candlestick/demos/candlestick-value-formatter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/candlestick-value-formatter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/candlestick/demos/candlestick-value-formatter/index.ts b/docs/data/charts/candlestick/demos/candlestick-value-formatter/index.ts new file mode 100644 index 0000000000000..d5d0a78e9a1ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/candlestick-value-formatter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CandlestickValueFormatter from './CandlestickValueFormatter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CandlestickValueFormatter, { ClientProvider }); diff --git a/docs/data/charts/candlestick/ColorCandlestick.tsx b/docs/data/charts/candlestick/demos/color-candlestick/ColorCandlestick.tsx similarity index 79% rename from docs/data/charts/candlestick/ColorCandlestick.tsx rename to docs/data/charts/candlestick/demos/color-candlestick/ColorCandlestick.tsx index cd0baae98b1fc..285409a19b68f 100644 --- a/docs/data/charts/candlestick/ColorCandlestick.tsx +++ b/docs/data/charts/candlestick/demos/color-candlestick/ColorCandlestick.tsx @@ -1,6 +1,6 @@ import { CandlestickChart as CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; -import sp500 from '../dataset/sp500-intraday.json'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; +import sp500 from '../../../dataset/sp500-intraday.json'; const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); @@ -13,6 +13,7 @@ const data: Array = sp500.map((entry) => [ export default function ColorCandlestick() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/candlestick/demos/color-candlestick/client.ts b/docs/data/charts/candlestick/demos/color-candlestick/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/color-candlestick/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/candlestick/demos/color-candlestick/index.ts b/docs/data/charts/candlestick/demos/color-candlestick/index.ts new file mode 100644 index 0000000000000..8ad7614f93e07 --- /dev/null +++ b/docs/data/charts/candlestick/demos/color-candlestick/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorCandlestick from './ColorCandlestick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorCandlestick, { ClientProvider }); diff --git a/docs/data/charts/candlestick/demos/customized-candlestick/CustomizedCandlestick.tsx b/docs/data/charts/candlestick/demos/customized-candlestick/CustomizedCandlestick.tsx new file mode 100644 index 0000000000000..0fe3c53d108af --- /dev/null +++ b/docs/data/charts/candlestick/demos/customized-candlestick/CustomizedCandlestick.tsx @@ -0,0 +1,46 @@ +import { CandlestickChart as CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; +import type { CandlestickChartProps } from '@mui/x-charts-premium/CandlestickChart'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; +import sp500 from '../../../dataset/sp500-intraday.json'; + +const xData = sp500.map((entry) => new Date(Date.parse(entry.date))); + +const data: Array = [...sp500] + .reverse() + .map((entry) => [entry.open, entry.high, entry.low, entry.close]); + +const dollarFormatter = new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', + maximumFractionDigits: 0, +}); + +const dateFormatter = new Intl.DateTimeFormat('en-US', { + weekday: 'short', + year: 'numeric', + month: 'short', + day: 'numeric', +}); + +const chartSettings = { + series: [{ data }], + height: 400, +} satisfies CandlestickChartProps; + +export default function CustomizedCandlestick() { + return ( + // @focus-start @padding 2 + dateFormatter.format(date), + zoom: { minSpan: 1, filterMode: 'discard' }, + }, + ]} + yAxis={[{ valueFormatter: (value: number) => dollarFormatter.format(value) }]} + /> + // @focus-end + ); +} diff --git a/docs/data/charts/candlestick/demos/customized-candlestick/client.ts b/docs/data/charts/candlestick/demos/customized-candlestick/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/customized-candlestick/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/candlestick/demos/customized-candlestick/index.ts b/docs/data/charts/candlestick/demos/customized-candlestick/index.ts new file mode 100644 index 0000000000000..5555c4d6a1c06 --- /dev/null +++ b/docs/data/charts/candlestick/demos/customized-candlestick/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomizedCandlestick from './CustomizedCandlestick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomizedCandlestick, { ClientProvider }); diff --git a/docs/data/charts/candlestick/DatasetCandlestick.tsx b/docs/data/charts/candlestick/demos/dataset-candlestick/DatasetCandlestick.tsx similarity index 85% rename from docs/data/charts/candlestick/DatasetCandlestick.tsx rename to docs/data/charts/candlestick/demos/dataset-candlestick/DatasetCandlestick.tsx index e943332b7809a..d8f82f720f6e5 100644 --- a/docs/data/charts/candlestick/DatasetCandlestick.tsx +++ b/docs/data/charts/candlestick/demos/dataset-candlestick/DatasetCandlestick.tsx @@ -1,5 +1,5 @@ import { CandlestickChart as CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; -import GOOGL from '../dataset/GOOGL.json'; +import GOOGL from '../../../dataset/GOOGL.json'; const dataset = GOOGL.map((entry) => ({ ...entry, @@ -8,6 +8,7 @@ const dataset = GOOGL.map((entry) => ({ export default function DatasetCandlestick() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/candlestick/demos/dataset-candlestick/client.ts b/docs/data/charts/candlestick/demos/dataset-candlestick/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/candlestick/demos/dataset-candlestick/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/candlestick/demos/dataset-candlestick/index.ts b/docs/data/charts/candlestick/demos/dataset-candlestick/index.ts new file mode 100644 index 0000000000000..319207464b2af --- /dev/null +++ b/docs/data/charts/candlestick/demos/dataset-candlestick/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DatasetCandlestick from './DatasetCandlestick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DatasetCandlestick, { ClientProvider }); diff --git a/docs/data/charts/components/BasicScaleDemo.js b/docs/data/charts/components/BasicScaleDemo.js deleted file mode 100644 index c8e1af7482f00..0000000000000 --- a/docs/data/charts/components/BasicScaleDemo.js +++ /dev/null @@ -1,66 +0,0 @@ -import * as React from 'react'; -import { styled } from '@mui/material/styles'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { useDrawingArea } from '@mui/x-charts/hooks'; - -const StyledPath = styled('path')(({ theme }) => ({ - fill: 'none', - stroke: theme.palette.text.primary, - shapeRendering: 'crispEdges', - strokeWidth: 1, - pointerEvents: 'none', -})); - -const StyledText = styled('text')(({ theme }) => ({ - stroke: 'none', - fill: theme.palette.text.primary, - shapeRendering: 'crispEdges', -})); - -function DrawingAreaBox() { - const { left, top, width, height } = useDrawingArea(); - return ( - - - - - - ({left},{top}) - - - ({left + width},{top + height}) - - - ); -} -export default function BasicScaleDemo() { - return ( - - - - - ); -} diff --git a/docs/data/charts/components/BasicScaleDemo.tsx.preview b/docs/data/charts/components/BasicScaleDemo.tsx.preview deleted file mode 100644 index d76ce229c788c..0000000000000 --- a/docs/data/charts/components/BasicScaleDemo.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/data/charts/components/HtmlLegend.js b/docs/data/charts/components/HtmlLegend.js deleted file mode 100644 index be780c6459a53..0000000000000 --- a/docs/data/charts/components/HtmlLegend.js +++ /dev/null @@ -1,65 +0,0 @@ -import Box from '@mui/material/Box'; -import { useLegend } from '@mui/x-charts/hooks'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; - -function MyCustomLegend() { - const { items } = useLegend(); - return ( - - - {items.map((item) => { - return ( - - - - - ); - })} - -
-
-
{`${item.label}`}
- ); -} - -const veryLongText = - "Second Series. You should always try to avoid long sentences. But oftentimes, it's not possible. So, we need to handle them gracefully. This is a very long sentence that should be fully readable."; - -export default function HtmlLegend() { - return ( - - - - - - - - - - - ); -} diff --git a/docs/data/charts/components/HtmlLegend.tsx.preview b/docs/data/charts/components/HtmlLegend.tsx.preview deleted file mode 100644 index 5f73ec35867d7..0000000000000 --- a/docs/data/charts/components/HtmlLegend.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/docs/data/charts/components/OriginDemo.js b/docs/data/charts/components/OriginDemo.js deleted file mode 100644 index 6c8a6d82fadc1..0000000000000 --- a/docs/data/charts/components/OriginDemo.js +++ /dev/null @@ -1,77 +0,0 @@ -import * as React from 'react'; -import { styled } from '@mui/material/styles'; - -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { useDrawingArea, useXScale, useYScale } from '@mui/x-charts/hooks'; - -const x = Array.from({ length: 21 }, (_, index) => -1 + 0.2 * index); -const linear = x.map((v) => -1 + v); -const poly = x.map((v) => -1 + v ** 2 - v); - -const StyledPath = styled('path')(({ theme, color }) => ({ - fill: 'none', - stroke: theme.palette.text[color], - shapeRendering: 'crispEdges', - strokeWidth: 1, - pointerEvents: 'none', -})); - -function CartesianAxis() { - // Get the drawing area bounding box - const { left, top, width, height } = useDrawingArea(); - - // Get the two scale - const yAxisScale = useYScale(); - const xAxisScale = useXScale(); - - const yOrigin = yAxisScale(0); - const xOrigin = xAxisScale(0); - - const xTicks = [-2, -1, 1, 2, 3]; - const yTicks = [-2, -1, 1, 2, 3, 4, 5]; - - return ( - - {yTicks.map((value) => ( - - ))} - {xTicks.map((value) => ( - - ))} - - - - ); -} -export default function OriginDemo() { - return ( - - - - - ); -} diff --git a/docs/data/charts/components/ScaleDemo.js b/docs/data/charts/components/ScaleDemo.js deleted file mode 100644 index 4565f45ab9a0c..0000000000000 --- a/docs/data/charts/components/ScaleDemo.js +++ /dev/null @@ -1,133 +0,0 @@ -import * as React from 'react'; - -import { styled } from '@mui/material/styles'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { useDrawingArea, useYScale } from '@mui/x-charts/hooks'; - -const StyledPath = styled('path')(({ theme }) => ({ - fill: 'none', - stroke: theme.palette.text.primary, - shapeRendering: 'crispEdges', - strokeWidth: 1, - pointerEvents: 'none', - strokeDasharray: '5 2', -})); - -const StyledText = styled('text')(({ theme }) => ({ - stroke: 'none', - fill: theme.palette.text.primary, - shapeRendering: 'crispEdges', -})); - -function ValueHighlight(props) { - const { chartRef } = props; - - // Get the drawing area bounding box - const { left, top, width, height } = useDrawingArea(); - - // Get the two scale - const leftAxisScale = useYScale('left_axis_id'); - const rightAxisScale = useYScale('right_axis_id'); - - const [mouseY, setMouseY] = React.useState(null); - - React.useEffect(() => { - const element = chartRef.current; - if (element === null) { - return () => {}; - } - - const handleMouseOut = () => { - setMouseY(null); - }; - - const handleMouseMove = (event) => { - const x = event.offsetX; - const y = event.offsetY; - if (x < left || x > left + width) { - setMouseY(null); - return; - } - if (y < top - 10 || y > top + height + 10) { - // Allows some margin if slightly on top/bottom of the drawing area - setMouseY(null); - return; - } - setMouseY(Math.max(Math.min(top + height, y), top)); // clamp to the drawing area - }; - - element.addEventListener('mouseout', handleMouseOut); - element.addEventListener('mousemove', handleMouseMove); - return () => { - element.removeEventListener('mouseout', handleMouseOut); - element.removeEventListener('mousemove', handleMouseMove); - }; - }, [height, left, top, width, chartRef]); - - if (mouseY === null) { - return null; - } - return ( - - - - {leftAxisScale.invert(mouseY).toFixed(0)} - - - - {rightAxisScale.invert(mouseY).toFixed(0)} - - - ); -} -export default function ScaleDemo() { - const chartRef = React.useRef(null); - return ( - - - - - - - ); -} diff --git a/docs/data/charts/components/SeriesDemo.js b/docs/data/charts/components/SeriesDemo.js deleted file mode 100644 index 1b5e4059228a1..0000000000000 --- a/docs/data/charts/components/SeriesDemo.js +++ /dev/null @@ -1,104 +0,0 @@ -import * as React from 'react'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { useLineSeries, useXAxis, useXScale, useYScale } from '@mui/x-charts/hooks'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; - -function ExtremaLabels() { - const lineSeries = useLineSeries(); - - if (!lineSeries) { - return null; - } - - return ( - - {lineSeries.map((series) => ( - - ))} - - ); -} - -function SingleSeriesExtremaLabels({ series }) { - const xAxis = useXAxis('x'); - - const min = series.data.reduce( - (acc, value, index) => - value != null && value < acc.value ? { index, value } : acc, - { index: -1, value: Infinity }, - ); - const max = series.data.reduce( - (acc, value, index) => - value != null && value > acc.value ? { index, value } : acc, - { index: -1, value: -Infinity }, - ); - - return ( - - - - - ); -} - -function PointLabel({ x, y, placement, color }) { - const xAxisScale = useXScale(); - const yAxisScale = useYScale(); - - const left = xAxisScale(x) ?? 0; - const top = (yAxisScale(y) ?? 0) + (placement === 'below' ? 20 : -20); - - return ( - - {y} - - ); -} - -export default function SeriesDemo() { - return ( - - - - - - - - - - - ); -} diff --git a/docs/data/charts/components/SeriesDemo.tsx.preview b/docs/data/charts/components/SeriesDemo.tsx.preview deleted file mode 100644 index 7bf1f13982e7d..0000000000000 --- a/docs/data/charts/components/SeriesDemo.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/docs/data/charts/components/components.md b/docs/data/charts/components/components.md index b3c3fac0a4486..bb06fed565094 100644 --- a/docs/data/charts/components/components.md +++ b/docs/data/charts/components/components.md @@ -33,7 +33,7 @@ import { useDrawingArea } from '@mui/x-charts'; const { left, top, width, height } = useDrawingArea(); ``` -{{"demo": "BasicScaleDemo.js"}} +{{"component": "file://./demos/basic-scale-demo/index.ts"}} ### Scales @@ -66,7 +66,7 @@ const xAxisScale = useXScale(); const xOrigin = xAxisScale(0); ``` -{{"demo": "OriginDemo.js"}} +{{"component": "file://./demos/origin-demo/index.ts"}} #### Coordinate to value @@ -79,7 +79,7 @@ By using `invert()`, the value associated with the current mouse coordinate `y` {leftAxisScale.invert(yCoordinate).toFixed(0)} ``` -{{"demo": "ScaleDemo.js"}} +{{"component": "file://./demos/scale-demo/index.ts"}} ### Series @@ -89,7 +89,7 @@ These hooks return the order of the series and their configuration, including da You can use that information to create custom charts. For example, you can use `useLineSeries()` to obtain the series of a Line Chart and display an indicator of the minimum and maximum values of each series: -{{"demo": "SeriesDemo.js"}} +{{"component": "file://./demos/series-demo/index.ts"}} ## Custom slot props with TypeScript @@ -207,7 +207,7 @@ This lets you create HTML components that interact with the data. In the next example, notice that the `MyCustomLegend` component displays the series names and colors. This creates an HTML `` element, which can be customized in any way. -{{"demo": "HtmlLegend.js"}} +{{"component": "file://./demos/html-legend/index.ts"}} :::warning Note that the HTML components are not part of the SVG hierarchy. diff --git a/docs/data/charts/components/BasicScaleDemo.tsx b/docs/data/charts/components/demos/basic-scale-demo/BasicScaleDemo.tsx similarity index 97% rename from docs/data/charts/components/BasicScaleDemo.tsx rename to docs/data/charts/components/demos/basic-scale-demo/BasicScaleDemo.tsx index c8e1af7482f00..bfd6ab3f2a2e9 100644 --- a/docs/data/charts/components/BasicScaleDemo.tsx +++ b/docs/data/charts/components/demos/basic-scale-demo/BasicScaleDemo.tsx @@ -48,6 +48,7 @@ function DrawingAreaBox() { } export default function BasicScaleDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/components/demos/basic-scale-demo/client.ts b/docs/data/charts/components/demos/basic-scale-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/components/demos/basic-scale-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/components/demos/basic-scale-demo/index.ts b/docs/data/charts/components/demos/basic-scale-demo/index.ts new file mode 100644 index 0000000000000..e0c18dfda0bbd --- /dev/null +++ b/docs/data/charts/components/demos/basic-scale-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicScaleDemo from './BasicScaleDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicScaleDemo, { ClientProvider }); diff --git a/docs/data/charts/components/HtmlLegend.tsx b/docs/data/charts/components/demos/html-legend/HtmlLegend.tsx similarity index 97% rename from docs/data/charts/components/HtmlLegend.tsx rename to docs/data/charts/components/demos/html-legend/HtmlLegend.tsx index be780c6459a53..ffed29d55776f 100644 --- a/docs/data/charts/components/HtmlLegend.tsx +++ b/docs/data/charts/components/demos/html-legend/HtmlLegend.tsx @@ -46,6 +46,7 @@ const veryLongText = export default function HtmlLegend() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/components/demos/html-legend/client.ts b/docs/data/charts/components/demos/html-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/components/demos/html-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/components/demos/html-legend/index.ts b/docs/data/charts/components/demos/html-legend/index.ts new file mode 100644 index 0000000000000..d77508d8b65a4 --- /dev/null +++ b/docs/data/charts/components/demos/html-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HtmlLegend from './HtmlLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HtmlLegend, { ClientProvider }); diff --git a/docs/data/charts/components/OriginDemo.tsx b/docs/data/charts/components/demos/origin-demo/OriginDemo.tsx similarity index 95% rename from docs/data/charts/components/OriginDemo.tsx rename to docs/data/charts/components/demos/origin-demo/OriginDemo.tsx index bf90ba402a469..d1854ec989b48 100644 --- a/docs/data/charts/components/OriginDemo.tsx +++ b/docs/data/charts/components/demos/origin-demo/OriginDemo.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { styled } from '@mui/material/styles'; -import { ScaleLinear } from '@mui/x-charts-vendor/d3-scale'; +import type { ScaleLinear } from '@mui/x-charts-vendor/d3-scale'; import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; import { LinePlot } from '@mui/x-charts/LineChart'; import { useDrawingArea, useXScale, useYScale } from '@mui/x-charts/hooks'; @@ -56,6 +56,7 @@ function CartesianAxis() { } export default function OriginDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/components/demos/origin-demo/client.ts b/docs/data/charts/components/demos/origin-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/components/demos/origin-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/components/demos/origin-demo/index.ts b/docs/data/charts/components/demos/origin-demo/index.ts new file mode 100644 index 0000000000000..81bef269be69b --- /dev/null +++ b/docs/data/charts/components/demos/origin-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import OriginDemo from './OriginDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, OriginDemo, { ClientProvider }); diff --git a/docs/data/charts/components/ScaleDemo.tsx b/docs/data/charts/components/demos/scale-demo/ScaleDemo.tsx similarity index 97% rename from docs/data/charts/components/ScaleDemo.tsx rename to docs/data/charts/components/demos/scale-demo/ScaleDemo.tsx index 2ebc894cb0949..c63abbbc7304a 100644 --- a/docs/data/charts/components/ScaleDemo.tsx +++ b/docs/data/charts/components/demos/scale-demo/ScaleDemo.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { ScaleLinear } from '@mui/x-charts-vendor/d3-scale'; +import type { ScaleLinear } from '@mui/x-charts-vendor/d3-scale'; import { styled } from '@mui/material/styles'; import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; import { LinePlot } from '@mui/x-charts/LineChart'; @@ -95,6 +95,7 @@ function ValueHighlight(props: { ); } export default function ScaleDemo() { + // @focus-start @padding 1 const chartRef = React.useRef(null); return ( ); + // @focus-end } diff --git a/docs/data/charts/components/demos/scale-demo/client.ts b/docs/data/charts/components/demos/scale-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/components/demos/scale-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/components/demos/scale-demo/index.ts b/docs/data/charts/components/demos/scale-demo/index.ts new file mode 100644 index 0000000000000..462dd56fb73a1 --- /dev/null +++ b/docs/data/charts/components/demos/scale-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScaleDemo from './ScaleDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScaleDemo, { ClientProvider }); diff --git a/docs/data/charts/components/SeriesDemo.tsx b/docs/data/charts/components/demos/series-demo/SeriesDemo.tsx similarity index 95% rename from docs/data/charts/components/SeriesDemo.tsx rename to docs/data/charts/components/demos/series-demo/SeriesDemo.tsx index f97d842f120eb..5766dbf5c53e2 100644 --- a/docs/data/charts/components/SeriesDemo.tsx +++ b/docs/data/charts/components/demos/series-demo/SeriesDemo.tsx @@ -7,7 +7,7 @@ import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; -import { DefaultizedLineSeriesType } from '@mui/x-charts/models'; +import type { DefaultizedLineSeriesType } from '@mui/x-charts/models'; function ExtremaLabels() { const lineSeries = useLineSeries(); @@ -98,6 +98,7 @@ function PointLabel({ export default function SeriesDemo() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/components/demos/series-demo/client.ts b/docs/data/charts/components/demos/series-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/components/demos/series-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/components/demos/series-demo/index.ts b/docs/data/charts/components/demos/series-demo/index.ts new file mode 100644 index 0000000000000..44c664502f64d --- /dev/null +++ b/docs/data/charts/components/demos/series-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SeriesDemo from './SeriesDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SeriesDemo, { ClientProvider }); diff --git a/docs/data/charts/composition/BasicComposition.js b/docs/data/charts/composition/BasicComposition.js deleted file mode 100644 index b71a123ea255f..0000000000000 --- a/docs/data/charts/composition/BasicComposition.js +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from 'react'; -import Paper from '@mui/material/Paper'; -import Box from '@mui/material/Box'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; - -export default function BasicComposition() { - const [isResponsive, setIsResponsive] = React.useState(false); - - const sizingProps = isResponsive ? {} : { width: 500, height: 300 }; - return ( - - setIsResponsive(event.target.checked)} /> - } - label="Use responsive container" - labelPlacement="end" - /> - - - - - - - - - - ); -} diff --git a/docs/data/charts/composition/BellCurveOverlay.js b/docs/data/charts/composition/BellCurveOverlay.js deleted file mode 100644 index bd28a5b7a6754..0000000000000 --- a/docs/data/charts/composition/BellCurveOverlay.js +++ /dev/null @@ -1,137 +0,0 @@ -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { ScatterPlot } from '@mui/x-charts/ScatterChart'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; - -const data = Object.values(internetUsageByCountry); - -function calculateStatistics(values) { - const n = values.length; - const mean = values.reduce((sum, val) => sum + val, 0) / n; - const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / n; - const stdDev = Math.sqrt(variance); - return { mean, stdDev }; -} - -function normalDistribution(x, mean, stdDev) { - const exponent = -Math.pow(x - mean, 2) / (2 * Math.pow(stdDev, 2)); - return (1 / (stdDev * Math.sqrt(2 * Math.PI))) * Math.exp(exponent); -} - -export default function BellCurveOverlay() { - const { mean, stdDev } = calculateStatistics(data); - - // Generate bell curve data - const min = Math.min(...data); - const max = Math.max(...data); - const range = max - min; - const bellCurveData = []; - const xValues = []; - const numPoints = 100; - - for (let i = 0; i <= numPoints; i += 1) { - const x = min - range * 0.1 + ((max - min + range * 0.2) * i) / numPoints; - xValues.push(x); - bellCurveData.push(normalDistribution(x, mean, stdDev)); - } - - // Stack points that are close together - const binWidth = range / 70; // Adjust this to control stacking sensitivity - const sortedData = [...data].sort((a, b) => a - b); - const bins = new Map(); - - // Group values into bins - sortedData.forEach((value) => { - const binIndex = Math.round(value / binWidth); - if (!bins.has(binIndex)) { - bins.set(binIndex, []); - } - bins.get(binIndex).push(value); - }); - - // Create scatter data with stacked y-positions - const scatterData = []; - let globalIndex = 0; - const baseY = 0.0005; - const stackHeight = 0.001; - - bins.forEach((values) => { - values.forEach((value, stackIndex) => { - scatterData.push({ - x: value, - y: baseY + stackIndex * stackHeight, - id: globalIndex, - }); - globalIndex += 1; - }); - }); - - return ( -
- `${value}%`, - }, - ]} - yAxis={[ - { - position: 'none', - }, - ]} - height={400} - > - - - - - - - - -
- ); -} diff --git a/docs/data/charts/composition/Layering.js b/docs/data/charts/composition/Layering.js deleted file mode 100644 index 85d66f79eca0b..0000000000000 --- a/docs/data/charts/composition/Layering.js +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from 'react'; -import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsGrid } from '@mui/x-charts/ChartsGrid'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import { ChartsWrapper } from '@mui/x-charts/ChartsWrapper'; -import { ChartsLayerContainer } from '@mui/x-charts/ChartsLayerContainer'; -import { ChartsSvgLayer } from '@mui/x-charts/ChartsSvgLayer'; -import { ChartsWebGLLayer } from '@mui/x-charts-premium/ChartsWebGLLayer'; -import { CandlestickPlot } from '@mui/x-charts-premium/CandlestickChart'; - -const ohlcData = [ - [100, 110, 95, 105], - [105, 115, 100, 112], - [112, 120, 108, 118], - [118, 125, 115, 120], - [120, 128, 118, 125], - [125, 130, 120, 122], - [122, 128, 118, 126], - [126, 135, 124, 132], - [132, 140, 130, 138], - [138, 145, 135, 135], - [135, 148, 138, 145], - [145, 152, 142, 148], - [148, 155, 145, 150], - [150, 158, 148, 152], - [152, 162, 151, 151], - [151, 165, 151, 157], - [157, 168, 153, 153], - [153, 160, 151, 152], - [152, 155, 150, 154], - [154, 158, 153, 157], -]; - -const xAxisData = ohlcData.map((_, index) => `Day ${index + 1}`); - -export default function Layering() { - return ( - - - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/composition/LegendTooltipComposition.js b/docs/data/charts/composition/LegendTooltipComposition.js deleted file mode 100644 index 4d38e2e026e72..0000000000000 --- a/docs/data/charts/composition/LegendTooltipComposition.js +++ /dev/null @@ -1,52 +0,0 @@ -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import Box from '@mui/material/Box'; - -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function LegendTooltipComposition() { - return ( - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/composition/LimitOverflow.js b/docs/data/charts/composition/LimitOverflow.js deleted file mode 100644 index d52f012c69aaa..0000000000000 --- a/docs/data/charts/composition/LimitOverflow.js +++ /dev/null @@ -1,101 +0,0 @@ -import * as React from 'react'; -import Slider from '@mui/material/Slider'; -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import useId from '@mui/utils/useId'; - -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { ScatterPlot } from '@mui/x-charts/ScatterChart'; -import { LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsGrid } from '@mui/x-charts/ChartsGrid'; - -import { Chance } from 'chance'; - -const chance = new Chance(42); - -const data = Array.from({ length: 100 }, () => ({ - x: chance.floating({ min: -25, max: 25 }), - y: chance.floating({ min: -25, max: 25 }), -})).map((d, index) => ({ ...d, id: index })); - -const minDistance = 10; - -export default function LimitOverflow() { - const [isLimited, setIsLimited] = React.useState(false); - const [xLimits, setXLimites] = React.useState([-20, 20]); - - const id = useId(); - const clipPathId = `${id}-clip-path`; - - const handleChange = (event, newValue, activeThumb) => { - if (!Array.isArray(newValue)) { - return; - } - - if (newValue[1] - newValue[0] < minDistance) { - if (activeThumb === 0) { - const clamped = Math.min(newValue[0], 100 - minDistance); - setXLimites([clamped, clamped + minDistance]); - } else { - const clamped = Math.max(newValue[1], minDistance); - setXLimites([clamped - minDistance, clamped]); - } - } else { - setXLimites(newValue); - } - }; - - return ( - - setIsLimited(event.target.checked)} /> - } - label="Clip the plot" - labelPlacement="end" - /> - - - - - - - - - - {isLimited && } - - - - ); -} diff --git a/docs/data/charts/composition/SwitchSeriesType.js b/docs/data/charts/composition/SwitchSeriesType.js deleted file mode 100644 index d5f2d8ead82ca..0000000000000 --- a/docs/data/charts/composition/SwitchSeriesType.js +++ /dev/null @@ -1,54 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; - -export default function SwitchSeriesType() { - const [type, setType] = React.useState('line'); - - return ( - - setType(event.target.value)} - label="series type" - sx={{ minWidth: 150 }} - > - line - bar - -
- - - - - -
-
- ); -} diff --git a/docs/data/charts/composition/WeatherComposition.js b/docs/data/charts/composition/WeatherComposition.js deleted file mode 100644 index 26f18b8c62ca8..0000000000000 --- a/docs/data/charts/composition/WeatherComposition.js +++ /dev/null @@ -1,297 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { LineHighlightPlot, LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsGrid } from '@mui/x-charts/ChartsGrid'; -import { - ChartsTooltipContainer, - ChartsTooltipPaper, - ChartsTooltipTable, - ChartsTooltipRow, - ChartsTooltipCell, - useAxesTooltip, -} from '@mui/x-charts/ChartsTooltip'; -import { ChartsLabelMark } from '@mui/x-charts/ChartsLabel'; -import { axisClasses } from '@mui/x-charts/ChartsAxis'; - -import { forecast } from '../dataset/weatherForecast'; -import { - DayAndTimeHeader, - WeatherMarkers, - MaxPrecipitationBars, - LegendItem, -} from './weatherCompositionComponents'; - -export default function WeatherComposition() { - const [highlightedAxis, setHighlightedAxis] = React.useState([]); - - const sync = { - highlightedAxis, - onHighlightedAxisChange: setHighlightedAxis, - }; - - return ( - - ({ - width: '100%', - [`& .${axisClasses.tick}, & .${axisClasses.line}`]: { - stroke: theme.palette.divider, - }, - [`& .${axisClasses.tickLabel}`]: { - fill: theme.palette.secondary, - }, - })} - > - - - - - - - - - - - - ); -} - -function ForecastChart(props) { - return ( - - value.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - hour: 'numeric', - }), - }, - ]} - yAxis={[ - { - id: 'temperature', - min: 6, - max: 26, - width: 50, - valueFormatter: (value) => `${value}°`, - }, - { - id: 'precipitation', - label: 'Precipitation (mm)', - position: 'right', - min: 0, - max: 8, - width: 56, - }, - ]} - series={weatherSeries} - height={310} - margin={{ top: 64, right: 24, bottom: 8, left: 36 }} - > - - - - - - - - - - - - - - - - ); -} - -function WindChart(props) { - return ( - - value.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - hour: 'numeric', - }), - }, - ]} - yAxis={[ - { - id: 'wind', - position: 'right', - min: 0, - width: 56, - tickInterval: [0, 4, 8], - }, - ]} - series={windSeries} - height={150} - margin={{ top: 8, right: 24, bottom: 32, left: 86 }} - sx={{ [`& [data-series=gust]`]: { strokeDasharray: '4 4' } }} - > - - - - - - - - - - - ); -} - -function WeatherTooltip({ type }) { - const tooltipData = useAxesTooltip(); - - if ( - !tooltipData || - tooltipData.length === 0 || - (type === 'weather' && - !tooltipData[0].seriesItems.some((item) => item.seriesId === 'temperature')) || - (type === 'wind' && - !tooltipData[0].seriesItems.some((item) => item.seriesId === 'wind')) - ) { - return null; - } - - const { dataIndex, axisFormattedValue } = tooltipData[0]; - const item = forecast[dataIndex]; - - if (!item) { - return null; - } - - const rows = [ - { - label: 'Temperature', - color: colors.temperature, - mark: 'line', - value: `${item.temperature}°C`, - }, - { - label: 'Precipitation', - color: colors.precipitation, - mark: 'square', - value: `${item.precipitation}mm`, - }, - { - label: 'Max precip.', - color: colors.maxPrecipitation, - mark: 'square', - value: `${item.maxPrecipitation}mm`, - }, - { label: 'Wind', color: colors.wind, mark: 'line', value: `${item.wind} m/s` }, - { - label: 'Wind gust', - color: colors.windGust, - mark: 'line', - value: `${item.gust} m/s`, - }, - ]; - - return ( - - - {axisFormattedValue} -
- {rows.map((row) => ( - - - - - {row.label} - - - {row.value} - - ))} - - - - ); -} - -const colors = { - temperature: '#c21807', - precipitation: '#1565c0', - maxPrecipitation: '#64b5f6', - wind: '#7e22ce', - windGust: '#7c4dff', -}; - -const weatherSeries = [ - { - id: 'precipitation', - type: 'bar', - dataKey: 'precipitation', - yAxisId: 'precipitation', - label: 'Precipitation', - color: colors.precipitation, - valueFormatter: (value) => (value !== null ? `${value}mm` : ''), - }, - { - id: 'temperature', - type: 'line', - dataKey: 'temperature', - yAxisId: 'temperature', - label: 'Temperature', - color: colors.temperature, - showMark: false, - curve: 'natural', - valueFormatter: (value) => (value !== null ? `${value}°C` : ''), - }, -]; - -const windSeries = [ - { - id: 'wind', - type: 'line', - dataKey: 'wind', - yAxisId: 'wind', - label: 'Wind', - color: colors.wind, - curve: 'linear', - valueFormatter: (value) => (value !== null ? `${value} m/s` : ''), - }, - { - id: 'gust', - type: 'line', - dataKey: 'gust', - yAxisId: 'wind', - label: 'Wind gust', - color: colors.windGust, - curve: 'linear', - valueFormatter: (value) => (value !== null ? `${value} m/s` : ''), - }, -]; diff --git a/docs/data/charts/composition/composition.md b/docs/data/charts/composition/composition.md index 4191634a68eee..0f241c33a2e9e 100644 --- a/docs/data/charts/composition/composition.md +++ b/docs/data/charts/composition/composition.md @@ -18,7 +18,7 @@ This unlocks visualizations that go beyond the standard chart components, while The forecast below combines bars, lines, axes, a synced tooltip, and custom SVG layers in a single composed chart. -{{"demo": "WeatherComposition.js"}} +{{"component": "file://./demos/weather-composition/index.ts"}} The MUI X Charts components follow an architecture based on context providers: you can pass your series and axes definitions to specialized components that transform the data and make it available to its descendants. These descendants can then be composed. @@ -156,7 +156,7 @@ If the parent's dimensions rely on its content, the responsive chart will not re The demo below lets you switch between a chart with discrete dimensions (`width={500} height={300}`) and one with no dimensions defined, so you see how they differ. -{{"demo": "BasicComposition.js" }} +{{"component": "file://./demos/basic-composition/index.ts"}} ### Properties @@ -227,7 +227,7 @@ You can modify the series `type` property to switch between rendering a line and ``` -{{"demo": "SwitchSeriesType.js" }} +{{"component": "file://./demos/switch-series-type/index.ts"}} ## Subcomponents @@ -264,7 +264,7 @@ Here's how to apply it: The demo below lets you toggle clipping for scatter and line plots. Observe how the line markers extend beyond the clip area, rendering on top of the axes. -{{"demo": "LimitOverflow.js" }} +{{"component": "file://./demos/limit-overflow/index.ts"}} :::warning The demo above generates a unique ID with `useId()`. @@ -321,7 +321,7 @@ See [HTML components](/x/react-charts/components/#html-components) for more info You can add interactive elements such as `ChartsAxisHighlight` and `ChartsTooltip` as illustrated in the demo below. -{{"demo": "LegendTooltipComposition.js" }} +{{"component": "file://./demos/legend-tooltip-composition/index.ts"}} :::info By default, `ChartsContainer` listens to mouse events to keep track of where the mouse is located on the chart. @@ -359,7 +359,7 @@ In the example below, we create three layers: 2. A WebGL layer for rendering with `CandlestickPlot`; 3. An SVG layer that renders the axes and crosshair -{{"demo": "Layering.js"}} +{{"component": "file://./demos/layering/index.ts"}} Since all layers are absolutely positioned, they stack on top of each other in the order they are defined. @@ -370,4 +370,4 @@ Since all layers are absolutely positioned, they stack on top of each other in t This example demonstrates how to combine scatter and line plots to overlay a normal distribution curve (known as a bell curve) over scattered data points. The bell curve is calculated based on the mean and standard deviation of the data. -{{"demo": "BellCurveOverlay.js" }} +{{"component": "file://./demos/bell-curve-overlay/index.ts"}} diff --git a/docs/data/charts/composition/BasicComposition.tsx b/docs/data/charts/composition/demos/basic-composition/BasicComposition.tsx similarity index 97% rename from docs/data/charts/composition/BasicComposition.tsx rename to docs/data/charts/composition/demos/basic-composition/BasicComposition.tsx index b71a123ea255f..044fa5e36cfee 100644 --- a/docs/data/charts/composition/BasicComposition.tsx +++ b/docs/data/charts/composition/demos/basic-composition/BasicComposition.tsx @@ -9,6 +9,7 @@ import { LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; export default function BasicComposition() { + // @focus-start @padding 1 const [isResponsive, setIsResponsive] = React.useState(false); const sizingProps = isResponsive ? {} : { width: 500, height: 300 }; @@ -53,4 +54,5 @@ export default function BasicComposition() { ); + // @focus-end } diff --git a/docs/data/charts/composition/demos/basic-composition/client.ts b/docs/data/charts/composition/demos/basic-composition/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/composition/demos/basic-composition/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/composition/demos/basic-composition/index.ts b/docs/data/charts/composition/demos/basic-composition/index.ts new file mode 100644 index 0000000000000..227438942e91f --- /dev/null +++ b/docs/data/charts/composition/demos/basic-composition/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicComposition from './BasicComposition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicComposition, { ClientProvider }); diff --git a/docs/data/charts/composition/BellCurveOverlay.tsx b/docs/data/charts/composition/demos/bell-curve-overlay/BellCurveOverlay.tsx similarity index 96% rename from docs/data/charts/composition/BellCurveOverlay.tsx rename to docs/data/charts/composition/demos/bell-curve-overlay/BellCurveOverlay.tsx index 2f82259e86cbb..79f84c7b02011 100644 --- a/docs/data/charts/composition/BellCurveOverlay.tsx +++ b/docs/data/charts/composition/demos/bell-curve-overlay/BellCurveOverlay.tsx @@ -4,7 +4,7 @@ import { LinePlot } from '@mui/x-charts/LineChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; +import { internetUsageByCountry } from '../../../dataset/internetUsageByCountry'; const data = Object.values(internetUsageByCountry); @@ -22,6 +22,7 @@ function normalDistribution(x: number, mean: number, stdDev: number) { } export default function BellCurveOverlay() { + // @focus-start @padding 1 const { mean, stdDev } = calculateStatistics(data); // Generate bell curve data @@ -134,4 +135,5 @@ export default function BellCurveOverlay() { ); + // @focus-end } diff --git a/docs/data/charts/composition/demos/bell-curve-overlay/client.ts b/docs/data/charts/composition/demos/bell-curve-overlay/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/composition/demos/bell-curve-overlay/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/composition/demos/bell-curve-overlay/index.ts b/docs/data/charts/composition/demos/bell-curve-overlay/index.ts new file mode 100644 index 0000000000000..7d2a7144d4218 --- /dev/null +++ b/docs/data/charts/composition/demos/bell-curve-overlay/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BellCurveOverlay from './BellCurveOverlay'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BellCurveOverlay, { ClientProvider }); diff --git a/docs/data/charts/composition/Layering.tsx b/docs/data/charts/composition/demos/layering/Layering.tsx similarity index 95% rename from docs/data/charts/composition/Layering.tsx rename to docs/data/charts/composition/demos/layering/Layering.tsx index 70bbf92be9aad..d8fd5a12b5d64 100644 --- a/docs/data/charts/composition/Layering.tsx +++ b/docs/data/charts/composition/demos/layering/Layering.tsx @@ -10,7 +10,7 @@ import { ChartsLayerContainer } from '@mui/x-charts/ChartsLayerContainer'; import { ChartsSvgLayer } from '@mui/x-charts/ChartsSvgLayer'; import { ChartsWebGLLayer } from '@mui/x-charts-premium/ChartsWebGLLayer'; import { CandlestickPlot as CandlestickPlot } from '@mui/x-charts-premium/CandlestickChart'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; const ohlcData: OHLCValueType[] = [ [100, 110, 95, 105], @@ -39,6 +39,7 @@ const xAxisData = ohlcData.map((_, index) => `Day ${index + 1}`); export default function Layering() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/composition/demos/layering/client.ts b/docs/data/charts/composition/demos/layering/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/composition/demos/layering/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/composition/demos/layering/index.ts b/docs/data/charts/composition/demos/layering/index.ts new file mode 100644 index 0000000000000..be6b417b59c3c --- /dev/null +++ b/docs/data/charts/composition/demos/layering/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import Layering from './Layering'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, Layering, { ClientProvider }); diff --git a/docs/data/charts/composition/LegendTooltipComposition.tsx b/docs/data/charts/composition/demos/legend-tooltip-composition/LegendTooltipComposition.tsx similarity index 96% rename from docs/data/charts/composition/LegendTooltipComposition.tsx rename to docs/data/charts/composition/demos/legend-tooltip-composition/LegendTooltipComposition.tsx index 4d38e2e026e72..4b60db821aa68 100644 --- a/docs/data/charts/composition/LegendTooltipComposition.tsx +++ b/docs/data/charts/composition/demos/legend-tooltip-composition/LegendTooltipComposition.tsx @@ -30,6 +30,7 @@ export default function LegendTooltipComposition() { alignItems: 'center', }} > + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/composition/demos/legend-tooltip-composition/client.ts b/docs/data/charts/composition/demos/legend-tooltip-composition/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/composition/demos/legend-tooltip-composition/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/composition/demos/legend-tooltip-composition/index.ts b/docs/data/charts/composition/demos/legend-tooltip-composition/index.ts new file mode 100644 index 0000000000000..e2d2b7cfe084c --- /dev/null +++ b/docs/data/charts/composition/demos/legend-tooltip-composition/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendTooltipComposition from './LegendTooltipComposition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendTooltipComposition, { ClientProvider }); diff --git a/docs/data/charts/composition/LimitOverflow.tsx b/docs/data/charts/composition/demos/limit-overflow/LimitOverflow.tsx similarity index 98% rename from docs/data/charts/composition/LimitOverflow.tsx rename to docs/data/charts/composition/demos/limit-overflow/LimitOverflow.tsx index bb8f03bdf2e33..8e922f2101a9c 100644 --- a/docs/data/charts/composition/LimitOverflow.tsx +++ b/docs/data/charts/composition/demos/limit-overflow/LimitOverflow.tsx @@ -25,6 +25,7 @@ const data = Array.from({ length: 100 }, () => ({ const minDistance = 10; export default function LimitOverflow() { + // @focus-start @padding 1 const [isLimited, setIsLimited] = React.useState(false); const [xLimits, setXLimites] = React.useState([-20, 20]); @@ -102,4 +103,5 @@ export default function LimitOverflow() { /> ); + // @focus-end } diff --git a/docs/data/charts/composition/demos/limit-overflow/client.ts b/docs/data/charts/composition/demos/limit-overflow/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/composition/demos/limit-overflow/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/composition/demos/limit-overflow/index.ts b/docs/data/charts/composition/demos/limit-overflow/index.ts new file mode 100644 index 0000000000000..a716a80c97af2 --- /dev/null +++ b/docs/data/charts/composition/demos/limit-overflow/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LimitOverflow from './LimitOverflow'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LimitOverflow, { ClientProvider }); diff --git a/docs/data/charts/composition/SwitchSeriesType.tsx b/docs/data/charts/composition/demos/switch-series-type/SwitchSeriesType.tsx similarity index 97% rename from docs/data/charts/composition/SwitchSeriesType.tsx rename to docs/data/charts/composition/demos/switch-series-type/SwitchSeriesType.tsx index 0ba03f1c8387f..69402e3ee9f3b 100644 --- a/docs/data/charts/composition/SwitchSeriesType.tsx +++ b/docs/data/charts/composition/demos/switch-series-type/SwitchSeriesType.tsx @@ -8,6 +8,7 @@ import { LinePlot } from '@mui/x-charts/LineChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; export default function SwitchSeriesType() { + // @focus-start @padding 1 const [type, setType] = React.useState<'line' | 'bar'>('line'); return ( @@ -51,4 +52,5 @@ export default function SwitchSeriesType() { ); + // @focus-end } diff --git a/docs/data/charts/composition/demos/switch-series-type/client.ts b/docs/data/charts/composition/demos/switch-series-type/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/composition/demos/switch-series-type/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/composition/demos/switch-series-type/index.ts b/docs/data/charts/composition/demos/switch-series-type/index.ts new file mode 100644 index 0000000000000..217302b80acb6 --- /dev/null +++ b/docs/data/charts/composition/demos/switch-series-type/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SwitchSeriesType from './SwitchSeriesType'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SwitchSeriesType, { ClientProvider }); diff --git a/docs/data/charts/composition/WeatherComposition.tsx b/docs/data/charts/composition/demos/weather-composition/WeatherComposition.tsx similarity index 97% rename from docs/data/charts/composition/WeatherComposition.tsx rename to docs/data/charts/composition/demos/weather-composition/WeatherComposition.tsx index d8ddfd43d936d..39548a272dac7 100644 --- a/docs/data/charts/composition/WeatherComposition.tsx +++ b/docs/data/charts/composition/demos/weather-composition/WeatherComposition.tsx @@ -18,16 +18,17 @@ import { } from '@mui/x-charts/ChartsTooltip'; import { ChartsLabelMark } from '@mui/x-charts/ChartsLabel'; import { axisClasses } from '@mui/x-charts/ChartsAxis'; -import { AxisItemIdentifier } from '@mui/x-charts/models'; -import { forecast } from '../dataset/weatherForecast'; +import type { AxisItemIdentifier } from '@mui/x-charts/models'; +import { forecast } from '../../../dataset/weatherForecast'; import { DayAndTimeHeader, WeatherMarkers, MaxPrecipitationBars, LegendItem, -} from './weatherCompositionComponents'; +} from '../../weatherCompositionComponents'; export default function WeatherComposition() { + // @focus-start @padding 1 const [highlightedAxis, setHighlightedAxis] = React.useState( [], ); @@ -67,6 +68,7 @@ export default function WeatherComposition() { ); + // @focus-end } type AxisSyncProps = { diff --git a/docs/data/charts/composition/demos/weather-composition/client.ts b/docs/data/charts/composition/demos/weather-composition/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/composition/demos/weather-composition/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/composition/demos/weather-composition/index.ts b/docs/data/charts/composition/demos/weather-composition/index.ts new file mode 100644 index 0000000000000..5a2baca97e950 --- /dev/null +++ b/docs/data/charts/composition/demos/weather-composition/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import WeatherComposition from './WeatherComposition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, WeatherComposition, { ClientProvider }); diff --git a/docs/data/charts/composition/weatherCompositionComponents.tsx b/docs/data/charts/composition/weatherCompositionComponents.tsx index ba5346233d5b1..39fc3c36a6737 100644 --- a/docs/data/charts/composition/weatherCompositionComponents.tsx +++ b/docs/data/charts/composition/weatherCompositionComponents.tsx @@ -4,7 +4,8 @@ import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import { useDrawingArea, useXScale, useYScale } from '@mui/x-charts/hooks'; -import { forecast, type IconType } from '../dataset/weatherForecast'; +import { forecast } from '../dataset/weatherForecast'; +import type { IconType } from '../dataset/weatherForecast'; export function WeatherIcon({ type }: { type: IconType }) { const isRain = type === 'rain'; diff --git a/docs/data/charts/data-grid-integration/data-grid-integration.md b/docs/data/charts/data-grid-integration/data-grid-integration.md index 910c8df11bbfc..d707fbb0b49f6 100644 --- a/docs/data/charts/data-grid-integration/data-grid-integration.md +++ b/docs/data/charts/data-grid-integration/data-grid-integration.md @@ -14,4 +14,4 @@ Check [Data Grid - Charts integration](/x/react-data-grid/charts-integration/) f The demo below shows how to implement all of the elements mentioned above: -{{"demo": "../../data-grid/charts-integration/GridChartsIntegrationBasic.js", "bg": "inline"}} +{{"component": "file://../../data-grid/charts-integration/demos/grid-charts-integration-basic/index.ts", "bg": "inline"}} diff --git a/docs/data/charts/dataset/AxisValueGetter.js b/docs/data/charts/dataset/AxisValueGetter.js deleted file mode 100644 index 3d0f0a2214fff..0000000000000 --- a/docs/data/charts/dataset/AxisValueGetter.js +++ /dev/null @@ -1,28 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; - -const dataset = [ - { date: '2025-01-15T10:30:00Z', value: 42 }, - { date: '2025-02-20T14:00:00Z', value: 55 }, - { date: '2025-03-10T08:45:00Z', value: 38 }, - { date: '2025-04-05T16:20:00Z', value: 67 }, - { date: '2025-05-18T11:00:00Z', value: 73 }, - { date: '2025-06-22T09:15:00Z', value: 89 }, -]; - -export default function AxisValueGetter() { - return ( - new Date(item.date), - valueFormatter: (value) => - value.toLocaleDateString('en-US', { month: 'short', year: 'numeric' }), - }, - ]} - series={[{ dataKey: 'value', label: 'Readings' }]} - height={300} - /> - ); -} diff --git a/docs/data/charts/dataset/AxisValueGetter.tsx.preview b/docs/data/charts/dataset/AxisValueGetter.tsx.preview deleted file mode 100644 index 5e8ff11e7eddc..0000000000000 --- a/docs/data/charts/dataset/AxisValueGetter.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - new Date(item.date as string), - valueFormatter: (value: Date) => - value.toLocaleDateString('en-US', { month: 'short', year: 'numeric' }), - }, - ]} - series={[{ dataKey: 'value', label: 'Readings' }]} - height={300} -/> \ No newline at end of file diff --git a/docs/data/charts/dataset/DatasetBasic.js b/docs/data/charts/dataset/DatasetBasic.js deleted file mode 100644 index 3bafb1e29d66a..0000000000000 --- a/docs/data/charts/dataset/DatasetBasic.js +++ /dev/null @@ -1,30 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -const dataset = [ - { month: 'Jan', london: 59, paris: 57 }, - { month: 'Feb', london: 50, paris: 52 }, - { month: 'Mar', london: 47, paris: 53 }, - { month: 'Apr', london: 54, paris: 56 }, - { month: 'May', london: 57, paris: 69 }, - { month: 'June', london: 60, paris: 63 }, - { month: 'July', london: 59, paris: 60 }, - { month: 'Aug', london: 65, paris: 60 }, - { month: 'Sept', london: 51, paris: 51 }, - { month: 'Oct', london: 60, paris: 65 }, - { month: 'Nov', london: 67, paris: 64 }, - { month: 'Dec', london: 61, paris: 70 }, -]; - -export default function DatasetBasic() { - return ( - - ); -} diff --git a/docs/data/charts/dataset/DatasetBasic.tsx.preview b/docs/data/charts/dataset/DatasetBasic.tsx.preview deleted file mode 100644 index f4b0ab7f89371..0000000000000 --- a/docs/data/charts/dataset/DatasetBasic.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/dataset/SeriesValueGetter.js b/docs/data/charts/dataset/SeriesValueGetter.js deleted file mode 100644 index 5676661b7ce1c..0000000000000 --- a/docs/data/charts/dataset/SeriesValueGetter.js +++ /dev/null @@ -1,37 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -const dataset = [ - { product: 'Widget A', revenue: '1250.50', cost: '800.25' }, - { product: 'Widget B', revenue: '3200.00', cost: '1500.75' }, - { product: 'Widget C', revenue: '890.75', cost: '450.00' }, - { product: 'Widget D', revenue: '2100.30', cost: '1100.50' }, - { product: 'Widget E', revenue: '1750.00', cost: '900.00' }, -]; - -export default function SeriesValueGetter() { - return ( - parseFloat(item.revenue), - valueFormatter: (v) => (v == null ? '' : `$${v.toFixed(2)}`), - }, - { - label: 'Cost', - valueGetter: (item) => parseFloat(item.cost), - valueFormatter: (v) => (v == null ? '' : `$${v.toFixed(2)}`), - }, - { - label: 'Profit', - valueGetter: (item) => parseFloat(item.revenue) - parseFloat(item.cost), - valueFormatter: (v) => (v == null ? '' : `$${v.toFixed(2)}`), - }, - ]} - yAxis={[{ label: 'Amount ($)', width: 60 }]} - height={300} - /> - ); -} diff --git a/docs/data/charts/dataset/countryData.ts b/docs/data/charts/dataset/countryData.ts index ffdaa158c2985..86c3dde8482cb 100644 --- a/docs/data/charts/dataset/countryData.ts +++ b/docs/data/charts/dataset/countryData.ts @@ -1,5 +1,5 @@ -import { ExtendedFeatureCollection } from '@mui/x-charts-premium/Map'; -import { ExtendedFeature } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-premium/Map'; +import type { ExtendedFeature } from '@mui/x-charts-vendor/d3-geo'; export const continents = [ 'Europe', diff --git a/docs/data/charts/dataset/dataset.md b/docs/data/charts/dataset/dataset.md index 11e771d8163f4..f601c860f3da3 100644 --- a/docs/data/charts/dataset/dataset.md +++ b/docs/data/charts/dataset/dataset.md @@ -19,7 +19,7 @@ You can reference individual properties by using This is a convenient alternative to providing `data` directly on each series or axis. It simplifies configuration when multiple series share the same underlying data source, but has no performance impact. -{{"demo": "DatasetBasic.js"}} +{{"component": "file://./demos/dataset-basic/index.ts"}} ## Value getter @@ -44,7 +44,7 @@ xAxis={[ ]} ``` -{{"demo": "AxisValueGetter.js"}} +{{"component": "file://./demos/axis-value-getter/index.ts"}} ### Series value getter @@ -60,7 +60,7 @@ series={[ ]} ``` -{{"demo": "SeriesValueGetter.js"}} +{{"component": "file://./demos/series-value-getter/index.ts"}} ## Multi fields series diff --git a/docs/data/charts/dataset/AxisValueGetter.tsx b/docs/data/charts/dataset/demos/axis-value-getter/AxisValueGetter.tsx similarity index 94% rename from docs/data/charts/dataset/AxisValueGetter.tsx rename to docs/data/charts/dataset/demos/axis-value-getter/AxisValueGetter.tsx index 6338bc1866aa6..0b7577c33bc4b 100644 --- a/docs/data/charts/dataset/AxisValueGetter.tsx +++ b/docs/data/charts/dataset/demos/axis-value-getter/AxisValueGetter.tsx @@ -11,6 +11,7 @@ const dataset = [ export default function AxisValueGetter() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/dataset/demos/axis-value-getter/client.ts b/docs/data/charts/dataset/demos/axis-value-getter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/dataset/demos/axis-value-getter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/dataset/demos/axis-value-getter/index.ts b/docs/data/charts/dataset/demos/axis-value-getter/index.ts new file mode 100644 index 0000000000000..c6dcc65ff79c0 --- /dev/null +++ b/docs/data/charts/dataset/demos/axis-value-getter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisValueGetter from './AxisValueGetter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisValueGetter, { ClientProvider }); diff --git a/docs/data/charts/dataset/DatasetBasic.tsx b/docs/data/charts/dataset/demos/dataset-basic/DatasetBasic.tsx similarity index 94% rename from docs/data/charts/dataset/DatasetBasic.tsx rename to docs/data/charts/dataset/demos/dataset-basic/DatasetBasic.tsx index 3bafb1e29d66a..5ca94fd801c92 100644 --- a/docs/data/charts/dataset/DatasetBasic.tsx +++ b/docs/data/charts/dataset/demos/dataset-basic/DatasetBasic.tsx @@ -17,6 +17,7 @@ const dataset = [ export default function DatasetBasic() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/dataset/demos/dataset-basic/client.ts b/docs/data/charts/dataset/demos/dataset-basic/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/dataset/demos/dataset-basic/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/dataset/demos/dataset-basic/index.ts b/docs/data/charts/dataset/demos/dataset-basic/index.ts new file mode 100644 index 0000000000000..446a55cfb9de9 --- /dev/null +++ b/docs/data/charts/dataset/demos/dataset-basic/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DatasetBasic from './DatasetBasic'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DatasetBasic, { ClientProvider }); diff --git a/docs/data/charts/dataset/SeriesValueGetter.tsx b/docs/data/charts/dataset/demos/series-value-getter/SeriesValueGetter.tsx similarity index 96% rename from docs/data/charts/dataset/SeriesValueGetter.tsx rename to docs/data/charts/dataset/demos/series-value-getter/SeriesValueGetter.tsx index 7605c0594ccca..09fc50f69acb7 100644 --- a/docs/data/charts/dataset/SeriesValueGetter.tsx +++ b/docs/data/charts/dataset/demos/series-value-getter/SeriesValueGetter.tsx @@ -10,6 +10,7 @@ const dataset = [ export default function SeriesValueGetter() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/dataset/demos/series-value-getter/client.ts b/docs/data/charts/dataset/demos/series-value-getter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/dataset/demos/series-value-getter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/dataset/demos/series-value-getter/index.ts b/docs/data/charts/dataset/demos/series-value-getter/index.ts new file mode 100644 index 0000000000000..9dacab41282a7 --- /dev/null +++ b/docs/data/charts/dataset/demos/series-value-getter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SeriesValueGetter from './SeriesValueGetter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SeriesValueGetter, { ClientProvider }); diff --git a/docs/data/charts/dataset/temperatureBerlinPorto.tsx b/docs/data/charts/dataset/temperatureBerlinPorto.tsx index 8c21dea71cc16..88572bc7ec854 100644 --- a/docs/data/charts/dataset/temperatureBerlinPorto.tsx +++ b/docs/data/charts/dataset/temperatureBerlinPorto.tsx @@ -1,4 +1,4 @@ -import { RangeBarValueType } from '@mui/x-charts-premium/models'; +import type { RangeBarValueType } from '@mui/x-charts-premium/models'; export const months = [ 'January', diff --git a/docs/data/charts/dataset/usUnemploymentRate.ts b/docs/data/charts/dataset/usUnemploymentRate.ts index 3a9b5bd40a890..7df978449f1ee 100644 --- a/docs/data/charts/dataset/usUnemploymentRate.ts +++ b/docs/data/charts/dataset/usUnemploymentRate.ts @@ -3,7 +3,7 @@ * Updated: Jun 6, 2025 7:46 AM CDT */ -import { AxisValueFormatterContext } from '@mui/x-charts/models'; +import type { AxisValueFormatterContext } from '@mui/x-charts/models'; export const dateAxisFormatter = (value: Date, context: AxisValueFormatterContext<'time'>) => value.toLocaleDateString(undefined, { diff --git a/docs/data/charts/export/ExportChartAsExcel.js b/docs/data/charts/export/ExportChartAsExcel.js deleted file mode 100644 index 8457b22eeb01d..0000000000000 --- a/docs/data/charts/export/ExportChartAsExcel.js +++ /dev/null @@ -1,45 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { ChartsWrapper } from '@mui/x-charts/ChartsWrapper'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; -import { ChartsToolbarPremium } from '@mui/x-charts-premium/ChartsToolbarPremium'; -import { BAR_CHART_PREMIUM_PLUGINS } from '@mui/x-charts-premium/BarChartPremium'; - -import { useChartPremiumExport } from '@mui/x-charts-premium/plugins'; - -// Defined outside the component: plugins contain hooks, so their order must not change. -const plugins = [...BAR_CHART_PREMIUM_PLUGINS, useChartPremiumExport]; - -const settings = { - height: 300, - xAxis: [{ data: ['Q1', 'Q2', 'Q3', 'Q4'], scaleType: 'band' }], - series: [ - { type: 'bar', label: 'Revenue', data: [42, 51, 48, 63] }, - { type: 'bar', label: 'Costs', data: [30, 34, 33, 39] }, - ], -}; - -export default function ExportChartAsExcel() { - return ( - - - Open the export menu and pick Export as Excel - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/export/ExportChartAsExcel.tsx.preview b/docs/data/charts/export/ExportChartAsExcel.tsx.preview deleted file mode 100644 index efee5c8e7b686..0000000000000 --- a/docs/data/charts/export/ExportChartAsExcel.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - - Open the export menu and pick Export as Excel - - {...settings} plugins={plugins}> - - - - - - - - - \ No newline at end of file diff --git a/docs/data/charts/export/ExportChartAsImage.js b/docs/data/charts/export/ExportChartAsImage.js deleted file mode 100644 index 44fed43ce00ca..0000000000000 --- a/docs/data/charts/export/ExportChartAsImage.js +++ /dev/null @@ -1,95 +0,0 @@ -import * as React from 'react'; -import Button from '@mui/material/Button'; -import FormControl from '@mui/material/FormControl'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import FormLabel from '@mui/material/FormLabel'; -import Radio from '@mui/material/Radio'; -import RadioGroup from '@mui/material/RadioGroup'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { useChartProApiRef } from '@mui/x-charts-pro/hooks'; - -function ExportParamsSelector({ apiRef }) { - const [type, setType] = React.useState('image/png'); - const [rawQuality, setRawQuality] = React.useState('0.9'); - const quality = Math.max(0, Math.min(1, Number.parseFloat(rawQuality))); - - return ( - - - - Image Format - - setType(event.target.value)} - > - } - label="image/png" - /> - } - label="image/jpeg" - /> - } - label="image/webp" - /> - - - - setRawQuality(event.target.value)} - disabled={type === 'image/png'} - helperText="Only applicable to lossy formats." - /> - -
- -
-
- ); -} - -export default function ExportChartAsImage() { - const apiRef = useChartProApiRef(); - - return ( - - - - - ); -} diff --git a/docs/data/charts/export/ExportChartAsImage.tsx.preview b/docs/data/charts/export/ExportChartAsImage.tsx.preview deleted file mode 100644 index 9fe33fa391417..0000000000000 --- a/docs/data/charts/export/ExportChartAsImage.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/export/ExportChartHideOnExport.js b/docs/data/charts/export/ExportChartHideOnExport.js deleted file mode 100644 index 2a67413e4050c..0000000000000 --- a/docs/data/charts/export/ExportChartHideOnExport.js +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from 'react'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; - -export default function ExportChartHideOnExport() { - return ( - - ); -} diff --git a/docs/data/charts/export/ExportChartOnBeforeExport.js b/docs/data/charts/export/ExportChartOnBeforeExport.js deleted file mode 100644 index 07482a5e40205..0000000000000 --- a/docs/data/charts/export/ExportChartOnBeforeExport.js +++ /dev/null @@ -1,123 +0,0 @@ -import * as React from 'react'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import Typography from '@mui/material/Typography'; -import Stack from '@mui/material/Stack'; -import { defaultOnBeforeExport } from '@mui/x-charts-pro/models'; -import { inflationData } from '../dataset/inflationRates'; - -const yAxisFormatter = new Intl.NumberFormat('en-US', { - style: 'percent', - minimumFractionDigits: 0, - maximumFractionDigits: 0, - maximumSignificantDigits: 1, -}); -const percentageFormatter = new Intl.NumberFormat('en-US', { - style: 'percent', - minimumFractionDigits: 2, - maximumFractionDigits: 2, -}); -const seriesValueFormatter = (value) => percentageFormatter.format(value / 100); - -const xAxis = [ - { - data: inflationData.map((p) => p.year), - valueFormatter: (value) => `${value}`, - zoom: true, - }, -]; - -const yAxis = [{ valueFormatter: (value) => yAxisFormatter.format(value / 100) }]; - -const series = [ - { - label: 'Germany', - data: inflationData.map((p) => p.rateDE), - valueFormatter: seriesValueFormatter, - }, - { - label: 'United Kingdom', - data: inflationData.map((p) => p.rateUK), - valueFormatter: seriesValueFormatter, - }, - { - label: 'France', - data: inflationData.map((p) => p.rateFR), - valueFormatter: seriesValueFormatter, - }, -]; - -const settings = { - height: 300, - xAxis, - yAxis, - series, - grid: { horizontal: true }, -}; - -function createOnBeforeExport(titleRef, captionRef) { - return function onBeforeExport(iframe) { - // Apply default modification (removing the toolbar) - defaultOnBeforeExport(iframe); - const document = iframe.contentDocument; - const chart = document.body.firstElementChild; - - // Create a vertical stack to hold the title, chart and caption - const stack = document.createElement('div'); - - stack.style.display = 'flex'; - stack.style.flexDirection = 'column'; - stack.style.width = 'fit-content'; - stack.style.margin = 'auto'; - - document.body.appendChild(stack); - - // Add title to stack - const title = titleRef.current; - if (title) { - const titleClone = title.cloneNode(true); - stack.appendChild(titleClone); - } - - // Move chart to stack (after title) - document.body.removeChild(chart); - stack.appendChild(chart); - - // Add caption to stack - const caption = captionRef.current; - if (caption) { - const captionClone = caption.cloneNode(true); - captionClone.style.alignSelf = 'start'; - stack.appendChild(captionClone); - } - }; -} - -export default function ExportChartOnBeforeExport() { - const titleRef = React.useRef(null); - const captionRef = React.useRef(null); - const onBeforeExport = React.useMemo( - () => createOnBeforeExport(titleRef, captionRef), - [], - ); - - return ( - - - Inflation rate in France, Germany and the UK, 1960-2024 - - - - Source: World Bank - - - ); -} diff --git a/docs/data/charts/export/ExportChartOnBeforeExport.tsx.preview b/docs/data/charts/export/ExportChartOnBeforeExport.tsx.preview deleted file mode 100644 index fa64b4ea1c3b8..0000000000000 --- a/docs/data/charts/export/ExportChartOnBeforeExport.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - - Inflation rate in France, Germany and the UK, 1960-2024 - - - - Source: World Bank - \ No newline at end of file diff --git a/docs/data/charts/export/ExportChartToolbar.js b/docs/data/charts/export/ExportChartToolbar.js deleted file mode 100644 index 0ea0ba530dbae..0000000000000 --- a/docs/data/charts/export/ExportChartToolbar.js +++ /dev/null @@ -1,65 +0,0 @@ -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import Typography from '@mui/material/Typography'; -import Stack from '@mui/material/Stack'; -import { inflationData } from '../dataset/inflationRates'; - -const yAxisFormatter = new Intl.NumberFormat('en-US', { - style: 'percent', - minimumFractionDigits: 0, - maximumFractionDigits: 0, - maximumSignificantDigits: 1, -}); -const percentageFormatter = new Intl.NumberFormat('en-US', { - style: 'percent', - minimumFractionDigits: 2, - maximumFractionDigits: 2, -}); -const seriesValueFormatter = (value) => percentageFormatter.format(value / 100); - -const xAxis = [ - { - data: inflationData.map((p) => p.year), - valueFormatter: (value) => `${value}`, - zoom: true, - }, -]; - -const yAxis = [{ valueFormatter: (value) => yAxisFormatter.format(value / 100) }]; - -const series = [ - { - label: 'Germany', - data: inflationData.map((p) => p.rateDE), - valueFormatter: seriesValueFormatter, - }, - { - label: 'United Kingdom', - data: inflationData.map((p) => p.rateUK), - valueFormatter: seriesValueFormatter, - }, - { - label: 'France', - data: inflationData.map((p) => p.rateFR), - valueFormatter: seriesValueFormatter, - }, -]; - -const settings = { - height: 300, - xAxis, - yAxis, - series, - grid: { horizontal: true }, -}; - -export default function ExportChartToolbar() { - return ( - - - Inflation rate in France, Germany and the UK, 1960-2024 - - - Source: World Bank - - ); -} diff --git a/docs/data/charts/export/ExportChartToolbar.tsx.preview b/docs/data/charts/export/ExportChartToolbar.tsx.preview deleted file mode 100644 index 03a4fdeea6c45..0000000000000 --- a/docs/data/charts/export/ExportChartToolbar.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - - Inflation rate in France, Germany and the UK, 1960-2024 - - -Source: World Bank \ No newline at end of file diff --git a/docs/data/charts/export/ExportChartToolbarCustomization.js b/docs/data/charts/export/ExportChartToolbarCustomization.js deleted file mode 100644 index bcaea8e3bbfec..0000000000000 --- a/docs/data/charts/export/ExportChartToolbarCustomization.js +++ /dev/null @@ -1,139 +0,0 @@ -import * as React from 'react'; - -import Typography from '@mui/material/Typography'; -import Stack from '@mui/material/Stack'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; - -import { continents, countryData } from '../dataset/countryData'; -import { populationGdpPerCapitaData } from './populationGdpPerCapitaData'; -import ExportOptionSelector from './ExportOptionSelector'; - -const populationFormatter = new Intl.NumberFormat('en-US', { - notation: 'compact', -}); -const gdpPerCapitaFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - notation: 'compact', -}); - -const series = continents.map((continent) => ({ - label: continent, - data: populationGdpPerCapitaData[continent].map((p) => ({ - x: p.population, - y: p.gdpPerCapita, - id: countryData[p.code].country, - })), - valueFormatter: (value) => - `${value.id}: ${populationFormatter.format(value.x)} people, ${gdpPerCapitaFormatter.format(value.y)} GDP per capita`, - highlightScope: { - highlight: 'item', - fade: 'global', - }, -})); - -const fileName = 'Population_vs_GDP_Per_Capita_USD_2019'; - -export default function ExportChartToolbarCustomization() { - const apiRef = React.useRef(undefined); - const [formats, setFormats] = React.useState({ - print: true, - 'image/png': true, - 'image/jpeg': false, - 'image/webp': false, - }); - - const imageExportOptions = Object.entries(formats) - .filter(([key, value]) => key.startsWith('image/') && value) - .map(([key]) => ({ type: key, fileName })); - - const handleChange = (event) => { - setFormats((prev) => ({ - ...prev, - [event.target.name]: event.target.checked, - })); - }; - - return ( - - - Population vs GDP Per Capita (USD), 2019 - - { - if (context.location === 'tick' && context.defaultTickLabel === '') { - return ''; - } - return populationFormatter.format(value); - }, - zoom: true, - label: 'Population', - }, - ]} - series={series} - yAxis={[ - { - scaleType: 'log', - valueFormatter: (value) => gdpPerCapitaFormatter.format(value), - label: 'GDP per Capita', - }, - ]} - showToolbar - grid={{ horizontal: true }} - slotProps={{ - toolbar: { - printOptions: { disableToolbarButton: !formats.print, fileName }, - imageExportOptions, - }, - }} - /> - - Source: World Bank - - - - - `{ ${Object.entries(option) - .map(([key, value]) => { - if (key === 'fileName') { - return 'filename'; - } - return `${key}: ${JSON.stringify(value)}`; - }) - .join(' , ')} }`, - ) - .join(',\n ')} - ]` - } - }, - }} -/>`} - language="jsx" - copyButtonHidden - /> - - - ); -} diff --git a/docs/data/charts/export/ExportCompositionNoSnap.js b/docs/data/charts/export/ExportCompositionNoSnap.js deleted file mode 100644 index 13aefa165dfbf..0000000000000 --- a/docs/data/charts/export/ExportCompositionNoSnap.js +++ /dev/null @@ -1,85 +0,0 @@ -import * as React from 'react'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { useChartRootRef } from '@mui/x-charts/hooks'; -import Button from '@mui/material/Button'; -import { Stack } from '@mui/system'; -import { ChartsDataProviderPro } from '@mui/x-charts-pro/ChartsDataProviderPro'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; -import { useChartProApiRef } from '@mui/x-charts-pro/hooks'; -import Typography from '@mui/material/Typography'; - -function CustomChartWrapper({ children }) { - const chartRootRef = useChartRootRef(); - - return ( -
- {children} -
- ); -} - -export default function ExportCompositionNoSnap() { - const apiRef = useChartProApiRef(); - - return ( - - - - - Composite Chart - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/export/PrintChart.js b/docs/data/charts/export/PrintChart.js deleted file mode 100644 index e59ca7b12f997..0000000000000 --- a/docs/data/charts/export/PrintChart.js +++ /dev/null @@ -1,197 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import Select from '@mui/material/Select'; -import InputLabel from '@mui/material/InputLabel'; -import FormControl from '@mui/material/FormControl'; -import MenuItem from '@mui/material/MenuItem'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; - -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import { useChartProApiRef } from '@mui/x-charts-pro/hooks'; -import { RadarChartPro } from '@mui/x-charts-pro/RadarChartPro'; -import { PieChartPro } from '@mui/x-charts-pro/PieChartPro'; -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import { data } from './randomData'; -import { heatmapData } from './heatmapData'; - -const scatterSeries = [ - { - label: 'Series A', - data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), - }, -]; - -const sankeySeries = { - data: { - links: [ - { source: 'A', target: 'B', value: 10 }, - { source: 'A', target: 'C', value: 5 }, - { source: 'B', target: 'D', value: 8 }, - { source: 'C', target: 'D', value: 3 }, - ], - }, -}; -const series = [ - { label: 'Series A', data: data.map((p) => p.y1) }, - { label: 'Series B', data: data.map((p) => p.y2) }, -]; - -export default function PrintChart() { - const [chartType, setChartType] = React.useState('scatter'); - const apiRef = useChartProApiRef(); - - const handleChange = (event) => setChartType(event.target.value); - - return ( - - - - Chart Type - - - - - - - ); -} - -function Chart({ apiRef, type }) { - switch (type) { - case 'scatter': - return ; - - case 'line': - return ( - p.x1).toSorted((a, b) => a - b) }]} - series={series} - /> - ); - - case 'bar': - return ( - Math.round(p.x1)).toSorted((a, b) => a - b) }, - ]} - series={series} - /> - ); - - case 'pie': - return ( - - ); - - case 'heatmap': - return ( - - ); - - case 'funnel': - return ( - - ); - - case 'radar': - return ( - - ); - - case 'sankey': - return ; - - default: - throw new Error(`Unknown chart type: ${type}`); - } -} diff --git a/docs/data/charts/export/ExportChartAsExcel.tsx b/docs/data/charts/export/demos/export-chart-as-excel/ExportChartAsExcel.tsx similarity index 97% rename from docs/data/charts/export/ExportChartAsExcel.tsx rename to docs/data/charts/export/demos/export-chart-as-excel/ExportChartAsExcel.tsx index 099ba3454c1ef..1e271eb7b7d1a 100644 --- a/docs/data/charts/export/ExportChartAsExcel.tsx +++ b/docs/data/charts/export/demos/export-chart-as-excel/ExportChartAsExcel.tsx @@ -33,6 +33,7 @@ const settings = { export default function ExportChartAsExcel() { return ( + {/* @focus-start */} Open the export menu and pick Export as Excel @@ -46,6 +47,7 @@ export default function ExportChartAsExcel() { + {/* @focus-end */} ); } diff --git a/docs/data/charts/export/demos/export-chart-as-excel/client.ts b/docs/data/charts/export/demos/export-chart-as-excel/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-as-excel/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/export-chart-as-excel/index.ts b/docs/data/charts/export/demos/export-chart-as-excel/index.ts new file mode 100644 index 0000000000000..a3e3905b5bc8c --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-as-excel/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportChartAsExcel from './ExportChartAsExcel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportChartAsExcel, { ClientProvider }); diff --git a/docs/data/charts/export/ExportChartAsImage.tsx b/docs/data/charts/export/demos/export-chart-as-image/ExportChartAsImage.tsx similarity index 96% rename from docs/data/charts/export/ExportChartAsImage.tsx rename to docs/data/charts/export/demos/export-chart-as-image/ExportChartAsImage.tsx index 023801ef8fcdf..0a959a2653808 100644 --- a/docs/data/charts/export/ExportChartAsImage.tsx +++ b/docs/data/charts/export/demos/export-chart-as-image/ExportChartAsImage.tsx @@ -9,7 +9,7 @@ import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import { useChartProApiRef } from '@mui/x-charts-pro/hooks'; -import { ChartProApi } from '@mui/x-charts-pro/context'; +import type { ChartProApi } from '@mui/x-charts-pro/context'; function ExportParamsSelector({ apiRef, @@ -78,6 +78,7 @@ function ExportParamsSelector({ } export default function ExportChartAsImage() { + // @focus-start @padding 1 const apiRef = useChartProApiRef<'line'>(); return ( @@ -99,4 +100,5 @@ export default function ExportChartAsImage() { ); + // @focus-end } diff --git a/docs/data/charts/export/demos/export-chart-as-image/client.ts b/docs/data/charts/export/demos/export-chart-as-image/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-as-image/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/export-chart-as-image/index.ts b/docs/data/charts/export/demos/export-chart-as-image/index.ts new file mode 100644 index 0000000000000..107318063ca93 --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-as-image/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportChartAsImage from './ExportChartAsImage'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportChartAsImage, { ClientProvider }); diff --git a/docs/data/charts/export/ExportChartHideOnExport.tsx b/docs/data/charts/export/demos/export-chart-hide-on-export/ExportChartHideOnExport.tsx similarity index 92% rename from docs/data/charts/export/ExportChartHideOnExport.tsx rename to docs/data/charts/export/demos/export-chart-hide-on-export/ExportChartHideOnExport.tsx index 3f6d9b980770b..d8eebe50908b7 100644 --- a/docs/data/charts/export/ExportChartHideOnExport.tsx +++ b/docs/data/charts/export/demos/export-chart-hide-on-export/ExportChartHideOnExport.tsx @@ -3,6 +3,7 @@ import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; export default function ExportChartHideOnExport() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/export/demos/export-chart-hide-on-export/client.ts b/docs/data/charts/export/demos/export-chart-hide-on-export/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-hide-on-export/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/export-chart-hide-on-export/index.ts b/docs/data/charts/export/demos/export-chart-hide-on-export/index.ts new file mode 100644 index 0000000000000..3f8317f27e6c8 --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-hide-on-export/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportChartHideOnExport from './ExportChartHideOnExport'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportChartHideOnExport, { ClientProvider }); diff --git a/docs/data/charts/export/ExportChartOnBeforeExport.tsx b/docs/data/charts/export/demos/export-chart-on-before-export/ExportChartOnBeforeExport.tsx similarity index 96% rename from docs/data/charts/export/ExportChartOnBeforeExport.tsx rename to docs/data/charts/export/demos/export-chart-on-before-export/ExportChartOnBeforeExport.tsx index 45d19f4c084e6..e0e9f499a76fc 100644 --- a/docs/data/charts/export/ExportChartOnBeforeExport.tsx +++ b/docs/data/charts/export/demos/export-chart-on-before-export/ExportChartOnBeforeExport.tsx @@ -3,7 +3,7 @@ import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; import { defaultOnBeforeExport } from '@mui/x-charts-pro/models'; -import { inflationData } from '../dataset/inflationRates'; +import { inflationData } from '../../../dataset/inflationRates'; const yAxisFormatter = new Intl.NumberFormat('en-US', { style: 'percent', @@ -99,6 +99,7 @@ function createOnBeforeExport( } export default function ExportChartOnBeforeExport() { + // @focus-start @padding 1 const titleRef = React.useRef(null); const captionRef = React.useRef(null); const onBeforeExport = React.useMemo( @@ -126,4 +127,5 @@ export default function ExportChartOnBeforeExport() { ); + // @focus-end } diff --git a/docs/data/charts/export/demos/export-chart-on-before-export/client.ts b/docs/data/charts/export/demos/export-chart-on-before-export/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-on-before-export/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/export-chart-on-before-export/index.ts b/docs/data/charts/export/demos/export-chart-on-before-export/index.ts new file mode 100644 index 0000000000000..d1bba6fd2409e --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-on-before-export/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportChartOnBeforeExport from './ExportChartOnBeforeExport'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportChartOnBeforeExport, { ClientProvider }); diff --git a/docs/data/charts/export/ExportChartToolbarCustomization.tsx b/docs/data/charts/export/demos/export-chart-toolbar-customization/ExportChartToolbarCustomization.tsx similarity index 91% rename from docs/data/charts/export/ExportChartToolbarCustomization.tsx rename to docs/data/charts/export/demos/export-chart-toolbar-customization/ExportChartToolbarCustomization.tsx index b2a7c4c30a01f..eb9d94ee387cb 100644 --- a/docs/data/charts/export/ExportChartToolbarCustomization.tsx +++ b/docs/data/charts/export/demos/export-chart-toolbar-customization/ExportChartToolbarCustomization.tsx @@ -1,13 +1,13 @@ import * as React from 'react'; -import { ChartProApi } from '@mui/x-charts-pro/context'; +import type { ChartProApi } from '@mui/x-charts-pro/context'; import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import { ScatterValueType } from '@mui/x-charts/models'; -import { continents, countryData } from '../dataset/countryData'; -import { populationGdpPerCapitaData } from './populationGdpPerCapitaData'; -import ExportOptionSelector from './ExportOptionSelector'; +import type { ScatterValueType } from '@mui/x-charts/models'; +import { continents, countryData } from '../../../dataset/countryData'; +import { populationGdpPerCapitaData } from '../../populationGdpPerCapitaData'; +import ExportOptionSelector from '../../ExportOptionSelector'; const populationFormatter = new Intl.NumberFormat('en-US', { notation: 'compact', @@ -42,6 +42,7 @@ const series = continents.map( const fileName = 'Population_vs_GDP_Per_Capita_USD_2019'; export default function ExportChartToolbarCustomization() { + // @focus-start @padding 1 const apiRef = React.useRef(undefined); const [formats, setFormats] = React.useState({ print: true, @@ -142,4 +143,5 @@ export default function ExportChartToolbarCustomization() { ); + // @focus-end } diff --git a/docs/data/charts/export/demos/export-chart-toolbar-customization/client.ts b/docs/data/charts/export/demos/export-chart-toolbar-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-toolbar-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/export-chart-toolbar-customization/index.ts b/docs/data/charts/export/demos/export-chart-toolbar-customization/index.ts new file mode 100644 index 0000000000000..5a79b0bdd6dbc --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-toolbar-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportChartToolbarCustomization from './ExportChartToolbarCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportChartToolbarCustomization, { ClientProvider }); diff --git a/docs/data/charts/export/ExportChartToolbar.tsx b/docs/data/charts/export/demos/export-chart-toolbar/ExportChartToolbar.tsx similarity index 93% rename from docs/data/charts/export/ExportChartToolbar.tsx rename to docs/data/charts/export/demos/export-chart-toolbar/ExportChartToolbar.tsx index a0cfdc0500425..e3040740f53e8 100644 --- a/docs/data/charts/export/ExportChartToolbar.tsx +++ b/docs/data/charts/export/demos/export-chart-toolbar/ExportChartToolbar.tsx @@ -1,7 +1,7 @@ import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; -import { inflationData } from '../dataset/inflationRates'; +import { inflationData } from '../../../dataset/inflationRates'; const yAxisFormatter = new Intl.NumberFormat('en-US', { style: 'percent', @@ -58,11 +58,13 @@ const settings = { export default function ExportChartToolbar() { return ( + {/* @focus-start */} Inflation rate in France, Germany and the UK, 1960-2024 Source: World Bank + {/* @focus-end */} ); } diff --git a/docs/data/charts/export/demos/export-chart-toolbar/client.ts b/docs/data/charts/export/demos/export-chart-toolbar/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-toolbar/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/export-chart-toolbar/index.ts b/docs/data/charts/export/demos/export-chart-toolbar/index.ts new file mode 100644 index 0000000000000..7d6aeb54e5dd6 --- /dev/null +++ b/docs/data/charts/export/demos/export-chart-toolbar/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportChartToolbar from './ExportChartToolbar'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportChartToolbar, { ClientProvider }); diff --git a/docs/data/charts/export/ExportCompositionNoSnap.tsx b/docs/data/charts/export/demos/export-composition-no-snap/ExportCompositionNoSnap.tsx similarity index 98% rename from docs/data/charts/export/ExportCompositionNoSnap.tsx rename to docs/data/charts/export/demos/export-composition-no-snap/ExportCompositionNoSnap.tsx index 86db4ee2a2db0..67f062d2b6335 100644 --- a/docs/data/charts/export/ExportCompositionNoSnap.tsx +++ b/docs/data/charts/export/demos/export-composition-no-snap/ExportCompositionNoSnap.tsx @@ -26,6 +26,7 @@ function CustomChartWrapper({ children }: React.PropsWithChildren) { } export default function ExportCompositionNoSnap() { + // @focus-start @padding 1 const apiRef = useChartProApiRef<'composition'>(); return ( @@ -82,4 +83,5 @@ export default function ExportCompositionNoSnap() { ); + // @focus-end } diff --git a/docs/data/charts/export/demos/export-composition-no-snap/client.ts b/docs/data/charts/export/demos/export-composition-no-snap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/export-composition-no-snap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/export-composition-no-snap/index.ts b/docs/data/charts/export/demos/export-composition-no-snap/index.ts new file mode 100644 index 0000000000000..53804101d41ce --- /dev/null +++ b/docs/data/charts/export/demos/export-composition-no-snap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportCompositionNoSnap from './ExportCompositionNoSnap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportCompositionNoSnap, { ClientProvider }); diff --git a/docs/data/charts/export/PrintChart.tsx b/docs/data/charts/export/demos/print-chart/PrintChart.tsx similarity index 95% rename from docs/data/charts/export/PrintChart.tsx rename to docs/data/charts/export/demos/print-chart/PrintChart.tsx index d13f81e89269e..f4a5b8eedaabb 100644 --- a/docs/data/charts/export/PrintChart.tsx +++ b/docs/data/charts/export/demos/print-chart/PrintChart.tsx @@ -1,12 +1,13 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; -import Select, { SelectChangeEvent } from '@mui/material/Select'; +import type { SelectChangeEvent } from '@mui/material/Select'; +import Select from '@mui/material/Select'; import InputLabel from '@mui/material/InputLabel'; import FormControl from '@mui/material/FormControl'; import MenuItem from '@mui/material/MenuItem'; import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import { ChartProApi } from '@mui/x-charts-pro/context'; +import type { ChartProApi } from '@mui/x-charts-pro/context'; import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; @@ -15,8 +16,8 @@ import { useChartProApiRef } from '@mui/x-charts-pro/hooks'; import { RadarChartPro } from '@mui/x-charts-pro/RadarChartPro'; import { PieChartPro } from '@mui/x-charts-pro/PieChartPro'; import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import { data } from './randomData'; -import { heatmapData } from './heatmapData'; +import { data } from '../../randomData'; +import { heatmapData } from '../../heatmapData'; const scatterSeries = [ { @@ -47,6 +48,7 @@ type ChartType = 'scatter' | 'line' | 'bar' | 'pie' | 'heatmap' | 'funnel' | 'radar' | 'sankey'; export default function PrintChart() { + // @focus-start @padding 1 const [chartType, setChartType] = React.useState('scatter'); const apiRef = useChartProApiRef(); @@ -92,6 +94,7 @@ export default function PrintChart() { ); + // @focus-end } function Chart({ diff --git a/docs/data/charts/export/demos/print-chart/client.ts b/docs/data/charts/export/demos/print-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/export/demos/print-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/export/demos/print-chart/index.ts b/docs/data/charts/export/demos/print-chart/index.ts new file mode 100644 index 0000000000000..10044e979fe8d --- /dev/null +++ b/docs/data/charts/export/demos/print-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PrintChart from './PrintChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PrintChart, { ClientProvider }); diff --git a/docs/data/charts/export/export.md b/docs/data/charts/export/export.md index 5c8a4c8874793..b32a8b832431a 100644 --- a/docs/data/charts/export/export.md +++ b/docs/data/charts/export/export.md @@ -35,7 +35,7 @@ By default, the toolbar is not displayed on exported media. You can override the `onBeforeExport` callback to change this behavior. ::: -{{"demo": "ExportChartToolbar.js"}} +{{"component": "file://./demos/export-chart-toolbar/index.ts"}} ### Custom toolbar @@ -91,7 +91,7 @@ If the browser does not support a requested image format, the export defaults to In the example below, you can toggle which export formats are available to the user. The name of the exported file has been customized to resemble the chart's title. -{{"demo": "ExportChartToolbarCustomization.js"}} +{{"component": "file://./demos/export-chart-toolbar-customization/index.ts"}} ### Add custom styles before exporting @@ -102,7 +102,7 @@ The `onBeforeExport` callback gives you access to the iframe before the export p For example, you can add the title and caption to the exported chart as shown below: -{{"demo": "ExportChartOnBeforeExport.js"}} +{{"component": "file://./demos/export-chart-on-before-export/index.ts"}} :::info If you don't want to manually add elements to the chart export, you can create a chart through composition and include the elements you want to export as part of the chart. @@ -114,7 +114,7 @@ See [Exporting composed charts](#exporting-composed-charts) below for more infor Mark any element with the `data-hide-on-export` attribute to exclude it from image and print exports. The attribute works on any HTML or SVG element in the chart tree. -{{"demo": "ExportChartHideOnExport.js"}} +{{"component": "file://./demos/export-chart-hide-on-export/index.ts"}} To hide an internal MUI X Charts component (such as the legend) that you do not render directly, forward the attribute through `slotProps`: @@ -174,7 +174,7 @@ See [Composition](/x/react-charts/composition/) for more details on implementing To use a custom wrapper instead, you must set the reference to the root element with the `useChartRootRef()` hook as shown below: -{{"demo": "ExportCompositionNoSnap.js"}} +{{"component": "file://./demos/export-composition-no-snap/index.ts"}} ## Content Security Policy (CSP) @@ -202,7 +202,7 @@ const plugins = [...BAR_CHART_PREMIUM_PLUGINS, useChartPremiumExport]; With the plugin registered, `ChartsToolbarPremium` adds an **Export as Excel** entry to the export menu. The entry is left out when the chart does not register the plugin, so the menu never offers an export that cannot run. -{{"demo": "ExportChartAsExcel.js"}} +{{"component": "file://./demos/export-chart-as-excel/index.ts"}} :::info The single-component charts, such as `BarChartPremium`, do not accept a `plugins` prop, so the Excel export is only available on composed charts. @@ -252,7 +252,7 @@ Series are grouped by the columns they need, and each group becomes one sheet: The `apiRef` prop exposes the `exportAsPrint()` method that can be used to open the browser's print dialog. The print dialog lets you print the chart or save it as a PDF, as well as configure other settings. -{{"demo": "PrintChart.js"}} +{{"component": "file://./demos/print-chart/index.ts"}} ### Export as image @@ -316,6 +316,6 @@ try { } ``` -{{"demo": "ExportChartAsImage.js"}} +{{"component": "file://./demos/export-chart-as-image/index.ts"}} When `onStylesheetError` cancels the export by returning `false`, nothing is exported, no error is logged, and the promise resolves. diff --git a/docs/data/charts/export/heatmapData.ts b/docs/data/charts/export/heatmapData.ts index b88d55c474ec4..64eafc83166bd 100644 --- a/docs/data/charts/export/heatmapData.ts +++ b/docs/data/charts/export/heatmapData.ts @@ -1,4 +1,4 @@ -import { HeatmapValueType } from '@mui/x-charts-pro/models'; +import type { HeatmapValueType } from '@mui/x-charts-pro/models'; export const heatmapData: HeatmapValueType[] = [ [0, 0, 10], diff --git a/docs/data/charts/funnel/BasicFunnel.js b/docs/data/charts/funnel/BasicFunnel.js deleted file mode 100644 index a38f48747e8b2..0000000000000 --- a/docs/data/charts/funnel/BasicFunnel.js +++ /dev/null @@ -1,17 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function BasicFunnel() { - return ( - - - - ); -} diff --git a/docs/data/charts/funnel/BasicFunnel.tsx.preview b/docs/data/charts/funnel/BasicFunnel.tsx.preview deleted file mode 100644 index 614559a488cf6..0000000000000 --- a/docs/data/charts/funnel/BasicFunnel.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelAxisAutoSize.js b/docs/data/charts/funnel/FunnelAxisAutoSize.js deleted file mode 100644 index 8f74a2f639eb2..0000000000000 --- a/docs/data/charts/funnel/FunnelAxisAutoSize.js +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelAxisAutoSize() { - const [useAutoSize, setUseAutoSize] = React.useState(true); - - return ( - - - setUseAutoSize(event.target.checked)} /> - } - label="Use auto-sizing" - labelPlacement="end" - /> - - - - - ); -} - -const categories = [ - 'Website visitors', - 'Product page views', - 'Added to cart', - 'Checkout started', - 'Purchase completed', -]; - -const funnelSeries = { - data: [ - { value: 10000, label: 'Website visitors' }, - { value: 7500, label: 'Product page views' }, - { value: 3200, label: 'Added to cart' }, - { value: 1800, label: 'Checkout started' }, - { value: 950, label: 'Purchase completed' }, - ], -}; diff --git a/docs/data/charts/funnel/FunnelBorderRadius.js b/docs/data/charts/funnel/FunnelBorderRadius.js deleted file mode 100644 index 1cb758d983df0..0000000000000 --- a/docs/data/charts/funnel/FunnelBorderRadius.js +++ /dev/null @@ -1,28 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelBorderRadius() { - return ( - - - - - ); -} diff --git a/docs/data/charts/funnel/FunnelCategoryAxis.js b/docs/data/charts/funnel/FunnelCategoryAxis.js deleted file mode 100644 index a0b964ca90bd0..0000000000000 --- a/docs/data/charts/funnel/FunnelCategoryAxis.js +++ /dev/null @@ -1,26 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import { populationByEducationLevelPercentageSeriesLabeled } from './populationByEducationLevel'; - -export default function FunnelCategoryAxis() { - return ( - - - - ); -} - -const funnelProps = { - height: 300, - hideLegend: true, -}; diff --git a/docs/data/charts/funnel/FunnelCategoryAxis.tsx.preview b/docs/data/charts/funnel/FunnelCategoryAxis.tsx.preview deleted file mode 100644 index 009e5b78eeea0..0000000000000 --- a/docs/data/charts/funnel/FunnelCategoryAxis.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelColor.js b/docs/data/charts/funnel/FunnelColor.js deleted file mode 100644 index 2ca11347ca7e6..0000000000000 --- a/docs/data/charts/funnel/FunnelColor.js +++ /dev/null @@ -1,22 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelColor() { - return ( - - - - ); -} diff --git a/docs/data/charts/funnel/FunnelColor.tsx.preview b/docs/data/charts/funnel/FunnelColor.tsx.preview deleted file mode 100644 index 71b976d3e8255..0000000000000 --- a/docs/data/charts/funnel/FunnelColor.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelCurves.js b/docs/data/charts/funnel/FunnelCurves.js deleted file mode 100644 index 8d8df8932beb5..0000000000000 --- a/docs/data/charts/funnel/FunnelCurves.js +++ /dev/null @@ -1,92 +0,0 @@ -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import Stack from '@mui/material/Stack'; -import { populationByEducationLevelPercentageSeries } from './populationByEducationLevel'; - -const curveTypes = [ - 'bump', - 'linear', - 'linear-sharp', - 'step', - 'pyramid', - 'step-pyramid', -]; - -export default function FunnelCurves() { - return ( - ( - - - - - )} - getCode={({ props }) => { - return `import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/funnel/FunnelDataAttributes.js b/docs/data/charts/funnel/FunnelDataAttributes.js deleted file mode 100644 index 22ad74f121730..0000000000000 --- a/docs/data/charts/funnel/FunnelDataAttributes.js +++ /dev/null @@ -1,36 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart, funnelClasses } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelDataAttributes() { - return ( - - - - - - - - - - - - ); -} - -const funnelProps = { - height: 300, - hideLegend: true, - series: [ - { - id: 'main', - data: [{ value: 200 }, { value: 180 }, { value: 90 }, { value: 50 }], - }, - ], -}; diff --git a/docs/data/charts/funnel/FunnelDataAttributes.tsx.preview b/docs/data/charts/funnel/FunnelDataAttributes.tsx.preview deleted file mode 100644 index 63608b2a519a6..0000000000000 --- a/docs/data/charts/funnel/FunnelDataAttributes.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelGap.js b/docs/data/charts/funnel/FunnelGap.js deleted file mode 100644 index 16a102be8b50a..0000000000000 --- a/docs/data/charts/funnel/FunnelGap.js +++ /dev/null @@ -1,18 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelGap() { - return ( - - - - ); -} diff --git a/docs/data/charts/funnel/FunnelGap.tsx.preview b/docs/data/charts/funnel/FunnelGap.tsx.preview deleted file mode 100644 index 652b021893ac2..0000000000000 --- a/docs/data/charts/funnel/FunnelGap.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelLabelPositioning.js b/docs/data/charts/funnel/FunnelLabelPositioning.js deleted file mode 100644 index 0a059f93d8a23..0000000000000 --- a/docs/data/charts/funnel/FunnelLabelPositioning.js +++ /dev/null @@ -1,125 +0,0 @@ -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import Stack from '@mui/material/Stack'; - -export default function FunnelLabelPositioning() { - return ( - ( - - - - )} - getCode={({ props }) => { - if (props.hide) { - return `import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - - -`; - } - - return `import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/funnel/FunnelLabelStyling.js b/docs/data/charts/funnel/FunnelLabelStyling.js deleted file mode 100644 index bb69206b5f1f6..0000000000000 --- a/docs/data/charts/funnel/FunnelLabelStyling.js +++ /dev/null @@ -1,28 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart, funnelClasses } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelLabelStyling() { - return ( - - - - ); -} - -const funnelProps = { - height: 300, - hideLegend: true, -}; diff --git a/docs/data/charts/funnel/FunnelLabelStyling.tsx.preview b/docs/data/charts/funnel/FunnelLabelStyling.tsx.preview deleted file mode 100644 index 39660dfa0732e..0000000000000 --- a/docs/data/charts/funnel/FunnelLabelStyling.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelLabels.js b/docs/data/charts/funnel/FunnelLabels.js deleted file mode 100644 index 09a67dd9fe4c4..0000000000000 --- a/docs/data/charts/funnel/FunnelLabels.js +++ /dev/null @@ -1,29 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelLabels() { - return ( - - - `${item.label}${context.dataIndex} ${item.value}.00`, - }, - ]} - {...funnelProps} - /> - - ); -} - -const funnelProps = { - height: 300, - hideLegend: true, -}; diff --git a/docs/data/charts/funnel/FunnelLabels.tsx.preview b/docs/data/charts/funnel/FunnelLabels.tsx.preview deleted file mode 100644 index 6d4f55b88f59f..0000000000000 --- a/docs/data/charts/funnel/FunnelLabels.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - `${item.label}${context.dataIndex} ${item.value}.00`, - }, - ]} - {...funnelProps} -/> \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelLegend.js b/docs/data/charts/funnel/FunnelLegend.js deleted file mode 100644 index 60130b185c5a6..0000000000000 --- a/docs/data/charts/funnel/FunnelLegend.js +++ /dev/null @@ -1,48 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -export default function FunnelLegend() { - const [hideLegend, setHideLegend] = React.useState(false); - - return ( - - - - - ); -} - -const funnelProps = { - height: 300, - slotProps: { legend: { position: { vertical: 'bottom' } } }, -}; - -function Controls({ hideLegend, setHideLegend }) { - return ( - setHideLegend((prev) => !prev)} - /> - } - label="Hide legend" - /> - ); -} diff --git a/docs/data/charts/funnel/FunnelLegend.tsx.preview b/docs/data/charts/funnel/FunnelLegend.tsx.preview deleted file mode 100644 index 85e6ff724d441..0000000000000 --- a/docs/data/charts/funnel/FunnelLegend.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelLinearScale.js b/docs/data/charts/funnel/FunnelLinearScale.js deleted file mode 100644 index a258cd5d99bab..0000000000000 --- a/docs/data/charts/funnel/FunnelLinearScale.js +++ /dev/null @@ -1,20 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import { populationByEducationLevelPercentageSeriesLabeled } from './populationByEducationLevel'; - -export default function FunnelLinearScale() { - return ( - - - - ); -} - -const funnelProps = { - height: 300, - hideLegend: true, -}; diff --git a/docs/data/charts/funnel/FunnelLinearScale.tsx.preview b/docs/data/charts/funnel/FunnelLinearScale.tsx.preview deleted file mode 100644 index 8fc9c2a67f597..0000000000000 --- a/docs/data/charts/funnel/FunnelLinearScale.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelStacked.js b/docs/data/charts/funnel/FunnelStacked.js deleted file mode 100644 index fd8636fd461d9..0000000000000 --- a/docs/data/charts/funnel/FunnelStacked.js +++ /dev/null @@ -1,39 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelStacked() { - return ( - - - - ); -} - -const dataBig = [ - { value: 500, label: 'A1' }, - { value: 280, label: 'B1' }, - { value: 190, label: 'C1' }, - { value: 70, label: 'D1' }, -]; - -const dataSmall = [ - { value: 200, label: 'A2' }, - { value: 180, label: 'B2' }, - { value: 90, label: 'C2' }, - { value: 50, label: 'D2' }, -]; diff --git a/docs/data/charts/funnel/FunnelStacked.tsx.preview b/docs/data/charts/funnel/FunnelStacked.tsx.preview deleted file mode 100644 index 9d959caaec6a5..0000000000000 --- a/docs/data/charts/funnel/FunnelStacked.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/FunnelVariant.js b/docs/data/charts/funnel/FunnelVariant.js deleted file mode 100644 index d9dba6765232b..0000000000000 --- a/docs/data/charts/funnel/FunnelVariant.js +++ /dev/null @@ -1,25 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function FunnelVariant() { - const data = [ - { value: 200, label: 'Leads' }, - { value: 150, label: 'Calls' }, - { value: 90, label: 'Meetings' }, - { value: 40, label: 'Deals' }, - ]; - - return ( - - - - ); -} diff --git a/docs/data/charts/funnel/FunnelVariant.tsx.preview b/docs/data/charts/funnel/FunnelVariant.tsx.preview deleted file mode 100644 index 12372a923d525..0000000000000 --- a/docs/data/charts/funnel/FunnelVariant.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/HighlightFunnel.js b/docs/data/charts/funnel/HighlightFunnel.js deleted file mode 100644 index 5488ed827dd18..0000000000000 --- a/docs/data/charts/funnel/HighlightFunnel.js +++ /dev/null @@ -1,90 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -import { populationByEducationLevelPercentageSeriesLabeled } from './populationByEducationLevel'; - -export default function HighlightFunnel() { - const [highlight, setHighlight] = React.useState('item'); - const [fade, setFade] = React.useState('global'); - - return ( - - - - - - - - - ); -} - -const funnelChartParams = { - height: 300, - hideLegend: true, -}; - -function Controls({ highlight, setHighlight, fade, setFade }) { - return ( - - setHighlight(event.target.value)} - sx={{ minWidth: 150 }} - > - none - item - series - - setFade(event.target.value)} - sx={{ minWidth: 150 }} - > - none - series - global - - - ); -} diff --git a/docs/data/charts/funnel/PyramidFunnel.js b/docs/data/charts/funnel/PyramidFunnel.js deleted file mode 100644 index 9f96f00cfe6f0..0000000000000 --- a/docs/data/charts/funnel/PyramidFunnel.js +++ /dev/null @@ -1,18 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function PyramidFunnel() { - return ( - - - - ); -} diff --git a/docs/data/charts/funnel/PyramidFunnel.tsx.preview b/docs/data/charts/funnel/PyramidFunnel.tsx.preview deleted file mode 100644 index 65f825440408e..0000000000000 --- a/docs/data/charts/funnel/PyramidFunnel.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/funnel/BasicFunnel.tsx b/docs/data/charts/funnel/demos/basic-funnel/BasicFunnel.tsx similarity index 88% rename from docs/data/charts/funnel/BasicFunnel.tsx rename to docs/data/charts/funnel/demos/basic-funnel/BasicFunnel.tsx index a38f48747e8b2..67fe071a0aad7 100644 --- a/docs/data/charts/funnel/BasicFunnel.tsx +++ b/docs/data/charts/funnel/demos/basic-funnel/BasicFunnel.tsx @@ -4,6 +4,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function BasicFunnel() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/basic-funnel/client.ts b/docs/data/charts/funnel/demos/basic-funnel/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/basic-funnel/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/basic-funnel/index.ts b/docs/data/charts/funnel/demos/basic-funnel/index.ts new file mode 100644 index 0000000000000..e6d45bfa45a9a --- /dev/null +++ b/docs/data/charts/funnel/demos/basic-funnel/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicFunnel from './BasicFunnel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicFunnel, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelAxisAutoSize.tsx b/docs/data/charts/funnel/demos/funnel-axis-auto-size/FunnelAxisAutoSize.tsx similarity index 97% rename from docs/data/charts/funnel/FunnelAxisAutoSize.tsx rename to docs/data/charts/funnel/demos/funnel-axis-auto-size/FunnelAxisAutoSize.tsx index 8f74a2f639eb2..47b49e23628df 100644 --- a/docs/data/charts/funnel/FunnelAxisAutoSize.tsx +++ b/docs/data/charts/funnel/demos/funnel-axis-auto-size/FunnelAxisAutoSize.tsx @@ -6,6 +6,7 @@ import Checkbox from '@mui/material/Checkbox'; import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelAxisAutoSize() { + // @focus-start @padding 1 const [useAutoSize, setUseAutoSize] = React.useState(true); return ( @@ -35,6 +36,7 @@ export default function FunnelAxisAutoSize() { /> ); + // @focus-end } const categories = [ diff --git a/docs/data/charts/funnel/demos/funnel-axis-auto-size/client.ts b/docs/data/charts/funnel/demos/funnel-axis-auto-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-axis-auto-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-axis-auto-size/index.ts b/docs/data/charts/funnel/demos/funnel-axis-auto-size/index.ts new file mode 100644 index 0000000000000..5d6a7952a5b5d --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-axis-auto-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelAxisAutoSize from './FunnelAxisAutoSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelAxisAutoSize, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelBorderRadius.tsx b/docs/data/charts/funnel/demos/funnel-border-radius/FunnelBorderRadius.tsx similarity index 92% rename from docs/data/charts/funnel/FunnelBorderRadius.tsx rename to docs/data/charts/funnel/demos/funnel-border-radius/FunnelBorderRadius.tsx index 1cb758d983df0..8ebc742a4441b 100644 --- a/docs/data/charts/funnel/FunnelBorderRadius.tsx +++ b/docs/data/charts/funnel/demos/funnel-border-radius/FunnelBorderRadius.tsx @@ -4,6 +4,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelBorderRadius() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-border-radius/client.ts b/docs/data/charts/funnel/demos/funnel-border-radius/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-border-radius/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-border-radius/index.ts b/docs/data/charts/funnel/demos/funnel-border-radius/index.ts new file mode 100644 index 0000000000000..27dd65fabacf7 --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-border-radius/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelBorderRadius from './FunnelBorderRadius'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelBorderRadius, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelCategoryAxis.tsx b/docs/data/charts/funnel/demos/funnel-category-axis/FunnelCategoryAxis.tsx similarity index 88% rename from docs/data/charts/funnel/FunnelCategoryAxis.tsx rename to docs/data/charts/funnel/demos/funnel-category-axis/FunnelCategoryAxis.tsx index 3d15f642736a1..82065b3995d57 100644 --- a/docs/data/charts/funnel/FunnelCategoryAxis.tsx +++ b/docs/data/charts/funnel/demos/funnel-category-axis/FunnelCategoryAxis.tsx @@ -1,10 +1,11 @@ import Box from '@mui/material/Box'; import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import { populationByEducationLevelPercentageSeriesLabeled } from './populationByEducationLevel'; +import { populationByEducationLevelPercentageSeriesLabeled } from '../../populationByEducationLevel'; export default function FunnelCategoryAxis() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-category-axis/client.ts b/docs/data/charts/funnel/demos/funnel-category-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-category-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-category-axis/index.ts b/docs/data/charts/funnel/demos/funnel-category-axis/index.ts new file mode 100644 index 0000000000000..12e1c7dae6bca --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-category-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelCategoryAxis from './FunnelCategoryAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelCategoryAxis, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelColor.tsx b/docs/data/charts/funnel/demos/funnel-color/FunnelColor.tsx similarity index 91% rename from docs/data/charts/funnel/FunnelColor.tsx rename to docs/data/charts/funnel/demos/funnel-color/FunnelColor.tsx index 2ca11347ca7e6..3c3a8e30f6659 100644 --- a/docs/data/charts/funnel/FunnelColor.tsx +++ b/docs/data/charts/funnel/demos/funnel-color/FunnelColor.tsx @@ -4,6 +4,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelColor() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-color/client.ts b/docs/data/charts/funnel/demos/funnel-color/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-color/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-color/index.ts b/docs/data/charts/funnel/demos/funnel-color/index.ts new file mode 100644 index 0000000000000..5100173a6b8a4 --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-color/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelColor from './FunnelColor'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelColor, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelCurves.tsx b/docs/data/charts/funnel/demos/funnel-curves/FunnelCurves.tsx similarity index 94% rename from docs/data/charts/funnel/FunnelCurves.tsx rename to docs/data/charts/funnel/demos/funnel-curves/FunnelCurves.tsx index d054dea88a4c4..fa67b0e6a64e5 100644 --- a/docs/data/charts/funnel/FunnelCurves.tsx +++ b/docs/data/charts/funnel/demos/funnel-curves/FunnelCurves.tsx @@ -1,7 +1,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import Stack from '@mui/material/Stack'; -import { populationByEducationLevelPercentageSeries } from './populationByEducationLevel'; +import { populationByEducationLevelPercentageSeries } from '../../populationByEducationLevel'; const curveTypes = [ 'bump', @@ -14,6 +14,7 @@ const curveTypes = [ export default function FunnelCurves() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/funnel/demos/funnel-curves/client.ts b/docs/data/charts/funnel/demos/funnel-curves/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-curves/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-curves/index.ts b/docs/data/charts/funnel/demos/funnel-curves/index.ts new file mode 100644 index 0000000000000..f829f08160a68 --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-curves/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelCurves from './FunnelCurves'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelCurves, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelDataAttributes.tsx b/docs/data/charts/funnel/demos/funnel-data-attributes/FunnelDataAttributes.tsx similarity index 94% rename from docs/data/charts/funnel/FunnelDataAttributes.tsx rename to docs/data/charts/funnel/demos/funnel-data-attributes/FunnelDataAttributes.tsx index 0851d3bdc4a7f..a763bda45f493 100644 --- a/docs/data/charts/funnel/FunnelDataAttributes.tsx +++ b/docs/data/charts/funnel/demos/funnel-data-attributes/FunnelDataAttributes.tsx @@ -4,6 +4,7 @@ import { FunnelChart, funnelClasses } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelDataAttributes() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-data-attributes/client.ts b/docs/data/charts/funnel/demos/funnel-data-attributes/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-data-attributes/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-data-attributes/index.ts b/docs/data/charts/funnel/demos/funnel-data-attributes/index.ts new file mode 100644 index 0000000000000..00bb73824019a --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-data-attributes/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelDataAttributes from './FunnelDataAttributes'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelDataAttributes, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelGap.tsx b/docs/data/charts/funnel/demos/funnel-gap/FunnelGap.tsx similarity index 88% rename from docs/data/charts/funnel/FunnelGap.tsx rename to docs/data/charts/funnel/demos/funnel-gap/FunnelGap.tsx index 16a102be8b50a..8e3f522d5eb7f 100644 --- a/docs/data/charts/funnel/FunnelGap.tsx +++ b/docs/data/charts/funnel/demos/funnel-gap/FunnelGap.tsx @@ -4,6 +4,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelGap() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-gap/client.ts b/docs/data/charts/funnel/demos/funnel-gap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-gap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-gap/index.ts b/docs/data/charts/funnel/demos/funnel-gap/index.ts new file mode 100644 index 0000000000000..ab9e7637c66d4 --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-gap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelGap from './FunnelGap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelGap, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelLabelPositioning.tsx b/docs/data/charts/funnel/demos/funnel-label-positioning/FunnelLabelPositioning.tsx similarity index 98% rename from docs/data/charts/funnel/FunnelLabelPositioning.tsx rename to docs/data/charts/funnel/demos/funnel-label-positioning/FunnelLabelPositioning.tsx index 223b7a093654e..3c4137a0e680d 100644 --- a/docs/data/charts/funnel/FunnelLabelPositioning.tsx +++ b/docs/data/charts/funnel/demos/funnel-label-positioning/FunnelLabelPositioning.tsx @@ -4,6 +4,7 @@ import Stack from '@mui/material/Stack'; export default function FunnelLabelPositioning() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/funnel/demos/funnel-label-positioning/client.ts b/docs/data/charts/funnel/demos/funnel-label-positioning/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-label-positioning/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-label-positioning/index.ts b/docs/data/charts/funnel/demos/funnel-label-positioning/index.ts new file mode 100644 index 0000000000000..7ff5c528445cd --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-label-positioning/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelLabelPositioning from './FunnelLabelPositioning'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelLabelPositioning, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelLabelStyling.tsx b/docs/data/charts/funnel/demos/funnel-label-styling/FunnelLabelStyling.tsx similarity index 92% rename from docs/data/charts/funnel/FunnelLabelStyling.tsx rename to docs/data/charts/funnel/demos/funnel-label-styling/FunnelLabelStyling.tsx index 286602b7834a7..0232feced5d6c 100644 --- a/docs/data/charts/funnel/FunnelLabelStyling.tsx +++ b/docs/data/charts/funnel/demos/funnel-label-styling/FunnelLabelStyling.tsx @@ -4,6 +4,7 @@ import { FunnelChart, funnelClasses } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelLabelStyling() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-label-styling/client.ts b/docs/data/charts/funnel/demos/funnel-label-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-label-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-label-styling/index.ts b/docs/data/charts/funnel/demos/funnel-label-styling/index.ts new file mode 100644 index 0000000000000..218aedb6bad41 --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-label-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelLabelStyling from './FunnelLabelStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelLabelStyling, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelLabels.tsx b/docs/data/charts/funnel/demos/funnel-labels/FunnelLabels.tsx similarity index 93% rename from docs/data/charts/funnel/FunnelLabels.tsx rename to docs/data/charts/funnel/demos/funnel-labels/FunnelLabels.tsx index a1bccb7904307..d004c57440814 100644 --- a/docs/data/charts/funnel/FunnelLabels.tsx +++ b/docs/data/charts/funnel/demos/funnel-labels/FunnelLabels.tsx @@ -4,6 +4,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelLabels() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-labels/client.ts b/docs/data/charts/funnel/demos/funnel-labels/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-labels/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-labels/index.ts b/docs/data/charts/funnel/demos/funnel-labels/index.ts new file mode 100644 index 0000000000000..57cdad2024bc8 --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-labels/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelLabels from './FunnelLabels'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelLabels, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelLegend.tsx b/docs/data/charts/funnel/demos/funnel-legend/FunnelLegend.tsx similarity index 96% rename from docs/data/charts/funnel/FunnelLegend.tsx rename to docs/data/charts/funnel/demos/funnel-legend/FunnelLegend.tsx index 8acf7bf2ae48a..7add635231239 100644 --- a/docs/data/charts/funnel/FunnelLegend.tsx +++ b/docs/data/charts/funnel/demos/funnel-legend/FunnelLegend.tsx @@ -5,6 +5,7 @@ import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; export default function FunnelLegend() { + // @focus-start @padding 1 const [hideLegend, setHideLegend] = React.useState(false); return ( @@ -26,6 +27,7 @@ export default function FunnelLegend() { /> ); + // @focus-end } const funnelProps = { diff --git a/docs/data/charts/funnel/demos/funnel-legend/client.ts b/docs/data/charts/funnel/demos/funnel-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-legend/index.ts b/docs/data/charts/funnel/demos/funnel-legend/index.ts new file mode 100644 index 0000000000000..301f8fdc3d7e6 --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelLegend from './FunnelLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelLegend, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelLinearScale.tsx b/docs/data/charts/funnel/demos/funnel-linear-scale/FunnelLinearScale.tsx similarity index 85% rename from docs/data/charts/funnel/FunnelLinearScale.tsx rename to docs/data/charts/funnel/demos/funnel-linear-scale/FunnelLinearScale.tsx index a1a9ad5906201..bc353ff0c449e 100644 --- a/docs/data/charts/funnel/FunnelLinearScale.tsx +++ b/docs/data/charts/funnel/demos/funnel-linear-scale/FunnelLinearScale.tsx @@ -1,15 +1,17 @@ import Box from '@mui/material/Box'; import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import { populationByEducationLevelPercentageSeriesLabeled } from './populationByEducationLevel'; +import { populationByEducationLevelPercentageSeriesLabeled } from '../../populationByEducationLevel'; export default function FunnelLinearScale() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-linear-scale/client.ts b/docs/data/charts/funnel/demos/funnel-linear-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-linear-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-linear-scale/index.ts b/docs/data/charts/funnel/demos/funnel-linear-scale/index.ts new file mode 100644 index 0000000000000..187a7af5ea00c --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-linear-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelLinearScale from './FunnelLinearScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelLinearScale, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelStacked.tsx b/docs/data/charts/funnel/demos/funnel-stacked/FunnelStacked.tsx similarity index 83% rename from docs/data/charts/funnel/FunnelStacked.tsx rename to docs/data/charts/funnel/demos/funnel-stacked/FunnelStacked.tsx index 384c57401bb3a..c8fe44da66570 100644 --- a/docs/data/charts/funnel/FunnelStacked.tsx +++ b/docs/data/charts/funnel/demos/funnel-stacked/FunnelStacked.tsx @@ -1,9 +1,11 @@ import Box from '@mui/material/Box'; -import { FunnelChart, FunnelChartProps } from '@mui/x-charts-pro/FunnelChart'; +import type { FunnelChartProps } from '@mui/x-charts-pro/FunnelChart'; +import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelStacked() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/funnel-stacked/client.ts b/docs/data/charts/funnel/demos/funnel-stacked/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-stacked/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-stacked/index.ts b/docs/data/charts/funnel/demos/funnel-stacked/index.ts new file mode 100644 index 0000000000000..77e69bdf79a7b --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-stacked/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelStacked from './FunnelStacked'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelStacked, { ClientProvider }); diff --git a/docs/data/charts/funnel/FunnelVariant.tsx b/docs/data/charts/funnel/demos/funnel-variant/FunnelVariant.tsx similarity index 92% rename from docs/data/charts/funnel/FunnelVariant.tsx rename to docs/data/charts/funnel/demos/funnel-variant/FunnelVariant.tsx index d9dba6765232b..a0ec5c3691c92 100644 --- a/docs/data/charts/funnel/FunnelVariant.tsx +++ b/docs/data/charts/funnel/demos/funnel-variant/FunnelVariant.tsx @@ -2,6 +2,7 @@ import Box from '@mui/material/Box'; import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function FunnelVariant() { + // @focus-start @padding 1 const data = [ { value: 200, label: 'Leads' }, { value: 150, label: 'Calls' }, @@ -22,4 +23,5 @@ export default function FunnelVariant() { /> ); + // @focus-end } diff --git a/docs/data/charts/funnel/demos/funnel-variant/client.ts b/docs/data/charts/funnel/demos/funnel-variant/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-variant/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/funnel-variant/index.ts b/docs/data/charts/funnel/demos/funnel-variant/index.ts new file mode 100644 index 0000000000000..7a2ee25179a2e --- /dev/null +++ b/docs/data/charts/funnel/demos/funnel-variant/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunnelVariant from './FunnelVariant'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunnelVariant, { ClientProvider }); diff --git a/docs/data/charts/funnel/HighlightFunnel.tsx b/docs/data/charts/funnel/demos/highlight-funnel/HighlightFunnel.tsx similarity index 94% rename from docs/data/charts/funnel/HighlightFunnel.tsx rename to docs/data/charts/funnel/demos/highlight-funnel/HighlightFunnel.tsx index 58acde0eca5d0..420ad659e2dfd 100644 --- a/docs/data/charts/funnel/HighlightFunnel.tsx +++ b/docs/data/charts/funnel/demos/highlight-funnel/HighlightFunnel.tsx @@ -3,10 +3,11 @@ import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import { FadeOptions, HighlightOptions } from '@mui/x-charts/context'; -import { populationByEducationLevelPercentageSeriesLabeled } from './populationByEducationLevel'; +import type { FadeOptions, HighlightOptions } from '@mui/x-charts/context'; +import { populationByEducationLevelPercentageSeriesLabeled } from '../../populationByEducationLevel'; export default function HighlightFunnel() { + // @focus-start @padding 1 const [highlight, setHighlight] = React.useState('item'); const [fade, setFade] = React.useState('global'); @@ -48,6 +49,7 @@ export default function HighlightFunnel() { /> ); + // @focus-end } const funnelChartParams = { diff --git a/docs/data/charts/funnel/demos/highlight-funnel/client.ts b/docs/data/charts/funnel/demos/highlight-funnel/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/highlight-funnel/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/highlight-funnel/index.ts b/docs/data/charts/funnel/demos/highlight-funnel/index.ts new file mode 100644 index 0000000000000..a551312aa1af4 --- /dev/null +++ b/docs/data/charts/funnel/demos/highlight-funnel/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HighlightFunnel from './HighlightFunnel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HighlightFunnel, { ClientProvider }); diff --git a/docs/data/charts/funnel/PyramidFunnel.tsx b/docs/data/charts/funnel/demos/pyramid-funnel/PyramidFunnel.tsx similarity index 89% rename from docs/data/charts/funnel/PyramidFunnel.tsx rename to docs/data/charts/funnel/demos/pyramid-funnel/PyramidFunnel.tsx index 9f96f00cfe6f0..b1f550d235762 100644 --- a/docs/data/charts/funnel/PyramidFunnel.tsx +++ b/docs/data/charts/funnel/demos/pyramid-funnel/PyramidFunnel.tsx @@ -4,6 +4,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function PyramidFunnel() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/funnel/demos/pyramid-funnel/client.ts b/docs/data/charts/funnel/demos/pyramid-funnel/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/funnel/demos/pyramid-funnel/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/funnel/demos/pyramid-funnel/index.ts b/docs/data/charts/funnel/demos/pyramid-funnel/index.ts new file mode 100644 index 0000000000000..8b165eff06a6f --- /dev/null +++ b/docs/data/charts/funnel/demos/pyramid-funnel/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PyramidFunnel from './PyramidFunnel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PyramidFunnel, { ClientProvider }); diff --git a/docs/data/charts/funnel/funnel.md b/docs/data/charts/funnel/funnel.md index 0b707ed96e95c..c41db808f2e2a 100644 --- a/docs/data/charts/funnel/funnel.md +++ b/docs/data/charts/funnel/funnel.md @@ -15,7 +15,7 @@ Use it for flows like audience engagement, education levels, or conversion pipel The demo below shows a simple funnel with four decreasing values. -{{"demo": "BasicFunnel.js"}} +{{"component": "file://./demos/basic-funnel/index.ts"}} ## Basics @@ -30,7 +30,7 @@ Provide a `label` in each data object for the legend text. Set `hideLegend` to `true` to hide the legend. -{{"demo": "FunnelLegend.js"}} +{{"component": "file://./demos/funnel-legend/index.ts"}} ## Pyramid chart @@ -38,20 +38,20 @@ A pyramid chart is a funnel with an inverted profile. Set the `curve` property to `'pyramid'` on the series. -{{"demo": "PyramidFunnel.js"}} +{{"component": "file://./demos/pyramid-funnel/index.ts"}} ## Labels The funnel shows labels by default (each section's `value`). Use the `valueFormatter` prop to format them. -{{"demo": "FunnelLabels.js"}} +{{"component": "file://./demos/funnel-labels/index.ts"}} ### Styling labels Use the `funnelSectionClasses.label` class to style labels. -{{"demo": "FunnelLabelStyling.js"}} +{{"component": "file://./demos/funnel-label-styling/index.ts"}} ### Positioning labels @@ -72,7 +72,7 @@ See [text-anchor](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/tex Set `sectionLabel` to `false` to hide labels. You can also pass a function that receives the data object and returns the label config. -{{"demo": "FunnelLabelPositioning.js"}} +{{"component": "file://./demos/funnel-label-positioning/index.ts"}} ## Styling @@ -81,13 +81,13 @@ You can also pass a function that receives the data object and returns the label Use the `curve` property to choose the shape between sections. It accepts `'linear'`, `'linear-sharp'`, `'bump'`, `'pyramid'`, `'step'`, or `'step-pyramid'`. -{{"demo": "FunnelCurves.js"}} +{{"component": "file://./demos/funnel-curves/index.ts"}} ### Gap Use the `gap` property to set the space between sections (in pixels). -{{"demo": "FunnelGap.js"}} +{{"component": "file://./demos/funnel-gap/index.ts"}} ### Border radius @@ -102,7 +102,7 @@ See [Curve interpolation](#curve-interpolation) for how `curve` and `borderRadiu If `gap` is 0, radius applies only to corners not connected to another section. If `gap` is greater than 0, radius applies to all corners. -{{"demo": "FunnelBorderRadius.js"}} +{{"component": "file://./demos/funnel-border-radius/index.ts"}} ### Variant @@ -113,7 +113,7 @@ Use the `variant` property to switch between styles: The `outlined` variant is lighter visually. -{{"demo": "FunnelVariant.js"}} +{{"component": "file://./demos/funnel-variant/index.ts"}} ### Colors @@ -122,7 +122,7 @@ You can customize funnel colors in two ways: 1. Pass a [color palette](/x/react-charts/styling/#built-in-color-palettes). Each section uses a color from the palette. 2. Set a `color` property on each data object to override the palette for that section. -{{"demo": "FunnelColor.js"}} +{{"component": "file://./demos/funnel-color/index.ts"}} ### CSS @@ -130,7 +130,7 @@ You can style the funnel with CSS. Each section group has a `data-series` attribute for targeting. Use `:nth-child` or `:nth-of-type` to target specific sections, as in the demo below. -{{"demo": "FunnelDataAttributes.js"}} +{{"component": "file://./demos/funnel-data-attributes/index.ts"}} ## Multiple funnels @@ -138,14 +138,14 @@ By default, multiple series are stacked. Pass multiple series and use different colors or styles to tell them apart. The first series is at the bottom, the last at the top. -{{"demo": "FunnelStacked.js"}} +{{"component": "file://./demos/funnel-stacked/index.ts"}} ## Highlight Set `highlightScope.highlight` to `'item'` to highlight the hovered section. Set `highlightScope.fade` to `'global'` to fade the other sections. -{{"demo": "HighlightFunnel.js"}} +{{"component": "file://./demos/highlight-funnel/index.ts"}} ## Category axis @@ -154,18 +154,18 @@ By default, the axis is hidden. To show it, pass `position` and `categories` to the `categoryAxis` prop. -{{"demo": "FunnelCategoryAxis.js"}} +{{"component": "file://./demos/funnel-category-axis/index.ts"}} ### Scaled sections By default, sections use the `band` scale (equal width). Set `scaleType` to `'linear'` in the `categoryAxis` configuration to scale section width by value. -{{"demo": "FunnelLinearScale.js"}} +{{"component": "file://./demos/funnel-linear-scale/index.ts"}} ### Auto-sizing axis You can set the axis `size` to `'auto'` to automatically calculate the axis dimension based on tick label measurements. This is useful when your tick labels have varying lengths. -{{"demo": "FunnelAxisAutoSize.js"}} +{{"component": "file://./demos/funnel-axis-auto-size/index.ts"}} diff --git a/docs/data/charts/gauge/ArcDesign.js b/docs/data/charts/gauge/ArcDesign.js deleted file mode 100644 index 5489b49f0b97a..0000000000000 --- a/docs/data/charts/gauge/ArcDesign.js +++ /dev/null @@ -1,27 +0,0 @@ -import { Gauge, gaugeClasses } from '@mui/x-charts/Gauge'; - -const settings = { - width: 200, - height: 200, - value: 60, -}; - -export default function ArcDesign() { - return ( - ({ - [`& .${gaugeClasses.valueText}`]: { - fontSize: 40, - }, - [`& .${gaugeClasses.valueArc}`]: { - fill: '#52b202', - }, - [`& .${gaugeClasses.referenceArc}`]: { - fill: theme.palette.text.disabled, - }, - })} - /> - ); -} diff --git a/docs/data/charts/gauge/ArcDesign.tsx.preview b/docs/data/charts/gauge/ArcDesign.tsx.preview deleted file mode 100644 index 281808d62fc78..0000000000000 --- a/docs/data/charts/gauge/ArcDesign.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - ({ - [`& .${gaugeClasses.valueText}`]: { - fontSize: 40, - }, - [`& .${gaugeClasses.valueArc}`]: { - fill: '#52b202', - }, - [`& .${gaugeClasses.referenceArc}`]: { - fill: theme.palette.text.disabled, - }, - })} -/> \ No newline at end of file diff --git a/docs/data/charts/gauge/ArcPlayground.js b/docs/data/charts/gauge/ArcPlayground.js deleted file mode 100644 index b615b086f79ec..0000000000000 --- a/docs/data/charts/gauge/ArcPlayground.js +++ /dev/null @@ -1,83 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import Box from '@mui/material/Box'; -import { Gauge, gaugeClasses } from '@mui/x-charts/Gauge'; - -export default function ArcPlayground() { - return ( - ( - - - - )} - getCode={({ props }) => { - const { innerRadius, outerRadius, ...numberProps } = props; - return `import { Gauge } from '@mui/x-charts/Gauge'; - - `${name}={${value}}`) - .join('\n ')} - ${Object.entries({ innerRadius, outerRadius }) - .map(([name, value]) => `${name}="${value}%"`) - .join('\n ')} - // ... -/> -`; - }} - /> - ); -} diff --git a/docs/data/charts/gauge/BasicGauges.js b/docs/data/charts/gauge/BasicGauges.js deleted file mode 100644 index 014e45b14787a..0000000000000 --- a/docs/data/charts/gauge/BasicGauges.js +++ /dev/null @@ -1,11 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { Gauge } from '@mui/x-charts/Gauge'; - -export default function BasicGauges() { - return ( - - - - - ); -} diff --git a/docs/data/charts/gauge/BasicGauges.tsx.preview b/docs/data/charts/gauge/BasicGauges.tsx.preview deleted file mode 100644 index 7edb64600ff68..0000000000000 --- a/docs/data/charts/gauge/BasicGauges.tsx.preview +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/gauge/CompositionExample.js b/docs/data/charts/gauge/CompositionExample.js deleted file mode 100644 index abdaa9cdf8a14..0000000000000 --- a/docs/data/charts/gauge/CompositionExample.js +++ /dev/null @@ -1,46 +0,0 @@ -import { - GaugeContainer, - GaugeValueArc, - GaugeReferenceArc, - useGaugeState, -} from '@mui/x-charts/Gauge'; - -function GaugePointer() { - const { valueAngle, outerRadius, cx, cy } = useGaugeState(); - - if (valueAngle === null) { - // No value to display - return null; - } - - const target = { - x: cx + outerRadius * Math.sin(valueAngle), - y: cy - outerRadius * Math.cos(valueAngle), - }; - return ( - - - - - ); -} - -export default function CompositionExample() { - return ( - - - - - - ); -} diff --git a/docs/data/charts/gauge/CompositionExample.tsx b/docs/data/charts/gauge/CompositionExample.tsx deleted file mode 100644 index abdaa9cdf8a14..0000000000000 --- a/docs/data/charts/gauge/CompositionExample.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { - GaugeContainer, - GaugeValueArc, - GaugeReferenceArc, - useGaugeState, -} from '@mui/x-charts/Gauge'; - -function GaugePointer() { - const { valueAngle, outerRadius, cx, cy } = useGaugeState(); - - if (valueAngle === null) { - // No value to display - return null; - } - - const target = { - x: cx + outerRadius * Math.sin(valueAngle), - y: cy - outerRadius * Math.cos(valueAngle), - }; - return ( - - - - - ); -} - -export default function CompositionExample() { - return ( - - - - - - ); -} diff --git a/docs/data/charts/gauge/CompositionExample.tsx.preview b/docs/data/charts/gauge/CompositionExample.tsx.preview deleted file mode 100644 index 2675af81dc021..0000000000000 --- a/docs/data/charts/gauge/CompositionExample.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/data/charts/gauge/GaugeValueRange.js b/docs/data/charts/gauge/GaugeValueRange.js deleted file mode 100644 index a5915eafc8b3b..0000000000000 --- a/docs/data/charts/gauge/GaugeValueRange.js +++ /dev/null @@ -1,11 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { Gauge } from '@mui/x-charts/Gauge'; - -export default function GaugeValueRange() { - return ( - - - - - ); -} diff --git a/docs/data/charts/gauge/GaugeValueRange.tsx.preview b/docs/data/charts/gauge/GaugeValueRange.tsx.preview deleted file mode 100644 index bd671b68b19b2..0000000000000 --- a/docs/data/charts/gauge/GaugeValueRange.tsx.preview +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/gauge/TextPlayground.js b/docs/data/charts/gauge/TextPlayground.js deleted file mode 100644 index 84ea83a8077a4..0000000000000 --- a/docs/data/charts/gauge/TextPlayground.js +++ /dev/null @@ -1,81 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import Box from '@mui/material/Box'; -import { Gauge, gaugeClasses } from '@mui/x-charts/Gauge'; - -export default function TextPlayground() { - return ( - ( - - `${value} / ${valueMax}`} - /> - - )} - getCode={({ - props, - }) => `import { Gauge, gaugeClasses } from '@mui/x-charts/Gauge'; - - \`\${value} / \${valueMax}\`} -/> -`} - /> - ); -} diff --git a/docs/data/charts/gauge/ArcDesign.tsx b/docs/data/charts/gauge/demos/arc-design/ArcDesign.tsx similarity index 91% rename from docs/data/charts/gauge/ArcDesign.tsx rename to docs/data/charts/gauge/demos/arc-design/ArcDesign.tsx index 5489b49f0b97a..132b303bc400b 100644 --- a/docs/data/charts/gauge/ArcDesign.tsx +++ b/docs/data/charts/gauge/demos/arc-design/ArcDesign.tsx @@ -8,6 +8,7 @@ const settings = { export default function ArcDesign() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/gauge/demos/arc-design/client.ts b/docs/data/charts/gauge/demos/arc-design/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/gauge/demos/arc-design/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/gauge/demos/arc-design/index.ts b/docs/data/charts/gauge/demos/arc-design/index.ts new file mode 100644 index 0000000000000..b70de41176124 --- /dev/null +++ b/docs/data/charts/gauge/demos/arc-design/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ArcDesign from './ArcDesign'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ArcDesign, { ClientProvider }); diff --git a/docs/data/charts/gauge/ArcPlayground.tsx b/docs/data/charts/gauge/demos/arc-playground/ArcPlayground.tsx similarity index 97% rename from docs/data/charts/gauge/ArcPlayground.tsx rename to docs/data/charts/gauge/demos/arc-playground/ArcPlayground.tsx index b615b086f79ec..885d13a2403b4 100644 --- a/docs/data/charts/gauge/ArcPlayground.tsx +++ b/docs/data/charts/gauge/demos/arc-playground/ArcPlayground.tsx @@ -4,6 +4,7 @@ import { Gauge, gaugeClasses } from '@mui/x-charts/Gauge'; export default function ArcPlayground() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/gauge/demos/arc-playground/client.ts b/docs/data/charts/gauge/demos/arc-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/gauge/demos/arc-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/gauge/demos/arc-playground/index.ts b/docs/data/charts/gauge/demos/arc-playground/index.ts new file mode 100644 index 0000000000000..48443a23f403d --- /dev/null +++ b/docs/data/charts/gauge/demos/arc-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ArcPlayground from './ArcPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ArcPlayground, { ClientProvider }); diff --git a/docs/data/charts/gauge/BasicGauges.tsx b/docs/data/charts/gauge/demos/basic-gauges/BasicGauges.tsx similarity index 87% rename from docs/data/charts/gauge/BasicGauges.tsx rename to docs/data/charts/gauge/demos/basic-gauges/BasicGauges.tsx index 014e45b14787a..3e9e0b23c9913 100644 --- a/docs/data/charts/gauge/BasicGauges.tsx +++ b/docs/data/charts/gauge/demos/basic-gauges/BasicGauges.tsx @@ -4,8 +4,10 @@ import { Gauge } from '@mui/x-charts/Gauge'; export default function BasicGauges() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/gauge/demos/basic-gauges/client.ts b/docs/data/charts/gauge/demos/basic-gauges/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/gauge/demos/basic-gauges/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/gauge/demos/basic-gauges/index.ts b/docs/data/charts/gauge/demos/basic-gauges/index.ts new file mode 100644 index 0000000000000..5c34ee131942c --- /dev/null +++ b/docs/data/charts/gauge/demos/basic-gauges/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicGauges from './BasicGauges'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicGauges, { ClientProvider }); diff --git a/docs/data/charts/gauge/demos/composition-example/CompositionExample.tsx b/docs/data/charts/gauge/demos/composition-example/CompositionExample.tsx new file mode 100644 index 0000000000000..69f11ae594435 --- /dev/null +++ b/docs/data/charts/gauge/demos/composition-example/CompositionExample.tsx @@ -0,0 +1,48 @@ +import { + GaugeContainer, + GaugeValueArc, + GaugeReferenceArc, + useGaugeState, +} from '@mui/x-charts/Gauge'; + +function GaugePointer() { + const { valueAngle, outerRadius, cx, cy } = useGaugeState(); + + if (valueAngle === null) { + // No value to display + return null; + } + + const target = { + x: cx + outerRadius * Math.sin(valueAngle), + y: cy - outerRadius * Math.cos(valueAngle), + }; + return ( + + + + + ); +} + +export default function CompositionExample() { + return ( + // @focus-start @padding 2 + + + + + + // @focus-end + ); +} diff --git a/docs/data/charts/gauge/demos/composition-example/client.ts b/docs/data/charts/gauge/demos/composition-example/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/gauge/demos/composition-example/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/gauge/demos/composition-example/index.ts b/docs/data/charts/gauge/demos/composition-example/index.ts new file mode 100644 index 0000000000000..7a03486adc223 --- /dev/null +++ b/docs/data/charts/gauge/demos/composition-example/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CompositionExample from './CompositionExample'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CompositionExample, { ClientProvider }); diff --git a/docs/data/charts/gauge/GaugeValueRange.tsx b/docs/data/charts/gauge/demos/gauge-value-range/GaugeValueRange.tsx similarity index 87% rename from docs/data/charts/gauge/GaugeValueRange.tsx rename to docs/data/charts/gauge/demos/gauge-value-range/GaugeValueRange.tsx index a5915eafc8b3b..9cb0e401b65d7 100644 --- a/docs/data/charts/gauge/GaugeValueRange.tsx +++ b/docs/data/charts/gauge/demos/gauge-value-range/GaugeValueRange.tsx @@ -4,8 +4,10 @@ import { Gauge } from '@mui/x-charts/Gauge'; export default function GaugeValueRange() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/gauge/demos/gauge-value-range/client.ts b/docs/data/charts/gauge/demos/gauge-value-range/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/gauge/demos/gauge-value-range/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/gauge/demos/gauge-value-range/index.ts b/docs/data/charts/gauge/demos/gauge-value-range/index.ts new file mode 100644 index 0000000000000..1a27cfccee1d7 --- /dev/null +++ b/docs/data/charts/gauge/demos/gauge-value-range/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GaugeValueRange from './GaugeValueRange'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GaugeValueRange, { ClientProvider }); diff --git a/docs/data/charts/gauge/TextPlayground.tsx b/docs/data/charts/gauge/demos/text-playground/TextPlayground.tsx similarity index 97% rename from docs/data/charts/gauge/TextPlayground.tsx rename to docs/data/charts/gauge/demos/text-playground/TextPlayground.tsx index 84ea83a8077a4..0b46a62445b23 100644 --- a/docs/data/charts/gauge/TextPlayground.tsx +++ b/docs/data/charts/gauge/demos/text-playground/TextPlayground.tsx @@ -4,6 +4,7 @@ import { Gauge, gaugeClasses } from '@mui/x-charts/Gauge'; export default function TextPlayground() { return ( + // @focus-start @padding 2 `} /> + // @focus-end ); } diff --git a/docs/data/charts/gauge/demos/text-playground/client.ts b/docs/data/charts/gauge/demos/text-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/gauge/demos/text-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/gauge/demos/text-playground/index.ts b/docs/data/charts/gauge/demos/text-playground/index.ts new file mode 100644 index 0000000000000..d1a79dea35904 --- /dev/null +++ b/docs/data/charts/gauge/demos/text-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TextPlayground from './TextPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TextPlayground, { ClientProvider }); diff --git a/docs/data/charts/gauge/gauge.md b/docs/data/charts/gauge/gauge.md index 9823c839dfc0a..82f969c723a78 100644 --- a/docs/data/charts/gauge/gauge.md +++ b/docs/data/charts/gauge/gauge.md @@ -20,7 +20,7 @@ Use it for metrics like progress, capacity, or levels (for example, battery, sto The demo below shows basic gauge configurations. -{{"demo": "BasicGauges.js"}} +{{"component": "file://./demos/basic-gauges/index.ts"}} ## Basics @@ -28,7 +28,7 @@ Pass the current value with the `value` prop. By default, the scale runs from 0 through 100. Use `valueMin` and `valueMax` to set a different range. -{{"demo": "GaugeValueRange.js"}} +{{"component": "file://./demos/gauge-value-range/index.ts"}} ## Arc configuration @@ -38,7 +38,7 @@ Use these props to change the arc shape: - `innerRadius` and `outerRadius`: arc radii, as a pixel value or a percentage string (such as `'50%'`) - `cornerRadius`: corner rounding, as a pixel value or percentage string -{{"demo": "ArcPlayground.js", "bg": "playground", "hideToolbar": true}} +{{"component": "file://./demos/arc-playground/index.ts", "bg": "playground", "hideToolbar": true}} :::success The arc is positioned to use as much of the drawing area as possible. @@ -55,7 +55,7 @@ The formatter receives an object with `value`, `valueMin`, and `valueMax`. Use the `gaugeClasses.valueText` class to change the text layout. -{{"demo": "TextPlayground.js", "bg": "playground", "hideToolbar": true}} +{{"component": "file://./demos/text-playground/index.ts", "bg": "playground", "hideToolbar": true}} ## Arc design @@ -63,7 +63,7 @@ Use the `gaugeClasses` export for class names that target different parts of the See [Gauge—Classes](/x/api/charts/gauge/#classes) for the full list. -{{"demo": "ArcDesign.js"}} +{{"component": "file://./demos/arc-design/index.ts"}} ## Adding elements @@ -111,7 +111,7 @@ It returns: - Arc geometry: `startAngle`, `endAngle`, `outerRadius`, `innerRadius`, `cornerRadius`, `cx`, `cy` - Computed: `maxRadius` (largest radius that fits the drawing area) and `valueAngle` (angle for the current value) -{{"demo": "CompositionExample.js"}} +{{"component": "file://./demos/composition-example/index.ts"}} ## Accessibility diff --git a/docs/data/charts/heatmap/BasicHeatmap.js b/docs/data/charts/heatmap/BasicHeatmap.js deleted file mode 100644 index 187f0de9ef0a0..0000000000000 --- a/docs/data/charts/heatmap/BasicHeatmap.js +++ /dev/null @@ -1,16 +0,0 @@ -import Box from '@mui/material/Box'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; - -export default function BasicHeatmap() { - return ( - - - - ); -} diff --git a/docs/data/charts/heatmap/BasicHeatmap.tsx.preview b/docs/data/charts/heatmap/BasicHeatmap.tsx.preview deleted file mode 100644 index 25a16edf33280..0000000000000 --- a/docs/data/charts/heatmap/BasicHeatmap.tsx.preview +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/heatmap/ColorConfig.js b/docs/data/charts/heatmap/ColorConfig.js deleted file mode 100644 index f991a6e7fbca2..0000000000000 --- a/docs/data/charts/heatmap/ColorConfig.js +++ /dev/null @@ -1,123 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { interpolateBlues } from 'd3-scale-chromatic'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; - -const dataset = [ - { - london: 59, - paris: 57, - newYork: 86, - seoul: 21, - month: 'January', - }, - { - london: 50, - paris: 52, - newYork: 78, - seoul: 28, - month: 'February', - }, - { - london: 47, - paris: 53, - newYork: 106, - seoul: 41, - month: 'March', - }, - { - london: 54, - paris: 56, - newYork: 92, - seoul: 73, - month: 'April', - }, - { - london: 57, - paris: 69, - newYork: 92, - seoul: 99, - month: 'May', - }, - { - london: 60, - paris: 63, - newYork: 103, - seoul: 144, - month: 'June', - }, - { - london: 59, - paris: 60, - newYork: 105, - seoul: 319, - month: 'July', - }, - { - london: 65, - paris: 60, - newYork: 106, - seoul: 249, - month: 'August', - }, - { - london: 51, - paris: 51, - newYork: 95, - seoul: 131, - month: 'September', - }, - { - london: 60, - paris: 65, - newYork: 97, - seoul: 55, - month: 'October', - }, - { - london: 67, - paris: 64, - newYork: 76, - seoul: 48, - month: 'November', - }, - { - london: 61, - paris: 70, - newYork: 103, - seoul: 25, - month: 'December', - }, -]; - -const data = dataset.flatMap(({ london, paris, newYork, seoul }, monthIndex) => [ - [0, monthIndex, london], - [1, monthIndex, paris], - [2, monthIndex, newYork], - [3, monthIndex, seoul], -]); - -const xData = ['London', 'Paris', 'New York', 'Seoul']; -const yData = dataset.flatMap(({ month }) => month); - -export default function ColorConfig() { - return ( - - - - ); -} diff --git a/docs/data/charts/heatmap/ColorConfig.tsx.preview b/docs/data/charts/heatmap/ColorConfig.tsx.preview deleted file mode 100644 index c68bc11c09e9c..0000000000000 --- a/docs/data/charts/heatmap/ColorConfig.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/heatmap/CustomItem.js b/docs/data/charts/heatmap/CustomItem.js deleted file mode 100644 index f1a5cbcadeb29..0000000000000 --- a/docs/data/charts/heatmap/CustomItem.js +++ /dev/null @@ -1,44 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; - -function CustomCell(props) { - const { x, y, width, height, ownerState, ...other } = props; - - return ( - - - - {ownerState.value} - - - ); -} -export default function CustomItem() { - return ( - - - - ); -} diff --git a/docs/data/charts/heatmap/CustomItem.tsx.preview b/docs/data/charts/heatmap/CustomItem.tsx.preview deleted file mode 100644 index b1f5b7ee147af..0000000000000 --- a/docs/data/charts/heatmap/CustomItem.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/heatmap/HeatmapCellClick.js b/docs/data/charts/heatmap/HeatmapCellClick.js deleted file mode 100644 index 15ae841f878dc..0000000000000 --- a/docs/data/charts/heatmap/HeatmapCellClick.js +++ /dev/null @@ -1,65 +0,0 @@ -import * as React from 'react'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; - -import { data } from './dumbData'; - -export default function HeatmapCellClick() { - const [cellData, setCellData] = React.useState(null); - - return ( - - - index !== 5 && index !== 13), - highlightScope: { highlight: 'item' }, - }, - ]} - height={300} - onItemClick={(event, params) => setCellData(params)} - /> - - - - - Click on the chart - { - setCellData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/heatmap/HeatmapDemo.js b/docs/data/charts/heatmap/HeatmapDemo.js deleted file mode 100644 index 46b03512d87eb..0000000000000 --- a/docs/data/charts/heatmap/HeatmapDemo.js +++ /dev/null @@ -1,120 +0,0 @@ -import { interpolateBlues } from 'd3-scale-chromatic'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; - -import bikeData from '../dataset/ParisBicycle.json'; - -const days = [ - new Date(2025, 1, 24), - new Date(2025, 1, 25), - new Date(2025, 1, 26), - new Date(2025, 1, 27), - new Date(2025, 1, 28), - new Date(2025, 2, 1), - new Date(2025, 2, 2), -]; - -const hours = [ - '00', - '01', - '02', - '03', - '04', - '05', - '06', - '07', - '08', - '09', - '10', - '11', - '12', - '13', - '14', - '15', - '16', - '17', - '18', - '19', - '20', - '21', - '22', - '23', -]; - -const shortDayFormatter = new Intl.DateTimeFormat('en-US', { weekday: 'short' }) - .format; -const dateFormatter = new Intl.DateTimeFormat('en-US', { - weekday: 'short', - day: 'numeric', - month: 'short', - year: 'numeric', -}).format; - -export default function HeatmapDemo() { - return ( - - - Bicycle count: Paris - Rivoli street (West-East) - -
- { - return context.location === 'tick' - ? shortDayFormatter(value) - : dateFormatter(value); - }, - tickLabelStyle: { angle: 45 }, - height: 70, - }, - ]} - yAxis={[ - { - data: hours, - label: 'Hour of the day', - tickLabelInterval: (_, index) => index % 2 === 0, - valueFormatter: (value) => `${value}h`, - width: 60, - }, - ]} - series={[ - { - data: bikeData, - label: 'Bicycle count', - highlightScope: { highlight: 'item', fade: 'global' }, - }, - ]} - zAxis={[ - { - colorMap: { - max: 700, - type: 'continuous', - color: (t) => interpolateBlues(Math.sqrt(t)), - }, - }, - ]} - hideLegend={false} - slotProps={{ - legend: { - direction: 'vertical', - position: { vertical: 'top' }, - sx: { height: 200 }, - }, - }} - /> -
- - Data from{' '} - - Paris Data - - -
- ); -} diff --git a/docs/data/charts/heatmap/HeatmapLegend.js b/docs/data/charts/heatmap/HeatmapLegend.js deleted file mode 100644 index 151eccb817d33..0000000000000 --- a/docs/data/charts/heatmap/HeatmapLegend.js +++ /dev/null @@ -1,24 +0,0 @@ -import Box from '@mui/material/Box'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; - -export default function HeatmapLegend() { - return ( - - - - ); -} diff --git a/docs/data/charts/heatmap/HeatmapLegend.tsx.preview b/docs/data/charts/heatmap/HeatmapLegend.tsx.preview deleted file mode 100644 index de681335fc0c2..0000000000000 --- a/docs/data/charts/heatmap/HeatmapLegend.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/heatmap/HighlightClasses.js b/docs/data/charts/heatmap/HighlightClasses.js deleted file mode 100644 index 00ebec1ad8617..0000000000000 --- a/docs/data/charts/heatmap/HighlightClasses.js +++ /dev/null @@ -1,35 +0,0 @@ -import Box from '@mui/material/Box'; -import { Heatmap, heatmapClasses } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; - -export default function HighlightClasses() { - return ( - - - - ); -} diff --git a/docs/data/charts/heatmap/HighlightHeatmap.js b/docs/data/charts/heatmap/HighlightHeatmap.js deleted file mode 100644 index fd476f42cd1d3..0000000000000 --- a/docs/data/charts/heatmap/HighlightHeatmap.js +++ /dev/null @@ -1,16 +0,0 @@ -import Box from '@mui/material/Box'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; - -export default function HighlightHeatmap() { - return ( - - - - ); -} diff --git a/docs/data/charts/heatmap/HighlightHeatmap.tsx.preview b/docs/data/charts/heatmap/HighlightHeatmap.tsx.preview deleted file mode 100644 index 7041a75d64ae4..0000000000000 --- a/docs/data/charts/heatmap/HighlightHeatmap.tsx.preview +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/heatmap/WebGLHeatmap.js b/docs/data/charts/heatmap/WebGLHeatmap.js deleted file mode 100644 index c3793affd96b9..0000000000000 --- a/docs/data/charts/heatmap/WebGLHeatmap.js +++ /dev/null @@ -1,54 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { interpolateOrRd } from 'd3-scale-chromatic'; -import { HeatmapPremium } from '@mui/x-charts-premium/HeatmapPremium'; -import data from '../dataset/nyc-yellow-taxi-2024-trip-count.json'; - -const seriesData = data; -const max = Math.max(...seriesData.map(([, , value]) => value)); -const xData = Array.from({ length: 366 }, (_, i) => { - const date = new Date(2024, 0, 1); - - date.setDate(i + 1); - - return date; -}); -const yData = Array.from({ length: 24 }, (_, i) => i); - -const settings = { - xAxis: [ - { - data: xData, - ordinalTimeTicks: ['months', 'biweekly', 'weeks', 'days'], - valueFormatter: (date) => - date.toLocaleString('en-US', { month: 'short', day: 'numeric' }), - zoom: { minSpan: 3 }, - }, - ], - yAxis: [{ data: yData, valueFormatter: (hour) => `${hour}:00` }], - zAxis: [ - { - min: 0, - max, - colorMap: { - type: 'continuous', - color: interpolateOrRd, - max, - }, - }, - ], - series: [{ data: seriesData }], - height: 450, -}; - -export default function WebGLHeatmap() { - return ( - - - Yellow Taxi Trip Count - 2024 - - - Source: NYC.gov - - ); -} diff --git a/docs/data/charts/heatmap/WebGLHeatmap.tsx.preview b/docs/data/charts/heatmap/WebGLHeatmap.tsx.preview deleted file mode 100644 index 54a6600b9149e..0000000000000 --- a/docs/data/charts/heatmap/WebGLHeatmap.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - - Yellow Taxi Trip Count - 2024 - - -Source: NYC.gov \ No newline at end of file diff --git a/docs/data/charts/heatmap/BasicHeatmap.tsx b/docs/data/charts/heatmap/demos/basic-heatmap/BasicHeatmap.tsx similarity index 80% rename from docs/data/charts/heatmap/BasicHeatmap.tsx rename to docs/data/charts/heatmap/demos/basic-heatmap/BasicHeatmap.tsx index 187f0de9ef0a0..dea9136216387 100644 --- a/docs/data/charts/heatmap/BasicHeatmap.tsx +++ b/docs/data/charts/heatmap/demos/basic-heatmap/BasicHeatmap.tsx @@ -1,16 +1,18 @@ import Box from '@mui/material/Box'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; +import { data } from '../../dumbData'; export default function BasicHeatmap() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/basic-heatmap/client.ts b/docs/data/charts/heatmap/demos/basic-heatmap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/basic-heatmap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/basic-heatmap/index.ts b/docs/data/charts/heatmap/demos/basic-heatmap/index.ts new file mode 100644 index 0000000000000..5df8e883d429f --- /dev/null +++ b/docs/data/charts/heatmap/demos/basic-heatmap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicHeatmap from './BasicHeatmap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicHeatmap, { ClientProvider }); diff --git a/docs/data/charts/heatmap/ColorConfig.tsx b/docs/data/charts/heatmap/demos/color-config/ColorConfig.tsx similarity index 94% rename from docs/data/charts/heatmap/ColorConfig.tsx rename to docs/data/charts/heatmap/demos/color-config/ColorConfig.tsx index f64669f6ff717..69a944c7d2e4f 100644 --- a/docs/data/charts/heatmap/ColorConfig.tsx +++ b/docs/data/charts/heatmap/demos/color-config/ColorConfig.tsx @@ -1,7 +1,7 @@ import Stack from '@mui/material/Stack'; import { interpolateBlues } from 'd3-scale-chromatic'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { HeatmapValueType } from '@mui/x-charts-pro/models'; +import type { HeatmapValueType } from '@mui/x-charts-pro/models'; const dataset = [ { @@ -105,6 +105,7 @@ const yData = dataset.flatMap(({ month }) => month); export default function ColorConfig() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/color-config/client.ts b/docs/data/charts/heatmap/demos/color-config/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/color-config/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/color-config/index.ts b/docs/data/charts/heatmap/demos/color-config/index.ts new file mode 100644 index 0000000000000..0305df7630826 --- /dev/null +++ b/docs/data/charts/heatmap/demos/color-config/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorConfig from './ColorConfig'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorConfig, { ClientProvider }); diff --git a/docs/data/charts/heatmap/CustomItem.tsx b/docs/data/charts/heatmap/demos/custom-item/CustomItem.tsx similarity index 83% rename from docs/data/charts/heatmap/CustomItem.tsx rename to docs/data/charts/heatmap/demos/custom-item/CustomItem.tsx index 95ecaaa4c11ad..6e8a1aa87895f 100644 --- a/docs/data/charts/heatmap/CustomItem.tsx +++ b/docs/data/charts/heatmap/demos/custom-item/CustomItem.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import Box from '@mui/material/Box'; -import { Heatmap, type HeatmapCellProps } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; +import { Heatmap } from '@mui/x-charts-pro/Heatmap'; +import type { HeatmapCellProps } from '@mui/x-charts-pro/Heatmap'; +import { data } from '../../dumbData'; function CustomCell(props: HeatmapCellProps) { const { x, y, width, height, ownerState, ...other } = props; @@ -32,6 +33,7 @@ function CustomCell(props: HeatmapCellProps) { export default function CustomItem() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/custom-item/client.ts b/docs/data/charts/heatmap/demos/custom-item/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/custom-item/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/custom-item/index.ts b/docs/data/charts/heatmap/demos/custom-item/index.ts new file mode 100644 index 0000000000000..09945e2d9adee --- /dev/null +++ b/docs/data/charts/heatmap/demos/custom-item/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomItem from './CustomItem'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomItem, { ClientProvider }); diff --git a/docs/data/charts/heatmap/HeatmapCellClick.tsx b/docs/data/charts/heatmap/demos/heatmap-cell-click/HeatmapCellClick.tsx similarity index 95% rename from docs/data/charts/heatmap/HeatmapCellClick.tsx rename to docs/data/charts/heatmap/demos/heatmap-cell-click/HeatmapCellClick.tsx index 153e036d1529c..27b77c9d9eec1 100644 --- a/docs/data/charts/heatmap/HeatmapCellClick.tsx +++ b/docs/data/charts/heatmap/demos/heatmap-cell-click/HeatmapCellClick.tsx @@ -7,9 +7,10 @@ import IconButton from '@mui/material/IconButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; import type { HeatmapItemIdentifier } from '@mui/x-charts-pro/models'; -import { data } from './dumbData'; +import { data } from '../../dumbData'; export default function HeatmapCellClick() { + // @focus-start @padding 1 const [cellData, setCellData] = React.useState(null); return ( @@ -62,4 +63,5 @@ ${cellData ? JSON.stringify(cellData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/heatmap/demos/heatmap-cell-click/client.ts b/docs/data/charts/heatmap/demos/heatmap-cell-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/heatmap-cell-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/heatmap-cell-click/index.ts b/docs/data/charts/heatmap/demos/heatmap-cell-click/index.ts new file mode 100644 index 0000000000000..5c85231d3a0f9 --- /dev/null +++ b/docs/data/charts/heatmap/demos/heatmap-cell-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HeatmapCellClick from './HeatmapCellClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HeatmapCellClick, { ClientProvider }); diff --git a/docs/data/charts/heatmap/HeatmapDemo.tsx b/docs/data/charts/heatmap/demos/heatmap-demo/HeatmapDemo.tsx similarity index 94% rename from docs/data/charts/heatmap/HeatmapDemo.tsx rename to docs/data/charts/heatmap/demos/heatmap-demo/HeatmapDemo.tsx index 325d41c6a0529..067ee43b34742 100644 --- a/docs/data/charts/heatmap/HeatmapDemo.tsx +++ b/docs/data/charts/heatmap/demos/heatmap-demo/HeatmapDemo.tsx @@ -2,8 +2,8 @@ import { interpolateBlues } from 'd3-scale-chromatic'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { HeatmapValueType } from '@mui/x-charts-pro/models'; -import bikeData from '../dataset/ParisBicycle.json'; +import type { HeatmapValueType } from '@mui/x-charts-pro/models'; +import bikeData from '../../../dataset/ParisBicycle.json'; const days = [ new Date(2025, 1, 24), @@ -54,6 +54,7 @@ const dateFormatter = new Intl.DateTimeFormat('en-US', { export default function HeatmapDemo() { return ( + {/* @focus-start */} Bicycle count: Paris - Rivoli street (West-East) @@ -116,6 +117,7 @@ export default function HeatmapDemo() { Paris Data + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/heatmap-demo/client.ts b/docs/data/charts/heatmap/demos/heatmap-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/heatmap-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/heatmap-demo/index.ts b/docs/data/charts/heatmap/demos/heatmap-demo/index.ts new file mode 100644 index 0000000000000..f8e610a5cac53 --- /dev/null +++ b/docs/data/charts/heatmap/demos/heatmap-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HeatmapDemo from './HeatmapDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HeatmapDemo, { ClientProvider }); diff --git a/docs/data/charts/heatmap/HeatmapLegend.tsx b/docs/data/charts/heatmap/demos/heatmap-legend/HeatmapLegend.tsx similarity index 86% rename from docs/data/charts/heatmap/HeatmapLegend.tsx rename to docs/data/charts/heatmap/demos/heatmap-legend/HeatmapLegend.tsx index 151eccb817d33..36f6e6b785efb 100644 --- a/docs/data/charts/heatmap/HeatmapLegend.tsx +++ b/docs/data/charts/heatmap/demos/heatmap-legend/HeatmapLegend.tsx @@ -1,10 +1,11 @@ import Box from '@mui/material/Box'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; +import { data } from '../../dumbData'; export default function HeatmapLegend() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/heatmap-legend/client.ts b/docs/data/charts/heatmap/demos/heatmap-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/heatmap-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/heatmap-legend/index.ts b/docs/data/charts/heatmap/demos/heatmap-legend/index.ts new file mode 100644 index 0000000000000..e1c8bc2de11f5 --- /dev/null +++ b/docs/data/charts/heatmap/demos/heatmap-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HeatmapLegend from './HeatmapLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HeatmapLegend, { ClientProvider }); diff --git a/docs/data/charts/heatmap/HighlightClasses.tsx b/docs/data/charts/heatmap/demos/highlight-classes/HighlightClasses.tsx similarity index 90% rename from docs/data/charts/heatmap/HighlightClasses.tsx rename to docs/data/charts/heatmap/demos/highlight-classes/HighlightClasses.tsx index 00ebec1ad8617..b47b8728515ae 100644 --- a/docs/data/charts/heatmap/HighlightClasses.tsx +++ b/docs/data/charts/heatmap/demos/highlight-classes/HighlightClasses.tsx @@ -1,10 +1,11 @@ import Box from '@mui/material/Box'; import { Heatmap, heatmapClasses } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; +import { data } from '../../dumbData'; export default function HighlightClasses() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/highlight-classes/client.ts b/docs/data/charts/heatmap/demos/highlight-classes/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/highlight-classes/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/highlight-classes/index.ts b/docs/data/charts/heatmap/demos/highlight-classes/index.ts new file mode 100644 index 0000000000000..c56401fdddef1 --- /dev/null +++ b/docs/data/charts/heatmap/demos/highlight-classes/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HighlightClasses from './HighlightClasses'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HighlightClasses, { ClientProvider }); diff --git a/docs/data/charts/heatmap/HighlightHeatmap.tsx b/docs/data/charts/heatmap/demos/highlight-heatmap/HighlightHeatmap.tsx similarity index 82% rename from docs/data/charts/heatmap/HighlightHeatmap.tsx rename to docs/data/charts/heatmap/demos/highlight-heatmap/HighlightHeatmap.tsx index fd476f42cd1d3..e27088c2b2d0b 100644 --- a/docs/data/charts/heatmap/HighlightHeatmap.tsx +++ b/docs/data/charts/heatmap/demos/highlight-heatmap/HighlightHeatmap.tsx @@ -1,16 +1,18 @@ import Box from '@mui/material/Box'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { data } from './dumbData'; +import { data } from '../../dumbData'; export default function HighlightHeatmap() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/highlight-heatmap/client.ts b/docs/data/charts/heatmap/demos/highlight-heatmap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/highlight-heatmap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/highlight-heatmap/index.ts b/docs/data/charts/heatmap/demos/highlight-heatmap/index.ts new file mode 100644 index 0000000000000..1fb555b89a237 --- /dev/null +++ b/docs/data/charts/heatmap/demos/highlight-heatmap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HighlightHeatmap from './HighlightHeatmap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HighlightHeatmap, { ClientProvider }); diff --git a/docs/data/charts/heatmap/WebGLHeatmap.tsx b/docs/data/charts/heatmap/demos/web-gl-heatmap/WebGLHeatmap.tsx similarity index 83% rename from docs/data/charts/heatmap/WebGLHeatmap.tsx rename to docs/data/charts/heatmap/demos/web-gl-heatmap/WebGLHeatmap.tsx index f2cba19e026df..f3a5adfd23a5f 100644 --- a/docs/data/charts/heatmap/WebGLHeatmap.tsx +++ b/docs/data/charts/heatmap/demos/web-gl-heatmap/WebGLHeatmap.tsx @@ -1,11 +1,9 @@ import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { interpolateOrRd } from 'd3-scale-chromatic'; -import { - HeatmapPremium, - HeatmapPremiumProps, -} from '@mui/x-charts-premium/HeatmapPremium'; -import data from '../dataset/nyc-yellow-taxi-2024-trip-count.json'; +import type { HeatmapPremiumProps } from '@mui/x-charts-premium/HeatmapPremium'; +import { HeatmapPremium } from '@mui/x-charts-premium/HeatmapPremium'; +import data from '../../../dataset/nyc-yellow-taxi-2024-trip-count.json'; const seriesData = data as [number, number, number][]; const max = Math.max(...seriesData.map(([, , value]) => value)); @@ -47,11 +45,13 @@ const settings: HeatmapPremiumProps = { export default function WebGLHeatmap() { return ( + {/* @focus-start */} Yellow Taxi Trip Count - 2024 Source: NYC.gov + {/* @focus-end */} ); } diff --git a/docs/data/charts/heatmap/demos/web-gl-heatmap/client.ts b/docs/data/charts/heatmap/demos/web-gl-heatmap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/heatmap/demos/web-gl-heatmap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/heatmap/demos/web-gl-heatmap/index.ts b/docs/data/charts/heatmap/demos/web-gl-heatmap/index.ts new file mode 100644 index 0000000000000..711581a9b3bd6 --- /dev/null +++ b/docs/data/charts/heatmap/demos/web-gl-heatmap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import WebGLHeatmap from './WebGLHeatmap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, WebGLHeatmap, { ClientProvider }); diff --git a/docs/data/charts/heatmap/dumbData.ts b/docs/data/charts/heatmap/dumbData.ts index 4aa53b77c3375..25812d1b109df 100644 --- a/docs/data/charts/heatmap/dumbData.ts +++ b/docs/data/charts/heatmap/dumbData.ts @@ -1,4 +1,4 @@ -import { HeatmapValueType } from '@mui/x-charts-pro/models'; +import type { HeatmapValueType } from '@mui/x-charts-pro/models'; export const data: HeatmapValueType[] = [ [0, 0, 10], diff --git a/docs/data/charts/heatmap/heatmap.md b/docs/data/charts/heatmap/heatmap.md index a02bb614a0752..f833cfe6c774d 100644 --- a/docs/data/charts/heatmap/heatmap.md +++ b/docs/data/charts/heatmap/heatmap.md @@ -17,7 +17,7 @@ Use heatmaps to spot areas of higher or lower intensity, clusters, or anomalies. The demo below shows bicycle counts in Paris by day and hour. -{{"demo": "HeatmapDemo.js", "disableAd": true, "defaultCodeOpen": false}} +{{"component": "file://./demos/heatmap-demo/index.ts", "disableAd": true, "collapseToEmpty": true}} ## Basics @@ -40,7 +40,7 @@ The first two numbers are the cell's x and y indices, and the third is the cell Use the `xAxis` and `yAxis` props to set x and y ticks. -{{"demo": "BasicHeatmap.js"}} +{{"component": "file://./demos/basic-heatmap/index.ts"}} ### Using a dataset @@ -53,21 +53,21 @@ Use the `zAxis` configuration to customize how values map to color. You can use piecewise or continuous scales. See [Styling—Value-based colors](/x/react-charts/styling/#value-based-colors) for details. -{{"demo": "ColorConfig.js"}} +{{"component": "file://./demos/color-config/index.ts"}} ## Highlight Set `highlightScope.highlight` to `'item'` to highlight the hovered cell. Set `highlightScope.fade` to `'global'` to fade the other cells. -{{"demo": "HighlightHeatmap.js"}} +{{"component": "file://./demos/highlight-heatmap/index.ts"}} By default, the highlight and fade use the CSS `filter: saturate(...)` property. You can override the effect with the `heatmapClasses.highlighted` and `heatmapClasses.faded` classes. The demo below uses border radius on the highlighted cell and reduced saturation for faded cells. -{{"demo": "HighlightClasses.js"}} +{{"component": "file://./demos/highlight-classes/index.ts"}} ## Click events @@ -76,7 +76,7 @@ Use `onItemClick` to handle cell clicks. The handler receives the click event as the first argument and an item object as the second. The item includes `xIndex` and `yIndex` (cell position on the x- and y-axes) and, when the cell has data, `dataIndex` (index in the series `data` array). -{{"demo": "HeatmapCellClick.js"}} +{{"component": "file://./demos/heatmap-cell-click/index.ts"}} ## Shared features @@ -108,13 +108,13 @@ The heatmap includes a [`ContinuousColorLegend`](/x/react-charts/legend/#color-l Set `hideLegend` to `true` to hide the legend. Customize it with `slots.legend` and `slotProps.legend`. -{{"demo": "HeatmapLegend.js"}} +{{"component": "file://./demos/heatmap-legend/index.ts"}} ## Custom cells Use the `cell` slot to replace the default cell shape or add labels. -{{"demo": "CustomItem.js"}} +{{"component": "file://./demos/custom-item/index.ts"}} ## WebGL renderer [](/x/introduction/licensing/#premium-plan 'Premium plan') @@ -128,4 +128,4 @@ The WebGL renderer has some limitations: The demo below shows roughly 8,800 cells rendered with WebGL. -{{"demo": "WebGLHeatmap.js"}} +{{"component": "file://./demos/web-gl-heatmap/index.ts"}} diff --git a/docs/data/charts/highlighting/AxisValueHighlight.js b/docs/data/charts/highlighting/AxisValueHighlight.js deleted file mode 100644 index 47178e038f557..0000000000000 --- a/docs/data/charts/highlighting/AxisValueHighlight.js +++ /dev/null @@ -1,76 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { ChartsAxisHighlightValue } from '@mui/x-charts/ChartsAxisHighlightValue'; -import data from '../dataset/random/scatterParallel.json'; - -function valueFormatter(value) { - if (typeof value === 'number') { - return Math.round(value).toString(); - } - if (value instanceof Date) { - return value.toLocaleDateString(); - } - return value; -} - -export default function AxisValueHighlight() { - return ( -
- ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} - slotProps={{ tooltip: { trigger: 'none' } }} - axisHighlight={{ x: 'line', y: 'line' }} - > - - - - - - - - - -
- ); -} diff --git a/docs/data/charts/highlighting/AxisValueHighlightCustomization.js b/docs/data/charts/highlighting/AxisValueHighlightCustomization.js deleted file mode 100644 index ac2d6c5fccae1..0000000000000 --- a/docs/data/charts/highlighting/AxisValueHighlightCustomization.js +++ /dev/null @@ -1,91 +0,0 @@ -import { useTheme } from '@mui/material/styles'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { ChartsAxisHighlightValue } from '@mui/x-charts/ChartsAxisHighlightValue'; -import data from '../dataset/random/scatterParallel.json'; - -export default function AxisValueHighlightCustomization() { - const theme = useTheme(); - - const green = theme.palette.mode === 'dark' ? '#044412' : '#e5fedb'; - const red = theme.palette.mode === 'dark' ? '#610909' : '#fad7d2'; - const grey = theme.palette.mode === 'dark' ? '#333333' : '#cccccc'; - - return ( -
- ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} - slotProps={{ tooltip: { trigger: 'none' } }} - axisHighlight={{ x: 'line', y: 'line' }} - > - - 'without overflow'} - sx={{ - translate: '-100% -50%', - borderRadius: '8px 0 0 8px', - bgcolor: green, - }} - /> - 'with overflow'} - sx={{ borderRadius: '0 8px 8px 0', bgcolor: green }} - /> - 'this uses the max height'} - sx={{ - p: 0.5, - bgcolor: red, - maxWidth: 70, - maxHeight: 'var(--space)', - overflow: 'auto', - pointerEvents: 'auto', - }} - /> - 'this one does not'} - sx={{ - p: 0.5, - bgcolor: red, - maxWidth: 50, - }} - /> - `${Math.round(v)}`} - sx={{ - translate: '-50% -100%', - borderRadius: '8px 8px 0 0', - bgcolor: grey, - }} - /> - -
- ); -} diff --git a/docs/data/charts/highlighting/BandHighlight.js b/docs/data/charts/highlighting/BandHighlight.js deleted file mode 100644 index 6d99d08729574..0000000000000 --- a/docs/data/charts/highlighting/BandHighlight.js +++ /dev/null @@ -1,79 +0,0 @@ -import * as React from 'react'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import Stack from '@mui/material/Stack'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { legendClasses } from '@mui/x-charts/ChartsLegend'; - -const barChartsParams = { - xAxis: [{ data: ['page A', 'page B', 'page C', 'page D', 'page E'] }], - series: [ - { data: [2, 5, 3, 4, 1], stack: '1', label: 'Series x' }, - { data: [10, 3, 1, 2, 10], stack: '1', label: 'Series y' }, - { data: [10, 3, 1, 2, 10], stack: '1', label: 'Series z' }, - ], - margin: { right: 10 }, - sx: { - [`& .${legendClasses.root}`]: { - display: 'none', - }, - }, - height: 300, -}; - -export default function BandHighlight() { - const [xHighlight, setXHightlight] = React.useState('band'); - const [yHighlight, setYHightlight] = React.useState('none'); - - const handleChange = (direction) => (event) => { - if (direction === 'x') { - setXHightlight(event.target.value); - } - if (direction === 'y') { - setYHightlight(event.target.value); - } - }; - - return ( - -
- -
- - - x highlight - - } label="None" /> - } label="Line" /> - } label="Band" /> - - - - y highlight - - } label="None" /> - } label="Line" /> - - - -
- ); -} diff --git a/docs/data/charts/highlighting/BandHighlight.tsx b/docs/data/charts/highlighting/BandHighlight.tsx deleted file mode 100644 index 727897465ca0d..0000000000000 --- a/docs/data/charts/highlighting/BandHighlight.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import * as React from 'react'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import Stack from '@mui/material/Stack'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { legendClasses } from '@mui/x-charts/ChartsLegend'; - -const barChartsParams = { - xAxis: [{ data: ['page A', 'page B', 'page C', 'page D', 'page E'] }], - series: [ - { data: [2, 5, 3, 4, 1], stack: '1', label: 'Series x' }, - { data: [10, 3, 1, 2, 10], stack: '1', label: 'Series y' }, - { data: [10, 3, 1, 2, 10], stack: '1', label: 'Series z' }, - ], - margin: { right: 10 }, - sx: { - [`& .${legendClasses.root}`]: { - display: 'none', - }, - }, - height: 300, -}; - -export default function BandHighlight() { - const [xHighlight, setXHightlight] = React.useState<'band' | 'none' | 'line'>( - 'band', - ); - const [yHighlight, setYHightlight] = React.useState<'none' | 'line'>('none'); - - const handleChange = - (direction: 'x' | 'y') => (event: React.ChangeEvent) => { - if (direction === 'x') { - setXHightlight( - (event.target as HTMLInputElement).value as 'band' | 'none' | 'line', - ); - } - if (direction === 'y') { - setYHightlight((event.target as HTMLInputElement).value as 'none' | 'line'); - } - }; - - return ( - -
- -
- - - x highlight - - } label="None" /> - } label="Line" /> - } label="Band" /> - - - - y highlight - - } label="None" /> - } label="Line" /> - - - -
- ); -} diff --git a/docs/data/charts/highlighting/ControlledAxisHighlight.js b/docs/data/charts/highlighting/ControlledAxisHighlight.js deleted file mode 100644 index 0f7cc81779ef2..0000000000000 --- a/docs/data/charts/highlighting/ControlledAxisHighlight.js +++ /dev/null @@ -1,80 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import { BarChart } from '@mui/x-charts/BarChart'; -import FormControl from '@mui/material/FormControl'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import FormLabel from '@mui/material/FormLabel'; -import Radio from '@mui/material/Radio'; -import RadioGroup from '@mui/material/RadioGroup'; - -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function ControlledAxisHighlight() { - const [highlightedAxis, setHighlightedAxis] = React.useState([ - { - axisId: 'x-axis', - dataIndex: 2, - }, - ]); - - const handleAxisHighlight = (event) => { - setHighlightedAxis([ - { - axisId: 'x-axis', - dataIndex: Number(event.target.value), - }, - ]); - }; - - return ( - - - Highlighted index - - } label="0" /> - } label="1" /> - } label="2" /> - } label="3" /> - } label="4" /> - - - - setHighlightedAxis(newState)} - /> - setHighlightedAxis(newState)} - /> - - - ); -} - -const barChartsProps = { - series: [ - { data: [3, 4, 1, 6, 5], label: 'series A', id: 'A' }, - { data: [4, 3, 1, 5, 8], label: 'series B', id: 'B' }, - ], - xAxis: [{ id: 'x-axis', scaleType: 'band', data: [0, 2, 5, 10, 20] }], - height: 300, -}; - -const lineChartsProps = { - series: [ - { data: [3, 4, 1, 6, 5], label: 'series A', id: 'A' }, - { data: [4, 3, 1, 5, 8], label: 'series B', id: 'B' }, - ], - xAxis: [{ id: 'x-axis', scaleType: 'linear', data: [0, 2, 5, 10, 20] }], - height: 300, -}; diff --git a/docs/data/charts/highlighting/ControlledHighlight.js b/docs/data/charts/highlighting/ControlledHighlight.js deleted file mode 100644 index bd3e114daa895..0000000000000 --- a/docs/data/charts/highlighting/ControlledHighlight.js +++ /dev/null @@ -1,132 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; - -import { BarChart } from '@mui/x-charts/BarChart'; -import FormControl from '@mui/material/FormControl'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import FormLabel from '@mui/material/FormLabel'; -import Radio from '@mui/material/Radio'; -import RadioGroup from '@mui/material/RadioGroup'; - -export default function ControlledHighlight() { - const [highlightedItem, setHighLightedItem] = React.useState({ - seriesId: 'A', - dataIndex: 0, - }); - const [highlight, setHighlight] = React.useState('item'); - const [fade, setFade] = React.useState('global'); - - const handleHighLightedSeries = (event, newHighLightedSeries) => { - if (newHighLightedSeries !== null) { - setHighLightedItem((prev) => ({ - dataIndex: 0, - ...prev, - seriesId: newHighLightedSeries, - })); - } - }; - - const handleHighLightedItem = (event) => { - setHighLightedItem((prev) => ({ - seriesId: 'A', - ...prev, - dataIndex: Number(event.target.value), - })); - }; - - return ( - - - - - {['A', 'B'].map((type) => ( - - Series {type} - - ))} - - - Item ID - - } label="0" /> - } label="1" /> - } label="2" /> - } label="3" /> - } label="4" /> - - - - ({ - ...series, - highlightScope: { - highlight, - fade, - }, - }))} - highlightedItem={highlightedItem} - onHighlightChange={setHighLightedItem} - /> - - - setHighlight(event.target.value)} - sx={{ minWidth: 150 }} - > - none - item - series - - setFade(event.target.value)} - sx={{ minWidth: 150 }} - > - none - series - global - - - - ); -} - -const barChartsProps = { - series: [ - { data: [3, 4, 1, 6, 5], label: 'A', id: 'A' }, - { data: [4, 3, 1, 5, 8], label: 'B', id: 'B' }, - ], - height: 400, -}; diff --git a/docs/data/charts/highlighting/ElementHighlights.js b/docs/data/charts/highlighting/ElementHighlights.js deleted file mode 100644 index d962b03d9d27b..0000000000000 --- a/docs/data/charts/highlighting/ElementHighlights.js +++ /dev/null @@ -1,212 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { PieChart } from '@mui/x-charts/PieChart'; -import scatterDataset from '../dataset/random/scatterParallel.json'; - -const barChartsParams = { - series: [ - { data: [3, 4, 1, 6, 5], label: 'A' }, - { data: [4, 3, 1, 5, 8], label: 'B' }, - { data: [4, 2, 5, 4, 1], label: 'C' }, - ], - height: 400, -}; -const lineChartsParams = { - series: [ - { data: [3, 4, 1, 6, 5], label: 'A', area: false, stack: 'total' }, - { data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' }, - { data: [4, 2, 5, 4, 1], label: 'C', area: false, stack: 'total' }, - ], - xAxis: [{ data: [1, 2, 3, 4, 5], type: 'linear' }], - height: 400, -}; - -const scatterChartsParams = { - dataset: scatterDataset, - series: [ - { datasetKeys: { id: 'id', x: 'x1', y: 'y1' }, label: 'A' }, - { datasetKeys: { id: 'id', x: 'x2', y: 'y2' }, label: 'B' }, - ], - height: 400, -}; - -const pieChartsParams = { - series: [ - { - data: [{ value: 5 }, { value: 10 }, { value: 15 }], - label: 'Series 1', - outerRadius: 80, - highlight: { additionalRadius: 10 }, - }, - { - data: [{ value: 5 }, { value: 10 }, { value: 15 }], - label: 'Series 1', - innerRadius: 90, - highlight: { additionalRadius: 10 }, - }, - ], - height: 400, - margin: { top: 50, bottom: 50 }, -}; - -function CustomLine(props) { - const { d, ownerState, skipAnimation, className, ...other } = props; - - return ( - - - - - ); -} - -export default function ElementHighlights() { - const [chartType, setChartType] = React.useState('bar'); - const [withArea, setWithArea] = React.useState(false); - const [highlight, setHighlight] = React.useState('item'); - const [fade, setFade] = React.useState('global'); - - const handleChartType = (event, newChartType) => { - if (newChartType !== null) { - setChartType(newChartType); - } - }; - - return ( - - - - {['bar', 'line', 'scatter', 'pie'].map((type) => ( - - {type} - - ))} - - {chartType === 'bar' && ( - ({ - ...series, - highlightScope: { - highlight, - fade, - }, - }))} - /> - )} - - {chartType === 'line' && ( - ({ - ...series, - area: withArea, - highlightScope: { - highlight, - fade, - }, - }))} - slots={withArea ? {} : { line: CustomLine }} - /> - )} - - {chartType === 'scatter' && ( - ({ - ...series, - highlightScope: { - highlight, - fade, - }, - }))} - /> - )} - - {chartType === 'pie' && ( - ({ - ...series, - highlightScope: { - highlight, - fade, - }, - }))} - /> - )} - - - setHighlight(event.target.value)} - sx={{ minWidth: 150 }} - > - none - item - series - - setFade(event.target.value)} - sx={{ minWidth: 150 }} - > - none - series - global - - {chartType === 'line' && ( - setWithArea(event.target.checked)} - /> - } - label="Fill line area" - /> - )} - - - ); -} diff --git a/docs/data/charts/highlighting/ElementHighlights.tsx b/docs/data/charts/highlighting/ElementHighlights.tsx deleted file mode 100644 index 8bd3dac120ff1..0000000000000 --- a/docs/data/charts/highlighting/ElementHighlights.tsx +++ /dev/null @@ -1,215 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { AnimatedLineProps, LineChart } from '@mui/x-charts/LineChart'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { PieChart } from '@mui/x-charts/PieChart'; -import scatterDataset from '../dataset/random/scatterParallel.json'; - -type HighlightOptions = 'none' | 'item' | 'series'; -type FadeOptions = 'none' | 'series' | 'global'; - -const barChartsParams = { - series: [ - { data: [3, 4, 1, 6, 5], label: 'A' }, - { data: [4, 3, 1, 5, 8], label: 'B' }, - { data: [4, 2, 5, 4, 1], label: 'C' }, - ], - height: 400, -}; -const lineChartsParams = { - series: [ - { data: [3, 4, 1, 6, 5], label: 'A', area: false, stack: 'total' }, - { data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' }, - { data: [4, 2, 5, 4, 1], label: 'C', area: false, stack: 'total' }, - ], - xAxis: [{ data: [1, 2, 3, 4, 5], type: 'linear' }], - height: 400, -}; - -const scatterChartsParams = { - dataset: scatterDataset, - series: [ - { datasetKeys: { id: 'id', x: 'x1', y: 'y1' }, label: 'A' }, - { datasetKeys: { id: 'id', x: 'x2', y: 'y2' }, label: 'B' }, - ], - height: 400, -}; - -const pieChartsParams = { - series: [ - { - data: [{ value: 5 }, { value: 10 }, { value: 15 }], - label: 'Series 1', - outerRadius: 80, - highlight: { additionalRadius: 10 }, - }, - { - data: [{ value: 5 }, { value: 10 }, { value: 15 }], - label: 'Series 1', - innerRadius: 90, - highlight: { additionalRadius: 10 }, - }, - ], - height: 400, - margin: { top: 50, bottom: 50 }, -}; - -function CustomLine(props: AnimatedLineProps) { - const { d, ownerState, skipAnimation, className, ...other } = props; - - return ( - - - - - ); -} - -export default function ElementHighlights() { - const [chartType, setChartType] = React.useState('bar'); - const [withArea, setWithArea] = React.useState(false); - const [highlight, setHighlight] = React.useState('item'); - const [fade, setFade] = React.useState('global'); - - const handleChartType = (event: any, newChartType: string) => { - if (newChartType !== null) { - setChartType(newChartType); - } - }; - - return ( - - - - {['bar', 'line', 'scatter', 'pie'].map((type) => ( - - {type} - - ))} - - {chartType === 'bar' && ( - ({ - ...series, - highlightScope: { - highlight, - fade, - }, - }))} - /> - )} - - {chartType === 'line' && ( - ({ - ...series, - area: withArea, - highlightScope: { - highlight, - fade, - }, - }))} - slots={withArea ? {} : { line: CustomLine }} - /> - )} - - {chartType === 'scatter' && ( - ({ - ...series, - highlightScope: { - highlight, - fade, - }, - }))} - /> - )} - - {chartType === 'pie' && ( - ({ - ...series, - highlightScope: { - highlight, - fade, - }, - }))} - /> - )} - - - setHighlight(event.target.value as HighlightOptions)} - sx={{ minWidth: 150 }} - > - none - item - series - - setFade(event.target.value as FadeOptions)} - sx={{ minWidth: 150 }} - > - none - series - global - - {chartType === 'line' && ( - setWithArea(event.target.checked)} - /> - } - label="Fill line area" - /> - )} - - - ); -} diff --git a/docs/data/charts/highlighting/SyncHighlight.js b/docs/data/charts/highlighting/SyncHighlight.js deleted file mode 100644 index f10c5dbb539a9..0000000000000 --- a/docs/data/charts/highlighting/SyncHighlight.js +++ /dev/null @@ -1,66 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { PieChart } from '@mui/x-charts/PieChart'; - -export default function SyncHighlight() { - const [highlightedItem, setHighlightedItem] = React.useState(null); - - return ( - - - setHighlightedItem( - item ? { seriesId: item.seriesId, dataIndex: item.dataIndex } : null, - ) - } - /> - - setHighlightedItem( - item ? { seriesId: item.seriesId, dataIndex: item.dataIndex } : null, - ) - } - /> - - ); -} - -const barChartsProps = { - series: [ - { - data: [3, 4, 1, 6, 5], - id: 'sync', - highlightScope: { highlight: 'item', fade: 'global' }, - }, - ], - xAxis: [{ data: ['A', 'B', 'C', 'D', 'E'] }], - height: 200, - hideLegend: true, -}; - -const pieChartProps = { - series: [ - { - id: 'sync', - data: [ - { value: 3, label: 'A', id: 'A' }, - { value: 4, label: 'B', id: 'B' }, - { value: 1, label: 'C', id: 'C' }, - { value: 6, label: 'D', id: 'D' }, - { value: 5, label: 'E', id: 'E' }, - ], - highlightScope: { highlight: 'item', fade: 'global' }, - }, - ], - height: 150, - hideLegend: true, -}; diff --git a/docs/data/charts/highlighting/AxisValueHighlightCustomization.tsx b/docs/data/charts/highlighting/demos/axis-value-highlight-customization/AxisValueHighlightCustomization.tsx similarity index 96% rename from docs/data/charts/highlighting/AxisValueHighlightCustomization.tsx rename to docs/data/charts/highlighting/demos/axis-value-highlight-customization/AxisValueHighlightCustomization.tsx index f23b1a6907e72..de15b0fb6bbdb 100644 --- a/docs/data/charts/highlighting/AxisValueHighlightCustomization.tsx +++ b/docs/data/charts/highlighting/demos/axis-value-highlight-customization/AxisValueHighlightCustomization.tsx @@ -2,9 +2,10 @@ import { useTheme } from '@mui/material/styles'; import { ScatterChart } from '@mui/x-charts/ScatterChart'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; import { ChartsAxisHighlightValue } from '@mui/x-charts/ChartsAxisHighlightValue'; -import data from '../dataset/random/scatterParallel.json'; +import data from '../../../dataset/random/scatterParallel.json'; export default function AxisValueHighlightCustomization() { + // @focus-start @padding 1 const theme = useTheme(); const green = theme.palette.mode === 'dark' ? '#044412' : '#e5fedb'; @@ -89,4 +90,5 @@ export default function AxisValueHighlightCustomization() { ); + // @focus-end } diff --git a/docs/data/charts/highlighting/demos/axis-value-highlight-customization/client.ts b/docs/data/charts/highlighting/demos/axis-value-highlight-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/highlighting/demos/axis-value-highlight-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/highlighting/demos/axis-value-highlight-customization/index.ts b/docs/data/charts/highlighting/demos/axis-value-highlight-customization/index.ts new file mode 100644 index 0000000000000..f2b41041186db --- /dev/null +++ b/docs/data/charts/highlighting/demos/axis-value-highlight-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisValueHighlightCustomization from './AxisValueHighlightCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisValueHighlightCustomization, { ClientProvider }); diff --git a/docs/data/charts/highlighting/AxisValueHighlight.tsx b/docs/data/charts/highlighting/demos/axis-value-highlight/AxisValueHighlight.tsx similarity index 95% rename from docs/data/charts/highlighting/AxisValueHighlight.tsx rename to docs/data/charts/highlighting/demos/axis-value-highlight/AxisValueHighlight.tsx index 9a2412e4b1a58..ffcdc67a80b8d 100644 --- a/docs/data/charts/highlighting/AxisValueHighlight.tsx +++ b/docs/data/charts/highlighting/demos/axis-value-highlight/AxisValueHighlight.tsx @@ -1,7 +1,7 @@ import { ScatterChart } from '@mui/x-charts/ScatterChart'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; import { ChartsAxisHighlightValue } from '@mui/x-charts/ChartsAxisHighlightValue'; -import data from '../dataset/random/scatterParallel.json'; +import data from '../../../dataset/random/scatterParallel.json'; function valueFormatter(value: number | Date | string) { if (typeof value === 'number') { @@ -16,6 +16,7 @@ function valueFormatter(value: number | Date | string) { export default function AxisValueHighlight() { return (
+ {/* @focus-start */} + {/* @focus-end */}
); } diff --git a/docs/data/charts/highlighting/demos/axis-value-highlight/client.ts b/docs/data/charts/highlighting/demos/axis-value-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/highlighting/demos/axis-value-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/highlighting/demos/axis-value-highlight/index.ts b/docs/data/charts/highlighting/demos/axis-value-highlight/index.ts new file mode 100644 index 0000000000000..b1eb3ed5f995f --- /dev/null +++ b/docs/data/charts/highlighting/demos/axis-value-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AxisValueHighlight from './AxisValueHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AxisValueHighlight, { ClientProvider }); diff --git a/docs/data/charts/highlighting/demos/band-highlight/BandHighlight.tsx b/docs/data/charts/highlighting/demos/band-highlight/BandHighlight.tsx new file mode 100644 index 0000000000000..bb40477dabc17 --- /dev/null +++ b/docs/data/charts/highlighting/demos/band-highlight/BandHighlight.tsx @@ -0,0 +1,86 @@ +import * as React from 'react'; +import FormControl from '@mui/material/FormControl'; +import FormLabel from '@mui/material/FormLabel'; +import RadioGroup from '@mui/material/RadioGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Radio from '@mui/material/Radio'; +import Stack from '@mui/material/Stack'; +import { BarChart } from '@mui/x-charts/BarChart'; +import { legendClasses } from '@mui/x-charts/ChartsLegend'; + +const barChartsParams = { + xAxis: [{ data: ['page A', 'page B', 'page C', 'page D', 'page E'] }], + series: [ + { data: [2, 5, 3, 4, 1], stack: '1', label: 'Series x' }, + { data: [10, 3, 1, 2, 10], stack: '1', label: 'Series y' }, + { data: [10, 3, 1, 2, 10], stack: '1', label: 'Series z' }, + ], + margin: { right: 10 }, + sx: { + [`& .${legendClasses.root}`]: { + display: 'none', + }, + }, + height: 300, +}; + +export default function BandHighlight() { + // @focus-start @padding 1 + const [xHighlight, setXHightlight] = React.useState<'band' | 'none' | 'line'>( + 'band', + ); + const [yHighlight, setYHightlight] = React.useState<'none' | 'line'>('none'); + + const handleChange = + (direction: 'x' | 'y') => (event: React.ChangeEvent) => { + if (direction === 'x') { + setXHightlight( + (event.target as HTMLInputElement).value as 'band' | 'none' | 'line', + ); + } + if (direction === 'y') { + setYHightlight((event.target as HTMLInputElement).value as 'none' | 'line'); + } + }; + + return ( + +
+ +
+ + + x highlight + + } label="None" /> + } label="Line" /> + } label="Band" /> + + + + y highlight + + } label="None" /> + } label="Line" /> + + + +
+ ); + // @focus-end +} diff --git a/docs/data/charts/highlighting/demos/band-highlight/client.ts b/docs/data/charts/highlighting/demos/band-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/highlighting/demos/band-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/highlighting/demos/band-highlight/index.ts b/docs/data/charts/highlighting/demos/band-highlight/index.ts new file mode 100644 index 0000000000000..64f303920e7f0 --- /dev/null +++ b/docs/data/charts/highlighting/demos/band-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BandHighlight from './BandHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BandHighlight, { ClientProvider }); diff --git a/docs/data/charts/highlighting/ControlledAxisHighlight.tsx b/docs/data/charts/highlighting/demos/controlled-axis-highlight/ControlledAxisHighlight.tsx similarity index 88% rename from docs/data/charts/highlighting/ControlledAxisHighlight.tsx rename to docs/data/charts/highlighting/demos/controlled-axis-highlight/ControlledAxisHighlight.tsx index d36133912c7b5..4b5927b8795d3 100644 --- a/docs/data/charts/highlighting/ControlledAxisHighlight.tsx +++ b/docs/data/charts/highlighting/demos/controlled-axis-highlight/ControlledAxisHighlight.tsx @@ -1,16 +1,19 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; -import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; import FormControl from '@mui/material/FormControl'; import FormControlLabel from '@mui/material/FormControlLabel'; import FormLabel from '@mui/material/FormLabel'; import Radio from '@mui/material/Radio'; import RadioGroup from '@mui/material/RadioGroup'; -import { AxisItemIdentifier } from '@mui/x-charts/models'; -import { LineChart, LineChartProps } from '@mui/x-charts/LineChart'; +import type { AxisItemIdentifier } from '@mui/x-charts/models'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; export default function ControlledAxisHighlight() { + // @focus-start @padding 1 const [highlightedAxis, setHighlightedAxis] = React.useState( [ { @@ -61,6 +64,7 @@ export default function ControlledAxisHighlight() { ); + // @focus-end } const barChartsProps: BarChartProps = { diff --git a/docs/data/charts/highlighting/demos/controlled-axis-highlight/client.ts b/docs/data/charts/highlighting/demos/controlled-axis-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/highlighting/demos/controlled-axis-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/highlighting/demos/controlled-axis-highlight/index.ts b/docs/data/charts/highlighting/demos/controlled-axis-highlight/index.ts new file mode 100644 index 0000000000000..c6fd5fea2e1b2 --- /dev/null +++ b/docs/data/charts/highlighting/demos/controlled-axis-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ControlledAxisHighlight from './ControlledAxisHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ControlledAxisHighlight, { ClientProvider }); diff --git a/docs/data/charts/highlighting/ControlledHighlight.tsx b/docs/data/charts/highlighting/demos/controlled-highlight/ControlledHighlight.tsx similarity index 95% rename from docs/data/charts/highlighting/ControlledHighlight.tsx rename to docs/data/charts/highlighting/demos/controlled-highlight/ControlledHighlight.tsx index 5780ae08a18ac..b21784258731e 100644 --- a/docs/data/charts/highlighting/ControlledHighlight.tsx +++ b/docs/data/charts/highlighting/demos/controlled-highlight/ControlledHighlight.tsx @@ -5,8 +5,9 @@ import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; import ToggleButton from '@mui/material/ToggleButton'; -import { HighlightItemIdentifier } from '@mui/x-charts/models'; -import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; +import type { HighlightItemIdentifier } from '@mui/x-charts/models'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; import FormControl from '@mui/material/FormControl'; import FormControlLabel from '@mui/material/FormControlLabel'; import FormLabel from '@mui/material/FormLabel'; @@ -14,6 +15,7 @@ import Radio from '@mui/material/Radio'; import RadioGroup from '@mui/material/RadioGroup'; export default function ControlledHighlight() { + // @focus-start @padding 1 const [highlightedItem, setHighLightedItem] = React.useState | null>({ seriesId: 'A', @@ -128,6 +130,7 @@ export default function ControlledHighlight() { ); + // @focus-end } const barChartsProps: BarChartProps = { diff --git a/docs/data/charts/highlighting/demos/controlled-highlight/client.ts b/docs/data/charts/highlighting/demos/controlled-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/highlighting/demos/controlled-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/highlighting/demos/controlled-highlight/index.ts b/docs/data/charts/highlighting/demos/controlled-highlight/index.ts new file mode 100644 index 0000000000000..3902e32b529a6 --- /dev/null +++ b/docs/data/charts/highlighting/demos/controlled-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ControlledHighlight from './ControlledHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ControlledHighlight, { ClientProvider }); diff --git a/docs/data/charts/highlighting/demos/element-highlights/ElementHighlights.tsx b/docs/data/charts/highlighting/demos/element-highlights/ElementHighlights.tsx new file mode 100644 index 0000000000000..544662a50aac8 --- /dev/null +++ b/docs/data/charts/highlighting/demos/element-highlights/ElementHighlights.tsx @@ -0,0 +1,218 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import Box from '@mui/material/Box'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import ToggleButton from '@mui/material/ToggleButton'; +import { BarChart } from '@mui/x-charts/BarChart'; +import type { AnimatedLineProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import { PieChart } from '@mui/x-charts/PieChart'; +import scatterDataset from '../../../dataset/random/scatterParallel.json'; + +type HighlightOptions = 'none' | 'item' | 'series'; +type FadeOptions = 'none' | 'series' | 'global'; + +const barChartsParams = { + series: [ + { data: [3, 4, 1, 6, 5], label: 'A' }, + { data: [4, 3, 1, 5, 8], label: 'B' }, + { data: [4, 2, 5, 4, 1], label: 'C' }, + ], + height: 400, +}; +const lineChartsParams = { + series: [ + { data: [3, 4, 1, 6, 5], label: 'A', area: false, stack: 'total' }, + { data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' }, + { data: [4, 2, 5, 4, 1], label: 'C', area: false, stack: 'total' }, + ], + xAxis: [{ data: [1, 2, 3, 4, 5], type: 'linear' }], + height: 400, +}; + +const scatterChartsParams = { + dataset: scatterDataset, + series: [ + { datasetKeys: { id: 'id', x: 'x1', y: 'y1' }, label: 'A' }, + { datasetKeys: { id: 'id', x: 'x2', y: 'y2' }, label: 'B' }, + ], + height: 400, +}; + +const pieChartsParams = { + series: [ + { + data: [{ value: 5 }, { value: 10 }, { value: 15 }], + label: 'Series 1', + outerRadius: 80, + highlight: { additionalRadius: 10 }, + }, + { + data: [{ value: 5 }, { value: 10 }, { value: 15 }], + label: 'Series 1', + innerRadius: 90, + highlight: { additionalRadius: 10 }, + }, + ], + height: 400, + margin: { top: 50, bottom: 50 }, +}; + +function CustomLine(props: AnimatedLineProps) { + const { d, ownerState, skipAnimation, className, ...other } = props; + + return ( + + + + + ); +} + +export default function ElementHighlights() { + // @focus-start @padding 1 + const [chartType, setChartType] = React.useState('bar'); + const [withArea, setWithArea] = React.useState(false); + const [highlight, setHighlight] = React.useState('item'); + const [fade, setFade] = React.useState('global'); + + const handleChartType = (event: any, newChartType: string) => { + if (newChartType !== null) { + setChartType(newChartType); + } + }; + + return ( + + + + {['bar', 'line', 'scatter', 'pie'].map((type) => ( + + {type} + + ))} + + {chartType === 'bar' && ( + ({ + ...series, + highlightScope: { + highlight, + fade, + }, + }))} + /> + )} + + {chartType === 'line' && ( + ({ + ...series, + area: withArea, + highlightScope: { + highlight, + fade, + }, + }))} + slots={withArea ? {} : { line: CustomLine }} + /> + )} + + {chartType === 'scatter' && ( + ({ + ...series, + highlightScope: { + highlight, + fade, + }, + }))} + /> + )} + + {chartType === 'pie' && ( + ({ + ...series, + highlightScope: { + highlight, + fade, + }, + }))} + /> + )} + + + setHighlight(event.target.value as HighlightOptions)} + sx={{ minWidth: 150 }} + > + none + item + series + + setFade(event.target.value as FadeOptions)} + sx={{ minWidth: 150 }} + > + none + series + global + + {chartType === 'line' && ( + setWithArea(event.target.checked)} + /> + } + label="Fill line area" + /> + )} + + + ); + // @focus-end +} diff --git a/docs/data/charts/highlighting/demos/element-highlights/client.ts b/docs/data/charts/highlighting/demos/element-highlights/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/highlighting/demos/element-highlights/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/highlighting/demos/element-highlights/index.ts b/docs/data/charts/highlighting/demos/element-highlights/index.ts new file mode 100644 index 0000000000000..0b59dc2ef94e8 --- /dev/null +++ b/docs/data/charts/highlighting/demos/element-highlights/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ElementHighlights from './ElementHighlights'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ElementHighlights, { ClientProvider }); diff --git a/docs/data/charts/highlighting/SyncHighlight.tsx b/docs/data/charts/highlighting/demos/sync-highlight/SyncHighlight.tsx similarity index 83% rename from docs/data/charts/highlighting/SyncHighlight.tsx rename to docs/data/charts/highlighting/demos/sync-highlight/SyncHighlight.tsx index 303d13cd7e86c..9a677b9f18c39 100644 --- a/docs/data/charts/highlighting/SyncHighlight.tsx +++ b/docs/data/charts/highlighting/demos/sync-highlight/SyncHighlight.tsx @@ -1,10 +1,13 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; -import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; -import { PieChart, PieChartProps } from '@mui/x-charts/PieChart'; -import { HighlightItemIdentifier } from '@mui/x-charts/models'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; +import type { PieChartProps } from '@mui/x-charts/PieChart'; +import { PieChart } from '@mui/x-charts/PieChart'; +import type { HighlightItemIdentifier } from '@mui/x-charts/models'; export default function SyncHighlight() { + // @focus-start @padding 1 const [highlightedItem, setHighlightedItem] = React.useState | null>(null); @@ -34,6 +37,7 @@ export default function SyncHighlight() { /> ); + // @focus-end } const barChartsProps: BarChartProps = { diff --git a/docs/data/charts/highlighting/demos/sync-highlight/client.ts b/docs/data/charts/highlighting/demos/sync-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/highlighting/demos/sync-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/highlighting/demos/sync-highlight/index.ts b/docs/data/charts/highlighting/demos/sync-highlight/index.ts new file mode 100644 index 0000000000000..497e59ef903e1 --- /dev/null +++ b/docs/data/charts/highlighting/demos/sync-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SyncHighlight from './SyncHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SyncHighlight, { ClientProvider }); diff --git a/docs/data/charts/highlighting/highlighting.md b/docs/data/charts/highlighting/highlighting.md index 494aad515822d..8fa9e02e0c19e 100644 --- a/docs/data/charts/highlighting/highlighting.md +++ b/docs/data/charts/highlighting/highlighting.md @@ -25,7 +25,7 @@ axisHighlight={{ }} ``` -{{"demo": "BandHighlight.js" }} +{{"component": "file://./demos/band-highlight/index.ts"}} ### Highlight axis value @@ -40,7 +40,7 @@ This component accept the following props: - `axisId`: the id of the axis highlighted. By default the first axis. - `labelPosition`: `'start' | 'end' | 'both' | 'none'` the position of the label. -{{"demo": "AxisValueHighlight.js" }} +{{"component": "file://./demos/axis-value-highlight/index.ts"}} ### Customize highlighted axis value @@ -54,7 +54,7 @@ The following demo shows: - Green labels: By default labels are limited to the axis range (right label). The left one shows you how to let label overflow by setting the `translate` property. - Red labels: Demonstrate how to use the `--space` to limit label size. -{{"demo": "AxisValueHighlightCustomization.js" }} +{{"component": "file://./demos/axis-value-highlight-customization/index.ts"}} ## Highlighting series @@ -77,14 +77,14 @@ For Line charts, you can increase the interaction area by using slots. See [Line demos—Larger interaction area](/x/react-charts/line-demo/#larger-interaction-area) for an example of this. ::: -{{"demo": "ElementHighlights.js"}} +{{"component": "file://./demos/element-highlights/index.ts"}} ## Controlled item highlight You can control the highlighted item using the `highlightedItem` and `onHighlightChange` props. You can set the `highlightedItem` value based on inputs, and sync it when the user hovers over an item. -{{"demo": "ControlledHighlight.js"}} +{{"component": "file://./demos/controlled-highlight/index.ts"}} ## Controlled axis highlight @@ -119,11 +119,11 @@ const Component = ({ data }) => { ::: -{{"demo": "ControlledAxisHighlight.js"}} +{{"component": "file://./demos/controlled-axis-highlight/index.ts"}} ## Synchronizing highlights With controlled highlights, you can synchronize them across multiple charts. Ensure that the `series` have the same IDs and that the data is in the same order. -{{"demo": "SyncHighlight.js"}} +{{"component": "file://./demos/sync-highlight/index.ts"}} diff --git a/docs/data/charts/hooks/UseAxes.js b/docs/data/charts/hooks/UseAxes.js deleted file mode 100644 index 9b920c2b329db..0000000000000 --- a/docs/data/charts/hooks/UseAxes.js +++ /dev/null @@ -1,186 +0,0 @@ -import * as React from 'react'; -import { useYAxes, useXAxis, useLineSeries } from '@mui/x-charts/hooks'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { useTheme } from '@mui/material/styles'; - -const dataset = [ - { month: 'Jan', temperature: 5, rainfall: 45 }, - { month: 'Feb', temperature: 7, rainfall: 38 }, - { month: 'Mar', temperature: 12, rainfall: 42 }, - { month: 'Apr', temperature: 16, rainfall: 35 }, - { month: 'May', temperature: 21, rainfall: 28 }, - { month: 'Jun', temperature: 25, rainfall: 22 }, -]; - -function AxisRangeIndicators() { - const { yAxis, yAxisIds } = useYAxes(); - const xAxis = useXAxis(); - const allSeries = useLineSeries(); - const theme = useTheme(); - - const xDomain = xAxis.scale.domain(); - const xStart = xAxis.scale(xDomain[0]) ?? 0; - const xEnd = xAxis.scale(xDomain[xDomain.length - 1]) ?? 0; - - return ( - - {allSeries.map((series) => { - const axis = yAxis[series.yAxisId ?? yAxisIds[0]]; - - const seriesMin = Math.min(...series.data.filter((v) => v != null)); - const seriesMax = Math.max(...series.data.filter((v) => v != null)); - - const yMin = axis.scale(seriesMin) ?? 0; - const yMax = axis.scale(seriesMax) ?? 0; - - const color = series.color; - - return ( - - {/* Min value horizontal line */} - - {/* Max value horizontal line */} - - {/* Min value label */} - - {axis.id} - - - min - - {/* Max value label */} - - {axis.id} - - - max - - - ); - })} - - ); -} - -export default function UseAxes() { - return ( -
- - - - - - - - - -
- ); -} diff --git a/docs/data/charts/hooks/UseBarSeries.js b/docs/data/charts/hooks/UseBarSeries.js deleted file mode 100644 index d72ffbb7a87e2..0000000000000 --- a/docs/data/charts/hooks/UseBarSeries.js +++ /dev/null @@ -1,103 +0,0 @@ -import { useBarSeries } from '@mui/x-charts/hooks'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { useTheme } from '@mui/material/styles'; - -const dataset = [ - { month: 'Jan', revenue: 4000, expenses: 2400 }, - { month: 'Feb', revenue: 3000, expenses: 1398 }, - { month: 'Mar', revenue: 5000, expenses: 2800 }, - { month: 'Apr', revenue: 7000, expenses: 3908 }, - { month: 'May', revenue: 6000, expenses: 4800 }, - { month: 'Jun', revenue: 3000, expenses: 8000 }, -]; - -const inUSD = (value) => { - if (value == null) { - return ''; - } - return `$${value.toLocaleString()}`; -}; - -function BarSeriesInfo() { - const barSeries = useBarSeries(); - const theme = useTheme(); - - const revenue = barSeries - .find((s) => s.id === 'revenue') - ?.data.reduce((acc, v) => acc + (v ?? 0), 0); - - const expenses = barSeries - .find((s) => s.id === 'expenses') - ?.data.reduce((acc, v) => acc + (v ?? 0), 0); - - const profit = (revenue ?? 0) - (expenses ?? 0); - - return ( -
-

Half Year Details

- {barSeries.map((series) => ( -
- - {typeof series.label === 'function' - ? series.label('legend') - : series.label} - - {inUSD(series.data.reduce((a, b) => (a ?? 0) + (b ?? 0), 0))} -
- ))} -
- Profit - {inUSD(profit)} -
-
- ); -} - -export default function UseBarSeries() { - return ( -
- `${inUSD(v).slice(0, 2)}k`, - }, - ]} - series={[ - { - id: 'revenue', - dataKey: 'revenue', - label: 'Revenue', - color: '#8884d8', - valueFormatter: inUSD, - }, - { - id: 'expenses', - dataKey: 'expenses', - label: 'Expenses', - color: '#82ca9d', - valueFormatter: inUSD, - }, - ]} - width={500} - height={350} - slots={{ legend: BarSeriesInfo }} - /> -
- ); -} diff --git a/docs/data/charts/hooks/UseDataset.js b/docs/data/charts/hooks/UseDataset.js deleted file mode 100644 index cbc54694ddac6..0000000000000 --- a/docs/data/charts/hooks/UseDataset.js +++ /dev/null @@ -1,127 +0,0 @@ -import * as React from 'react'; -import { useDataset } from '@mui/x-charts/hooks'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { LineHighlightPlot, LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import Paper from '@mui/material/Paper'; - -const dataset = [ - { month: 'Jan', revenue: 4000, expenses: 2400 }, - { month: 'Feb', revenue: 3000, expenses: 1398 }, - { month: 'Mar', revenue: 2000, expenses: 9800 }, - { month: 'Apr', revenue: 2780, expenses: 3908 }, - { month: 'May', revenue: 1890, expenses: 4800 }, - { month: 'Jun', revenue: 2390, expenses: 3800 }, - { month: 'Jul', revenue: 3490, expenses: 4300 }, -]; - -function DatasetStats() { - const chartDataset = useDataset(); - - if (!chartDataset) { - return null; - } - - const totalRevenue = chartDataset.reduce( - (sum, item) => sum + (typeof item.revenue === 'number' ? item.revenue : 0), - 0, - ); - const totalExpenses = chartDataset.reduce( - (sum, item) => sum + (typeof item.expenses === 'number' ? item.expenses : 0), - 0, - ); - const profit = totalRevenue - totalExpenses; - - return ( - -
- - Total Revenue - - - ${totalRevenue.toLocaleString()} - -
-
- - Total Expenses - - - ${totalExpenses.toLocaleString()} - -
-
- - Net Profit - - = 0 ? 'success.main' : 'error.main' }} - > - ${profit.toLocaleString()} - -
-
- - Data Points - - {chartDataset.length} -
-
- ); -} - -export default function UseDataset() { - return ( - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/hooks/UseDatasetAdvanced.js b/docs/data/charts/hooks/UseDatasetAdvanced.js deleted file mode 100644 index 6d002a3e057f8..0000000000000 --- a/docs/data/charts/hooks/UseDatasetAdvanced.js +++ /dev/null @@ -1,186 +0,0 @@ -import * as React from 'react'; -import { useDataset } from '@mui/x-charts/hooks'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; - -import Box from '@mui/material/Box'; -import Table from '@mui/material/Table'; -import TableBody from '@mui/material/TableBody'; -import TableCell from '@mui/material/TableCell'; -import TableContainer from '@mui/material/TableContainer'; -import TableHead from '@mui/material/TableHead'; -import TableRow from '@mui/material/TableRow'; -import Paper from '@mui/material/Paper'; -import Typography from '@mui/material/Typography'; - -const dataset = [ - { product: 'Product A', q1: 4000, q2: 3000, q3: 2000, q4: 2780 }, - { product: 'Product B', q1: 3000, q2: 1398, q3: 9800, q4: 3908 }, - { product: 'Product C', q1: 2000, q2: 9800, q3: 3000, q4: 4800 }, - { product: 'Product D', q1: 2780, q2: 3908, q3: 4000, q4: 3800 }, - { product: 'Product E', q1: 1890, q2: 4800, q3: 2390, q4: 3800 }, -]; - -function DataTable({ highlightedIndex, onHighlightedIndexChange }) { - const chartDataset = useDataset(); - - if (!chartDataset) { - return null; - } - - const calculateTotal = (item) => { - return ['q1', 'q2', 'q3', 'q4'].reduce((sum, quarter) => { - const value = item[quarter]; - return sum + (typeof value === 'number' ? value : 0); - }, 0); - }; - - const calculateQuarterTotal = (quarter) => { - return chartDataset.reduce((sum, item) => { - const value = item[quarter]; - return sum + (typeof value === 'number' ? value : 0); - }, 0); - }; - - const grandTotal = chartDataset.reduce( - (sum, item) => sum + calculateTotal(item), - 0, - ); - - return ( - -
- - - - Product - - - Q1 - - - Q2 - - - Q3 - - - Q4 - - - Total - - - - - {chartDataset.map((row, index) => ( - onHighlightedIndexChange(index)} - onPointerLeave={() => onHighlightedIndexChange(null)} - sx={{ - backgroundColor: - highlightedIndex === index ? 'action.hover' : 'transparent', - transition: 'background-color 0.2s', - cursor: 'pointer', - }} - > - - {String(row.product)} - - - ${typeof row.q1 === 'number' ? row.q1.toLocaleString() : 0} - - - ${typeof row.q2 === 'number' ? row.q2.toLocaleString() : 0} - - - ${typeof row.q3 === 'number' ? row.q3.toLocaleString() : 0} - - - ${typeof row.q4 === 'number' ? row.q4.toLocaleString() : 0} - - - ${calculateTotal(row).toLocaleString()} - - - ))} - - - Total - - - ${calculateQuarterTotal('q1').toLocaleString()} - - - ${calculateQuarterTotal('q2').toLocaleString()} - - - ${calculateQuarterTotal('q3').toLocaleString()} - - - ${calculateQuarterTotal('q4').toLocaleString()} - - - ${grandTotal.toLocaleString()} - - - -
- - ); -} - -export default function UseDatasetAdvanced() { - const [highlightedAxis, setHighlightedAxis] = React.useState([]); - - const setHighlightedIndexCallback = React.useCallback((index) => { - if (index === null) { - setHighlightedAxis([]); - } else { - setHighlightedAxis([{ axisId: 'x-axis-id', dataIndex: index }]); - } - }, []); - - return ( - - - - Quarterly Sales Report - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/hooks/UseDrawingArea.js b/docs/data/charts/hooks/UseDrawingArea.js deleted file mode 100644 index 92861b90222bd..0000000000000 --- a/docs/data/charts/hooks/UseDrawingArea.js +++ /dev/null @@ -1,84 +0,0 @@ -import { useDrawingArea } from '@mui/x-charts/hooks'; -import { LineChart } from '@mui/x-charts/LineChart'; - -function CustomOverlay() { - const { left, top, width, height } = useDrawingArea(); - - return ( - - {/* Drawing area border */} - - {/* Corner markers */} - - - - - {/* Center cross */} - - - - - - {/* Info text */} - - Drawing Area: {width}×{height} - - - Center: ({left + width / 2}, {top + height / 2}) - - - ); -} - -export default function UseDrawingArea() { - return ( - - - - ); -} diff --git a/docs/data/charts/hooks/UseLegend.js b/docs/data/charts/hooks/UseLegend.js deleted file mode 100644 index 57ceaae0a0c5b..0000000000000 --- a/docs/data/charts/hooks/UseLegend.js +++ /dev/null @@ -1,47 +0,0 @@ -import { useLegend } from '@mui/x-charts/hooks'; -import { PieChart } from '@mui/x-charts/PieChart'; - -const data = [ - { id: 0, value: 10, label: 'Series A' }, - { id: 1, value: 15, label: 'Series B' }, - { id: 2, value: 20, label: 'Series C' }, -]; - -function BasicUseLegendExample() { - const { items } = useLegend(); - - return ( -
-

Legend Items from useLegend:

-
    - {items.map((item) => ( -
  • -
    - {item.label} -
  • - ))} -
-
- ); -} - -export default function UseLegend() { - return ( - - ); -} diff --git a/docs/data/charts/hooks/UseLegend.tsx.preview b/docs/data/charts/hooks/UseLegend.tsx.preview deleted file mode 100644 index 7a2c87c536fff..0000000000000 --- a/docs/data/charts/hooks/UseLegend.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/hooks/UsePolarGeometry.js b/docs/data/charts/hooks/UsePolarGeometry.js deleted file mode 100644 index b50ae763f4e41..0000000000000 --- a/docs/data/charts/hooks/UsePolarGeometry.js +++ /dev/null @@ -1,74 +0,0 @@ -import * as React from 'react'; -import { usePolarGeometry } from '@mui/x-charts/hooks'; -import { RadialBarChart, RadialBarPlot } from '@mui/x-charts-premium/RadialBarChart'; -import { ChartsRadiusAxis } from '@mui/x-charts/ChartsRadiusAxis'; -import { ChartsRotationAxis } from '@mui/x-charts/ChartsRotationAxis'; - -const trustData = [ - { country: 'Denmark', trust: 65 }, - { country: 'Finland', trust: 62 }, - { country: 'Netherlands', trust: 60 }, - { country: 'Sweden', trust: 58 }, - { country: 'Norway', trust: 61 }, -]; - -/** - * Custom overlay using usePolarGeometry hook - */ -function PolarGeometryOverlay() { - const geometry = usePolarGeometry(); - - if (!geometry) { - return null; - } - - // Draw a reference ring at value 50 - const radius = geometry.radiusScale(50); - const [x, y] = geometry.point(radius, Math.PI / 4); - - return ( - - {/* Reference ring */} - - {/* Custom marker at a specific angle and radius */} - - - ); -} - -/** - * Simple demo: Radial bar chart with custom geometry overlay - */ -export default function UsePolarGeometry() { - return ( - - - - - - - ); -} diff --git a/docs/data/charts/hooks/UsePolarGeometry.tsx.preview b/docs/data/charts/hooks/UsePolarGeometry.tsx.preview deleted file mode 100644 index 33ccc21d94e7e..0000000000000 --- a/docs/data/charts/hooks/UsePolarGeometry.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/docs/data/charts/hooks/UseScale.js b/docs/data/charts/hooks/UseScale.js deleted file mode 100644 index 64a22b13b7497..0000000000000 --- a/docs/data/charts/hooks/UseScale.js +++ /dev/null @@ -1,93 +0,0 @@ -import { - useXScale, - useYScale, - getValueToPositionMapper, - useLineSeries, - useXAxis, -} from '@mui/x-charts/hooks'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const data = [ - { x: 1, y: 2 }, - { x: 2, y: 5 }, - { x: 3, y: 3 }, - { x: 4, y: 8 }, - { x: 5, y: 1 }, -]; - -function CustomDataPoints() { - const xScale = useXScale(); - const yScale = useYScale(); - const series = useLineSeries(); - const xAxis = useXAxis(); - - // Use the value-to-position mapper to handle different scale types - const xMapper = getValueToPositionMapper(xScale); - const yMapper = getValueToPositionMapper(yScale); - - return ( - - {series.map((s) => - s.data.map((point, index) => { - const x = xMapper(xAxis.data?.[index]); - const y = yMapper(point); - - return ( - - {/* Custom data point */} - - {/* Value label */} - - ({index + 1}, {point}) - - - ); - }), - )} - - ); -} - -export default function UseScale() { - return ( - - - - ); -} diff --git a/docs/data/charts/hooks/UseSeries.js b/docs/data/charts/hooks/UseSeries.js deleted file mode 100644 index 3be26a8f70f81..0000000000000 --- a/docs/data/charts/hooks/UseSeries.js +++ /dev/null @@ -1,84 +0,0 @@ -import * as React from 'react'; -import { useSeries, useXAxis, useYAxis } from '@mui/x-charts/hooks'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -const barData = [4, 3, 5, 7, 2]; -const barData2 = [1, 2, 1, 2, 3]; -const lineData = [2, 5, 3, 8, 4]; -const xLabels = ['Jan', 'Feb', 'Mar', 'Apr', 'May']; - -function MaxLineOnEachSeries() { - const series = useSeries(); - const yAxis = useYAxis(); - const xAxis = useXAxis('pointId'); - - const maxEach = Object.entries(series).flatMap(([_, typeSeries]) => { - return Object.values(typeSeries.series).map((s) => ({ - id: s.id, - max: Math.max(...s.data), - })); - }); - - return ( - - {maxEach.map(({ id, max }) => ( - - ))} - - ); -} - -export default function UseSeries() { - return ( -
- - - - - - - - - -
- ); -} diff --git a/docs/data/charts/hooks/UseAxes.tsx b/docs/data/charts/hooks/demos/use-axes/UseAxes.tsx similarity index 99% rename from docs/data/charts/hooks/UseAxes.tsx rename to docs/data/charts/hooks/demos/use-axes/UseAxes.tsx index 086c462983c66..e3dfd5527b6cb 100644 --- a/docs/data/charts/hooks/UseAxes.tsx +++ b/docs/data/charts/hooks/demos/use-axes/UseAxes.tsx @@ -123,6 +123,7 @@ function AxisRangeIndicators() { export default function UseAxes() { return (
+ {/* @focus-start */} + {/* @focus-end */}
); } diff --git a/docs/data/charts/hooks/demos/use-axes/client.ts b/docs/data/charts/hooks/demos/use-axes/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-axes/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-axes/index.ts b/docs/data/charts/hooks/demos/use-axes/index.ts new file mode 100644 index 0000000000000..f799790d1ac6e --- /dev/null +++ b/docs/data/charts/hooks/demos/use-axes/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseAxes from './UseAxes'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseAxes, { ClientProvider }); diff --git a/docs/data/charts/hooks/UseBarSeries.tsx b/docs/data/charts/hooks/demos/use-bar-series/UseBarSeries.tsx similarity index 98% rename from docs/data/charts/hooks/UseBarSeries.tsx rename to docs/data/charts/hooks/demos/use-bar-series/UseBarSeries.tsx index b7bd6c06fc5cb..894bc092fcf46 100644 --- a/docs/data/charts/hooks/UseBarSeries.tsx +++ b/docs/data/charts/hooks/demos/use-bar-series/UseBarSeries.tsx @@ -68,6 +68,7 @@ function BarSeriesInfo() { export default function UseBarSeries() { return (
+ {/* @focus-start */} + {/* @focus-end */}
); } diff --git a/docs/data/charts/hooks/demos/use-bar-series/client.ts b/docs/data/charts/hooks/demos/use-bar-series/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-bar-series/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-bar-series/index.ts b/docs/data/charts/hooks/demos/use-bar-series/index.ts new file mode 100644 index 0000000000000..aa988da2e7b97 --- /dev/null +++ b/docs/data/charts/hooks/demos/use-bar-series/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseBarSeries from './UseBarSeries'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseBarSeries, { ClientProvider }); diff --git a/docs/data/charts/hooks/UseDatasetAdvanced.tsx b/docs/data/charts/hooks/demos/use-dataset-advanced/UseDatasetAdvanced.tsx similarity index 98% rename from docs/data/charts/hooks/UseDatasetAdvanced.tsx rename to docs/data/charts/hooks/demos/use-dataset-advanced/UseDatasetAdvanced.tsx index 7d844365630ee..d83a974b1c508 100644 --- a/docs/data/charts/hooks/UseDatasetAdvanced.tsx +++ b/docs/data/charts/hooks/demos/use-dataset-advanced/UseDatasetAdvanced.tsx @@ -8,7 +8,7 @@ import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import { AxisItemIdentifier } from '@mui/x-charts/models'; +import type { AxisItemIdentifier } from '@mui/x-charts/models'; import Box from '@mui/material/Box'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; @@ -144,6 +144,7 @@ function DataTable({ } export default function UseDatasetAdvanced() { + // @focus-start @padding 1 const [highlightedAxis, setHighlightedAxis] = React.useState( [], ); @@ -191,4 +192,5 @@ export default function UseDatasetAdvanced() { ); + // @focus-end } diff --git a/docs/data/charts/hooks/demos/use-dataset-advanced/client.ts b/docs/data/charts/hooks/demos/use-dataset-advanced/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-dataset-advanced/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-dataset-advanced/index.ts b/docs/data/charts/hooks/demos/use-dataset-advanced/index.ts new file mode 100644 index 0000000000000..d3ca254245177 --- /dev/null +++ b/docs/data/charts/hooks/demos/use-dataset-advanced/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseDatasetAdvanced from './UseDatasetAdvanced'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseDatasetAdvanced, { ClientProvider }); diff --git a/docs/data/charts/hooks/UseDataset.tsx b/docs/data/charts/hooks/demos/use-dataset/UseDataset.tsx similarity index 98% rename from docs/data/charts/hooks/UseDataset.tsx rename to docs/data/charts/hooks/demos/use-dataset/UseDataset.tsx index cbc54694ddac6..7b0cb9ec6b48a 100644 --- a/docs/data/charts/hooks/UseDataset.tsx +++ b/docs/data/charts/hooks/demos/use-dataset/UseDataset.tsx @@ -89,6 +89,7 @@ function DatasetStats() { export default function UseDataset() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/hooks/demos/use-dataset/client.ts b/docs/data/charts/hooks/demos/use-dataset/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-dataset/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-dataset/index.ts b/docs/data/charts/hooks/demos/use-dataset/index.ts new file mode 100644 index 0000000000000..e016cbfc8c0a0 --- /dev/null +++ b/docs/data/charts/hooks/demos/use-dataset/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseDataset from './UseDataset'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseDataset, { ClientProvider }); diff --git a/docs/data/charts/hooks/UseDrawingArea.tsx b/docs/data/charts/hooks/demos/use-drawing-area/UseDrawingArea.tsx similarity index 97% rename from docs/data/charts/hooks/UseDrawingArea.tsx rename to docs/data/charts/hooks/demos/use-drawing-area/UseDrawingArea.tsx index 61dbaaa80d865..b37298bb8e3aa 100644 --- a/docs/data/charts/hooks/UseDrawingArea.tsx +++ b/docs/data/charts/hooks/demos/use-drawing-area/UseDrawingArea.tsx @@ -65,6 +65,7 @@ function CustomOverlay() { export default function UseDrawingArea() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/hooks/demos/use-drawing-area/client.ts b/docs/data/charts/hooks/demos/use-drawing-area/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-drawing-area/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-drawing-area/index.ts b/docs/data/charts/hooks/demos/use-drawing-area/index.ts new file mode 100644 index 0000000000000..c89e5fddc4172 --- /dev/null +++ b/docs/data/charts/hooks/demos/use-drawing-area/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseDrawingArea from './UseDrawingArea'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseDrawingArea, { ClientProvider }); diff --git a/docs/data/charts/hooks/UseLegend.tsx b/docs/data/charts/hooks/demos/use-legend/UseLegend.tsx similarity index 96% rename from docs/data/charts/hooks/UseLegend.tsx rename to docs/data/charts/hooks/demos/use-legend/UseLegend.tsx index 57ceaae0a0c5b..33366419c8906 100644 --- a/docs/data/charts/hooks/UseLegend.tsx +++ b/docs/data/charts/hooks/demos/use-legend/UseLegend.tsx @@ -38,10 +38,12 @@ function BasicUseLegendExample() { export default function UseLegend() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/hooks/demos/use-legend/client.ts b/docs/data/charts/hooks/demos/use-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-legend/index.ts b/docs/data/charts/hooks/demos/use-legend/index.ts new file mode 100644 index 0000000000000..75188d884d7b0 --- /dev/null +++ b/docs/data/charts/hooks/demos/use-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseLegend from './UseLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseLegend, { ClientProvider }); diff --git a/docs/data/charts/hooks/UsePolarGeometry.tsx b/docs/data/charts/hooks/demos/use-polar-geometry/UsePolarGeometry.tsx similarity index 97% rename from docs/data/charts/hooks/UsePolarGeometry.tsx rename to docs/data/charts/hooks/demos/use-polar-geometry/UsePolarGeometry.tsx index 506c52062bb69..eb968000249c6 100644 --- a/docs/data/charts/hooks/UsePolarGeometry.tsx +++ b/docs/data/charts/hooks/demos/use-polar-geometry/UsePolarGeometry.tsx @@ -57,6 +57,7 @@ function PolarGeometryOverlay() { */ export default function UsePolarGeometry() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/hooks/demos/use-polar-geometry/client.ts b/docs/data/charts/hooks/demos/use-polar-geometry/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-polar-geometry/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-polar-geometry/index.ts b/docs/data/charts/hooks/demos/use-polar-geometry/index.ts new file mode 100644 index 0000000000000..4947c92f88a4c --- /dev/null +++ b/docs/data/charts/hooks/demos/use-polar-geometry/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UsePolarGeometry from './UsePolarGeometry'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UsePolarGeometry, { ClientProvider }); diff --git a/docs/data/charts/hooks/UseScale.tsx b/docs/data/charts/hooks/demos/use-scale/UseScale.tsx similarity index 97% rename from docs/data/charts/hooks/UseScale.tsx rename to docs/data/charts/hooks/demos/use-scale/UseScale.tsx index 64a22b13b7497..e9d070b12a31f 100644 --- a/docs/data/charts/hooks/UseScale.tsx +++ b/docs/data/charts/hooks/demos/use-scale/UseScale.tsx @@ -64,6 +64,7 @@ function CustomDataPoints() { export default function UseScale() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/hooks/demos/use-scale/client.ts b/docs/data/charts/hooks/demos/use-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-scale/index.ts b/docs/data/charts/hooks/demos/use-scale/index.ts new file mode 100644 index 0000000000000..20c5804fec407 --- /dev/null +++ b/docs/data/charts/hooks/demos/use-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseScale from './UseScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseScale, { ClientProvider }); diff --git a/docs/data/charts/hooks/UseSeries.tsx b/docs/data/charts/hooks/demos/use-series/UseSeries.tsx similarity index 97% rename from docs/data/charts/hooks/UseSeries.tsx rename to docs/data/charts/hooks/demos/use-series/UseSeries.tsx index ae032ce84db5e..4cbd0591e1534 100644 --- a/docs/data/charts/hooks/UseSeries.tsx +++ b/docs/data/charts/hooks/demos/use-series/UseSeries.tsx @@ -44,6 +44,7 @@ function MaxLineOnEachSeries() { export default function UseSeries() { return (
+ {/* @focus-start */} + {/* @focus-end */}
); } diff --git a/docs/data/charts/hooks/demos/use-series/client.ts b/docs/data/charts/hooks/demos/use-series/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/hooks/demos/use-series/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/hooks/demos/use-series/index.ts b/docs/data/charts/hooks/demos/use-series/index.ts new file mode 100644 index 0000000000000..91517a4aa1c4f --- /dev/null +++ b/docs/data/charts/hooks/demos/use-series/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import UseSeries from './UseSeries'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, UseSeries, { ClientProvider }); diff --git a/docs/data/charts/hooks/use-axes.md b/docs/data/charts/hooks/use-axes.md index 27beee6819fef..faad28d6a2f2a 100644 --- a/docs/data/charts/hooks/use-axes.md +++ b/docs/data/charts/hooks/use-axes.md @@ -91,7 +91,7 @@ function CustomComponent() { The example below shows `useXAxes()` and `useYAxes()` reading all axes in a chart with dual y-axes. The custom components use these hooks to draw visual indicators for axis ranges and to display axis metadata. -{{"demo": "UseAxes.js"}} +{{"component": "file://./demos/use-axes/index.ts"}} ## Caveats diff --git a/docs/data/charts/hooks/use-dataset.md b/docs/data/charts/hooks/use-dataset.md index b6a760b57dcda..b460a9cc02a21 100644 --- a/docs/data/charts/hooks/use-dataset.md +++ b/docs/data/charts/hooks/use-dataset.md @@ -35,13 +35,13 @@ function CustomComponent() { The example below shows `useDataset()` used to display dataset statistics above a chart: -{{"demo": "UseDataset.js"}} +{{"component": "file://./demos/use-dataset/index.ts"}} ## Advanced example The example below shows how to use the dataset to create a custom data table that stays in sync with the chart: -{{"demo": "UseDatasetAdvanced.js"}} +{{"component": "file://./demos/use-dataset-advanced/index.ts"}} ## Return value diff --git a/docs/data/charts/hooks/use-drawing-area.md b/docs/data/charts/hooks/use-drawing-area.md index 174f9d9678540..9b25253872949 100644 --- a/docs/data/charts/hooks/use-drawing-area.md +++ b/docs/data/charts/hooks/use-drawing-area.md @@ -28,7 +28,7 @@ The demo below shows: - A center cross marking the middle of the drawing area - Real-time dimension and center point information -{{"demo": "UseDrawingArea.js"}} +{{"component": "file://./demos/use-drawing-area/index.ts"}} ## Return value diff --git a/docs/data/charts/hooks/use-legend.md b/docs/data/charts/hooks/use-legend.md index e5fcf88f77396..3d6571b391ad0 100644 --- a/docs/data/charts/hooks/use-legend.md +++ b/docs/data/charts/hooks/use-legend.md @@ -20,7 +20,7 @@ function CustomLegend() { } ``` -{{"demo": "UseLegend.js"}} +{{"component": "file://./demos/use-legend/index.ts"}} ## Return value diff --git a/docs/data/charts/hooks/use-polar-geometry.md b/docs/data/charts/hooks/use-polar-geometry.md index 8af29361b3d9c..40e77545d3279 100644 --- a/docs/data/charts/hooks/use-polar-geometry.md +++ b/docs/data/charts/hooks/use-polar-geometry.md @@ -48,7 +48,7 @@ if (geometry) { } ``` -{{"demo": "UsePolarGeometry.js"}} +{{"component": "file://./demos/use-polar-geometry/index.ts"}} ## Caveats diff --git a/docs/data/charts/hooks/use-scale.md b/docs/data/charts/hooks/use-scale.md index 9d472431db524..5eab5533c8cfc 100644 --- a/docs/data/charts/hooks/use-scale.md +++ b/docs/data/charts/hooks/use-scale.md @@ -66,7 +66,7 @@ function CustomComponent() { The example below shows how to use scale functions to position custom elements: -{{"demo": "UseScale.js"}} +{{"component": "file://./demos/use-scale/index.ts"}} ## Caveats diff --git a/docs/data/charts/hooks/use-series.md b/docs/data/charts/hooks/use-series.md index be649ac8938ac..2cbc9e31690e3 100644 --- a/docs/data/charts/hooks/use-series.md +++ b/docs/data/charts/hooks/use-series.md @@ -42,7 +42,7 @@ The series hooks for each chart type are: The example below shows `useBarSeries()` returning bar chart series data: -{{"demo": "UseBarSeries.js"}} +{{"component": "file://./demos/use-bar-series/index.ts"}} ## Advanced usage @@ -54,7 +54,7 @@ It's preferable to use type-specific series hooks (for example, `useBarSeries()` Use `useSeries()` when you need to handle multiple or unknown chart types at once. ::: -{{"demo": "UseSeries.js"}} +{{"component": "file://./demos/use-series/index.ts"}} ## Caveats diff --git a/docs/data/charts/label/BasicLabel.js b/docs/data/charts/label/BasicLabel.js deleted file mode 100644 index fd69a25b5a2ef..0000000000000 --- a/docs/data/charts/label/BasicLabel.js +++ /dev/null @@ -1,21 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function BasicLabel() { - return ( - - ); -} - -const props = { - height: 300, - xAxis: [{ data: ['A', 'B', 'C'] }], - yAxis: [{ width: 50 }], -}; diff --git a/docs/data/charts/label/BasicLabel.tsx.preview b/docs/data/charts/label/BasicLabel.tsx.preview deleted file mode 100644 index 4a1751034f63b..0000000000000 --- a/docs/data/charts/label/BasicLabel.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/label/FunctionLabel.js b/docs/data/charts/label/FunctionLabel.js deleted file mode 100644 index cfb9e9f949a6f..0000000000000 --- a/docs/data/charts/label/FunctionLabel.js +++ /dev/null @@ -1,19 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function FunctionLabel() { - return ( - `${location} label` }, - ]} - /> - ); -} - -const props = { - height: 300, - xAxis: [{ data: ['A', 'B', 'C'] }], - yAxis: [{ width: 50 }], -}; diff --git a/docs/data/charts/label/FunctionLabel.tsx.preview b/docs/data/charts/label/FunctionLabel.tsx.preview deleted file mode 100644 index 5833b0f40c843..0000000000000 --- a/docs/data/charts/label/FunctionLabel.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - `${location} label` }, - ]} -/> \ No newline at end of file diff --git a/docs/data/charts/label/PieLabel.js b/docs/data/charts/label/PieLabel.js deleted file mode 100644 index 0c07586b17d3e..0000000000000 --- a/docs/data/charts/label/PieLabel.js +++ /dev/null @@ -1,25 +0,0 @@ -import { PieChart } from '@mui/x-charts/PieChart'; - -export default function PieLabel() { - return ( - `${location}+A` }, - { id: 1, value: 15, label: (location) => `${location}+B` }, - { id: 2, value: 20, label: (location) => `${location}+C` }, - ], - type: 'pie', - arcLabel: 'label', - }, - ]} - /> - ); -} - -const props = { - width: 200, - height: 200, -}; diff --git a/docs/data/charts/label/PieLabel.tsx.preview b/docs/data/charts/label/PieLabel.tsx.preview deleted file mode 100644 index 28b8dcee9ed79..0000000000000 --- a/docs/data/charts/label/PieLabel.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - `${location}+A` }, - { id: 1, value: 15, label: (location) => `${location}+B` }, - { id: 2, value: 20, label: (location) => `${location}+C` }, - ], - type: 'pie', - arcLabel: 'label', - }, - ]} -/> \ No newline at end of file diff --git a/docs/data/charts/label/BasicLabel.tsx b/docs/data/charts/label/demos/basic-label/BasicLabel.tsx similarity index 87% rename from docs/data/charts/label/BasicLabel.tsx rename to docs/data/charts/label/demos/basic-label/BasicLabel.tsx index fd69a25b5a2ef..c49019843e37c 100644 --- a/docs/data/charts/label/BasicLabel.tsx +++ b/docs/data/charts/label/demos/basic-label/BasicLabel.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function BasicLabel() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/label/demos/basic-label/client.ts b/docs/data/charts/label/demos/basic-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/label/demos/basic-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/label/demos/basic-label/index.ts b/docs/data/charts/label/demos/basic-label/index.ts new file mode 100644 index 0000000000000..c5f01cb66e119 --- /dev/null +++ b/docs/data/charts/label/demos/basic-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicLabel from './BasicLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicLabel, { ClientProvider }); diff --git a/docs/data/charts/label/FunctionLabel.tsx b/docs/data/charts/label/demos/function-label/FunctionLabel.tsx similarity index 89% rename from docs/data/charts/label/FunctionLabel.tsx rename to docs/data/charts/label/demos/function-label/FunctionLabel.tsx index cfb9e9f949a6f..3b0c77f65f2f6 100644 --- a/docs/data/charts/label/FunctionLabel.tsx +++ b/docs/data/charts/label/demos/function-label/FunctionLabel.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function FunctionLabel() { return ( + // @focus-start @padding 2 `${location} label` }, ]} /> + // @focus-end ); } diff --git a/docs/data/charts/label/demos/function-label/client.ts b/docs/data/charts/label/demos/function-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/label/demos/function-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/label/demos/function-label/index.ts b/docs/data/charts/label/demos/function-label/index.ts new file mode 100644 index 0000000000000..2feec7289be9c --- /dev/null +++ b/docs/data/charts/label/demos/function-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import FunctionLabel from './FunctionLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, FunctionLabel, { ClientProvider }); diff --git a/docs/data/charts/label/PieLabel.tsx b/docs/data/charts/label/demos/pie-label/PieLabel.tsx similarity index 91% rename from docs/data/charts/label/PieLabel.tsx rename to docs/data/charts/label/demos/pie-label/PieLabel.tsx index 0c07586b17d3e..11653ace1c6e4 100644 --- a/docs/data/charts/label/PieLabel.tsx +++ b/docs/data/charts/label/demos/pie-label/PieLabel.tsx @@ -2,6 +2,7 @@ import { PieChart } from '@mui/x-charts/PieChart'; export default function PieLabel() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/label/demos/pie-label/client.ts b/docs/data/charts/label/demos/pie-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/label/demos/pie-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/label/demos/pie-label/index.ts b/docs/data/charts/label/demos/pie-label/index.ts new file mode 100644 index 0000000000000..9b8a12f2a7b8a --- /dev/null +++ b/docs/data/charts/label/demos/pie-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieLabel from './PieLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieLabel, { ClientProvider }); diff --git a/docs/data/charts/label/label.md b/docs/data/charts/label/label.md index a4ebdf7f7979b..5afe05693faee 100644 --- a/docs/data/charts/label/label.md +++ b/docs/data/charts/label/label.md @@ -17,7 +17,7 @@ The label appears in different locations such as the legend and tooltip. The Pie chart has specific behavior described in [Pie chart labels](#pie-chart-labels) below. ::: -{{"demo": "BasicLabel.js"}} +{{"component": "file://./demos/basic-label/index.ts"}} ## Conditional formatting @@ -27,7 +27,7 @@ The function receives `location` as its first argument, which can have the follo - `'legend'`: Format the label in the [Legend](/x/react-charts/legend/) - `'tooltip'`: Format the label in the [Tooltip](/x/react-charts/tooltip/) -{{"demo": "FunctionLabel.js"}} +{{"component": "file://./demos/function-label/index.ts"}} ## Pie chart labels @@ -41,4 +41,4 @@ The `location` argument can have the following values: - `'tooltip'`: Format the label in the [Tooltip](/x/react-charts/tooltip/) - `'arc'`: Format the [Arc label](/x/react-charts/pie/#labels) when `arcLabel` is set to `'label'` -{{"demo": "PieLabel.js"}} +{{"component": "file://./demos/pie-label/index.ts"}} diff --git a/docs/data/charts/legend/BasicColorLegend.js b/docs/data/charts/legend/BasicColorLegend.js deleted file mode 100644 index 9cf1e611dda28..0000000000000 --- a/docs/data/charts/legend/BasicColorLegend.js +++ /dev/null @@ -1,59 +0,0 @@ -import Typography from '@mui/material/Typography'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { PiecewiseColorLegend } from '@mui/x-charts/ChartsLegend'; -import Stack from '@mui/material/Stack'; -import { dataset } from './tempAnomaly'; - -export default function BasicColorLegend() { - return ( - - - Global temperature anomaly relative to 1961-1990 average - - `${value?.toFixed(2)}°`, - }, - ]} - xAxis={[ - { - scaleType: 'time', - dataKey: 'year', - disableLine: true, - valueFormatter: (value) => value.getFullYear().toString(), - colorMap: { - type: 'piecewise', - thresholds: [new Date(1961, 0, 1), new Date(1990, 0, 1)], - colors: ['blue', 'gray', 'red'], - }, - }, - ]} - yAxis={[ - { - disableLine: true, - disableTicks: true, - valueFormatter: (value) => `${value}°`, - }, - ]} - grid={{ horizontal: true }} - height={300} - slotProps={{ - legend: { - axisDirection: 'x', - direction: 'vertical', - }, - }} - slots={{ - legend: PiecewiseColorLegend, - }} - > - - - - ); -} diff --git a/docs/data/charts/legend/BasicLegend.js b/docs/data/charts/legend/BasicLegend.js deleted file mode 100644 index ac9d229d94706..0000000000000 --- a/docs/data/charts/legend/BasicLegend.js +++ /dev/null @@ -1,15 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import dataset from '../dataset/random/scatterParallel.json'; - -export default function BasicLegend() { - return ( - - ); -} diff --git a/docs/data/charts/legend/BasicLegend.tsx.preview b/docs/data/charts/legend/BasicLegend.tsx.preview deleted file mode 100644 index 1ac407ccd7b78..0000000000000 --- a/docs/data/charts/legend/BasicLegend.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/legend/ContinuousInteractiveDemo.js b/docs/data/charts/legend/ContinuousInteractiveDemo.js deleted file mode 100644 index c606e435fb3b4..0000000000000 --- a/docs/data/charts/legend/ContinuousInteractiveDemo.js +++ /dev/null @@ -1,111 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { interpolateRdYlBu } from 'd3-scale-chromatic'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { ContinuousColorLegend } from '@mui/x-charts/ChartsLegend'; -import { dataset } from './tempAnomaly'; - -export default function ContinuousInteractiveDemo() { - return ( - ( - `${value?.toFixed(2)}°`, - }, - ]} - xAxis={[ - { - scaleType: 'time', - dataKey: 'year', - disableLine: true, - valueFormatter: (value) => value.getFullYear().toString(), - }, - ]} - yAxis={[ - { - disableLine: true, - disableTicks: true, - valueFormatter: (value) => `${value}°`, - colorMap: { - type: 'continuous', - min: -0.5, - max: 1.5, - color: (t) => interpolateRdYlBu(1 - t), - }, - }, - ]} - grid={{ horizontal: true }} - height={300} - slots={{ legend: ContinuousColorLegend }} - slotProps={{ - legend: { - axisDirection: 'y', - direction: props.direction, - thickness: props.thickness, - labelPosition: props.labelPosition, - reverse: props.reverse, - sx: { - [props.direction === 'horizontal' ? 'width' : 'height']: - `${props.length}${props.direction === 'horizontal' ? '%' : 'px'}`, - }, - }, - }} - > - - - )} - getCode={({ props }) => { - return `import { ContinuousColorLegend } from '@mui/x-charts/ChartsLegend'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/legend/ControlledVisibility.js b/docs/data/charts/legend/ControlledVisibility.js deleted file mode 100644 index 10800df2ee11f..0000000000000 --- a/docs/data/charts/legend/ControlledVisibility.js +++ /dev/null @@ -1,105 +0,0 @@ -import * as React from 'react'; -import { PieChart } from '@mui/x-charts/PieChart'; -import Stack from '@mui/material/Stack'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; - -const data = [ - { value: 10, label: 'Series A' }, - { value: 15, label: 'Series B' }, - { value: 20, label: 'Series C' }, -]; - -export default function ControlledVisibility() { - const [hiddenItems, setHiddenItems] = React.useState([ - { type: 'pie', seriesId: 'custom', dataIndex: 0 }, - ]); - - const handleShowAll = () => { - setHiddenItems([]); - }; - - const handleHideAll = () => { - setHiddenItems([ - { type: 'pie', seriesId: 'custom', dataIndex: 0 }, - { type: 'pie', seriesId: 'custom', dataIndex: 1 }, - { type: 'pie', seriesId: 'custom', dataIndex: 2 }, - ]); - }; - - const handleShowOnlyA = () => { - setHiddenItems([ - { type: 'pie', seriesId: 'custom', dataIndex: 1 }, - { type: 'pie', seriesId: 'custom', dataIndex: 2 }, - ]); - }; - - const handleToggleChange = (_event, newValue) => { - if (newValue === 'all') { - handleShowAll(); - } else if (newValue === 'none') { - handleHideAll(); - } else if (newValue === 'onlyA') { - handleShowOnlyA(); - } - }; - - const getCurrentValue = () => { - const allVisible = hiddenItems.length === 0; - const allHidden = hiddenItems.length === data.length; - const onlyAVisible = - hiddenItems.length === 2 && - hiddenItems[0].dataIndex === 1 && - hiddenItems[1].dataIndex === 2; - - if (allVisible) { - return 'all'; - } - if (allHidden) { - return 'none'; - } - if (onlyAVisible) { - return 'onlyA'; - } - return null; - }; - - return ( - - - Controlled Highlighting - - - Show All - - - Hide All - - - Show Only A - - - - setHiddenItems(newIdentifiers)} - /> - - ); -} diff --git a/docs/data/charts/legend/CustomLegend.js b/docs/data/charts/legend/CustomLegend.js deleted file mode 100644 index d9fe9dd811efe..0000000000000 --- a/docs/data/charts/legend/CustomLegend.js +++ /dev/null @@ -1,117 +0,0 @@ -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { useTheme } from '@mui/material/styles'; -import { useLegend } from '@mui/x-charts/hooks'; -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; -import { ChartsLabelMark } from '@mui/x-charts/ChartsLabel'; - -function LineWithMark({ color, className }) { - return ( - - - - - ); -} - -function DashedLine({ color, className }) { - return ( - - - - ); -} - -function MyCustomLegend() { - const { items } = useLegend(); - return ( - - {items.map((item) => { - const { label, color, seriesId, markType } = item; - return ( - - - {`${label}`} - - ); - })} - - ); -} - -const dataset = [ - { month: 'Jan', '1991_2020_avg': 4.1, 2023: 3.9 }, - { month: 'Fev', '1991_2020_avg': 4.7, 2023: 8.9 }, - { month: 'Mar', '1991_2020_avg': 7.5, 2023: 9.5 }, - { month: 'Apr', '1991_2020_avg': 10.6, 2023: 11.5 }, - { month: 'May', '1991_2020_avg': 13.8, 2023: 15.5 }, - { month: 'Jun', '1991_2020_avg': 16.7, 2023: 16.4 }, - { month: 'Jul', '1991_2020_avg': 18.9, 2023: 19.5 }, - { month: 'Aug', '1991_2020_avg': 18.8, 2023: 20.5 }, - { month: 'Sep', '1991_2020_avg': 15.8, 2023: 16.4 }, - { month: 'Oct', '1991_2020_avg': 11.9, 2023: 13.2 }, - { month: 'Nov', '1991_2020_avg': 7.6, 2023: 8.1 }, - { month: 'Dec', '1991_2020_avg': 4.7, 2023: 6.1 }, -]; - -export default function CustomLegend() { - const theme = useTheme(); - - return ( - - - - ); -} diff --git a/docs/data/charts/legend/HiddenLegend.js b/docs/data/charts/legend/HiddenLegend.js deleted file mode 100644 index d33b0ffa42de2..0000000000000 --- a/docs/data/charts/legend/HiddenLegend.js +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { PieChart } from '@mui/x-charts/PieChart'; - -const series = [ - { - data: [ - { id: 0, value: 10, label: 'series A' }, - { id: 1, value: 15, label: 'series B' }, - { id: 2, value: 20, label: 'series C' }, - ], - }, -]; - -export default function HiddenLegend() { - const [isHidden, setIsHidden] = React.useState(false); - - const Toggle = ( - setIsHidden(event.target.checked)} />} - label="hide the legend" - labelPlacement="end" - sx={{ margin: 'auto' }} - /> - ); - - return ( - - {Toggle} - - - ); -} diff --git a/docs/data/charts/legend/HiddenLegend.tsx.preview b/docs/data/charts/legend/HiddenLegend.tsx.preview deleted file mode 100644 index c20f9eec4e8c8..0000000000000 --- a/docs/data/charts/legend/HiddenLegend.tsx.preview +++ /dev/null @@ -1,2 +0,0 @@ -{Toggle} - \ No newline at end of file diff --git a/docs/data/charts/legend/LegendClick.js b/docs/data/charts/legend/LegendClick.js deleted file mode 100644 index 72a2673c9cd43..0000000000000 --- a/docs/data/charts/legend/LegendClick.js +++ /dev/null @@ -1,143 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; - -import { ChartsLegend, PiecewiseColorLegend } from '@mui/x-charts/ChartsLegend'; - -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; - -const pieSeries = [ - { - type: 'pie', - id: 'series-1', - data: [ - { label: 'Pie A', id: 'P1-A', value: 400 }, - { label: 'Pie B', id: 'P2-B', value: 300 }, - ], - }, -]; - -const barSeries = [ - { - type: 'bar', - id: 'series-1', - label: 'Series 1', - data: [0, 1, 2], - }, - { - type: 'bar', - id: 'series-2', - label: 'Series 2', - data: [0, 1, 2], - }, -]; - -const lineSeries = [ - { - type: 'line', - id: 'series-1', - label: 'Series 1', - data: [0, 1, 2], - }, - { - type: 'line', - id: 'series-2', - label: 'Series 2', - data: [0, 1, 2], - }, -]; - -export default function LegendClick() { - const [itemData, setItemData] = React.useState(); - - return ( - - - Chart Legend - - setItemData([context, index])} - /> - - Pie Chart Legend - - setItemData([context, index])} - /> - - Piecewise Color Legend - - setItemData([context, index])} - /> - - - - - - Click on the chart - { - setItemData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/legend/LegendCustomLabelMark.js b/docs/data/charts/legend/LegendCustomLabelMark.js deleted file mode 100644 index 17eda9c44bbd4..0000000000000 --- a/docs/data/charts/legend/LegendCustomLabelMark.js +++ /dev/null @@ -1,34 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -function HTMLCircle({ className, color }) { - return ( -
- ); -} - -function SVGDiamond({ className, color }) { - return ( - - - - ); -} - -export default function LegendCustomLabelMark() { - return ( - - ); -} diff --git a/docs/data/charts/legend/LegendCustomLabelMark.tsx.preview b/docs/data/charts/legend/LegendCustomLabelMark.tsx.preview deleted file mode 100644 index 7ae1759a0c17d..0000000000000 --- a/docs/data/charts/legend/LegendCustomLabelMark.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/legend/LegendDimension.js b/docs/data/charts/legend/LegendDimension.js deleted file mode 100644 index 46140e49a6a33..0000000000000 --- a/docs/data/charts/legend/LegendDimension.js +++ /dev/null @@ -1,79 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { legendClasses } from '@mui/x-charts/ChartsLegend'; - -const data = [ - { id: 0, value: 10, label: 'Series A' }, - { id: 1, value: 15, label: 'Series B' }, - { id: 2, value: 20, label: 'Series C' }, - { id: 3, value: 10, label: 'Series D' }, - { id: 4, value: 15, label: 'Series E' }, - { id: 5, value: 20, label: 'Series F' }, - { id: 6, value: 10, label: 'Series G' }, -]; - -export default function LegendDimension() { - return ( - ( - - )} - getCode={({ props }) => { - return `import { PieChart } from '@mui/x-charts/PieChart'; -import { legendClasses } from '@mui/x-charts/ChartsLegend'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/legend/LegendLabelPositions.js b/docs/data/charts/legend/LegendLabelPositions.js deleted file mode 100644 index 6cf0c80bff097..0000000000000 --- a/docs/data/charts/legend/LegendLabelPositions.js +++ /dev/null @@ -1,245 +0,0 @@ -import { interpolateRdYlBu } from 'd3-scale-chromatic'; -import { - ContinuousColorLegend, - piecewiseColorDefaultLabelFormatter, - PiecewiseColorLegend, -} from '@mui/x-charts/ChartsLegend'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsAxesGradients } from '@mui/x-charts/internals'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import Divider from '@mui/material/Divider'; - -export default function LegendLabelPositions() { - const piecewiseFormatter = (params) => - params.index === 0 || params.index === params.length - ? piecewiseColorDefaultLabelFormatter(params) - : ''; - - return ( - `${value}°`, - colorMap: { - type: 'continuous', - min: -0.5, - max: 1.5, - color: (t) => interpolateRdYlBu(1 - t), - }, - }, - ]} - xAxis={[ - { - valueFormatter: (value) => `${value}°`, - colorMap: { - type: 'piecewise', - thresholds: [0, 1.5], - colors: [ - interpolateRdYlBu(0.9), - interpolateRdYlBu(0.5), - interpolateRdYlBu(0.1), - ], - }, - }, - ]} - > - - - Continuous - Horizontal - div': { flex: 1 } }} - > -
- start - -
-
- end - -
-
- extremes - -
-
- - Vertical - div': { - flex: 1, - height: '100%', - display: 'flex', - flexDirection: 'column', - }, - '& .MuiContinuousColorLegend-root': { flex: 1 }, - }} - > -
- start - -
-
- end - -
-
- extremes - -
-
-
- - Piecewise - Horizontal - div': { flex: 1 } }} - > -
- start - -
-
- end - -
-
- extremes - -
-
- inline-start - -
-
- inline-end - -
-
- - Vertical - div': { - flex: 1, - height: '100%', - display: 'flex', - flexDirection: 'column', - }, - }} - > -
- start - -
-
- end - -
-
- extremes - -
-
- inline-start - -
-
- inline-end - -
-
-
-
- - - -
- ); -} diff --git a/docs/data/charts/legend/LegendMarkType.js b/docs/data/charts/legend/LegendMarkType.js deleted file mode 100644 index d4253f4fb9997..0000000000000 --- a/docs/data/charts/legend/LegendMarkType.js +++ /dev/null @@ -1,48 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const series = [ - { id: 'id-0', data: [10], label: 'Series A' }, - { id: 'id-1', data: [15], label: 'Series B' }, - { id: 'id-2', data: [20], label: 'Series C' }, - { id: 'id-3', data: [10], label: 'Series D' }, -]; - -export default function LegendMarkType() { - return ( - ( - ({ - ...seriesItem, - labelMarkType: props.markType, - }))} - xAxis={[{ data: ['A'] }]} - height={200} - /> - )} - getCode={({ props }) => { - return `import { BarChart } from '@mui/x-charts/BarChart'; - - ({ - ...seriesItem, - labelMarkType: '${props.markType}', - })) - } -/> -`; - }} - /> - ); -} diff --git a/docs/data/charts/legend/LegendPosition.js b/docs/data/charts/legend/LegendPosition.js deleted file mode 100644 index 53be3c62367a1..0000000000000 --- a/docs/data/charts/legend/LegendPosition.js +++ /dev/null @@ -1,85 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { PieChart } from '@mui/x-charts/PieChart'; - -const data = [ - { id: 0, value: 10, label: 'Series A' }, - { id: 1, value: 15, label: 'Series B' }, - { id: 2, value: 20, label: 'Series C' }, - { id: 3, value: 10, label: 'Series D' }, - { id: 4, value: 15, label: 'Series E' }, - { id: 5, value: 20, label: 'Series F' }, - { id: 6, value: 10, label: 'Series G' }, - { id: 7, value: 15, label: 'Series H' }, - { id: 8, value: 20, label: 'Series I' }, - { id: 9, value: 10, label: 'Series J' }, - { id: 10, value: 15, label: 'Series K' }, - { id: 11, value: 20, label: 'Series L' }, - { id: 12, value: 10, label: 'Series M' }, - { id: 13, value: 15, label: 'Series N' }, - { id: 14, value: 20, label: 'Series O' }, -]; - -export default function LegendPosition() { - return ( - ( - - )} - getCode={({ props }) => { - return `import { PieChart } from '@mui/x-charts/PieChart'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/legend/LegendStyleSeries.js b/docs/data/charts/legend/LegendStyleSeries.js deleted file mode 100644 index 3b71d2e9f9729..0000000000000 --- a/docs/data/charts/legend/LegendStyleSeries.js +++ /dev/null @@ -1,66 +0,0 @@ -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; -import { legendClasses } from '@mui/x-charts/ChartsLegend'; -import { labelMarkClasses } from '@mui/x-charts/ChartsLabel'; - -const monthlySalesData = [ - { month: 'Jan', productA: 120, productB: 90 }, - { month: 'Feb', productA: 130, productB: 100 }, - { month: 'Mar', productA: 125, productB: 110 }, - { month: 'Apr', productA: 150, productB: 95 }, - { month: 'May', productA: 160, productB: 105 }, - { month: 'Jun', productA: 170, productB: 115 }, - { month: 'Jul', productA: 165, productB: 120 }, - { month: 'Aug', productA: 175, productB: 130 }, - { month: 'Sep', productA: 180, productB: 125 }, - { month: 'Oct', productA: 190, productB: 135 }, - { month: 'Nov', productA: 200, productB: 140 }, - { month: 'Dec', productA: 210, productB: 145 }, -]; - -const settings = { - series: [ - { - data: monthlySalesData.map((d) => d.productA), - label: 'Product A', - id: 'a', - }, - { - data: monthlySalesData.map((d) => d.productB), - label: 'Product B', - id: 'b', - }, - ], - xAxis: [ - { - scaleType: 'point', - data: monthlySalesData.map((d) => d.month), - }, - ], - yAxis: [{ width: 50, label: 'Sales' }], - height: 300, - margin: { right: 24 }, -}; - -export default function LegendStyleSeries() { - return ( - - ); -} diff --git a/docs/data/charts/legend/LegendTextStyling.js b/docs/data/charts/legend/LegendTextStyling.js deleted file mode 100644 index 6095a60fad408..0000000000000 --- a/docs/data/charts/legend/LegendTextStyling.js +++ /dev/null @@ -1,73 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { labelMarkClasses } from '@mui/x-charts/ChartsLabel'; - -const data = [ - { id: 0, value: 10, label: 'Series A' }, - { id: 1, value: 15, label: 'Series B' }, - { id: 2, value: 20, label: 'Series C' }, - { id: 3, value: 10, label: 'Series D' }, -]; - -export default function LegendTextStyling() { - return ( - ( - - )} - getCode={({ props }) => { - return `import { PieChart } from '@mui/x-charts/PieChart'; -import { labelMarkClasses } from '@mui/x-charts/ChartsLabel'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/legend/PiecewiseInteractiveDemo.js b/docs/data/charts/legend/PiecewiseInteractiveDemo.js deleted file mode 100644 index ca8258190108d..0000000000000 --- a/docs/data/charts/legend/PiecewiseInteractiveDemo.js +++ /dev/null @@ -1,118 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { - piecewiseColorDefaultLabelFormatter, - PiecewiseColorLegend, -} from '@mui/x-charts/ChartsLegend'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { dataset } from './tempAnomaly'; - -export default function PiecewiseInteractiveDemo() { - return ( - ( - `${value?.toFixed(2)}°`, - }, - ]} - xAxis={[ - { - scaleType: 'time', - dataKey: 'year', - disableLine: true, - valueFormatter: (value) => value.getFullYear().toString(), - colorMap: { - type: 'piecewise', - thresholds: [new Date(1961, 0, 1), new Date(1990, 0, 1)], - colors: ['blue', 'gray', 'red'], - }, - }, - ]} - yAxis={[ - { - disableLine: true, - disableTicks: true, - valueFormatter: (value) => `${value}°`, - }, - ]} - grid={{ horizontal: true }} - height={300} - slots={{ - legend: PiecewiseColorLegend, - }} - slotProps={{ - legend: { - axisDirection: 'x', - direction: props.direction, - markType: props.markType, - labelPosition: props.labelPosition, - labelFormatter: props.onlyShowExtremes - ? (params) => - params.index === 0 || params.index === params.length - ? piecewiseColorDefaultLabelFormatter(params) - : '' - : undefined, - sx: { - padding: props.padding, - }, - }, - }} - > - - - )} - getCode={({ props }) => { - return `import { - PiecewiseColorLegend, - piecewiseColorDefaultLabelFormatter, -} from '@mui/x-charts/ChartsLegend'; - -\n params.index === 0 || params.index === params.length\n ? piecewiseColorDefaultLabelFormatter(params) \n : ''" : ''} - }, - }} -/> -`; - }} - /> - ); -} diff --git a/docs/data/charts/legend/ScrollableLegend.js b/docs/data/charts/legend/ScrollableLegend.js deleted file mode 100644 index e4fde609f8ee5..0000000000000 --- a/docs/data/charts/legend/ScrollableLegend.js +++ /dev/null @@ -1,46 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { PieChart } from '@mui/x-charts/PieChart'; - -const series = [ - { - data: [ - { id: 0, value: 10, label: 'Series A' }, - { id: 1, value: 15, label: 'Series B' }, - { id: 2, value: 20, label: 'Series C' }, - { id: 3, value: 10, label: 'Series D' }, - { id: 4, value: 15, label: 'Series E' }, - { id: 5, value: 20, label: 'Series F' }, - { id: 6, value: 10, label: 'Series G' }, - { id: 7, value: 15, label: 'Series H' }, - { id: 8, value: 20, label: 'Series I' }, - { id: 9, value: 10, label: 'Series J' }, - { id: 10, value: 15, label: 'Series K' }, - { id: 11, value: 20, label: 'Series L' }, - { id: 12, value: 10, label: 'Series M' }, - { id: 13, value: 15, label: 'Series N' }, - { id: 14, value: 20, label: 'Series O' }, - ], - }, -]; - -export default function ScrollableLegend() { - return ( - - - - ); -} diff --git a/docs/data/charts/legend/ScrollableLegend.tsx.preview b/docs/data/charts/legend/ScrollableLegend.tsx.preview deleted file mode 100644 index 6f7c38b28639a..0000000000000 --- a/docs/data/charts/legend/ScrollableLegend.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/legend/StackLineVisibility.js b/docs/data/charts/legend/StackLineVisibility.js deleted file mode 100644 index 46165b058dcdc..0000000000000 --- a/docs/data/charts/legend/StackLineVisibility.js +++ /dev/null @@ -1,44 +0,0 @@ -import * as React from 'react'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const series = [ - { dataKey: 'newYork', label: 'New York', valueFormatter, stack: 'a' }, - { dataKey: 'london', label: 'London', valueFormatter, stack: 'a' }, - { dataKey: 'paris', label: 'Paris', valueFormatter, stack: 'a' }, -]; - -export default function StackLineVisibility() { - const [domainSeries, setDomainSeries] = React.useState('all'); - - return ( -
- - setDomainSeries(event.target.checked ? 'visible' : 'all') - } - /> - } - label="y-axis domain considers only visible series" - labelPlacement="end" - /> - -
- ); -} diff --git a/docs/data/charts/legend/ToggleSeriesVisibility.js b/docs/data/charts/legend/ToggleSeriesVisibility.js deleted file mode 100644 index 57bb6d66f6f0b..0000000000000 --- a/docs/data/charts/legend/ToggleSeriesVisibility.js +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -const series = [ - { dataKey: 'london', label: 'London', valueFormatter }, - { dataKey: 'paris', label: 'Paris', valueFormatter }, - { dataKey: 'newYork', label: 'New York', valueFormatter }, -]; - -export default function ToggleSeriesVisibility() { - const [domainSeries, setDomainSeries] = React.useState('all'); - - return ( -
- - setDomainSeries(event.target.checked ? 'visible' : 'all') - } - /> - } - label="x-axis domain considers only visible series" - labelPlacement="end" - /> - -
- ); -} diff --git a/docs/data/charts/legend/VeryBasicColorLegend.js b/docs/data/charts/legend/VeryBasicColorLegend.js deleted file mode 100644 index 7e87d5d8eaab0..0000000000000 --- a/docs/data/charts/legend/VeryBasicColorLegend.js +++ /dev/null @@ -1,60 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import { PiecewiseColorLegend } from '@mui/x-charts/ChartsLegend'; -import Stack from '@mui/material/Stack'; -import { dataset } from './tempAnomaly'; - -const data = { - dataset, - series: [ - { - label: 'Global temperature anomaly relative to 1961-1990', - dataKey: 'anomaly', - valueFormatter: (value) => `${value?.toFixed(2)}°`, - }, - ], - xAxis: [ - { - scaleType: 'time', - dataKey: 'year', - disableLine: true, - valueFormatter: (value) => value.getFullYear().toString(), - colorMap: { - type: 'piecewise', - thresholds: [new Date(1961, 0, 1), new Date(1990, 0, 1)], - colors: ['blue', 'gray', 'red'], - }, - }, - ], - yAxis: [ - { - disableLine: true, - disableTicks: true, - valueFormatter: (value) => `${value}°`, - }, - ], - grid: { horizontal: true }, - height: 300, - margin: { top: 20, right: 20 }, -}; - -export default function VeryBasicColorLegend() { - return ( - - - - ); -} diff --git a/docs/data/charts/legend/VeryBasicColorLegend.tsx.preview b/docs/data/charts/legend/VeryBasicColorLegend.tsx.preview deleted file mode 100644 index 183ce44d8eed9..0000000000000 --- a/docs/data/charts/legend/VeryBasicColorLegend.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/legend/VisibilityOnChange.js b/docs/data/charts/legend/VisibilityOnChange.js deleted file mode 100644 index 30668f3ff481e..0000000000000 --- a/docs/data/charts/legend/VisibilityOnChange.js +++ /dev/null @@ -1,35 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; - -const series = [ - { id: 'series-a', data: [20, 30, 25, 40, 30], label: 'Series A' }, - { id: 'series-b', data: [15, 25, 20, 35, 20], label: 'Series B' }, - { id: 'series-c', data: [10, 20, 15, 30, 25], label: 'Series C' }, -]; - -export default function VisibilityOnChange() { - const [hiddenItems, setHiddenItems] = React.useState([]); - - const visibleCount = series.length - hiddenItems.length; - - return ( - - setHiddenItems(newHiddenItems)} - /> - - Visible series: {visibleCount} / {series.length} - - - ); -} diff --git a/docs/data/charts/legend/VisibilityOnChange.tsx.preview b/docs/data/charts/legend/VisibilityOnChange.tsx.preview deleted file mode 100644 index 41bcab23941d1..0000000000000 --- a/docs/data/charts/legend/VisibilityOnChange.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - setHiddenItems(newHiddenItems)} -/> - - Visible series: {visibleCount} / {series.length} - \ No newline at end of file diff --git a/docs/data/charts/legend/BasicColorLegend.tsx b/docs/data/charts/legend/demos/basic-color-legend/BasicColorLegend.tsx similarity index 94% rename from docs/data/charts/legend/BasicColorLegend.tsx rename to docs/data/charts/legend/demos/basic-color-legend/BasicColorLegend.tsx index f63c1904c983d..6b4423d6a7cde 100644 --- a/docs/data/charts/legend/BasicColorLegend.tsx +++ b/docs/data/charts/legend/demos/basic-color-legend/BasicColorLegend.tsx @@ -3,11 +3,12 @@ import { LineChart } from '@mui/x-charts/LineChart'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; import { PiecewiseColorLegend } from '@mui/x-charts/ChartsLegend'; import Stack from '@mui/material/Stack'; -import { dataset } from './tempAnomaly'; +import { dataset } from '../../tempAnomaly'; export default function BasicColorLegend() { return ( + {/* @focus-start */} Global temperature anomaly relative to 1961-1990 average @@ -54,6 +55,7 @@ export default function BasicColorLegend() { > + {/* @focus-end */} ); } diff --git a/docs/data/charts/legend/demos/basic-color-legend/client.ts b/docs/data/charts/legend/demos/basic-color-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/basic-color-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/basic-color-legend/index.ts b/docs/data/charts/legend/demos/basic-color-legend/index.ts new file mode 100644 index 0000000000000..4b0facc64c4b5 --- /dev/null +++ b/docs/data/charts/legend/demos/basic-color-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicColorLegend from './BasicColorLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicColorLegend, { ClientProvider }); diff --git a/docs/data/charts/legend/BasicLegend.tsx b/docs/data/charts/legend/demos/basic-legend/BasicLegend.tsx similarity index 75% rename from docs/data/charts/legend/BasicLegend.tsx rename to docs/data/charts/legend/demos/basic-legend/BasicLegend.tsx index ac9d229d94706..68053e9644735 100644 --- a/docs/data/charts/legend/BasicLegend.tsx +++ b/docs/data/charts/legend/demos/basic-legend/BasicLegend.tsx @@ -1,8 +1,9 @@ import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import dataset from '../dataset/random/scatterParallel.json'; +import dataset from '../../../dataset/random/scatterParallel.json'; export default function BasicLegend() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/basic-legend/client.ts b/docs/data/charts/legend/demos/basic-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/basic-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/basic-legend/index.ts b/docs/data/charts/legend/demos/basic-legend/index.ts new file mode 100644 index 0000000000000..3348aae8f8c7a --- /dev/null +++ b/docs/data/charts/legend/demos/basic-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicLegend from './BasicLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicLegend, { ClientProvider }); diff --git a/docs/data/charts/legend/ContinuousInteractiveDemo.tsx b/docs/data/charts/legend/demos/continuous-interactive-demo/ContinuousInteractiveDemo.tsx similarity index 97% rename from docs/data/charts/legend/ContinuousInteractiveDemo.tsx rename to docs/data/charts/legend/demos/continuous-interactive-demo/ContinuousInteractiveDemo.tsx index 32b9e883ad0ae..24efa62ffb036 100644 --- a/docs/data/charts/legend/ContinuousInteractiveDemo.tsx +++ b/docs/data/charts/legend/demos/continuous-interactive-demo/ContinuousInteractiveDemo.tsx @@ -3,10 +3,11 @@ import { interpolateRdYlBu } from 'd3-scale-chromatic'; import { LineChart } from '@mui/x-charts/LineChart'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; import { ContinuousColorLegend } from '@mui/x-charts/ChartsLegend'; -import { dataset } from './tempAnomaly'; +import { dataset } from '../../tempAnomaly'; export default function ContinuousInteractiveDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/continuous-interactive-demo/client.ts b/docs/data/charts/legend/demos/continuous-interactive-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/continuous-interactive-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/continuous-interactive-demo/index.ts b/docs/data/charts/legend/demos/continuous-interactive-demo/index.ts new file mode 100644 index 0000000000000..09455c995f7fe --- /dev/null +++ b/docs/data/charts/legend/demos/continuous-interactive-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ContinuousInteractiveDemo from './ContinuousInteractiveDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ContinuousInteractiveDemo, { ClientProvider }); diff --git a/docs/data/charts/legend/ControlledVisibility.tsx b/docs/data/charts/legend/demos/controlled-visibility/ControlledVisibility.tsx similarity index 98% rename from docs/data/charts/legend/ControlledVisibility.tsx rename to docs/data/charts/legend/demos/controlled-visibility/ControlledVisibility.tsx index 4cbe3ec126e47..7f755b90894f8 100644 --- a/docs/data/charts/legend/ControlledVisibility.tsx +++ b/docs/data/charts/legend/demos/controlled-visibility/ControlledVisibility.tsx @@ -14,6 +14,7 @@ const data = [ ]; export default function ControlledVisibility() { + // @focus-start @padding 1 const [hiddenItems, setHiddenItems] = React.useState< VisibilityIdentifierWithType<'pie'>[] >([{ type: 'pie', seriesId: 'custom', dataIndex: 0 }]); @@ -106,4 +107,5 @@ export default function ControlledVisibility() { /> ); + // @focus-end } diff --git a/docs/data/charts/legend/demos/controlled-visibility/client.ts b/docs/data/charts/legend/demos/controlled-visibility/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/controlled-visibility/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/controlled-visibility/index.ts b/docs/data/charts/legend/demos/controlled-visibility/index.ts new file mode 100644 index 0000000000000..aeafe08f46c9e --- /dev/null +++ b/docs/data/charts/legend/demos/controlled-visibility/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ControlledVisibility from './ControlledVisibility'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ControlledVisibility, { ClientProvider }); diff --git a/docs/data/charts/legend/CustomLegend.tsx b/docs/data/charts/legend/demos/custom-legend/CustomLegend.tsx similarity index 94% rename from docs/data/charts/legend/CustomLegend.tsx rename to docs/data/charts/legend/demos/custom-legend/CustomLegend.tsx index 715b528c7b821..301aeedb15eae 100644 --- a/docs/data/charts/legend/CustomLegend.tsx +++ b/docs/data/charts/legend/demos/custom-legend/CustomLegend.tsx @@ -4,10 +4,8 @@ import Typography from '@mui/material/Typography'; import { useTheme } from '@mui/material/styles'; import { useLegend } from '@mui/x-charts/hooks'; import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; -import { - ChartsLabelCustomMarkProps, - ChartsLabelMark, -} from '@mui/x-charts/ChartsLabel'; +import type { ChartsLabelCustomMarkProps } from '@mui/x-charts/ChartsLabel'; +import { ChartsLabelMark } from '@mui/x-charts/ChartsLabel'; function LineWithMark({ color, className }: ChartsLabelCustomMarkProps) { return ( @@ -82,6 +80,7 @@ const dataset = [ ]; export default function CustomLegend() { + // @focus-start @padding 1 const theme = useTheme(); return ( @@ -117,4 +116,5 @@ export default function CustomLegend() { /> ); + // @focus-end } diff --git a/docs/data/charts/legend/demos/custom-legend/client.ts b/docs/data/charts/legend/demos/custom-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/custom-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/custom-legend/index.ts b/docs/data/charts/legend/demos/custom-legend/index.ts new file mode 100644 index 0000000000000..5a4cd3a1ed493 --- /dev/null +++ b/docs/data/charts/legend/demos/custom-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomLegend from './CustomLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomLegend, { ClientProvider }); diff --git a/docs/data/charts/legend/HiddenLegend.tsx b/docs/data/charts/legend/demos/hidden-legend/HiddenLegend.tsx similarity index 95% rename from docs/data/charts/legend/HiddenLegend.tsx rename to docs/data/charts/legend/demos/hidden-legend/HiddenLegend.tsx index d33b0ffa42de2..721ed978340e2 100644 --- a/docs/data/charts/legend/HiddenLegend.tsx +++ b/docs/data/charts/legend/demos/hidden-legend/HiddenLegend.tsx @@ -15,6 +15,7 @@ const series = [ ]; export default function HiddenLegend() { + // @focus-start @padding 1 const [isHidden, setIsHidden] = React.useState(false); const Toggle = ( @@ -33,4 +34,5 @@ export default function HiddenLegend() { ); + // @focus-end } diff --git a/docs/data/charts/legend/demos/hidden-legend/client.ts b/docs/data/charts/legend/demos/hidden-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/hidden-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/hidden-legend/index.ts b/docs/data/charts/legend/demos/hidden-legend/index.ts new file mode 100644 index 0000000000000..7355a58ef5572 --- /dev/null +++ b/docs/data/charts/legend/demos/hidden-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HiddenLegend from './HiddenLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HiddenLegend, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendClick.tsx b/docs/data/charts/legend/demos/legend-click/LegendClick.tsx similarity index 98% rename from docs/data/charts/legend/LegendClick.tsx rename to docs/data/charts/legend/demos/legend-click/LegendClick.tsx index e1344d2a9d132..bd9ae607a7187 100644 --- a/docs/data/charts/legend/LegendClick.tsx +++ b/docs/data/charts/legend/demos/legend-click/LegendClick.tsx @@ -52,6 +52,7 @@ const lineSeries = [ ] as const; export default function LegendClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); return ( @@ -140,4 +141,5 @@ ${itemData ? JSON.stringify(itemData[0], null, 2) : '// The data will appear her ); + // @focus-end } diff --git a/docs/data/charts/legend/demos/legend-click/client.ts b/docs/data/charts/legend/demos/legend-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-click/index.ts b/docs/data/charts/legend/demos/legend-click/index.ts new file mode 100644 index 0000000000000..0804ffc97799e --- /dev/null +++ b/docs/data/charts/legend/demos/legend-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendClick from './LegendClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendClick, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendCustomLabelMark.tsx b/docs/data/charts/legend/demos/legend-custom-label-mark/LegendCustomLabelMark.tsx similarity index 88% rename from docs/data/charts/legend/LegendCustomLabelMark.tsx rename to docs/data/charts/legend/demos/legend-custom-label-mark/LegendCustomLabelMark.tsx index 46179ae036588..ff8225c1b9a9c 100644 --- a/docs/data/charts/legend/LegendCustomLabelMark.tsx +++ b/docs/data/charts/legend/demos/legend-custom-label-mark/LegendCustomLabelMark.tsx @@ -1,5 +1,5 @@ import { BarChart } from '@mui/x-charts/BarChart'; -import { ChartsLabelCustomMarkProps } from '@mui/x-charts/ChartsLabel'; +import type { ChartsLabelCustomMarkProps } from '@mui/x-charts/ChartsLabel'; function HTMLCircle({ className, color }: ChartsLabelCustomMarkProps) { return ( @@ -21,6 +21,7 @@ function SVGDiamond({ className, color }: ChartsLabelCustomMarkProps) { export default function LegendCustomLabelMark() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/legend-custom-label-mark/client.ts b/docs/data/charts/legend/demos/legend-custom-label-mark/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-custom-label-mark/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-custom-label-mark/index.ts b/docs/data/charts/legend/demos/legend-custom-label-mark/index.ts new file mode 100644 index 0000000000000..b3b3d10d33b6a --- /dev/null +++ b/docs/data/charts/legend/demos/legend-custom-label-mark/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendCustomLabelMark from './LegendCustomLabelMark'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendCustomLabelMark, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendDimension.tsx b/docs/data/charts/legend/demos/legend-dimension/LegendDimension.tsx similarity index 97% rename from docs/data/charts/legend/LegendDimension.tsx rename to docs/data/charts/legend/demos/legend-dimension/LegendDimension.tsx index 1c8e15d83c982..1278b6bcdaf94 100644 --- a/docs/data/charts/legend/LegendDimension.tsx +++ b/docs/data/charts/legend/demos/legend-dimension/LegendDimension.tsx @@ -14,6 +14,7 @@ const data = [ export default function LegendDimension() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/legend-dimension/client.ts b/docs/data/charts/legend/demos/legend-dimension/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-dimension/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-dimension/index.ts b/docs/data/charts/legend/demos/legend-dimension/index.ts new file mode 100644 index 0000000000000..c80067af1dde9 --- /dev/null +++ b/docs/data/charts/legend/demos/legend-dimension/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendDimension from './LegendDimension'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendDimension, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendLabelPositions.tsx b/docs/data/charts/legend/demos/legend-label-positions/LegendLabelPositions.tsx similarity index 98% rename from docs/data/charts/legend/LegendLabelPositions.tsx rename to docs/data/charts/legend/demos/legend-label-positions/LegendLabelPositions.tsx index ccaf45b935457..c4c56a5144831 100644 --- a/docs/data/charts/legend/LegendLabelPositions.tsx +++ b/docs/data/charts/legend/demos/legend-label-positions/LegendLabelPositions.tsx @@ -1,9 +1,9 @@ import { interpolateRdYlBu } from 'd3-scale-chromatic'; +import type { PiecewiseLabelFormatterParams } from '@mui/x-charts/ChartsLegend'; import { ContinuousColorLegend, piecewiseColorDefaultLabelFormatter, PiecewiseColorLegend, - PiecewiseLabelFormatterParams, } from '@mui/x-charts/ChartsLegend'; import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; import { ChartsAxesGradients } from '@mui/x-charts/internals'; @@ -12,6 +12,7 @@ import Typography from '@mui/material/Typography'; import Divider from '@mui/material/Divider'; export default function LegendLabelPositions() { + // @focus-start @padding 1 const piecewiseFormatter = (params: PiecewiseLabelFormatterParams) => params.index === 0 || params.index === params.length ? piecewiseColorDefaultLabelFormatter(params) @@ -246,4 +247,5 @@ export default function LegendLabelPositions() { ); + // @focus-end } diff --git a/docs/data/charts/legend/demos/legend-label-positions/client.ts b/docs/data/charts/legend/demos/legend-label-positions/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-label-positions/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-label-positions/index.ts b/docs/data/charts/legend/demos/legend-label-positions/index.ts new file mode 100644 index 0000000000000..0eb3c91497a70 --- /dev/null +++ b/docs/data/charts/legend/demos/legend-label-positions/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendLabelPositions from './LegendLabelPositions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendLabelPositions, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendMarkType.tsx b/docs/data/charts/legend/demos/legend-mark-type/LegendMarkType.tsx similarity index 96% rename from docs/data/charts/legend/LegendMarkType.tsx rename to docs/data/charts/legend/demos/legend-mark-type/LegendMarkType.tsx index f426559c0d9ad..aaf2310b099fa 100644 --- a/docs/data/charts/legend/LegendMarkType.tsx +++ b/docs/data/charts/legend/demos/legend-mark-type/LegendMarkType.tsx @@ -10,6 +10,7 @@ const series = [ export default function LegendMarkType() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/legend-mark-type/client.ts b/docs/data/charts/legend/demos/legend-mark-type/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-mark-type/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-mark-type/index.ts b/docs/data/charts/legend/demos/legend-mark-type/index.ts new file mode 100644 index 0000000000000..069cb90fe8630 --- /dev/null +++ b/docs/data/charts/legend/demos/legend-mark-type/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendMarkType from './LegendMarkType'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendMarkType, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendPosition.tsx b/docs/data/charts/legend/demos/legend-position/LegendPosition.tsx similarity index 97% rename from docs/data/charts/legend/LegendPosition.tsx rename to docs/data/charts/legend/demos/legend-position/LegendPosition.tsx index 757982c1f98af..fe50dedf5f8fb 100644 --- a/docs/data/charts/legend/LegendPosition.tsx +++ b/docs/data/charts/legend/demos/legend-position/LegendPosition.tsx @@ -21,6 +21,7 @@ const data = [ export default function LegendPosition() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/legend-position/client.ts b/docs/data/charts/legend/demos/legend-position/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-position/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-position/index.ts b/docs/data/charts/legend/demos/legend-position/index.ts new file mode 100644 index 0000000000000..51f9732e9d788 --- /dev/null +++ b/docs/data/charts/legend/demos/legend-position/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendPosition from './LegendPosition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendPosition, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendStyleSeries.tsx b/docs/data/charts/legend/demos/legend-style-series/LegendStyleSeries.tsx similarity index 91% rename from docs/data/charts/legend/LegendStyleSeries.tsx rename to docs/data/charts/legend/demos/legend-style-series/LegendStyleSeries.tsx index 137fbb7b117c4..ba36a800061dd 100644 --- a/docs/data/charts/legend/LegendStyleSeries.tsx +++ b/docs/data/charts/legend/demos/legend-style-series/LegendStyleSeries.tsx @@ -1,4 +1,5 @@ -import { LineChart, LineChartProps, lineClasses } from '@mui/x-charts/LineChart'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; import { legendClasses } from '@mui/x-charts/ChartsLegend'; import { labelMarkClasses } from '@mui/x-charts/ChartsLabel'; @@ -43,6 +44,7 @@ const settings = { export default function LegendStyleSeries() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/legend-style-series/client.ts b/docs/data/charts/legend/demos/legend-style-series/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-style-series/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-style-series/index.ts b/docs/data/charts/legend/demos/legend-style-series/index.ts new file mode 100644 index 0000000000000..06b8cca109986 --- /dev/null +++ b/docs/data/charts/legend/demos/legend-style-series/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendStyleSeries from './LegendStyleSeries'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendStyleSeries, { ClientProvider }); diff --git a/docs/data/charts/legend/LegendTextStyling.tsx b/docs/data/charts/legend/demos/legend-text-styling/LegendTextStyling.tsx similarity index 97% rename from docs/data/charts/legend/LegendTextStyling.tsx rename to docs/data/charts/legend/demos/legend-text-styling/LegendTextStyling.tsx index 6095a60fad408..8d7c9f915000f 100644 --- a/docs/data/charts/legend/LegendTextStyling.tsx +++ b/docs/data/charts/legend/demos/legend-text-styling/LegendTextStyling.tsx @@ -11,6 +11,7 @@ const data = [ export default function LegendTextStyling() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/legend-text-styling/client.ts b/docs/data/charts/legend/demos/legend-text-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/legend-text-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/legend-text-styling/index.ts b/docs/data/charts/legend/demos/legend-text-styling/index.ts new file mode 100644 index 0000000000000..2bedf1586c22a --- /dev/null +++ b/docs/data/charts/legend/demos/legend-text-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LegendTextStyling from './LegendTextStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LegendTextStyling, { ClientProvider }); diff --git a/docs/data/charts/legend/PiecewiseInteractiveDemo.tsx b/docs/data/charts/legend/demos/piecewise-interactive-demo/PiecewiseInteractiveDemo.tsx similarity index 97% rename from docs/data/charts/legend/PiecewiseInteractiveDemo.tsx rename to docs/data/charts/legend/demos/piecewise-interactive-demo/PiecewiseInteractiveDemo.tsx index b2cbd738cba8d..c334c5e30d602 100644 --- a/docs/data/charts/legend/PiecewiseInteractiveDemo.tsx +++ b/docs/data/charts/legend/demos/piecewise-interactive-demo/PiecewiseInteractiveDemo.tsx @@ -5,10 +5,11 @@ import { PiecewiseColorLegend, } from '@mui/x-charts/ChartsLegend'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { dataset } from './tempAnomaly'; +import { dataset } from '../../tempAnomaly'; export default function PiecewiseInteractiveDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/legend/demos/piecewise-interactive-demo/client.ts b/docs/data/charts/legend/demos/piecewise-interactive-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/piecewise-interactive-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/piecewise-interactive-demo/index.ts b/docs/data/charts/legend/demos/piecewise-interactive-demo/index.ts new file mode 100644 index 0000000000000..022bac2f0c81d --- /dev/null +++ b/docs/data/charts/legend/demos/piecewise-interactive-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PiecewiseInteractiveDemo from './PiecewiseInteractiveDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PiecewiseInteractiveDemo, { ClientProvider }); diff --git a/docs/data/charts/legend/ScrollableLegend.tsx b/docs/data/charts/legend/demos/scrollable-legend/ScrollableLegend.tsx similarity index 96% rename from docs/data/charts/legend/ScrollableLegend.tsx rename to docs/data/charts/legend/demos/scrollable-legend/ScrollableLegend.tsx index e4fde609f8ee5..c2a5743005e14 100644 --- a/docs/data/charts/legend/ScrollableLegend.tsx +++ b/docs/data/charts/legend/demos/scrollable-legend/ScrollableLegend.tsx @@ -26,6 +26,7 @@ const series = [ export default function ScrollableLegend() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/legend/demos/scrollable-legend/client.ts b/docs/data/charts/legend/demos/scrollable-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/scrollable-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/scrollable-legend/index.ts b/docs/data/charts/legend/demos/scrollable-legend/index.ts new file mode 100644 index 0000000000000..1fd84ec3aa852 --- /dev/null +++ b/docs/data/charts/legend/demos/scrollable-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScrollableLegend from './ScrollableLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScrollableLegend, { ClientProvider }); diff --git a/docs/data/charts/legend/StackLineVisibility.tsx b/docs/data/charts/legend/demos/stack-line-visibility/StackLineVisibility.tsx similarity index 91% rename from docs/data/charts/legend/StackLineVisibility.tsx rename to docs/data/charts/legend/demos/stack-line-visibility/StackLineVisibility.tsx index 3493e43e8b9d0..bd2ba9ce48717 100644 --- a/docs/data/charts/legend/StackLineVisibility.tsx +++ b/docs/data/charts/legend/demos/stack-line-visibility/StackLineVisibility.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { dataset, valueFormatter } from '../../../dataset/weather'; const series = [ { dataKey: 'newYork', label: 'New York', valueFormatter, stack: 'a' }, @@ -11,6 +11,7 @@ const series = [ ]; export default function StackLineVisibility() { + // @focus-start @padding 1 const [domainSeries, setDomainSeries] = React.useState<'all' | 'visible'>('all'); return ( @@ -41,4 +42,5 @@ export default function StackLineVisibility() { />
); + // @focus-end } diff --git a/docs/data/charts/legend/demos/stack-line-visibility/client.ts b/docs/data/charts/legend/demos/stack-line-visibility/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/stack-line-visibility/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/stack-line-visibility/index.ts b/docs/data/charts/legend/demos/stack-line-visibility/index.ts new file mode 100644 index 0000000000000..0aa9f5242bfbe --- /dev/null +++ b/docs/data/charts/legend/demos/stack-line-visibility/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackLineVisibility from './StackLineVisibility'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackLineVisibility, { ClientProvider }); diff --git a/docs/data/charts/legend/ToggleSeriesVisibility.tsx b/docs/data/charts/legend/demos/toggle-series-visibility/ToggleSeriesVisibility.tsx similarity index 91% rename from docs/data/charts/legend/ToggleSeriesVisibility.tsx rename to docs/data/charts/legend/demos/toggle-series-visibility/ToggleSeriesVisibility.tsx index 5e30d307edbb3..5135de7c4ab52 100644 --- a/docs/data/charts/legend/ToggleSeriesVisibility.tsx +++ b/docs/data/charts/legend/demos/toggle-series-visibility/ToggleSeriesVisibility.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import { BarChart } from '@mui/x-charts/BarChart'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { dataset, valueFormatter } from '../../../dataset/weather'; const series = [ { dataKey: 'london', label: 'London', valueFormatter }, @@ -11,6 +11,7 @@ const series = [ ]; export default function ToggleSeriesVisibility() { + // @focus-start @padding 1 const [domainSeries, setDomainSeries] = React.useState<'all' | 'visible'>('all'); return ( @@ -38,4 +39,5 @@ export default function ToggleSeriesVisibility() { /> ); + // @focus-end } diff --git a/docs/data/charts/legend/demos/toggle-series-visibility/client.ts b/docs/data/charts/legend/demos/toggle-series-visibility/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/toggle-series-visibility/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/toggle-series-visibility/index.ts b/docs/data/charts/legend/demos/toggle-series-visibility/index.ts new file mode 100644 index 0000000000000..75d9606afe26b --- /dev/null +++ b/docs/data/charts/legend/demos/toggle-series-visibility/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ToggleSeriesVisibility from './ToggleSeriesVisibility'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ToggleSeriesVisibility, { ClientProvider }); diff --git a/docs/data/charts/legend/VeryBasicColorLegend.tsx b/docs/data/charts/legend/demos/very-basic-color-legend/VeryBasicColorLegend.tsx similarity index 86% rename from docs/data/charts/legend/VeryBasicColorLegend.tsx rename to docs/data/charts/legend/demos/very-basic-color-legend/VeryBasicColorLegend.tsx index 4956ca255a649..9b1273c4a2f3e 100644 --- a/docs/data/charts/legend/VeryBasicColorLegend.tsx +++ b/docs/data/charts/legend/demos/very-basic-color-legend/VeryBasicColorLegend.tsx @@ -1,7 +1,8 @@ -import { LineChart, LineChartProps } from '@mui/x-charts/LineChart'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; import { PiecewiseColorLegend } from '@mui/x-charts/ChartsLegend'; import Stack from '@mui/material/Stack'; -import { dataset } from './tempAnomaly'; +import { dataset } from '../../tempAnomaly'; const data: LineChartProps = { dataset, @@ -40,6 +41,7 @@ const data: LineChartProps = { export default function VeryBasicColorLegend() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/legend/demos/very-basic-color-legend/client.ts b/docs/data/charts/legend/demos/very-basic-color-legend/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/very-basic-color-legend/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/very-basic-color-legend/index.ts b/docs/data/charts/legend/demos/very-basic-color-legend/index.ts new file mode 100644 index 0000000000000..23cd98163ed22 --- /dev/null +++ b/docs/data/charts/legend/demos/very-basic-color-legend/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import VeryBasicColorLegend from './VeryBasicColorLegend'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, VeryBasicColorLegend, { ClientProvider }); diff --git a/docs/data/charts/legend/VisibilityOnChange.tsx b/docs/data/charts/legend/demos/visibility-on-change/VisibilityOnChange.tsx similarity index 96% rename from docs/data/charts/legend/VisibilityOnChange.tsx rename to docs/data/charts/legend/demos/visibility-on-change/VisibilityOnChange.tsx index 8722b7fc0ebee..ee47ae0916ef1 100644 --- a/docs/data/charts/legend/VisibilityOnChange.tsx +++ b/docs/data/charts/legend/demos/visibility-on-change/VisibilityOnChange.tsx @@ -11,6 +11,7 @@ const series = [ ]; export default function VisibilityOnChange() { + // @focus-start @padding 1 const [hiddenItems, setHiddenItems] = React.useState([]); const visibleCount = series.length - hiddenItems.length; @@ -33,4 +34,5 @@ export default function VisibilityOnChange() { ); + // @focus-end } diff --git a/docs/data/charts/legend/demos/visibility-on-change/client.ts b/docs/data/charts/legend/demos/visibility-on-change/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/legend/demos/visibility-on-change/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/legend/demos/visibility-on-change/index.ts b/docs/data/charts/legend/demos/visibility-on-change/index.ts new file mode 100644 index 0000000000000..7b371e21ea330 --- /dev/null +++ b/docs/data/charts/legend/demos/visibility-on-change/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import VisibilityOnChange from './VisibilityOnChange'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, VisibilityOnChange, { ClientProvider }); diff --git a/docs/data/charts/legend/legend.md b/docs/data/charts/legend/legend.md index bbc34bdf71a05..8e5f8cada44c0 100644 --- a/docs/data/charts/legend/legend.md +++ b/docs/data/charts/legend/legend.md @@ -12,7 +12,7 @@ A legend is a UI element that maps symbols and colors to series labels, helping In chart components, the legend links series with `label` properties and their colors. -{{"demo": "BasicLegend.js"}} +{{"component": "file://./demos/basic-legend/index.ts"}} ## Toggle visibility @@ -25,7 +25,7 @@ To only consider visible series set the axis property `domainSeries` to `'visibl This demo shows how hiding series can impact the x-axis. -{{"demo": "ToggleSeriesVisibility.js"}} +{{"component": "file://./demos/toggle-series-visibility/index.ts"}} ### Stack series edge case @@ -35,7 +35,7 @@ Otherwise, hiding the bottom series could bring the other one outside of the axi In this demo, hiding the blue series (New York) decreases the values of the two other ones as expected. But if the y-axis does not take it into consideration, the yellow series which has some values below 50 goes outside of the drawing area. -{{"demo": "StackLineVisibility.js"}} +{{"component": "file://./demos/stack-line-visibility/index.ts"}} ### Visibility change callback @@ -46,7 +46,7 @@ To set the initial hidden items, use the `initialHiddenItems` prop. The demo below shows a line chart where you can toggle series' visibility and see the count of currently visible series. -{{"demo": "VisibilityOnChange.js"}} +{{"component": "file://./demos/visibility-on-change/index.ts"}} :::info You can combine the `toggleVisibilityOnClick` prop with the `onItemClick()` handler. @@ -65,7 +65,7 @@ All identifiers require a `type` field indicating the series type (for example, The demo below shows how to control which items are visible using buttons. -{{"demo": "ControlledVisibility.js"}} +{{"component": "file://./demos/controlled-visibility/index.ts"}} ## Customization @@ -82,7 +82,7 @@ Each legend item is composed of two main elements: the `mark` and the `label`. The example below shows how to customize parts of the legend and how to use both the `legendClasses` variable and the CSS class directly. -{{"demo": "LegendDimension.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/legend-dimension/index.ts", "hideToolbar": true, "bg": "playground"}} ### Position @@ -105,13 +105,13 @@ When [composing custom charts](/x/react-charts/quickstart/#composable-charts), t Or you can place the legend wherever you prefer. ::: -{{"demo": "LegendPosition.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/legend-position/index.ts", "hideToolbar": true, "bg": "playground"}} ### Hiding You can hide the legend with the `hideLegend` prop of the Chart. -{{"demo": "HiddenLegend.js"}} +{{"component": "file://./demos/hidden-legend/index.ts"}} ### Label styling @@ -120,20 +120,20 @@ You can change the `label` style by targeting the root component's font properti The mark is an SVG element, so you can use the `fill` property to change its color. You can do this via the `sx` prop, CSS Modules, or other CSS approaches, as shown in the demo below: -{{"demo": "LegendTextStyling.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/legend-text-styling/index.ts", "hideToolbar": true, "bg": "playground"}} ### Change mark shape You can change the mark shape using the `labelMarkType` property of the series item. For the `pie` series, the `labelMarkType` property is also available for each pie slice. -{{"demo": "LegendMarkType.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/legend-mark-type/index.ts", "hideToolbar": true, "bg": "playground"}} #### Custom shapes For more advanced use cases, you can provide a component to the `labelMarkType` property of each series to fully customize the mark. -{{"demo": "LegendCustomLabelMark.js" }} +{{"component": "file://./demos/legend-custom-label-mark/index.ts"}} Passing a component to `labelMarkType` affects not only the legend but also other places where the label mark is shown, such as tooltips. @@ -147,14 +147,14 @@ To ensure compatibility with [gradients and patterns](/x/react-charts/styling/#g You can make the legend scrollable by setting `overflowY` for vertical legends or `overflowX` for horizontal legends. Make sure the legend container has a fixed height or width to enable scrolling. -{{"demo": "ScrollableLegend.js"}} +{{"component": "file://./demos/scrollable-legend/index.ts"}} ### Series styling You can use CSS to style the series in the legend. Each legend item has a `data-series` attribute where its value is the ID of the series it represents. -{{"demo": "LegendStyleSeries.js"}} +{{"component": "file://./demos/legend-style-series/index.ts"}} ### Custom component @@ -166,7 +166,7 @@ The demo below shows how to use `labelMarkType` together with `useLegend()` to c This approach uses slots to render the legend items. See [HTML components](/x/react-charts/components/#html-components) for a demo that shows how to implement it when composing a custom chart. -{{"demo": "CustomLegend.js"}} +{{"component": "file://./demos/custom-legend/index.ts"}} ## Color legend @@ -177,7 +177,7 @@ To display a legend associated with a [`colorMap`](/x/react-charts/styling/#valu You can override the `legend` slot to display the desired legend, or use the [composition API](/x/react-charts/composition/) to add as many legends as needed. -{{"demo": "VeryBasicColorLegend.js"}} +{{"component": "file://./demos/very-basic-color-legend/index.ts"}} ### Select data @@ -186,7 +186,7 @@ To select the color mapping to represent, use the following props: - `axisDirection`: `'x'`, `'y'`, or `'z'` - indicates which axis contains the `colorMap` definition - `axisId`: The ID of the axis to use (if the selected direction contains multiple axes) -{{"demo": "BasicColorLegend.js"}} +{{"component": "file://./demos/basic-color-legend/index.ts"}} ### Position @@ -207,7 +207,7 @@ For the piecewise legend, two extra values are accepted: - With `direction='horizontal'`, `'inline-start'` and `'inline-end'` position labels inline with the marker - With `direction='vertical'`, these work the same as `'start'` and `'end'` -{{"demo": "LegendLabelPositions.js"}} +{{"component": "file://./demos/legend-label-positions/index.ts"}} ### Continuous color mapping @@ -220,7 +220,7 @@ They accept either a string to display or a function `({value, formattedValue}) You can also reverse the gradient with the `reverse` prop. -{{"demo": "ContinuousInteractiveDemo.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/continuous-interactive-demo/index.ts", "hideToolbar": true, "bg": "playground"}} ### Piecewise color mapping @@ -241,7 +241,7 @@ labelFormatter = ({ index, length, min, max, formattedMin, formattedMax }) => You can change the mark type with the `markType` prop. Since the color values are based on the axis and not the series, you must set `markType` directly on the legend. -{{"demo": "PiecewiseInteractiveDemo.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/piecewise-interactive-demo/index.ts", "hideToolbar": true, "bg": "playground"}} ## Click event @@ -259,4 +259,4 @@ const clickHandler = ( The `context` object contains different properties depending on the legend type. Click the legend items in the demo below to see their content. -{{"demo": "LegendClick.js"}} +{{"component": "file://./demos/legend-click/index.ts"}} diff --git a/docs/data/charts/line-demo/BiaxialLineChart.js b/docs/data/charts/line-demo/BiaxialLineChart.js deleted file mode 100644 index 444fc2579f68b..0000000000000 --- a/docs/data/charts/line-demo/BiaxialLineChart.js +++ /dev/null @@ -1,32 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function BiaxialLineChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/line-demo/BiaxialLineChart.tsx.preview b/docs/data/charts/line-demo/BiaxialLineChart.tsx.preview deleted file mode 100644 index 48fb2e9ef7d49..0000000000000 --- a/docs/data/charts/line-demo/BiaxialLineChart.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/line-demo/CustomLabelChart.js b/docs/data/charts/line-demo/CustomLabelChart.js deleted file mode 100644 index 136a21307ba84..0000000000000 --- a/docs/data/charts/line-demo/CustomLabelChart.js +++ /dev/null @@ -1,53 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const margin = { right: 24 }; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -function CustomMark(props) { - const { x, y, color } = props; - - return ( - - - - {pData[props.dataIndex].toString()} - - - ); -} - -export default function CustomLabelChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/line-demo/CustomLabelChart.tsx.preview b/docs/data/charts/line-demo/CustomLabelChart.tsx.preview deleted file mode 100644 index 8a91d677c4ca3..0000000000000 --- a/docs/data/charts/line-demo/CustomLabelChart.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/line-demo/CustomLineMarks.js b/docs/data/charts/line-demo/CustomLineMarks.js deleted file mode 100644 index 933c2a2512686..0000000000000 --- a/docs/data/charts/line-demo/CustomLineMarks.js +++ /dev/null @@ -1,41 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function CustomLineMarks() { - return ( - - index % 2 === 0, - }, - { - data: uData, - label: 'uv', - shape: 'diamond', - showMark: ({ index }) => index % 2 === 0, - }, - ]} - xAxis={[{ scaleType: 'point', data: xLabels, height: 28 }]} - yAxis={[{ width: 50 }]} - margin={margin} - /> - - ); -} diff --git a/docs/data/charts/line-demo/DashedLineChart.js b/docs/data/charts/line-demo/DashedLineChart.js deleted file mode 100644 index a87b18796dc11..0000000000000 --- a/docs/data/charts/line-demo/DashedLineChart.js +++ /dev/null @@ -1,48 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function DashedLineChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/line-demo/LargerHighlightLineNoSnap.js b/docs/data/charts/line-demo/LargerHighlightLineNoSnap.js deleted file mode 100644 index 9c5682c5144ac..0000000000000 --- a/docs/data/charts/line-demo/LargerHighlightLineNoSnap.js +++ /dev/null @@ -1,93 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -const highlightScope = { - highlight: 'item', - fade: 'global', -}; - -const settings = { - height: 300, - series: [ - { data: pData, label: 'pv', highlightScope }, - { data: uData, label: 'uv', highlightScope }, - ], - xAxis: [{ scaleType: 'point', data: xLabels }], - yAxis: [{ width: 50 }], - margin, -}; - -function CustomLine(props) { - const { d, ownerState, className, ...other } = props; - - return ( - - - - - ); -} - -export default function LargerHighlightLineNoSnap() { - const [showInteractionArea, setShowInteractionArea] = React.useState(true); - - return ( - - setShowInteractionArea(event.target.checked)} - /> - } - label="Show highlight area" - labelPlacement="end" - /> - - - ); -} diff --git a/docs/data/charts/line-demo/LargerHighlightLineNoSnap.tsx.preview b/docs/data/charts/line-demo/LargerHighlightLineNoSnap.tsx.preview deleted file mode 100644 index 7576f41adde83..0000000000000 --- a/docs/data/charts/line-demo/LargerHighlightLineNoSnap.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - setShowInteractionArea(event.target.checked)} - /> - } - label="Show highlight area" - labelPlacement="end" -/> - \ No newline at end of file diff --git a/docs/data/charts/line-demo/LineChartConnectNulls.js b/docs/data/charts/line-demo/LineChartConnectNulls.js deleted file mode 100644 index 0927a7717afc6..0000000000000 --- a/docs/data/charts/line-demo/LineChartConnectNulls.js +++ /dev/null @@ -1,22 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const margin = { right: 24 }; -const data = [4000, 3000, 2000, null, 1890, 2390, 3490]; -const xData = ['Page A', 'Page B', 'Page C', 'Page D', 'Page E', 'Page F', 'Page G']; -export default function LineChartConnectNulls() { - return ( - - - - - ); -} diff --git a/docs/data/charts/line-demo/LineChartConnectNulls.tsx.preview b/docs/data/charts/line-demo/LineChartConnectNulls.tsx.preview deleted file mode 100644 index 8eace27fe2020..0000000000000 --- a/docs/data/charts/line-demo/LineChartConnectNulls.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/line-demo/LineChartWithReferenceLines.js b/docs/data/charts/line-demo/LineChartWithReferenceLines.js deleted file mode 100644 index d8d4f9e807959..0000000000000 --- a/docs/data/charts/line-demo/LineChartWithReferenceLines.js +++ /dev/null @@ -1,45 +0,0 @@ -import Box from '@mui/material/Box'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function LineChartWithReferenceLines() { - return ( - - - - - - - - - - ); -} diff --git a/docs/data/charts/line-demo/LineWithUncertaintyArea.js b/docs/data/charts/line-demo/LineWithUncertaintyArea.js deleted file mode 100644 index ec5f682512a81..0000000000000 --- a/docs/data/charts/line-demo/LineWithUncertaintyArea.js +++ /dev/null @@ -1,168 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { AnimatedLine, LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; -import { - useChartId, - useDrawingArea, - useLineSeries, - useXAxis, - useXScale, - useYScale, -} from '@mui/x-charts/hooks'; -import * as d3Shape from '@mui/x-charts-vendor/d3-shape'; - -import { useTheme } from '@mui/material/styles'; - -function CustomAnimatedLine(props) { - const { limit, sxBefore, sxAfter, ...other } = props; - const { top, bottom, height, left, width } = useDrawingArea(); - const scale = useXScale(); - const chartId = useChartId(); - - if (limit === undefined) { - return ; - } - - const limitPosition = scale(limit); // Convert value to x coordinate. - - if (limitPosition === undefined) { - return ; - } - - const clipIdleft = `${chartId}-${props.ownerState.seriesId}-line-limit-${limit}-1`; - const clipIdRight = `${chartId}-${props.ownerState.seriesId}-line-limit-${limit}-2`; - return ( - - {/* Clip to show the line before the limit */} - - - - {/* Clip to show the line after the limit */} - - - - - - - - - - - ); -} - -function ForecastArea({ limit, forecast }) { - const lineSeries = useLineSeries(); - const xAxis = useXAxis(); - const xScale = useXScale(); - const yScale = useYScale(); - - const xAxisData = xAxis.data?.slice(limit) ?? []; - - if (!yScale) { - return null; - } - - return ( - - {lineSeries.map((series) => { - const data = xAxisData.map((v, i) => ({ - x: v, - y0: forecast[i].y0, - y1: forecast[i].y1, - })); - - const path = d3Shape - .area() - .x((d) => xScale(d.x)) - .y0((d) => yScale(d.y0)) - .y1((d) => yScale(d.y1))(data); - - return ; - })} - - ); -} - -function ShadedBackground({ limit }) { - const { top, bottom, height, left, width } = useDrawingArea(); - const scale = useXScale(); - const limitPosition = scale(limit); - const theme = useTheme(); - const fill = - theme.palette.mode === 'dark' - ? theme.palette.grey[900] - : theme.palette.grey[400]; - - return ( - - ); -} - -export default function LineWithUncertaintyArea() { - const id = React.useId(); - const clipPathId = `${id}-clip-path`; - - return ( - - `${v}${i.dataIndex > 5 ? ' (estimated)' : ''}`, - showMark: true, - }, - ]} - xAxis={[{ data: [0, 1, 2, 3, 4, 5, 6, 7, 8] }]} - sx={{ '& .line-after path': { strokeDasharray: '10 5' } }} - > - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/line-demo/LiveLineChartNoSnap.js b/docs/data/charts/line-demo/LiveLineChartNoSnap.js deleted file mode 100644 index 60343f1f6e6d0..0000000000000 --- a/docs/data/charts/line-demo/LiveLineChartNoSnap.js +++ /dev/null @@ -1,86 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const dateFormatter = Intl.DateTimeFormat(undefined, { - month: '2-digit', - day: '2-digit', -}); -const oneDay = 24 * 60 * 60 * 1000; // in milliseconds - -const length = 50; -const initialFirstData = Array.from({ length }).map( - (_, __, array) => (array.at(-1) ?? 0) + randBetween(-100, 500), -); -const initialSecondData = Array.from({ length }).map( - (_, __, array) => (array.at(-1) ?? 0) + randBetween(-500, 100), -); - -export default function LiveLineChartNoSnap() { - const [running, setRunning] = React.useState(false); - const [date, setDate] = React.useState(new Date(2000, 0, 0)); - const [firstData, setFirstData] = React.useState(initialFirstData); - const [secondData, setSecondData] = React.useState(initialSecondData); - - React.useEffect(() => { - if (!running) { - return undefined; - } - const intervalId = setInterval(() => { - setDate((prev) => new Date(prev.getTime() + oneDay)); - setFirstData((prev) => [ - ...prev.slice(1), - prev.at(-1) + randBetween(-500, 500), - ]); - setSecondData((prev) => [ - ...prev.slice(1), - prev.at(-1) + randBetween(-500, 500), - ]); - }, 100); - - return () => { - clearInterval(intervalId); - }; - }, [running]); - - return ( - - new Date(date.getTime() + i * oneDay), - ), - valueFormatter: (value) => dateFormatter.format(value), - }, - ]} - yAxis={[{ width: 50 }]} - margin={{ right: 24 }} - /> - - - - ); -} - -function randBetween(min, max) { - // eslint-disable-next-line no-restricted-properties -- live animation demo - return Math.floor(Math.random() * (max - min + 1) + min); -} diff --git a/docs/data/charts/line-demo/SimpleLineChart.js b/docs/data/charts/line-demo/SimpleLineChart.js deleted file mode 100644 index 63cb9d1b930b4..0000000000000 --- a/docs/data/charts/line-demo/SimpleLineChart.js +++ /dev/null @@ -1,31 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function SimpleLineChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/line-demo/SimpleLineChart.tsx.preview b/docs/data/charts/line-demo/SimpleLineChart.tsx.preview deleted file mode 100644 index d48749234c4c0..0000000000000 --- a/docs/data/charts/line-demo/SimpleLineChart.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/line-demo/TinyLineChart.js b/docs/data/charts/line-demo/TinyLineChart.js deleted file mode 100644 index 4f0b40d24d27a..0000000000000 --- a/docs/data/charts/line-demo/TinyLineChart.js +++ /dev/null @@ -1,41 +0,0 @@ -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { LinePlot, MarkPlot, lineClasses } from '@mui/x-charts/LineChart'; - -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function TinyLineChart() { - return ( - - - - - ); -} diff --git a/docs/data/charts/line-demo/BiaxialLineChart.tsx b/docs/data/charts/line-demo/demos/biaxial-line-chart/BiaxialLineChart.tsx similarity index 93% rename from docs/data/charts/line-demo/BiaxialLineChart.tsx rename to docs/data/charts/line-demo/demos/biaxial-line-chart/BiaxialLineChart.tsx index 444fc2579f68b..8578d156b2a7f 100644 --- a/docs/data/charts/line-demo/BiaxialLineChart.tsx +++ b/docs/data/charts/line-demo/demos/biaxial-line-chart/BiaxialLineChart.tsx @@ -16,6 +16,7 @@ const xLabels = [ export default function BiaxialLineChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/line-demo/demos/biaxial-line-chart/client.ts b/docs/data/charts/line-demo/demos/biaxial-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/biaxial-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/biaxial-line-chart/index.ts b/docs/data/charts/line-demo/demos/biaxial-line-chart/index.ts new file mode 100644 index 0000000000000..50e0c85dc9cc0 --- /dev/null +++ b/docs/data/charts/line-demo/demos/biaxial-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BiaxialLineChart from './BiaxialLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BiaxialLineChart, { ClientProvider }); diff --git a/docs/data/charts/line-demo/CustomLabelChart.tsx b/docs/data/charts/line-demo/demos/custom-label-chart/CustomLabelChart.tsx similarity index 86% rename from docs/data/charts/line-demo/CustomLabelChart.tsx rename to docs/data/charts/line-demo/demos/custom-label-chart/CustomLabelChart.tsx index fc7554a0e7cae..73ca3153d0c09 100644 --- a/docs/data/charts/line-demo/CustomLabelChart.tsx +++ b/docs/data/charts/line-demo/demos/custom-label-chart/CustomLabelChart.tsx @@ -1,5 +1,6 @@ import Box from '@mui/material/Box'; -import { LineChart, MarkElementProps } from '@mui/x-charts/LineChart'; +import type { MarkElementProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; const margin = { right: 24 }; const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; @@ -39,6 +40,7 @@ function CustomMark(props: MarkElementProps) { export default function CustomLabelChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/line-demo/demos/custom-label-chart/client.ts b/docs/data/charts/line-demo/demos/custom-label-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/custom-label-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/custom-label-chart/index.ts b/docs/data/charts/line-demo/demos/custom-label-chart/index.ts new file mode 100644 index 0000000000000..8256b1cc732a0 --- /dev/null +++ b/docs/data/charts/line-demo/demos/custom-label-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomLabelChart from './CustomLabelChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomLabelChart, { ClientProvider }); diff --git a/docs/data/charts/line-demo/CustomLineMarks.tsx b/docs/data/charts/line-demo/demos/custom-line-marks/CustomLineMarks.tsx similarity index 94% rename from docs/data/charts/line-demo/CustomLineMarks.tsx rename to docs/data/charts/line-demo/demos/custom-line-marks/CustomLineMarks.tsx index 933c2a2512686..64528e31f0e8e 100644 --- a/docs/data/charts/line-demo/CustomLineMarks.tsx +++ b/docs/data/charts/line-demo/demos/custom-line-marks/CustomLineMarks.tsx @@ -17,6 +17,7 @@ const xLabels = [ export default function CustomLineMarks() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/line-demo/demos/custom-line-marks/client.ts b/docs/data/charts/line-demo/demos/custom-line-marks/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/custom-line-marks/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/custom-line-marks/index.ts b/docs/data/charts/line-demo/demos/custom-line-marks/index.ts new file mode 100644 index 0000000000000..2365b9cc4c56f --- /dev/null +++ b/docs/data/charts/line-demo/demos/custom-line-marks/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomLineMarks from './CustomLineMarks'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomLineMarks, { ClientProvider }); diff --git a/docs/data/charts/line-demo/DashedLineChart.tsx b/docs/data/charts/line-demo/demos/dashed-line-chart/DashedLineChart.tsx similarity index 96% rename from docs/data/charts/line-demo/DashedLineChart.tsx rename to docs/data/charts/line-demo/demos/dashed-line-chart/DashedLineChart.tsx index a87b18796dc11..73010c2272521 100644 --- a/docs/data/charts/line-demo/DashedLineChart.tsx +++ b/docs/data/charts/line-demo/demos/dashed-line-chart/DashedLineChart.tsx @@ -17,6 +17,7 @@ const xLabels = [ export default function DashedLineChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/line-demo/demos/dashed-line-chart/client.ts b/docs/data/charts/line-demo/demos/dashed-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/dashed-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/dashed-line-chart/index.ts b/docs/data/charts/line-demo/demos/dashed-line-chart/index.ts new file mode 100644 index 0000000000000..6b4a06b37a4a5 --- /dev/null +++ b/docs/data/charts/line-demo/demos/dashed-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DashedLineChart from './DashedLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DashedLineChart, { ClientProvider }); diff --git a/docs/data/charts/line-demo/LargerHighlightLineNoSnap.tsx b/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/LargerHighlightLineNoSnap.tsx similarity index 90% rename from docs/data/charts/line-demo/LargerHighlightLineNoSnap.tsx rename to docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/LargerHighlightLineNoSnap.tsx index e57301a8a54dc..b91aff228c487 100644 --- a/docs/data/charts/line-demo/LargerHighlightLineNoSnap.tsx +++ b/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/LargerHighlightLineNoSnap.tsx @@ -2,8 +2,9 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; -import { AnimatedLineProps, LineChart } from '@mui/x-charts/LineChart'; -import { HighlightScope } from '@mui/x-charts/context'; +import type { AnimatedLineProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; +import type { HighlightScope } from '@mui/x-charts/context'; const margin = { right: 24 }; const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; @@ -64,6 +65,7 @@ function CustomLine(props: AnimatedLineProps) { } export default function LargerHighlightLineNoSnap() { + // @focus-start @padding 1 const [showInteractionArea, setShowInteractionArea] = React.useState(true); return ( @@ -91,4 +93,5 @@ export default function LargerHighlightLineNoSnap() { ); + // @focus-end } diff --git a/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/client.ts b/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/index.ts b/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/index.ts new file mode 100644 index 0000000000000..e92c7decd8295 --- /dev/null +++ b/docs/data/charts/line-demo/demos/larger-highlight-line-no-snap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LargerHighlightLineNoSnap from './LargerHighlightLineNoSnap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LargerHighlightLineNoSnap, { ClientProvider }); diff --git a/docs/data/charts/line-demo/LineChartConnectNulls.tsx b/docs/data/charts/line-demo/demos/line-chart-connect-nulls/LineChartConnectNulls.tsx similarity index 93% rename from docs/data/charts/line-demo/LineChartConnectNulls.tsx rename to docs/data/charts/line-demo/demos/line-chart-connect-nulls/LineChartConnectNulls.tsx index 0927a7717afc6..07842886ae899 100644 --- a/docs/data/charts/line-demo/LineChartConnectNulls.tsx +++ b/docs/data/charts/line-demo/demos/line-chart-connect-nulls/LineChartConnectNulls.tsx @@ -7,6 +7,7 @@ const xData = ['Page A', 'Page B', 'Page C', 'Page D', 'Page E', 'Page F', 'Page export default function LineChartConnectNulls() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/line-demo/demos/line-chart-connect-nulls/client.ts b/docs/data/charts/line-demo/demos/line-chart-connect-nulls/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/line-chart-connect-nulls/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/line-chart-connect-nulls/index.ts b/docs/data/charts/line-demo/demos/line-chart-connect-nulls/index.ts new file mode 100644 index 0000000000000..91634490f9891 --- /dev/null +++ b/docs/data/charts/line-demo/demos/line-chart-connect-nulls/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineChartConnectNulls from './LineChartConnectNulls'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineChartConnectNulls, { ClientProvider }); diff --git a/docs/data/charts/line-demo/LineChartWithReferenceLines.tsx b/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/LineChartWithReferenceLines.tsx similarity index 96% rename from docs/data/charts/line-demo/LineChartWithReferenceLines.tsx rename to docs/data/charts/line-demo/demos/line-chart-with-reference-lines/LineChartWithReferenceLines.tsx index d8d4f9e807959..0636ead088365 100644 --- a/docs/data/charts/line-demo/LineChartWithReferenceLines.tsx +++ b/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/LineChartWithReferenceLines.tsx @@ -21,6 +21,7 @@ const xLabels = [ export default function LineChartWithReferenceLines() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/client.ts b/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/index.ts b/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/index.ts new file mode 100644 index 0000000000000..c4ee0819c1037 --- /dev/null +++ b/docs/data/charts/line-demo/demos/line-chart-with-reference-lines/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineChartWithReferenceLines from './LineChartWithReferenceLines'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineChartWithReferenceLines, { ClientProvider }); diff --git a/docs/data/charts/line-demo/LineWithUncertaintyArea.tsx b/docs/data/charts/line-demo/demos/line-with-uncertainty-area/LineWithUncertaintyArea.tsx similarity index 93% rename from docs/data/charts/line-demo/LineWithUncertaintyArea.tsx rename to docs/data/charts/line-demo/demos/line-with-uncertainty-area/LineWithUncertaintyArea.tsx index 3991982c8dd9f..1dcae84f095c3 100644 --- a/docs/data/charts/line-demo/LineWithUncertaintyArea.tsx +++ b/docs/data/charts/line-demo/demos/line-with-uncertainty-area/LineWithUncertaintyArea.tsx @@ -1,11 +1,7 @@ import * as React from 'react'; import Box from '@mui/material/Box'; -import { - AnimatedLine, - AnimatedLineProps, - LinePlot, - MarkPlot, -} from '@mui/x-charts/LineChart'; +import type { AnimatedLineProps } from '@mui/x-charts/LineChart'; +import { AnimatedLine, LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; @@ -20,8 +16,9 @@ import { useYScale, } from '@mui/x-charts/hooks'; import * as d3Shape from '@mui/x-charts-vendor/d3-shape'; -import { SxProps } from '@mui/system'; -import { useTheme, Theme } from '@mui/material/styles'; +import type { SxProps } from '@mui/system'; +import type { Theme } from '@mui/material/styles'; +import { useTheme } from '@mui/material/styles'; interface CustomAnimatedLineProps extends AnimatedLineProps { limit?: number; @@ -139,6 +136,7 @@ function ShadedBackground({ limit }: { limit: number }) { } export default function LineWithUncertaintyArea() { + // @focus-start @padding 1 const id = React.useId(); const clipPathId = `${id}-clip-path`; @@ -183,4 +181,5 @@ export default function LineWithUncertaintyArea() { ); + // @focus-end } diff --git a/docs/data/charts/line-demo/demos/line-with-uncertainty-area/client.ts b/docs/data/charts/line-demo/demos/line-with-uncertainty-area/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/line-with-uncertainty-area/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/line-with-uncertainty-area/index.ts b/docs/data/charts/line-demo/demos/line-with-uncertainty-area/index.ts new file mode 100644 index 0000000000000..ba89bcc375d20 --- /dev/null +++ b/docs/data/charts/line-demo/demos/line-with-uncertainty-area/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineWithUncertaintyArea from './LineWithUncertaintyArea'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineWithUncertaintyArea, { ClientProvider }); diff --git a/docs/data/charts/line-demo/LiveLineChartNoSnap.tsx b/docs/data/charts/line-demo/demos/live-line-chart-no-snap/LiveLineChartNoSnap.tsx similarity index 98% rename from docs/data/charts/line-demo/LiveLineChartNoSnap.tsx rename to docs/data/charts/line-demo/demos/live-line-chart-no-snap/LiveLineChartNoSnap.tsx index cf853f7e64534..3e99ddfe40017 100644 --- a/docs/data/charts/line-demo/LiveLineChartNoSnap.tsx +++ b/docs/data/charts/line-demo/demos/live-line-chart-no-snap/LiveLineChartNoSnap.tsx @@ -18,6 +18,7 @@ const initialSecondData = Array.from({ length }).map( ); export default function LiveLineChartNoSnap() { + // @focus-start @padding 1 const [running, setRunning] = React.useState(false); const [date, setDate] = React.useState(new Date(2000, 0, 0)); const [firstData, setFirstData] = React.useState(initialFirstData); @@ -78,6 +79,7 @@ export default function LiveLineChartNoSnap() { ); + // @focus-end } function randBetween(min: number, max: number) { diff --git a/docs/data/charts/line-demo/demos/live-line-chart-no-snap/client.ts b/docs/data/charts/line-demo/demos/live-line-chart-no-snap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/live-line-chart-no-snap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/live-line-chart-no-snap/index.ts b/docs/data/charts/line-demo/demos/live-line-chart-no-snap/index.ts new file mode 100644 index 0000000000000..12052c7fa1c24 --- /dev/null +++ b/docs/data/charts/line-demo/demos/live-line-chart-no-snap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LiveLineChartNoSnap from './LiveLineChartNoSnap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LiveLineChartNoSnap, { ClientProvider }); diff --git a/docs/data/charts/line-demo/SimpleLineChart.tsx b/docs/data/charts/line-demo/demos/simple-line-chart/SimpleLineChart.tsx similarity index 93% rename from docs/data/charts/line-demo/SimpleLineChart.tsx rename to docs/data/charts/line-demo/demos/simple-line-chart/SimpleLineChart.tsx index 63cb9d1b930b4..a582d2fee0263 100644 --- a/docs/data/charts/line-demo/SimpleLineChart.tsx +++ b/docs/data/charts/line-demo/demos/simple-line-chart/SimpleLineChart.tsx @@ -17,6 +17,7 @@ const xLabels = [ export default function SimpleLineChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/line-demo/demos/simple-line-chart/client.ts b/docs/data/charts/line-demo/demos/simple-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/simple-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/simple-line-chart/index.ts b/docs/data/charts/line-demo/demos/simple-line-chart/index.ts new file mode 100644 index 0000000000000..25817b676d975 --- /dev/null +++ b/docs/data/charts/line-demo/demos/simple-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SimpleLineChart from './SimpleLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SimpleLineChart, { ClientProvider }); diff --git a/docs/data/charts/line-demo/TinyLineChart.tsx b/docs/data/charts/line-demo/demos/tiny-line-chart/TinyLineChart.tsx similarity index 95% rename from docs/data/charts/line-demo/TinyLineChart.tsx rename to docs/data/charts/line-demo/demos/tiny-line-chart/TinyLineChart.tsx index 4f0b40d24d27a..5dd047886bb7a 100644 --- a/docs/data/charts/line-demo/TinyLineChart.tsx +++ b/docs/data/charts/line-demo/demos/tiny-line-chart/TinyLineChart.tsx @@ -14,6 +14,7 @@ const xLabels = [ export default function TinyLineChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/line-demo/demos/tiny-line-chart/client.ts b/docs/data/charts/line-demo/demos/tiny-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/line-demo/demos/tiny-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/line-demo/demos/tiny-line-chart/index.ts b/docs/data/charts/line-demo/demos/tiny-line-chart/index.ts new file mode 100644 index 0000000000000..f39a7e5cba64b --- /dev/null +++ b/docs/data/charts/line-demo/demos/tiny-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TinyLineChart from './TinyLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TinyLineChart, { ClientProvider }); diff --git a/docs/data/charts/line-demo/line-demo.md b/docs/data/charts/line-demo/line-demo.md index 7d88db6184bc5..3b799361358cf 100644 --- a/docs/data/charts/line-demo/line-demo.md +++ b/docs/data/charts/line-demo/line-demo.md @@ -10,35 +10,35 @@ components: LineChart, LineElement, LineHighlightElement, LineHighlightPlot, Lin ## SimpleLineChart -{{"demo": "SimpleLineChart.js"}} +{{"component": "file://./demos/simple-line-chart/index.ts"}} ## TinyLineChart -{{"demo": "TinyLineChart.js"}} +{{"component": "file://./demos/tiny-line-chart/index.ts"}} ## DashedLineChart -{{"demo": "DashedLineChart.js"}} +{{"component": "file://./demos/dashed-line-chart/index.ts"}} ## BiaxialLineChart -{{"demo": "BiaxialLineChart.js"}} +{{"component": "file://./demos/biaxial-line-chart/index.ts"}} ## LineChartWithReferenceLines -{{"demo": "LineChartWithReferenceLines.js"}} +{{"component": "file://./demos/line-chart-with-reference-lines/index.ts"}} ## LineChartConnectNulls -{{"demo": "LineChartConnectNulls.js"}} +{{"component": "file://./demos/line-chart-connect-nulls/index.ts"}} ## CustomLabelLineChart -{{"demo": "CustomLabelChart.js"}} +{{"component": "file://./demos/custom-label-chart/index.ts"}} ## Line chart with live data -{{"demo": "LiveLineChartNoSnap.js"}} +{{"component": "file://./demos/live-line-chart-no-snap/index.ts"}} ## Line with forecast @@ -52,14 +52,14 @@ Set the `slots.line` prop to a custom component that renders the default line tw An uncertainty area illustrates the forecast uncertainty. -{{"demo": "LineWithUncertaintyArea.js"}} +{{"component": "file://./demos/line-with-uncertainty-area/index.ts"}} ## CustomLineMarks Using a shape other than `"circle"` renders a `` instead of a `` for mark elements. That change can reduce rendering performance (for example, around 50 ms to render 1,000 marks). -{{"demo": "CustomLineMarks.js"}} +{{"component": "file://./demos/custom-line-marks/index.ts"}} ## Larger interaction area @@ -70,4 +70,4 @@ Use two paths: a thin visible one for the line and a wider invisible one for poi When lines cross, the highlighted series is the last one defined in the slots, not necessarily the one closest to the pointer. -{{"demo": "LargerHighlightLineNoSnap.js"}} +{{"component": "file://./demos/larger-highlight-line-no-snap/index.ts"}} diff --git a/docs/data/charts/lines/AreaBaseline.js b/docs/data/charts/lines/AreaBaseline.js deleted file mode 100644 index 7f8fe9c9a37f6..0000000000000 --- a/docs/data/charts/lines/AreaBaseline.js +++ /dev/null @@ -1,17 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function AreaBaseline() { - return ( - - ); -} diff --git a/docs/data/charts/lines/AreaBaseline.tsx.preview b/docs/data/charts/lines/AreaBaseline.tsx.preview deleted file mode 100644 index a7ac332cb11eb..0000000000000 --- a/docs/data/charts/lines/AreaBaseline.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/lines/BasicArea.js b/docs/data/charts/lines/BasicArea.js deleted file mode 100644 index 63d055602e72c..0000000000000 --- a/docs/data/charts/lines/BasicArea.js +++ /dev/null @@ -1,16 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function BasicArea() { - return ( - - ); -} diff --git a/docs/data/charts/lines/BasicArea.tsx.preview b/docs/data/charts/lines/BasicArea.tsx.preview deleted file mode 100644 index 4fcb3d9fa4db3..0000000000000 --- a/docs/data/charts/lines/BasicArea.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/lines/BasicLineChart.js b/docs/data/charts/lines/BasicLineChart.js deleted file mode 100644 index 2bf8fcaa45e1b..0000000000000 --- a/docs/data/charts/lines/BasicLineChart.js +++ /dev/null @@ -1,15 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function BasicLineChart() { - return ( - - ); -} diff --git a/docs/data/charts/lines/BasicLineChart.tsx.preview b/docs/data/charts/lines/BasicLineChart.tsx.preview deleted file mode 100644 index 9812820a06691..0000000000000 --- a/docs/data/charts/lines/BasicLineChart.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/lines/CSSCustomization.js b/docs/data/charts/lines/CSSCustomization.js deleted file mode 100644 index ddd0e7a9a34a3..0000000000000 --- a/docs/data/charts/lines/CSSCustomization.js +++ /dev/null @@ -1,64 +0,0 @@ -import { lineClasses, LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; - -export default function CSSCustomization() { - return ( - date.getFullYear().toString(), - }, - ]} - yAxis={[ - { - width: 60, - }, - ]} - series={[ - { - id: 'France', - label: 'France', - dataKey: 'fr', - stack: 'total', - area: true, - }, - { - id: 'Germany', - label: 'Germany', - dataKey: 'dl', - stack: 'total', - area: true, - }, - { - id: 'United Kingdom', - label: 'United Kingdom', - dataKey: 'gb', - stack: 'total', - area: true, - }, - ]} - height={300} - > - - - - - - - - ); -} diff --git a/docs/data/charts/lines/ColorScale.js b/docs/data/charts/lines/ColorScale.js deleted file mode 100644 index e9a726af62134..0000000000000 --- a/docs/data/charts/lines/ColorScale.js +++ /dev/null @@ -1,166 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -export default function ColorScale() { - const [colorX, setColorX] = React.useState('None'); - const [colorY, setColorY] = React.useState('piecewise'); - const [colorArea, setColorArea] = React.useState(true); - - return ( - - - setColorX(event.target.value)} - > - None - piecewise - continuous - - setColorY(event.target.value)} - > - None - piecewise - continuous - - setColorArea(event.target.checked)} /> - } - label="Show chart area" - labelPlacement="end" - /> - - value.getFullYear().toString(), - colorMap: - (colorX === 'continuous' && { - type: 'continuous', - min: new Date(2019, 1, 1), - max: new Date(2024, 1, 1), - color: ['green', 'orange'], - }) || - (colorX === 'piecewise' && { - type: 'piecewise', - thresholds: [new Date(2021, 1, 1), new Date(2023, 1, 1)], - colors: ['blue', 'red', 'blue'], - }) || - undefined, - }, - ]} - /> - `, - ].join('\n')} - language="jsx" - copyButtonHidden - /> - - ); -} diff --git a/docs/data/charts/lines/ColorScale.tsx b/docs/data/charts/lines/ColorScale.tsx deleted file mode 100644 index aaf0dfe8d454d..0000000000000 --- a/docs/data/charts/lines/ColorScale.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -export default function ColorScale() { - const [colorX, setColorX] = React.useState< - 'None' | 'piecewise' | 'continuous' | 'ordinal' - >('None'); - const [colorY, setColorY] = React.useState<'None' | 'piecewise' | 'continuous'>( - 'piecewise', - ); - const [colorArea, setColorArea] = React.useState(true); - - return ( - - - - setColorX(event.target.value as 'None' | 'piecewise' | 'continuous') - } - > - None - piecewise - continuous - - - setColorY(event.target.value as 'None' | 'piecewise' | 'continuous') - } - > - None - piecewise - continuous - - setColorArea(event.target.checked)} /> - } - label="Show chart area" - labelPlacement="end" - /> - - value.getFullYear().toString(), - colorMap: - (colorX === 'continuous' && { - type: 'continuous', - min: new Date(2019, 1, 1), - max: new Date(2024, 1, 1), - color: ['green', 'orange'], - }) || - (colorX === 'piecewise' && { - type: 'piecewise', - thresholds: [new Date(2021, 1, 1), new Date(2023, 1, 1)], - colors: ['blue', 'red', 'blue'], - }) || - undefined, - }, - ]} - /> - `, - ].join('\n')} - language="jsx" - copyButtonHidden - /> - - ); -} diff --git a/docs/data/charts/lines/ConnectNulls.js b/docs/data/charts/lines/ConnectNulls.js deleted file mode 100644 index 4f3c9ca597129..0000000000000 --- a/docs/data/charts/lines/ConnectNulls.js +++ /dev/null @@ -1,38 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function ConnectNulls() { - const [connectNulls, setConnectNulls] = React.useState(true); - - return ( - - setConnectNulls(event.target.checked)} /> - } - label="connectNulls" - labelPlacement="end" - /> - - - ); -} diff --git a/docs/data/charts/lines/DifferentLength.js b/docs/data/charts/lines/DifferentLength.js deleted file mode 100644 index c35c13a3a8591..0000000000000 --- a/docs/data/charts/lines/DifferentLength.js +++ /dev/null @@ -1,24 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function DifferentLength() { - return ( - (value == null ? 'NaN' : value.toString()), - }, - { - data: [null, null, null, null, 5.5, 2, 8.5, 1.5, 5], - }, - { - data: [7, 8, 5, 4, null, null, 2, 5.5, 1], - valueFormatter: (value) => (value == null ? '?' : value.toString()), - }, - ]} - height={200} - margin={{ bottom: 10 }} - /> - ); -} diff --git a/docs/data/charts/lines/ExpandingStep.js b/docs/data/charts/lines/ExpandingStep.js deleted file mode 100644 index ad6a255172555..0000000000000 --- a/docs/data/charts/lines/ExpandingStep.js +++ /dev/null @@ -1,100 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { LinePlot, MarkPlot } from '@mui/x-charts/LineChart'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; - -const weekDay = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; -const stepCurves = ['step', 'stepBefore', 'stepAfter']; - -export default function ExpandingStep() { - const [strictStepCurve, setStrictStepCurve] = React.useState(false); - const [connectNulls, setConnectNulls] = React.useState(false); - const [curve, setCurve] = React.useState('step'); - - return ( - - - - setConnectNulls(event.target.checked)} - /> - } - label="connectNulls" - labelPlacement="end" - /> - setStrictStepCurve(event.target.checked)} - /> - } - label="strictStepCurve" - labelPlacement="end" - /> - - setCurve(event.target.value)} - > - {stepCurves.map((curveType) => ( - - {curveType} - - ))} - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/lines/GridDemo.js b/docs/data/charts/lines/GridDemo.js deleted file mode 100644 index fc4a308a97669..0000000000000 --- a/docs/data/charts/lines/GridDemo.js +++ /dev/null @@ -1,41 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; - -import { - dateAxisFormatter, - percentageFormatter, - usUnemploymentRate, -} from '../dataset/usUnemploymentRate'; - -const xAxis = [ - { - dataKey: 'date', - scaleType: 'time', - valueFormatter: dateAxisFormatter, - }, -]; - -const yAxis = [ - { - valueFormatter: percentageFormatter, - }, -]; - -const series = [ - { - dataKey: 'rate', - valueFormatter: percentageFormatter, - }, -]; - -export default function GridDemo() { - return ( - - ); -} diff --git a/docs/data/charts/lines/GridDemo.tsx b/docs/data/charts/lines/GridDemo.tsx deleted file mode 100644 index c8e768ed21062..0000000000000 --- a/docs/data/charts/lines/GridDemo.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import { XAxis } from '@mui/x-charts/models'; -import { - dateAxisFormatter, - percentageFormatter, - usUnemploymentRate, -} from '../dataset/usUnemploymentRate'; - -const xAxis: XAxis<'time'>[] = [ - { - dataKey: 'date', - scaleType: 'time', - valueFormatter: dateAxisFormatter, - }, -]; -const yAxis = [ - { - valueFormatter: percentageFormatter, - }, -]; -const series = [ - { - dataKey: 'rate', - valueFormatter: percentageFormatter, - }, -]; -export default function GridDemo() { - return ( - - ); -} diff --git a/docs/data/charts/lines/GridDemo.tsx.preview b/docs/data/charts/lines/GridDemo.tsx.preview deleted file mode 100644 index 790245c2f8239..0000000000000 --- a/docs/data/charts/lines/GridDemo.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/lines/InterpolationDemo.js b/docs/data/charts/lines/InterpolationDemo.js deleted file mode 100644 index 062622dd1653c..0000000000000 --- a/docs/data/charts/lines/InterpolationDemo.js +++ /dev/null @@ -1,62 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { LineChart } from '@mui/x-charts/LineChart'; - -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const curveTypes = [ - 'linear', - 'catmullRom', - 'monotoneX', - 'monotoneY', - 'natural', - 'step', - 'stepBefore', - 'stepAfter', - 'bumpX', - 'bumpY', -]; - -function getExample(curveType) { - return ``; -} - -export default function InterpolationDemo() { - const [curveType, setCurveType] = React.useState(curveTypes[0]); - - return ( - - setCurveType(event.target.value)} - > - {curveTypes.map((curve) => ( - - {curve} - - ))} - - - - - ); -} diff --git a/docs/data/charts/lines/LineAnimation.js b/docs/data/charts/lines/LineAnimation.js deleted file mode 100644 index e46a1b6f612af..0000000000000 --- a/docs/data/charts/lines/LineAnimation.js +++ /dev/null @@ -1,88 +0,0 @@ -import * as React from 'react'; -import Button from '@mui/material/Button'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { mangoFusionPalette } from '@mui/x-charts/colorPalettes'; - -const defaultSeries = [ - { id: '1', data: [4, 5, 1, 2, 3, 3, 2], area: true, stack: '1' }, - { id: '2', data: [7, 4, 6, 7, 2, 3, 5], area: true, stack: '1' }, - { id: '3', data: [6, 4, 1, 2, 6, 3, 3], area: true, stack: '1' }, - { id: '4', data: [4, 7, 6, 1, 2, 7, 7], area: true, stack: '1' }, - { id: '5', data: [2, 2, 1, 7, 1, 5, 3], area: true, stack: '1' }, - { id: '6', data: [6, 6, 1, 6, 7, 1, 1], area: true, stack: '1' }, - { id: '7', data: [7, 6, 1, 6, 4, 4, 6], area: true, stack: '1' }, - { id: '8', data: [4, 3, 1, 6, 6, 3, 5], area: true, stack: '1' }, - { id: '9', data: [7, 6, 2, 7, 4, 2, 7], area: true, stack: '1' }, -].map((item, index) => ({ - ...item, - color: mangoFusionPalette('light')[index], -})); - -export default function LineAnimation() { - const [series, setSeries] = React.useState(defaultSeries); - const [nbSeries, setNbSeries] = React.useState(3); - const [skipAnimation, setSkipAnimation] = React.useState(false); - - return ( -
-
- -
- - - - - setSkipAnimation(event.target.checked)} /> - } - label="skipAnimation" - labelPlacement="end" - /> - -
- ); -} diff --git a/docs/data/charts/lines/LineClick.js b/docs/data/charts/lines/LineClick.js deleted file mode 100644 index 405655eab75d6..0000000000000 --- a/docs/data/charts/lines/LineClick.js +++ /dev/null @@ -1,102 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; - -import { LineChart } from '@mui/x-charts/LineChart'; - -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const lineChartsParams = { - series: [ - { - id: 'series-1', - data: [3, 4, 1, 6, 5], - label: 'A', - area: true, - stack: 'total', - highlightScope: { - highlight: 'item', - }, - }, - { - id: 'series-2', - data: [4, 3, 1, 5, 8], - label: 'B', - area: true, - stack: 'total', - highlightScope: { - highlight: 'item', - }, - }, - { - id: 'series-3', - data: [4, 2, 5, 4, 1], - label: 'C', - area: true, - stack: 'total', - highlightScope: { - highlight: 'item', - }, - }, - ], - xAxis: [{ data: [0, 3, 6, 9, 12], scaleType: 'linear', id: 'axis1' }], - height: 400, -}; - -export default function LineClick() { - const [itemData, setItemData] = React.useState(); - const [axisData, setAxisData] = React.useState(); - - return ( - - - setItemData(d)} - onMarkClick={(event, d) => setItemData(d)} - onLineClick={(event, d) => setItemData(d)} - onAxisClick={(event, d) => setAxisData(d)} - /> - - - - - Click on the chart - { - setItemData(undefined); - setAxisData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/lines/LineDataset.js b/docs/data/charts/lines/LineDataset.js deleted file mode 100644 index bb215c5a72ad2..0000000000000 --- a/docs/data/charts/lines/LineDataset.js +++ /dev/null @@ -1,34 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import { - worldElectricityProduction, - keyToLabel, - colors, -} from '../dataset/worldElectricityProduction'; - -const stackStrategy = { - stack: 'total', - area: true, - stackOffset: 'none', // To stack 0 on top of others -}; - -const customize = { - height: 350, - hideLegend: true, -}; - -export default function LineDataset() { - return ( - value.toString() }]} - yAxis={[{ width: 50 }]} - series={Object.keys(keyToLabel).map((key) => ({ - dataKey: key, - label: keyToLabel[key], - color: colors[key], - ...stackStrategy, - }))} - dataset={worldElectricityProduction} - {...customize} - /> - ); -} diff --git a/docs/data/charts/lines/LineDataset.tsx.preview b/docs/data/charts/lines/LineDataset.tsx.preview deleted file mode 100644 index b75789e98d68e..0000000000000 --- a/docs/data/charts/lines/LineDataset.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - value.toString() }, - ]} - yAxis={[{ width: 50 }]} - series={Object.keys(keyToLabel).map((key) => ({ - dataKey: key, - label: keyToLabel[key], - color: colors[key], - ...stackStrategy, - }))} - dataset={worldElectricityProduction} - {...customize} -/> \ No newline at end of file diff --git a/docs/data/charts/lines/LineDefaultDomainLimit.js b/docs/data/charts/lines/LineDefaultDomainLimit.js deleted file mode 100644 index f3bbbd213ea26..0000000000000 --- a/docs/data/charts/lines/LineDefaultDomainLimit.js +++ /dev/null @@ -1,62 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; - -export default function LineDefaultDomainLimit() { - const [niceDomainLimit, setNiceDomainLimit] = React.useState(false); - - return ( - - setNiceDomainLimit(event.target.checked)} /> - } - label="Nice domain limit" - labelPlacement="end" - /> -
- date.getFullYear().toString(), - domainLimit: niceDomainLimit ? 'nice' : undefined, - }, - ]} - yAxis={[{ width: 70 }]} - series={[ - { - id: 'France', - label: 'French GDP per capita', - dataKey: 'fr', - stack: 'total', - area: true, - }, - { - id: 'Germany', - label: 'German GDP per capita', - dataKey: 'dl', - stack: 'total', - area: true, - }, - { - id: 'United Kingdom', - label: 'UK GDP per capita', - dataKey: 'gb', - stack: 'total', - area: true, - }, - ]} - height={300} - /> -
-
- ); -} diff --git a/docs/data/charts/lines/LineMarkShape.js b/docs/data/charts/lines/LineMarkShape.js deleted file mode 100644 index c54d45fe2d088..0000000000000 --- a/docs/data/charts/lines/LineMarkShape.js +++ /dev/null @@ -1,78 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/weather'; - -const marksMapping = { - true: true, - false: false, - start: 'start', - end: 'end', - '({index})=>index%2===0': ({ index }) => index % 2 === 0, -}; - -const marksOptions = ['true', 'false', 'start', 'end', '({index})=>index%2===0']; - -const shapes = ['circle', 'square', 'diamond', 'cross', 'star', 'triangle', 'wye']; - -export default function LineMarkShape() { - const [marks, setMarks] = React.useState('true'); - const [shape, setShape] = React.useState('circle'); - - return ( - - - setMarks(event.target.value)} - sx={{ minWidth: 150 }} - > - {marksOptions.map((option) => ( - - {option} - - ))} - - setShape(event.target.value)} - sx={{ minWidth: 150 }} - > - {shapes.map((option) => ( - - {option} - - ))} - - - - - - - ); -} diff --git a/docs/data/charts/lines/LineOverview.js b/docs/data/charts/lines/LineOverview.js deleted file mode 100644 index 73b7c5acdbe3e..0000000000000 --- a/docs/data/charts/lines/LineOverview.js +++ /dev/null @@ -1,188 +0,0 @@ -import * as React from 'react'; -import Typography from '@mui/material/Typography'; -import Box from '@mui/material/Box'; -import { alpha, useTheme } from '@mui/material/styles'; -import { ChartsDataProviderPro } from '@mui/x-charts-pro/ChartsDataProviderPro'; -import { ChartsSurface } from '@mui/x-charts-pro/ChartsSurface'; -import { LinePlot } from '@mui/x-charts-pro/LineChart'; -import { ChartsXAxis } from '@mui/x-charts-pro/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts-pro/ChartsYAxis'; -import { useDrawingArea, useXScale } from '@mui/x-charts-pro/hooks'; -import { ChartsTooltip } from '@mui/x-charts-pro/ChartsTooltip'; -import { ChartsGrid } from '@mui/x-charts-pro/ChartsGrid'; -import { ChartsZoomSlider } from '@mui/x-charts-pro/ChartsZoomSlider'; -import { ChartsClipPath } from '@mui/x-charts-pro/ChartsClipPath'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import { ChartsLegend } from '@mui/x-charts-pro/ChartsLegend'; -import { usaUnemploymentAndGdp } from '../dataset/usaUnemploymentAndGdp'; - -const recessions = [ - { - start: new Date('2001-03-01'), - end: new Date('2001-11-01'), - label: 'Early 2000s', - }, - { - start: new Date('2007-12-01'), - end: new Date('2009-06-01'), - label: 'Great Recession', - }, - { start: new Date('2020-02-01'), end: new Date('2020-04-01'), label: 'COVID-19' }, -]; - -function RecessionBands({ periods }) { - const { top, left, width, height } = useDrawingArea(); - const xScale = useXScale(); - const theme = useTheme(); - const labelFill = alpha(theme.palette.text.primary, 0.7); - - return ( - - {periods.map((p, index) => { - const xStart = xScale(p.start.getTime()); - const xEnd = xScale(p.end.getTime()); - - if (xStart === undefined || xEnd === undefined) { - return null; - } - - // Stick to the left of the drawing area boundaries - let textX; - if (xStart >= left && xStart <= left + width) { - textX = xStart; - } else if (xEnd >= left && xEnd <= left + width) { - textX = left; - } else { - return null; - } - - return ( - - - - {p.label} - - - ); - })} - - ); -} - -export default function LineOverview() { - const clipPathId = React.useId(); - return ( - - - US unemployment rate comparison with GDP per capita - - (value == null ? '' : `${value.toFixed(1)}%`), - }, - { - type: 'line', - dataKey: 'gdpPerCapita', - label: 'GDP per capita', - color: '#4caf50', - yAxisId: 'gdp-axis', - connectNulls: true, - valueFormatter: (value) => - value == null ? '' : `${(value / 1000).toFixed(1)}k`, - }, - ]} - xAxis={[ - { - scaleType: 'time', - dataKey: 'date', - tickNumber: 4, - valueFormatter: (date, context) => { - if (context.location !== 'tick') { - return date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'short', - }); - } - return date.getMonth() === 0 - ? date.toLocaleDateString('en-US', { - year: 'numeric', - }) - : date.toLocaleDateString('en-US', { - month: 'short', - }); - }, - zoom: { - slider: { enabled: true }, - }, - }, - ]} - yAxis={[ - { - id: 'unemployment-axis', - scaleType: 'linear', - valueFormatter: (value) => `${value}%`, - width: 55, - position: 'left', - }, - { - id: 'gdp-axis', - scaleType: 'linear', - width: 50, - position: 'right', - valueFormatter: (value) => `${(value / 1000).toLocaleString()}k`, - }, - ]} - > - - - - - - - - - - - - - - - - - - - - Source: FRED - - - ); -} diff --git a/docs/data/charts/lines/LinePointerInteraction.js b/docs/data/charts/lines/LinePointerInteraction.js deleted file mode 100644 index fff913279e9f0..0000000000000 --- a/docs/data/charts/lines/LinePointerInteraction.js +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const data = { - xAxis: [{ data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }], - series: [ - { - data: [5, 8, 3, 7, 2, 9, 4, 6, 1, 5, 3], - label: 'Series C', - area: true, - highlightScope: { highlight: 'series', fade: 'global' }, - }, - { - data: [2, 5.5, 2, 8.5, 1.5, 5, 1, 4, 3, 8, 2], - label: 'Series A', - highlightScope: { highlight: 'series', fade: 'global' }, - }, - { - data: [8, 2, 5, 1, 7, 3, 9, 2, 6, 3, 7], - label: 'Series B', - highlightScope: { highlight: 'series', fade: 'global' }, - }, - ], -}; - -export default function LinePointerInteraction() { - return ( - - - - ); -} diff --git a/docs/data/charts/lines/LinePointerInteraction.tsx.preview b/docs/data/charts/lines/LinePointerInteraction.tsx.preview deleted file mode 100644 index c35bfceb5700b..0000000000000 --- a/docs/data/charts/lines/LinePointerInteraction.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/lines/MarkOptimization.js b/docs/data/charts/lines/MarkOptimization.js deleted file mode 100644 index 0872477824f49..0000000000000 --- a/docs/data/charts/lines/MarkOptimization.js +++ /dev/null @@ -1,16 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; - -export default function MarkOptimization() { - return ( - index % 2 === 0, - }, - ]} - height={300} - /> - ); -} diff --git a/docs/data/charts/lines/MarkOptimization.tsx.preview b/docs/data/charts/lines/MarkOptimization.tsx.preview deleted file mode 100644 index 8708a7444419e..0000000000000 --- a/docs/data/charts/lines/MarkOptimization.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - index % 2 === 0, - }, - ]} - height={300} -/> \ No newline at end of file diff --git a/docs/data/charts/lines/MarkSize.js b/docs/data/charts/lines/MarkSize.js deleted file mode 100644 index 6f06015e2ebda..0000000000000 --- a/docs/data/charts/lines/MarkSize.js +++ /dev/null @@ -1,82 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import MenuItem from '@mui/material/MenuItem'; -import Slider from '@mui/material/Slider'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; - -const shapes = ['circle', 'cross', 'diamond', 'square', 'star', 'triangle', 'wye']; - -export default function MarkSize() { - const [shape, setShape] = React.useState('circle'); - const [radius, setRadius] = React.useState(6); - const [scale, setScale] = React.useState(1.2); - - const isCircle = shape === 'circle'; - const markStyle = isCircle ? { r: radius } : { scale: `${scale}` }; - - const code = ``; - - return ( - - - setShape(event.target.value)} - > - {shapes.map((option) => ( - - {option} - - ))} - - - - {isCircle ? 'radius' : 'scale'} - - {isCircle ? ( - setRadius(value)} - valueLabelDisplay="auto" - min={1} - max={12} - step={1} - /> - ) : ( - setScale(value)} - valueLabelDisplay="auto" - min={0.5} - max={3} - step={0.1} - /> - )} - - - - - - ); -} diff --git a/docs/data/charts/lines/StackedAreas.js b/docs/data/charts/lines/StackedAreas.js deleted file mode 100644 index d2b8faf683c3d..0000000000000 --- a/docs/data/charts/lines/StackedAreas.js +++ /dev/null @@ -1,45 +0,0 @@ -import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; - -export default function StackedAreas() { - return ( -
- date.getFullYear().toString(), - }, - ]} - yAxis={[{ width: 70 }]} - series={[ - { - id: 'France', - label: 'French GDP per capita', - dataKey: 'fr', - stack: 'total', - area: true, - }, - { - id: 'Germany', - label: 'German GDP per capita', - dataKey: 'dl', - stack: 'total', - area: true, - }, - { - id: 'United Kingdom', - label: 'UK GDP per capita', - dataKey: 'gb', - stack: 'total', - area: true, - }, - ]} - height={300} - /> -
- ); -} diff --git a/docs/data/charts/lines/StyledLineChart.js b/docs/data/charts/lines/StyledLineChart.js deleted file mode 100644 index 29f27fff5527c..0000000000000 --- a/docs/data/charts/lines/StyledLineChart.js +++ /dev/null @@ -1,62 +0,0 @@ -import Box from '@mui/material/Box'; -import { LineChart, lineClasses } from '@mui/x-charts/LineChart'; -import { labelMarkClasses } from '@mui/x-charts/ChartsLabel'; - -const margin = { right: 24 }; -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300]; -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function StyledLineChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/lines/AreaBaseline.tsx b/docs/data/charts/lines/demos/area-baseline/AreaBaseline.tsx similarity index 87% rename from docs/data/charts/lines/AreaBaseline.tsx rename to docs/data/charts/lines/demos/area-baseline/AreaBaseline.tsx index 7f8fe9c9a37f6..32f3dd53d21f5 100644 --- a/docs/data/charts/lines/AreaBaseline.tsx +++ b/docs/data/charts/lines/demos/area-baseline/AreaBaseline.tsx @@ -2,6 +2,7 @@ import { LineChart } from '@mui/x-charts/LineChart'; export default function AreaBaseline() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/lines/demos/area-baseline/client.ts b/docs/data/charts/lines/demos/area-baseline/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/area-baseline/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/area-baseline/index.ts b/docs/data/charts/lines/demos/area-baseline/index.ts new file mode 100644 index 0000000000000..2705f96a804ab --- /dev/null +++ b/docs/data/charts/lines/demos/area-baseline/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AreaBaseline from './AreaBaseline'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AreaBaseline, { ClientProvider }); diff --git a/docs/data/charts/lines/BasicArea.tsx b/docs/data/charts/lines/demos/basic-area/BasicArea.tsx similarity index 86% rename from docs/data/charts/lines/BasicArea.tsx rename to docs/data/charts/lines/demos/basic-area/BasicArea.tsx index 63d055602e72c..02cfe671a9a29 100644 --- a/docs/data/charts/lines/BasicArea.tsx +++ b/docs/data/charts/lines/demos/basic-area/BasicArea.tsx @@ -2,6 +2,7 @@ import { LineChart } from '@mui/x-charts/LineChart'; export default function BasicArea() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/lines/demos/basic-area/client.ts b/docs/data/charts/lines/demos/basic-area/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/basic-area/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/basic-area/index.ts b/docs/data/charts/lines/demos/basic-area/index.ts new file mode 100644 index 0000000000000..400083fea7077 --- /dev/null +++ b/docs/data/charts/lines/demos/basic-area/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicArea from './BasicArea'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicArea, { ClientProvider }); diff --git a/docs/data/charts/lines/BasicLineChart.tsx b/docs/data/charts/lines/demos/basic-line-chart/BasicLineChart.tsx similarity index 85% rename from docs/data/charts/lines/BasicLineChart.tsx rename to docs/data/charts/lines/demos/basic-line-chart/BasicLineChart.tsx index 2bf8fcaa45e1b..5b32ca14db60c 100644 --- a/docs/data/charts/lines/BasicLineChart.tsx +++ b/docs/data/charts/lines/demos/basic-line-chart/BasicLineChart.tsx @@ -2,6 +2,7 @@ import { LineChart } from '@mui/x-charts/LineChart'; export default function BasicLineChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/lines/demos/basic-line-chart/client.ts b/docs/data/charts/lines/demos/basic-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/basic-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/basic-line-chart/index.ts b/docs/data/charts/lines/demos/basic-line-chart/index.ts new file mode 100644 index 0000000000000..b41d6138145a9 --- /dev/null +++ b/docs/data/charts/lines/demos/basic-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicLineChart from './BasicLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicLineChart, { ClientProvider }); diff --git a/docs/data/charts/lines/demos/color-scale/ColorScale.tsx b/docs/data/charts/lines/demos/color-scale/ColorScale.tsx new file mode 100644 index 0000000000000..e427dafc4317a --- /dev/null +++ b/docs/data/charts/lines/demos/color-scale/ColorScale.tsx @@ -0,0 +1,177 @@ +import * as React from 'react'; +import { LineChart } from '@mui/x-charts/LineChart'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; + +export default function ColorScale() { + // @focus-start @padding 1 + const [colorX, setColorX] = React.useState< + 'None' | 'piecewise' | 'continuous' | 'ordinal' + >('None'); + const [colorY, setColorY] = React.useState<'None' | 'piecewise' | 'continuous'>( + 'piecewise', + ); + const [colorArea, setColorArea] = React.useState(true); + + return ( + + + + setColorX(event.target.value as 'None' | 'piecewise' | 'continuous') + } + > + None + piecewise + continuous + + + setColorY(event.target.value as 'None' | 'piecewise' | 'continuous') + } + > + None + piecewise + continuous + + setColorArea(event.target.checked)} /> + } + label="Show chart area" + labelPlacement="end" + /> + + value.getFullYear().toString(), + colorMap: + (colorX === 'continuous' && { + type: 'continuous', + min: new Date(2019, 1, 1), + max: new Date(2024, 1, 1), + color: ['green', 'orange'], + }) || + (colorX === 'piecewise' && { + type: 'piecewise', + thresholds: [new Date(2021, 1, 1), new Date(2023, 1, 1)], + colors: ['blue', 'red', 'blue'], + }) || + undefined, + }, + ]} + /> + `, + ].join('\n')} + language="jsx" + copyButtonHidden + /> + + ); + // @focus-end +} diff --git a/docs/data/charts/lines/demos/color-scale/client.ts b/docs/data/charts/lines/demos/color-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/color-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/color-scale/index.ts b/docs/data/charts/lines/demos/color-scale/index.ts new file mode 100644 index 0000000000000..141c61df022b8 --- /dev/null +++ b/docs/data/charts/lines/demos/color-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorScale from './ColorScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorScale, { ClientProvider }); diff --git a/docs/data/charts/lines/ConnectNulls.tsx b/docs/data/charts/lines/demos/connect-nulls/ConnectNulls.tsx similarity index 95% rename from docs/data/charts/lines/ConnectNulls.tsx rename to docs/data/charts/lines/demos/connect-nulls/ConnectNulls.tsx index 4f3c9ca597129..f61b3c0edb09b 100644 --- a/docs/data/charts/lines/ConnectNulls.tsx +++ b/docs/data/charts/lines/demos/connect-nulls/ConnectNulls.tsx @@ -5,6 +5,7 @@ import Checkbox from '@mui/material/Checkbox'; import { LineChart } from '@mui/x-charts/LineChart'; export default function ConnectNulls() { + // @focus-start @padding 1 const [connectNulls, setConnectNulls] = React.useState(true); return ( @@ -35,4 +36,5 @@ export default function ConnectNulls() { /> ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/connect-nulls/client.ts b/docs/data/charts/lines/demos/connect-nulls/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/connect-nulls/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/connect-nulls/index.ts b/docs/data/charts/lines/demos/connect-nulls/index.ts new file mode 100644 index 0000000000000..e6e41591fdbae --- /dev/null +++ b/docs/data/charts/lines/demos/connect-nulls/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ConnectNulls from './ConnectNulls'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ConnectNulls, { ClientProvider }); diff --git a/docs/data/charts/lines/CSSCustomization.tsx b/docs/data/charts/lines/demos/css-customization/CSSCustomization.tsx similarity index 92% rename from docs/data/charts/lines/CSSCustomization.tsx rename to docs/data/charts/lines/demos/css-customization/CSSCustomization.tsx index ddd0e7a9a34a3..03e470763eda8 100644 --- a/docs/data/charts/lines/CSSCustomization.tsx +++ b/docs/data/charts/lines/demos/css-customization/CSSCustomization.tsx @@ -1,8 +1,9 @@ import { lineClasses, LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; +import { dataset } from '../../../dataset/gdpPerCapitaEvolution'; export default function CSSCustomization() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/lines/demos/css-customization/client.ts b/docs/data/charts/lines/demos/css-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/css-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/css-customization/index.ts b/docs/data/charts/lines/demos/css-customization/index.ts new file mode 100644 index 0000000000000..3af5e0bbaa7f7 --- /dev/null +++ b/docs/data/charts/lines/demos/css-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CSSCustomization from './CSSCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CSSCustomization, { ClientProvider }); diff --git a/docs/data/charts/lines/DifferentLength.tsx b/docs/data/charts/lines/demos/different-length/DifferentLength.tsx similarity index 93% rename from docs/data/charts/lines/DifferentLength.tsx rename to docs/data/charts/lines/demos/different-length/DifferentLength.tsx index c35c13a3a8591..b3ca7834f3091 100644 --- a/docs/data/charts/lines/DifferentLength.tsx +++ b/docs/data/charts/lines/demos/different-length/DifferentLength.tsx @@ -2,6 +2,7 @@ import { LineChart } from '@mui/x-charts/LineChart'; export default function DifferentLength() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/lines/demos/different-length/client.ts b/docs/data/charts/lines/demos/different-length/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/different-length/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/different-length/index.ts b/docs/data/charts/lines/demos/different-length/index.ts new file mode 100644 index 0000000000000..056577aab22a0 --- /dev/null +++ b/docs/data/charts/lines/demos/different-length/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DifferentLength from './DifferentLength'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DifferentLength, { ClientProvider }); diff --git a/docs/data/charts/lines/ExpandingStep.tsx b/docs/data/charts/lines/demos/expanding-step/ExpandingStep.tsx similarity index 98% rename from docs/data/charts/lines/ExpandingStep.tsx rename to docs/data/charts/lines/demos/expanding-step/ExpandingStep.tsx index aeed5ac654e39..6f4e30389cb01 100644 --- a/docs/data/charts/lines/ExpandingStep.tsx +++ b/docs/data/charts/lines/demos/expanding-step/ExpandingStep.tsx @@ -16,6 +16,7 @@ const stepCurves = ['step', 'stepBefore', 'stepAfter']; type StepCurve = 'step' | 'stepBefore' | 'stepAfter'; export default function ExpandingStep() { + // @focus-start @padding 1 const [strictStepCurve, setStrictStepCurve] = React.useState(false); const [connectNulls, setConnectNulls] = React.useState(false); const [curve, setCurve] = React.useState('step'); @@ -98,4 +99,5 @@ export default function ExpandingStep() { ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/expanding-step/client.ts b/docs/data/charts/lines/demos/expanding-step/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/expanding-step/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/expanding-step/index.ts b/docs/data/charts/lines/demos/expanding-step/index.ts new file mode 100644 index 0000000000000..4baaadbac8a2f --- /dev/null +++ b/docs/data/charts/lines/demos/expanding-step/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExpandingStep from './ExpandingStep'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExpandingStep, { ClientProvider }); diff --git a/docs/data/charts/lines/demos/grid-demo/GridDemo.tsx b/docs/data/charts/lines/demos/grid-demo/GridDemo.tsx new file mode 100644 index 0000000000000..605fa885123b7 --- /dev/null +++ b/docs/data/charts/lines/demos/grid-demo/GridDemo.tsx @@ -0,0 +1,40 @@ +import { LineChart } from '@mui/x-charts/LineChart'; +import type { XAxis } from '@mui/x-charts/models'; +import { + dateAxisFormatter, + percentageFormatter, + usUnemploymentRate, +} from '../../../dataset/usUnemploymentRate'; + +const xAxis: XAxis<'time'>[] = [ + { + dataKey: 'date', + scaleType: 'time', + valueFormatter: dateAxisFormatter, + }, +]; +const yAxis = [ + { + valueFormatter: percentageFormatter, + }, +]; +const series = [ + { + dataKey: 'rate', + valueFormatter: percentageFormatter, + }, +]; +export default function GridDemo() { + return ( + // @focus-start @padding 2 + + // @focus-end + ); +} diff --git a/docs/data/charts/lines/demos/grid-demo/client.ts b/docs/data/charts/lines/demos/grid-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/grid-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/grid-demo/index.ts b/docs/data/charts/lines/demos/grid-demo/index.ts new file mode 100644 index 0000000000000..7686107ff7e74 --- /dev/null +++ b/docs/data/charts/lines/demos/grid-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GridDemo from './GridDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GridDemo, { ClientProvider }); diff --git a/docs/data/charts/lines/InterpolationDemo.tsx b/docs/data/charts/lines/demos/interpolation-demo/InterpolationDemo.tsx similarity index 94% rename from docs/data/charts/lines/InterpolationDemo.tsx rename to docs/data/charts/lines/demos/interpolation-demo/InterpolationDemo.tsx index 9d2a7dea24a77..0906aa6cf277d 100644 --- a/docs/data/charts/lines/InterpolationDemo.tsx +++ b/docs/data/charts/lines/demos/interpolation-demo/InterpolationDemo.tsx @@ -5,7 +5,7 @@ import MenuItem from '@mui/material/MenuItem'; import { LineChart } from '@mui/x-charts/LineChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { CurveType } from '@mui/x-charts/models'; +import type { CurveType } from '@mui/x-charts/models'; const curveTypes: CurveType[] = [ 'linear', @@ -31,6 +31,7 @@ function getExample(curveType: CurveType) { } export default function InterpolationDemo() { + // @focus-start @padding 1 const [curveType, setCurveType] = React.useState(curveTypes[0]); return ( @@ -60,4 +61,5 @@ export default function InterpolationDemo() { ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/interpolation-demo/client.ts b/docs/data/charts/lines/demos/interpolation-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/interpolation-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/interpolation-demo/index.ts b/docs/data/charts/lines/demos/interpolation-demo/index.ts new file mode 100644 index 0000000000000..948af73edf5ae --- /dev/null +++ b/docs/data/charts/lines/demos/interpolation-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import InterpolationDemo from './InterpolationDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, InterpolationDemo, { ClientProvider }); diff --git a/docs/data/charts/lines/LineAnimation.tsx b/docs/data/charts/lines/demos/line-animation/LineAnimation.tsx similarity index 98% rename from docs/data/charts/lines/LineAnimation.tsx rename to docs/data/charts/lines/demos/line-animation/LineAnimation.tsx index e46a1b6f612af..dff1ddff8bdac 100644 --- a/docs/data/charts/lines/LineAnimation.tsx +++ b/docs/data/charts/lines/demos/line-animation/LineAnimation.tsx @@ -22,6 +22,7 @@ const defaultSeries = [ })); export default function LineAnimation() { + // @focus-start @padding 1 const [series, setSeries] = React.useState(defaultSeries); const [nbSeries, setNbSeries] = React.useState(3); const [skipAnimation, setSkipAnimation] = React.useState(false); @@ -85,4 +86,5 @@ export default function LineAnimation() { ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/line-animation/client.ts b/docs/data/charts/lines/demos/line-animation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/line-animation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/line-animation/index.ts b/docs/data/charts/lines/demos/line-animation/index.ts new file mode 100644 index 0000000000000..f9c6bdf6e5181 --- /dev/null +++ b/docs/data/charts/lines/demos/line-animation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineAnimation from './LineAnimation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineAnimation, { ClientProvider }); diff --git a/docs/data/charts/lines/LineClick.tsx b/docs/data/charts/lines/demos/line-click/LineClick.tsx similarity index 95% rename from docs/data/charts/lines/LineClick.tsx rename to docs/data/charts/lines/demos/line-click/LineClick.tsx index 8eb4f74553ce1..ae83ec2642f71 100644 --- a/docs/data/charts/lines/LineClick.tsx +++ b/docs/data/charts/lines/demos/line-click/LineClick.tsx @@ -8,7 +8,7 @@ import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; import { LineChart } from '@mui/x-charts/LineChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { ChartsAxisData, LineItemIdentifier } from '@mui/x-charts/models'; +import type { ChartsAxisData, LineItemIdentifier } from '@mui/x-charts/models'; const lineChartsParams = { series: [ @@ -48,6 +48,7 @@ const lineChartsParams = { } as const; export default function LineClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); const [axisData, setAxisData] = React.useState(); @@ -100,4 +101,5 @@ ${axisData ? JSON.stringify(axisData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/line-click/client.ts b/docs/data/charts/lines/demos/line-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/line-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/line-click/index.ts b/docs/data/charts/lines/demos/line-click/index.ts new file mode 100644 index 0000000000000..19e5229508a1c --- /dev/null +++ b/docs/data/charts/lines/demos/line-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineClick from './LineClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineClick, { ClientProvider }); diff --git a/docs/data/charts/lines/LineDataset.tsx b/docs/data/charts/lines/demos/line-dataset/LineDataset.tsx similarity index 87% rename from docs/data/charts/lines/LineDataset.tsx rename to docs/data/charts/lines/demos/line-dataset/LineDataset.tsx index c431d127e8578..2dd10a8f8a654 100644 --- a/docs/data/charts/lines/LineDataset.tsx +++ b/docs/data/charts/lines/demos/line-dataset/LineDataset.tsx @@ -3,7 +3,7 @@ import { worldElectricityProduction, keyToLabel, colors, -} from '../dataset/worldElectricityProduction'; +} from '../../../dataset/worldElectricityProduction'; const stackStrategy = { stack: 'total', @@ -18,6 +18,7 @@ const customize = { export default function LineDataset() { return ( + // @focus-start @padding 2 value.toString() }, @@ -32,5 +33,6 @@ export default function LineDataset() { dataset={worldElectricityProduction} {...customize} /> + // @focus-end ); } diff --git a/docs/data/charts/lines/demos/line-dataset/client.ts b/docs/data/charts/lines/demos/line-dataset/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/line-dataset/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/line-dataset/index.ts b/docs/data/charts/lines/demos/line-dataset/index.ts new file mode 100644 index 0000000000000..000b72fa17803 --- /dev/null +++ b/docs/data/charts/lines/demos/line-dataset/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineDataset from './LineDataset'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineDataset, { ClientProvider }); diff --git a/docs/data/charts/lines/LineDefaultDomainLimit.tsx b/docs/data/charts/lines/demos/line-default-domain-limit/LineDefaultDomainLimit.tsx similarity index 94% rename from docs/data/charts/lines/LineDefaultDomainLimit.tsx rename to docs/data/charts/lines/demos/line-default-domain-limit/LineDefaultDomainLimit.tsx index f3bbbd213ea26..bda48b6f557a9 100644 --- a/docs/data/charts/lines/LineDefaultDomainLimit.tsx +++ b/docs/data/charts/lines/demos/line-default-domain-limit/LineDefaultDomainLimit.tsx @@ -3,9 +3,10 @@ import Stack from '@mui/material/Stack'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; +import { dataset } from '../../../dataset/gdpPerCapitaEvolution'; export default function LineDefaultDomainLimit() { + // @focus-start @padding 1 const [niceDomainLimit, setNiceDomainLimit] = React.useState(false); return ( @@ -59,4 +60,5 @@ export default function LineDefaultDomainLimit() { ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/line-default-domain-limit/client.ts b/docs/data/charts/lines/demos/line-default-domain-limit/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/line-default-domain-limit/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/line-default-domain-limit/index.ts b/docs/data/charts/lines/demos/line-default-domain-limit/index.ts new file mode 100644 index 0000000000000..64f6e1936bbc7 --- /dev/null +++ b/docs/data/charts/lines/demos/line-default-domain-limit/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineDefaultDomainLimit from './LineDefaultDomainLimit'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineDefaultDomainLimit, { ClientProvider }); diff --git a/docs/data/charts/lines/LineMarkShape.tsx b/docs/data/charts/lines/demos/line-mark-shape/LineMarkShape.tsx similarity index 96% rename from docs/data/charts/lines/LineMarkShape.tsx rename to docs/data/charts/lines/demos/line-mark-shape/LineMarkShape.tsx index a23b69e4334ff..bb87539430beb 100644 --- a/docs/data/charts/lines/LineMarkShape.tsx +++ b/docs/data/charts/lines/demos/line-mark-shape/LineMarkShape.tsx @@ -4,7 +4,7 @@ import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/weather'; +import { dataset } from '../../../dataset/weather'; type Shape = 'circle' | 'square' | 'diamond' | 'cross' | 'star' | 'triangle' | 'wye'; @@ -35,6 +35,7 @@ const shapes: Shape[] = [ ]; export default function LineMarkShape() { + // @focus-start @padding 1 const [marks, setMarks] = React.useState('true'); const [shape, setShape] = React.useState('circle'); @@ -93,4 +94,5 @@ export default function LineMarkShape() { ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/line-mark-shape/client.ts b/docs/data/charts/lines/demos/line-mark-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/line-mark-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/line-mark-shape/index.ts b/docs/data/charts/lines/demos/line-mark-shape/index.ts new file mode 100644 index 0000000000000..f83d4b154d444 --- /dev/null +++ b/docs/data/charts/lines/demos/line-mark-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineMarkShape from './LineMarkShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineMarkShape, { ClientProvider }); diff --git a/docs/data/charts/lines/LineOverview.tsx b/docs/data/charts/lines/demos/line-overview/LineOverview.tsx similarity index 97% rename from docs/data/charts/lines/LineOverview.tsx rename to docs/data/charts/lines/demos/line-overview/LineOverview.tsx index 5319e47282851..a3f58b461eb3c 100644 --- a/docs/data/charts/lines/LineOverview.tsx +++ b/docs/data/charts/lines/demos/line-overview/LineOverview.tsx @@ -14,7 +14,7 @@ import { ChartsZoomSlider } from '@mui/x-charts-pro/ChartsZoomSlider'; import { ChartsClipPath } from '@mui/x-charts-pro/ChartsClipPath'; import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; import { ChartsLegend } from '@mui/x-charts-pro/ChartsLegend'; -import { usaUnemploymentAndGdp } from '../dataset/usaUnemploymentAndGdp'; +import { usaUnemploymentAndGdp } from '../../../dataset/usaUnemploymentAndGdp'; type RecessionPeriod = { start: Date; @@ -92,6 +92,7 @@ function RecessionBands({ periods }: { periods: RecessionPeriod[] }) { } export default function LineOverview() { + // @focus-start @padding 1 const clipPathId = React.useId(); return ( @@ -191,4 +192,5 @@ export default function LineOverview() { ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/line-overview/client.ts b/docs/data/charts/lines/demos/line-overview/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/line-overview/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/line-overview/index.ts b/docs/data/charts/lines/demos/line-overview/index.ts new file mode 100644 index 0000000000000..1f864afe654b6 --- /dev/null +++ b/docs/data/charts/lines/demos/line-overview/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineOverview from './LineOverview'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineOverview, { ClientProvider }); diff --git a/docs/data/charts/lines/LinePointerInteraction.tsx b/docs/data/charts/lines/demos/line-pointer-interaction/LinePointerInteraction.tsx similarity index 94% rename from docs/data/charts/lines/LinePointerInteraction.tsx rename to docs/data/charts/lines/demos/line-pointer-interaction/LinePointerInteraction.tsx index 7e7c55d0f4530..ba9a3d41dd653 100644 --- a/docs/data/charts/lines/LinePointerInteraction.tsx +++ b/docs/data/charts/lines/demos/line-pointer-interaction/LinePointerInteraction.tsx @@ -27,10 +27,12 @@ const data = { export default function LinePointerInteraction() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/lines/demos/line-pointer-interaction/client.ts b/docs/data/charts/lines/demos/line-pointer-interaction/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/line-pointer-interaction/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/line-pointer-interaction/index.ts b/docs/data/charts/lines/demos/line-pointer-interaction/index.ts new file mode 100644 index 0000000000000..400a99c7384b3 --- /dev/null +++ b/docs/data/charts/lines/demos/line-pointer-interaction/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LinePointerInteraction from './LinePointerInteraction'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LinePointerInteraction, { ClientProvider }); diff --git a/docs/data/charts/lines/MarkOptimization.tsx b/docs/data/charts/lines/demos/mark-optimization/MarkOptimization.tsx similarity index 88% rename from docs/data/charts/lines/MarkOptimization.tsx rename to docs/data/charts/lines/demos/mark-optimization/MarkOptimization.tsx index 0872477824f49..dcb1983cf25d1 100644 --- a/docs/data/charts/lines/MarkOptimization.tsx +++ b/docs/data/charts/lines/demos/mark-optimization/MarkOptimization.tsx @@ -2,6 +2,7 @@ import { LineChart } from '@mui/x-charts/LineChart'; export default function MarkOptimization() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/lines/demos/mark-optimization/client.ts b/docs/data/charts/lines/demos/mark-optimization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/mark-optimization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/mark-optimization/index.ts b/docs/data/charts/lines/demos/mark-optimization/index.ts new file mode 100644 index 0000000000000..eeeebfcd12eb5 --- /dev/null +++ b/docs/data/charts/lines/demos/mark-optimization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MarkOptimization from './MarkOptimization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MarkOptimization, { ClientProvider }); diff --git a/docs/data/charts/lines/MarkSize.tsx b/docs/data/charts/lines/demos/mark-size/MarkSize.tsx similarity index 98% rename from docs/data/charts/lines/MarkSize.tsx rename to docs/data/charts/lines/demos/mark-size/MarkSize.tsx index 789c0d53653d6..09c5288589f46 100644 --- a/docs/data/charts/lines/MarkSize.tsx +++ b/docs/data/charts/lines/demos/mark-size/MarkSize.tsx @@ -21,6 +21,7 @@ const shapes: Shape[] = [ ]; export default function MarkSize() { + // @focus-start @padding 1 const [shape, setShape] = React.useState('circle'); const [radius, setRadius] = React.useState(6); const [scale, setScale] = React.useState(1.2); @@ -89,4 +90,5 @@ export default function MarkSize() { ); + // @focus-end } diff --git a/docs/data/charts/lines/demos/mark-size/client.ts b/docs/data/charts/lines/demos/mark-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/mark-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/mark-size/index.ts b/docs/data/charts/lines/demos/mark-size/index.ts new file mode 100644 index 0000000000000..ffbb4076abc9b --- /dev/null +++ b/docs/data/charts/lines/demos/mark-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MarkSize from './MarkSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MarkSize, { ClientProvider }); diff --git a/docs/data/charts/lines/StackedAreas.tsx b/docs/data/charts/lines/demos/stacked-areas/StackedAreas.tsx similarity index 89% rename from docs/data/charts/lines/StackedAreas.tsx rename to docs/data/charts/lines/demos/stacked-areas/StackedAreas.tsx index d2b8faf683c3d..28cb8fa778f36 100644 --- a/docs/data/charts/lines/StackedAreas.tsx +++ b/docs/data/charts/lines/demos/stacked-areas/StackedAreas.tsx @@ -1,9 +1,10 @@ import { LineChart } from '@mui/x-charts/LineChart'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; +import { dataset } from '../../../dataset/gdpPerCapitaEvolution'; export default function StackedAreas() { return (
+ {/* @focus-start */} + {/* @focus-end */}
); } diff --git a/docs/data/charts/lines/demos/stacked-areas/client.ts b/docs/data/charts/lines/demos/stacked-areas/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/stacked-areas/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/stacked-areas/index.ts b/docs/data/charts/lines/demos/stacked-areas/index.ts new file mode 100644 index 0000000000000..f2a5371f3a7bc --- /dev/null +++ b/docs/data/charts/lines/demos/stacked-areas/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackedAreas from './StackedAreas'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackedAreas, { ClientProvider }); diff --git a/docs/data/charts/lines/StyledLineChart.tsx b/docs/data/charts/lines/demos/styled-line-chart/StyledLineChart.tsx similarity index 97% rename from docs/data/charts/lines/StyledLineChart.tsx rename to docs/data/charts/lines/demos/styled-line-chart/StyledLineChart.tsx index 29f27fff5527c..44ce7ba7f11f0 100644 --- a/docs/data/charts/lines/StyledLineChart.tsx +++ b/docs/data/charts/lines/demos/styled-line-chart/StyledLineChart.tsx @@ -18,6 +18,7 @@ const xLabels = [ export default function StyledLineChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/lines/demos/styled-line-chart/client.ts b/docs/data/charts/lines/demos/styled-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/lines/demos/styled-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/lines/demos/styled-line-chart/index.ts b/docs/data/charts/lines/demos/styled-line-chart/index.ts new file mode 100644 index 0000000000000..226286c38e07d --- /dev/null +++ b/docs/data/charts/lines/demos/styled-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StyledLineChart from './StyledLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StyledLineChart, { ClientProvider }); diff --git a/docs/data/charts/lines/lines.md b/docs/data/charts/lines/lines.md index 2cd8e1e86b2a5..659886d03db4e 100644 --- a/docs/data/charts/lines/lines.md +++ b/docs/data/charts/lines/lines.md @@ -14,7 +14,7 @@ Line charts work well when you want to show how values change over a continuous They emphasize trends, patterns, and fluctuations, so they are useful for exploring relationships, spotting cycles, or tracking performance over time. Each line usually represents one series, so you can compare multiple variables or groups at a glance. -{{"demo": "LineOverview.js"}} +{{"component": "file://./demos/line-overview/index.ts"}} ## Basics @@ -29,7 +29,7 @@ The axis can use any `scaleType`, and its `data` should have the same length as When you omit the `xAxis` prop entirely, `LineChart` supplies a default x-axis with `scaleType='point'`. Its `data` is `[0, 1, 2, …]` with length matching the longest series, so each y-value pairs with its index in the series `data` array. -{{"demo": "BasicLineChart.js"}} +{{"component": "file://./demos/basic-line-chart/index.ts"}} ### Using a dataset @@ -41,13 +41,13 @@ For example, `xAxis={[{ dataKey: 'x' }]}` or `series={[{ dataKey: 'y' }]}`. The demo below plots the evolution of world electricity production by source. -{{"demo": "LineDataset.js"}} +{{"component": "file://./demos/line-dataset/index.ts"}} ### Area Set the series `area` property to `true` to fill the area under the line. -{{"demo": "BasicArea.js"}} +{{"component": "file://./demos/basic-area/index.ts"}} ### Marks @@ -63,7 +63,7 @@ The `'start' | 'end'` options render the highlight marks instead of the regular As a result, while the pointer highlights a value, the start/end mark is replaced by the highlighted one. ::: -{{"demo": "LineMarkShape.js", "bg": "outline"}} +{{"component": "file://./demos/line-mark-shape/index.ts", "bg": "outline"}} ### Log scale @@ -81,7 +81,7 @@ By default, they are stacked in the order you defined them, with positive values See [Stacking](/x/react-charts/stacking/) for more details. -{{"demo": "StackedAreas.js"}} +{{"component": "file://./demos/stacked-areas/index.ts"}} ### Axis domain @@ -89,7 +89,7 @@ By default, the x-axis domain limit for line charts is set to `'strict'`, meanin For other chart types, axes round their limits to match human-readable values (for example, data ranging from 2 to 195 displays values from 0 to 200). This behavior can be modified by the [axis property `domainLimit`](/x/react-charts/axis/#relative-axis-subdomain). -{{"demo": "LineDefaultDomainLimit.js"}} +{{"component": "file://./demos/line-default-domain-limit/index.ts"}} ## Partial data @@ -101,7 +101,7 @@ Use `null` values when you have partial data or series that start at different p By default, the tooltip omits series that have no value at the hovered position. To show a tooltip for missing values, use `valueFormatter` to return a string when the value is `null` or `undefined`. -{{"demo": "DifferentLength.js"}} +{{"component": "file://./demos/different-length/index.ts"}} :::info When the series `data` array is shorter than the axis `data`, values outside the series length are `undefined`, not `null`. @@ -126,7 +126,7 @@ Set the `connectNulls` property on a line series to continue the curve across po This links two segments with a gap of `null` values in between. The curve is not extrapolated before the first non-null point or after the last one. -{{"demo": "ConnectNulls.js"}} +{{"component": "file://./demos/connect-nulls/index.ts"}} ## Click event @@ -146,7 +146,7 @@ const clickHandler = ( ) => {}; ``` -{{"demo": "LineClick.js"}} +{{"component": "file://./demos/line-click/index.ts"}} :::info The `event` differs slightly between `onAxisClick` and the others: @@ -185,7 +185,7 @@ For line series (without area), it finds the series whose curve is closest to th This uses the same curve interpolation as the rendered line (for example, `monotoneX`, `catmullRom`), so the hit detection matches the visual shape. -{{"demo": "LinePointerInteraction.js"}} +{{"component": "file://./demos/line-pointer-interaction/index.ts"}} ### Highlight @@ -202,7 +202,7 @@ You can add a grid in the background of the chart with the `grid` prop. See [Axis—Grid](/x/react-charts/axis-ticks/#grid) for details. -{{"demo": "GridDemo.js"}} +{{"component": "file://./demos/grid-demo/index.ts"}} ### Color scale @@ -217,7 +217,7 @@ Line charts use the following, in order of priority: See [Styling—Value-based colors](/x/react-charts/styling/#value-based-colors) for the `colorMap` properties. -{{"demo": "ColorScale.js"}} +{{"component": "file://./demos/color-scale/index.ts"}} :::warning Ordinal color config is not yet supported for line charts. @@ -232,7 +232,7 @@ Use the select in the demo below to compare how each value renders on the same d You can set `curve` per series, so different series can use different interpolations. -{{"demo": "InterpolationDemo.js", "hideToolbar": true}} +{{"component": "file://./demos/interpolation-demo/index.ts", "hideToolbar": true}} #### Expanding steps @@ -240,7 +240,7 @@ For step interpolations (when `curve` is set to `'step'`, `'stepBefore'`, or `'s Use the `strictStepCurve` series property to turn off this behavior. -{{"demo": "ExpandingStep.js"}} +{{"component": "file://./demos/expanding-step/index.ts"}} ### Baseline @@ -254,7 +254,7 @@ You can also set `baseline` to a number to fix the baseline at a specific value. Do not use `baseline` with stacked areas; the result will not match expectations. ::: -{{"demo": "AreaBaseline.js"}} +{{"component": "file://./demos/area-baseline/index.ts"}} ### Optimization @@ -267,7 +267,7 @@ Or you can display a subset of the marks by providing a callback to `showMarks`. This demo shows one mark for values with even index. The highlighted point always shows a mark, whether its index is even or odd. -{{"demo": "MarkOptimization.js"}} +{{"component": "file://./demos/mark-optimization/index.ts"}} For large datasets, set the `sampling` prop on `LineChartPro` to reduce the line when zoomed out, with a choice of algorithms (`'m4'`, `'minmax'`, `'lttb'`). See [Charts—Performance](/x/react-charts/performance/#sampling) @@ -302,11 +302,11 @@ The gradient is defined as a child of the chart (`myGradient` referenced in `fil /> ``` -{{"demo": "CSSCustomization.js"}} +{{"component": "file://./demos/css-customization/index.ts"}} The next example shows how to apply a dashed stroke to the chart line, legend mark, and tooltip mark for each series using the `[data-series]` attribute selector. -{{"demo": "StyledLineChart.js"}} +{{"component": "file://./demos/styled-line-chart/index.ts"}} #### Mark size @@ -316,7 +316,7 @@ The default `'circle'` shape renders an SVG `circle` element, so use the `r` (ra The other shapes render an SVG `path` element that `r` does not affect. For those, use the `scale` property, which resizes the mark around its own center. -{{"demo": "MarkSize.js"}} +{{"component": "file://./demos/mark-size/index.ts"}} ## Animation @@ -340,7 +340,7 @@ Otherwise the chart cannot tell whether you are updating, removing, or adding a ``` -{{"demo": "LineAnimation.js"}} +{{"component": "file://./demos/line-animation/index.ts"}} ## Composition diff --git a/docs/data/charts/localization/ChartsLocalizationTableNoSnap.js b/docs/data/charts/localization/ChartsLocalizationTableNoSnap.js deleted file mode 100644 index 608b8f5991e60..0000000000000 --- a/docs/data/charts/localization/ChartsLocalizationTableNoSnap.js +++ /dev/null @@ -1,6 +0,0 @@ -import LocalizationTable from 'docs/src/modules/components/LocalizationTable'; -import data from './data.json'; - -export default function ChartsLocalizationTableNoSnap() { - return ; -} diff --git a/docs/data/charts/localization/CustomLocaleOverlay.js b/docs/data/charts/localization/CustomLocaleOverlay.js deleted file mode 100644 index 2f2547662304a..0000000000000 --- a/docs/data/charts/localization/CustomLocaleOverlay.js +++ /dev/null @@ -1,14 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function CustomLocaleOverlay() { - return ( - - ); -} diff --git a/docs/data/charts/localization/CustomLocaleOverlay.tsx.preview b/docs/data/charts/localization/CustomLocaleOverlay.tsx.preview deleted file mode 100644 index 3a51abe332fdf..0000000000000 --- a/docs/data/charts/localization/CustomLocaleOverlay.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/localization/demos/charts-localization-table-no-snap/ChartsLocalizationTableNoSnap.tsx b/docs/data/charts/localization/demos/charts-localization-table-no-snap/ChartsLocalizationTableNoSnap.tsx new file mode 100644 index 0000000000000..0e826e9463990 --- /dev/null +++ b/docs/data/charts/localization/demos/charts-localization-table-no-snap/ChartsLocalizationTableNoSnap.tsx @@ -0,0 +1,9 @@ +import LocalizationTable from 'docs/src/modules/components/LocalizationTable'; +import data from '../../data.json'; + +export default function ChartsLocalizationTableNoSnap() { + return ( + // @focus @padding 2 + + ); +} diff --git a/docs/data/charts/localization/demos/charts-localization-table-no-snap/client.ts b/docs/data/charts/localization/demos/charts-localization-table-no-snap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/localization/demos/charts-localization-table-no-snap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/localization/demos/charts-localization-table-no-snap/index.ts b/docs/data/charts/localization/demos/charts-localization-table-no-snap/index.ts new file mode 100644 index 0000000000000..4a0e1c272daf3 --- /dev/null +++ b/docs/data/charts/localization/demos/charts-localization-table-no-snap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChartsLocalizationTableNoSnap from './ChartsLocalizationTableNoSnap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChartsLocalizationTableNoSnap, { ClientProvider }); diff --git a/docs/data/charts/localization/CustomLocaleOverlay.tsx b/docs/data/charts/localization/demos/custom-locale-overlay/CustomLocaleOverlay.tsx similarity index 86% rename from docs/data/charts/localization/CustomLocaleOverlay.tsx rename to docs/data/charts/localization/demos/custom-locale-overlay/CustomLocaleOverlay.tsx index 2f2547662304a..e37a7c28b426f 100644 --- a/docs/data/charts/localization/CustomLocaleOverlay.tsx +++ b/docs/data/charts/localization/demos/custom-locale-overlay/CustomLocaleOverlay.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function CustomLocaleOverlay() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/localization/demos/custom-locale-overlay/client.ts b/docs/data/charts/localization/demos/custom-locale-overlay/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/localization/demos/custom-locale-overlay/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/localization/demos/custom-locale-overlay/index.ts b/docs/data/charts/localization/demos/custom-locale-overlay/index.ts new file mode 100644 index 0000000000000..600e15d8c42da --- /dev/null +++ b/docs/data/charts/localization/demos/custom-locale-overlay/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomLocaleOverlay from './CustomLocaleOverlay'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomLocaleOverlay, { ClientProvider }); diff --git a/docs/data/charts/localization/localization.md b/docs/data/charts/localization/localization.md index 7fe88ca5c904d..70506fb320357 100644 --- a/docs/data/charts/localization/localization.md +++ b/docs/data/charts/localization/localization.md @@ -20,7 +20,7 @@ You can find [all supported translation keys](https://github.com/mui/mui-x/blob/ The example below customizes the labels of the loading overlay. -{{"demo": "CustomLocaleOverlay.js", "bg": "inline"}} +{{"component": "file://./demos/custom-locale-overlay/index.ts", "bg": "inline"}} ### Built-in locales @@ -135,4 +135,4 @@ See [Right-to-left support](/material-ui/customization/right-to-left/) in the Ma ## Translation status -{{"demo": "ChartsLocalizationTableNoSnap.js", "hideToolbar": true, "bg": "inline"}} +{{"component": "file://./demos/charts-localization-table-no-snap/index.ts", "hideToolbar": true, "bg": "inline"}} diff --git a/docs/data/charts/map/BasicGeoDataPlot.js b/docs/data/charts/map/BasicGeoDataPlot.js deleted file mode 100644 index fd26ccbbe9825..0000000000000 --- a/docs/data/charts/map/BasicGeoDataPlot.js +++ /dev/null @@ -1,59 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -import { ChartsLegend } from '@mui/x-charts-premium/ChartsLegend'; -import { countryData, EU_COUNTRIES } from '../dataset/countryData'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -export default function BasicGeoDataPlot() { - return ( - - ({ - name: feature.properties?.name, - color: `hsl(${(index / countries.features.length) * 360}, 50%, 70%)`, - })), - valueFormatter: (point) => - point.value != null ? `${point.value} units` : 'No data', - }, - { - type: 'mapShape', - label: 'European Union', - id: 'EU', - color: 'blue', - highlightScope: { highlight: 'item', fade: 'series' }, - data: EU_COUNTRIES.map((code) => ({ - name: countryData[code].worldAtlasName, - label: countryData[code].country, - })), - valueFormatter: (point) => - point.value != null ? `${point.value} units` : 'No data', - }, - ]} - > - - - - - - - - - ); -} diff --git a/docs/data/charts/map/ColorScaleMapShape.js b/docs/data/charts/map/ColorScaleMapShape.js deleted file mode 100644 index 15c0c646af042..0000000000000 --- a/docs/data/charts/map/ColorScaleMapShape.js +++ /dev/null @@ -1,123 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { interpolateBlues } from 'd3-scale-chromatic'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { - ContinuousColorLegend, - PiecewiseColorLegend, -} from '@mui/x-charts-premium/ChartsLegend'; - -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; -import { withCountryCodeAsName, countryData } from '../dataset/countryData'; - -const countries = withCountryCodeAsName( - topojsonFeature(countriesTopology, 'countries'), -); - -const data = Object.keys(countryData).map((code) => ({ - name: code, - label: countryData[code].country, - colorValue: internetUsageByCountry[code], -})); - -export default function ColorScaleMapShape() { - const [colorMap, setColorMap] = React.useState('continuous'); - const [unknownShape, setUnknownShape] = React.useState('color'); - - return ( - - - value && setColorMap(value)} - aria-label="color map" - > - continuous - piecewise - - value && setUnknownShape(value)} - aria-label="unknown shape" - > - unknown Color - Geo Data - none - - - - Share of the population using the Internet in 2020 - - - - point.colorValue == null - ? 'No data' - : `${point.colorValue.toFixed(1)}%`, - }, - ]} - zAxis={[ - { - id: 'internet-usage', - colorMap: - colorMap === 'continuous' - ? { - type: 'continuous', - min: 0, - max: 100, - color: ['#e3f2fd', '#0d47a1'], - unknownColor: unknownShape === 'color' ? 'gray' : undefined, - } - : { - type: 'piecewise', - thresholds: [25, 50, 75], - colors: [0.25, 0.5, 0.75, 1].map(interpolateBlues), - unknownColor: unknownShape === 'color' ? 'gray' : undefined, - }, - }, - ]} - > - - {unknownShape === 'geoData' && ( - - )} - - - - {colorMap === 'continuous' ? ( - - ) : ( - - )} - - - - ); -} diff --git a/docs/data/charts/map/CountryProjectionShape.js b/docs/data/charts/map/CountryProjectionShape.js deleted file mode 100644 index d95afafaa5deb..0000000000000 --- a/docs/data/charts/map/CountryProjectionShape.js +++ /dev/null @@ -1,219 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import Slider from '@mui/material/Slider'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ListSubheader from '@mui/material/ListSubheader'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -import { useGeoPath } from '@mui/x-charts-premium/hooks'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -function getCountry(name) { - return { - ...countries, - features: countries.features.filter( - (feature) => feature.properties?.name === name, - ), - }; -} - -const LANDS = { - Japan: { - geoData: getCountry('Japan'), - center: [138, 38], - parallels: [33, 45], - }, - 'United Kingdom': { - geoData: getCountry('United Kingdom'), - center: [-2.5, 54], - parallels: [50, 58], - }, - Australia: { - geoData: getCountry('Australia'), - center: [134, -28], - parallels: [-36, -18], - }, -}; - -const projectionGroups = [ - { - // https://d3js.org/d3-geo/conic - label: 'Conic', - projections: ['conicConformal', 'conicEqualArea', 'conicEquidistant', 'albers'], - }, - { - // https://d3js.org/d3-geo/cylindrical - label: 'Cylindrical', - projections: [ - 'equirectangular', - 'mercator', - 'transverseMercator', - 'equalEarth', - 'naturalEarth1', - ], - }, - { - // https://d3js.org/d3-geo/azimuthal - label: 'Azimuthal', - projections: [ - 'azimuthalEqualArea', - 'azimuthalEquidistant', - 'gnomonic', - 'orthographic', - 'stereographic', - ], - }, -]; - -const CONIC_PROJECTIONS = [ - 'conicConformal', - 'conicEqualArea', - 'conicEquidistant', - 'albers', -]; - -const CYLINDRICAL_PROJECTIONS = [ - 'equirectangular', - 'mercator', - 'transverseMercator', - 'equalEarth', - 'naturalEarth1', -]; - -function isConicProjection(projection) { - return CONIC_PROJECTIONS.includes(projection); -} - -function isCylindricalProjection(projection) { - return CYLINDRICAL_PROJECTIONS.includes(projection); -} - -export default function CountryProjectionShape() { - const [land, setLand] = React.useState('Japan'); - const [projection, setProjection] = React.useState('albers'); - const [parallels, setParallels] = React.useState(LANDS.Japan.parallels); - - const { geoData, center } = LANDS[land]; - const conic = isConicProjection(projection); - const cylindrical = isCylindricalProjection(projection); - - const handleLandChange = (nextLand) => { - const config = LANDS[nextLand]; - setLand(nextLand); - setProjection('albers'); - setParallels(config.parallels); - }; - - return ( - - - - - - {conic && } - - - - - - handleLandChange(event.target.value)} - > - {Object.keys(LANDS).map((name) => ( - - {name} - - ))} - - setProjection(event.target.value)} - > - {projectionGroups.flatMap(({ label, projections }) => [ - {label}, - ...projections.map((name) => ( - - {name} - - )), - ])} - - {conic && ( -
- - Standard parallels - - setParallels(value.slice(0, 2))} - /> -
- )} -
-
- ); -} - -const angles = new Array(37).fill(0).map((_, i) => i * 10 - 180); -function Parallels(props) { - const { parallels } = props; - - const path = useGeoPath(); - - if (!path) { - return null; - } - const d = path({ - type: 'MultiLineString', - coordinates: [ - angles.map((p) => [p, parallels[0]]), - ...(parallels[1] === parallels[0] - ? [] - : [angles.map((p) => [p, parallels[1]])]), - ], - }); - - if (!d) { - return null; - } - return ; -} diff --git a/docs/data/charts/map/ExportMap.js b/docs/data/charts/map/ExportMap.js deleted file mode 100644 index afdae891558a1..0000000000000 --- a/docs/data/charts/map/ExportMap.js +++ /dev/null @@ -1,92 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Stack from '@mui/material/Stack'; -import { interpolateBlues } from 'd3-scale-chromatic'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { useChartRootRef } from '@mui/x-charts/hooks'; -import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; -import { PiecewiseColorLegend } from '@mui/x-charts-premium/ChartsLegend'; - -import { countryData } from '../dataset/countryData'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -const data = Object.keys(countryData).map((code) => ({ - name: code, - label: countryData[code].country, - colorValue: internetUsageByCountry[code], -})); - -function CustomChartWrapper({ children }) { - const chartRootRef = useChartRootRef(); - - return
{children}
; -} - -export default function ExportMap() { - const apiRef = useChartPremiumApiRef(); - - return ( - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/map/GeoDataPlotDemo.js b/docs/data/charts/map/GeoDataPlotDemo.js deleted file mode 100644 index 9cfb81e757795..0000000000000 --- a/docs/data/charts/map/GeoDataPlotDemo.js +++ /dev/null @@ -1,58 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -export default function GeoDataPlotDemo() { - const [fill, setFill] = React.useState('#e3f2fd'); - const [stroke, setStroke] = React.useState('#0d47a1'); - const [strokeWidth, setStrokeWidth] = React.useState(0.5); - - return ( - - - - - - - - - - setFill(event.target.value)} - /> - setStroke(event.target.value)} - /> - setStrokeWidth(Number(event.target.value))} - /> - - - ); -} diff --git a/docs/data/charts/map/GeoFeatureKeyMapShape.js b/docs/data/charts/map/GeoFeatureKeyMapShape.js deleted file mode 100644 index 44a1c766261e8..0000000000000 --- a/docs/data/charts/map/GeoFeatureKeyMapShape.js +++ /dev/null @@ -1,73 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; - -import { countryData } from '../dataset/countryData'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -// Treat the state of Somaliland as part of Somalia to match our World in data dataset. -const mergeSomaliland = (feature) => - feature.properties?.name === 'Somaliland' - ? 'Somalia' - : (feature.properties?.name ?? null); - -const data = Object.entries(countryData) - .filter(([, country]) => country.worldAtlasName) - .map(([code, country]) => ({ - name: country.worldAtlasName, - label: country.country, - colorValue: internetUsageByCountry[code], - })); - -export default function GeoFeatureKeyMapShape() { - return ( - - - - point.colorValue == null - ? 'No data' - : `${point.colorValue.toFixed(1)}%`, - }, - ]} - zAxis={[ - { - id: 'internet-usage', - colorMap: { - type: 'continuous', - min: 0, - max: 100, - color: ['#e3f2fd', '#0d47a1'], - }, - }, - ]} - > - - - - - - - - - ); -} diff --git a/docs/data/charts/map/HighlightedMapShape.js b/docs/data/charts/map/HighlightedMapShape.js deleted file mode 100644 index 67200e7967314..0000000000000 --- a/docs/data/charts/map/HighlightedMapShape.js +++ /dev/null @@ -1,133 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; - -import { - withCountryCodeAsName, - countriesInContinent, - countryData, -} from '../dataset/countryData'; - -const countries = withCountryCodeAsName( - topojsonFeature(countriesTopology, 'countries'), -); - -const getContinentData = (continent) => - countriesInContinent[continent].map((code) => ({ - name: code, - label: countryData[code].country, - })); - -const northAmerica = getContinentData('North America'); -const southAmerica = getContinentData('South America'); -const europe = getContinentData('Europe'); -const asia = getContinentData('Asia'); -const africa = getContinentData('Africa'); -const oceania = getContinentData('Oceania'); - -export default function HighlightedMapShape() { - const [highlight, setHighlight] = React.useState('item'); - const [fade, setFade] = React.useState('global'); - - return ( - - - '', - data: northAmerica, - }, - { - type: 'mapShape', - label: 'South America', - color: '#43a047', - highlightScope: { highlight, fade }, - valueFormatter: () => '', - data: southAmerica, - }, - { - type: 'mapShape', - label: 'Europe', - color: '#1e88e5', - highlightScope: { highlight, fade }, - valueFormatter: () => '', - data: europe, - }, - { - type: 'mapShape', - label: 'Asia', - color: '#e53935', - highlightScope: { highlight, fade }, - valueFormatter: () => '', - data: asia, - }, - { - type: 'mapShape', - label: 'Africa', - color: '#fdd835', - highlightScope: { highlight, fade }, - valueFormatter: () => '', - data: africa, - }, - { - type: 'mapShape', - label: 'Oceania', - color: '#8e24aa', - highlightScope: { highlight, fade }, - valueFormatter: () => '', - data: oceania, - }, - ]} - > - - - - - - - - - setHighlight(event.target.value)} - > - none - item - series - - setFade(event.target.value)} - > - none - series - global - - - - ); -} diff --git a/docs/data/charts/map/MapShapeClick.js b/docs/data/charts/map/MapShapeClick.js deleted file mode 100644 index a1f7edd31765a..0000000000000 --- a/docs/data/charts/map/MapShapeClick.js +++ /dev/null @@ -1,82 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -import { EU_COUNTRIES, countryData } from '../dataset/countryData'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -export default function MapShapeClick() { - const [itemData, setItemData] = React.useState(); - - return ( - - - ({ - name: countryData[code].country, - })), - valueFormatter: (point) => point.name, - }, - ]} - > - - - setItemData(identifier)} - /> - - - - - - - - Click on a shape - setItemData(undefined)} - > - - - - - - - ); -} diff --git a/docs/data/charts/map/MapShapePlotDemo.js b/docs/data/charts/map/MapShapePlotDemo.js deleted file mode 100644 index 0a95574524b2b..0000000000000 --- a/docs/data/charts/map/MapShapePlotDemo.js +++ /dev/null @@ -1,39 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; - -import { EU_COUNTRIES, countryData } from '../dataset/countryData'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -export default function MapShapePlotDemo() { - return ( - - ({ name: countryData[code].country })), - valueFormatter: (point) => point.name, - }, - ]} - > - - - - - - - - ); -} diff --git a/docs/data/charts/map/MapZoomControl.js b/docs/data/charts/map/MapZoomControl.js deleted file mode 100644 index 5c3d422ad7b21..0000000000000 --- a/docs/data/charts/map/MapZoomControl.js +++ /dev/null @@ -1,282 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import ButtonGroup from '@mui/material/ButtonGroup'; -import Slider from '@mui/material/Slider'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ListSubheader from '@mui/material/ListSubheader'; -import Typography from '@mui/material/Typography'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import USATopology from 'us-atlas/states-10m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; -import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -const countriesWithoutAntarctica = { - ...countries, - features: countries.features.filter( - (feature) => feature.properties?.name !== 'Antarctica', - ), -}; - -const USAStates = topojsonFeature(USATopology, 'states'); - -const projectionGroups = [ - { - // https://d3js.org/d3-geo/azimuthal - label: 'Azimuthal', - projections: [ - 'azimuthalEqualArea', - 'azimuthalEquidistant', - 'gnomonic', - 'orthographic', - 'stereographic', - ], - }, - { - // https://d3js.org/d3-geo/conic - label: 'Conic', - projections: [ - // For now commented because those are more difficult to handle - 'conicConformal', - 'conicEqualArea', - 'conicEquidistant', - 'albers', - 'albersUsa', // Special composition for the USA with an edge case for Alaska and Hawaii. - ], - }, - { - // https://d3js.org/d3-geo/cylindrical - label: 'Cylindrical', - projections: [ - 'equirectangular', - 'mercator', - 'transverseMercator', - 'equalEarth', - 'naturalEarth1', - ], - }, -]; - -const cities = [ - // { name: 'New York', coordinates: [-74.006, 40.7128] }, - { name: 'Tokyo', coordinates: [139.6917, 35.6895] }, - { name: 'Sydney', coordinates: [151.2093, -33.8688] }, - { name: 'Rio', coordinates: [-43.1729, -22.9068] }, -]; - -function getGeoDataForProjection(projection) { - if (projection === 'albersUsa') { - return USAStates; - } - if (projection === 'conicConformal') { - return countriesWithoutAntarctica; - } - return countries; -} - -export default function MapZoomControl() { - const [projection, setProjection] = React.useState('naturalEarth1'); - const apiRef = useChartPremiumApiRef(); - - const [view, setView] = React.useState({ - zoomLevel: 1, - center: [0, 0], - translation: [0, 0], - roll: 0, - }); - - return ( - - - { - setView(newView); - }} - height={360} - > - - - - - - - - { - setProjection(event.target.value); - }} - > - {projectionGroups.flatMap(({ label, projections }) => [ - {label}, - ...projections.map((name) => ( - - {name} - - )), - ])} - - -
- - Center (longitude, latitude) - - - {cities.map(({ name, coordinates }) => ( - - ))} - - { - setView((prev) => ({ - ...prev, - center: [value, prev.center[1]], - })); - }} - /> - { - setView((prev) => ({ - ...prev, - center: [prev.center[0], value], - })); - }} - /> - {[ - 'azimuthalEqualArea', - 'azimuthalEquidistant', - 'gnomonic', - 'orthographic', - 'stereographic', - ].includes(projection) && ( - { - setView((prev) => ({ - ...prev, - roll: value, - })); - }} - /> - )} -
-
- - Translation (x, y as fraction of the drawing area) - - { - setView((prev) => ({ - ...prev, - translation: [value, prev.translation[1]], - })); - }} - /> - { - setView((prev) => ({ - ...prev, - translation: [prev.translation[0], value], - })); - }} - /> -
-
- - Zoom Level - - { - setView((prev) => ({ ...prev, zoomLevel: value })); - }} - /> -
-
- -
-
-
- ); -} diff --git a/docs/data/charts/map/MapZoomOptions.js b/docs/data/charts/map/MapZoomOptions.js deleted file mode 100644 index bf216153e94dd..0000000000000 --- a/docs/data/charts/map/MapZoomOptions.js +++ /dev/null @@ -1,235 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ListSubheader from '@mui/material/ListSubheader'; -import Typography from '@mui/material/Typography'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import USATopology from 'us-atlas/states-10m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; -import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -const countriesWithoutAntarctica = { - ...countries, - features: countries.features.filter( - (feature) => feature.properties?.name !== 'Antarctica', - ), -}; - -const USAStates = topojsonFeature(USATopology, 'states'); - -function getGeoDataForProjection(projection) { - if (projection === 'albersUsa') { - return USAStates; - } - if (projection === 'conicConformal') { - return countriesWithoutAntarctica; - } - return countries; -} -const projectionGroups = [ - { - // https://d3js.org/d3-geo/azimuthal - label: 'Azimuthal', - projections: [ - 'azimuthalEqualArea', - 'azimuthalEquidistant', - 'gnomonic', - 'orthographic', - 'stereographic', - ], - }, - { - // https://d3js.org/d3-geo/conic - label: 'Conic', - projections: [ - // For now commented because those are more difficult to handle - 'conicConformal', - 'conicEqualArea', - 'conicEquidistant', - 'albers', - 'albersUsa', // Special composition for the USA with an edge case for Alaska and Hawaii. - ], - }, - { - // https://d3js.org/d3-geo/cylindrical - label: 'Cylindrical', - projections: [ - 'equirectangular', - 'mercator', - 'transverseMercator', - 'equalEarth', - 'naturalEarth1', - ], - }, -]; - -function isConicProjection(projection) { - return ( - projection === 'conicConformal' || - projection === 'conicEqualArea' || - projection === 'conicEquidistant' || - projection === 'albers' || - projection === 'albersUsa' - ); -} - -function isCylindricalProjection(projection) { - return ( - projection === 'equirectangular' || - projection === 'mercator' || - projection === 'transverseMercator' || - projection === 'equalEarth' || - projection === 'naturalEarth1' - ); -} - -export default function MapZoomOptions() { - const [projection, setProjection] = React.useState('naturalEarth1'); - const apiRef = useChartPremiumApiRef(); - - const [rotationAllowed, setRotationAllowed] = React.useState('longitude'); - const [translationAllowed, setTranslationAllowed] = React.useState('y'); - const [maxEmptySpace, setMaxEmptySpace] = React.useState(0); - - return ( - - - - - - - - - - - { - const value = event.target.value; - setProjection(value); - apiRef.current?.resetZoom(); - if (value === 'albersUsa') { - setRotationAllowed('none'); - setTranslationAllowed('both'); - } else if (isConicProjection(value) || isCylindricalProjection(value)) { - setRotationAllowed('longitude'); - setTranslationAllowed('y'); - } else { - setRotationAllowed('both'); - setTranslationAllowed('none'); - } - }} - > - {projectionGroups.flatMap(({ label, projections }) => [ - {label}, - ...projections.map((name) => ( - - {name} - - )), - ])} - - -
- - Rotation - -
- { - if (value !== null) { - setRotationAllowed(value); - } - }} - > - both - both+roll - longitude - none - -
-
-
- - Translation - -
- { - if (value !== null) { - setTranslationAllowed(value); - } - }} - > - both - x - y - none - -
-
- -
- - Max Empty Space - -
- { - if (value !== null) { - setMaxEmptySpace(value); - } - }} - > - 0 - 0.5 - -
-
- -
- -
-
-
- ); -} diff --git a/docs/data/charts/map/MarsMap.js b/docs/data/charts/map/MarsMap.js deleted file mode 100644 index 95d5179944a79..0000000000000 --- a/docs/data/charts/map/MarsMap.js +++ /dev/null @@ -1,147 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { MapImagePlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { useGeoPath } from '@mui/x-charts-premium/hooks'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { ContinuousColorLegend } from '@mui/x-charts-premium/ChartsLegend'; - -import { marsRegions, marsData, marsFeatures } from './marsRegions'; - -const MARS_IMAGE = '/static/x/charts/mars-viking-mdim21.jpg'; - -const FEATURE_COLORS = { landmark: '#ff7777', mission: '#4fc3f7' }; - -// Returns a predicate telling whether a coordinate is hidden by the projection, -// by checking it survives the round-trip `coord === invert(project(coord))`. -// On a globe (e.g. orthographic) back-of-sphere coordinates project onto the disk -// but invert to a different, front-facing coordinate. -function createIsHidden(projection) { - return (coordinate) => { - const point = projection(coordinate); - if (!point) { - return true; - } - const inverted = projection.invert?.(point); - return ( - !inverted || - Math.abs(inverted[0] - coordinate[0]) > 1 || - Math.abs(inverted[1] - coordinate[1]) > 1 - ); - }; -} - -// Notable features projected as labeled markers. -function MarsFeatureMarkers() { - const path = useGeoPath(); - const projection = path?.projection(); - if (!projection) { - return null; - } - const isHidden = createIsHidden(projection); - return ( - - {marsFeatures.map((feature) => { - const coordinate = [feature.lon, feature.lat]; - const point = projection(coordinate); - if (!point || isHidden(coordinate)) { - return null; - } - const [x, y] = point; - return ( - - {feature.name} - - - {feature.name} - - - ); - })} - - ); -} - -export default function MarsMap() { - const [projection, setProjection] = React.useState('orthographic'); - - return ( - - value && setProjection(value)} - aria-label="projection" - > - orthographic - equirectangular - - - point.colorValue == null - ? 'No data' - : `${point.colorValue > 0 ? '+' : ''}${point.colorValue} km`, - }, - ]} - zAxis={[ - { - colorMap: { - type: 'continuous', - min: -6, - max: 8, - color: ['#2c5d8a', '#d8b98c'], - }, - }, - ]} - > - - - - - - - - - - - - ); -} diff --git a/docs/data/charts/map/ProjectionMapShape.js b/docs/data/charts/map/ProjectionMapShape.js deleted file mode 100644 index 84f5443a61179..0000000000000 --- a/docs/data/charts/map/ProjectionMapShape.js +++ /dev/null @@ -1,113 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ListSubheader from '@mui/material/ListSubheader'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import USATopology from 'us-atlas/states-10m.json'; -import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -const USAStates = topojsonFeature(USATopology, 'states'); - -const projectionGroups = [ - { - // https://d3js.org/d3-geo/azimuthal - label: 'Azimuthal', - projections: [ - 'azimuthalEqualArea', - 'azimuthalEquidistant', - 'gnomonic', - 'orthographic', - 'stereographic', - ], - }, - { - // https://d3js.org/d3-geo/conic - label: 'Conic', - projections: [ - // For now commented because those are more difficult to handle - // 'conicConformal', - // 'conicEqualArea', - // 'conicEquidistant', - // 'albers', - 'albersUsa', // Special composition for the USA with an edge case for Alaska and Hawaii. - ], - }, - { - // https://d3js.org/d3-geo/cylindrical - label: 'Cylindrical', - projections: [ - 'equirectangular', - 'mercator', - 'transverseMercator', - 'equalEarth', - 'naturalEarth1', - ], - }, -]; - -function isConicProjection(projection) { - return ( - projection === 'conicConformal' || - projection === 'conicEqualArea' || - projection === 'conicEquidistant' || - projection === 'albers' || - projection === 'albersUsa' - ); -} - -export default function ProjectionMapShape() { - const [projection, setProjection] = React.useState('naturalEarth1'); - - const apiRef = useChartPremiumApiRef(); - - return ( - - - - - - - - - - - { - setProjection(event.target.value); - apiRef.current?.resetZoom(); - }} - > - {projectionGroups.flatMap(({ label, projections }) => [ - {label}, - ...projections.map((name) => ( - - {name} - - )), - ])} - - - - ); -} diff --git a/docs/data/charts/map/RemoveAntarctica.js b/docs/data/charts/map/RemoveAntarctica.js deleted file mode 100644 index fb4635b420d5f..0000000000000 --- a/docs/data/charts/map/RemoveAntarctica.js +++ /dev/null @@ -1,117 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import MenuItem from '@mui/material/MenuItem'; -import TextField from '@mui/material/TextField'; - -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; - -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; - -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; -import { countryData, withCountryCodeAsName } from '../dataset/countryData'; - -const projections = [ - 'equirectangular', - 'mercator', - 'transverseMercator', - 'equalEarth', - 'naturalEarth1', -]; - -const countries = withCountryCodeAsName( - topojsonFeature(countriesTopology, 'countries'), -); - -const countriesWithoutAntarctica = { - ...countries, - features: countries.features.filter( - (feature) => feature.properties?.name !== 'Antarctica', - ), -}; - -export default function RemoveAntarctica() { - const [mode, setMode] = React.useState('geoDataFiltering'); - const [projection, setProjection] = React.useState('naturalEarth1'); - - return ( - - { - if (newMode !== null) { - setMode(newMode); - } - }} - sx={{ mb: 2, mr: 2 }} - > - With Antarctica - geoData filtering - series only - - setProjection(event.target.value)} - sx={{ mb: 2, minWidth: 200 }} - > - {projections.map((name) => ( - - {name} - - ))} - - - - - {mode === 'seriesOnly' ? null : ( - - )} - - - - - - ); -} - -const settings = { - zAxis: [ - { - id: 'internet-usage', - colorMap: { - type: 'continuous', - min: 0, - max: 100, - color: ['#e3f2fd', '#0d47a1'], - unknownColor: 'gray', - }, - }, - ], - height: 360, - series: [ - { - type: 'mapShape', - label: 'Internet usage', - data: Object.keys(countryData).map((code) => ({ - name: code, - label: countryData[code].country, - colorValue: internetUsageByCountry[code], - })), - valueFormatter: (point) => - point.colorValue == null ? 'No data' : `${point.colorValue.toFixed(1)}%`, - }, - ], -}; diff --git a/docs/data/charts/map/TectonicPlates.js b/docs/data/charts/map/TectonicPlates.js deleted file mode 100644 index de7b87d72f4be..0000000000000 --- a/docs/data/charts/map/TectonicPlates.js +++ /dev/null @@ -1,124 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { MapShapePlot, Graticule } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; - -import tectonicPlates from '../dataset/tectonicPlates.json'; - -const plates = tectonicPlates; - -const countries = topojsonFeature(countriesTopology, 'countries'); - -// Plates and countries share a few names (India, Australia, ...), so tag each -// feature with its layer and key on `layer:name` to keep the two series apart. -function tagLayer(collection, layer) { - return collection.features.map((feature) => ({ - ...feature, - properties: { ...feature.properties, layer }, - })); -} - -const geoData = { - type: 'FeatureCollection', - features: [...tagLayer(plates, 'plate'), ...tagLayer(countries, 'country')], -}; - -const geoFeatureKey = (feature) => - `${feature.properties?.layer}:${feature.properties?.name}`; - -const plateNames = Array.from( - new Set(plates.features.map((feature) => String(feature.properties?.name))), -); - -const plateData = plateNames.map((name, index) => ({ - name: `plate:${name}`, - label: name, - color: `hsl(${Math.round((index / plateNames.length) * 360)}, 55%, 60%)`, -})); - -const countryData = countries.features.map((feature) => ({ - name: `country:${feature.properties?.name}`, -})); - -export default function TectonicPlates() { - const [projection, setProjection] = React.useState('naturalEarth1'); - - const isGlobe = projection === 'orthographic'; - - return ( - - - - The 54 tectonic plates of the Earth (PB2002 model) - - value && setProjection(value)} - aria-label="projection" - > - Map - Globe - - - - '', - }, - { - type: 'mapShape', - id: 'countries', - label: 'Country', - data: countryData, - }, - ]} - > - - - - - - - - - ); -} diff --git a/docs/data/charts/map/VisibleMapShape.js b/docs/data/charts/map/VisibleMapShape.js deleted file mode 100644 index a34c0d26a5e0f..0000000000000 --- a/docs/data/charts/map/VisibleMapShape.js +++ /dev/null @@ -1,95 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { feature as topojsonFeature } from 'topojson-client'; -import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; -import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsLegend } from '@mui/x-charts-premium/ChartsLegend'; -import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; - -import { - withCountryCodeAsName, - countriesInContinent, - countryData, -} from '../dataset/countryData'; - -const countries = withCountryCodeAsName( - topojsonFeature(countriesTopology, 'countries'), -); - -const getContinentData = (continent) => - countriesInContinent[continent].map((code) => ({ - name: code, - label: countryData[code].country, - })); - -const northAmerica = getContinentData('North America'); -const southAmerica = getContinentData('South America'); -const europe = getContinentData('Europe'); -const asia = getContinentData('Asia'); -const africa = getContinentData('Africa'); -const oceania = getContinentData('Oceania'); - -export default function VisibleMapShape() { - return ( - - '', - data: northAmerica, - }, - { - type: 'mapShape', - label: 'South America', - color: '#43a047', - valueFormatter: () => '', - data: southAmerica, - }, - { - type: 'mapShape', - label: 'Europe', - color: '#1e88e5', - valueFormatter: () => '', - data: europe, - }, - { - type: 'mapShape', - label: 'Asia', - color: '#e53935', - valueFormatter: () => '', - data: asia, - }, - { - type: 'mapShape', - label: 'Africa', - color: '#fdd835', - valueFormatter: () => '', - data: africa, - }, - { - type: 'mapShape', - label: 'Oceania', - color: '#8e24aa', - valueFormatter: () => '', - data: oceania, - }, - ]} - > - - - - - - - - - ); -} diff --git a/docs/data/charts/map/ZoomMap.tsx b/docs/data/charts/map/ZoomMap.tsx index e42f59ae6644c..cbcd4d180f7c8 100644 --- a/docs/data/charts/map/ZoomMap.tsx +++ b/docs/data/charts/map/ZoomMap.tsx @@ -9,7 +9,7 @@ import { MapShapePlot } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; import { ContinuousColorLegend } from '@mui/x-charts-premium/ChartsLegend'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; import { withCountryCodeAsName, countryData } from '../dataset/countryData'; diff --git a/docs/data/charts/map/BasicGeoDataPlot.tsx b/docs/data/charts/map/demos/basic-geo-data-plot/BasicGeoDataPlot.tsx similarity index 92% rename from docs/data/charts/map/BasicGeoDataPlot.tsx rename to docs/data/charts/map/demos/basic-geo-data-plot/BasicGeoDataPlot.tsx index c0cb51cd075c2..a7b75ab1869ae 100644 --- a/docs/data/charts/map/BasicGeoDataPlot.tsx +++ b/docs/data/charts/map/demos/basic-geo-data-plot/BasicGeoDataPlot.tsx @@ -6,9 +6,9 @@ import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; import { ChartsLegend } from '@mui/x-charts-premium/ChartsLegend'; -import { countryData, EU_COUNTRIES } from '../dataset/countryData'; +import { countryData, EU_COUNTRIES } from '../../../dataset/countryData'; const countries = topojsonFeature( countriesTopology as any, @@ -18,6 +18,7 @@ const countries = topojsonFeature( export default function BasicGeoDataPlot() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/map/demos/basic-geo-data-plot/client.ts b/docs/data/charts/map/demos/basic-geo-data-plot/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/basic-geo-data-plot/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/basic-geo-data-plot/index.ts b/docs/data/charts/map/demos/basic-geo-data-plot/index.ts new file mode 100644 index 0000000000000..26fe2d23ecdfb --- /dev/null +++ b/docs/data/charts/map/demos/basic-geo-data-plot/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicGeoDataPlot from './BasicGeoDataPlot'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicGeoDataPlot, { ClientProvider }); diff --git a/docs/data/charts/map/ColorScaleMapShape.tsx b/docs/data/charts/map/demos/color-scale-map-shape/ColorScaleMapShape.tsx similarity index 94% rename from docs/data/charts/map/ColorScaleMapShape.tsx rename to docs/data/charts/map/demos/color-scale-map-shape/ColorScaleMapShape.tsx index 9782421e9f4bd..654d24bc153f2 100644 --- a/docs/data/charts/map/ColorScaleMapShape.tsx +++ b/docs/data/charts/map/demos/color-scale-map-shape/ColorScaleMapShape.tsx @@ -15,9 +15,9 @@ import { ContinuousColorLegend, PiecewiseColorLegend, } from '@mui/x-charts-premium/ChartsLegend'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; -import { withCountryCodeAsName, countryData } from '../dataset/countryData'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import { internetUsageByCountry } from '../../../dataset/internetUsageByCountry'; +import { withCountryCodeAsName, countryData } from '../../../dataset/countryData'; const countries = withCountryCodeAsName( topojsonFeature( @@ -35,6 +35,7 @@ const data = Object.keys(countryData).map((code) => ({ type ColorMapType = 'continuous' | 'piecewise'; export default function ColorScaleMapShape() { + // @focus-start @padding 1 const [colorMap, setColorMap] = React.useState('continuous'); const [unknownShape, setUnknownShape] = React.useState< 'color' | 'geoData' | 'none' @@ -129,4 +130,5 @@ export default function ColorScaleMapShape() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/color-scale-map-shape/client.ts b/docs/data/charts/map/demos/color-scale-map-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/color-scale-map-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/color-scale-map-shape/index.ts b/docs/data/charts/map/demos/color-scale-map-shape/index.ts new file mode 100644 index 0000000000000..48811bb8d3905 --- /dev/null +++ b/docs/data/charts/map/demos/color-scale-map-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorScaleMapShape from './ColorScaleMapShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorScaleMapShape, { ClientProvider }); diff --git a/docs/data/charts/map/CountryProjectionShape.tsx b/docs/data/charts/map/demos/country-projection-shape/CountryProjectionShape.tsx similarity index 96% rename from docs/data/charts/map/CountryProjectionShape.tsx rename to docs/data/charts/map/demos/country-projection-shape/CountryProjectionShape.tsx index 4cfc43e525b43..1c5c2192d60ab 100644 --- a/docs/data/charts/map/CountryProjectionShape.tsx +++ b/docs/data/charts/map/demos/country-projection-shape/CountryProjectionShape.tsx @@ -9,13 +9,10 @@ import ListSubheader from '@mui/material/ListSubheader'; import { feature as topojsonFeature } from 'topojson-client'; import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { - D3NamedProjection, - GeoDataPlot, - Graticule, -} from '@mui/x-charts-premium/Map'; +import type { D3NamedProjection } from '@mui/x-charts-premium/Map'; +import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; import { useGeoPath } from '@mui/x-charts-premium/hooks'; const countries = topojsonFeature( @@ -113,6 +110,7 @@ function isCylindricalProjection(projection: D3NamedProjection) { } export default function CountryProjectionShape() { + // @focus-start @padding 1 const [land, setLand] = React.useState('Japan'); const [projection, setProjection] = React.useState('albers'); const [parallels, setParallels] = React.useState<[number, number]>( @@ -213,6 +211,7 @@ export default function CountryProjectionShape() { ); + // @focus-end } const angles = new Array(37).fill(0).map((_, i) => i * 10 - 180); diff --git a/docs/data/charts/map/demos/country-projection-shape/client.ts b/docs/data/charts/map/demos/country-projection-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/country-projection-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/country-projection-shape/index.ts b/docs/data/charts/map/demos/country-projection-shape/index.ts new file mode 100644 index 0000000000000..d8b396d2f2a0c --- /dev/null +++ b/docs/data/charts/map/demos/country-projection-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CountryProjectionShape from './CountryProjectionShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CountryProjectionShape, { ClientProvider }); diff --git a/docs/data/charts/map/ExportMap.tsx b/docs/data/charts/map/demos/export-map/ExportMap.tsx similarity index 92% rename from docs/data/charts/map/ExportMap.tsx rename to docs/data/charts/map/demos/export-map/ExportMap.tsx index 24566fa9440ea..3be481decae9f 100644 --- a/docs/data/charts/map/ExportMap.tsx +++ b/docs/data/charts/map/demos/export-map/ExportMap.tsx @@ -11,9 +11,9 @@ import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { useChartRootRef } from '@mui/x-charts/hooks'; import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; import { PiecewiseColorLegend } from '@mui/x-charts-premium/ChartsLegend'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; -import { countryData } from '../dataset/countryData'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import { countryData } from '../../../dataset/countryData'; +import { internetUsageByCountry } from '../../../dataset/internetUsageByCountry'; const countries = topojsonFeature( countriesTopology as any, @@ -33,6 +33,7 @@ function CustomChartWrapper({ children }: React.PropsWithChildren) { } export default function ExportMap() { + // @focus-start @padding 1 const apiRef = useChartPremiumApiRef<'mapShape'>(); return ( @@ -92,4 +93,5 @@ export default function ExportMap() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/export-map/client.ts b/docs/data/charts/map/demos/export-map/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/export-map/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/export-map/index.ts b/docs/data/charts/map/demos/export-map/index.ts new file mode 100644 index 0000000000000..b20c941d94a4e --- /dev/null +++ b/docs/data/charts/map/demos/export-map/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExportMap from './ExportMap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExportMap, { ClientProvider }); diff --git a/docs/data/charts/map/GeoDataPlotDemo.tsx b/docs/data/charts/map/demos/geo-data-plot-demo/GeoDataPlotDemo.tsx similarity index 94% rename from docs/data/charts/map/GeoDataPlotDemo.tsx rename to docs/data/charts/map/demos/geo-data-plot-demo/GeoDataPlotDemo.tsx index bc93fa5c31ed2..4214a606dc1e1 100644 --- a/docs/data/charts/map/GeoDataPlotDemo.tsx +++ b/docs/data/charts/map/demos/geo-data-plot-demo/GeoDataPlotDemo.tsx @@ -7,7 +7,7 @@ import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; import { GeoDataPlot } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; const countries = topojsonFeature( countriesTopology as any, @@ -15,6 +15,7 @@ const countries = topojsonFeature( ) as unknown as ExtendedFeatureCollection; export default function GeoDataPlotDemo() { + // @focus-start @padding 1 const [fill, setFill] = React.useState('#e3f2fd'); const [stroke, setStroke] = React.useState('#0d47a1'); const [strokeWidth, setStrokeWidth] = React.useState(0.5); @@ -59,4 +60,5 @@ export default function GeoDataPlotDemo() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/geo-data-plot-demo/client.ts b/docs/data/charts/map/demos/geo-data-plot-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/geo-data-plot-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/geo-data-plot-demo/index.ts b/docs/data/charts/map/demos/geo-data-plot-demo/index.ts new file mode 100644 index 0000000000000..3b0c51e01fd05 --- /dev/null +++ b/docs/data/charts/map/demos/geo-data-plot-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GeoDataPlotDemo from './GeoDataPlotDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GeoDataPlotDemo, { ClientProvider }); diff --git a/docs/data/charts/map/GeoFeatureKeyMapShape.tsx b/docs/data/charts/map/demos/geo-feature-key-map-shape/GeoFeatureKeyMapShape.tsx similarity index 93% rename from docs/data/charts/map/GeoFeatureKeyMapShape.tsx rename to docs/data/charts/map/demos/geo-feature-key-map-shape/GeoFeatureKeyMapShape.tsx index b2523dd0df27f..1753e9c3c07db 100644 --- a/docs/data/charts/map/GeoFeatureKeyMapShape.tsx +++ b/docs/data/charts/map/demos/geo-feature-key-map-shape/GeoFeatureKeyMapShape.tsx @@ -11,8 +11,8 @@ import type { ExtendedFeature, ExtendedFeatureCollection, } from '@mui/x-charts-vendor/d3-geo'; -import { countryData } from '../dataset/countryData'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; +import { countryData } from '../../../dataset/countryData'; +import { internetUsageByCountry } from '../../../dataset/internetUsageByCountry'; const countries = topojsonFeature( countriesTopology as any, @@ -36,6 +36,7 @@ const data = Object.entries(countryData) export default function GeoFeatureKeyMapShape() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/map/demos/geo-feature-key-map-shape/client.ts b/docs/data/charts/map/demos/geo-feature-key-map-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/geo-feature-key-map-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/geo-feature-key-map-shape/index.ts b/docs/data/charts/map/demos/geo-feature-key-map-shape/index.ts new file mode 100644 index 0000000000000..675d34f955d1c --- /dev/null +++ b/docs/data/charts/map/demos/geo-feature-key-map-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GeoFeatureKeyMapShape from './GeoFeatureKeyMapShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GeoFeatureKeyMapShape, { ClientProvider }); diff --git a/docs/data/charts/map/HighlightedMapShape.tsx b/docs/data/charts/map/demos/highlighted-map-shape/HighlightedMapShape.tsx similarity index 96% rename from docs/data/charts/map/HighlightedMapShape.tsx rename to docs/data/charts/map/demos/highlighted-map-shape/HighlightedMapShape.tsx index 2980a168eebe7..1bdc661c32360 100644 --- a/docs/data/charts/map/HighlightedMapShape.tsx +++ b/docs/data/charts/map/demos/highlighted-map-shape/HighlightedMapShape.tsx @@ -9,12 +9,12 @@ import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; import { withCountryCodeAsName, countriesInContinent, countryData, -} from '../dataset/countryData'; +} from '../../../dataset/countryData'; type HighlightOptions = 'none' | 'item' | 'series'; type FadeOptions = 'none' | 'series' | 'global'; @@ -40,6 +40,7 @@ const africa = getContinentData('Africa'); const oceania = getContinentData('Oceania'); export default function HighlightedMapShape() { + // @focus-start @padding 1 const [highlight, setHighlight] = React.useState('item'); const [fade, setFade] = React.useState('global'); @@ -136,4 +137,5 @@ export default function HighlightedMapShape() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/highlighted-map-shape/client.ts b/docs/data/charts/map/demos/highlighted-map-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/highlighted-map-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/highlighted-map-shape/index.ts b/docs/data/charts/map/demos/highlighted-map-shape/index.ts new file mode 100644 index 0000000000000..1ccf4854ecd60 --- /dev/null +++ b/docs/data/charts/map/demos/highlighted-map-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HighlightedMapShape from './HighlightedMapShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HighlightedMapShape, { ClientProvider }); diff --git a/docs/data/charts/map/MapShapeClick.tsx b/docs/data/charts/map/demos/map-shape-click/MapShapeClick.tsx similarity index 92% rename from docs/data/charts/map/MapShapeClick.tsx rename to docs/data/charts/map/demos/map-shape-click/MapShapeClick.tsx index 138333d061d37..b700b69a7a55d 100644 --- a/docs/data/charts/map/MapShapeClick.tsx +++ b/docs/data/charts/map/demos/map-shape-click/MapShapeClick.tsx @@ -11,9 +11,9 @@ import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { type MapShapeItemIdentifier } from '@mui/x-charts-premium/models'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; -import { EU_COUNTRIES, countryData } from '../dataset/countryData'; +import type { MapShapeItemIdentifier } from '@mui/x-charts-premium/models'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import { EU_COUNTRIES, countryData } from '../../../dataset/countryData'; const countries = topojsonFeature( countriesTopology as any, @@ -21,6 +21,7 @@ const countries = topojsonFeature( ) as unknown as ExtendedFeatureCollection; export default function MapShapeClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); return ( @@ -83,4 +84,5 @@ ${itemData ? JSON.stringify(itemData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/map/demos/map-shape-click/client.ts b/docs/data/charts/map/demos/map-shape-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/map-shape-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/map-shape-click/index.ts b/docs/data/charts/map/demos/map-shape-click/index.ts new file mode 100644 index 0000000000000..8d25626690e20 --- /dev/null +++ b/docs/data/charts/map/demos/map-shape-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MapShapeClick from './MapShapeClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MapShapeClick, { ClientProvider }); diff --git a/docs/data/charts/map/MapShapePlotDemo.tsx b/docs/data/charts/map/demos/map-shape-plot-demo/MapShapePlotDemo.tsx similarity index 88% rename from docs/data/charts/map/MapShapePlotDemo.tsx rename to docs/data/charts/map/demos/map-shape-plot-demo/MapShapePlotDemo.tsx index 536005cf2ec5c..b3b55460ff6da 100644 --- a/docs/data/charts/map/MapShapePlotDemo.tsx +++ b/docs/data/charts/map/demos/map-shape-plot-demo/MapShapePlotDemo.tsx @@ -6,8 +6,8 @@ import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; -import { EU_COUNTRIES, countryData } from '../dataset/countryData'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import { EU_COUNTRIES, countryData } from '../../../dataset/countryData'; const countries = topojsonFeature( countriesTopology as any, @@ -17,6 +17,7 @@ const countries = topojsonFeature( export default function MapShapePlotDemo() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/map/demos/map-shape-plot-demo/client.ts b/docs/data/charts/map/demos/map-shape-plot-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/map-shape-plot-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/map-shape-plot-demo/index.ts b/docs/data/charts/map/demos/map-shape-plot-demo/index.ts new file mode 100644 index 0000000000000..40ac2b633d5af --- /dev/null +++ b/docs/data/charts/map/demos/map-shape-plot-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MapShapePlotDemo from './MapShapePlotDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MapShapePlotDemo, { ClientProvider }); diff --git a/docs/data/charts/map/MapZoomControl.tsx b/docs/data/charts/map/demos/map-zoom-control/MapZoomControl.tsx similarity index 94% rename from docs/data/charts/map/MapZoomControl.tsx rename to docs/data/charts/map/demos/map-zoom-control/MapZoomControl.tsx index fa26d33c9b1ac..89139ee8b9caa 100644 --- a/docs/data/charts/map/MapZoomControl.tsx +++ b/docs/data/charts/map/demos/map-zoom-control/MapZoomControl.tsx @@ -11,18 +11,13 @@ import Typography from '@mui/material/Typography'; import { feature as topojsonFeature } from 'topojson-client'; import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; import USATopology from 'us-atlas/states-10m.json'; -import { - Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium, - MapZoomView, -} from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; +import type { MapZoomView } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; +import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; -import { - D3NamedProjection, - GeoDataPlot, - Graticule, -} from '@mui/x-charts-premium/Map'; +import type { D3NamedProjection } from '@mui/x-charts-premium/Map'; +import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; const countries = topojsonFeature( countriesTopology as any, @@ -96,6 +91,7 @@ function getGeoDataForProjection(projection: D3NamedProjection) { } export default function MapZoomControl() { + // @focus-start @padding 1 const [projection, setProjection] = React.useState('naturalEarth1'); const apiRef = useChartPremiumApiRef<'mapShape'>(); @@ -294,4 +290,5 @@ export default function MapZoomControl() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/map-zoom-control/client.ts b/docs/data/charts/map/demos/map-zoom-control/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/map-zoom-control/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/map-zoom-control/index.ts b/docs/data/charts/map/demos/map-zoom-control/index.ts new file mode 100644 index 0000000000000..66ee49015a243 --- /dev/null +++ b/docs/data/charts/map/demos/map-zoom-control/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MapZoomControl from './MapZoomControl'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MapZoomControl, { ClientProvider }); diff --git a/docs/data/charts/map/MapZoomOptions.tsx b/docs/data/charts/map/demos/map-zoom-options/MapZoomOptions.tsx similarity index 96% rename from docs/data/charts/map/MapZoomOptions.tsx rename to docs/data/charts/map/demos/map-zoom-options/MapZoomOptions.tsx index a108f27057ca2..dfb0feff2c6dc 100644 --- a/docs/data/charts/map/MapZoomOptions.tsx +++ b/docs/data/charts/map/demos/map-zoom-options/MapZoomOptions.tsx @@ -13,13 +13,10 @@ import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; import USATopology from 'us-atlas/states-10m.json'; import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; -import { - D3NamedProjection, - GeoDataPlot, - Graticule, -} from '@mui/x-charts-premium/Map'; +import type { D3NamedProjection } from '@mui/x-charts-premium/Map'; +import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; const countries = topojsonFeature( countriesTopology as any, @@ -105,6 +102,7 @@ function isCylindricalProjection(projection: D3NamedProjection) { } export default function MapZoomOptions() { + // @focus-start @padding 1 const [projection, setProjection] = React.useState('naturalEarth1'); const apiRef = useChartPremiumApiRef<'mapShape'>(); @@ -248,4 +246,5 @@ export default function MapZoomOptions() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/map-zoom-options/client.ts b/docs/data/charts/map/demos/map-zoom-options/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/map-zoom-options/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/map-zoom-options/index.ts b/docs/data/charts/map/demos/map-zoom-options/index.ts new file mode 100644 index 0000000000000..975e8c5be38da --- /dev/null +++ b/docs/data/charts/map/demos/map-zoom-options/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MapZoomOptions from './MapZoomOptions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MapZoomOptions, { ClientProvider }); diff --git a/docs/data/charts/map/MarsMap.tsx b/docs/data/charts/map/demos/mars-map/MarsMap.tsx similarity index 96% rename from docs/data/charts/map/MarsMap.tsx rename to docs/data/charts/map/demos/mars-map/MarsMap.tsx index 4a1147ad5ee9a..c6b889d44f5aa 100644 --- a/docs/data/charts/map/MarsMap.tsx +++ b/docs/data/charts/map/demos/mars-map/MarsMap.tsx @@ -8,8 +8,8 @@ import { useGeoPath } from '@mui/x-charts-premium/hooks'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; import { ContinuousColorLegend } from '@mui/x-charts-premium/ChartsLegend'; -import { type GeoProjection } from '@mui/x-charts-vendor/d3-geo'; -import { marsRegions, marsData, marsFeatures } from './marsRegions'; +import type { GeoProjection } from '@mui/x-charts-vendor/d3-geo'; +import { marsRegions, marsData, marsFeatures } from '../../marsRegions'; const MARS_IMAGE = '/static/x/charts/mars-viking-mdim21.jpg'; @@ -83,6 +83,7 @@ function MarsFeatureMarkers() { type ProjectionName = 'orthographic' | 'equirectangular'; export default function MarsMap() { + // @focus-start @padding 1 const [projection, setProjection] = React.useState('orthographic'); return ( @@ -146,4 +147,5 @@ export default function MarsMap() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/mars-map/client.ts b/docs/data/charts/map/demos/mars-map/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/mars-map/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/mars-map/index.ts b/docs/data/charts/map/demos/mars-map/index.ts new file mode 100644 index 0000000000000..dea8402ecccda --- /dev/null +++ b/docs/data/charts/map/demos/mars-map/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MarsMap from './MarsMap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MarsMap, { ClientProvider }); diff --git a/docs/data/charts/map/ProjectionMapShape.tsx b/docs/data/charts/map/demos/projection-map-shape/ProjectionMapShape.tsx similarity index 93% rename from docs/data/charts/map/ProjectionMapShape.tsx rename to docs/data/charts/map/demos/projection-map-shape/ProjectionMapShape.tsx index 3cd1d7a454443..e68a02f766b0f 100644 --- a/docs/data/charts/map/ProjectionMapShape.tsx +++ b/docs/data/charts/map/demos/projection-map-shape/ProjectionMapShape.tsx @@ -9,13 +9,10 @@ import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; import USATopology from 'us-atlas/states-10m.json'; import { useChartPremiumApiRef } from '@mui/x-charts-premium/hooks'; import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { - D3NamedProjection, - GeoDataPlot, - Graticule, -} from '@mui/x-charts-premium/Map'; +import type { D3NamedProjection } from '@mui/x-charts-premium/Map'; +import { GeoDataPlot, Graticule } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; const countries = topojsonFeature( countriesTopology as any, @@ -75,6 +72,7 @@ function isConicProjection(projection: D3NamedProjection) { } export default function ProjectionMapShape() { + // @focus-start @padding 1 const [projection, setProjection] = React.useState('naturalEarth1'); @@ -122,4 +120,5 @@ export default function ProjectionMapShape() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/projection-map-shape/client.ts b/docs/data/charts/map/demos/projection-map-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/projection-map-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/projection-map-shape/index.ts b/docs/data/charts/map/demos/projection-map-shape/index.ts new file mode 100644 index 0000000000000..43d32be2b2f39 --- /dev/null +++ b/docs/data/charts/map/demos/projection-map-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ProjectionMapShape from './ProjectionMapShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ProjectionMapShape, { ClientProvider }); diff --git a/docs/data/charts/map/RemoveAntarctica.tsx b/docs/data/charts/map/demos/remove-antarctica/RemoveAntarctica.tsx similarity index 91% rename from docs/data/charts/map/RemoveAntarctica.tsx rename to docs/data/charts/map/demos/remove-antarctica/RemoveAntarctica.tsx index b626a0a20008f..f8db49422180e 100644 --- a/docs/data/charts/map/RemoveAntarctica.tsx +++ b/docs/data/charts/map/demos/remove-antarctica/RemoveAntarctica.tsx @@ -11,10 +11,10 @@ import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; -import { type MapShapeValueType } from '@mui/x-charts-premium/models'; -import { internetUsageByCountry } from '../dataset/internetUsageByCountry'; -import { countryData, withCountryCodeAsName } from '../dataset/countryData'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { MapShapeValueType } from '@mui/x-charts-premium/models'; +import { internetUsageByCountry } from '../../../dataset/internetUsageByCountry'; +import { countryData, withCountryCodeAsName } from '../../../dataset/countryData'; const projections = [ 'equirectangular', @@ -41,6 +41,7 @@ const countriesWithoutAntarctica = { }; export default function RemoveAntarctica() { + // @focus-start @padding 1 const [mode, setMode] = React.useState< 'with-antarctica' | 'geoDataFiltering' | 'seriesOnly' >('geoDataFiltering'); @@ -93,6 +94,7 @@ export default function RemoveAntarctica() { ); + // @focus-end } const settings = { diff --git a/docs/data/charts/map/demos/remove-antarctica/client.ts b/docs/data/charts/map/demos/remove-antarctica/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/remove-antarctica/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/remove-antarctica/index.ts b/docs/data/charts/map/demos/remove-antarctica/index.ts new file mode 100644 index 0000000000000..e4af6c469e42c --- /dev/null +++ b/docs/data/charts/map/demos/remove-antarctica/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RemoveAntarctica from './RemoveAntarctica'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RemoveAntarctica, { ClientProvider }); diff --git a/docs/data/charts/map/TectonicPlates.tsx b/docs/data/charts/map/demos/tectonic-plates/TectonicPlates.tsx similarity index 93% rename from docs/data/charts/map/TectonicPlates.tsx rename to docs/data/charts/map/demos/tectonic-plates/TectonicPlates.tsx index ff9c344dab489..22faf3eeee640 100644 --- a/docs/data/charts/map/TectonicPlates.tsx +++ b/docs/data/charts/map/demos/tectonic-plates/TectonicPlates.tsx @@ -7,18 +7,15 @@ import ToggleButton from '@mui/material/ToggleButton'; import { feature as topojsonFeature } from 'topojson-client'; import countriesTopology from 'visionscarto-world-atlas/world/110m.json'; import { Unstable_ChartsGeoDataProviderPremium as ChartsGeoDataProviderPremium } from '@mui/x-charts-premium/ChartsGeoDataProviderPremium'; -import { - MapShapePlot, - Graticule, - D3NamedProjection, -} from '@mui/x-charts-premium/Map'; +import type { D3NamedProjection } from '@mui/x-charts-premium/Map'; +import { MapShapePlot, Graticule } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { - type ExtendedFeature, - type ExtendedFeatureCollection, +import type { + ExtendedFeature, + ExtendedFeatureCollection, } from '@mui/x-charts-vendor/d3-geo'; -import tectonicPlates from '../dataset/tectonicPlates.json'; +import tectonicPlates from '../../../dataset/tectonicPlates.json'; const plates = tectonicPlates as unknown as ExtendedFeatureCollection; @@ -59,6 +56,7 @@ const countryData = countries.features.map((feature) => ({ })); export default function TectonicPlates() { + // @focus-start @padding 1 const [projection, setProjection] = React.useState('naturalEarth1'); @@ -135,4 +133,5 @@ export default function TectonicPlates() { ); + // @focus-end } diff --git a/docs/data/charts/map/demos/tectonic-plates/client.ts b/docs/data/charts/map/demos/tectonic-plates/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/tectonic-plates/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/tectonic-plates/index.ts b/docs/data/charts/map/demos/tectonic-plates/index.ts new file mode 100644 index 0000000000000..50f0fe7e972e8 --- /dev/null +++ b/docs/data/charts/map/demos/tectonic-plates/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TectonicPlates from './TectonicPlates'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TectonicPlates, { ClientProvider }); diff --git a/docs/data/charts/map/VisibleMapShape.tsx b/docs/data/charts/map/demos/visible-map-shape/VisibleMapShape.tsx similarity index 95% rename from docs/data/charts/map/VisibleMapShape.tsx rename to docs/data/charts/map/demos/visible-map-shape/VisibleMapShape.tsx index 58db25ce7c84a..5820012eaaecb 100644 --- a/docs/data/charts/map/VisibleMapShape.tsx +++ b/docs/data/charts/map/demos/visible-map-shape/VisibleMapShape.tsx @@ -7,12 +7,12 @@ import { GeoDataPlot, MapShapePlot } from '@mui/x-charts-premium/Map'; import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; import { ChartsLegend } from '@mui/x-charts-premium/ChartsLegend'; import { ChartsTooltip } from '@mui/x-charts-premium/ChartsTooltip'; -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; import { withCountryCodeAsName, countriesInContinent, countryData, -} from '../dataset/countryData'; +} from '../../../dataset/countryData'; const countries = withCountryCodeAsName( topojsonFeature( @@ -37,6 +37,7 @@ const oceania = getContinentData('Oceania'); export default function VisibleMapShape() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/map/demos/visible-map-shape/client.ts b/docs/data/charts/map/demos/visible-map-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/map/demos/visible-map-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/map/demos/visible-map-shape/index.ts b/docs/data/charts/map/demos/visible-map-shape/index.ts new file mode 100644 index 0000000000000..466d98d927c5a --- /dev/null +++ b/docs/data/charts/map/demos/visible-map-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import VisibleMapShape from './VisibleMapShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, VisibleMapShape, { ClientProvider }); diff --git a/docs/data/charts/map/map.md b/docs/data/charts/map/map.md index b15278bebafd4..61c002d4ef261 100644 --- a/docs/data/charts/map/map.md +++ b/docs/data/charts/map/map.md @@ -20,7 +20,7 @@ The map provider `ChartsGeoDataProviderPremium` uses three main props: - `projection`: a string that defines how the objects should be projected on the SVG. - `series`: the data associated to the geographical objects of type `'mapShape'`. -{{"demo": "BasicGeoDataPlot.js"}} +{{"component": "file://./demos/basic-geo-data-plot/index.ts"}} ## Composition @@ -54,7 +54,7 @@ so one plot renders both layers and CSS styles them independently: colored plate below, country outlines on top for orientation. Toggle between a flat `naturalEarth1` map and an `orthographic` globe. -{{"demo": "TectonicPlates.js"}} +{{"component": "file://./demos/tectonic-plates/index.ts"}} ## Rendering the base map with `GeoDataPlot` @@ -63,7 +63,7 @@ It is meant to render the base map—the geography itself—without any data ser The `fill`, `stroke`, and `strokeWidth` props apply uniformly to all features, so use them to style the background layer. -{{"demo": "GeoDataPlotDemo.js"}} +{{"component": "file://./demos/geo-data-plot-demo/index.ts"}} ## Adding a base map raster with `MapImagePlot` @@ -86,7 +86,7 @@ The provider is not tied to Earth—`geoData` accepts any GeoJSON `FeatureCollec The demo below maps the 30 USGS Mars Chart quadrangles colored by mean elevation over a Viking surface mosaic, with notable landmarks and mission sites, and a projection toggle. -{{"demo": "MarsMap.js"}} +{{"component": "file://./demos/mars-map/index.ts"}} :::warning Reprojection reads the image pixels on a canvas, so the source must be same-origin or served @@ -97,7 +97,7 @@ with CORS headers. The `projection` prop accepts either a d3-geo projection name or a `GeoProjection` instance. -{{"demo": "ProjectionMapShape.js"}} +{{"component": "file://./demos/projection-map-shape/index.ts"}} ### Conic projections @@ -107,7 +107,7 @@ So it's recommended to keep those parallels close to the area you want to displa Here you can try different countries and play with projection and parallels to see its impact. -{{"demo": "CountryProjectionShape.js"}} +{{"component": "file://./demos/country-projection-shape/index.ts"}} ## Plotting series with `MapShapePlot` @@ -115,7 +115,7 @@ Here you can try different countries and play with projection and parallels to s Stacking it on top of a `GeoDataPlot` is convenient for highlighting a subset of features over the full geography. -{{"demo": "MapShapePlotDemo.js"}} +{{"component": "file://./demos/map-shape-plot-demo/index.ts"}} ## Matching features with `geoFeatureKey` @@ -156,7 +156,7 @@ But the data from Our World in Data merge them. Returning `'Somalia'` for both gives them the same key, so the single `{ name: 'Somalia' }` series item highlights the two shapes at once. -{{"demo": "GeoFeatureKeyMapShape.js"}} +{{"component": "file://./demos/geo-feature-key-map-shape/index.ts"}} ## Mapping values to colors @@ -202,7 +202,7 @@ Specify the `unknownColor` property in the `colorMap` to render them. By using `unknownColor` instead of displaying the `GeoDataPlot` as a background, you enable the tooltip for those shapes without data. ::: -{{"demo": "ColorScaleMapShape.js"}} +{{"component": "file://./demos/color-scale-map-shape/index.ts"}} ## Using a dataset @@ -251,7 +251,7 @@ See the [Dataset](/x/react-charts/dataset/) page to learn more. It receives the click event and a `MapShapeItemIdentifier` that identifies the clicked item through its `seriesId` and `name`. -{{"demo": "MapShapeClick.js"}} +{{"component": "file://./demos/map-shape-click/index.ts"}} ## Managing the highlight with `highlightScope` @@ -261,7 +261,7 @@ affects the rendering. The `highlight` option decides which items are emphasized the `fade` option decides which items are dimmed (`'series'` for the rest of the same series, `'global'` for every shape in every series). -{{"demo": "HighlightedMapShape.js"}} +{{"component": "file://./demos/highlighted-map-shape/index.ts"}} ## Zoom @@ -307,7 +307,7 @@ You can also modify the zoom result with: - `minZoomLevel`/`maxZoomLevel`: Clamp the `zoomLevel` between those two values. - `maxEmptySpace`: The maximal space left empty while dragging the map. It's a ratio of the drawing area size. For example `maxEmptySpace=0.2` means you can not leave more than 20% of the drawing area empty when dragging the map. -{{"demo": "MapZoomOptions.js"}} +{{"component": "file://./demos/map-zoom-options/index.ts"}} ### Control @@ -319,7 +319,7 @@ The view is made of three properties: - `center`: `[number, number]` The long/lat coordinates in degree of the point at the center of the projection. - `translation`: `[number, number]` The translation of the map as a ratio of the drawing area. -{{"demo": "MapZoomControl.js"}} +{{"component": "file://./demos/map-zoom-control/index.ts"}} ## Managing visibility from the legend @@ -327,14 +327,14 @@ When `toggleVisibilityOnClick` is set on the `ChartsLegend`, clicking on a serie its visibility. Hidden series are skipped by `MapShapePlot` so the underlying base map stays visible. -{{"demo": "VisibleMapShape.js"}} +{{"component": "file://./demos/visible-map-shape/index.ts"}} ## Exporting Maps can be exported as an image or as a PDF, like any other chart. See the [Export](/x/react-charts/export/) page for the complete documentation. -{{"demo": "ExportMap.js"}} +{{"component": "file://./demos/export-map/index.ts"}} ## Common practice @@ -346,4 +346,4 @@ There are two ways to remove it:. - Render only the countries in series by removing the `` - Filter out Antarctica from the `geoData` -{{"demo": "RemoveAntarctica.js"}} +{{"component": "file://./demos/remove-antarctica/index.ts"}} diff --git a/docs/data/charts/map/marsRegions.ts b/docs/data/charts/map/marsRegions.ts index dda1965fc9626..6e03bddd0e58f 100644 --- a/docs/data/charts/map/marsRegions.ts +++ b/docs/data/charts/map/marsRegions.ts @@ -1,4 +1,4 @@ -import { type ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; +import type { ExtendedFeatureCollection } from '@mui/x-charts-vendor/d3-geo'; /** * The 30 USGS Mars Chart (MC) quadrangles, tiling the whole planet. diff --git a/docs/data/charts/performance/BarSampling.js b/docs/data/charts/performance/BarSampling.js deleted file mode 100644 index 12960d940d06a..0000000000000 --- a/docs/data/charts/performance/BarSampling.js +++ /dev/null @@ -1,44 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import tripCounts from '../dataset/nyc-yellow-taxi-2024-trip-count.json'; - -// Real dataset: NYC yellow taxi trips per hour over 2024 (8,781 points). Each entry is -// `[dayOfYear, hour, tripCount]`. -const data = tripCounts.map((entry) => entry[2]); -const categories = data.map((_, index) => String(index)); - -const compactFormatter = new Intl.NumberFormat('en-US', { notation: 'compact' }); - -export default function BarSampling() { - const [enabled, setEnabled] = React.useState(true); - - return ( - - setEnabled(event.target.checked)} - /> - } - label={`Sampling ${enabled ? 'on' : 'off'} (${data.length.toLocaleString()} bars — zoom in to reach the raw data)`} - /> - compactFormatter.format(value), - }, - ]} - series={[{ data, label: 'Trips' }]} - height={300} - sampling={enabled ? 'minmax' : 'none'} - /> - - ); -} diff --git a/docs/data/charts/performance/LineSampling.js b/docs/data/charts/performance/LineSampling.js deleted file mode 100644 index 8a7fc7e0ded7f..0000000000000 --- a/docs/data/charts/performance/LineSampling.js +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { electricityGeneration2024Hourly } from '../dataset/electricityGeneration2024Hourly'; - -// Real dataset: average electricity generation (MW) for every hour of 2024 (8,784 points). -const data = electricityGeneration2024Hourly.DEU; -const xData = data.map((_, index) => index); - -const compactFormatter = new Intl.NumberFormat('en-US', { notation: 'compact' }); - -const METHODS = [ - { value: 'none', label: 'None' }, - { value: 'm4', label: 'M4' }, - { value: 'minmax', label: 'Min/max' }, - { value: 'lttb', label: 'LTTB' }, -]; - -export default function LineSampling() { - const [sampling, setSampling] = React.useState('m4'); - - return ( - - value !== null && setSampling(value)} - aria-label="Sampling method" - > - {METHODS.map((option) => ( - - {option.label} - - ))} - - - {data.length.toLocaleString()} hourly points — zoom in to reach the raw data - - compactFormatter.format(value), - }, - ]} - series={[{ data, label: 'Generation (MW)', showMark: false }]} - height={300} - sampling={sampling} - /> - - ); -} diff --git a/docs/data/charts/performance/LineSamplingNulls.js b/docs/data/charts/performance/LineSamplingNulls.js deleted file mode 100644 index 4480cd0d7aca0..0000000000000 --- a/docs/data/charts/performance/LineSamplingNulls.js +++ /dev/null @@ -1,54 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import Typography from '@mui/material/Typography'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { electricityGeneration2024Hourly } from '../dataset/electricityGeneration2024Hourly'; - -// Real dataset: average electricity generation (MW) for every hour of 2024 (8,784 points). -const base = electricityGeneration2024Hourly.DEU; -const xData = base.map((_, index) => index); - -const compactFormatter = new Intl.NumberFormat('en-US', { notation: 'compact' }); - -// Same series with a few hour-long gaps (null) punched in. -const withGaps = base.map((value, index) => - index % 1500 >= 700 && index % 1500 < 760 ? null : value, -); - -export default function LineSamplingNulls() { - const [hasGaps, setHasGaps] = React.useState(true); - const data = hasGaps ? withGaps : base; - - return ( - - setHasGaps(event.target.checked)} - /> - } - label="Insert null gaps" - /> - - Sampling is set to m4. Series with null values are - still sampled; the gaps are preserved, so the line breaks instead of bridging - them. - - compactFormatter.format(value), - }, - ]} - series={[{ data, label: 'Generation (MW)', showMark: false }]} - height={300} - sampling="m4" - /> - - ); -} diff --git a/docs/data/charts/performance/SamplingMethodComparison.js b/docs/data/charts/performance/SamplingMethodComparison.js deleted file mode 100644 index aac8f96d9cd40..0000000000000 --- a/docs/data/charts/performance/SamplingMethodComparison.js +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; - -import { electricityGeneration2024Hourly } from '../dataset/electricityGeneration2024Hourly'; - -// Real dataset: average electricity generation (MW) for every hour of 2024 (8,784 points). -const data = electricityGeneration2024Hourly.DEU; -const xData = data.map((_, index) => index); - -const compactFormatter = new Intl.NumberFormat('en-US', { notation: 'compact' }); - -const METHODS = [ - { value: 'none', label: 'None — every point' }, - { value: 'minmax', label: 'Min/max' }, - { value: 'm4', label: 'M4' }, - { value: 'lttb', label: 'LTTB' }, -]; - -export default function SamplingMethodComparison() { - // Shared controlled zoom so the charts stay aligned: zooming one zooms all, comparing the methods - // over the same range. - const [zoomData, setZoomData] = React.useState([ - { axisId: 'x', start: 0, end: 100 }, - ]); - - return ( - - {METHODS.map((method) => ( - - - {method.label} - - compactFormatter.format(value), - }, - ]} - height={160} - sampling={method.value} - zoomData={zoomData} - onZoomChange={setZoomData} - hideLegend - /> - - ))} - - ); -} diff --git a/docs/data/charts/performance/BarSampling.tsx b/docs/data/charts/performance/demos/bar-sampling/BarSampling.tsx similarity index 92% rename from docs/data/charts/performance/BarSampling.tsx rename to docs/data/charts/performance/demos/bar-sampling/BarSampling.tsx index 33700ae1a5e0a..047413e1413b8 100644 --- a/docs/data/charts/performance/BarSampling.tsx +++ b/docs/data/charts/performance/demos/bar-sampling/BarSampling.tsx @@ -3,7 +3,7 @@ import Stack from '@mui/material/Stack'; import FormControlLabel from '@mui/material/FormControlLabel'; import Switch from '@mui/material/Switch'; import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import tripCounts from '../dataset/nyc-yellow-taxi-2024-trip-count.json'; +import tripCounts from '../../../dataset/nyc-yellow-taxi-2024-trip-count.json'; // Real dataset: NYC yellow taxi trips per hour over 2024 (8,781 points). Each entry is // `[dayOfYear, hour, tripCount]`. @@ -13,6 +13,7 @@ const categories = data.map((_, index) => String(index)); const compactFormatter = new Intl.NumberFormat('en-US', { notation: 'compact' }); export default function BarSampling() { + // @focus-start @padding 1 const [enabled, setEnabled] = React.useState(true); return ( @@ -41,4 +42,5 @@ export default function BarSampling() { /> ); + // @focus-end } diff --git a/docs/data/charts/performance/demos/bar-sampling/client.ts b/docs/data/charts/performance/demos/bar-sampling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/performance/demos/bar-sampling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/performance/demos/bar-sampling/index.ts b/docs/data/charts/performance/demos/bar-sampling/index.ts new file mode 100644 index 0000000000000..601bffbfda8e8 --- /dev/null +++ b/docs/data/charts/performance/demos/bar-sampling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BarSampling from './BarSampling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BarSampling, { ClientProvider }); diff --git a/docs/data/charts/performance/LineSamplingNulls.tsx b/docs/data/charts/performance/demos/line-sampling-nulls/LineSamplingNulls.tsx similarity index 92% rename from docs/data/charts/performance/LineSamplingNulls.tsx rename to docs/data/charts/performance/demos/line-sampling-nulls/LineSamplingNulls.tsx index bf934555c5019..5a37eb29bf632 100644 --- a/docs/data/charts/performance/LineSamplingNulls.tsx +++ b/docs/data/charts/performance/demos/line-sampling-nulls/LineSamplingNulls.tsx @@ -4,7 +4,7 @@ import FormControlLabel from '@mui/material/FormControlLabel'; import Switch from '@mui/material/Switch'; import Typography from '@mui/material/Typography'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { electricityGeneration2024Hourly } from '../dataset/electricityGeneration2024Hourly'; +import { electricityGeneration2024Hourly } from '../../../dataset/electricityGeneration2024Hourly'; // Real dataset: average electricity generation (MW) for every hour of 2024 (8,784 points). const base = electricityGeneration2024Hourly.DEU; @@ -18,6 +18,7 @@ const withGaps: (number | null)[] = base.map((value, index) => ); export default function LineSamplingNulls() { + // @focus-start @padding 1 const [hasGaps, setHasGaps] = React.useState(true); const data = hasGaps ? withGaps : base; @@ -51,4 +52,5 @@ export default function LineSamplingNulls() { /> ); + // @focus-end } diff --git a/docs/data/charts/performance/demos/line-sampling-nulls/client.ts b/docs/data/charts/performance/demos/line-sampling-nulls/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/performance/demos/line-sampling-nulls/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/performance/demos/line-sampling-nulls/index.ts b/docs/data/charts/performance/demos/line-sampling-nulls/index.ts new file mode 100644 index 0000000000000..65e71bfd499ce --- /dev/null +++ b/docs/data/charts/performance/demos/line-sampling-nulls/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineSamplingNulls from './LineSamplingNulls'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineSamplingNulls, { ClientProvider }); diff --git a/docs/data/charts/performance/LineSampling.tsx b/docs/data/charts/performance/demos/line-sampling/LineSampling.tsx similarity index 92% rename from docs/data/charts/performance/LineSampling.tsx rename to docs/data/charts/performance/demos/line-sampling/LineSampling.tsx index e33b90cd0f30a..b006bd0d0fd89 100644 --- a/docs/data/charts/performance/LineSampling.tsx +++ b/docs/data/charts/performance/demos/line-sampling/LineSampling.tsx @@ -4,7 +4,7 @@ import Typography from '@mui/material/Typography'; import ToggleButton from '@mui/material/ToggleButton'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { electricityGeneration2024Hourly } from '../dataset/electricityGeneration2024Hourly'; +import { electricityGeneration2024Hourly } from '../../../dataset/electricityGeneration2024Hourly'; // Real dataset: average electricity generation (MW) for every hour of 2024 (8,784 points). const data = electricityGeneration2024Hourly.DEU; @@ -22,6 +22,7 @@ const METHODS = [ type Method = (typeof METHODS)[number]['value']; export default function LineSampling() { + // @focus-start @padding 1 const [sampling, setSampling] = React.useState('m4'); return ( @@ -56,4 +57,5 @@ export default function LineSampling() { /> ); + // @focus-end } diff --git a/docs/data/charts/performance/demos/line-sampling/client.ts b/docs/data/charts/performance/demos/line-sampling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/performance/demos/line-sampling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/performance/demos/line-sampling/index.ts b/docs/data/charts/performance/demos/line-sampling/index.ts new file mode 100644 index 0000000000000..65f9df04216d9 --- /dev/null +++ b/docs/data/charts/performance/demos/line-sampling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LineSampling from './LineSampling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LineSampling, { ClientProvider }); diff --git a/docs/data/charts/performance/SamplingMethodComparison.tsx b/docs/data/charts/performance/demos/sampling-method-comparison/SamplingMethodComparison.tsx similarity index 92% rename from docs/data/charts/performance/SamplingMethodComparison.tsx rename to docs/data/charts/performance/demos/sampling-method-comparison/SamplingMethodComparison.tsx index e9c8acb766c7f..9ba9d39d83d25 100644 --- a/docs/data/charts/performance/SamplingMethodComparison.tsx +++ b/docs/data/charts/performance/demos/sampling-method-comparison/SamplingMethodComparison.tsx @@ -3,7 +3,7 @@ import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import type { ZoomData } from '@mui/x-charts-pro/models'; -import { electricityGeneration2024Hourly } from '../dataset/electricityGeneration2024Hourly'; +import { electricityGeneration2024Hourly } from '../../../dataset/electricityGeneration2024Hourly'; // Real dataset: average electricity generation (MW) for every hour of 2024 (8,784 points). const data = electricityGeneration2024Hourly.DEU; @@ -21,6 +21,7 @@ const METHODS = [ export default function SamplingMethodComparison() { // Shared controlled zoom so the charts stay aligned: zooming one zooms all, comparing the methods // over the same range. + // @focus-start @padding 1 const [zoomData, setZoomData] = React.useState([ { axisId: 'x', start: 0, end: 100 }, ]); @@ -58,4 +59,5 @@ export default function SamplingMethodComparison() { ))} ); + // @focus-end } diff --git a/docs/data/charts/performance/demos/sampling-method-comparison/client.ts b/docs/data/charts/performance/demos/sampling-method-comparison/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/performance/demos/sampling-method-comparison/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/performance/demos/sampling-method-comparison/index.ts b/docs/data/charts/performance/demos/sampling-method-comparison/index.ts new file mode 100644 index 0000000000000..86d8929edd5e1 --- /dev/null +++ b/docs/data/charts/performance/demos/sampling-method-comparison/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SamplingMethodComparison from './SamplingMethodComparison'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SamplingMethodComparison, { ClientProvider }); diff --git a/docs/data/charts/performance/performance.md b/docs/data/charts/performance/performance.md index 60f0c2961a854..e2a6fd04b27f9 100644 --- a/docs/data/charts/performance/performance.md +++ b/docs/data/charts/performance/performance.md @@ -136,7 +136,7 @@ The zoom `minSpan` is a percentage, so the most zoomed-in view always renders ab The same 8,784-point series rendered with each method at the same zoom. `'none'` is the reference (every point); the others approximate it with far fewer elements while preserving the overall shape. -{{"demo": "SamplingMethodComparison.js"}} +{{"component": "file://./demos/sampling-method-comparison/index.ts"}} ### Bar sampling @@ -147,7 +147,7 @@ Any method other than `'none'` enables it (bars always use a min/max envelope). ``` -{{"demo": "BarSampling.js"}} +{{"component": "file://./demos/bar-sampling/index.ts"}} ### Line sampling @@ -158,8 +158,8 @@ See [Comparing methods](#comparing-methods). ``` -{{"demo": "LineSampling.js"}} +{{"component": "file://./demos/line-sampling/index.ts"}} Series with `null` values are still sampled; the gaps are preserved, so the line breaks at them instead of bridging them. -{{"demo": "LineSamplingNulls.js"}} +{{"component": "file://./demos/line-sampling-nulls/index.ts"}} diff --git a/docs/data/charts/pie-demo/PieChartWithCenterLabel.js b/docs/data/charts/pie-demo/PieChartWithCenterLabel.js deleted file mode 100644 index 9e094cd1abca9..0000000000000 --- a/docs/data/charts/pie-demo/PieChartWithCenterLabel.js +++ /dev/null @@ -1,40 +0,0 @@ -import * as React from 'react'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { useDrawingArea } from '@mui/x-charts/hooks'; -import { styled } from '@mui/material/styles'; - -const data = [ - { value: 5, label: 'A' }, - { value: 10, label: 'B' }, - { value: 15, label: 'C' }, - { value: 20, label: 'D' }, -]; - -const size = { - width: 200, - height: 200, -}; - -const StyledText = styled('text')(({ theme }) => ({ - fill: theme.palette.text.primary, - textAnchor: 'middle', - dominantBaseline: 'central', - fontSize: 20, -})); - -function PieCenterLabel({ children }) { - const { width, height, left, top } = useDrawingArea(); - return ( - - {children} - - ); -} - -export default function PieChartWithCenterLabel() { - return ( - - Center label - - ); -} diff --git a/docs/data/charts/pie-demo/PieChartWithCenterLabel.tsx.preview b/docs/data/charts/pie-demo/PieChartWithCenterLabel.tsx.preview deleted file mode 100644 index 6bf1cb9311579..0000000000000 --- a/docs/data/charts/pie-demo/PieChartWithCenterLabel.tsx.preview +++ /dev/null @@ -1,3 +0,0 @@ - - Center label - \ No newline at end of file diff --git a/docs/data/charts/pie-demo/PieChartWithCustomLegendAndTooltip.js b/docs/data/charts/pie-demo/PieChartWithCustomLegendAndTooltip.js deleted file mode 100644 index de65dbee2cb3b..0000000000000 --- a/docs/data/charts/pie-demo/PieChartWithCustomLegendAndTooltip.js +++ /dev/null @@ -1,44 +0,0 @@ -import { PieChart } from '@mui/x-charts/PieChart'; - -function HTMLDiamond({ className, color }) { - return ( -
- ); -} - -function SVGStar({ className, color }) { - return ( - - - - ); -} - -export default function PieChartWithCustomLegendAndTooltip() { - return ( - - ); -} diff --git a/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.js b/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.js deleted file mode 100644 index f069bce01c5e8..0000000000000 --- a/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.js +++ /dev/null @@ -1,42 +0,0 @@ -import { PieChart, pieClasses } from '@mui/x-charts/PieChart'; - -const data = [ - { label: 'Group A', value: 400, color: '#0088FE' }, - { label: 'Group B', value: 300, color: '#00C49F' }, - { label: 'Group C', value: 300, color: '#FFBB28' }, - { label: 'Group D', value: 200, color: '#FF8042' }, -]; - -const sizing = { - margin: { right: 5 }, - width: 200, - height: 200, - hideLegend: true, -}; -const TOTAL = data.map((item) => item.value).reduce((a, b) => a + b, 0); - -const getArcLabel = (params) => { - const percent = params.value / TOTAL; - return `${(percent * 100).toFixed(0)}%`; -}; - -export default function PieChartWithCustomizedLabel() { - return ( - - ); -} diff --git a/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.tsx.preview b/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.tsx.preview deleted file mode 100644 index be5e376b5632b..0000000000000 --- a/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pie-demo/PieChartWithPaddingAngle.js b/docs/data/charts/pie-demo/PieChartWithPaddingAngle.js deleted file mode 100644 index 6fc467a22a96f..0000000000000 --- a/docs/data/charts/pie-demo/PieChartWithPaddingAngle.js +++ /dev/null @@ -1,40 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { PieChart } from '@mui/x-charts/PieChart'; - -const data = [ - { label: 'Group A', value: 400 }, - { label: 'Group B', value: 300 }, - { label: 'Group C', value: 300 }, - { label: 'Group D', value: 200 }, -]; - -export default function PieChartWithPaddingAngle() { - return ( - - - - - ); -} diff --git a/docs/data/charts/pie-demo/StraightAnglePieChart.js b/docs/data/charts/pie-demo/StraightAnglePieChart.js deleted file mode 100644 index ed1e1450dd1b3..0000000000000 --- a/docs/data/charts/pie-demo/StraightAnglePieChart.js +++ /dev/null @@ -1,26 +0,0 @@ -import { PieChart } from '@mui/x-charts/PieChart'; - -const data = [ - { label: 'Group A', value: 400 }, - { label: 'Group B', value: 300 }, - { label: 'Group C', value: 300 }, - { label: 'Group D', value: 200 }, - { label: 'Group E', value: 278 }, - { label: 'Group F', value: 189 }, -]; - -export default function StraightAnglePieChart() { - return ( - - ); -} diff --git a/docs/data/charts/pie-demo/StraightAnglePieChart.tsx.preview b/docs/data/charts/pie-demo/StraightAnglePieChart.tsx.preview deleted file mode 100644 index 48beee669090b..0000000000000 --- a/docs/data/charts/pie-demo/StraightAnglePieChart.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pie-demo/TwoLevelPieChart.js b/docs/data/charts/pie-demo/TwoLevelPieChart.js deleted file mode 100644 index 702457ef39990..0000000000000 --- a/docs/data/charts/pie-demo/TwoLevelPieChart.js +++ /dev/null @@ -1,45 +0,0 @@ -import { PieChart } from '@mui/x-charts/PieChart'; -import Box from '@mui/material/Box'; - -const data1 = [ - { label: 'Group A', value: 400 }, - { label: 'Group B', value: 300 }, - { label: 'Group C', value: 300 }, - { label: 'Group D', value: 200 }, -]; - -const data2 = [ - { label: 'A1', value: 100 }, - { label: 'A2', value: 300 }, - { label: 'B1', value: 100 }, - { label: 'B2', value: 80 }, - { label: 'B3', value: 40 }, - { label: 'B4', value: 30 }, - { label: 'B5', value: 50 }, - { label: 'C1', value: 100 }, - { label: 'C2', value: 200 }, - { label: 'D1', value: 150 }, - { label: 'D2', value: 50 }, -]; - -export default function TwoLevelPieChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/pie-demo/TwoLevelPieChart.tsx.preview b/docs/data/charts/pie-demo/TwoLevelPieChart.tsx.preview deleted file mode 100644 index 9411cba265c69..0000000000000 --- a/docs/data/charts/pie-demo/TwoLevelPieChart.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pie-demo/PieChartWithCenterLabel.tsx b/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/PieChartWithCenterLabel.tsx similarity index 95% rename from docs/data/charts/pie-demo/PieChartWithCenterLabel.tsx rename to docs/data/charts/pie-demo/demos/pie-chart-with-center-label/PieChartWithCenterLabel.tsx index 8d619a7e5b988..d83e496de5953 100644 --- a/docs/data/charts/pie-demo/PieChartWithCenterLabel.tsx +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/PieChartWithCenterLabel.tsx @@ -33,8 +33,10 @@ function PieCenterLabel({ children }: { children: React.ReactNode }) { export default function PieChartWithCenterLabel() { return ( + // @focus-start @padding 2 Center label + // @focus-end ); } diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/client.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/index.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/index.ts new file mode 100644 index 0000000000000..10f1d8d1367a0 --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-center-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieChartWithCenterLabel from './PieChartWithCenterLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieChartWithCenterLabel, { ClientProvider }); diff --git a/docs/data/charts/pie-demo/PieChartWithCustomLegendAndTooltip.tsx b/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/PieChartWithCustomLegendAndTooltip.tsx similarity index 89% rename from docs/data/charts/pie-demo/PieChartWithCustomLegendAndTooltip.tsx rename to docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/PieChartWithCustomLegendAndTooltip.tsx index 69c78ae808fe8..d5061043a41bc 100644 --- a/docs/data/charts/pie-demo/PieChartWithCustomLegendAndTooltip.tsx +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/PieChartWithCustomLegendAndTooltip.tsx @@ -1,5 +1,5 @@ import { PieChart } from '@mui/x-charts/PieChart'; -import { ChartsLabelCustomMarkProps } from '@mui/x-charts/ChartsLabel'; +import type { ChartsLabelCustomMarkProps } from '@mui/x-charts/ChartsLabel'; function HTMLDiamond({ className, color }: ChartsLabelCustomMarkProps) { return ( @@ -24,6 +24,7 @@ function SVGStar({ className, color }: ChartsLabelCustomMarkProps) { export default function PieChartWithCustomLegendAndTooltip() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/client.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/index.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/index.ts new file mode 100644 index 0000000000000..4e012e49c1234 --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-custom-legend-and-tooltip/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieChartWithCustomLegendAndTooltip from './PieChartWithCustomLegendAndTooltip'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieChartWithCustomLegendAndTooltip, { ClientProvider }); diff --git a/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.tsx b/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/PieChartWithCustomizedLabel.tsx similarity index 89% rename from docs/data/charts/pie-demo/PieChartWithCustomizedLabel.tsx rename to docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/PieChartWithCustomizedLabel.tsx index 1cfe05071dd56..7f7e2e1930266 100644 --- a/docs/data/charts/pie-demo/PieChartWithCustomizedLabel.tsx +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/PieChartWithCustomizedLabel.tsx @@ -1,4 +1,4 @@ -import { DefaultizedPieValueType } from '@mui/x-charts/models'; +import type { DefaultizedPieValueType } from '@mui/x-charts/models'; import { PieChart, pieClasses } from '@mui/x-charts/PieChart'; const data = [ @@ -23,6 +23,7 @@ const getArcLabel = (params: DefaultizedPieValueType) => { export default function PieChartWithCustomizedLabel() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/client.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/index.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/index.ts new file mode 100644 index 0000000000000..6e9a8c5faba80 --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-customized-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieChartWithCustomizedLabel from './PieChartWithCustomizedLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieChartWithCustomizedLabel, { ClientProvider }); diff --git a/docs/data/charts/pie-demo/PieChartWithPaddingAngle.tsx b/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/PieChartWithPaddingAngle.tsx similarity index 94% rename from docs/data/charts/pie-demo/PieChartWithPaddingAngle.tsx rename to docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/PieChartWithPaddingAngle.tsx index 6fc467a22a96f..dd227bda183ad 100644 --- a/docs/data/charts/pie-demo/PieChartWithPaddingAngle.tsx +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/PieChartWithPaddingAngle.tsx @@ -11,6 +11,7 @@ const data = [ export default function PieChartWithPaddingAngle() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/client.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/index.ts b/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/index.ts new file mode 100644 index 0000000000000..9bae8adc92f86 --- /dev/null +++ b/docs/data/charts/pie-demo/demos/pie-chart-with-padding-angle/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieChartWithPaddingAngle from './PieChartWithPaddingAngle'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieChartWithPaddingAngle, { ClientProvider }); diff --git a/docs/data/charts/pie-demo/StraightAnglePieChart.tsx b/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/StraightAnglePieChart.tsx similarity index 91% rename from docs/data/charts/pie-demo/StraightAnglePieChart.tsx rename to docs/data/charts/pie-demo/demos/straight-angle-pie-chart/StraightAnglePieChart.tsx index ed1e1450dd1b3..ec643ac34bb00 100644 --- a/docs/data/charts/pie-demo/StraightAnglePieChart.tsx +++ b/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/StraightAnglePieChart.tsx @@ -11,6 +11,7 @@ const data = [ export default function StraightAnglePieChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/client.ts b/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/index.ts b/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/index.ts new file mode 100644 index 0000000000000..f75b3febe7465 --- /dev/null +++ b/docs/data/charts/pie-demo/demos/straight-angle-pie-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StraightAnglePieChart from './StraightAnglePieChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StraightAnglePieChart, { ClientProvider }); diff --git a/docs/data/charts/pie-demo/TwoLevelPieChart.tsx b/docs/data/charts/pie-demo/demos/two-level-pie-chart/TwoLevelPieChart.tsx similarity index 95% rename from docs/data/charts/pie-demo/TwoLevelPieChart.tsx rename to docs/data/charts/pie-demo/demos/two-level-pie-chart/TwoLevelPieChart.tsx index c507b963bd5d7..513c3e143c620 100644 --- a/docs/data/charts/pie-demo/TwoLevelPieChart.tsx +++ b/docs/data/charts/pie-demo/demos/two-level-pie-chart/TwoLevelPieChart.tsx @@ -24,6 +24,7 @@ const data2 = [ export default function TwoLevelPieChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/pie-demo/demos/two-level-pie-chart/client.ts b/docs/data/charts/pie-demo/demos/two-level-pie-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie-demo/demos/two-level-pie-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie-demo/demos/two-level-pie-chart/index.ts b/docs/data/charts/pie-demo/demos/two-level-pie-chart/index.ts new file mode 100644 index 0000000000000..25ec32837d0e6 --- /dev/null +++ b/docs/data/charts/pie-demo/demos/two-level-pie-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TwoLevelPieChart from './TwoLevelPieChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TwoLevelPieChart, { ClientProvider }); diff --git a/docs/data/charts/pie-demo/pie-demo.md b/docs/data/charts/pie-demo/pie-demo.md index 8228a427122fa..1f1a290b5d1b1 100644 --- a/docs/data/charts/pie-demo/pie-demo.md +++ b/docs/data/charts/pie-demo/pie-demo.md @@ -10,24 +10,24 @@ components: PieArc, PieArcLabel, PieArcLabelPlot, PieArcPlot, PieChart, PiePlot ## TwoLevelPieChart -{{"demo": "TwoLevelPieChart.js"}} +{{"component": "file://./demos/two-level-pie-chart/index.ts"}} ## StraightAnglePieChart -{{"demo": "StraightAnglePieChart.js"}} +{{"component": "file://./demos/straight-angle-pie-chart/index.ts"}} ## PieChartWithCustomizedLabel -{{"demo": "PieChartWithCustomizedLabel.js"}} +{{"component": "file://./demos/pie-chart-with-customized-label/index.ts"}} ## PieChartWithPaddingAngle -{{"demo": "PieChartWithPaddingAngle.js"}} +{{"component": "file://./demos/pie-chart-with-padding-angle/index.ts"}} ## PieChartWithCenterLabel -{{"demo": "PieChartWithCenterLabel.js"}} +{{"component": "file://./demos/pie-chart-with-center-label/index.ts"}} ## Pie chart with custom mark in legend and tooltip -{{"demo": "PieChartWithCustomLegendAndTooltip.js"}} +{{"component": "file://./demos/pie-chart-with-custom-legend-and-tooltip/index.ts"}} diff --git a/docs/data/charts/pie/BasicPie.js b/docs/data/charts/pie/BasicPie.js deleted file mode 100644 index ed7e30224e3bb..0000000000000 --- a/docs/data/charts/pie/BasicPie.js +++ /dev/null @@ -1,19 +0,0 @@ -import { PieChart } from '@mui/x-charts/PieChart'; - -export default function BasicPie() { - return ( - - ); -} diff --git a/docs/data/charts/pie/BasicPie.tsx.preview b/docs/data/charts/pie/BasicPie.tsx.preview deleted file mode 100644 index 28431a59a1325..0000000000000 --- a/docs/data/charts/pie/BasicPie.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pie/DonutChart.js b/docs/data/charts/pie/DonutChart.js deleted file mode 100644 index 1606c71974fe5..0000000000000 --- a/docs/data/charts/pie/DonutChart.js +++ /dev/null @@ -1,24 +0,0 @@ -import { PieChart } from '@mui/x-charts/PieChart'; - -const data = [ - { label: 'Group A', value: 400, color: '#0088FE' }, - { label: 'Group B', value: 300, color: '#00C49F' }, - { label: 'Group C', value: 300, color: '#FFBB28' }, - { label: 'Group D', value: 200, color: '#FF8042' }, -]; - -const settings = { - margin: { right: 5 }, - width: 200, - height: 200, - hideLegend: true, -}; - -export default function DonutChart() { - return ( - - ); -} diff --git a/docs/data/charts/pie/DonutChart.tsx.preview b/docs/data/charts/pie/DonutChart.tsx.preview deleted file mode 100644 index 0f8b0bdb17e32..0000000000000 --- a/docs/data/charts/pie/DonutChart.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pie/PieActiveArc.js b/docs/data/charts/pie/PieActiveArc.js deleted file mode 100644 index 58bb9538c6892..0000000000000 --- a/docs/data/charts/pie/PieActiveArc.js +++ /dev/null @@ -1,19 +0,0 @@ -import { PieChart } from '@mui/x-charts/PieChart'; -import { desktopOS, valueFormatter } from './webUsageStats'; - -export default function PieActiveArc() { - return ( - - ); -} diff --git a/docs/data/charts/pie/PieActiveArc.tsx.preview b/docs/data/charts/pie/PieActiveArc.tsx.preview deleted file mode 100644 index 3e5229579966b..0000000000000 --- a/docs/data/charts/pie/PieActiveArc.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pie/PieAnimation.js b/docs/data/charts/pie/PieAnimation.js deleted file mode 100644 index f8b488baa6a24..0000000000000 --- a/docs/data/charts/pie/PieAnimation.js +++ /dev/null @@ -1,76 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import Slider from '@mui/material/Slider'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { mobileAndDesktopOS, valueFormatter } from './webUsageStats'; - -export default function PieAnimation() { - const [radius, setRadius] = React.useState(50); - const [itemNb, setItemNb] = React.useState(5); - const [skipAnimation, setSkipAnimation] = React.useState(false); - - const handleItemNbChange = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setItemNb(newValue); - }; - const handleRadius = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setRadius(newValue); - }; - - return ( - - params.label ?? '', - arcLabelMinAngle: 20, - valueFormatter, - }, - ]} - skipAnimation={skipAnimation} - /> - setSkipAnimation(event.target.checked)} /> - } - label="skipAnimation" - labelPlacement="end" - /> - - Number of items - - - - Radius - - - - ); -} diff --git a/docs/data/charts/pie/PieArcLabel.js b/docs/data/charts/pie/PieArcLabel.js deleted file mode 100644 index 530ec775b6668..0000000000000 --- a/docs/data/charts/pie/PieArcLabel.js +++ /dev/null @@ -1,33 +0,0 @@ -import { PieChart, pieClasses } from '@mui/x-charts/PieChart'; -import { desktopOS, valueFormatter } from './webUsageStats'; - -export default function PieArcLabel() { - return ( - `${item.value}%`, - arcLabelMinAngle: 35, - arcLabelRadius: '60%', - ...data, - }, - ]} - sx={{ - [`& .${pieClasses.arcLabel}`]: { - fontWeight: 'bold', - }, - }} - {...size} - /> - ); -} - -const size = { - width: 200, - height: 200, -}; - -const data = { - data: desktopOS, - valueFormatter, -}; diff --git a/docs/data/charts/pie/PieArcLabel.tsx.preview b/docs/data/charts/pie/PieArcLabel.tsx.preview deleted file mode 100644 index c06efe41b8ef3..0000000000000 --- a/docs/data/charts/pie/PieArcLabel.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - `${item.value}%`, - arcLabelMinAngle: 35, - arcLabelRadius: '60%', - ...data, - }, - ]} - sx={{ - [`& .${pieClasses.arcLabel}`]: { - fontWeight: 'bold', - }, - }} - {...size} -/> \ No newline at end of file diff --git a/docs/data/charts/pie/PieCSSStyling.js b/docs/data/charts/pie/PieCSSStyling.js deleted file mode 100644 index 069486da0bbc4..0000000000000 --- a/docs/data/charts/pie/PieCSSStyling.js +++ /dev/null @@ -1,59 +0,0 @@ -import { pieClasses, PieChart } from '@mui/x-charts/PieChart'; -import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; -import { useTheme } from '@mui/material/styles'; - -export default function PieCSSStyling() { - const theme = useTheme(); - const palette = rainbowSurgePalette(theme.palette.mode); - const data1 = [ - { label: 'Group A', value: 400 }, - { label: 'Group B', value: 300 }, - { label: 'Group C', value: 300 }, - { label: 'Group D', value: 200 }, - ]; - - const data2 = [ - { label: 'A1', value: 100, color: palette[0] }, - { label: 'A2', value: 300, color: palette[0] }, - { label: 'B1', value: 100, color: palette[1] }, - { label: 'B2', value: 80, color: palette[1] }, - { label: 'B3', value: 40, color: palette[1] }, - { label: 'B4', value: 30, color: palette[1] }, - { label: 'B5', value: 50, color: palette[1] }, - { label: 'C1', value: 100, color: palette[2] }, - { label: 'C2', value: 200, color: palette[2] }, - { label: 'D1', value: 150, color: palette[3] }, - { label: 'D2', value: 50, color: palette[3] }, - ]; - - const settings = { - series: [ - { - innerRadius: 0, - outerRadius: 80, - data: data1, - highlightScope: { fade: 'global', highlight: 'item' }, - }, - { - id: 'outer', - innerRadius: 100, - outerRadius: 120, - data: data2, - highlightScope: { fade: 'global', highlight: 'item' }, - }, - ], - height: 300, - hideLegend: true, - }; - - return ( - - ); -} diff --git a/docs/data/charts/pie/PieCSSStyling.tsx.preview b/docs/data/charts/pie/PieCSSStyling.tsx.preview deleted file mode 100644 index 4e4136a2b28b9..0000000000000 --- a/docs/data/charts/pie/PieCSSStyling.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pie/PieClick.js b/docs/data/charts/pie/PieClick.js deleted file mode 100644 index 3bed46fd41e6b..0000000000000 --- a/docs/data/charts/pie/PieClick.js +++ /dev/null @@ -1,75 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -import { mobileAndDesktopOS, platforms, valueFormatter } from './webUsageStats'; - -export default function PieClick() { - const [itemData, setItemData] = React.useState(); - - return ( - - - setItemData(d)} - />{' '} - - - - - Click on the chart - setItemData(undefined)} - > - - - - - - - ); -} - -const series = [ - { - innerRadius: 0, - outerRadius: 80, - id: 'platform-series', - data: platforms, - valueFormatter, - }, - { - innerRadius: 100, - outerRadius: 120, - id: 'OS-series', - data: mobileAndDesktopOS, - valueFormatter, - }, -]; diff --git a/docs/data/charts/pie/PieColor.js b/docs/data/charts/pie/PieColor.js deleted file mode 100644 index be0e8d59a6e25..0000000000000 --- a/docs/data/charts/pie/PieColor.js +++ /dev/null @@ -1,59 +0,0 @@ -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { platforms } from './webUsageStats'; - -const palette = ['lightcoral', 'slateblue']; - -const colorPerItem = [ - { ...platforms[0], color: 'orange' }, - { ...platforms[1], color: 'gray' }, -]; - -export default function PieColor() { - return ( - - - Default - - - - Palette - - - - Item - - - - ); -} - -const pieParams = { - height: 200, - margin: { right: 5 }, - hideLegend: true, -}; diff --git a/docs/data/charts/pie/PieShape.js b/docs/data/charts/pie/PieShape.js deleted file mode 100644 index 103d73d54bfac..0000000000000 --- a/docs/data/charts/pie/PieShape.js +++ /dev/null @@ -1,54 +0,0 @@ -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { PieChart } from '@mui/x-charts/PieChart'; -import { desktopOS, valueFormatter } from './webUsageStats'; - -export default function PieShape() { - return ( - ( - - )} - getCode={({ props }) => { - return `import { PieChart } from '@mui/x-charts/PieChart'; - -`; - }} - /> - ); -} diff --git a/docs/data/charts/pie/TitanicPie.js b/docs/data/charts/pie/TitanicPie.js deleted file mode 100644 index 4c0c85a5a76c4..0000000000000 --- a/docs/data/charts/pie/TitanicPie.js +++ /dev/null @@ -1,252 +0,0 @@ -import * as React from 'react'; -import { PieChart, pieClasses } from '@mui/x-charts/PieChart'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { useDrawingArea } from '@mui/x-charts/hooks'; -import { styled } from '@mui/material/styles'; - -// Convert hex color to rgba with opacity -const hexToRgba = (hex, alpha) => { - const r = parseInt(hex.slice(1, 3), 16); - const g = parseInt(hex.slice(3, 5), 16); - const b = parseInt(hex.slice(5, 7), 16); - return `rgba(${r}, ${g}, ${b}, ${alpha})`; -}; - -// https://en.wikipedia.org/wiki/Passengers_of_the_Titanic#/media/File:Titanic_casualties.svg -const titanicData = [ - { Class: '1st', Survived: 'No', Count: 123 }, - { Class: '1st', Survived: 'Yes', Count: 202 }, - { Class: '2nd', Survived: 'No', Count: 167 }, - { Class: '2nd', Survived: 'Yes', Count: 118 }, - { Class: '3rd', Survived: 'No', Count: 528 }, - { Class: '3rd', Survived: 'Yes', Count: 178 }, - { Class: 'Crew', Survived: 'No', Count: 696 }, - { Class: 'Crew', Survived: 'Yes', Count: 212 }, -]; - -const classes = ['1st', '2nd', '3rd', 'Crew']; - -const totalCount = titanicData.reduce((acc, item) => acc + item.Count, 0); - -// Define colors for each class -const classColors = { - '1st': '#fa938e', - '2nd': '#98bf45', - '3rd': '#51cbcf', - Crew: '#d397ff', -}; - -// Different opacity based on class -const opacityMap = { - '1st': 0.9, - '2nd': 0.7, - '3rd': 0.5, - Crew: 0.3, -}; - -const classData = classes.map((pClass) => { - const classTotal = titanicData - .filter((item) => item.Class === pClass) - .reduce((acc, item) => acc + item.Count, 0); - return { - id: pClass, - label: `${pClass} Class:`, - value: classTotal, - percentage: (classTotal / totalCount) * 100, - color: classColors[pClass], - }; -}); - -const classSurvivalData = classes.flatMap((pClass) => { - const classTotal = classData.find((d) => d.id === pClass).value ?? 0; - const baseColor = classColors[pClass]; - return titanicData - .filter((item) => item.Class === pClass) - .sort((a, b) => (a.Survived > b.Survived ? 1 : -1)) - .map((item) => ({ - id: `${pClass}-${item.Survived}`, - label: item.Survived, - value: item.Count, - percentage: (item.Count / classTotal) * 100, - color: item.Survived === 'Yes' ? baseColor : `${baseColor}80`, // 80 is 50% opacity for 'No' - })); -}); - -// Create a simplified dataset that groups all classes together for Yes/No -const survivalData = [ - { - id: 'Yes', - label: 'Survived:', - value: titanicData - .filter((item) => item.Survived === 'Yes') - .reduce((sum, item) => sum + item.Count, 0), - percentage: - (titanicData - .filter((item) => item.Survived === 'Yes') - .reduce((sum, item) => sum + item.Count, 0) / - totalCount) * - 100, - color: classColors['3rd'], - }, - { - id: 'No', - label: 'Did not survive:', - value: titanicData - .filter((item) => item.Survived === 'No') - .reduce((sum, item) => sum + item.Count, 0), - percentage: - (titanicData - .filter((item) => item.Survived === 'No') - .reduce((sum, item) => sum + item.Count, 0) / - totalCount) * - 100, - color: classColors['1st'], - }, -]; - -// Create dataset for class distribution by survival status (Yes first, then No) -const survivalClassData = [...titanicData] - .sort((a) => (a.Survived === 'Yes' ? -1 : 1)) - .map((item) => { - const baseColor = survivalData.find((d) => d.id === item.Survived).color; - return { - id: `${item.Class}-${item.Survived}`, - label: `${item.Class} class:`, - value: item.Count, - percentage: - (item.Count / - (item.Survived === 'Yes' - ? survivalData[0].value - : survivalData[1].value)) * - 100, - color: hexToRgba(baseColor, opacityMap[item.Class] || 1), - }; - }); - -const StyledText = styled('text')(({ theme }) => ({ - fill: theme.palette.text.primary, - textAnchor: 'middle', - dominantBaseline: 'central', - fontSize: 20, -})); - -function PieCenterLabel({ children }) { - const { width, height, left, top } = useDrawingArea(); - return ( - - {children} - - ); -} - -export default function TitanicPie() { - const [view, setView] = React.useState('class'); - const handleViewChange = (event, newView) => { - if (newView !== null) { - setView(newView); - } - }; - - const innerRadius = 50; - const middleRadius = 120; - - return ( - - - Titanic survival statistics - - - View by Class - View by Survival - - - {view === 'class' ? ( - `${item.id} (${item.percentage.toFixed(0)}%)`, - valueFormatter: ({ value }) => - `${value} out of ${totalCount} (${((value / totalCount) * 100).toFixed(0)}%)`, - highlightScope: { fade: 'global', highlight: 'item' }, - highlighted: { additionalRadius: 2 }, - cornerRadius: 3, - }, - { - innerRadius: middleRadius, - outerRadius: middleRadius + 20, - data: classSurvivalData, - arcLabel: (item) => `${item.label} (${item.percentage.toFixed(0)}%)`, - valueFormatter: ({ value }) => - `${value} out of ${totalCount} (${((value / totalCount) * 100).toFixed(0)}%)`, - arcLabelRadius: 160, - highlightScope: { fade: 'global', highlight: 'item' }, - highlighted: { additionalRadius: 2 }, - cornerRadius: 3, - }, - ]} - sx={{ - [`& .${pieClasses.arcLabel}`]: { - fontSize: '12px', - }, - }} - hideLegend - > - Class - - ) : ( - `${item.id} (${item.percentage.toFixed(0)}%)`, - valueFormatter: ({ value }) => - `${value} out of ${totalCount} (${((value / totalCount) * 100).toFixed(0)}%)`, - highlightScope: { fade: 'global', highlight: 'item' }, - highlighted: { additionalRadius: 2 }, - cornerRadius: 3, - }, - { - innerRadius: middleRadius, - outerRadius: middleRadius + 20, - data: survivalClassData, - arcLabel: (item) => { - const id = item.id || ''; - const percentage = item.percentage || 0; - return `${id.split('-')[0]} (${percentage.toFixed(0)}%)`; - }, - arcLabelRadius: 160, - valueFormatter: ({ value }) => - `${value} out of ${totalCount} (${((value / totalCount) * 100).toFixed(0)}%)`, - highlightScope: { fade: 'global', highlight: 'item' }, - highlighted: { additionalRadius: 2 }, - cornerRadius: 3, - }, - ]} - sx={{ - [`& .${pieClasses.arcLabel}`]: { - fontSize: '12px', - }, - }} - hideLegend - > - Survived - - )} - - - ); -} diff --git a/docs/data/charts/pie/BasicPie.tsx b/docs/data/charts/pie/demos/basic-pie/BasicPie.tsx similarity index 89% rename from docs/data/charts/pie/BasicPie.tsx rename to docs/data/charts/pie/demos/basic-pie/BasicPie.tsx index ed7e30224e3bb..268bf895fbf96 100644 --- a/docs/data/charts/pie/BasicPie.tsx +++ b/docs/data/charts/pie/demos/basic-pie/BasicPie.tsx @@ -2,6 +2,7 @@ import { PieChart } from '@mui/x-charts/PieChart'; export default function BasicPie() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pie/demos/basic-pie/client.ts b/docs/data/charts/pie/demos/basic-pie/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/basic-pie/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/basic-pie/index.ts b/docs/data/charts/pie/demos/basic-pie/index.ts new file mode 100644 index 0000000000000..63238419dafd2 --- /dev/null +++ b/docs/data/charts/pie/demos/basic-pie/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicPie from './BasicPie'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicPie, { ClientProvider }); diff --git a/docs/data/charts/pie/DonutChart.tsx b/docs/data/charts/pie/demos/donut-chart/DonutChart.tsx similarity index 91% rename from docs/data/charts/pie/DonutChart.tsx rename to docs/data/charts/pie/demos/donut-chart/DonutChart.tsx index 1606c71974fe5..d3dc66cdebdc6 100644 --- a/docs/data/charts/pie/DonutChart.tsx +++ b/docs/data/charts/pie/demos/donut-chart/DonutChart.tsx @@ -16,9 +16,11 @@ const settings = { export default function DonutChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pie/demos/donut-chart/client.ts b/docs/data/charts/pie/demos/donut-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/donut-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/donut-chart/index.ts b/docs/data/charts/pie/demos/donut-chart/index.ts new file mode 100644 index 0000000000000..9cae396576176 --- /dev/null +++ b/docs/data/charts/pie/demos/donut-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DonutChart from './DonutChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DonutChart, { ClientProvider }); diff --git a/docs/data/charts/pie/PieActiveArc.tsx b/docs/data/charts/pie/demos/pie-active-arc/PieActiveArc.tsx similarity index 78% rename from docs/data/charts/pie/PieActiveArc.tsx rename to docs/data/charts/pie/demos/pie-active-arc/PieActiveArc.tsx index 58bb9538c6892..a9cd342df57e7 100644 --- a/docs/data/charts/pie/PieActiveArc.tsx +++ b/docs/data/charts/pie/demos/pie-active-arc/PieActiveArc.tsx @@ -1,8 +1,9 @@ import { PieChart } from '@mui/x-charts/PieChart'; -import { desktopOS, valueFormatter } from './webUsageStats'; +import { desktopOS, valueFormatter } from '../../webUsageStats'; export default function PieActiveArc() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pie/demos/pie-active-arc/client.ts b/docs/data/charts/pie/demos/pie-active-arc/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/pie-active-arc/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/pie-active-arc/index.ts b/docs/data/charts/pie/demos/pie-active-arc/index.ts new file mode 100644 index 0000000000000..2e44a386621dd --- /dev/null +++ b/docs/data/charts/pie/demos/pie-active-arc/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieActiveArc from './PieActiveArc'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieActiveArc, { ClientProvider }); diff --git a/docs/data/charts/pie/PieAnimation.tsx b/docs/data/charts/pie/demos/pie-animation/PieAnimation.tsx similarity index 94% rename from docs/data/charts/pie/PieAnimation.tsx rename to docs/data/charts/pie/demos/pie-animation/PieAnimation.tsx index e45cfae163871..3ac174ad0bffe 100644 --- a/docs/data/charts/pie/PieAnimation.tsx +++ b/docs/data/charts/pie/demos/pie-animation/PieAnimation.tsx @@ -5,9 +5,10 @@ import Slider from '@mui/material/Slider'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import { PieChart } from '@mui/x-charts/PieChart'; -import { mobileAndDesktopOS, valueFormatter } from './webUsageStats'; +import { mobileAndDesktopOS, valueFormatter } from '../../webUsageStats'; export default function PieAnimation() { + // @focus-start @padding 1 const [radius, setRadius] = React.useState(50); const [itemNb, setItemNb] = React.useState(5); const [skipAnimation, setSkipAnimation] = React.useState(false); @@ -73,4 +74,5 @@ export default function PieAnimation() { /> ); + // @focus-end } diff --git a/docs/data/charts/pie/demos/pie-animation/client.ts b/docs/data/charts/pie/demos/pie-animation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/pie-animation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/pie-animation/index.ts b/docs/data/charts/pie/demos/pie-animation/index.ts new file mode 100644 index 0000000000000..336e65ed17e14 --- /dev/null +++ b/docs/data/charts/pie/demos/pie-animation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieAnimation from './PieAnimation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieAnimation, { ClientProvider }); diff --git a/docs/data/charts/pie/PieArcLabel.tsx b/docs/data/charts/pie/demos/pie-arc-label/PieArcLabel.tsx similarity index 82% rename from docs/data/charts/pie/PieArcLabel.tsx rename to docs/data/charts/pie/demos/pie-arc-label/PieArcLabel.tsx index 530ec775b6668..4ad53087ff003 100644 --- a/docs/data/charts/pie/PieArcLabel.tsx +++ b/docs/data/charts/pie/demos/pie-arc-label/PieArcLabel.tsx @@ -1,8 +1,9 @@ import { PieChart, pieClasses } from '@mui/x-charts/PieChart'; -import { desktopOS, valueFormatter } from './webUsageStats'; +import { desktopOS, valueFormatter } from '../../webUsageStats'; export default function PieArcLabel() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pie/demos/pie-arc-label/client.ts b/docs/data/charts/pie/demos/pie-arc-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/pie-arc-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/pie-arc-label/index.ts b/docs/data/charts/pie/demos/pie-arc-label/index.ts new file mode 100644 index 0000000000000..f4d9a4b47eca5 --- /dev/null +++ b/docs/data/charts/pie/demos/pie-arc-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieArcLabel from './PieArcLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieArcLabel, { ClientProvider }); diff --git a/docs/data/charts/pie/PieClick.tsx b/docs/data/charts/pie/demos/pie-click/PieClick.tsx similarity index 93% rename from docs/data/charts/pie/PieClick.tsx rename to docs/data/charts/pie/demos/pie-click/PieClick.tsx index 2bbead6ac70f8..618cfe9c0489a 100644 --- a/docs/data/charts/pie/PieClick.tsx +++ b/docs/data/charts/pie/demos/pie-click/PieClick.tsx @@ -6,10 +6,11 @@ import IconButton from '@mui/material/IconButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; import { PieChart } from '@mui/x-charts/PieChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { PieItemIdentifier } from '@mui/x-charts/models'; -import { mobileAndDesktopOS, platforms, valueFormatter } from './webUsageStats'; +import type { PieItemIdentifier } from '@mui/x-charts/models'; +import { mobileAndDesktopOS, platforms, valueFormatter } from '../../webUsageStats'; export default function PieClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); return ( @@ -55,6 +56,7 @@ ${itemData ? JSON.stringify(itemData, null, 2) : '// The data will appear here'} ); + // @focus-end } const series = [ diff --git a/docs/data/charts/pie/demos/pie-click/client.ts b/docs/data/charts/pie/demos/pie-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/pie-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/pie-click/index.ts b/docs/data/charts/pie/demos/pie-click/index.ts new file mode 100644 index 0000000000000..d88268f6e104b --- /dev/null +++ b/docs/data/charts/pie/demos/pie-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieClick from './PieClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieClick, { ClientProvider }); diff --git a/docs/data/charts/pie/PieColor.tsx b/docs/data/charts/pie/demos/pie-color/PieColor.tsx similarity index 92% rename from docs/data/charts/pie/PieColor.tsx rename to docs/data/charts/pie/demos/pie-color/PieColor.tsx index be0e8d59a6e25..7e504e6f692c7 100644 --- a/docs/data/charts/pie/PieColor.tsx +++ b/docs/data/charts/pie/demos/pie-color/PieColor.tsx @@ -2,7 +2,7 @@ import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { PieChart } from '@mui/x-charts/PieChart'; -import { platforms } from './webUsageStats'; +import { platforms } from '../../webUsageStats'; const palette = ['lightcoral', 'slateblue']; @@ -14,6 +14,7 @@ const colorPerItem = [ export default function PieColor() { return ( + {/* @focus-start */} Default + {/* @focus-end */} ); } diff --git a/docs/data/charts/pie/demos/pie-color/client.ts b/docs/data/charts/pie/demos/pie-color/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/pie-color/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/pie-color/index.ts b/docs/data/charts/pie/demos/pie-color/index.ts new file mode 100644 index 0000000000000..922f70988a22a --- /dev/null +++ b/docs/data/charts/pie/demos/pie-color/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieColor from './PieColor'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieColor, { ClientProvider }); diff --git a/docs/data/charts/pie/PieCSSStyling.tsx b/docs/data/charts/pie/demos/pie-css-styling/PieCSSStyling.tsx similarity index 90% rename from docs/data/charts/pie/PieCSSStyling.tsx rename to docs/data/charts/pie/demos/pie-css-styling/PieCSSStyling.tsx index 700d584a7a663..6124a981b012f 100644 --- a/docs/data/charts/pie/PieCSSStyling.tsx +++ b/docs/data/charts/pie/demos/pie-css-styling/PieCSSStyling.tsx @@ -1,8 +1,10 @@ -import { pieClasses, PieChart, PieChartProps } from '@mui/x-charts/PieChart'; +import type { PieChartProps } from '@mui/x-charts/PieChart'; +import { pieClasses, PieChart } from '@mui/x-charts/PieChart'; import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; import { useTheme } from '@mui/material/styles'; export default function PieCSSStyling() { + // @focus-start @padding 1 const theme = useTheme(); const palette = rainbowSurgePalette(theme.palette.mode); const data1 = [ @@ -55,4 +57,5 @@ export default function PieCSSStyling() { }} /> ); + // @focus-end } diff --git a/docs/data/charts/pie/demos/pie-css-styling/client.ts b/docs/data/charts/pie/demos/pie-css-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/pie-css-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/pie-css-styling/index.ts b/docs/data/charts/pie/demos/pie-css-styling/index.ts new file mode 100644 index 0000000000000..dab6705b5de2c --- /dev/null +++ b/docs/data/charts/pie/demos/pie-css-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieCSSStyling from './PieCSSStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieCSSStyling, { ClientProvider }); diff --git a/docs/data/charts/pie/PieShape.tsx b/docs/data/charts/pie/demos/pie-shape/PieShape.tsx similarity index 92% rename from docs/data/charts/pie/PieShape.tsx rename to docs/data/charts/pie/demos/pie-shape/PieShape.tsx index 103d73d54bfac..dc846a8a2aa00 100644 --- a/docs/data/charts/pie/PieShape.tsx +++ b/docs/data/charts/pie/demos/pie-shape/PieShape.tsx @@ -1,9 +1,10 @@ import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import { PieChart } from '@mui/x-charts/PieChart'; -import { desktopOS, valueFormatter } from './webUsageStats'; +import { desktopOS, valueFormatter } from '../../webUsageStats'; export default function PieShape() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/pie/demos/pie-shape/client.ts b/docs/data/charts/pie/demos/pie-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/pie-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/pie-shape/index.ts b/docs/data/charts/pie/demos/pie-shape/index.ts new file mode 100644 index 0000000000000..8cf417679d0ff --- /dev/null +++ b/docs/data/charts/pie/demos/pie-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PieShape from './PieShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PieShape, { ClientProvider }); diff --git a/docs/data/charts/pie/TitanicPie.tsx b/docs/data/charts/pie/demos/titanic-pie/TitanicPie.tsx similarity index 99% rename from docs/data/charts/pie/TitanicPie.tsx rename to docs/data/charts/pie/demos/titanic-pie/TitanicPie.tsx index d20218da175a4..61510dbfe4b30 100644 --- a/docs/data/charts/pie/TitanicPie.tsx +++ b/docs/data/charts/pie/demos/titanic-pie/TitanicPie.tsx @@ -171,6 +171,7 @@ function PieCenterLabel({ children }: PieCenterLabelProps): React.ReactElement { type ViewType = 'class' | 'survival'; export default function TitanicPie(): React.ReactElement { + // @focus-start @padding 1 const [view, setView] = React.useState('class'); const handleViewChange = ( event: React.MouseEvent, @@ -283,4 +284,5 @@ export default function TitanicPie(): React.ReactElement { ); + // @focus-end } diff --git a/docs/data/charts/pie/demos/titanic-pie/client.ts b/docs/data/charts/pie/demos/titanic-pie/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pie/demos/titanic-pie/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pie/demos/titanic-pie/index.ts b/docs/data/charts/pie/demos/titanic-pie/index.ts new file mode 100644 index 0000000000000..f02d6ce7f02e9 --- /dev/null +++ b/docs/data/charts/pie/demos/titanic-pie/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TitanicPie from './TitanicPie'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TitanicPie, { ClientProvider }); diff --git a/docs/data/charts/pie/pie.md b/docs/data/charts/pie/pie.md index bb226467c5803..27cb29ae2fdb5 100644 --- a/docs/data/charts/pie/pie.md +++ b/docs/data/charts/pie/pie.md @@ -18,7 +18,7 @@ You need: The demo below compares survival rates of passengers by class on the Titanic. -{{"demo": "TitanicPie.js"}} +{{"component": "file://./demos/titanic-pie/index.ts"}} ## Basics @@ -28,7 +28,7 @@ You can add optional properties such as `label`. Add an `id` property to each item if you will update or reorder the data, since it is used for React `key` props. -{{"demo": "BasicPie.js"}} +{{"component": "file://./demos/basic-pie/index.ts"}} ## Donut chart @@ -36,7 +36,7 @@ A donut chart (or doughnut chart) is a pie chart with a hollow center. Set the `innerRadius` property to a value greater than 0 to turn any pie chart into a donut. -{{"demo": "DonutChart.js"}} +{{"component": "file://./demos/donut-chart/index.ts"}} ## Colors @@ -59,7 +59,7 @@ You can customize pie colors in two ways: /> ``` -{{"demo": "PieColor.js"}} +{{"component": "file://./demos/pie-color/index.ts"}} ## Sizing @@ -73,7 +73,7 @@ Pie series shape is controlled by these properties: - `startAngle` / `endAngle`: angle range of the pie in degrees. - `cx` / `cy`: center of the pie. Default is the center of the drawing area. -{{"demo": "PieShape.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/pie-shape/index.ts", "hideToolbar": true, "bg": "playground"}} The following accept percentage strings (for example `'50%'`): @@ -91,7 +91,7 @@ Pass a function that receives the arc's data object and returns the label string Set `arcLabelMinAngle` so that arcs with an angle smaller than that value (in degrees) do not show a label. -{{"demo": "PieArcLabel.js"}} +{{"component": "file://./demos/pie-arc-label/index.ts"}} ## Highlight @@ -106,7 +106,7 @@ To change the size of an arc when highlighted or faded, use the `highlighted` an Use `additionalRadius` to add to `outerRadius` instead of setting an absolute value. A negative value shrinks the arc. -{{"demo": "PieActiveArc.js"}} +{{"component": "file://./demos/pie-active-arc/index.ts"}} ## Click event @@ -120,7 +120,7 @@ const onItemClick = ( ) => {}; ``` -{{"demo": "PieClick.js"}} +{{"component": "file://./demos/pie-click/index.ts"}} ## CSS @@ -128,7 +128,7 @@ You can customize the pie chart elements using CSS selectors. The demo below uses the `data-series` attribute to select the outer series and reduce its opacity. -{{"demo": "PieCSSStyling.js"}} +{{"component": "file://./demos/pie-css-styling/index.ts"}} ## Animation @@ -146,7 +146,7 @@ When you set `skipAnimation` to `true`, the chart renders without animations. ``` -{{"demo": "PieAnimation.js"}} +{{"component": "file://./demos/pie-animation/index.ts"}} ## Composition diff --git a/docs/data/charts/pyramid/Pyramid.js b/docs/data/charts/pyramid/Pyramid.js deleted file mode 100644 index 548fc2bdc0790..0000000000000 --- a/docs/data/charts/pyramid/Pyramid.js +++ /dev/null @@ -1,18 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -export default function Pyramid() { - return ( - - - - ); -} diff --git a/docs/data/charts/pyramid/Pyramid.tsx.preview b/docs/data/charts/pyramid/Pyramid.tsx.preview deleted file mode 100644 index 7d9b5616e4fc9..0000000000000 --- a/docs/data/charts/pyramid/Pyramid.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pyramid/PyramidDirection.js b/docs/data/charts/pyramid/PyramidDirection.js deleted file mode 100644 index 64a346fa855c1..0000000000000 --- a/docs/data/charts/pyramid/PyramidDirection.js +++ /dev/null @@ -1,46 +0,0 @@ -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import Stack from '@mui/material/Stack'; -import { populationByEducationLevelPercentageSeries } from '../funnel/populationByEducationLevel'; - -export default function PyramidDirection() { - return ( - ( - - - - )} - getCode={({ props }) => { - return `import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/pyramid/PyramidPlayground.js b/docs/data/charts/pyramid/PyramidPlayground.js deleted file mode 100644 index 4089eadc04948..0000000000000 --- a/docs/data/charts/pyramid/PyramidPlayground.js +++ /dev/null @@ -1,75 +0,0 @@ -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import Stack from '@mui/material/Stack'; -import { populationByEducationLevelPercentageSeries } from '../funnel/populationByEducationLevel'; - -const curveTypes = ['pyramid', 'step-pyramid']; - -export default function PyramidPlayground() { - return ( - ( - - - - )} - getCode={({ props }) => { - return `import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - - -`; - }} - /> - ); -} diff --git a/docs/data/charts/pyramid/PyramidSegmentLinear.js b/docs/data/charts/pyramid/PyramidSegmentLinear.js deleted file mode 100644 index 725134c00a51e..0000000000000 --- a/docs/data/charts/pyramid/PyramidSegmentLinear.js +++ /dev/null @@ -1,27 +0,0 @@ -import Box from '@mui/material/Box'; -import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; - -// datasource: https://ourworldindata.org/grapher/distribution-of-population-between-different-poverty-thresholds-stacke-bar-2011-ppp?country=~OWID_WRL&tableSearch=world - -export default function PyramidSegmentLinear() { - return ( - - - - ); -} diff --git a/docs/data/charts/pyramid/PyramidSegmentLinear.tsx.preview b/docs/data/charts/pyramid/PyramidSegmentLinear.tsx.preview deleted file mode 100644 index f0b900c866ecd..0000000000000 --- a/docs/data/charts/pyramid/PyramidSegmentLinear.tsx.preview +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/pyramid/PyramidDirection.tsx b/docs/data/charts/pyramid/demos/pyramid-direction/PyramidDirection.tsx similarity index 88% rename from docs/data/charts/pyramid/PyramidDirection.tsx rename to docs/data/charts/pyramid/demos/pyramid-direction/PyramidDirection.tsx index d02609044ca47..99407bbd35dce 100644 --- a/docs/data/charts/pyramid/PyramidDirection.tsx +++ b/docs/data/charts/pyramid/demos/pyramid-direction/PyramidDirection.tsx @@ -1,10 +1,11 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import Stack from '@mui/material/Stack'; -import { populationByEducationLevelPercentageSeries } from '../funnel/populationByEducationLevel'; +import { populationByEducationLevelPercentageSeries } from '../../../funnel/populationByEducationLevel'; export default function PyramidDirection() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pyramid/demos/pyramid-direction/client.ts b/docs/data/charts/pyramid/demos/pyramid-direction/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid-direction/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pyramid/demos/pyramid-direction/index.ts b/docs/data/charts/pyramid/demos/pyramid-direction/index.ts new file mode 100644 index 0000000000000..8b5e1f083404b --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid-direction/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PyramidDirection from './PyramidDirection'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PyramidDirection, { ClientProvider }); diff --git a/docs/data/charts/pyramid/PyramidPlayground.tsx b/docs/data/charts/pyramid/demos/pyramid-playground/PyramidPlayground.tsx similarity index 92% rename from docs/data/charts/pyramid/PyramidPlayground.tsx rename to docs/data/charts/pyramid/demos/pyramid-playground/PyramidPlayground.tsx index 90b6b012f72da..c5356929ba80b 100644 --- a/docs/data/charts/pyramid/PyramidPlayground.tsx +++ b/docs/data/charts/pyramid/demos/pyramid-playground/PyramidPlayground.tsx @@ -1,12 +1,13 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import Stack from '@mui/material/Stack'; -import { populationByEducationLevelPercentageSeries } from '../funnel/populationByEducationLevel'; +import { populationByEducationLevelPercentageSeries } from '../../../funnel/populationByEducationLevel'; const curveTypes = ['pyramid', 'step-pyramid'] as const; export default function PyramidPlayground() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/pyramid/demos/pyramid-playground/client.ts b/docs/data/charts/pyramid/demos/pyramid-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pyramid/demos/pyramid-playground/index.ts b/docs/data/charts/pyramid/demos/pyramid-playground/index.ts new file mode 100644 index 0000000000000..481f41b5c11c9 --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PyramidPlayground from './PyramidPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PyramidPlayground, { ClientProvider }); diff --git a/docs/data/charts/pyramid/PyramidSegmentLinear.tsx b/docs/data/charts/pyramid/demos/pyramid-segment-linear/PyramidSegmentLinear.tsx similarity index 94% rename from docs/data/charts/pyramid/PyramidSegmentLinear.tsx rename to docs/data/charts/pyramid/demos/pyramid-segment-linear/PyramidSegmentLinear.tsx index 725134c00a51e..4d1f177bb01fa 100644 --- a/docs/data/charts/pyramid/PyramidSegmentLinear.tsx +++ b/docs/data/charts/pyramid/demos/pyramid-segment-linear/PyramidSegmentLinear.tsx @@ -6,6 +6,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function PyramidSegmentLinear() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/pyramid/demos/pyramid-segment-linear/client.ts b/docs/data/charts/pyramid/demos/pyramid-segment-linear/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid-segment-linear/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pyramid/demos/pyramid-segment-linear/index.ts b/docs/data/charts/pyramid/demos/pyramid-segment-linear/index.ts new file mode 100644 index 0000000000000..ac02c50dc4c99 --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid-segment-linear/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import PyramidSegmentLinear from './PyramidSegmentLinear'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, PyramidSegmentLinear, { ClientProvider }); diff --git a/docs/data/charts/pyramid/Pyramid.tsx b/docs/data/charts/pyramid/demos/pyramid/Pyramid.tsx similarity index 89% rename from docs/data/charts/pyramid/Pyramid.tsx rename to docs/data/charts/pyramid/demos/pyramid/Pyramid.tsx index 548fc2bdc0790..24acdfb68b055 100644 --- a/docs/data/charts/pyramid/Pyramid.tsx +++ b/docs/data/charts/pyramid/demos/pyramid/Pyramid.tsx @@ -4,6 +4,7 @@ import { FunnelChart } from '@mui/x-charts-pro/FunnelChart'; export default function Pyramid() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/pyramid/demos/pyramid/client.ts b/docs/data/charts/pyramid/demos/pyramid/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/pyramid/demos/pyramid/index.ts b/docs/data/charts/pyramid/demos/pyramid/index.ts new file mode 100644 index 0000000000000..6dce93cf75127 --- /dev/null +++ b/docs/data/charts/pyramid/demos/pyramid/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import Pyramid from './Pyramid'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, Pyramid, { ClientProvider }); diff --git a/docs/data/charts/pyramid/pyramid.md b/docs/data/charts/pyramid/pyramid.md index 10d217f4b4b7b..a987c37b50907 100644 --- a/docs/data/charts/pyramid/pyramid.md +++ b/docs/data/charts/pyramid/pyramid.md @@ -12,7 +12,7 @@ components: FunnelChart, FunnelPlot To create a pyramid chart, set the `curve` property to `pyramid` in the series. -{{"demo": "Pyramid.js"}} +{{"component": "file://./demos/pyramid/index.ts"}} ## Direction @@ -23,17 +23,17 @@ In order to manually control the direction of the pyramid, the `funnelDirection` This is useful when the data is not sorted, or when you want to enforce a specific direction regardless of the data order. -{{"demo": "PyramidDirection.js"}} +{{"component": "file://./demos/pyramid-direction/index.ts"}} ## Segments By default, the pyramid chart creates segments with the same height. To make the segments proportional to the values, set `categoryAxis.scaleType` to `linear`. This adjusts the height of each segment based on the value it represents. -{{"demo": "PyramidSegmentLinear.js"}} +{{"component": "file://./demos/pyramid-segment-linear/index.ts"}} ## Styling A pyramid chart can be styled in all the same ways as the [funnel chart](/x/react-charts/funnel/#styling). -{{"demo": "PyramidPlayground.js"}} +{{"component": "file://./demos/pyramid-playground/index.ts"}} diff --git a/docs/data/charts/quickstart/Combining.js b/docs/data/charts/quickstart/Combining.js deleted file mode 100644 index 6748ad3c19198..0000000000000 --- a/docs/data/charts/quickstart/Combining.js +++ /dev/null @@ -1,91 +0,0 @@ -import Box from '@mui/material/Box'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { LineHighlightPlot, LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; - -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import alphabetStock from '../dataset/GOOGL.json'; - -const series = [ - { - type: 'bar', - yAxisId: 'volume', - label: 'Volume', - color: 'lightgray', - data: alphabetStock.map((day) => day.volume), - highlightScope: { highlight: 'item' }, - }, - { - type: 'line', - yAxisId: 'price', - color: 'red', - label: 'Low', - data: alphabetStock.map((day) => day.low), - highlightScope: { highlight: 'item' }, - }, - { - type: 'line', - yAxisId: 'price', - color: 'green', - label: 'High', - data: alphabetStock.map((day) => day.high), - }, -]; - -export default function Combining() { - return ( - - new Date(day.date)), - scaleType: 'band', - valueFormatter: (value) => value.toLocaleDateString(), - height: 48, - }, - ]} - yAxis={[ - { id: 'price', scaleType: 'linear', position: 'left', width: 50 }, - { - id: 'volume', - scaleType: 'linear', - position: 'right', - valueFormatter: (value) => `${(value / 1000000).toLocaleString()}M`, - width: 55, - }, - ]} - > - - - - - { - return index % 30 === 0; - }} - tickLabelStyle={{ - fontSize: 10, - }} - /> - - - - - - ); -} diff --git a/docs/data/charts/quickstart/SimpleCharts.js b/docs/data/charts/quickstart/SimpleCharts.js deleted file mode 100644 index e5cdd295ccc6f..0000000000000 --- a/docs/data/charts/quickstart/SimpleCharts.js +++ /dev/null @@ -1,21 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function SimpleCharts() { - return ( - - ); -} diff --git a/docs/data/charts/quickstart/SimpleCharts.tsx.preview b/docs/data/charts/quickstart/SimpleCharts.tsx.preview deleted file mode 100644 index 4a5eba8b6cf22..0000000000000 --- a/docs/data/charts/quickstart/SimpleCharts.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/quickstart/Combining.tsx b/docs/data/charts/quickstart/demos/combining/Combining.tsx similarity index 93% rename from docs/data/charts/quickstart/Combining.tsx rename to docs/data/charts/quickstart/demos/combining/Combining.tsx index 5767119d7d0b9..bac65d4fae618 100644 --- a/docs/data/charts/quickstart/Combining.tsx +++ b/docs/data/charts/quickstart/demos/combining/Combining.tsx @@ -2,12 +2,12 @@ import Box from '@mui/material/Box'; import { BarPlot } from '@mui/x-charts/BarChart'; import { LineHighlightPlot, LinePlot } from '@mui/x-charts/LineChart'; import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { AllSeriesType } from '@mui/x-charts/models'; +import type { AllSeriesType } from '@mui/x-charts/models'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import alphabetStock from '../dataset/GOOGL.json'; +import alphabetStock from '../../../dataset/GOOGL.json'; const series = [ { @@ -38,6 +38,7 @@ const series = [ export default function Combining() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/quickstart/demos/combining/client.ts b/docs/data/charts/quickstart/demos/combining/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/quickstart/demos/combining/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/quickstart/demos/combining/index.ts b/docs/data/charts/quickstart/demos/combining/index.ts new file mode 100644 index 0000000000000..17842405cfe98 --- /dev/null +++ b/docs/data/charts/quickstart/demos/combining/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import Combining from './Combining'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, Combining, { ClientProvider }); diff --git a/docs/data/charts/quickstart/SimpleCharts.tsx b/docs/data/charts/quickstart/demos/simple-charts/SimpleCharts.tsx similarity index 88% rename from docs/data/charts/quickstart/SimpleCharts.tsx rename to docs/data/charts/quickstart/demos/simple-charts/SimpleCharts.tsx index e5cdd295ccc6f..18b499b96d684 100644 --- a/docs/data/charts/quickstart/SimpleCharts.tsx +++ b/docs/data/charts/quickstart/demos/simple-charts/SimpleCharts.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function SimpleCharts() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/quickstart/demos/simple-charts/client.ts b/docs/data/charts/quickstart/demos/simple-charts/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/quickstart/demos/simple-charts/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/quickstart/demos/simple-charts/index.ts b/docs/data/charts/quickstart/demos/simple-charts/index.ts new file mode 100644 index 0000000000000..e0f463452b6c3 --- /dev/null +++ b/docs/data/charts/quickstart/demos/simple-charts/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SimpleCharts from './SimpleCharts'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SimpleCharts, { ClientProvider }); diff --git a/docs/data/charts/quickstart/quickstart.md b/docs/data/charts/quickstart/quickstart.md index aed46a6f49d86..79020cd86755c 100644 --- a/docs/data/charts/quickstart/quickstart.md +++ b/docs/data/charts/quickstart/quickstart.md @@ -72,7 +72,7 @@ Self-contained Chart components are imported and rendered as a single React comp These components require a `series` prop describing the data to render, as well as a numerical value (rendered in pixels) for the `height` prop. The `width` prop is optional; if no value is provided, the Charts expand to fill the available space. -{{"demo": "SimpleCharts.js"}} +{{"component": "file://./demos/simple-charts/index.ts"}} ### Composable Charts @@ -88,7 +88,7 @@ See the [Charts composition documentation](/x/react-charts/composition/) for com The demo below shows how to use composition to create a custom Chart that combines a Bar and a Line Chart on a single plot: -{{"demo": "Combining.js"}} +{{"component": "file://./demos/combining/index.ts"}} ### Chart layouts diff --git a/docs/data/charts/radar/BasicRadar.js b/docs/data/charts/radar/BasicRadar.js deleted file mode 100644 index 512cbaa0bea23..0000000000000 --- a/docs/data/charts/radar/BasicRadar.js +++ /dev/null @@ -1,14 +0,0 @@ -import { RadarChart } from '@mui/x-charts/RadarChart'; - -export default function BasicRadar() { - return ( - - ); -} diff --git a/docs/data/charts/radar/BasicRadar.tsx.preview b/docs/data/charts/radar/BasicRadar.tsx.preview deleted file mode 100644 index 0b78ee3de6d57..0000000000000 --- a/docs/data/charts/radar/BasicRadar.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/radar/CompositionExample.js b/docs/data/charts/radar/CompositionExample.js deleted file mode 100644 index 830ee9bc8da65..0000000000000 --- a/docs/data/charts/radar/CompositionExample.js +++ /dev/null @@ -1,60 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { - RadarDataProvider, - RadarGrid, - RadarSeriesMarks, - RadarSeriesArea, - RadarMetricLabels, - RadarAxisHighlight, -} from '@mui/x-charts/RadarChart'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; - -export default function CompositionExample() { - return ( - - - - - - - - - - - - - - ); -} - -// Data from https://ourworldindata.org/emissions-by-fuel -const series = [ - { - id: 'usa-id', - label: 'USA', - data: [6.65, 2.76, 5.15, 0.19, 0.07, 0.12], - fillArea: true, - }, - { - id: 'australia-id', - label: 'Australia', - data: [5.52, 5.5, 3.19, 0.51, 0.15, 0.11], - fillArea: true, - }, -]; - -const radar = { - metrics: ['Oil', 'Coal', 'Gas', 'Flaring', 'Other\nindustry', 'Cement'], -}; -const margin = { left: 50, right: 50 }; diff --git a/docs/data/charts/radar/CompositionExample.tsx b/docs/data/charts/radar/CompositionExample.tsx deleted file mode 100644 index 5a783abefe8be..0000000000000 --- a/docs/data/charts/radar/CompositionExample.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { - RadarDataProvider, - RadarGrid, - RadarSeriesMarks, - RadarSeriesArea, - RadarMetricLabels, - RadarAxisHighlight, -} from '@mui/x-charts/RadarChart'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; - -export default function CompositionExample() { - return ( - - - - - - - - - - - - - - ); -} - -// Data from https://ourworldindata.org/emissions-by-fuel -const series = [ - { - id: 'usa-id', - label: 'USA', - data: [6.65, 2.76, 5.15, 0.19, 0.07, 0.12], - fillArea: true, - }, - { - id: 'australia-id', - label: 'Australia', - data: [5.52, 5.5, 3.19, 0.51, 0.15, 0.11], - fillArea: true, - }, -]; -const radar = { - metrics: ['Oil', 'Coal', 'Gas', 'Flaring', 'Other\nindustry', 'Cement'], -}; -const margin = { left: 50, right: 50 }; diff --git a/docs/data/charts/radar/DemoRadar.js b/docs/data/charts/radar/DemoRadar.js deleted file mode 100644 index b34331a6ce58d..0000000000000 --- a/docs/data/charts/radar/DemoRadar.js +++ /dev/null @@ -1,105 +0,0 @@ -import Box from '@mui/material/Box'; -import { useTheme } from '@mui/material/styles'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { RadarChart } from '@mui/x-charts/RadarChart'; - -export default function DemoRadar() { - const theme = useTheme(); - - const stripeColorFunction = { - default: undefined, - 'two-tones': - theme.palette.mode === 'dark' - ? (index) => - index % 2 === 0 - ? (theme.vars || theme).palette.primary.dark - : (theme.vars || theme).palette.grey[300] - : (index) => - index % 2 === 0 - ? (theme.vars || theme).palette.primary.light - : (theme.vars || theme).palette.grey[800], - null: null, - }; - const stripeColorLines = { - default: [], - 'two-tones': - theme.palette.mode === 'dark' - ? [ - ` stripeColor={(index:number) => index % 2 === 0 ? theme.palette.primary.dark : theme.palette.grey[300]}`, - ] - : [ - ` stripeColor={(index:number) => index % 2 === 0 ? theme.palette.primary.light : theme.palette.grey[800]}`, - ], - null: [` stripeColor={null}`], - }; - - return ( - ( - - - - )} - getCode={({ props }) => - [ - `import { RadarChart } from '@mui/x-charts/RadarChart';`, - '', - `', - ].join('\n') - } - /> - ); -} diff --git a/docs/data/charts/radar/DemoRadarAxis.js b/docs/data/charts/radar/DemoRadarAxis.js deleted file mode 100644 index abd6758a90343..0000000000000 --- a/docs/data/charts/radar/DemoRadarAxis.js +++ /dev/null @@ -1,103 +0,0 @@ -import Box from '@mui/material/Box'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { RadarChart, RadarAxis } from '@mui/x-charts/RadarChart'; - -function getTextAnchor(textAnchor) { - switch (textAnchor) { - case 'default': - return undefined; - case 'function': - return (angle) => (angle < 180 ? 'start' : 'end'); - default: - return textAnchor; - } -} - -function getTextAnchorCode(textAnchor) { - switch (textAnchor) { - case 'default': - return ''; - case 'function': - return `textAnchor={(angle) => angle < 180 ? 'start' : 'end'}`; - default: - return `textAnchor="${textAnchor}"`; - } -} - -export default function DemoRadarAxis() { - return ( - ( - - - - - - )} - getCode={({ props }) => { - const textAnchorCode = getTextAnchorCode(props.textAnchor); - return [ - `import { RadarChart, RadarAxis } from '@mui/x-charts/RadarChart';`, - '', - '', - ` ', - '', - ].join('\n'); - }} - /> - ); -} diff --git a/docs/data/charts/radar/DemoRadarAxisHighlight.js b/docs/data/charts/radar/DemoRadarAxisHighlight.js deleted file mode 100644 index 629d288ca2a81..0000000000000 --- a/docs/data/charts/radar/DemoRadarAxisHighlight.js +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import { RadarChart } from '@mui/x-charts/RadarChart'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -export default function DemoRadarAxisHighlight() { - const [hideMark, setHideMark] = React.useState(true); - - const withHideMark = (series) => series.map((item) => ({ ...item, hideMark })); - - return ( - - - setHideMark(!event.target.checked)} /> - } - label="with mark" - labelPlacement="end" - /> - - - - - - - - ); -} - -const commonSettings = { - height: 300, - radar: { - max: 120, - metrics: ['Math', 'Chinese', 'English', 'Geography', 'Physics', 'History'], - }, -}; -const lisaGrades = { - label: 'Lisa', - data: [120, 98, 86, 99, 85, 65], - hideMark: false, -}; -const bartGrades = { - label: 'Bart', - data: [25, 34, 51, 16, 90, 20], - hideMark: false, -}; diff --git a/docs/data/charts/radar/DemoRadarSeriesHighlight.js b/docs/data/charts/radar/DemoRadarSeriesHighlight.js deleted file mode 100644 index 205bbdfb12b72..0000000000000 --- a/docs/data/charts/radar/DemoRadarSeriesHighlight.js +++ /dev/null @@ -1,102 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { RadarChart } from '@mui/x-charts/RadarChart'; - -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -function valueFormatter(v) { - if (v === null) { - return 'NaN'; - } - return `${v.toLocaleString()}t CO2eq/pers`; -} - -export default function DemoRadarSeriesHighlight() { - const [highlightedItem, setHighlightedItem] = React.useState(null); - const [fillArea, setFillArea] = React.useState(false); - - const withOptions = (series) => - series.map((item) => ({ - ...item, - fillArea, - })); - - const handleHighLightedSeries = (event, newHighLightedSeries) => { - if (newHighLightedSeries !== null) { - setHighlightedItem({ - seriesId: newHighLightedSeries, - }); - } - }; - return ( - - - {series.map((item) => ( - - {item.label} - - ))} - - - - - setFillArea(event.target.checked)} /> - } - label="fill area" - labelPlacement="end" - /> - - ); -} - -// Data from https://ourworldindata.org/emissions-by-fuel -const series = [ - { - id: 'usa', - label: 'USA', - data: [6.65, 2.76, 5.15, 0.19, 0.07, 0.12], - valueFormatter, - }, - { - id: 'australia', - label: 'Australia', - data: [5.52, 5.5, 3.19, 0.51, 0.15, 0.11], - valueFormatter, - }, - { - id: 'united-kingdom', - label: 'United Kingdom', - data: [2.26, 0.29, 2.03, 0.05, 0.04, 0.06], - valueFormatter, - }, -]; - -const radar = { - metrics: ['Oil', 'Coal', 'Gas', 'Flaring', 'Other\nindustry', 'Cement'], -}; diff --git a/docs/data/charts/radar/DemoRadarVisualisation.js b/docs/data/charts/radar/DemoRadarVisualisation.js deleted file mode 100644 index 0327d1bd4f7fe..0000000000000 --- a/docs/data/charts/radar/DemoRadarVisualisation.js +++ /dev/null @@ -1,66 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import { RadarChart } from '@mui/x-charts/RadarChart'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -export default function DemoRadarVisualisation() { - const [hideMark, setHideMark] = React.useState(false); - const [fillArea, setFillArea] = React.useState(false); - - const withOptions = (series) => - series.map((item) => ({ ...item, hideMark, fillArea })); - - return ( - - - setHideMark(!event.target.checked)} /> - } - label="with mark" - labelPlacement="end" - /> - setFillArea(event.target.checked)} /> - } - label="fill area" - labelPlacement="end" - /> - - - - - - - - ); -} - -const commonSettings = { - height: 300, - radar: { - max: 120, - metrics: ['Math', 'Chinese', 'English', 'Geography', 'Physics', 'History'], - }, -}; -const lisaGrades = { - label: 'Lisa', - data: [120, 98, 86, 99, 85, 65], - hideMark: false, -}; -const bartGrades = { - label: 'Bart', - data: [25, 34, 51, 16, 90, 20], - hideMark: false, -}; diff --git a/docs/data/charts/radar/MultiSeriesRadar.js b/docs/data/charts/radar/MultiSeriesRadar.js deleted file mode 100644 index 6b37c9ad4dff6..0000000000000 --- a/docs/data/charts/radar/MultiSeriesRadar.js +++ /dev/null @@ -1,34 +0,0 @@ -import { RadarChart } from '@mui/x-charts/RadarChart'; - -// Data from https://ourworldindata.org/emissions-by-fuel - -function valueFormatter(v) { - if (v === null) { - return 'NaN'; - } - return `${v.toLocaleString()}t CO2eq/pers`; -} - -export default function MultiSeriesRadar() { - return ( - - ); -} diff --git a/docs/data/charts/radar/RadarAxis.js b/docs/data/charts/radar/RadarAxis.js deleted file mode 100644 index a8d6b2983f26a..0000000000000 --- a/docs/data/charts/radar/RadarAxis.js +++ /dev/null @@ -1,20 +0,0 @@ -import { RadarChart } from '@mui/x-charts/RadarChart'; - -export default function RadarAxis() { - return ( - - ); -} diff --git a/docs/data/charts/radar/RadarAxis.tsx.preview b/docs/data/charts/radar/RadarAxis.tsx.preview deleted file mode 100644 index 4c00549b03fc8..0000000000000 --- a/docs/data/charts/radar/RadarAxis.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/radar/RadarClick.js b/docs/data/charts/radar/RadarClick.js deleted file mode 100644 index 4e8de13567869..0000000000000 --- a/docs/data/charts/radar/RadarClick.js +++ /dev/null @@ -1,119 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; - -import { RadarChart } from '@mui/x-charts/RadarChart'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -export default function RadarClick() { - const [itemData, setItemData] = React.useState(); - const [axisData, setAxisData] = React.useState(); - const [itemClick, setItemClick] = React.useState('mark'); - - const handleItemClick = (event, newItem) => { - setItemClick(newItem); - }; - - return ( - - - setItemData(d) : undefined - } - onMarkClick={ - itemClick === 'mark' ? (event, d) => setItemData(d) : undefined - } - onAxisClick={(event, d) => setAxisData(d)} - /> - - - - Item click listener - - Mark - Area - - -
- - Click on the chart - { - setItemData(undefined); - setAxisData(null); - }} - > - - - - -
-
-
- ); -} - -const commonSettings = { - height: 300, - radar: { - max: 120, - metrics: ['Math', 'Chinese', 'English', 'Geography', 'Physics', 'History'], - }, -}; -const lisaGrades = { - type: 'radar', - label: 'Lisa', - id: 'lisa-grade-series', - data: [120, 98, 86, 99, 85, 65], - hideMark: false, -}; -const bartGrades = { - type: 'radar', - label: 'Bart', - id: 'bar-grade-series', - data: [25, 34, 51, 16, 90, 20], - hideMark: false, -}; diff --git a/docs/data/charts/radar/RadarTooltip.js b/docs/data/charts/radar/RadarTooltip.js deleted file mode 100644 index 66b55df0a488b..0000000000000 --- a/docs/data/charts/radar/RadarTooltip.js +++ /dev/null @@ -1,59 +0,0 @@ -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import { RadarChart } from '@mui/x-charts/RadarChart'; -import Typography from '@mui/material/Typography'; - -export default function RadarTooltip() { - return ( - - - Axis - - - - Item - - - - ); -} - -// Data from https://ourworldindata.org/emissions-by-fuel -const series = [ - { - id: 'usa', - label: 'USA', - data: [6.65, 2.76, 5.15, 0.19, 0.07, 0.12], - }, - { - id: 'australia', - label: 'Australia', - data: [5.52, 5.5, 3.19, 0.51, 0.15, 0.11], - }, - { - id: 'united-kingdom', - label: 'United Kingdom', - data: [2.26, 0.29, 2.03, 0.05, 0.04, 0.06], - }, -]; - -const radar = { - metrics: ['Oil', 'Coal', 'Gas', 'Flaring', 'Other\nindustry', 'Cement'], -}; - -const radarChartsParams = { - hideLegend: true, - height: 300, - series, - radar, -}; diff --git a/docs/data/charts/radar/RadarTooltip.tsx.preview b/docs/data/charts/radar/RadarTooltip.tsx.preview deleted file mode 100644 index feeec8ac18e21..0000000000000 --- a/docs/data/charts/radar/RadarTooltip.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - Axis - - - - Item - - \ No newline at end of file diff --git a/docs/data/charts/radar/BasicRadar.tsx b/docs/data/charts/radar/demos/basic-radar/BasicRadar.tsx similarity index 87% rename from docs/data/charts/radar/BasicRadar.tsx rename to docs/data/charts/radar/demos/basic-radar/BasicRadar.tsx index 512cbaa0bea23..d22804f29aeda 100644 --- a/docs/data/charts/radar/BasicRadar.tsx +++ b/docs/data/charts/radar/demos/basic-radar/BasicRadar.tsx @@ -2,6 +2,7 @@ import { RadarChart } from '@mui/x-charts/RadarChart'; export default function BasicRadar() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radar/demos/basic-radar/client.ts b/docs/data/charts/radar/demos/basic-radar/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/basic-radar/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/basic-radar/index.ts b/docs/data/charts/radar/demos/basic-radar/index.ts new file mode 100644 index 0000000000000..5d89fb4ed6671 --- /dev/null +++ b/docs/data/charts/radar/demos/basic-radar/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicRadar from './BasicRadar'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicRadar, { ClientProvider }); diff --git a/docs/data/charts/radar/demos/composition-example/CompositionExample.tsx b/docs/data/charts/radar/demos/composition-example/CompositionExample.tsx new file mode 100644 index 0000000000000..d8eabcf2ebc9f --- /dev/null +++ b/docs/data/charts/radar/demos/composition-example/CompositionExample.tsx @@ -0,0 +1,61 @@ +import Stack from '@mui/material/Stack'; +import { + RadarDataProvider, + RadarGrid, + RadarSeriesMarks, + RadarSeriesArea, + RadarMetricLabels, + RadarAxisHighlight, +} from '@mui/x-charts/RadarChart'; +import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; +import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; + +export default function CompositionExample() { + return ( + // @focus-start @padding 2 + + + + + + + + + + + + + + // @focus-end + ); +} + +// Data from https://ourworldindata.org/emissions-by-fuel +const series = [ + { + id: 'usa-id', + label: 'USA', + data: [6.65, 2.76, 5.15, 0.19, 0.07, 0.12], + fillArea: true, + }, + { + id: 'australia-id', + label: 'Australia', + data: [5.52, 5.5, 3.19, 0.51, 0.15, 0.11], + fillArea: true, + }, +]; +const radar = { + metrics: ['Oil', 'Coal', 'Gas', 'Flaring', 'Other\nindustry', 'Cement'], +}; +const margin = { left: 50, right: 50 }; diff --git a/docs/data/charts/radar/demos/composition-example/client.ts b/docs/data/charts/radar/demos/composition-example/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/composition-example/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/composition-example/index.ts b/docs/data/charts/radar/demos/composition-example/index.ts new file mode 100644 index 0000000000000..7a03486adc223 --- /dev/null +++ b/docs/data/charts/radar/demos/composition-example/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CompositionExample from './CompositionExample'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CompositionExample, { ClientProvider }); diff --git a/docs/data/charts/radar/DemoRadarAxisHighlight.tsx b/docs/data/charts/radar/demos/demo-radar-axis-highlight/DemoRadarAxisHighlight.tsx similarity index 90% rename from docs/data/charts/radar/DemoRadarAxisHighlight.tsx rename to docs/data/charts/radar/demos/demo-radar-axis-highlight/DemoRadarAxisHighlight.tsx index 8ea39145760f0..3621ae90b301f 100644 --- a/docs/data/charts/radar/DemoRadarAxisHighlight.tsx +++ b/docs/data/charts/radar/demos/demo-radar-axis-highlight/DemoRadarAxisHighlight.tsx @@ -1,11 +1,13 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; -import { RadarChart, RadarSeries } from '@mui/x-charts/RadarChart'; +import type { RadarSeries } from '@mui/x-charts/RadarChart'; +import { RadarChart } from '@mui/x-charts/RadarChart'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; export default function DemoRadarAxisHighlight() { + // @focus-start @padding 1 const [hideMark, setHideMark] = React.useState(true); const withHideMark = (series: RadarSeries[]) => @@ -36,6 +38,7 @@ export default function DemoRadarAxisHighlight() { ); + // @focus-end } const commonSettings = { diff --git a/docs/data/charts/radar/demos/demo-radar-axis-highlight/client.ts b/docs/data/charts/radar/demos/demo-radar-axis-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-axis-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/demo-radar-axis-highlight/index.ts b/docs/data/charts/radar/demos/demo-radar-axis-highlight/index.ts new file mode 100644 index 0000000000000..19208222c1d4e --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-axis-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DemoRadarAxisHighlight from './DemoRadarAxisHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DemoRadarAxisHighlight, { ClientProvider }); diff --git a/docs/data/charts/radar/DemoRadarAxis.tsx b/docs/data/charts/radar/demos/demo-radar-axis/DemoRadarAxis.tsx similarity index 98% rename from docs/data/charts/radar/DemoRadarAxis.tsx rename to docs/data/charts/radar/demos/demo-radar-axis/DemoRadarAxis.tsx index 441c9396ef182..d8aa859a4df20 100644 --- a/docs/data/charts/radar/DemoRadarAxis.tsx +++ b/docs/data/charts/radar/demos/demo-radar-axis/DemoRadarAxis.tsx @@ -26,6 +26,7 @@ function getTextAnchorCode(textAnchor: 'default' | 'start' | 'end' | 'function') export default function DemoRadarAxis() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radar/demos/demo-radar-axis/client.ts b/docs/data/charts/radar/demos/demo-radar-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/demo-radar-axis/index.ts b/docs/data/charts/radar/demos/demo-radar-axis/index.ts new file mode 100644 index 0000000000000..e4c015c25cada --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DemoRadarAxis from './DemoRadarAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DemoRadarAxis, { ClientProvider }); diff --git a/docs/data/charts/radar/DemoRadarSeriesHighlight.tsx b/docs/data/charts/radar/demos/demo-radar-series-highlight/DemoRadarSeriesHighlight.tsx similarity index 92% rename from docs/data/charts/radar/DemoRadarSeriesHighlight.tsx rename to docs/data/charts/radar/demos/demo-radar-series-highlight/DemoRadarSeriesHighlight.tsx index 034c9056508e1..b6976596b9499 100644 --- a/docs/data/charts/radar/DemoRadarSeriesHighlight.tsx +++ b/docs/data/charts/radar/demos/demo-radar-series-highlight/DemoRadarSeriesHighlight.tsx @@ -2,8 +2,9 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; import ToggleButton from '@mui/material/ToggleButton'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { RadarChart, RadarSeries } from '@mui/x-charts/RadarChart'; -import { HighlightItemIdentifier } from '@mui/x-charts/models'; +import type { RadarSeries } from '@mui/x-charts/RadarChart'; +import { RadarChart } from '@mui/x-charts/RadarChart'; +import type { HighlightItemIdentifier } from '@mui/x-charts/models'; import Box from '@mui/material/Box'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; @@ -16,6 +17,7 @@ function valueFormatter(v: number | null) { } export default function DemoRadarSeriesHighlight() { + // @focus-start @padding 1 const [highlightedItem, setHighlightedItem] = React.useState | null>(null); const [fillArea, setFillArea] = React.useState(false); @@ -74,6 +76,7 @@ export default function DemoRadarSeriesHighlight() { /> ); + // @focus-end } // Data from https://ourworldindata.org/emissions-by-fuel diff --git a/docs/data/charts/radar/demos/demo-radar-series-highlight/client.ts b/docs/data/charts/radar/demos/demo-radar-series-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-series-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/demo-radar-series-highlight/index.ts b/docs/data/charts/radar/demos/demo-radar-series-highlight/index.ts new file mode 100644 index 0000000000000..5aab5b94b360d --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-series-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DemoRadarSeriesHighlight from './DemoRadarSeriesHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DemoRadarSeriesHighlight, { ClientProvider }); diff --git a/docs/data/charts/radar/DemoRadarVisualisation.tsx b/docs/data/charts/radar/demos/demo-radar-visualisation/DemoRadarVisualisation.tsx similarity index 92% rename from docs/data/charts/radar/DemoRadarVisualisation.tsx rename to docs/data/charts/radar/demos/demo-radar-visualisation/DemoRadarVisualisation.tsx index 31d0542b333da..be6c8cad0218b 100644 --- a/docs/data/charts/radar/DemoRadarVisualisation.tsx +++ b/docs/data/charts/radar/demos/demo-radar-visualisation/DemoRadarVisualisation.tsx @@ -1,11 +1,13 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; -import { RadarChart, RadarSeries } from '@mui/x-charts/RadarChart'; +import type { RadarSeries } from '@mui/x-charts/RadarChart'; +import { RadarChart } from '@mui/x-charts/RadarChart'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; export default function DemoRadarVisualisation() { + // @focus-start @padding 1 const [hideMark, setHideMark] = React.useState(false); const [fillArea, setFillArea] = React.useState(false); @@ -45,6 +47,7 @@ export default function DemoRadarVisualisation() { ); + // @focus-end } const commonSettings = { diff --git a/docs/data/charts/radar/demos/demo-radar-visualisation/client.ts b/docs/data/charts/radar/demos/demo-radar-visualisation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-visualisation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/demo-radar-visualisation/index.ts b/docs/data/charts/radar/demos/demo-radar-visualisation/index.ts new file mode 100644 index 0000000000000..64eb3a99ccf73 --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar-visualisation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DemoRadarVisualisation from './DemoRadarVisualisation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DemoRadarVisualisation, { ClientProvider }); diff --git a/docs/data/charts/radar/DemoRadar.tsx b/docs/data/charts/radar/demos/demo-radar/DemoRadar.tsx similarity index 98% rename from docs/data/charts/radar/DemoRadar.tsx rename to docs/data/charts/radar/demos/demo-radar/DemoRadar.tsx index c33da87cd54db..7b7a04ba5323c 100644 --- a/docs/data/charts/radar/DemoRadar.tsx +++ b/docs/data/charts/radar/demos/demo-radar/DemoRadar.tsx @@ -4,6 +4,7 @@ import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import { RadarChart } from '@mui/x-charts/RadarChart'; export default function DemoRadar() { + // @focus-start @padding 1 const theme = useTheme(); const stripeColorFunction = { @@ -102,4 +103,5 @@ export default function DemoRadar() { } /> ); + // @focus-end } diff --git a/docs/data/charts/radar/demos/demo-radar/client.ts b/docs/data/charts/radar/demos/demo-radar/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/demo-radar/index.ts b/docs/data/charts/radar/demos/demo-radar/index.ts new file mode 100644 index 0000000000000..fd5b2e8201c7f --- /dev/null +++ b/docs/data/charts/radar/demos/demo-radar/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DemoRadar from './DemoRadar'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DemoRadar, { ClientProvider }); diff --git a/docs/data/charts/radar/MultiSeriesRadar.tsx b/docs/data/charts/radar/demos/multi-series-radar/MultiSeriesRadar.tsx similarity index 94% rename from docs/data/charts/radar/MultiSeriesRadar.tsx rename to docs/data/charts/radar/demos/multi-series-radar/MultiSeriesRadar.tsx index 1221534e04e16..54e32e49e19ec 100644 --- a/docs/data/charts/radar/MultiSeriesRadar.tsx +++ b/docs/data/charts/radar/demos/multi-series-radar/MultiSeriesRadar.tsx @@ -11,6 +11,7 @@ function valueFormatter(v: number | null) { export default function MultiSeriesRadar() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radar/demos/multi-series-radar/client.ts b/docs/data/charts/radar/demos/multi-series-radar/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/multi-series-radar/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/multi-series-radar/index.ts b/docs/data/charts/radar/demos/multi-series-radar/index.ts new file mode 100644 index 0000000000000..e3e85477fdbec --- /dev/null +++ b/docs/data/charts/radar/demos/multi-series-radar/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MultiSeriesRadar from './MultiSeriesRadar'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MultiSeriesRadar, { ClientProvider }); diff --git a/docs/data/charts/radar/RadarAxis.tsx b/docs/data/charts/radar/demos/radar-axis/RadarAxis.tsx similarity index 91% rename from docs/data/charts/radar/RadarAxis.tsx rename to docs/data/charts/radar/demos/radar-axis/RadarAxis.tsx index a8d6b2983f26a..fe9860c99309f 100644 --- a/docs/data/charts/radar/RadarAxis.tsx +++ b/docs/data/charts/radar/demos/radar-axis/RadarAxis.tsx @@ -2,6 +2,7 @@ import { RadarChart } from '@mui/x-charts/RadarChart'; export default function RadarAxis() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radar/demos/radar-axis/client.ts b/docs/data/charts/radar/demos/radar-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/radar-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/radar-axis/index.ts b/docs/data/charts/radar/demos/radar-axis/index.ts new file mode 100644 index 0000000000000..db08070d2a205 --- /dev/null +++ b/docs/data/charts/radar/demos/radar-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadarAxis from './RadarAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadarAxis, { ClientProvider }); diff --git a/docs/data/charts/radar/RadarClick.tsx b/docs/data/charts/radar/demos/radar-click/RadarClick.tsx similarity index 98% rename from docs/data/charts/radar/RadarClick.tsx rename to docs/data/charts/radar/demos/radar-click/RadarClick.tsx index 95697fbe38ffe..79cf01389baf6 100644 --- a/docs/data/charts/radar/RadarClick.tsx +++ b/docs/data/charts/radar/demos/radar-click/RadarClick.tsx @@ -6,7 +6,7 @@ import IconButton from '@mui/material/IconButton'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; import ToggleButton from '@mui/material/ToggleButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { +import type { ChartsAxisData, RadarItemIdentifier, RadarSeriesType, @@ -15,6 +15,7 @@ import { RadarChart } from '@mui/x-charts/RadarChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; export default function RadarClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); const [axisData, setAxisData] = React.useState(); const [itemClick, setItemClick] = React.useState<'mark' | 'area' | null>('mark'); @@ -101,6 +102,7 @@ ${axisData ? JSON.stringify(axisData, null, 2) : '// The data will appear here'} ); + // @focus-end } const commonSettings = { diff --git a/docs/data/charts/radar/demos/radar-click/client.ts b/docs/data/charts/radar/demos/radar-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/radar-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/radar-click/index.ts b/docs/data/charts/radar/demos/radar-click/index.ts new file mode 100644 index 0000000000000..5e4e0ebe4cfd8 --- /dev/null +++ b/docs/data/charts/radar/demos/radar-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadarClick from './RadarClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadarClick, { ClientProvider }); diff --git a/docs/data/charts/radar/RadarTooltip.tsx b/docs/data/charts/radar/demos/radar-tooltip/RadarTooltip.tsx similarity index 96% rename from docs/data/charts/radar/RadarTooltip.tsx rename to docs/data/charts/radar/demos/radar-tooltip/RadarTooltip.tsx index 4005cd92e0cff..e182fd139155c 100644 --- a/docs/data/charts/radar/RadarTooltip.tsx +++ b/docs/data/charts/radar/demos/radar-tooltip/RadarTooltip.tsx @@ -9,6 +9,7 @@ export default function RadarTooltip() { direction="row" sx={{ flexWrap: 'wrap', justifyContent: 'space-around', width: '100%' }} > + {/* @focus-start */} Axis + {/* @focus-end */} ); } diff --git a/docs/data/charts/radar/demos/radar-tooltip/client.ts b/docs/data/charts/radar/demos/radar-tooltip/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radar/demos/radar-tooltip/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radar/demos/radar-tooltip/index.ts b/docs/data/charts/radar/demos/radar-tooltip/index.ts new file mode 100644 index 0000000000000..a44b0fae8afd0 --- /dev/null +++ b/docs/data/charts/radar/demos/radar-tooltip/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadarTooltip from './RadarTooltip'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadarTooltip, { ClientProvider }); diff --git a/docs/data/charts/radar/radar.md b/docs/data/charts/radar/radar.md index 83b5603fd5c06..b6935d963c7cd 100644 --- a/docs/data/charts/radar/radar.md +++ b/docs/data/charts/radar/radar.md @@ -15,7 +15,7 @@ Use it to compare profiles or scores across several dimensions (for example, pro The demo below shows a basic radar chart with one series. -{{"demo": "BasicRadar.js"}} +{{"component": "file://./demos/basic-radar/index.ts"}} ## Basics @@ -28,13 +28,13 @@ Each entry in `metrics` is a string or an object that defines one axis of the ch You can plot multiple series on the same radar. -{{"demo": "MultiSeriesRadar.js"}} +{{"component": "file://./demos/multi-series-radar/index.ts"}} ## Series options Set `hideMark` and `fillArea` on a radar series to change how it renders. -{{"demo": "DemoRadarVisualisation.js"}} +{{"component": "file://./demos/demo-radar-visualisation/index.ts"}} ## Metrics @@ -47,7 +47,7 @@ Each item can be: - `min`: minimum value for this axis (default 0) - `max`: maximum value for this axis (default is the max value in the data) -{{"demo": "RadarAxis.js"}} +{{"component": "file://./demos/radar-axis/index.ts"}} ## Grid @@ -59,7 +59,7 @@ Configure it with: - `shape`: `circular` or `sharp` - `stripeColor`: callback that returns stripe colors. Set to `null` to remove stripes. -{{"demo": "DemoRadar.js"}} +{{"component": "file://./demos/demo-radar/index.ts"}} ## Axis values @@ -71,7 +71,7 @@ It needs a `metric` prop and can be configured with: - `divisions`: number of labels - `textAnchor` / `dominantBaseline`: label placement (string or function that receives the angle in degrees) -{{"demo": "DemoRadarAxis.js"}} +{{"component": "file://./demos/demo-radar-axis/index.ts"}} ## Highlight @@ -80,7 +80,7 @@ It needs a `metric` prop and can be configured with: By default, the radar chart highlights all values on the same axis. If you're composing a custom component, add `RadarAxisHighlight` to get this behavior. -{{"demo": "DemoRadarAxisHighlight.js"}} +{{"component": "file://./demos/demo-radar-axis-highlight/index.ts"}} ### Series highlight @@ -92,7 +92,7 @@ If you're composing a custom component, pass these props to `RadarDataProvider`. The demo below shows controlled highlight with several overlapping country series. Place the series you want to be most interactive last in the `series` array, since later series render on top and receive pointer events first in overlapping regions. -{{"demo": "DemoRadarSeriesHighlight.js"}} +{{"component": "file://./demos/demo-radar-series-highlight/index.ts"}} ### Disabling highlight @@ -109,7 +109,7 @@ The `trigger` prop of the tooltip slot accepts: - `'item'`: when the pointer is over a radar area, the tooltip shows data for that series. - `'none'`: tooltip is off. -{{"demo": "RadarTooltip.js"}} +{{"component": "file://./demos/radar-tooltip/index.ts"}} ## Click events @@ -128,7 +128,7 @@ const clickHandler = ( ) => {}; ``` -{{"demo": "RadarClick.js"}} +{{"component": "file://./demos/radar-click/index.ts"}} :::info The `event` passed to `onAxisClick` differs from the others. @@ -159,7 +159,7 @@ In addition to the shared chart components available for [composition](/x/react- `RadarSeriesArea` and `RadarSeriesMarks` let you draw all marks above all areas, or insert components between areas and marks. ::: -{{"demo": "CompositionExample.js"}} +{{"component": "file://./demos/composition-example/index.ts"}} Here's how the radar chart is composed: diff --git a/docs/data/charts/radial-axes/BandHighlight.js b/docs/data/charts/radial-axes/BandHighlight.js deleted file mode 100644 index e5a2c3c4effd3..0000000000000 --- a/docs/data/charts/radial-axes/BandHighlight.js +++ /dev/null @@ -1,111 +0,0 @@ -import * as React from 'react'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import Stack from '@mui/material/Stack'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -export default function BandHighlight() { - const [scaleType, setScaleType] = React.useState('point'); - const [rotationHighlight, setRotationHighlight] = React.useState('band'); - const [radiusHighlight, setRadiusHighlight] = React.useState('none'); - - const handleChange = (direction) => (event) => { - if (direction === 'rotation') { - setRotationHighlight(event.target.value); - } - if (direction === 'radius') { - setRadiusHighlight(event.target.value); - } - if (direction === 'scaleType') { - setScaleType(event.target.value); - } - }; - - return ( - -
- ({ ...item, month: index + 1 })) - : dataset - } - radiusAxis={[{ minRadius: 10, min: 0 }]} - rotationAxis={[{ dataKey: 'month', scaleType }]} - series={[ - { - dataKey: 'london', - curve: 'linear', - label: 'London', - valueFormatter, - showMark: true, - }, - { - dataKey: 'paris', - curve: 'linear', - label: 'Paris', - valueFormatter, - showMark: true, - }, - { - dataKey: 'newYork', - curve: 'linear', - label: 'New York', - valueFormatter, - showMark: true, - }, - ]} - margin={10} - height={300} - grid={{ rotation: true, radius: true }} - axisHighlight={{ rotation: rotationHighlight, radius: radiusHighlight }} - /> -
- - - scale type - - } label="Band" /> - } label="Point" /> - } label="Linear" /> - - - - rotation highlight - - } label="None" /> - } label="Line" /> - } label="Band" /> - - - - radius highlight - - } label="None" /> - } label="Line" /> - - - -
- ); -} diff --git a/docs/data/charts/radial-axes/BandHighlight.tsx b/docs/data/charts/radial-axes/BandHighlight.tsx deleted file mode 100644 index 43a22727f7e2e..0000000000000 --- a/docs/data/charts/radial-axes/BandHighlight.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import * as React from 'react'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import Stack from '@mui/material/Stack'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; -import { dataset, valueFormatter } from '../dataset/weather'; - -export default function BandHighlight() { - const [scaleType, setScaleType] = React.useState<'band' | 'point' | 'linear'>( - 'point', - ); - const [rotationHighlight, setRotationHighlight] = React.useState< - 'band' | 'none' | 'line' - >('band'); - const [radiusHighlight, setRadiusHighlight] = React.useState<'none' | 'line'>( - 'none', - ); - - const handleChange = - (direction: 'rotation' | 'radius' | 'scaleType') => - (event: React.ChangeEvent) => { - if (direction === 'rotation') { - setRotationHighlight( - (event.target as HTMLInputElement).value as 'band' | 'none' | 'line', - ); - } - if (direction === 'radius') { - setRadiusHighlight( - (event.target as HTMLInputElement).value as 'none' | 'line', - ); - } - if (direction === 'scaleType') { - setScaleType( - (event.target as HTMLInputElement).value as 'band' | 'point' | 'linear', - ); - } - }; - - return ( - -
- ({ ...item, month: index + 1 })) - : dataset - } - radiusAxis={[{ minRadius: 10, min: 0 }]} - rotationAxis={[{ dataKey: 'month', scaleType }]} - series={[ - { - dataKey: 'london', - curve: 'linear', - label: 'London', - valueFormatter, - showMark: true, - }, - { - dataKey: 'paris', - curve: 'linear', - label: 'Paris', - valueFormatter, - showMark: true, - }, - { - dataKey: 'newYork', - curve: 'linear', - label: 'New York', - valueFormatter, - showMark: true, - }, - ]} - margin={10} - height={300} - grid={{ rotation: true, radius: true }} - axisHighlight={{ rotation: rotationHighlight, radius: radiusHighlight }} - /> -
- - - scale type - - } label="Band" /> - } label="Point" /> - } label="Linear" /> - - - - rotation highlight - - } label="None" /> - } label="Line" /> - } label="Band" /> - - - - radius highlight - - } label="None" /> - } label="Line" /> - - - -
- ); -} diff --git a/docs/data/charts/radial-axes/RadialGridPlayground.js b/docs/data/charts/radial-axes/RadialGridPlayground.js deleted file mode 100644 index 5f9152bce2473..0000000000000 --- a/docs/data/charts/radial-axes/RadialGridPlayground.js +++ /dev/null @@ -1,81 +0,0 @@ -import Box from '@mui/material/Box'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { ChartsLayerContainer } from '@mui/x-charts/ChartsLayerContainer'; -import { ChartsSvgLayer } from '@mui/x-charts/ChartsSvgLayer'; -import { ChartsRadialGrid } from '@mui/x-charts/ChartsRadialGrid'; -import { ChartsRadialDataProvider } from '@mui/x-charts/ChartsRadialDataProvider'; - -export default function RadialGridPlayground() { - return ( - ( - - - - - - - - - - )} - getCode={({ props }) => ` - -`} - /> - ); -} diff --git a/docs/data/charts/radial-axes/RadiusAxisPercentage.js b/docs/data/charts/radial-axes/RadiusAxisPercentage.js deleted file mode 100644 index b595ea58ce23b..0000000000000 --- a/docs/data/charts/radial-axes/RadiusAxisPercentage.js +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; - -const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']; - -const series = [ - { data: [3, 5, 7, 12, 15, 18], label: 'Series A', stack: 'a' }, - { data: [12, 15, 18, 16, 13, 6], label: 'Series B', stack: 'a' }, -]; - -const sizes = [320, 200]; - -function Showcase({ minRadius }) { - return ( - - {sizes.map((size) => ( - - ))} - - ); -} - -export default function RadiusAxisPercentage() { - return ( - -
- - {'minRadius: 50 — fixed pixels, the hole stays the same size'} - - -
-
- - {"minRadius: '40%' — scales with the chart"} - - -
-
- ); -} diff --git a/docs/data/charts/radial-axes/RadiusAxisPercentage.tsx.preview b/docs/data/charts/radial-axes/RadiusAxisPercentage.tsx.preview deleted file mode 100644 index a1a7569063b12..0000000000000 --- a/docs/data/charts/radial-axes/RadiusAxisPercentage.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ -
- - {'minRadius: 50 — fixed pixels, the hole stays the same size'} - - -
-
- - {"minRadius: '40%' — scales with the chart"} - - -
\ No newline at end of file diff --git a/docs/data/charts/radial-axes/RadiusAxisPlayground.js b/docs/data/charts/radial-axes/RadiusAxisPlayground.js deleted file mode 100644 index 03ff0c971e8a9..0000000000000 --- a/docs/data/charts/radial-axes/RadiusAxisPlayground.js +++ /dev/null @@ -1,124 +0,0 @@ -import Box from '@mui/material/Box'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { ChartsLayerContainer } from '@mui/x-charts/ChartsLayerContainer'; -import { ChartsSvgLayer } from '@mui/x-charts/ChartsSvgLayer'; -import { ChartsRadialGrid } from '@mui/x-charts/ChartsRadialGrid'; -import { ChartsRadiusAxis } from '@mui/x-charts/ChartsRadiusAxis'; -import { ChartsRadialDataProvider } from '@mui/x-charts/ChartsRadialDataProvider'; - -export default function RadiusAxisPlayground() { - return ( - ( - - - - - - - - - - - )} - getCode={({ props }) => ` ` ${line}`) - .join('\n')} - }]} -> - - -`} - /> - ); -} diff --git a/docs/data/charts/radial-axes/RotationAxisPlayground.js b/docs/data/charts/radial-axes/RotationAxisPlayground.js deleted file mode 100644 index 1c6681f0caebd..0000000000000 --- a/docs/data/charts/radial-axes/RotationAxisPlayground.js +++ /dev/null @@ -1,123 +0,0 @@ -import Box from '@mui/material/Box'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { ChartsLayerContainer } from '@mui/x-charts/ChartsLayerContainer'; -import { ChartsSvgLayer } from '@mui/x-charts/ChartsSvgLayer'; -import { ChartsRadialGrid } from '@mui/x-charts/ChartsRadialGrid'; -import { ChartsRotationAxis } from '@mui/x-charts/ChartsRotationAxis'; -import { ChartsRadialDataProvider } from '@mui/x-charts/ChartsRadialDataProvider'; - -export default function RotationAxisPlayground() { - return ( - ( - - - - - - - - - - - )} - getCode={({ props }) => ` ` ${line}`) - .join('\n')} - }]} - radiusAxis={[{ - minRadius: ${props.minRadius}, - maxRadius: ${props.maxRadius}, - }]} -> - - -`} - /> - ); -} diff --git a/docs/data/charts/radial-axes/demos/band-highlight/BandHighlight.tsx b/docs/data/charts/radial-axes/demos/band-highlight/BandHighlight.tsx new file mode 100644 index 0000000000000..79fe73fd812fc --- /dev/null +++ b/docs/data/charts/radial-axes/demos/band-highlight/BandHighlight.tsx @@ -0,0 +1,127 @@ +import * as React from 'react'; +import FormControl from '@mui/material/FormControl'; +import FormLabel from '@mui/material/FormLabel'; +import RadioGroup from '@mui/material/RadioGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Radio from '@mui/material/Radio'; +import Stack from '@mui/material/Stack'; +import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; +import { dataset, valueFormatter } from '../../../dataset/weather'; + +export default function BandHighlight() { + // @focus-start @padding 1 + const [scaleType, setScaleType] = React.useState<'band' | 'point' | 'linear'>( + 'point', + ); + const [rotationHighlight, setRotationHighlight] = React.useState< + 'band' | 'none' | 'line' + >('band'); + const [radiusHighlight, setRadiusHighlight] = React.useState<'none' | 'line'>( + 'none', + ); + + const handleChange = + (direction: 'rotation' | 'radius' | 'scaleType') => + (event: React.ChangeEvent) => { + if (direction === 'rotation') { + setRotationHighlight( + (event.target as HTMLInputElement).value as 'band' | 'none' | 'line', + ); + } + if (direction === 'radius') { + setRadiusHighlight( + (event.target as HTMLInputElement).value as 'none' | 'line', + ); + } + if (direction === 'scaleType') { + setScaleType( + (event.target as HTMLInputElement).value as 'band' | 'point' | 'linear', + ); + } + }; + + return ( + +
+ ({ ...item, month: index + 1 })) + : dataset + } + radiusAxis={[{ minRadius: 10, min: 0 }]} + rotationAxis={[{ dataKey: 'month', scaleType }]} + series={[ + { + dataKey: 'london', + curve: 'linear', + label: 'London', + valueFormatter, + showMark: true, + }, + { + dataKey: 'paris', + curve: 'linear', + label: 'Paris', + valueFormatter, + showMark: true, + }, + { + dataKey: 'newYork', + curve: 'linear', + label: 'New York', + valueFormatter, + showMark: true, + }, + ]} + margin={10} + height={300} + grid={{ rotation: true, radius: true }} + axisHighlight={{ rotation: rotationHighlight, radius: radiusHighlight }} + /> +
+ + + scale type + + } label="Band" /> + } label="Point" /> + } label="Linear" /> + + + + rotation highlight + + } label="None" /> + } label="Line" /> + } label="Band" /> + + + + radius highlight + + } label="None" /> + } label="Line" /> + + + +
+ ); + // @focus-end +} diff --git a/docs/data/charts/radial-axes/demos/band-highlight/client.ts b/docs/data/charts/radial-axes/demos/band-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-axes/demos/band-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-axes/demos/band-highlight/index.ts b/docs/data/charts/radial-axes/demos/band-highlight/index.ts new file mode 100644 index 0000000000000..64f303920e7f0 --- /dev/null +++ b/docs/data/charts/radial-axes/demos/band-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BandHighlight from './BandHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BandHighlight, { ClientProvider }); diff --git a/docs/data/charts/radial-axes/RadialGridPlayground.tsx b/docs/data/charts/radial-axes/demos/radial-grid-playground/RadialGridPlayground.tsx similarity index 98% rename from docs/data/charts/radial-axes/RadialGridPlayground.tsx rename to docs/data/charts/radial-axes/demos/radial-grid-playground/RadialGridPlayground.tsx index 76c8f51405138..808e3deac881b 100644 --- a/docs/data/charts/radial-axes/RadialGridPlayground.tsx +++ b/docs/data/charts/radial-axes/demos/radial-grid-playground/RadialGridPlayground.tsx @@ -7,6 +7,7 @@ import { ChartsRadialDataProvider } from '@mui/x-charts/ChartsRadialDataProvider export default function RadialGridPlayground() { return ( + // @focus-start @padding 2 `} /> + // @focus-end ); } diff --git a/docs/data/charts/radial-axes/demos/radial-grid-playground/client.ts b/docs/data/charts/radial-axes/demos/radial-grid-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-axes/demos/radial-grid-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-axes/demos/radial-grid-playground/index.ts b/docs/data/charts/radial-axes/demos/radial-grid-playground/index.ts new file mode 100644 index 0000000000000..dc0f13894ec3f --- /dev/null +++ b/docs/data/charts/radial-axes/demos/radial-grid-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadialGridPlayground from './RadialGridPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadialGridPlayground, { ClientProvider }); diff --git a/docs/data/charts/radial-axes/RadiusAxisPercentage.tsx b/docs/data/charts/radial-axes/demos/radius-axis-percentage/RadiusAxisPercentage.tsx similarity index 96% rename from docs/data/charts/radial-axes/RadiusAxisPercentage.tsx rename to docs/data/charts/radial-axes/demos/radius-axis-percentage/RadiusAxisPercentage.tsx index f52dab1420449..1af581f871f91 100644 --- a/docs/data/charts/radial-axes/RadiusAxisPercentage.tsx +++ b/docs/data/charts/radial-axes/demos/radius-axis-percentage/RadiusAxisPercentage.tsx @@ -38,6 +38,7 @@ function Showcase({ minRadius }: { minRadius: number | string }) { export default function RadiusAxisPercentage() { return ( + {/* @focus-start */}
{'minRadius: 50 — fixed pixels, the hole stays the same size'} @@ -50,6 +51,7 @@ export default function RadiusAxisPercentage() {
+ {/* @focus-end */}
); } diff --git a/docs/data/charts/radial-axes/demos/radius-axis-percentage/client.ts b/docs/data/charts/radial-axes/demos/radius-axis-percentage/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-axes/demos/radius-axis-percentage/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-axes/demos/radius-axis-percentage/index.ts b/docs/data/charts/radial-axes/demos/radius-axis-percentage/index.ts new file mode 100644 index 0000000000000..a6fcdec3a8ac3 --- /dev/null +++ b/docs/data/charts/radial-axes/demos/radius-axis-percentage/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadiusAxisPercentage from './RadiusAxisPercentage'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadiusAxisPercentage, { ClientProvider }); diff --git a/docs/data/charts/radial-axes/RadiusAxisPlayground.tsx b/docs/data/charts/radial-axes/demos/radius-axis-playground/RadiusAxisPlayground.tsx similarity index 98% rename from docs/data/charts/radial-axes/RadiusAxisPlayground.tsx rename to docs/data/charts/radial-axes/demos/radius-axis-playground/RadiusAxisPlayground.tsx index 35769b04dab1d..7604ed474d8e1 100644 --- a/docs/data/charts/radial-axes/RadiusAxisPlayground.tsx +++ b/docs/data/charts/radial-axes/demos/radius-axis-playground/RadiusAxisPlayground.tsx @@ -8,6 +8,7 @@ import { ChartsRadialDataProvider } from '@mui/x-charts/ChartsRadialDataProvider export default function RadiusAxisPlayground() { return ( + // @focus-start @padding 2 `} /> + // @focus-end ); } diff --git a/docs/data/charts/radial-axes/demos/radius-axis-playground/client.ts b/docs/data/charts/radial-axes/demos/radius-axis-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-axes/demos/radius-axis-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-axes/demos/radius-axis-playground/index.ts b/docs/data/charts/radial-axes/demos/radius-axis-playground/index.ts new file mode 100644 index 0000000000000..9c8c9144dfa95 --- /dev/null +++ b/docs/data/charts/radial-axes/demos/radius-axis-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadiusAxisPlayground from './RadiusAxisPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadiusAxisPlayground, { ClientProvider }); diff --git a/docs/data/charts/radial-axes/RotationAxisPlayground.tsx b/docs/data/charts/radial-axes/demos/rotation-axis-playground/RotationAxisPlayground.tsx similarity index 98% rename from docs/data/charts/radial-axes/RotationAxisPlayground.tsx rename to docs/data/charts/radial-axes/demos/rotation-axis-playground/RotationAxisPlayground.tsx index c33c290b576ba..d477280b27bb5 100644 --- a/docs/data/charts/radial-axes/RotationAxisPlayground.tsx +++ b/docs/data/charts/radial-axes/demos/rotation-axis-playground/RotationAxisPlayground.tsx @@ -8,6 +8,7 @@ import { ChartsRadialDataProvider } from '@mui/x-charts/ChartsRadialDataProvider export default function RotationAxisPlayground() { return ( + // @focus-start @padding 2 `} /> + // @focus-end ); } diff --git a/docs/data/charts/radial-axes/demos/rotation-axis-playground/client.ts b/docs/data/charts/radial-axes/demos/rotation-axis-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-axes/demos/rotation-axis-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-axes/demos/rotation-axis-playground/index.ts b/docs/data/charts/radial-axes/demos/rotation-axis-playground/index.ts new file mode 100644 index 0000000000000..12b79cffaf43d --- /dev/null +++ b/docs/data/charts/radial-axes/demos/rotation-axis-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RotationAxisPlayground from './RotationAxisPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RotationAxisPlayground, { ClientProvider }); diff --git a/docs/data/charts/radial-axes/radial-axes.md b/docs/data/charts/radial-axes/radial-axes.md index 95fba8a8db2d2..5274633e4bbc5 100644 --- a/docs/data/charts/radial-axes/radial-axes.md +++ b/docs/data/charts/radial-axes/radial-axes.md @@ -21,7 +21,7 @@ This component accepts two boolean props `rotation` and `radius` to display grid Use the `chartsRadialGridClasses` to modify the style of this component. -{{"demo": "RadialGridPlayground.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/radial-grid-playground/index.ts", "hideToolbar": true, "bg": "playground"}} ## Axes @@ -57,7 +57,7 @@ It can be set to - `'end'`: Place the axis at the `endAngle` of the rotation axis. - `number`: The angle in degree where to plot the axis. -{{"demo": "RadiusAxisPlayground.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/radius-axis-playground/index.ts", "hideToolbar": true, "bg": "playground"}} #### Radius extent @@ -79,7 +79,7 @@ Percentage values scale with the chart, which keeps the proportions consistent a ``` -{{"demo": "RadiusAxisPercentage.js"}} +{{"component": "file://./demos/radius-axis-percentage/index.ts"}} ### Rotation axis @@ -91,7 +91,7 @@ It can be set to - `'outside'`: Place the axis at the `maxRadius` of the radius axis. Places labels and ticks outside by default. - `'inside'`: Place the axis at the `minRadius` of the radius axis. Places labels and ticks inside by default. -{{"demo": "RotationAxisPlayground.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/rotation-axis-playground/index.ts", "hideToolbar": true, "bg": "playground"}} ## Axis highlight @@ -116,4 +116,4 @@ Or the component when using composition: /> ``` -{{"demo": "BandHighlight.js", "bg": "outline"}} +{{"component": "file://./demos/band-highlight/index.ts", "bg": "outline"}} diff --git a/docs/data/charts/radial-bars/BasicRadialBarChart.js b/docs/data/charts/radial-bars/BasicRadialBarChart.js deleted file mode 100644 index f0def74433b02..0000000000000 --- a/docs/data/charts/radial-bars/BasicRadialBarChart.js +++ /dev/null @@ -1,49 +0,0 @@ -import * as React from 'react'; -import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; - -const months = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec', -]; - -const highlightScope = { highlight: 'item', fade: 'global' }; - -export default function BasicRadialBarChart() { - return ( - - ); -} diff --git a/docs/data/charts/radial-bars/HealthRadialBarChart.js b/docs/data/charts/radial-bars/HealthRadialBarChart.js deleted file mode 100644 index 208f78c539953..0000000000000 --- a/docs/data/charts/radial-bars/HealthRadialBarChart.js +++ /dev/null @@ -1,63 +0,0 @@ -import * as React from 'react'; -import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; - -const healthData = [ - { metric: 'Water', value: 5, goal: 8, color: '#00bcd4' }, - { metric: 'Sleep', value: 6.5, goal: 8, color: '#3f51b5' }, - { metric: 'Calories', value: 540, goal: 700, color: '#ff9800' }, - { metric: 'Activity', value: 42, goal: 60, color: '#4caf50' }, - { metric: 'Steps', value: 8200, goal: 10000, color: '#e91e63' }, -]; - -const dataset = healthData.map((d) => ({ - metric: d.metric, - progress: Math.round((d.value / d.goal) * 100), -})); - -const highlightScope = { highlight: 'none', fade: 'none' }; - -export default function HealthRadialBarChart() { - return ( - `${value}%`, - }, - ]} - radiusAxis={[ - { - scaleType: 'band', - dataKey: 'metric', - categoryGapRatio: 0.3, - disableLine: true, - disableTicks: true, - colorMap: { - type: 'ordinal', - values: healthData.map((d) => d.metric), - colors: healthData.map((d) => d.color), - }, - }, - ]} - rotationAxis={[ - { - scaleType: 'linear', - disableTickLabel: true, - disableLine: true, - disableTicks: true, - min: 0, - max: 100, - valueFormatter: (value) => `${value}%`, - }, - ]} - axisHighlight={{ rotation: 'none', radius: 'none' }} - hideLegend - slotProps={{ tooltip: { trigger: 'none' } }} - /> - ); -} diff --git a/docs/data/charts/radial-bars/RadialBarClick.js b/docs/data/charts/radial-bars/RadialBarClick.js deleted file mode 100644 index f6105ec431839..0000000000000 --- a/docs/data/charts/radial-bars/RadialBarClick.js +++ /dev/null @@ -1,133 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; - -const highlightScope = { highlight: 'item' }; - -const series = [ - { - id: 'series-1', - data: [3, 4, 1, 6, 5], - label: 'A', - stack: 'total', - highlightScope, - }, - { - id: 'series-2', - data: [4, 3, 1, 5, 8], - label: 'B', - stack: 'total', - highlightScope, - }, - { - id: 'series-3', - data: [4, 2, 5, 4, 1], - label: 'C', - highlightScope, - }, -]; - -const bandAxis = { - data: ['0', '3', '6', '9', '12'], - id: 'axis1', - scaleType: 'band', - disableLine: true, - disableTicks: true, -}; - -const valueAxis = { - tickLabelPosition: 'center', - disableLine: true, - disableTicks: true, -}; - -const getRadialChartParams = (layout) => ({ - series: series.map((s) => ({ ...s, layout })), - rotationAxis: [ - layout === 'vertical' ? bandAxis : { ...valueAxis, tickLabelPosition: 'after' }, - ], - radiusAxis: [layout === 'vertical' ? valueAxis : bandAxis], - grid: { rotation: true, radius: true }, - height: 400, -}); - -export default function RadialBarClick() { - const [itemData, setItemData] = React.useState(); - const [axisData, setAxisData] = React.useState(); - const [layout, setLayout] = React.useState('vertical'); - - return ( - - - { - if (newLayout !== null) { - setLayout(newLayout); - } - }} - aria-label="chart layout" - > - - vertical - - - horizontal - - - - setItemData(d)} - onAxisClick={(event, d) => setAxisData(d)} - /> - - - - - - Click on the chart - { - setItemData(undefined); - setAxisData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/radial-bars/RadialBarConfig.js b/docs/data/charts/radial-bars/RadialBarConfig.js deleted file mode 100644 index ab22c2284fcca..0000000000000 --- a/docs/data/charts/radial-bars/RadialBarConfig.js +++ /dev/null @@ -1,125 +0,0 @@ -import * as React from 'react'; -import Typography from '@mui/material/Typography'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; -import { balanceSheet, addLabels } from '../bars/netflixsBalanceSheet'; - -const baseSeries = addLabels([ - { dataKey: 'totAss' }, - { dataKey: 'totLia' }, - { dataKey: 'totEq' }, -]); - -export default function RadialBarConfig() { - return ( - { - const series = baseSeries.map((s, index) => ({ - ...s, - layout: props.layout, - ...(props.stack && index > 0 ? { stack: 'passive' } : {}), - })); - - const bandAxis = { - dataKey: 'year', - scaleType: 'band', - categoryGapRatio: props.categoryGapRatio, - barGapRatio: props.barGapRatio, - }; - - return ( -
- Netflix balance sheet - -
- ); - }} - getCode={({ props }) => { - const stackProp = props.stack ? `, stack: 'passive'` : ''; - const bandAxis = `[ - { - scaleType: 'band', - data: ['2020', '2021', '2022', '2023'], - categoryGapRatio: ${props.categoryGapRatio}, - barGapRatio: ${props.barGapRatio}, - }, - ]`; - return `import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; - -`; - }} - /> - ); -} diff --git a/docs/data/charts/radial-bars/TrustRadialBarChart.js b/docs/data/charts/radial-bars/TrustRadialBarChart.js deleted file mode 100644 index 76fbbecf4ac71..0000000000000 --- a/docs/data/charts/radial-bars/TrustRadialBarChart.js +++ /dev/null @@ -1,93 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Link from '@mui/material/Link'; -import Typography from '@mui/material/Typography'; -import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; -import { europeanYouthTrust } from '../dataset/europeanYouthTrust'; -import { - EuAverageRing, - PreviousTrustData, - TrustLegend, - TrustTooltip, -} from './trustRadialBarChartComponents'; - -const COLOR_2025 = '#1976d2'; -const COLOR_2013 = '#d32f2f'; - -const trustFormatter = (value) => (value == null ? '' : `${value.toFixed(1)} / 10`); - -const highlightScope = { highlight: 'item', fade: 'none' }; - -export default function TrustRadialBarChart() { - return ( -
- - Trust in others across Europe - - - Average rating (0–10), 2013 vs 2025 - - - - - - - - - - - - Source:{' '} - - Eurostat - - -
- ); -} diff --git a/docs/data/charts/radial-bars/BasicRadialBarChart.tsx b/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/BasicRadialBarChart.tsx similarity index 95% rename from docs/data/charts/radial-bars/BasicRadialBarChart.tsx rename to docs/data/charts/radial-bars/demos/basic-radial-bar-chart/BasicRadialBarChart.tsx index 8de63d5b0459a..c7d4dc8d61b19 100644 --- a/docs/data/charts/radial-bars/BasicRadialBarChart.tsx +++ b/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/BasicRadialBarChart.tsx @@ -19,6 +19,7 @@ const highlightScope = { highlight: 'item', fade: 'global' } as const; export default function BasicRadialBarChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/client.ts b/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/index.ts b/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/index.ts new file mode 100644 index 0000000000000..e9d37b22faa7f --- /dev/null +++ b/docs/data/charts/radial-bars/demos/basic-radial-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicRadialBarChart from './BasicRadialBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicRadialBarChart, { ClientProvider }); diff --git a/docs/data/charts/radial-bars/HealthRadialBarChart.tsx b/docs/data/charts/radial-bars/demos/health-radial-bar-chart/HealthRadialBarChart.tsx similarity index 97% rename from docs/data/charts/radial-bars/HealthRadialBarChart.tsx rename to docs/data/charts/radial-bars/demos/health-radial-bar-chart/HealthRadialBarChart.tsx index 3ba9d32cdcdaa..bd1ecfc22821c 100644 --- a/docs/data/charts/radial-bars/HealthRadialBarChart.tsx +++ b/docs/data/charts/radial-bars/demos/health-radial-bar-chart/HealthRadialBarChart.tsx @@ -18,6 +18,7 @@ const highlightScope = { highlight: 'none', fade: 'none' } as const; export default function HealthRadialBarChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radial-bars/demos/health-radial-bar-chart/client.ts b/docs/data/charts/radial-bars/demos/health-radial-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-bars/demos/health-radial-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-bars/demos/health-radial-bar-chart/index.ts b/docs/data/charts/radial-bars/demos/health-radial-bar-chart/index.ts new file mode 100644 index 0000000000000..31fbdb8ae298e --- /dev/null +++ b/docs/data/charts/radial-bars/demos/health-radial-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import HealthRadialBarChart from './HealthRadialBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, HealthRadialBarChart, { ClientProvider }); diff --git a/docs/data/charts/radial-bars/RadialBarClick.tsx b/docs/data/charts/radial-bars/demos/radial-bar-click/RadialBarClick.tsx similarity index 91% rename from docs/data/charts/radial-bars/RadialBarClick.tsx rename to docs/data/charts/radial-bars/demos/radial-bar-click/RadialBarClick.tsx index d62bb90a0abbb..f0cb89a4744e3 100644 --- a/docs/data/charts/radial-bars/RadialBarClick.tsx +++ b/docs/data/charts/radial-bars/demos/radial-bar-click/RadialBarClick.tsx @@ -4,13 +4,11 @@ import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import IconButton from '@mui/material/IconButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { - RadialBarChart, - RadialBarSeries, -} from '@mui/x-charts-premium/RadialBarChart'; +import type { RadialBarSeries } from '@mui/x-charts-premium/RadialBarChart'; +import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { ChartsAxisData } from '@mui/x-charts/models'; -import { RadialBarItemIdentifier } from '@mui/x-charts-premium/models'; +import type { ChartsAxisData } from '@mui/x-charts/models'; +import type { RadialBarItemIdentifier } from '@mui/x-charts-premium/models'; import ToggleButton from '@mui/material/ToggleButton'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; @@ -66,6 +64,7 @@ const getRadialChartParams = (layout: 'vertical' | 'horizontal') => ({ }); export default function RadialBarClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); const [axisData, setAxisData] = React.useState(); const [layout, setLayout] = React.useState<'vertical' | 'horizontal'>('vertical'); @@ -136,4 +135,5 @@ ${axisData ? JSON.stringify(axisData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/radial-bars/demos/radial-bar-click/client.ts b/docs/data/charts/radial-bars/demos/radial-bar-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-bars/demos/radial-bar-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-bars/demos/radial-bar-click/index.ts b/docs/data/charts/radial-bars/demos/radial-bar-click/index.ts new file mode 100644 index 0000000000000..915884d94546a --- /dev/null +++ b/docs/data/charts/radial-bars/demos/radial-bar-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadialBarClick from './RadialBarClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadialBarClick, { ClientProvider }); diff --git a/docs/data/charts/radial-bars/RadialBarConfig.tsx b/docs/data/charts/radial-bars/demos/radial-bar-config/RadialBarConfig.tsx similarity index 96% rename from docs/data/charts/radial-bars/RadialBarConfig.tsx rename to docs/data/charts/radial-bars/demos/radial-bar-config/RadialBarConfig.tsx index 252eb79578009..cd1161976cf25 100644 --- a/docs/data/charts/radial-bars/RadialBarConfig.tsx +++ b/docs/data/charts/radial-bars/demos/radial-bar-config/RadialBarConfig.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import Typography from '@mui/material/Typography'; import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; -import { balanceSheet, addLabels } from '../bars/netflixsBalanceSheet'; +import { balanceSheet, addLabels } from '../../../bars/netflixsBalanceSheet'; const baseSeries = addLabels([ { dataKey: 'totAss' }, @@ -12,6 +12,7 @@ const baseSeries = addLabels([ export default function RadialBarConfig() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/radial-bars/demos/radial-bar-config/client.ts b/docs/data/charts/radial-bars/demos/radial-bar-config/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-bars/demos/radial-bar-config/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-bars/demos/radial-bar-config/index.ts b/docs/data/charts/radial-bars/demos/radial-bar-config/index.ts new file mode 100644 index 0000000000000..9887ef6032e63 --- /dev/null +++ b/docs/data/charts/radial-bars/demos/radial-bar-config/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadialBarConfig from './RadialBarConfig'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadialBarConfig, { ClientProvider }); diff --git a/docs/data/charts/radial-bars/TrustRadialBarChart.tsx b/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/TrustRadialBarChart.tsx similarity index 93% rename from docs/data/charts/radial-bars/TrustRadialBarChart.tsx rename to docs/data/charts/radial-bars/demos/trust-radial-bar-chart/TrustRadialBarChart.tsx index 852a84e4d5fd5..6e9e1fe4f2fe0 100644 --- a/docs/data/charts/radial-bars/TrustRadialBarChart.tsx +++ b/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/TrustRadialBarChart.tsx @@ -3,13 +3,13 @@ import Box from '@mui/material/Box'; import Link from '@mui/material/Link'; import Typography from '@mui/material/Typography'; import { RadialBarChart } from '@mui/x-charts-premium/RadialBarChart'; -import { europeanYouthTrust } from '../dataset/europeanYouthTrust'; +import { europeanYouthTrust } from '../../../dataset/europeanYouthTrust'; import { EuAverageRing, PreviousTrustData, TrustLegend, TrustTooltip, -} from './trustRadialBarChartComponents'; +} from '../../trustRadialBarChartComponents'; const COLOR_2025 = '#1976d2'; const COLOR_2013 = '#d32f2f'; @@ -22,6 +22,7 @@ const highlightScope = { highlight: 'item', fade: 'none' } as const; export default function TrustRadialBarChart() { return (
+ {/* @focus-start */} Trust in others across Europe @@ -89,6 +90,7 @@ export default function TrustRadialBarChart() { Eurostat + {/* @focus-end */}
); } diff --git a/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/client.ts b/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/index.ts b/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/index.ts new file mode 100644 index 0000000000000..b5e5d50f0cc05 --- /dev/null +++ b/docs/data/charts/radial-bars/demos/trust-radial-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TrustRadialBarChart from './TrustRadialBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TrustRadialBarChart, { ClientProvider }); diff --git a/docs/data/charts/radial-bars/radial-bars.md b/docs/data/charts/radial-bars/radial-bars.md index 98a406e6729e6..686cbacc50b8b 100644 --- a/docs/data/charts/radial-bars/radial-bars.md +++ b/docs/data/charts/radial-bars/radial-bars.md @@ -15,14 +15,14 @@ This circular layout reads naturally for periodic or cyclic data—months, hours The chart below compares average trust in others (people aged 16 and over) across Europe between 2013 and 2025. -{{"demo": "TrustRadialBarChart.js" }} +{{"component": "file://./demos/trust-radial-bar-chart/index.ts"}} ## Basics The `RadialBarChart` is similar to the [`BarChart`](/x/react-charts/bars/) but uses polar coordinates. The `xAxis` and `yAxis` being replaced by the `rotationAxis` and `radiusAxis`. -{{"demo": "BasicRadialBarChart.js", "bg": "outline"}} +{{"component": "file://./demos/basic-radial-bar-chart/index.ts", "bg": "outline"}} ## Common display options @@ -34,7 +34,7 @@ The radial bar chart accepts the same display options as the [bar chart](/x/reac The demo below demonstrates those options. -{{"demo": "RadialBarConfig.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/radial-bar-config/index.ts", "hideToolbar": true, "bg": "playground"}} ## Coloring each bar @@ -43,7 +43,7 @@ The only difference is that the cartesian `x` and `y` axes are replaced by the ` The demo below sets an `'ordinal'` color map on the `radiusAxis` to build a health dashboard where every metric ring tracks progress toward its goal. -{{"demo": "HealthRadialBarChart.js", "bg": "outline"}} +{{"component": "file://./demos/health-radial-bar-chart/index.ts", "bg": "outline"}} ## Click events @@ -61,7 +61,7 @@ const clickHandler = ( ) => {}; ``` -{{"demo": "RadialBarClick.js"}} +{{"component": "file://./demos/radial-bar-click/index.ts"}} :::info There is a slight difference between the `event` of `onItemClick` and `onAxisClick`: diff --git a/docs/data/charts/radial-lines/BasicRadialLineChart.js b/docs/data/charts/radial-lines/BasicRadialLineChart.js deleted file mode 100644 index e41143bf17755..0000000000000 --- a/docs/data/charts/radial-lines/BasicRadialLineChart.js +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; -import { dataset } from '../dataset/weather'; - -export default function BasicRadialLineChart() { - return ( - - ); -} diff --git a/docs/data/charts/radial-lines/BasicRadialLineChart.tsx.preview b/docs/data/charts/radial-lines/BasicRadialLineChart.tsx.preview deleted file mode 100644 index 2ebb8ccb2cac3..0000000000000 --- a/docs/data/charts/radial-lines/BasicRadialLineChart.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/radial-lines/ClosedOpenRadialLineChart.js b/docs/data/charts/radial-lines/ClosedOpenRadialLineChart.js deleted file mode 100644 index 0ede06b70a1d0..0000000000000 --- a/docs/data/charts/radial-lines/ClosedOpenRadialLineChart.js +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; - -const months = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec', -]; - -export default function ClosedOpenRadialLineChart() { - const [area, setArea] = React.useState(false); - const [closePath, setClosePath] = React.useState(true); - - return ( - - - setArea(event.target.checked)} />} - label="area" - labelPlacement="end" - /> - setClosePath(event.target.checked)} /> - } - label="closePath" - labelPlacement="end" - /> - - - - ); -} diff --git a/docs/data/charts/radial-lines/ContinuousRadialLineChart.js b/docs/data/charts/radial-lines/ContinuousRadialLineChart.js deleted file mode 100644 index 75411791287f5..0000000000000 --- a/docs/data/charts/radial-lines/ContinuousRadialLineChart.js +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from 'react'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; - -const SAMPLES = 200; -const angles = Array.from( - { length: SAMPLES + 1 }, - (_, i) => (i * 2 * Math.PI) / SAMPLES, -); - -const cardioid = angles.map((angle) => 100 * (1 + Math.cos(angle * 3))); - -export default function ContinuousRadialLineChart() { - return ( - (value == null ? '' : `${Math.round(value)}`), - }, - ]} - rotationAxis={[ - { - data: angles, - domainLimit: () => ({ min: 0, max: 2 * Math.PI }), - tickInterval: [0, Math.PI / 2, Math.PI, (3 * Math.PI) / 2, 2 * Math.PI], - valueFormatter: (value) => `${Math.round((value * 180) / Math.PI)}°`, - }, - ]} - radiusAxis={[{ position: 'none' }]} - grid={{ rotation: true, radius: true }} - /> - ); -} diff --git a/docs/data/charts/radial-lines/ElementHighlights.js b/docs/data/charts/radial-lines/ElementHighlights.js deleted file mode 100644 index 651d8f0ad1357..0000000000000 --- a/docs/data/charts/radial-lines/ElementHighlights.js +++ /dev/null @@ -1,103 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; - -const params = { - series: [ - { - data: [3, 4, 1, 6, 5], - label: 'A', - area: false, - stack: 'total', - }, - { data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' }, - { - data: [4, 2, 5, 4, 1], - label: 'C', - area: false, - stack: 'total', - }, - ], - rotationAxis: [ - { - scaleType: 'point', - data: [1, 2, 3, 4, 5], - position: 'none', - }, - ], - radiusAxis: [{ position: 'none' }], - height: 400, - grid: { rotation: true, radius: true }, -}; - -export default function ElementHighlights() { - const [withArea, setWithArea] = React.useState(false); - const [highlight, setHighlight] = React.useState('item'); - const [fade, setFade] = React.useState('global'); - - return ( - - - ({ - ...series, - area: withArea, - highlightScope: { - highlight, - fade, - }, - }))} - /> - - - setHighlight(event.target.value)} - sx={{ minWidth: 150 }} - > - none - item - series - - setFade(event.target.value)} - sx={{ minWidth: 150 }} - > - none - series - global - - - setWithArea(event.target.checked)} - /> - } - label="Fill line area" - /> - - - ); -} diff --git a/docs/data/charts/radial-lines/ElementHighlights.tsx b/docs/data/charts/radial-lines/ElementHighlights.tsx deleted file mode 100644 index 81e08b06ada0c..0000000000000 --- a/docs/data/charts/radial-lines/ElementHighlights.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; - -type HighlightOptions = 'none' | 'item' | 'series'; -type FadeOptions = 'none' | 'series' | 'global'; - -const params = { - series: [ - { - data: [3, 4, 1, 6, 5], - label: 'A', - area: false, - stack: 'total', - }, - { data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' }, - { - data: [4, 2, 5, 4, 1], - label: 'C', - area: false, - stack: 'total', - }, - ], - rotationAxis: [ - { - scaleType: 'point' as const, - data: [1, 2, 3, 4, 5], - position: 'none' as const, - }, - ], - radiusAxis: [{ position: 'none' as const }], - height: 400, - grid: { rotation: true, radius: true }, -}; - -export default function ElementHighlights() { - const [withArea, setWithArea] = React.useState(false); - const [highlight, setHighlight] = React.useState('item'); - const [fade, setFade] = React.useState('global'); - - return ( - - - ({ - ...series, - area: withArea, - highlightScope: { - highlight, - fade, - }, - }))} - /> - - - setHighlight(event.target.value as HighlightOptions)} - sx={{ minWidth: 150 }} - > - none - item - series - - setFade(event.target.value as FadeOptions)} - sx={{ minWidth: 150 }} - > - none - series - global - - - setWithArea(event.target.checked)} - /> - } - label="Fill line area" - /> - - - ); -} diff --git a/docs/data/charts/radial-lines/RadialLineClick.js b/docs/data/charts/radial-lines/RadialLineClick.js deleted file mode 100644 index 56b6f6319d7bd..0000000000000 --- a/docs/data/charts/radial-lines/RadialLineClick.js +++ /dev/null @@ -1,103 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const highlightScope = { highlight: 'item' }; - -const series = [ - { - id: 'series-1', - data: [3, 4, 1, 6, 5], - label: 'A', - stack: 'total', - highlightScope, - }, - { - id: 'series-2', - data: [4, 3, 1, 5, 8], - label: 'B', - stack: 'total', - highlightScope, - }, - { - id: 'series-3', - data: [4, 2, 5, 4, 1], - label: 'C', - highlightScope, - }, -]; - -const radialChartParams = { - series, - rotationAxis: [ - { - data: [0, 3, 6, 9, 12], - id: 'axis1', - disableLine: true, - disableTicks: true, - }, - ], - radiusAxis: [{ position: 'none' }], - grid: { rotation: true, radius: true }, - height: 400, -}; - -export default function RadialLineClick() { - const [itemData, setItemData] = React.useState(); - const [axisData, setAxisData] = React.useState(); - - return ( - - - - setItemData(d)} - onAxisClick={(event, d) => setAxisData(d)} - /> - - - - - - Click on the chart - { - setItemData(undefined); - setAxisData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/radial-lines/RadialLineMarkShape.js b/docs/data/charts/radial-lines/RadialLineMarkShape.js deleted file mode 100644 index c39fe13f924a7..0000000000000 --- a/docs/data/charts/radial-lines/RadialLineMarkShape.js +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; -import { dataset } from '../dataset/weather'; - -const shapes = ['circle', 'square', 'diamond', 'cross', 'star', 'triangle', 'wye']; - -export default function RadialLineMarkShape() { - const [shape, setShape] = React.useState('circle'); - - return ( - - setShape(event.target.value)} - sx={{ minWidth: 150 }} - > - {shapes.map((option) => ( - - {option} - - ))} - - - - - - ); -} diff --git a/docs/data/charts/radial-lines/BasicRadialLineChart.tsx b/docs/data/charts/radial-lines/demos/basic-radial-line-chart/BasicRadialLineChart.tsx similarity index 85% rename from docs/data/charts/radial-lines/BasicRadialLineChart.tsx rename to docs/data/charts/radial-lines/demos/basic-radial-line-chart/BasicRadialLineChart.tsx index e41143bf17755..37a88e48e78b9 100644 --- a/docs/data/charts/radial-lines/BasicRadialLineChart.tsx +++ b/docs/data/charts/radial-lines/demos/basic-radial-line-chart/BasicRadialLineChart.tsx @@ -1,9 +1,10 @@ import * as React from 'react'; import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; -import { dataset } from '../dataset/weather'; +import { dataset } from '../../../dataset/weather'; export default function BasicRadialLineChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radial-lines/demos/basic-radial-line-chart/client.ts b/docs/data/charts/radial-lines/demos/basic-radial-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-lines/demos/basic-radial-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-lines/demos/basic-radial-line-chart/index.ts b/docs/data/charts/radial-lines/demos/basic-radial-line-chart/index.ts new file mode 100644 index 0000000000000..b6f885a1766ce --- /dev/null +++ b/docs/data/charts/radial-lines/demos/basic-radial-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicRadialLineChart from './BasicRadialLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicRadialLineChart, { ClientProvider }); diff --git a/docs/data/charts/radial-lines/ClosedOpenRadialLineChart.tsx b/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/ClosedOpenRadialLineChart.tsx similarity index 97% rename from docs/data/charts/radial-lines/ClosedOpenRadialLineChart.tsx rename to docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/ClosedOpenRadialLineChart.tsx index 0ede06b70a1d0..a28ddf6e2a8ff 100644 --- a/docs/data/charts/radial-lines/ClosedOpenRadialLineChart.tsx +++ b/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/ClosedOpenRadialLineChart.tsx @@ -21,6 +21,7 @@ const months = [ ]; export default function ClosedOpenRadialLineChart() { + // @focus-start @padding 1 const [area, setArea] = React.useState(false); const [closePath, setClosePath] = React.useState(true); @@ -58,4 +59,5 @@ export default function ClosedOpenRadialLineChart() { /> ); + // @focus-end } diff --git a/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/client.ts b/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/index.ts b/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/index.ts new file mode 100644 index 0000000000000..66a5da790155c --- /dev/null +++ b/docs/data/charts/radial-lines/demos/closed-open-radial-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ClosedOpenRadialLineChart from './ClosedOpenRadialLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ClosedOpenRadialLineChart, { ClientProvider }); diff --git a/docs/data/charts/radial-lines/ContinuousRadialLineChart.tsx b/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/ContinuousRadialLineChart.tsx similarity index 95% rename from docs/data/charts/radial-lines/ContinuousRadialLineChart.tsx rename to docs/data/charts/radial-lines/demos/continuous-radial-line-chart/ContinuousRadialLineChart.tsx index 48e48abe851e6..dbf2170a795a9 100644 --- a/docs/data/charts/radial-lines/ContinuousRadialLineChart.tsx +++ b/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/ContinuousRadialLineChart.tsx @@ -11,6 +11,7 @@ const cardioid = angles.map((angle) => 100 * (1 + Math.cos(angle * 3))); export default function ContinuousRadialLineChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/client.ts b/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/index.ts b/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/index.ts new file mode 100644 index 0000000000000..dbd60e0bb689a --- /dev/null +++ b/docs/data/charts/radial-lines/demos/continuous-radial-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ContinuousRadialLineChart from './ContinuousRadialLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ContinuousRadialLineChart, { ClientProvider }); diff --git a/docs/data/charts/radial-lines/demos/element-highlights/ElementHighlights.tsx b/docs/data/charts/radial-lines/demos/element-highlights/ElementHighlights.tsx new file mode 100644 index 0000000000000..1755dfd9323c9 --- /dev/null +++ b/docs/data/charts/radial-lines/demos/element-highlights/ElementHighlights.tsx @@ -0,0 +1,108 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import Box from '@mui/material/Box'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; + +type HighlightOptions = 'none' | 'item' | 'series'; +type FadeOptions = 'none' | 'series' | 'global'; + +const params = { + series: [ + { + data: [3, 4, 1, 6, 5], + label: 'A', + area: false, + stack: 'total', + }, + { data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' }, + { + data: [4, 2, 5, 4, 1], + label: 'C', + area: false, + stack: 'total', + }, + ], + rotationAxis: [ + { + scaleType: 'point' as const, + data: [1, 2, 3, 4, 5], + position: 'none' as const, + }, + ], + radiusAxis: [{ position: 'none' as const }], + height: 400, + grid: { rotation: true, radius: true }, +}; + +export default function ElementHighlights() { + // @focus-start @padding 1 + const [withArea, setWithArea] = React.useState(false); + const [highlight, setHighlight] = React.useState('item'); + const [fade, setFade] = React.useState('global'); + + return ( + + + ({ + ...series, + area: withArea, + highlightScope: { + highlight, + fade, + }, + }))} + /> + + + setHighlight(event.target.value as HighlightOptions)} + sx={{ minWidth: 150 }} + > + none + item + series + + setFade(event.target.value as FadeOptions)} + sx={{ minWidth: 150 }} + > + none + series + global + + + setWithArea(event.target.checked)} + /> + } + label="Fill line area" + /> + + + ); + // @focus-end +} diff --git a/docs/data/charts/radial-lines/demos/element-highlights/client.ts b/docs/data/charts/radial-lines/demos/element-highlights/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-lines/demos/element-highlights/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-lines/demos/element-highlights/index.ts b/docs/data/charts/radial-lines/demos/element-highlights/index.ts new file mode 100644 index 0000000000000..0b59dc2ef94e8 --- /dev/null +++ b/docs/data/charts/radial-lines/demos/element-highlights/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ElementHighlights from './ElementHighlights'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ElementHighlights, { ClientProvider }); diff --git a/docs/data/charts/radial-lines/RadialLineClick.tsx b/docs/data/charts/radial-lines/demos/radial-line-click/RadialLineClick.tsx similarity index 88% rename from docs/data/charts/radial-lines/RadialLineClick.tsx rename to docs/data/charts/radial-lines/demos/radial-line-click/RadialLineClick.tsx index 4e91e50d27e50..e8bdc8dca6f62 100644 --- a/docs/data/charts/radial-lines/RadialLineClick.tsx +++ b/docs/data/charts/radial-lines/demos/radial-line-click/RadialLineClick.tsx @@ -4,13 +4,11 @@ import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import IconButton from '@mui/material/IconButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { - RadialLineChart, - RadialLineSeries, -} from '@mui/x-charts-premium/RadialLineChart'; +import type { RadialLineSeries } from '@mui/x-charts-premium/RadialLineChart'; +import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { ChartsAxisData } from '@mui/x-charts/models'; -import { RadialLineItemIdentifier } from '@mui/x-charts-premium/models'; +import type { ChartsAxisData } from '@mui/x-charts/models'; +import type { RadialLineItemIdentifier } from '@mui/x-charts-premium/models'; const highlightScope = { highlight: 'item' } as const; @@ -53,6 +51,7 @@ const radialChartParams = { }; export default function RadialLineClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); const [axisData, setAxisData] = React.useState(); @@ -105,4 +104,5 @@ ${axisData ? JSON.stringify(axisData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/radial-lines/demos/radial-line-click/client.ts b/docs/data/charts/radial-lines/demos/radial-line-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-lines/demos/radial-line-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-lines/demos/radial-line-click/index.ts b/docs/data/charts/radial-lines/demos/radial-line-click/index.ts new file mode 100644 index 0000000000000..464417dc68f4b --- /dev/null +++ b/docs/data/charts/radial-lines/demos/radial-line-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadialLineClick from './RadialLineClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadialLineClick, { ClientProvider }); diff --git a/docs/data/charts/radial-lines/RadialLineMarkShape.tsx b/docs/data/charts/radial-lines/demos/radial-line-mark-shape/RadialLineMarkShape.tsx similarity index 94% rename from docs/data/charts/radial-lines/RadialLineMarkShape.tsx rename to docs/data/charts/radial-lines/demos/radial-line-mark-shape/RadialLineMarkShape.tsx index cb3c380d7911d..b413674c61645 100644 --- a/docs/data/charts/radial-lines/RadialLineMarkShape.tsx +++ b/docs/data/charts/radial-lines/demos/radial-line-mark-shape/RadialLineMarkShape.tsx @@ -4,7 +4,7 @@ import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import { RadialLineChart } from '@mui/x-charts-premium/RadialLineChart'; -import { dataset } from '../dataset/weather'; +import { dataset } from '../../../dataset/weather'; type Shape = 'circle' | 'square' | 'diamond' | 'cross' | 'star' | 'triangle' | 'wye'; @@ -19,6 +19,7 @@ const shapes: Shape[] = [ ]; export default function RadialLineMarkShape() { + // @focus-start @padding 1 const [shape, setShape] = React.useState('circle'); return ( @@ -62,4 +63,5 @@ export default function RadialLineMarkShape() { ); + // @focus-end } diff --git a/docs/data/charts/radial-lines/demos/radial-line-mark-shape/client.ts b/docs/data/charts/radial-lines/demos/radial-line-mark-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/radial-lines/demos/radial-line-mark-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/radial-lines/demos/radial-line-mark-shape/index.ts b/docs/data/charts/radial-lines/demos/radial-line-mark-shape/index.ts new file mode 100644 index 0000000000000..1ea0933193ada --- /dev/null +++ b/docs/data/charts/radial-lines/demos/radial-line-mark-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RadialLineMarkShape from './RadialLineMarkShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RadialLineMarkShape, { ClientProvider }); diff --git a/docs/data/charts/radial-lines/radial-lines.md b/docs/data/charts/radial-lines/radial-lines.md index 08111666a723d..68125c950432c 100644 --- a/docs/data/charts/radial-lines/radial-lines.md +++ b/docs/data/charts/radial-lines/radial-lines.md @@ -12,13 +12,13 @@ components: ChartsRadialDataProvider, ChartsRadialDataProviderPremium, RadialLin The `RadialLineChart` component accepts `series`, `rotationAxis`, and `radiusAxis` props to render data in polar coordinates. -{{"demo": "BasicRadialLineChart.js", "bg": "outline"}} +{{"component": "file://./demos/basic-radial-line-chart/index.ts", "bg": "outline"}} ## Closing path To draw the line between the last and first point of the series, set the series property `closePath` to `true`. -{{"demo": "ClosedOpenRadialLineChart.js", "bg": "outline"}} +{{"component": "file://./demos/closed-open-radial-line-chart/index.ts", "bg": "outline"}} ## Axes @@ -28,7 +28,7 @@ For more information about radial axes configuration, visit the [dedicated page] Here is an example of a rotation axis with a continuous scale type. -{{"demo": "ContinuousRadialLineChart.js", "bg": "outline"}} +{{"component": "file://./demos/continuous-radial-line-chart/index.ts", "bg": "outline"}} ## Marks @@ -37,7 +37,7 @@ Add `showMark: true` to display marks. To modify the mark, use the property `shape`. It accepts 7 shapes: `'circle'`, `'square'`, `'diamond'`, `'cross'`, `'star'`, `'triangle'`, and `'wye'`. -{{"demo": "RadialLineMarkShape.js", "bg": "outline"}} +{{"component": "file://./demos/radial-line-mark-shape/index.ts", "bg": "outline"}} ## Highlight @@ -47,7 +47,7 @@ Like other series, the radial line series has a `highlightScope` property that a The radial line interaction uses the [pointer based interaction](/x/react-charts/lines/#pointer-interaction). ::: -{{"demo": "ElementHighlights.js", "bg": "outline"}} +{{"component": "file://./demos/element-highlights/index.ts", "bg": "outline"}} ## Click events @@ -65,7 +65,7 @@ const clickHandler = ( ) => {}; ``` -{{"demo": "RadialLineClick.js", "bg": "outline"}} +{{"component": "file://./demos/radial-line-click/index.ts", "bg": "outline"}} :::info There is a slight difference between the `event` of `onItemClick` and `onAxisClick`: diff --git a/docs/data/charts/range-bar/BasicRangeBar.js b/docs/data/charts/range-bar/BasicRangeBar.js deleted file mode 100644 index 3bf83b50640d8..0000000000000 --- a/docs/data/charts/range-bar/BasicRangeBar.js +++ /dev/null @@ -1,48 +0,0 @@ -import * as React from 'react'; -import Typography from '@mui/material/Typography'; -import Stack from '@mui/material/Stack'; - -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; -import { temperatureBerlinPorto } from '../dataset/temperatureBerlinPorto'; - -export default function BasicRangeBar() { - return ( - - - Average monthly temperature ranges in °C for Porto and Berlin in 1991-2020 - - - context.location === 'tick' ? v.slice(0, 3) : v, - }, - ]} - yAxis={[{ valueFormatter: (value) => `${value}°C` }]} - series={[ - { - id: 'porto', - type: 'rangeBar', - label: 'Porto, Portugal', - valueFormatter: (value) => - value === null ? null : `${value[0]}°C - ${value[1]}°C`, - data: temperatureBerlinPorto.porto, - }, - { - id: 'berlin', - type: 'rangeBar', - label: 'Berlin, Germany', - valueFormatter: (value) => - value === null ? null : `${value[0]}°C - ${value[1]}°C`, - data: temperatureBerlinPorto.berlin, - }, - ]} - height={300} - /> - - Source: IPMA (Porto), climate-data.org (Berlin) - - - ); -} diff --git a/docs/data/charts/range-bar/RangeBarAnimation.js b/docs/data/charts/range-bar/RangeBarAnimation.js deleted file mode 100644 index 33aacb1b43157..0000000000000 --- a/docs/data/charts/range-bar/RangeBarAnimation.js +++ /dev/null @@ -1,328 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import Slider from '@mui/material/Slider'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; - -export default function RangeBarAnimation() { - const [seriesNb, setSeriesNb] = React.useState(2); - const [itemNb, setItemNb] = React.useState(5); - const [skipAnimation, setSkipAnimation] = React.useState(false); - - const handleItemNbChange = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setItemNb(newValue); - }; - const handleSeriesNbChange = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setSeriesNb(newValue); - }; - - return ( - - ({ ...s, data: s.data.slice(0, itemNb) }))} - skipAnimation={skipAnimation} - margin={{ left: 0 }} - /> - setSkipAnimation(event.target.checked)} /> - } - label="skipAnimation" - labelPlacement="end" - /> - - Number of items - - - - Number of series - - - - ); -} - -const highlightScope = { - highlight: 'series', - fade: 'global', -}; - -const series = [ - { - label: 'series 1', - data: [ - [500, 2423], - [300, 2210], - [100, 764], - [400, 1879], - [200, 1478], - [300, 1373], - [500, 1891], - [600, 2171], - [100, 620], - [300, 1269], - [200, 724], - [400, 1707], - [300, 1188], - [500, 1879], - [100, 626], - [400, 1635], - [600, 2177], - [100, 516], - [500, 1793], - [400, 1598], - ], - }, - { - label: 'series 2', - data: [ - [600, 2362], - [500, 2254], - [400, 1962], - [300, 1336], - [100, 586], - [200, 1069], - [600, 2194], - [400, 1629], - [600, 2173], - [500, 2031], - [400, 1757], - [200, 862], - [700, 2446], - [200, 910], - [700, 2430], - [600, 2300], - [200, 805], - [500, 1835], - [400, 1684], - [600, 2197], - ], - }, - { - label: 'series 3', - data: [ - [300, 1145], - [300, 1214], - [200, 975], - [600, 2266], - [400, 1768], - [700, 2341], - [200, 747], - [300, 1282], - [500, 1780], - [400, 1766], - [600, 2115], - [400, 1720], - [300, 1057], - [500, 2000], - [400, 1716], - [600, 2253], - [100, 619], - [400, 1626], - [300, 1209], - [500, 1786], - ], - }, - { - label: 'series 4', - data: [ - [600, 2361], - [200, 979], - [700, 2430], - [400, 1768], - [500, 1913], - [700, 2342], - [500, 1868], - [300, 1319], - [200, 1038], - [600, 2139], - [400, 1691], - [200, 935], - [600, 2262], - [400, 1580], - [100, 692], - [400, 1559], - [300, 1344], - [300, 1442], - [400, 1593], - [500, 1889], - ], - }, - { - label: 'series 5', - data: [ - [200, 968], - [300, 1371], - [300, 1381], - [300, 1060], - [300, 1327], - [200, 934], - [500, 1779], - [300, 1361], - [200, 878], - [300, 1055], - [500, 1737], - [700, 2380], - [200, 875], - [700, 2408], - [300, 1066], - [500, 1802], - [300, 1442], - [400, 1567], - [400, 1552], - [500, 1742], - ], - }, - { - label: 'series 6', - data: [ - [600, 2316], - [500, 1845], - [600, 2057], - [300, 1479], - [500, 1859], - [300, 1015], - [400, 1569], - [300, 1448], - [300, 1354], - [300, 1007], - [200, 799], - [500, 1748], - [300, 1454], - [500, 1968], - [300, 1129], - [300, 1196], - [600, 2158], - [100, 540], - [300, 1482], - [200, 880], - ], - }, - { - label: 'series 7', - data: [ - [600, 2140], - [600, 2082], - [200, 708], - [600, 2032], - [100, 554], - [300, 1365], - [600, 2121], - [400, 1639], - [700, 2430], - [700, 2440], - [200, 814], - [300, 1328], - [200, 883], - [500, 1811], - [600, 2322], - [500, 1743], - [200, 700], - [600, 2131], - [300, 1473], - [200, 957], - ], - }, - { - label: 'series 8', - data: [ - [300, 1074], - [200, 744], - [700, 2487], - [200, 823], - [600, 2252], - [600, 2317], - [600, 2139], - [500, 1818], - [600, 2256], - [500, 1769], - [300, 1123], - [300, 1461], - [100, 672], - [300, 1335], - [200, 960], - [500, 1871], - [600, 2305], - [300, 1231], - [600, 2005], - [200, 908], - ], - }, - { - label: 'series 9', - data: [ - [500, 1792], - [200, 886], - [700, 2472], - [400, 1546], - [600, 2164], - [600, 2323], - [700, 2435], - [300, 1268], - [600, 2368], - [600, 2158], - [600, 2200], - [300, 1316], - [100, 552], - [500, 1874], - [500, 1771], - [300, 1038], - [500, 1838], - [600, 2029], - [500, 1793], - [300, 1117], - ], - }, - { - label: 'series 10', - data: [ - [300, 1433], - [300, 1161], - [300, 1107], - [400, 1517], - [300, 1410], - [300, 1058], - [100, 676], - [300, 1280], - [500, 1936], - [500, 1774], - [100, 698], - [500, 1721], - [300, 1421], - [200, 785], - [500, 1752], - [200, 800], - [200, 990], - [500, 1809], - [500, 1985], - [100, 665], - ], - }, -].map((s) => ({ type: 'rangeBar', ...s, highlightScope })); diff --git a/docs/data/charts/range-bar/RangeBarBorderRadius.js b/docs/data/charts/range-bar/RangeBarBorderRadius.js deleted file mode 100644 index deb65d07dc313..0000000000000 --- a/docs/data/charts/range-bar/RangeBarBorderRadius.js +++ /dev/null @@ -1,106 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import Slider from '@mui/material/Slider'; -import Typography from '@mui/material/Typography'; -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; - -export default function RangeBarBorderRadius() { - const [layout, setLayout] = React.useState('vertical'); - const [radius, setRadius] = React.useState(10); - const [reverse, setReverse] = React.useState(false); - - return ( - - - - Border Radius - setRadius(value)} - valueLabelDisplay="auto" - min={0} - max={50} - sx={{ mt: 2 }} - /> - - setLayout(event.target.value)} - > - Horizontal - Vertical - - - setReverse(event.target.checked)} /> - } - label="Reverse" - labelPlacement="end" - /> - - - `} - language="jsx" - copyButtonHidden - /> - - ); -} - -const dataset = [ - [3, -7, '1st'], - [0, -5, '2nd'], - [10, 0, '3rd'], - [9, 6, '4th'], -].map(([high, low, order]) => ({ - high, - low, - order, -})); - -function getChartSettings(layout, reverse) { - return { - dataset, - height: 300, - xAxis: layout === 'horizontal' ? [{ reverse }] : [{ dataKey: 'order' }], - yAxis: - layout === 'horizontal' - ? [{ scaleType: 'band', dataKey: 'order' }] - : [{ reverse }], - slotProps: { - legend: { - direction: 'horizontal', - position: { vertical: 'bottom', horizontal: 'center' }, - }, - }, - }; -} diff --git a/docs/data/charts/range-bar/RangeBarClick.js b/docs/data/charts/range-bar/RangeBarClick.js deleted file mode 100644 index 49db75387ac80..0000000000000 --- a/docs/data/charts/range-bar/RangeBarClick.js +++ /dev/null @@ -1,99 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const barChartsParams = { - series: [ - { - type: 'rangeBar', - id: 'series-1', - data: [ - [3, 5], - [4, 6], - [1, 4], - [6, 8], - [5, 6], - ], - label: 'A', - highlightScope: { - highlight: 'item', - }, - }, - { - type: 'rangeBar', - id: 'series-2', - data: [ - [4, 6], - [1, 4], - [6, 8], - [5, 6], - [3, 5], - ], - label: 'B', - highlightScope: { - highlight: 'item', - }, - }, - ], - xAxis: [{ data: ['0', '3', '6', '9', '12'], id: 'axis1' }], - height: 400, - margin: { left: 0 }, -}; - -export default function RangeBarClick() { - const [itemData, setItemData] = React.useState(); - const [axisData, setAxisData] = React.useState(); - - return ( - - - setItemData(d)} - onAxisClick={(event, d) => setAxisData(d)} - /> - - - - - Click on the chart - { - setItemData(undefined); - setAxisData(null); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/range-bar/RangeBarColorScale.js b/docs/data/charts/range-bar/RangeBarColorScale.js deleted file mode 100644 index 03a237a3d29f4..0000000000000 --- a/docs/data/charts/range-bar/RangeBarColorScale.js +++ /dev/null @@ -1,131 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; - -const series = [ - { - type: 'rangeBar', - data: [ - [-2, 4], - [4, 10], - [-1, 3], - [2, 13], - [6, 7], - [8, 12], - ], - }, -]; - -export default function RangeBarColorScale() { - const [colorX, setColorX] = React.useState('piecewise'); - - return ( - - - setColorX(event.target.value)} - > - None - piecewise - continuous - ordinal - - - - value.getFullYear().toString(), - colorMap: - (colorX === 'ordinal' && { - type: 'ordinal', - colors: [ - '#ccebc5', - '#a8ddb5', - '#7bccc4', - '#4eb3d3', - '#2b8cbe', - '#08589e', - ], - }) || - (colorX === 'continuous' && { - type: 'continuous', - min: new Date(2019, 1, 1), - max: new Date(2024, 1, 1), - color: ['green', 'orange'], - }) || - (colorX === 'piecewise' && { - type: 'piecewise', - thresholds: [new Date(2021, 1, 1), new Date(2023, 1, 1)], - colors: ['blue', 'red', 'blue'], - }) || - undefined, - }, - ]} - margin={{ left: 0 }} - /> - `, - ].join('\n')} - language="jsx" - copyButtonHidden - /> - - ); -} diff --git a/docs/data/charts/range-bar/RangeBarGradient.js b/docs/data/charts/range-bar/RangeBarGradient.js deleted file mode 100644 index fd7717ee735c5..0000000000000 --- a/docs/data/charts/range-bar/RangeBarGradient.js +++ /dev/null @@ -1,67 +0,0 @@ -import * as React from 'react'; -import { barClasses } from '@mui/x-charts/BarChart'; -import { - BarChartPremium, - rangeBarClasses, -} from '@mui/x-charts-premium/BarChartPremium'; - -const settings = { - xAxis: [{ data: ['group A', 'group B', 'group C'] }], - series: [ - { - type: 'rangeBar', - id: '1', - data: [ - [4, 3], - [5, 8], - [2, 4], - ], - }, - { - type: 'rangeBar', - id: '2', - data: [ - [1, 6], - [5, 6], - [3, 9], - ], - }, - { - type: 'rangeBar', - id: '3', - data: [ - [1, 5], - [2, 4], - [3, 8], - ], - }, - ], - height: 300, - margin: { left: 0 }, -}; - -export default function RangeBarGradient() { - return ( - - - - - - ); -} - -function Gradient(props) { - return ( - - - - - ); -} diff --git a/docs/data/charts/range-bar/RangeBarGradient.tsx.preview b/docs/data/charts/range-bar/RangeBarGradient.tsx.preview deleted file mode 100644 index 88da323318104..0000000000000 --- a/docs/data/charts/range-bar/RangeBarGradient.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/data/charts/range-bar/RangeBarProjectSchedule.js b/docs/data/charts/range-bar/RangeBarProjectSchedule.js deleted file mode 100644 index 1d671190ed0c2..0000000000000 --- a/docs/data/charts/range-bar/RangeBarProjectSchedule.js +++ /dev/null @@ -1,353 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { RangeBarPlot } from '@mui/x-charts-premium/BarChartPremium'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; -import * as React from 'react'; -import { useDataset } from '@mui/x-charts/hooks'; -import { useTheme, styled } from '@mui/system'; -import { - ChartsTooltipContainer, - useAxesTooltip, - useItemTooltip, -} from '@mui/x-charts/ChartsTooltip'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; - -import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; -import { ChartsWrapper } from '@mui/x-charts-pro/ChartsWrapper'; -import { ChartsSurface } from '@mui/x-charts-pro/ChartsSurface'; -import { ScatterPlot } from '@mui/x-charts/ScatterChart'; -import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; - -const importantHappeningsLabels = [ - 'Exploratory archaeology digs begin.', - 'South Boston Haul Road opens.', - 'New Broadway Bridge opens.\nLeverett Circle Connector Bridge opens.', - 'Leonard P. Zakim Bunker Hill Bridge completed.', - 'I-90 Connector from South Boston to Rt. 1A in East Boston opens in January.\nI-93 Northbound opens in March.\nI-93 Southbound opens in December.', - 'Tunnel from Storrow Drive to Leverett Circle Connector opens.', - [ - 'Full opening of I-93 South.', - 'Opening of Dewey Square Tunnel, including new entrance and exit ramps.', - 'Opening of the two cantilevered lanes on Leonard P. Zakim Bunker Hill Bridge.', - 'Opening of permanent ramps and roadways at I-90/I-93 Interchange and in other areas.', - ].join('\n'), - 'Spectacle Island Park opens to the public.', - 'Restoration of Boston city streets.', -]; - -const importantHappenings = [ - { x: 1988, y: 3 }, - { x: 1993, y: 4 }, - { x: 1999, y: 5 }, - { x: 2002, y: 5 }, - { x: 2003, y: 5 }, - { x: 2004, y: 6 }, - { x: 2005, y: 6 }, - { x: 2006, y: 7 }, - { x: 2007, y: 8 }, -]; - -// Source: https://www.mass.gov/info-details/the-big-dig-project-background -const bigDigDataset = [ - { - phase: 1, - name: 'Conception & Initial Planning', - startYear: 1970, - endYear: 1982, - duration: '~10 years', - keyMilestones: [ - 'Concept development to address Central Artery congestion', - 'Federal Highway Administration involvement', - ], - }, - { - phase: 2, - name: 'Planning & Federal Approval', - startYear: 1982, - endYear: 1987, - duration: '5 years', - keyMilestones: [ - '1982: Official planning begins', - 'Environmental Impact Statement preparation', - '1985: Final EIS approval by FHWA', - 'April 1987: Congress approves federal funding and project scope', - ], - }, - { - phase: 3, - name: 'Design Development', - startYear: 1987, - endYear: 1991, - duration: '4 years', - keyMilestones: [ - 'Detailed engineering and design work', - 'Permits and approvals', - 'Contract procurement preparation', - 'Route and interchange finalization', - ], - }, - { - phase: 4, - name: 'Ted Williams Tunnel Construction', - startYear: 1991, - endYear: 1995, - duration: '4 years', - keyMilestones: [ - 'December 19, 1991: Official groundbreaking', - 'Underwater tunnel sections (steel tubes lowered by barges)', - 'December 1995: Ted Williams Tunnel opens (I-90 to Logan Airport)', - ], - }, - { - phase: 5, - name: 'Major Underground Construction', - startYear: 1995, - endYear: 2003, - duration: '8 years', - keyMilestones: [ - 'Central Artery tunnel excavation', - 'Tunnel-jacking operations (freezing soil beneath rail lines)', - 'Bridge construction (Zakim Bunker Hill Bridge)', - 'Four major highway interchanges', - ], - }, - { - phase: 6, - name: 'Systems Installation & Testing', - startYear: 2003, - endYear: 2005, - duration: '2-3 years', - keyMilestones: [ - 'Tunnel systems (ventilation, lighting, fire safety)', - 'Traffic management systems (1,400+ loop detectors, 430 CCTV cameras)', - 'Operations Control Center setup', - ], - }, - { - phase: 7, - name: 'Final Construction & Opening', - startYear: 2005, - endYear: 2006, - duration: '1-2 years', - keyMilestones: [ - 'January 13, 2006: Final ramp opens (Exit 20B)', - 'Elevated highway demolition begins', - "O'Neill Tunnel dedication", - ], - }, - { - phase: 8, - name: 'Rose Kennedy Greenway Development', - startYear: 2006, - endYear: 2007, - duration: '1-2 years', - keyMilestones: [ - 'Creation of 300+ acres of open space', - 'Park and public space development', - 'December 31, 2007: Official project completion', - ], - }, - { - phase: 9, - name: 'Claims Resolution & Final Closeout', - startYear: 2007, - endYear: 2008, - duration: '1 year', - keyMilestones: [ - 'Legal settlements ($407M from Bechtel/Parsons Brinckerhoff)', - 'Documentation finalization', - 'Warranty period begins', - ], - }, -]; - -const xAxis = [ - { - id: 'x', - scaleType: 'linear', - valueFormatter: (value) => value.toString(), - label: 'Year', - }, -]; - -const yAxis = [ - { - id: 'y', - scaleType: 'band', - dataKey: 'phase', - label: 'Project Phase', - width: 40, - }, -]; - -export default function RangeBarProjectSchedule() { - const clipPathId = React.useId(); - const theme = useTheme(); - const palette = rainbowSurgePalette(theme.palette.mode); - const colors = [palette[4], palette[1], palette[0]]; - - const series = [ - { - type: 'rangeBar', - datasetKeys: { start: 'startYear', end: 'endYear' }, - xAxisId: 'x', - yAxisId: 'y', - layout: 'horizontal', - colorGetter: (data) => { - if (data.dataIndex < 3) { - return colors[0]; - } - - if (data.dataIndex < 8) { - return colors[1]; - } - - return colors[2]; - }, - }, - { - type: 'scatter', - data: importantHappenings, - color: palette[2], - }, - ]; - - return ( - - - - - - - - - - - - - - - - - - - ); -} - -const TooltipContainer = styled('div')(({ theme }) => ({ - background: theme.palette.background.paper, - border: `1px solid ${theme.palette.divider}`, - padding: theme.spacing(1), - borderRadius: theme.shape.borderRadius, -})); - -function TooltipContent() { - const dataset = useDataset(); - const itemTooltipData = useItemTooltip(); - const axesTooltipData = useAxesTooltip(); - - if (itemTooltipData) { - return ; - } - - const dataIndex = axesTooltipData?.[0]?.dataIndex; - - if (dataIndex === undefined) { - return null; - } - - const phase = dataset[dataIndex]; - - return ( - - - Phase {phase.phase}: {phase.name} ({phase.startYear} -{' '} - {phase.endYear}) - - Key Milestones: -
    - {phase.keyMilestones.map((milestone, index) => ( -
  • - {milestone} -
  • - ))} -
-
- ); -} - -function HappeningTooltip() { - const tooltipData = useItemTooltip(); - const dataIndex = tooltipData?.identifier.dataIndex; - - if (dataIndex === undefined) { - return null; - } - - const happening = importantHappenings[dataIndex]; - - return ( - - {happening.x} - - {importantHappeningsLabels[dataIndex].split('\n').map((line, index) => ( - - {line} -
-
- ))} -
-
- ); -} - -function Legend({ series }) { - return ( - - {series.map((aSeries, index) => ( - -
- {aSeries.label} - - ))} - - ); -} diff --git a/docs/data/charts/range-bar/WebGLRangeBars.js b/docs/data/charts/range-bar/WebGLRangeBars.js deleted file mode 100644 index 92292abb85e50..0000000000000 --- a/docs/data/charts/range-bar/WebGLRangeBars.js +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import RadioGroup from '@mui/material/RadioGroup'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Radio from '@mui/material/Radio'; -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; - -const POINTS = 5000; - -function generateRanges(seed) { - const data = new Array(POINTS); - let center = 50; - for (let i = 0; i < POINTS; i += 1) { - // Deterministic pseudo-random walk on the band center. - center += Math.sin(center * i * seed * 0.13) * 4; - const half = 4 + Math.abs(Math.sin(i * seed * 0.21)) * 6; - data[i] = [Math.round(center - half), Math.round(center + half)]; - } - return data; -} - -const xData = Array.from({ length: POINTS }, (_, i) => i); -const seriesA = generateRanges(1); -const seriesB = generateRanges(7); - -export default function WebGLRangeBars() { - const [renderer, setRenderer] = React.useState('webgl'); - - return ( - - - - Rendering Strategy - - setRenderer(event.target.value)} - > - } - label="Individual Bars (default)" - /> - } label="WebGL" /> - - - - - ); -} diff --git a/docs/data/charts/range-bar/BasicRangeBar.tsx b/docs/data/charts/range-bar/demos/basic-range-bar/BasicRangeBar.tsx similarity index 88% rename from docs/data/charts/range-bar/BasicRangeBar.tsx rename to docs/data/charts/range-bar/demos/basic-range-bar/BasicRangeBar.tsx index 12926cef1968a..cadf143b9dffe 100644 --- a/docs/data/charts/range-bar/BasicRangeBar.tsx +++ b/docs/data/charts/range-bar/demos/basic-range-bar/BasicRangeBar.tsx @@ -1,13 +1,14 @@ import * as React from 'react'; import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; -import { AxisValueFormatterContext } from '@mui/x-charts/models'; +import type { AxisValueFormatterContext } from '@mui/x-charts/models'; import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; -import { temperatureBerlinPorto } from '../dataset/temperatureBerlinPorto'; +import { temperatureBerlinPorto } from '../../../dataset/temperatureBerlinPorto'; export default function BasicRangeBar() { return ( + {/* @focus-start */} Average monthly temperature ranges in °C for Porto and Berlin in 1991-2020 @@ -43,6 +44,7 @@ export default function BasicRangeBar() { Source: IPMA (Porto), climate-data.org (Berlin) + {/* @focus-end */} ); } diff --git a/docs/data/charts/range-bar/demos/basic-range-bar/client.ts b/docs/data/charts/range-bar/demos/basic-range-bar/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/basic-range-bar/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/basic-range-bar/index.ts b/docs/data/charts/range-bar/demos/basic-range-bar/index.ts new file mode 100644 index 0000000000000..3ec698c008c23 --- /dev/null +++ b/docs/data/charts/range-bar/demos/basic-range-bar/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicRangeBar from './BasicRangeBar'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicRangeBar, { ClientProvider }); diff --git a/docs/data/charts/range-bar/RangeBarAnimation.tsx b/docs/data/charts/range-bar/demos/range-bar-animation/RangeBarAnimation.tsx similarity index 95% rename from docs/data/charts/range-bar/RangeBarAnimation.tsx rename to docs/data/charts/range-bar/demos/range-bar-animation/RangeBarAnimation.tsx index 1560cfed14296..5c4bc246c18d1 100644 --- a/docs/data/charts/range-bar/RangeBarAnimation.tsx +++ b/docs/data/charts/range-bar/demos/range-bar-animation/RangeBarAnimation.tsx @@ -4,14 +4,13 @@ import Typography from '@mui/material/Typography'; import Slider from '@mui/material/Slider'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; -import { HighlightScope } from '@mui/x-charts-pro/context'; -import { - BarChartPremium, - RangeBarSeries, -} from '@mui/x-charts-premium/BarChartPremium'; -import { RangeBarValueType } from '@mui/x-charts-premium/models'; +import type { HighlightScope } from '@mui/x-charts-pro/context'; +import type { RangeBarSeries } from '@mui/x-charts-premium/BarChartPremium'; +import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; +import type { RangeBarValueType } from '@mui/x-charts-premium/models'; export default function RangeBarAnimation() { + // @focus-start @padding 1 const [seriesNb, setSeriesNb] = React.useState(2); const [itemNb, setItemNb] = React.useState(5); const [skipAnimation, setSkipAnimation] = React.useState(false); @@ -71,6 +70,7 @@ export default function RangeBarAnimation() { /> ); + // @focus-end } const highlightScope: HighlightScope<'rangeBar'> = { diff --git a/docs/data/charts/range-bar/demos/range-bar-animation/client.ts b/docs/data/charts/range-bar/demos/range-bar-animation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-animation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/range-bar-animation/index.ts b/docs/data/charts/range-bar/demos/range-bar-animation/index.ts new file mode 100644 index 0000000000000..6b3634a243696 --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-animation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RangeBarAnimation from './RangeBarAnimation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RangeBarAnimation, { ClientProvider }); diff --git a/docs/data/charts/range-bar/RangeBarBorderRadius.tsx b/docs/data/charts/range-bar/demos/range-bar-border-radius/RangeBarBorderRadius.tsx similarity index 93% rename from docs/data/charts/range-bar/RangeBarBorderRadius.tsx rename to docs/data/charts/range-bar/demos/range-bar-border-radius/RangeBarBorderRadius.tsx index 1b7dae1dad5f3..7ee51cadea346 100644 --- a/docs/data/charts/range-bar/RangeBarBorderRadius.tsx +++ b/docs/data/charts/range-bar/demos/range-bar-border-radius/RangeBarBorderRadius.tsx @@ -5,14 +5,13 @@ import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import Slider from '@mui/material/Slider'; import Typography from '@mui/material/Typography'; -import { - BarChartPremium, - BarChartPremiumProps, -} from '@mui/x-charts-premium/BarChartPremium'; +import type { BarChartPremiumProps } from '@mui/x-charts-premium/BarChartPremium'; +import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; export default function RangeBarBorderRadius() { + // @focus-start @padding 1 const [layout, setLayout] = React.useState<'horizontal' | 'vertical'>('vertical'); const [radius, setRadius] = React.useState(10); const [reverse, setReverse] = React.useState(false); @@ -79,6 +78,7 @@ export default function RangeBarBorderRadius() { /> ); + // @focus-end } const dataset = [ diff --git a/docs/data/charts/range-bar/demos/range-bar-border-radius/client.ts b/docs/data/charts/range-bar/demos/range-bar-border-radius/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-border-radius/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/range-bar-border-radius/index.ts b/docs/data/charts/range-bar/demos/range-bar-border-radius/index.ts new file mode 100644 index 0000000000000..3d20b5771bcb0 --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-border-radius/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RangeBarBorderRadius from './RangeBarBorderRadius'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RangeBarBorderRadius, { ClientProvider }); diff --git a/docs/data/charts/range-bar/RangeBarClick.tsx b/docs/data/charts/range-bar/demos/range-bar-click/RangeBarClick.tsx similarity index 88% rename from docs/data/charts/range-bar/RangeBarClick.tsx rename to docs/data/charts/range-bar/demos/range-bar-click/RangeBarClick.tsx index fd992a5ff810f..f58d105428f3d 100644 --- a/docs/data/charts/range-bar/RangeBarClick.tsx +++ b/docs/data/charts/range-bar/demos/range-bar-click/RangeBarClick.tsx @@ -4,13 +4,11 @@ import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import IconButton from '@mui/material/IconButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { - BarChartPremium, - RangeBarSeries, -} from '@mui/x-charts-premium/BarChartPremium'; +import type { RangeBarSeries } from '@mui/x-charts-premium/BarChartPremium'; +import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { BarItemIdentifier, ChartsAxisData } from '@mui/x-charts/models'; -import { RangeBarItemIdentifier } from '@mui/x-charts-premium/models'; +import type { BarItemIdentifier, ChartsAxisData } from '@mui/x-charts/models'; +import type { RangeBarItemIdentifier } from '@mui/x-charts-premium/models'; import type {} from '@mui/x-charts-premium/moduleAugmentation/rangeBarOnClick'; @@ -53,6 +51,7 @@ const barChartsParams = { } as const; export default function RangeBarClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState< BarItemIdentifier | RangeBarItemIdentifier >(); @@ -105,4 +104,5 @@ ${axisData ? JSON.stringify(axisData, null, 2) : '// The data will appear here'} ); + // @focus-end } diff --git a/docs/data/charts/range-bar/demos/range-bar-click/client.ts b/docs/data/charts/range-bar/demos/range-bar-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/range-bar-click/index.ts b/docs/data/charts/range-bar/demos/range-bar-click/index.ts new file mode 100644 index 0000000000000..b54972964e10f --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RangeBarClick from './RangeBarClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RangeBarClick, { ClientProvider }); diff --git a/docs/data/charts/range-bar/RangeBarColorScale.tsx b/docs/data/charts/range-bar/demos/range-bar-color-scale/RangeBarColorScale.tsx similarity index 95% rename from docs/data/charts/range-bar/RangeBarColorScale.tsx rename to docs/data/charts/range-bar/demos/range-bar-color-scale/RangeBarColorScale.tsx index bbd6219bb666d..453b4b6cba34b 100644 --- a/docs/data/charts/range-bar/RangeBarColorScale.tsx +++ b/docs/data/charts/range-bar/demos/range-bar-color-scale/RangeBarColorScale.tsx @@ -3,10 +3,8 @@ import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { - BarChartPremium, - RangeBarSeries, -} from '@mui/x-charts-premium/BarChartPremium'; +import type { RangeBarSeries } from '@mui/x-charts-premium/BarChartPremium'; +import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; const series = [ { @@ -23,6 +21,7 @@ const series = [ ]; export default function RangeBarColorScale() { + // @focus-start @padding 1 const [colorX, setColorX] = React.useState< 'None' | 'piecewise' | 'continuous' | 'ordinal' >('piecewise'); @@ -138,4 +137,5 @@ export default function RangeBarColorScale() { /> ); + // @focus-end } diff --git a/docs/data/charts/range-bar/demos/range-bar-color-scale/client.ts b/docs/data/charts/range-bar/demos/range-bar-color-scale/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-color-scale/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/range-bar-color-scale/index.ts b/docs/data/charts/range-bar/demos/range-bar-color-scale/index.ts new file mode 100644 index 0000000000000..728ace704c127 --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-color-scale/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RangeBarColorScale from './RangeBarColorScale'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RangeBarColorScale, { ClientProvider }); diff --git a/docs/data/charts/range-bar/RangeBarGradient.tsx b/docs/data/charts/range-bar/demos/range-bar-gradient/RangeBarGradient.tsx similarity index 91% rename from docs/data/charts/range-bar/RangeBarGradient.tsx rename to docs/data/charts/range-bar/demos/range-bar-gradient/RangeBarGradient.tsx index d9982635934aa..2edde5083df6c 100644 --- a/docs/data/charts/range-bar/RangeBarGradient.tsx +++ b/docs/data/charts/range-bar/demos/range-bar-gradient/RangeBarGradient.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { barClasses } from '@mui/x-charts/BarChart'; +import type { RangeBarSeries } from '@mui/x-charts-premium/BarChartPremium'; import { BarChartPremium, rangeBarClasses, - RangeBarSeries, } from '@mui/x-charts-premium/BarChartPremium'; const settings = { @@ -43,6 +43,7 @@ const settings = { export default function RangeBarGradient() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/range-bar/demos/range-bar-gradient/client.ts b/docs/data/charts/range-bar/demos/range-bar-gradient/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-gradient/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/range-bar-gradient/index.ts b/docs/data/charts/range-bar/demos/range-bar-gradient/index.ts new file mode 100644 index 0000000000000..0c71059ea8e68 --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-gradient/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RangeBarGradient from './RangeBarGradient'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RangeBarGradient, { ClientProvider }); diff --git a/docs/data/charts/range-bar/RangeBarProjectSchedule.tsx b/docs/data/charts/range-bar/demos/range-bar-project-schedule/RangeBarProjectSchedule.tsx similarity index 96% rename from docs/data/charts/range-bar/RangeBarProjectSchedule.tsx rename to docs/data/charts/range-bar/demos/range-bar-project-schedule/RangeBarProjectSchedule.tsx index 1d40d05ad6bca..d1508f9aee85a 100644 --- a/docs/data/charts/range-bar/RangeBarProjectSchedule.tsx +++ b/docs/data/charts/range-bar/demos/range-bar-project-schedule/RangeBarProjectSchedule.tsx @@ -1,6 +1,7 @@ import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; -import { RangeBarPlot, RangeBarSeries } from '@mui/x-charts-premium/BarChartPremium'; +import type { RangeBarSeries } from '@mui/x-charts-premium/BarChartPremium'; +import { RangeBarPlot } from '@mui/x-charts-premium/BarChartPremium'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; @@ -13,11 +14,12 @@ import { useItemTooltip, } from '@mui/x-charts/ChartsTooltip'; import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import { ScatterValueType, XAxis, YAxis } from '@mui/x-charts/models'; +import type { ScatterValueType, XAxis, YAxis } from '@mui/x-charts/models'; import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; import { ChartsWrapper } from '@mui/x-charts-pro/ChartsWrapper'; import { ChartsSurface } from '@mui/x-charts-pro/ChartsSurface'; -import { ScatterPlot, ScatterSeries } from '@mui/x-charts/ScatterChart'; +import type { ScatterSeries } from '@mui/x-charts/ScatterChart'; +import { ScatterPlot } from '@mui/x-charts/ScatterChart'; import { ChartsDataProviderPremium } from '@mui/x-charts-premium/ChartsDataProviderPremium'; const importantHappeningsLabels = [ @@ -181,6 +183,7 @@ const yAxis = [ ] satisfies YAxis[]; export default function RangeBarProjectSchedule() { + // @focus-start @padding 1 const clipPathId = React.useId(); const theme = useTheme(); const palette = rainbowSurgePalette(theme.palette.mode); @@ -253,6 +256,7 @@ export default function RangeBarProjectSchedule() { ); + // @focus-end } const TooltipContainer = styled('div')(({ theme }) => ({ diff --git a/docs/data/charts/range-bar/demos/range-bar-project-schedule/client.ts b/docs/data/charts/range-bar/demos/range-bar-project-schedule/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-project-schedule/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/range-bar-project-schedule/index.ts b/docs/data/charts/range-bar/demos/range-bar-project-schedule/index.ts new file mode 100644 index 0000000000000..0713f037cd073 --- /dev/null +++ b/docs/data/charts/range-bar/demos/range-bar-project-schedule/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RangeBarProjectSchedule from './RangeBarProjectSchedule'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RangeBarProjectSchedule, { ClientProvider }); diff --git a/docs/data/charts/range-bar/WebGLRangeBars.tsx b/docs/data/charts/range-bar/demos/web-gl-range-bars/WebGLRangeBars.tsx similarity index 98% rename from docs/data/charts/range-bar/WebGLRangeBars.tsx rename to docs/data/charts/range-bar/demos/web-gl-range-bars/WebGLRangeBars.tsx index 4fbf4560bf869..c6ab9efe43694 100644 --- a/docs/data/charts/range-bar/WebGLRangeBars.tsx +++ b/docs/data/charts/range-bar/demos/web-gl-range-bars/WebGLRangeBars.tsx @@ -28,6 +28,7 @@ const seriesA = generateRanges(1); const seriesB = generateRanges(7); export default function WebGLRangeBars() { + // @focus-start @padding 1 const [renderer, setRenderer] = React.useState('webgl'); return ( @@ -70,4 +71,5 @@ export default function WebGLRangeBars() { /> ); + // @focus-end } diff --git a/docs/data/charts/range-bar/demos/web-gl-range-bars/client.ts b/docs/data/charts/range-bar/demos/web-gl-range-bars/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/range-bar/demos/web-gl-range-bars/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/range-bar/demos/web-gl-range-bars/index.ts b/docs/data/charts/range-bar/demos/web-gl-range-bars/index.ts new file mode 100644 index 0000000000000..019c6c6f38f3e --- /dev/null +++ b/docs/data/charts/range-bar/demos/web-gl-range-bars/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import WebGLRangeBars from './WebGLRangeBars'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, WebGLRangeBars, { ClientProvider }); diff --git a/docs/data/charts/range-bar/range-bar.md b/docs/data/charts/range-bar/range-bar.md index 099274cedd20b..1f9b845998484 100644 --- a/docs/data/charts/range-bar/range-bar.md +++ b/docs/data/charts/range-bar/range-bar.md @@ -21,7 +21,7 @@ To create a range bar chart, render `BarChartPremium` with at least one series o Each data point in a range bar series consists of a `{ start: number, end: number }` object. -{{"demo": "BasicRangeBar.js"}} +{{"component": "file://./demos/basic-range-bar/index.ts"}} ### Using a dataset @@ -42,7 +42,7 @@ To achieve rounded corners, set the `borderRadius` prop on `BarChartPremium` to When composing a custom component, set the `borderRadius` prop on the `RangeBarPlot` component. -{{"demo": "RangeBarBorderRadius.js"}} +{{"component": "file://./demos/range-bar-border-radius/index.ts"}} ### Color @@ -57,7 +57,7 @@ Unlike other chart types, the `colorMap` property does not work for the numerica See [Styling—Value-based colors](/x/react-charts/styling/#value-based-colors) for more details on `colorMap`. -{{"demo": "RangeBarColorScale.js"}} +{{"component": "file://./demos/range-bar-color-scale/index.ts"}} ### CSS @@ -66,14 +66,14 @@ You can customize the range bar chart elements using CSS selectors. Like a bar chart, each series renders a `g` element that contains a `data-series` attribute. You can use this attribute to target elements based on their series. -{{"demo": "RangeBarGradient.js"}} +{{"component": "file://./demos/range-bar-gradient/index.ts"}} ## Click event The click event handlers work similarly to bar charts. See [Bars—Click events](/x/react-charts/bars/#click-events) for details. -{{"demo": "RangeBarClick.js"}} +{{"component": "file://./demos/range-bar-click/index.ts"}} :::info For `onAxisClick`, the `seriesValues` type will be missing `RangeBarValueType`. @@ -92,7 +92,7 @@ import type {} from '@mui/x-charts-pro/moduleAugmentation/rangeBarOnClick'; Animation works similarly to bar charts. See [Bars—Animation](/x/react-charts/bars/#animation) for details. -{{"demo": "RangeBarAnimation.js"}} +{{"component": "file://./demos/range-bar-animation/index.ts"}} ## Performance @@ -101,7 +101,7 @@ Set the `renderer` prop to `"webgl"` to enable it. The same trade-offs as the bar chart [WebGL renderer](/x/react-charts/bars/#webgl-renderer) apply. -{{"demo": "WebGLRangeBars.js"}} +{{"component": "file://./demos/web-gl-range-bars/index.ts"}} ## Composition @@ -135,4 +135,4 @@ The example below shows how `BarChartPremium` is composed: The example below follows a similar pattern and creates a project schedule chart using range bars to represent task durations. -{{"demo": "RangeBarProjectSchedule.js"}} +{{"component": "file://./demos/range-bar-project-schedule/index.ts"}} diff --git a/docs/data/charts/references/ReferenceAreaBasic.js b/docs/data/charts/references/ReferenceAreaBasic.js deleted file mode 100644 index 9b9d0161dc0b9..0000000000000 --- a/docs/data/charts/references/ReferenceAreaBasic.js +++ /dev/null @@ -1,100 +0,0 @@ -import * as React from 'react'; -import { LineHighlightPlot, LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider'; -import { ChartsSurface } from '@mui/x-charts/ChartsSurface'; -import { ChartsWrapper } from '@mui/x-charts/ChartsWrapper'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsLegend } from '@mui/x-charts/ChartsLegend'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { ReferenceArea, ReferenceAreaLabel } from './ReferenceArea'; - -export default function ReferenceAreaBasic() { - return ( - - - - - - - - Error < 10% - - - - - - - - - - - - - - ); -} - -const N = 120; -const tValues = Array.from({ length: N + 1 }, (_, i) => -0.1 + (i * 3) / N); -const commandValues = tValues.map((t) => (t < 0 ? 0 : 1)); -const zValues = tValues.map((t) => - t < 0 ? 0 : 1 - 1 * Math.exp(-t) * (Math.cos(8 * t) - 0.5 * Math.sin(8 * t)), -); - -const IntlNumber = Intl.NumberFormat('en-US', { - notation: 'compact', - maximumFractionDigits: 2, -}); -const valueFormatter = (value) => (value === null ? '' : IntlNumber.format(value)); - -const chartsConfig = { - height: 300, - xAxis: [{ scaleType: 'linear', data: tValues, valueFormatter }], - series: [ - { - type: 'line', - data: commandValues, - label: 'command', - curve: 'stepAfter', - valueFormatter, - }, - { - type: 'line', - data: zValues, - showMark: false, - label: 'response', - valueFormatter, - }, - ], -}; diff --git a/docs/data/charts/references/ReferenceLineBasic.js b/docs/data/charts/references/ReferenceLineBasic.js deleted file mode 100644 index 8916dafe601cd..0000000000000 --- a/docs/data/charts/references/ReferenceLineBasic.js +++ /dev/null @@ -1,20 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; - -export default function ReferenceLineBasic() { - return ( - - - - - ); -} - -const chartsConfig = { - height: 300, - xAxis: [ - { scaleType: 'point', data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'] }, - ], - series: [{ data: [2, 5, 3, 7, 1, 6, 4] }], -}; diff --git a/docs/data/charts/references/ReferenceLineBasic.tsx.preview b/docs/data/charts/references/ReferenceLineBasic.tsx.preview deleted file mode 100644 index be1fcdcbf8167..0000000000000 --- a/docs/data/charts/references/ReferenceLineBasic.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/data/charts/references/ReferenceLineLabel.js b/docs/data/charts/references/ReferenceLineLabel.js deleted file mode 100644 index 225a67ba59093..0000000000000 --- a/docs/data/charts/references/ReferenceLineLabel.js +++ /dev/null @@ -1,28 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; - -export default function ReferenceLineLabel() { - return ( - - - - - - ); -} - -const chartsConfig = { - height: 300, - xAxis: [ - { scaleType: 'point', data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'] }, - ], - series: [{ data: [2, 5, 3, 7, 1, 6, 4] }], -}; diff --git a/docs/data/charts/references/ReferenceLineLabel.tsx.preview b/docs/data/charts/references/ReferenceLineLabel.tsx.preview deleted file mode 100644 index 2f71456a4caa3..0000000000000 --- a/docs/data/charts/references/ReferenceLineLabel.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/data/charts/references/ReferenceLineStyled.js b/docs/data/charts/references/ReferenceLineStyled.js deleted file mode 100644 index 2d3dcdb1b70e7..0000000000000 --- a/docs/data/charts/references/ReferenceLineStyled.js +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react'; -import { styled } from '@mui/material/styles'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { - ChartsReferenceLine, - referenceLineClasses, -} from '@mui/x-charts/ChartsReferenceLine'; - -const StyledReferenceLine = styled(ChartsReferenceLine)(() => ({ - [`& .${referenceLineClasses.line}`]: { - strokeDasharray: '10 5', - stroke: 'red', - }, -})); - -export default function ReferenceLineStyled() { - return ( - - - - - ); -} -const chartsConfig = { - height: 300, - xAxis: [ - { scaleType: 'point', data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'] }, - ], - series: [{ data: [2, 5, 3, 7, 1, 6, 4] }], -}; diff --git a/docs/data/charts/references/ReferenceLineStyled.tsx.preview b/docs/data/charts/references/ReferenceLineStyled.tsx.preview deleted file mode 100644 index c587bce5d094a..0000000000000 --- a/docs/data/charts/references/ReferenceLineStyled.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/data/charts/references/ReferenceOverview.js b/docs/data/charts/references/ReferenceOverview.js deleted file mode 100644 index efa59b1489527..0000000000000 --- a/docs/data/charts/references/ReferenceOverview.js +++ /dev/null @@ -1,205 +0,0 @@ -import * as React from 'react'; -import Typography from '@mui/material/Typography'; -import Box from '@mui/material/Box'; -import { alpha, useTheme } from '@mui/material/styles'; -import { ChartsReferenceLine } from '@mui/x-charts-pro/ChartsReferenceLine'; -import { ChartsDataProviderPro } from '@mui/x-charts-pro/ChartsDataProviderPro'; -import { ChartsSurface } from '@mui/x-charts-pro/ChartsSurface'; -import { LinePlot } from '@mui/x-charts-pro/LineChart'; -import { ChartsXAxis } from '@mui/x-charts-pro/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts-pro/ChartsYAxis'; -import { ChartsTooltip } from '@mui/x-charts-pro/ChartsTooltip'; -import { ChartsGrid } from '@mui/x-charts-pro/ChartsGrid'; -import { ChartsZoomSlider } from '@mui/x-charts-pro/ChartsZoomSlider'; -import { ChartsClipPath } from '@mui/x-charts-pro/ChartsClipPath'; -import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; -import { ChartsLegend } from '@mui/x-charts-pro/ChartsLegend'; -import { usaUnemploymentAndGdp } from '../dataset/usaUnemploymentAndGdp'; -import { useReferencePoint } from './ReferencePoint'; -import { ReferenceArea } from './ReferenceArea'; - -const recessions = [ - { - start: new Date('2001-03-01'), - end: new Date('2001-11-01'), - label: 'Early 2000s', - }, - { - start: new Date('2007-12-01'), - end: new Date('2009-06-01'), - label: 'Great Recession', - }, - { start: new Date('2020-02-01'), end: new Date('2020-04-01'), label: 'COVID-19' }, -]; - -const elections = [ - { year: 2001, label: 'George\nW. Bush' }, - { year: 2009, label: 'Barack\nObama' }, - { year: 2017, label: 'Donald\nTrump' }, - { year: 2021, label: 'Joe\nBiden' }, - { year: 2025, label: 'Donald\nTrump' }, -]; - -function AreaWithLabel(period) { - const theme = useTheme(); - const labelFill = alpha(theme.palette.text.primary, 0.7); - - const xStart = useReferencePoint({ x: period.start.getTime() }); - const xEnd = useReferencePoint({ x: period.end.getTime() }); - - return ( - - - {xStart.x !== xEnd.x && ( - - {period.label} - - )} - - ); -} - -function ElectionMarker(election) { - return ( - - ); -} - -export default function ReferenceOverview() { - const clipPathId = React.useId(); - return ( - - - US unemployment rate comparison with GDP per capita - - (value == null ? '' : `${value.toFixed(1)}%`), - }, - { - type: 'line', - dataKey: 'gdpPerCapita', - label: 'GDP per capita', - color: '#4caf50', - yAxisId: 'gdp-axis', - connectNulls: true, - valueFormatter: (value) => - value == null ? '' : `${(value / 1000).toFixed(1)}k`, - }, - ]} - xAxis={[ - { - scaleType: 'time', - dataKey: 'date', - tickNumber: 4, - valueFormatter: (date, context) => { - if (context.location !== 'tick') { - return date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'short', - }); - } - return date.getMonth() === 0 - ? date.toLocaleDateString('en-US', { - year: 'numeric', - }) - : date.toLocaleDateString('en-US', { - month: 'short', - }); - }, - zoom: { - slider: { enabled: true }, - }, - }, - ]} - yAxis={[ - { - id: 'unemployment-axis', - scaleType: 'linear', - valueFormatter: (value) => `${value}%`, - width: 55, - position: 'left', - }, - { - id: 'gdp-axis', - scaleType: 'linear', - width: 50, - position: 'right', - valueFormatter: (value) => `${(value / 1000).toLocaleString()}k`, - }, - ]} - > - - - - - - {recessions.map((period) => ( - - ))} - - - - - - {elections.map((election) => ( - - ))} - - - - - - - - - - - Source: FRED - - - ); -} diff --git a/docs/data/charts/references/ReferencePointBasic.js b/docs/data/charts/references/ReferencePointBasic.js deleted file mode 100644 index 2343b3b21e693..0000000000000 --- a/docs/data/charts/references/ReferencePointBasic.js +++ /dev/null @@ -1,45 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import { useXScale, useYScale } from '@mui/x-charts/hooks'; - -function useReferencePoint(params) { - const xScale = useXScale(); - const yScale = useYScale(); - - return { - cx: xScale(params.x), - cy: yScale(params.y), - }; -} - -function ReferencePoint(props) { - const { x, y, ...other } = props; - - const coordinates = useReferencePoint({ x, y }); - - return ; -} - -export default function ReferencePointBasic() { - return ( - - - - - ); -} - -const chartsConfig = { - height: 300, - xAxis: [ - { scaleType: 'point', data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'] }, - ], - series: [{ data: [2, 5, 3, 7, 1, 6, 4] }], -}; diff --git a/docs/data/charts/references/ReferencePointBasic.tsx.preview b/docs/data/charts/references/ReferencePointBasic.tsx.preview deleted file mode 100644 index 6e90137c184a2..0000000000000 --- a/docs/data/charts/references/ReferencePointBasic.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/data/charts/references/ReferenceAreaBasic.tsx b/docs/data/charts/references/demos/reference-area-basic/ReferenceAreaBasic.tsx similarity index 96% rename from docs/data/charts/references/ReferenceAreaBasic.tsx rename to docs/data/charts/references/demos/reference-area-basic/ReferenceAreaBasic.tsx index 817262c5b54d4..ad6e809b67506 100644 --- a/docs/data/charts/references/ReferenceAreaBasic.tsx +++ b/docs/data/charts/references/demos/reference-area-basic/ReferenceAreaBasic.tsx @@ -9,10 +9,11 @@ import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip'; import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; -import { ReferenceArea, ReferenceAreaLabel } from './ReferenceArea'; +import { ReferenceArea, ReferenceAreaLabel } from '../../ReferenceArea'; export default function ReferenceAreaBasic() { return ( + // @focus-start @padding 2 {...chartsConfig}> @@ -65,6 +66,7 @@ export default function ReferenceAreaBasic() { + // @focus-end ); } diff --git a/docs/data/charts/references/demos/reference-area-basic/client.ts b/docs/data/charts/references/demos/reference-area-basic/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/references/demos/reference-area-basic/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/references/demos/reference-area-basic/index.ts b/docs/data/charts/references/demos/reference-area-basic/index.ts new file mode 100644 index 0000000000000..8a8e170fbaa60 --- /dev/null +++ b/docs/data/charts/references/demos/reference-area-basic/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReferenceAreaBasic from './ReferenceAreaBasic'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReferenceAreaBasic, { ClientProvider }); diff --git a/docs/data/charts/references/ReferenceLineBasic.tsx b/docs/data/charts/references/demos/reference-line-basic/ReferenceLineBasic.tsx similarity index 75% rename from docs/data/charts/references/ReferenceLineBasic.tsx rename to docs/data/charts/references/demos/reference-line-basic/ReferenceLineBasic.tsx index ce0a4dc2dcd4a..ac9f6e3483d00 100644 --- a/docs/data/charts/references/ReferenceLineBasic.tsx +++ b/docs/data/charts/references/demos/reference-line-basic/ReferenceLineBasic.tsx @@ -1,13 +1,16 @@ import * as React from 'react'; -import { LineChart, LineChartProps } from '@mui/x-charts/LineChart'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; export default function ReferenceLineBasic() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/references/demos/reference-line-basic/client.ts b/docs/data/charts/references/demos/reference-line-basic/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/references/demos/reference-line-basic/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/references/demos/reference-line-basic/index.ts b/docs/data/charts/references/demos/reference-line-basic/index.ts new file mode 100644 index 0000000000000..6fbdb2ea6ae30 --- /dev/null +++ b/docs/data/charts/references/demos/reference-line-basic/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReferenceLineBasic from './ReferenceLineBasic'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReferenceLineBasic, { ClientProvider }); diff --git a/docs/data/charts/references/ReferenceLineLabel.tsx b/docs/data/charts/references/demos/reference-line-label/ReferenceLineLabel.tsx similarity index 82% rename from docs/data/charts/references/ReferenceLineLabel.tsx rename to docs/data/charts/references/demos/reference-line-label/ReferenceLineLabel.tsx index 6c57b51cb63ed..8fcd8d126450a 100644 --- a/docs/data/charts/references/ReferenceLineLabel.tsx +++ b/docs/data/charts/references/demos/reference-line-label/ReferenceLineLabel.tsx @@ -1,9 +1,11 @@ import * as React from 'react'; -import { LineChart, LineChartProps } from '@mui/x-charts/LineChart'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; import { ChartsReferenceLine } from '@mui/x-charts/ChartsReferenceLine'; export default function ReferenceLineLabel() { return ( + // @focus-start @padding 2 @@ -16,6 +18,7 @@ export default function ReferenceLineLabel() { labelStyle={{ dominantBaseline: 'hanging' }} /> + // @focus-end ); } diff --git a/docs/data/charts/references/demos/reference-line-label/client.ts b/docs/data/charts/references/demos/reference-line-label/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/references/demos/reference-line-label/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/references/demos/reference-line-label/index.ts b/docs/data/charts/references/demos/reference-line-label/index.ts new file mode 100644 index 0000000000000..4e83970fdcc05 --- /dev/null +++ b/docs/data/charts/references/demos/reference-line-label/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReferenceLineLabel from './ReferenceLineLabel'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReferenceLineLabel, { ClientProvider }); diff --git a/docs/data/charts/references/ReferenceLineStyled.tsx b/docs/data/charts/references/demos/reference-line-styled/ReferenceLineStyled.tsx similarity index 86% rename from docs/data/charts/references/ReferenceLineStyled.tsx rename to docs/data/charts/references/demos/reference-line-styled/ReferenceLineStyled.tsx index 632aed7227085..a600a8dd3ba63 100644 --- a/docs/data/charts/references/ReferenceLineStyled.tsx +++ b/docs/data/charts/references/demos/reference-line-styled/ReferenceLineStyled.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { styled } from '@mui/material/styles'; -import { LineChart, LineChartProps } from '@mui/x-charts/LineChart'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; import { ChartsReferenceLine, referenceLineClasses, @@ -15,6 +16,7 @@ const StyledReferenceLine = styled(ChartsReferenceLine)(() => ({ export default function ReferenceLineStyled() { return ( + // @focus-start @padding 2 + // @focus-end ); } const chartsConfig: LineChartProps = { diff --git a/docs/data/charts/references/demos/reference-line-styled/client.ts b/docs/data/charts/references/demos/reference-line-styled/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/references/demos/reference-line-styled/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/references/demos/reference-line-styled/index.ts b/docs/data/charts/references/demos/reference-line-styled/index.ts new file mode 100644 index 0000000000000..7bac4b9626786 --- /dev/null +++ b/docs/data/charts/references/demos/reference-line-styled/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReferenceLineStyled from './ReferenceLineStyled'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReferenceLineStyled, { ClientProvider }); diff --git a/docs/data/charts/references/ReferenceOverview.tsx b/docs/data/charts/references/demos/reference-overview/ReferenceOverview.tsx similarity index 96% rename from docs/data/charts/references/ReferenceOverview.tsx rename to docs/data/charts/references/demos/reference-overview/ReferenceOverview.tsx index ec4147a1e78bc..cb4a765a9fe11 100644 --- a/docs/data/charts/references/ReferenceOverview.tsx +++ b/docs/data/charts/references/demos/reference-overview/ReferenceOverview.tsx @@ -14,9 +14,9 @@ import { ChartsZoomSlider } from '@mui/x-charts-pro/ChartsZoomSlider'; import { ChartsClipPath } from '@mui/x-charts-pro/ChartsClipPath'; import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight'; import { ChartsLegend } from '@mui/x-charts-pro/ChartsLegend'; -import { usaUnemploymentAndGdp } from '../dataset/usaUnemploymentAndGdp'; -import { useReferencePoint } from './ReferencePoint'; -import { ReferenceArea } from './ReferenceArea'; +import { usaUnemploymentAndGdp } from '../../../dataset/usaUnemploymentAndGdp'; +import { useReferencePoint } from '../../ReferencePoint'; +import { ReferenceArea } from '../../ReferenceArea'; type RecessionPeriod = { start: Date; @@ -107,6 +107,7 @@ function ElectionMarker(election: Election) { } export default function ReferenceOverview() { + // @focus-start @padding 1 const clipPathId = React.useId(); return ( @@ -214,4 +215,5 @@ export default function ReferenceOverview() { ); + // @focus-end } diff --git a/docs/data/charts/references/demos/reference-overview/client.ts b/docs/data/charts/references/demos/reference-overview/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/references/demos/reference-overview/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/references/demos/reference-overview/index.ts b/docs/data/charts/references/demos/reference-overview/index.ts new file mode 100644 index 0000000000000..f60e1f1af77e1 --- /dev/null +++ b/docs/data/charts/references/demos/reference-overview/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReferenceOverview from './ReferenceOverview'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReferenceOverview, { ClientProvider }); diff --git a/docs/data/charts/references/ReferencePointBasic.tsx b/docs/data/charts/references/demos/reference-point-basic/ReferencePointBasic.tsx similarity index 89% rename from docs/data/charts/references/ReferencePointBasic.tsx rename to docs/data/charts/references/demos/reference-point-basic/ReferencePointBasic.tsx index ba9a7bace5ae3..0ca40d5fdf88d 100644 --- a/docs/data/charts/references/ReferencePointBasic.tsx +++ b/docs/data/charts/references/demos/reference-point-basic/ReferencePointBasic.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; -import { LineChart, LineChartProps } from '@mui/x-charts/LineChart'; +import type { LineChartProps } from '@mui/x-charts/LineChart'; +import { LineChart } from '@mui/x-charts/LineChart'; import { useXScale, useYScale } from '@mui/x-charts/hooks'; import type { ScaleLinear, ScalePoint } from '@mui/x-charts-vendor/d3-scale'; @@ -38,6 +39,7 @@ function ReferencePoint(props: ReferencePointProps) { export default function ReferencePointBasic() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/references/demos/reference-point-basic/client.ts b/docs/data/charts/references/demos/reference-point-basic/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/references/demos/reference-point-basic/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/references/demos/reference-point-basic/index.ts b/docs/data/charts/references/demos/reference-point-basic/index.ts new file mode 100644 index 0000000000000..79d310d72f6e0 --- /dev/null +++ b/docs/data/charts/references/demos/reference-point-basic/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReferencePointBasic from './ReferencePointBasic'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReferencePointBasic, { ClientProvider }); diff --git a/docs/data/charts/references/references.md b/docs/data/charts/references/references.md index ed1a4ad744d32..810c832a7226e 100644 --- a/docs/data/charts/references/references.md +++ b/docs/data/charts/references/references.md @@ -22,7 +22,7 @@ We encourage you to build you own component by reusing those demo helpers. If you miss some behaviors, feel free to [open an issue](https://github.com/mui/mui-x/issues/new?template=2.feature.yml). ::: -{{"demo": "ReferenceOverview.js"}} +{{"component": "file://./demos/reference-overview/index.ts"}} ## Reference line @@ -36,14 +36,14 @@ When a chart has multiple axes, use the `axisId` prop to specify which axis the By default, it targets the first defined axis. ::: -{{"demo": "ReferenceLineBasic.js"}} +{{"component": "file://./demos/reference-line-basic/index.ts"}} ### Label You can add a `label` prop to display text alongside the reference line. Position it with the `labelAlign` prop, which accepts `'start'`, `'middle'` (default), and `'end'`. -{{"demo": "ReferenceLineLabel.js"}} +{{"component": "file://./demos/reference-line-label/index.ts"}} ### Styling @@ -55,7 +55,7 @@ You can style the `ChartsReferenceLine` with two ways Using the `labelStyle` is necessary if you your label has multiple lines. This property is used to measure the text size and correctly space the multiple lines. -{{"demo": "ReferenceLineStyled.js"}} +{{"component": "file://./demos/reference-line-styled/index.ts"}} ## Reference area @@ -69,10 +69,10 @@ This allows for example adding some labels to the area. Notice the usage of composition to be able to put the reference area below the plots. -{{"demo": "ReferenceAreaBasic.js"}} +{{"component": "file://./demos/reference-area-basic/index.ts"}} ## Reference point With the same logic as the previous section, you can highlight specific points in the chart. -{{"demo": "ReferencePointBasic.js"}} +{{"component": "file://./demos/reference-point-basic/index.ts"}} diff --git a/docs/data/charts/sankey/CustomNodeLabelPlot.tsx b/docs/data/charts/sankey/CustomNodeLabelPlot.tsx index a134aed1c9840..2acae6fd0dbac 100644 --- a/docs/data/charts/sankey/CustomNodeLabelPlot.tsx +++ b/docs/data/charts/sankey/CustomNodeLabelPlot.tsx @@ -1,13 +1,13 @@ 'use client'; import * as React from 'react'; import { useTheme } from '@mui/material/styles'; +import type { SankeyLayoutNode } from '@mui/x-charts-pro/SankeyChart'; import { - SankeyLayoutNode, useSankeyLayout, useSankeyNodeHighlightState, useSankeySeries, } from '@mui/x-charts-pro/SankeyChart'; -import { SeriesId } from '@mui/x-charts-pro/models'; +import type { SeriesId } from '@mui/x-charts-pro/models'; export function CustomNodeLabelPlot() { const sankeySeries = useSankeySeries()[0]; diff --git a/docs/data/charts/sankey/SankeyBasicDataStructure.js b/docs/data/charts/sankey/SankeyBasicDataStructure.js deleted file mode 100644 index 0b84465875bc0..0000000000000 --- a/docs/data/charts/sankey/SankeyBasicDataStructure.js +++ /dev/null @@ -1,19 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -export default function SankeyBasicDataStructure() { - return ( - - ); -} diff --git a/docs/data/charts/sankey/SankeyBasicDataStructure.tsx.preview b/docs/data/charts/sankey/SankeyBasicDataStructure.tsx.preview deleted file mode 100644 index 4cf06459764ef..0000000000000 --- a/docs/data/charts/sankey/SankeyBasicDataStructure.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/sankey/SankeyClick.js b/docs/data/charts/sankey/SankeyClick.js deleted file mode 100644 index c64d7e470e5fd..0000000000000 --- a/docs/data/charts/sankey/SankeyClick.js +++ /dev/null @@ -1,111 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const getCircularReplacer = () => { - const seen = new WeakSet(); - return (key, value) => { - if (key === 'source' || key === 'target') { - return '(Circular Node)'; - } - if (key === 'sourceLinks' || key === 'targetLinks') { - return '[...(Circular Links)]'; - } - - if (typeof value === 'object' && value !== null) { - if (seen.has(value)) { - return undefined; - } - seen.add(value); - } - return value; - }; -}; - -const sankeyChartsParams = { - series: { - data: { - nodes: [ - { id: 'Coal', label: 'Coal' }, - { id: 'Natural Gas', label: 'Natural Gas' }, - { id: 'Nuclear', label: 'Nuclear' }, - { id: 'Hydro', label: 'Hydro' }, - { id: 'Wind', label: 'Wind' }, - { id: 'Solar', label: 'Solar' }, - { id: 'Electricity', label: 'Electricity' }, - { id: 'Residential', label: 'Residential' }, - { id: 'Commercial', label: 'Commercial' }, - { id: 'Industrial', label: 'Industrial' }, - ], - links: [ - { source: 'Coal', target: 'Electricity', value: 30 }, - { source: 'Natural Gas', target: 'Electricity', value: 40 }, - { source: 'Nuclear', target: 'Electricity', value: 20 }, - { source: 'Hydro', target: 'Electricity', value: 10 }, - { source: 'Wind', target: 'Electricity', value: 15 }, - { source: 'Solar', target: 'Electricity', value: 8 }, - { source: 'Electricity', target: 'Residential', value: 45 }, - { source: 'Electricity', target: 'Commercial', value: 35 }, - { source: 'Electricity', target: 'Industrial', value: 43 }, - ], - }, - highlightScope: { - highlight: 'item', - }, - }, - height: 400, - margin: { left: 20, right: 120 }, -}; - -export default function SankeyClick() { - const [itemData, setItemData] = React.useState(); - - return ( - - - setItemData(d)} - onLinkClick={(event, d) => setItemData(d)} - /> - - - - - Click on the chart - { - setItemData(undefined); - }} - > - - - - - - - ); -} diff --git a/docs/data/charts/sankey/SankeyControlledHighlight.js b/docs/data/charts/sankey/SankeyControlledHighlight.js deleted file mode 100644 index 62496c6a0b45f..0000000000000 --- a/docs/data/charts/sankey/SankeyControlledHighlight.js +++ /dev/null @@ -1,118 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import FormControl from '@mui/material/FormControl'; -import FormLabel from '@mui/material/FormLabel'; -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -export default function SankeyControlledHighlight() { - const [highlightedItem, setHighlightedItem] = React.useState({ - seriesId: 'series-id', - subType: 'node', - nodeId: 'A', - }); - - const handleHighlightChange = (item) => { - setHighlightedItem(item); - }; - - const handleToggleChange = (_event, newValue) => { - if (newValue === null) { - setHighlightedItem(null); - return; - } - - if (newValue.startsWith('node-')) { - const nodeId = newValue.replace('node-', ''); - setHighlightedItem({ - seriesId: 'series-id', - subType: 'node', - nodeId, - }); - } else if (newValue.startsWith('link-')) { - const [source, target] = newValue.replace('link-', '').split('-'); - setHighlightedItem({ - seriesId: 'series-id', - subType: 'link', - sourceId: source, - targetId: target, - }); - } - }; - - const getCurrentValue = () => { - if (!highlightedItem) { - return null; - } - if (highlightedItem.subType === 'node') { - return `node-${highlightedItem.nodeId}`; - } - return `link-${highlightedItem.sourceId}-${highlightedItem.targetId}`; - }; - - return ( - - - Controlled Highlighting - - - Node A - - - Node C - - - Node E - - - Link A→C - - - Link B→D - - - - - - - ); -} diff --git a/docs/data/charts/sankey/SankeyCurveCorrection.js b/docs/data/charts/sankey/SankeyCurveCorrection.js deleted file mode 100644 index f1a57638d6cca..0000000000000 --- a/docs/data/charts/sankey/SankeyCurveCorrection.js +++ /dev/null @@ -1,64 +0,0 @@ -import * as React from 'react'; -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import Typography from '@mui/material/Typography'; -import Slider from '@mui/material/Slider'; -import Box from '@mui/material/Box'; - -const data = { - links: [ - { source: 'C', target: 'Y', value: 10 }, - { source: 'A', target: 'X', value: 25 }, - { source: 'B', target: 'X', value: 10 }, - { source: 'X', target: 'Z', value: 25 }, - { source: 'Y', target: 'Z', value: 8 }, - { source: 'B', target: 'Y', value: 5 }, - ], -}; - -export default function SankeyCurveCorrection() { - const [curveCorrection, setCurveCorrection] = React.useState(10); - - return ( - - - - - ); -} - -function SliderHandle(props) { - return ( - - - Curve Correction: {props.curveCorrection} - - props.setCurveCorrection(value)} - min={-20} - max={20} - step={1} - sx={{ mb: 3 }} - marks={[ - { value: -20, label: '-20' }, - { value: -10, label: '-10' }, - { value: 0, label: '0' }, - { value: 5, label: '5' }, - { value: 10, label: '10 (default)' }, - { value: 20, label: '20' }, - ]} - /> - - ); -} diff --git a/docs/data/charts/sankey/SankeyCurveCorrection.tsx.preview b/docs/data/charts/sankey/SankeyCurveCorrection.tsx.preview deleted file mode 100644 index 1f2a5d6be2daf..0000000000000 --- a/docs/data/charts/sankey/SankeyCurveCorrection.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/sankey/SankeyDetailedDataStructure.js b/docs/data/charts/sankey/SankeyDetailedDataStructure.js deleted file mode 100644 index c63b93506b9b0..0000000000000 --- a/docs/data/charts/sankey/SankeyDetailedDataStructure.js +++ /dev/null @@ -1,25 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -export default function SankeyDetailedDataStructure() { - return ( - - ); -} diff --git a/docs/data/charts/sankey/SankeyDetailedDataStructure.tsx.preview b/docs/data/charts/sankey/SankeyDetailedDataStructure.tsx.preview deleted file mode 100644 index 3f05b764dea10..0000000000000 --- a/docs/data/charts/sankey/SankeyDetailedDataStructure.tsx.preview +++ /dev/null @@ -1,19 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/sankey/SankeyHighlighting.js b/docs/data/charts/sankey/SankeyHighlighting.js deleted file mode 100644 index 2df3c371d03c4..0000000000000 --- a/docs/data/charts/sankey/SankeyHighlighting.js +++ /dev/null @@ -1,109 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -export default function SankeyHighlighting() { - const [nodeHighlight, setNodeHighlight] = React.useState('links'); - const [nodeFade, setNodeFade] = React.useState('global'); - const [linkHighlight, setLinkHighlight] = React.useState('links'); - const [linkFade, setLinkFade] = React.useState('global'); - - return ( - - - - - - - setNodeHighlight(event.target.value)} - fullWidth - > - nodes - links - incoming - outgoing - none - - setNodeFade(event.target.value)} - fullWidth - > - global - none - - - - setLinkHighlight(event.target.value)} - fullWidth - > - links - nodes - source - target - none - - setLinkFade(event.target.value)} - fullWidth - > - global - none - - - - - ); -} diff --git a/docs/data/charts/sankey/SankeyIterations.js b/docs/data/charts/sankey/SankeyIterations.js deleted file mode 100644 index f96a349368cae..0000000000000 --- a/docs/data/charts/sankey/SankeyIterations.js +++ /dev/null @@ -1,69 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; - -const data = { - nodes: [ - { id: 'A', label: 'Energy' }, - { id: 'B', label: 'Coal' }, - { id: 'C', label: 'Gas' }, - { id: 'D', label: 'Oil' }, - { id: 'E', label: 'Electricity' }, - { id: 'F', label: 'Heat' }, - { id: 'G', label: 'Residential' }, - { id: 'H', label: 'Commercial' }, - { id: 'I', label: 'Industrial' }, - ], - links: [ - { source: 'A', target: 'B', value: 30 }, - { source: 'A', target: 'C', value: 25 }, - { source: 'A', target: 'D', value: 20 }, - { source: 'B', target: 'E', value: 25 }, - { source: 'C', target: 'E', value: 20 }, - { source: 'C', target: 'F', value: 5 }, - { source: 'D', target: 'F', value: 18 }, - { source: 'E', target: 'G', value: 15 }, - { source: 'E', target: 'H', value: 20 }, - { source: 'E', target: 'I', value: 10 }, - { source: 'F', target: 'G', value: 8 }, - { source: 'F', target: 'H', value: 10 }, - { source: 'F', target: 'I', value: 5 }, - ], -}; - -export default function SankeyIterations() { - return ( - ( - - )} - getCode={({ props }) => { - return `import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -`; - }} - /> - ); -} diff --git a/docs/data/charts/sankey/SankeyLinkKeywordColors.js b/docs/data/charts/sankey/SankeyLinkKeywordColors.js deleted file mode 100644 index a784bdace6183..0000000000000 --- a/docs/data/charts/sankey/SankeyLinkKeywordColors.js +++ /dev/null @@ -1,69 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; - -const data = { - nodes: [ - { id: 'Input', label: 'Input' }, - { id: 'ProcessA', label: 'Process A' }, - { id: 'ProcessB', label: 'Process B' }, - { id: 'Output', label: 'Output' }, - ], - links: [ - { source: 'Input', target: 'ProcessA', value: 30 }, - { source: 'Input', target: 'ProcessB', value: 20 }, - { source: 'ProcessA', target: 'Output', value: 25 }, - { source: 'ProcessB', target: 'Output', value: 15 }, - ], -}; - -export default function SankeyLinkKeywordColors() { - return ( - { - const linkColor = - props.linkColorMode === 'default' ? undefined : props.linkColorMode; - - return ( - - ); - }} - getCode={({ props }) => { - const linkColor = - props.linkColorMode === 'default' ? undefined : props.linkColorMode; - - return `import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -`; - }} - /> - ); -} diff --git a/docs/data/charts/sankey/SankeyLinkSorting.js b/docs/data/charts/sankey/SankeyLinkSorting.js deleted file mode 100644 index 024db55882f23..0000000000000 --- a/docs/data/charts/sankey/SankeyLinkSorting.js +++ /dev/null @@ -1,72 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import Typography from '@mui/material/Typography'; - -const data = { - links: [ - { source: 'C', target: 'Y', value: 10 }, - { source: 'B', target: 'X', value: 10 }, - { source: 'B', target: 'Y', value: 5 }, - { source: 'X', target: 'Z', value: 25 }, - { source: 'Y', target: 'Z', value: 8 }, - { source: 'A', target: 'X', value: 25 }, - ], -}; - -// Sort links by value (descending) -const linkSortFunction = (a, b) => b.value - a.value; - -export default function SankeyLinkSorting() { - return ( - div': { flex: '1 0 0' } }} - > -
- - auto (default) - - -
- -
- - fixed - - -
- -
- - Custom Function - - -
-
- ); -} diff --git a/docs/data/charts/sankey/SankeyLinkStyling.js b/docs/data/charts/sankey/SankeyLinkStyling.js deleted file mode 100644 index 05972ab4f415d..0000000000000 --- a/docs/data/charts/sankey/SankeyLinkStyling.js +++ /dev/null @@ -1,75 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; - -const data = { - nodes: [ - { id: 'A', label: 'Source A' }, - { id: 'B', label: 'Process B' }, - { id: 'C', label: 'Process C' }, - { id: 'D', label: 'Output D' }, - ], - links: [ - { source: 'A', target: 'B', value: 15 }, - { source: 'A', target: 'C', value: 10 }, - { source: 'B', target: 'D', value: 12 }, - { source: 'C', target: 'D', value: 8 }, - ], -}; - -export default function SankeyLinkStyling() { - return ( - ( - - )} - getCode={({ props }) => { - return `import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -`; - }} - /> - ); -} diff --git a/docs/data/charts/sankey/SankeyNodeAlignment.js b/docs/data/charts/sankey/SankeyNodeAlignment.js deleted file mode 100644 index 4d4561ced50c0..0000000000000 --- a/docs/data/charts/sankey/SankeyNodeAlignment.js +++ /dev/null @@ -1,88 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import { Stack } from '@mui/system'; -import Typography from '@mui/material/Typography'; - -export default function SankeyNodeAlignment() { - return ( - - - - Left - - - - Right - - - - - - Justify - - - - Center - - - - - ); -} - -const data = { - nodes: [], - links: [ - { source: 'A', target: 'B', value: 2 }, - { source: 'B', target: 'D', value: 4 }, - { source: 'E', target: 'D', value: 4 }, - { source: 'D', target: 'F', value: 1 }, - { source: 'D', target: 'G', value: 7 }, - { source: 'G', target: 'H', value: 2 }, - { source: 'G', target: 'I', value: 5 }, - { source: 'I', target: 'J', value: 3 }, - { source: 'I', target: 'K', value: 2 }, - ], -}; - -// Sort nodes alphabetically by label -const nodeSortFunction = (a, b) => { - const labelA = a.label || a.id; - const labelB = b.label || b.id; - return labelA.localeCompare(labelB); -}; diff --git a/docs/data/charts/sankey/SankeyNodeSorting.js b/docs/data/charts/sankey/SankeyNodeSorting.js deleted file mode 100644 index 178201e76260b..0000000000000 --- a/docs/data/charts/sankey/SankeyNodeSorting.js +++ /dev/null @@ -1,84 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import Typography from '@mui/material/Typography'; - -const data = { - nodes: [ - { id: 'C' }, - { id: 'B' }, - { id: 'A' }, - { id: 'X' }, - { id: 'Y' }, - { id: 'Z' }, - ], - links: [ - { source: 'C', target: 'Y', value: 10 }, - { source: 'A', target: 'X', value: 25 }, - { source: 'B', target: 'X', value: 10 }, - { source: 'X', target: 'Z', value: 25 }, - { source: 'Y', target: 'Z', value: 8 }, - { source: 'B', target: 'Y', value: 5 }, - ], -}; - -// Sort nodes alphabetically by label -const nodeSortFunction = (a, b) => { - const labelA = a.label || a.id; - const labelB = b.label || b.id; - return labelB.localeCompare(labelA); -}; - -export default function SankeyNodeSorting() { - return ( - div': { flex: '1 0 0' } }} - > -
- - auto (default) - - -
- -
- - fixed - - -
- -
- - Custom Function - - -
-
- ); -} diff --git a/docs/data/charts/sankey/SankeyNodeStyling.js b/docs/data/charts/sankey/SankeyNodeStyling.js deleted file mode 100644 index a8b4b6c6f1fd4..0000000000000 --- a/docs/data/charts/sankey/SankeyNodeStyling.js +++ /dev/null @@ -1,79 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; - -const data = { - nodes: [ - { id: 'A', label: 'Source A' }, - { id: 'B', label: 'Process B' }, - { id: 'C', label: 'Process C' }, - { id: 'D', label: 'Output D' }, - ], - links: [ - { source: 'A', target: 'B', value: 15 }, - { source: 'A', target: 'C', value: 10 }, - { source: 'B', target: 'D', value: 12 }, - { source: 'C', target: 'D', value: 8 }, - ], -}; - -export default function SankeyNodeStyling() { - return ( - ( - - )} - getCode={({ props }) => { - return `import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -`; - }} - /> - ); -} diff --git a/docs/data/charts/sankey/SankeyOverview.js b/docs/data/charts/sankey/SankeyOverview.js deleted file mode 100644 index 6fab5c950b408..0000000000000 --- a/docs/data/charts/sankey/SankeyOverview.js +++ /dev/null @@ -1,144 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import useMediaQuery from '@mui/material/useMediaQuery'; -import { useTheme } from '@mui/material/styles'; -import { - SankeyLinkPlot, - SankeyNodePlot, - SankeyTooltip, - SankeyDataProvider, -} from '@mui/x-charts-pro/SankeyChart'; -import { ChartsWrapper } from '@mui/x-charts-pro/ChartsWrapper'; -import { ChartsSurface } from '@mui/x-charts-pro/ChartsSurface'; -import { CustomNodeLabelPlot } from './CustomNodeLabelPlot'; - -const data = { - nodes: [ - // Sub-segment - { id: 'Server Products', color: '#595b63' }, - { id: 'Enterprise Services', color: '#595b63' }, - { id: 'M365 Commercial', color: '#595b63' }, - { id: 'M365 Consumer', color: '#595b63' }, - { id: 'LinkedIn', color: '#595b63' }, - { id: 'Dynamics', color: '#595b63' }, - { id: 'Gaming', color: '#595b63' }, - { id: 'Windows & Devices', color: '#595b63' }, - { id: 'Search & News Ads', color: '#595b63' }, - // Main revenue segments - { id: 'Intelligent Cloud', label: 'Cloud', color: '#595b63' }, - { id: 'Productivity', color: '#595b63' }, - { id: 'Personal Computing', label: 'Personal Computing', color: '#595b63' }, - { id: 'Revenue', label: 'Total Revenue', color: '#595b63' }, - // Gross Profit and breakdown - { id: 'Gross Profit', label: 'Gross Profit', color: '#44CE8D' }, - { id: 'Operating Profit', label: 'Operating Profit', color: '#44CE8D' }, - { id: 'Net Profit', label: 'Net Profit', color: '#44CE8D' }, - { id: 'Tax', label: 'Income Tax', color: '#F35865' }, - { id: 'Other Loss', label: 'Other Loss', color: '#F35865' }, - { id: 'Operating Expenses', label: 'Operating Expenses', color: '#F35865' }, - { id: 'R&D', label: 'R&D', color: '#F35865' }, - { id: 'S&M', label: 'Sales & Marketing', color: '#F35865' }, - { id: 'G&A', label: 'General & Administration', color: '#F35865' }, - // Cost of Revenue and breakdown - { id: 'Cost of Revenue', label: 'Cost of Revenue', color: '#F35865' }, - { id: 'Product Costs', label: 'Product Costs', color: '#F35865' }, - { id: 'Service Costs', label: 'Service Costs', color: '#F35865' }, - ], - links: [ - // Revenue-in links - { source: 'Server Products', target: 'Intelligent Cloud', value: 98.4 }, - { source: 'Enterprise Services', target: 'Intelligent Cloud', value: 7.7 }, - { source: 'M365 Commercial', target: 'Productivity', value: 87.7 }, - { source: 'M365 Consumer', target: 'Productivity', value: 7.4 }, - { source: 'LinkedIn', target: 'Productivity', value: 17.8 }, - { source: 'Dynamics', target: 'Productivity', value: 7.8 }, - { source: 'Gaming', target: 'Personal Computing', value: 23.4 }, - { source: 'Windows & Devices', target: 'Personal Computing', value: 17.3 }, - { source: 'Search & News Ads', target: 'Personal Computing', value: 13.8 }, - { source: 'Intelligent Cloud', target: 'Revenue', value: 106.2 }, - { source: 'Productivity', target: 'Revenue', value: 120.8 }, - { source: 'Personal Computing', target: 'Revenue', value: 54.6 }, - // Revenue-out links - { source: 'Revenue', target: 'Cost of Revenue', value: 87.8 }, - { source: 'Revenue', target: 'Gross Profit', value: 193.8 }, - { source: 'Gross Profit', target: 'Operating Profit', value: 128.5 }, - { source: 'Gross Profit', target: 'Operating Expenses', value: 65.3 }, - { source: 'Cost of Revenue', target: 'Product Costs', value: 13.5 }, - { source: 'Cost of Revenue', target: 'Service Costs', value: 74.3 }, - { source: 'Operating Profit', target: 'Tax', value: 21.7 }, - { source: 'Operating Profit', target: 'Other Loss', value: 4.9 }, - { source: 'Operating Profit', target: 'Net Profit', value: 101.8 }, - { source: 'Operating Expenses', target: 'R&D', value: 32.4 }, - { source: 'Operating Expenses', target: 'S&M', value: 25.6 }, - { source: 'Operating Expenses', target: 'G&A', value: 7.2 }, - ], -}; - -const valueFormatter = (value, context) => { - if (context.type === 'link') { - return `${value}B`; - } - // The value of a node is the sum of its incoming links - return `${value}B total`; -}; - -export default function SankeyOverview() { - const theme = useTheme(); - const isDesktop = useMediaQuery(theme.breakpoints.up('sm')); - - return ( - - - Microsoft FY 2025 Income Statement - - - Flow from Revenue to Net Income (in Billions USD) - - - - - - - - - - - {} - - - - - ); -} diff --git a/docs/data/charts/sankey/SankeyValueFormatter.js b/docs/data/charts/sankey/SankeyValueFormatter.js deleted file mode 100644 index d3dde01262836..0000000000000 --- a/docs/data/charts/sankey/SankeyValueFormatter.js +++ /dev/null @@ -1,53 +0,0 @@ -import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; - -const data = { - nodes: [ - { id: 'Coal', label: 'Coal' }, - { id: 'Natural Gas', label: 'Natural Gas' }, - { id: 'Nuclear', label: 'Nuclear' }, - { id: 'Hydro', label: 'Hydro' }, - { id: 'Wind', label: 'Wind' }, - { id: 'Solar', label: 'Solar' }, - { id: 'Electricity', label: 'Electricity' }, - { id: 'Residential', label: 'Residential' }, - { id: 'Commercial', label: 'Commercial' }, - { id: 'Industrial', label: 'Industrial' }, - ], - links: [ - { source: 'Coal', target: 'Electricity', value: 300 }, - { source: 'Natural Gas', target: 'Electricity', value: 400 }, - { source: 'Nuclear', target: 'Electricity', value: 200 }, - { source: 'Hydro', target: 'Electricity', value: 100 }, - { source: 'Wind', target: 'Electricity', value: 150 }, - { source: 'Solar', target: 'Electricity', value: 80 }, - { source: 'Electricity', target: 'Residential', value: 450 }, - { source: 'Electricity', target: 'Commercial', value: 350 }, - { source: 'Electricity', target: 'Industrial', value: 430 }, - ], -}; - -export default function SankeyValueFormatter() { - return ( - { - // Format the value as energy units - const formatted = - value >= 1000 ? `${(value / 1000).toFixed(1)} GWh` : `${value} MWh`; - - // You can customize formatting based on context type - if (context.type === 'link') { - return `${formatted}`; - } - - return `${formatted} total`; - }, - linkOptions: { - showValues: true, - }, - }} - /> - ); -} diff --git a/docs/data/charts/sankey/SankeyBasicDataStructure.tsx b/docs/data/charts/sankey/demos/sankey-basic-data-structure/SankeyBasicDataStructure.tsx similarity index 90% rename from docs/data/charts/sankey/SankeyBasicDataStructure.tsx rename to docs/data/charts/sankey/demos/sankey-basic-data-structure/SankeyBasicDataStructure.tsx index 0b84465875bc0..b26391c5f4127 100644 --- a/docs/data/charts/sankey/SankeyBasicDataStructure.tsx +++ b/docs/data/charts/sankey/demos/sankey-basic-data-structure/SankeyBasicDataStructure.tsx @@ -2,6 +2,7 @@ import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; export default function SankeyBasicDataStructure() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/sankey/demos/sankey-basic-data-structure/client.ts b/docs/data/charts/sankey/demos/sankey-basic-data-structure/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-basic-data-structure/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-basic-data-structure/index.ts b/docs/data/charts/sankey/demos/sankey-basic-data-structure/index.ts new file mode 100644 index 0000000000000..91807546e772b --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-basic-data-structure/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyBasicDataStructure from './SankeyBasicDataStructure'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyBasicDataStructure, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyClick.tsx b/docs/data/charts/sankey/demos/sankey-click/SankeyClick.tsx similarity index 94% rename from docs/data/charts/sankey/SankeyClick.tsx rename to docs/data/charts/sankey/demos/sankey-click/SankeyClick.tsx index 32d6bb11c0f3a..d15733aa20684 100644 --- a/docs/data/charts/sankey/SankeyClick.tsx +++ b/docs/data/charts/sankey/demos/sankey-click/SankeyClick.tsx @@ -4,7 +4,8 @@ import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import IconButton from '@mui/material/IconButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { SankeyChart, SankeyItemIdentifier } from '@mui/x-charts-pro/SankeyChart'; +import type { SankeyItemIdentifier } from '@mui/x-charts-pro/SankeyChart'; +import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; const getCircularReplacer = () => { @@ -63,6 +64,7 @@ const sankeyChartsParams = { } as const; export default function SankeyClick() { + // @focus-start @padding 1 const [itemData, setItemData] = React.useState(); return ( @@ -108,4 +110,5 @@ ${itemData ? JSON.stringify(itemData, getCircularReplacer(), 2) : '// The data w ); + // @focus-end } diff --git a/docs/data/charts/sankey/demos/sankey-click/client.ts b/docs/data/charts/sankey/demos/sankey-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-click/index.ts b/docs/data/charts/sankey/demos/sankey-click/index.ts new file mode 100644 index 0000000000000..29c6e8d12e05d --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyClick from './SankeyClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyClick, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyControlledHighlight.tsx b/docs/data/charts/sankey/demos/sankey-controlled-highlight/SankeyControlledHighlight.tsx similarity index 96% rename from docs/data/charts/sankey/SankeyControlledHighlight.tsx rename to docs/data/charts/sankey/demos/sankey-controlled-highlight/SankeyControlledHighlight.tsx index fa3554e981542..d2a279ebf213f 100644 --- a/docs/data/charts/sankey/SankeyControlledHighlight.tsx +++ b/docs/data/charts/sankey/demos/sankey-controlled-highlight/SankeyControlledHighlight.tsx @@ -5,9 +5,10 @@ import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; import FormControl from '@mui/material/FormControl'; import FormLabel from '@mui/material/FormLabel'; import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; -import { HighlightItemIdentifier } from '@mui/x-charts-pro/models'; +import type { HighlightItemIdentifier } from '@mui/x-charts-pro/models'; export default function SankeyControlledHighlight() { + // @focus-start @padding 1 type HighlightItem = HighlightItemIdentifier<'sankey'> | null; const [highlightedItem, setHighlightedItem] = React.useState({ seriesId: 'series-id', @@ -120,4 +121,5 @@ export default function SankeyControlledHighlight() { /> ); + // @focus-end } diff --git a/docs/data/charts/sankey/demos/sankey-controlled-highlight/client.ts b/docs/data/charts/sankey/demos/sankey-controlled-highlight/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-controlled-highlight/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-controlled-highlight/index.ts b/docs/data/charts/sankey/demos/sankey-controlled-highlight/index.ts new file mode 100644 index 0000000000000..5c76f420c6ad9 --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-controlled-highlight/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyControlledHighlight from './SankeyControlledHighlight'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyControlledHighlight, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyCurveCorrection.tsx b/docs/data/charts/sankey/demos/sankey-curve-correction/SankeyCurveCorrection.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyCurveCorrection.tsx rename to docs/data/charts/sankey/demos/sankey-curve-correction/SankeyCurveCorrection.tsx index 4d77408c293c2..2710fe7be78c0 100644 --- a/docs/data/charts/sankey/SankeyCurveCorrection.tsx +++ b/docs/data/charts/sankey/demos/sankey-curve-correction/SankeyCurveCorrection.tsx @@ -16,6 +16,7 @@ const data = { }; export default function SankeyCurveCorrection() { + // @focus-start @padding 1 const [curveCorrection, setCurveCorrection] = React.useState(10); return ( @@ -35,6 +36,7 @@ export default function SankeyCurveCorrection() { /> ); + // @focus-end } function SliderHandle(props: { diff --git a/docs/data/charts/sankey/demos/sankey-curve-correction/client.ts b/docs/data/charts/sankey/demos/sankey-curve-correction/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-curve-correction/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-curve-correction/index.ts b/docs/data/charts/sankey/demos/sankey-curve-correction/index.ts new file mode 100644 index 0000000000000..bc02d1bb50036 --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-curve-correction/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyCurveCorrection from './SankeyCurveCorrection'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyCurveCorrection, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyDetailedDataStructure.tsx b/docs/data/charts/sankey/demos/sankey-detailed-data-structure/SankeyDetailedDataStructure.tsx similarity index 94% rename from docs/data/charts/sankey/SankeyDetailedDataStructure.tsx rename to docs/data/charts/sankey/demos/sankey-detailed-data-structure/SankeyDetailedDataStructure.tsx index c63b93506b9b0..e2f85dbb4e136 100644 --- a/docs/data/charts/sankey/SankeyDetailedDataStructure.tsx +++ b/docs/data/charts/sankey/demos/sankey-detailed-data-structure/SankeyDetailedDataStructure.tsx @@ -2,6 +2,7 @@ import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; export default function SankeyDetailedDataStructure() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/sankey/demos/sankey-detailed-data-structure/client.ts b/docs/data/charts/sankey/demos/sankey-detailed-data-structure/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-detailed-data-structure/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-detailed-data-structure/index.ts b/docs/data/charts/sankey/demos/sankey-detailed-data-structure/index.ts new file mode 100644 index 0000000000000..663b12432ff1f --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-detailed-data-structure/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyDetailedDataStructure from './SankeyDetailedDataStructure'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyDetailedDataStructure, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyHighlighting.tsx b/docs/data/charts/sankey/demos/sankey-highlighting/SankeyHighlighting.tsx similarity index 98% rename from docs/data/charts/sankey/SankeyHighlighting.tsx rename to docs/data/charts/sankey/demos/sankey-highlighting/SankeyHighlighting.tsx index 64f83d97e7732..4a5dfc7339b09 100644 --- a/docs/data/charts/sankey/SankeyHighlighting.tsx +++ b/docs/data/charts/sankey/demos/sankey-highlighting/SankeyHighlighting.tsx @@ -6,6 +6,7 @@ import MenuItem from '@mui/material/MenuItem'; import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; export default function SankeyHighlighting() { + // @focus-start @padding 1 const [nodeHighlight, setNodeHighlight] = React.useState< 'nodes' | 'links' | 'incoming' | 'outgoing' | 'none' >('links'); @@ -124,4 +125,5 @@ export default function SankeyHighlighting() { ); + // @focus-end } diff --git a/docs/data/charts/sankey/demos/sankey-highlighting/client.ts b/docs/data/charts/sankey/demos/sankey-highlighting/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-highlighting/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-highlighting/index.ts b/docs/data/charts/sankey/demos/sankey-highlighting/index.ts new file mode 100644 index 0000000000000..4819f48a89b08 --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-highlighting/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyHighlighting from './SankeyHighlighting'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyHighlighting, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyIterations.tsx b/docs/data/charts/sankey/demos/sankey-iterations/SankeyIterations.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyIterations.tsx rename to docs/data/charts/sankey/demos/sankey-iterations/SankeyIterations.tsx index f96a349368cae..06b4b84ec0e83 100644 --- a/docs/data/charts/sankey/SankeyIterations.tsx +++ b/docs/data/charts/sankey/demos/sankey-iterations/SankeyIterations.tsx @@ -32,6 +32,7 @@ const data = { export default function SankeyIterations() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/sankey/demos/sankey-iterations/client.ts b/docs/data/charts/sankey/demos/sankey-iterations/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-iterations/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-iterations/index.ts b/docs/data/charts/sankey/demos/sankey-iterations/index.ts new file mode 100644 index 0000000000000..2c27363c7f6ad --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-iterations/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyIterations from './SankeyIterations'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyIterations, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyLinkKeywordColors.tsx b/docs/data/charts/sankey/demos/sankey-link-keyword-colors/SankeyLinkKeywordColors.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyLinkKeywordColors.tsx rename to docs/data/charts/sankey/demos/sankey-link-keyword-colors/SankeyLinkKeywordColors.tsx index a784bdace6183..1b3a3d6b7bf6d 100644 --- a/docs/data/charts/sankey/SankeyLinkKeywordColors.tsx +++ b/docs/data/charts/sankey/demos/sankey-link-keyword-colors/SankeyLinkKeywordColors.tsx @@ -18,6 +18,7 @@ const data = { export default function SankeyLinkKeywordColors() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/sankey/demos/sankey-link-keyword-colors/client.ts b/docs/data/charts/sankey/demos/sankey-link-keyword-colors/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-link-keyword-colors/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-link-keyword-colors/index.ts b/docs/data/charts/sankey/demos/sankey-link-keyword-colors/index.ts new file mode 100644 index 0000000000000..d8d3eb4494e75 --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-link-keyword-colors/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyLinkKeywordColors from './SankeyLinkKeywordColors'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyLinkKeywordColors, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyLinkSorting.tsx b/docs/data/charts/sankey/demos/sankey-link-sorting/SankeyLinkSorting.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyLinkSorting.tsx rename to docs/data/charts/sankey/demos/sankey-link-sorting/SankeyLinkSorting.tsx index 12a3d7a133fa5..fd77023a747c1 100644 --- a/docs/data/charts/sankey/SankeyLinkSorting.tsx +++ b/docs/data/charts/sankey/demos/sankey-link-sorting/SankeyLinkSorting.tsx @@ -23,6 +23,7 @@ export default function SankeyLinkSorting() { spacing={3} sx={{ width: '100%', '&>div': { flex: '1 0 0' } }} > + {/* @focus-start */}
auto (default) @@ -67,6 +68,7 @@ export default function SankeyLinkSorting() { }} />
+ {/* @focus-end */} ); } diff --git a/docs/data/charts/sankey/demos/sankey-link-sorting/client.ts b/docs/data/charts/sankey/demos/sankey-link-sorting/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-link-sorting/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-link-sorting/index.ts b/docs/data/charts/sankey/demos/sankey-link-sorting/index.ts new file mode 100644 index 0000000000000..99676d70c7e38 --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-link-sorting/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyLinkSorting from './SankeyLinkSorting'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyLinkSorting, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyLinkStyling.tsx b/docs/data/charts/sankey/demos/sankey-link-styling/SankeyLinkStyling.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyLinkStyling.tsx rename to docs/data/charts/sankey/demos/sankey-link-styling/SankeyLinkStyling.tsx index 05972ab4f415d..a21d9df010dce 100644 --- a/docs/data/charts/sankey/SankeyLinkStyling.tsx +++ b/docs/data/charts/sankey/demos/sankey-link-styling/SankeyLinkStyling.tsx @@ -18,6 +18,7 @@ const data = { export default function SankeyLinkStyling() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/sankey/demos/sankey-link-styling/client.ts b/docs/data/charts/sankey/demos/sankey-link-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-link-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-link-styling/index.ts b/docs/data/charts/sankey/demos/sankey-link-styling/index.ts new file mode 100644 index 0000000000000..70e51134a4c4e --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-link-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyLinkStyling from './SankeyLinkStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyLinkStyling, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyNodeAlignment.tsx b/docs/data/charts/sankey/demos/sankey-node-alignment/SankeyNodeAlignment.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyNodeAlignment.tsx rename to docs/data/charts/sankey/demos/sankey-node-alignment/SankeyNodeAlignment.tsx index 28dca2c499caf..86ca1efd08177 100644 --- a/docs/data/charts/sankey/SankeyNodeAlignment.tsx +++ b/docs/data/charts/sankey/demos/sankey-node-alignment/SankeyNodeAlignment.tsx @@ -5,6 +5,7 @@ import Typography from '@mui/material/Typography'; export default function SankeyNodeAlignment() { return ( + {/* @focus-start */} Left @@ -61,6 +62,7 @@ export default function SankeyNodeAlignment() { /> + {/* @focus-end */} ); } diff --git a/docs/data/charts/sankey/demos/sankey-node-alignment/client.ts b/docs/data/charts/sankey/demos/sankey-node-alignment/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-node-alignment/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-node-alignment/index.ts b/docs/data/charts/sankey/demos/sankey-node-alignment/index.ts new file mode 100644 index 0000000000000..4abbe37536c1c --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-node-alignment/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyNodeAlignment from './SankeyNodeAlignment'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyNodeAlignment, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyNodeSorting.tsx b/docs/data/charts/sankey/demos/sankey-node-sorting/SankeyNodeSorting.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyNodeSorting.tsx rename to docs/data/charts/sankey/demos/sankey-node-sorting/SankeyNodeSorting.tsx index 39f9979cdae6f..f2f01c745908b 100644 --- a/docs/data/charts/sankey/SankeyNodeSorting.tsx +++ b/docs/data/charts/sankey/demos/sankey-node-sorting/SankeyNodeSorting.tsx @@ -35,6 +35,7 @@ export default function SankeyNodeSorting() { spacing={3} sx={{ width: '100%', '&>div': { flex: '1 0 0' } }} > + {/* @focus-start */}
auto (default) @@ -79,6 +80,7 @@ export default function SankeyNodeSorting() { }} />
+ {/* @focus-end */} ); } diff --git a/docs/data/charts/sankey/demos/sankey-node-sorting/client.ts b/docs/data/charts/sankey/demos/sankey-node-sorting/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-node-sorting/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-node-sorting/index.ts b/docs/data/charts/sankey/demos/sankey-node-sorting/index.ts new file mode 100644 index 0000000000000..9f3a24c7443c1 --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-node-sorting/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyNodeSorting from './SankeyNodeSorting'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyNodeSorting, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyNodeStyling.tsx b/docs/data/charts/sankey/demos/sankey-node-styling/SankeyNodeStyling.tsx similarity index 97% rename from docs/data/charts/sankey/SankeyNodeStyling.tsx rename to docs/data/charts/sankey/demos/sankey-node-styling/SankeyNodeStyling.tsx index a8b4b6c6f1fd4..cfaf469270056 100644 --- a/docs/data/charts/sankey/SankeyNodeStyling.tsx +++ b/docs/data/charts/sankey/demos/sankey-node-styling/SankeyNodeStyling.tsx @@ -18,6 +18,7 @@ const data = { export default function SankeyNodeStyling() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/sankey/demos/sankey-node-styling/client.ts b/docs/data/charts/sankey/demos/sankey-node-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-node-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-node-styling/index.ts b/docs/data/charts/sankey/demos/sankey-node-styling/index.ts new file mode 100644 index 0000000000000..e0d6836f88ec1 --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-node-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyNodeStyling from './SankeyNodeStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyNodeStyling, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyOverview.tsx b/docs/data/charts/sankey/demos/sankey-overview/SankeyOverview.tsx similarity index 98% rename from docs/data/charts/sankey/SankeyOverview.tsx rename to docs/data/charts/sankey/demos/sankey-overview/SankeyOverview.tsx index 7a871741c77e8..7772aab36a5bb 100644 --- a/docs/data/charts/sankey/SankeyOverview.tsx +++ b/docs/data/charts/sankey/demos/sankey-overview/SankeyOverview.tsx @@ -11,7 +11,7 @@ import { } from '@mui/x-charts-pro/SankeyChart'; import { ChartsWrapper } from '@mui/x-charts-pro/ChartsWrapper'; import { ChartsSurface } from '@mui/x-charts-pro/ChartsSurface'; -import { CustomNodeLabelPlot } from './CustomNodeLabelPlot'; +import { CustomNodeLabelPlot } from '../../CustomNodeLabelPlot'; const data = { nodes: [ @@ -89,6 +89,7 @@ const valueFormatter = (value: number, context: { type: string }) => { }; export default function SankeyOverview() { + // @focus-start @padding 1 const theme = useTheme(); const isDesktop = useMediaQuery(theme.breakpoints.up('sm')); @@ -146,4 +147,5 @@ export default function SankeyOverview() { ); + // @focus-end } diff --git a/docs/data/charts/sankey/demos/sankey-overview/client.ts b/docs/data/charts/sankey/demos/sankey-overview/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-overview/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-overview/index.ts b/docs/data/charts/sankey/demos/sankey-overview/index.ts new file mode 100644 index 0000000000000..93208587228bf --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-overview/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyOverview from './SankeyOverview'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyOverview, { ClientProvider }); diff --git a/docs/data/charts/sankey/SankeyValueFormatter.tsx b/docs/data/charts/sankey/demos/sankey-value-formatter/SankeyValueFormatter.tsx similarity index 89% rename from docs/data/charts/sankey/SankeyValueFormatter.tsx rename to docs/data/charts/sankey/demos/sankey-value-formatter/SankeyValueFormatter.tsx index cab369d304f9a..a43af4ba97f16 100644 --- a/docs/data/charts/sankey/SankeyValueFormatter.tsx +++ b/docs/data/charts/sankey/demos/sankey-value-formatter/SankeyValueFormatter.tsx @@ -1,7 +1,5 @@ -import { - SankeyChart, - type SankeyValueFormatterContext, -} from '@mui/x-charts-pro/SankeyChart'; +import { SankeyChart } from '@mui/x-charts-pro/SankeyChart'; +import type { SankeyValueFormatterContext } from '@mui/x-charts-pro/SankeyChart'; const data = { nodes: [ @@ -31,6 +29,7 @@ const data = { export default function SankeyValueFormatter() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/sankey/demos/sankey-value-formatter/client.ts b/docs/data/charts/sankey/demos/sankey-value-formatter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-value-formatter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sankey/demos/sankey-value-formatter/index.ts b/docs/data/charts/sankey/demos/sankey-value-formatter/index.ts new file mode 100644 index 0000000000000..e69f123d42a6b --- /dev/null +++ b/docs/data/charts/sankey/demos/sankey-value-formatter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SankeyValueFormatter from './SankeyValueFormatter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SankeyValueFormatter, { ClientProvider }); diff --git a/docs/data/charts/sankey/sankey.md b/docs/data/charts/sankey/sankey.md index 5c94c38ed6831..6f8106533e2c6 100644 --- a/docs/data/charts/sankey/sankey.md +++ b/docs/data/charts/sankey/sankey.md @@ -15,7 +15,7 @@ Links connect sources to targets, and link width shows how large each flow is. The demo below shows flow from revenue to net income in billions USD. -{{"demo": "SankeyOverview.js"}} +{{"component": "file://./demos/sankey-overview/index.ts"}} ## Basics @@ -28,13 +28,13 @@ Provide a data structure with `nodes` and `links`: If a node appears in `links` but not in `nodes`, the chart creates it automatically and uses its ID as the label. -{{"demo": "SankeyBasicDataStructure.js"}} +{{"component": "file://./demos/sankey-basic-data-structure/index.ts"}} ### Explicit nodes When you define nodes in the `nodes` array, you can set labels and colors for each. -{{"demo": "SankeyDetailedDataStructure.js"}} +{{"component": "file://./demos/sankey-detailed-data-structure/index.ts"}} ## Styling @@ -42,13 +42,13 @@ When you define nodes in the `nodes` array, you can set labels and colors for ea Use the `nodeOptions` prop to apply default styles to all nodes. -{{"demo": "SankeyNodeStyling.js"}} +{{"component": "file://./demos/sankey-node-styling/index.ts"}} ### Default link styles Use the `linkOptions` prop to apply default styles to all links. -{{"demo": "SankeyLinkStyling.js"}} +{{"component": "file://./demos/sankey-link-styling/index.ts"}} ### Link color keywords @@ -56,7 +56,7 @@ Link colors can use `'source'` to inherit from the source node or `'target'` to This works for individual link colors and for the default in `linkOptions`. -{{"demo": "SankeyLinkKeywordColors.js"}} +{{"component": "file://./demos/sankey-link-keyword-colors/index.ts"}} ### Node alignment @@ -73,7 +73,7 @@ In the demo below: - Node E can sit in the first or second column - Node F can sit in columns 4, 5, or 6 -{{"demo": "SankeyNodeAlignment.js"}} +{{"component": "file://./demos/sankey-node-alignment/index.ts"}} ### Curve correction @@ -82,7 +82,7 @@ The effect depends on the graph layout and chart height. Higher values make links look thicker; lower values make them look thinner. The default is `10`. -{{"demo": "SankeyCurveCorrection.js"}} +{{"component": "file://./demos/sankey-curve-correction/index.ts"}} ## Value formatting @@ -92,7 +92,7 @@ The context includes `location` (`'tooltip'` or `'label'`), `type` (`'node'` or The demo below adds units to values and shows "total" when the pointer is over a node. -{{"demo": "SankeyValueFormatter.js"}} +{{"component": "file://./demos/sankey-value-formatter/index.ts"}} ## Sorting @@ -109,7 +109,7 @@ It accepts: - `'auto'` (default): automatic sorting to reduce link crossings - `'fixed'`: keep the order from the `nodes` array -{{"demo": "SankeyNodeSorting.js"}} +{{"component": "file://./demos/sankey-node-sorting/index.ts"}} ### Link sorting @@ -120,14 +120,14 @@ It accepts: - `'auto'` (default): automatic sorting to reduce link crossings - `'fixed'`: keep the order from the `links` array -{{"demo": "SankeyLinkSorting.js"}} +{{"component": "file://./demos/sankey-link-sorting/index.ts"}} ## Layout iterations The `iterations` prop sets how many times the layout algorithm runs. More iterations usually improve the layout but take longer. -{{"demo": "SankeyIterations.js"}} +{{"component": "file://./demos/sankey-iterations/index.ts"}} ## Interaction @@ -137,14 +137,14 @@ Use the `onNodeClick` and `onLinkClick` props to handle clicks on nodes and link Each callback receives the mouse event and an identifier object (`SankeyNodeIdentifierWithData` or `SankeyLinkIdentifierWithData`) with details about the clicked item. Use `SankeyItemIdentifierWithData` when you handle both in one callback. -{{"demo": "SankeyClick.js"}} +{{"component": "file://./demos/sankey-click/index.ts"}} ### Highlighting You can highlight nodes and links by hovering or programmatically. When an item is highlighted, you can fade others to improve focus. -{{"demo": "SankeyHighlighting.js"}} +{{"component": "file://./demos/sankey-highlighting/index.ts"}} Highlighting is configured separately for nodes and links. @@ -214,7 +214,7 @@ For links: The `onHighlightChange` callback runs when the highlighted item changes (from user interaction or programmatic updates). -{{"demo": "SankeyControlledHighlight.js"}} +{{"component": "file://./demos/sankey-controlled-highlight/index.ts"}} ## Tooltip diff --git a/docs/data/charts/scatter-demo/MultipleYAxesScatterChart.js b/docs/data/charts/scatter-demo/MultipleYAxesScatterChart.js deleted file mode 100644 index 6e3aa2c172550..0000000000000 --- a/docs/data/charts/scatter-demo/MultipleYAxesScatterChart.js +++ /dev/null @@ -1,63 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { axisClasses } from '@mui/x-charts/ChartsAxis'; -import Box from '@mui/material/Box'; - -const data1 = [ - { x: 100, y: 200, id: 1 }, - { x: 120, y: 100, id: 2 }, - { x: 170, y: 300, id: 3 }, - { x: 140, y: 250, id: 4 }, - { x: 150, y: 400, id: 5 }, - { x: 110, y: 280, id: 6 }, -]; - -const data2 = [ - { x: 300, y: 300, id: 1 }, - { x: 400, y: 500, id: 2 }, - { x: 200, y: 700, id: 3 }, - { x: 340, y: 350, id: 4 }, - { x: 560, y: 500, id: 5 }, - { x: 230, y: 780, id: 6 }, - { x: 500, y: 400, id: 7 }, - { x: 300, y: 500, id: 8 }, - { x: 240, y: 300, id: 9 }, - { x: 320, y: 550, id: 10 }, - { x: 500, y: 400, id: 11 }, - { x: 420, y: 280, id: 12 }, -]; - -export default function MultipleYAxesScatterChart() { - return ( - - value && `${value.x}cm, ${value.y}kg`, - }, - { - data: data2, - yAxisId: 'rightAxis', - valueFormatter: (value) => value && `${value.x}cm, ${value.y}kg`, - }, - ]} - xAxis={[{ min: 0, height: 28 }]} - yAxis={[ - { id: 'leftAxis', min: 0 }, - { id: 'rightAxis', min: 0, position: 'right' }, - ]} - sx={{ - [`& .${axisClasses.left}`]: { - line: { stroke: '#8884d8' }, - text: { fill: '#8884d8' }, - }, - [`& .${axisClasses.right}`]: { - line: { stroke: '#82ca9d' }, - text: { fill: '#82ca9d' }, - }, - }} - /> - - ); -} diff --git a/docs/data/charts/scatter-demo/SimpleScatterChart.js b/docs/data/charts/scatter-demo/SimpleScatterChart.js deleted file mode 100644 index 071452d926a91..0000000000000 --- a/docs/data/charts/scatter-demo/SimpleScatterChart.js +++ /dev/null @@ -1,22 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import Box from '@mui/material/Box'; - -const data = [ - { x: 100, y: 200, id: 1 }, - { x: 120, y: 100, id: 2 }, - { x: 170, y: 300, id: 3 }, - { x: 140, y: 250, id: 4 }, - { x: 150, y: 400, id: 5 }, - { x: 110, y: 280, id: 6 }, -]; - -export default function SimpleScatterChart() { - return ( - - - - ); -} diff --git a/docs/data/charts/scatter-demo/SimpleScatterChart.tsx.preview b/docs/data/charts/scatter-demo/SimpleScatterChart.tsx.preview deleted file mode 100644 index eee2107169640..0000000000000 --- a/docs/data/charts/scatter-demo/SimpleScatterChart.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/scatter-demo/MultipleYAxesScatterChart.tsx b/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/MultipleYAxesScatterChart.tsx similarity index 97% rename from docs/data/charts/scatter-demo/MultipleYAxesScatterChart.tsx rename to docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/MultipleYAxesScatterChart.tsx index ceb114e973523..125ae6d1359eb 100644 --- a/docs/data/charts/scatter-demo/MultipleYAxesScatterChart.tsx +++ b/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/MultipleYAxesScatterChart.tsx @@ -28,6 +28,7 @@ const data2 = [ export default function MultipleYAxesScatterChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/client.ts b/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/index.ts b/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/index.ts new file mode 100644 index 0000000000000..6761c09e12e95 --- /dev/null +++ b/docs/data/charts/scatter-demo/demos/multiple-y-axes-scatter-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MultipleYAxesScatterChart from './MultipleYAxesScatterChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MultipleYAxesScatterChart, { ClientProvider }); diff --git a/docs/data/charts/scatter-demo/SimpleScatterChart.tsx b/docs/data/charts/scatter-demo/demos/simple-scatter-chart/SimpleScatterChart.tsx similarity index 91% rename from docs/data/charts/scatter-demo/SimpleScatterChart.tsx rename to docs/data/charts/scatter-demo/demos/simple-scatter-chart/SimpleScatterChart.tsx index 071452d926a91..601ce8b016046 100644 --- a/docs/data/charts/scatter-demo/SimpleScatterChart.tsx +++ b/docs/data/charts/scatter-demo/demos/simple-scatter-chart/SimpleScatterChart.tsx @@ -13,10 +13,12 @@ const data = [ export default function SimpleScatterChart() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/scatter-demo/demos/simple-scatter-chart/client.ts b/docs/data/charts/scatter-demo/demos/simple-scatter-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter-demo/demos/simple-scatter-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter-demo/demos/simple-scatter-chart/index.ts b/docs/data/charts/scatter-demo/demos/simple-scatter-chart/index.ts new file mode 100644 index 0000000000000..da123d3319597 --- /dev/null +++ b/docs/data/charts/scatter-demo/demos/simple-scatter-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SimpleScatterChart from './SimpleScatterChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SimpleScatterChart, { ClientProvider }); diff --git a/docs/data/charts/scatter-demo/scatter-demo.md b/docs/data/charts/scatter-demo/scatter-demo.md index 91a62948a9578..8b33028858ad7 100644 --- a/docs/data/charts/scatter-demo/scatter-demo.md +++ b/docs/data/charts/scatter-demo/scatter-demo.md @@ -10,8 +10,8 @@ components: Scatter, ScatterChart, ScatterPlot ## SimpleScatterChart -{{"demo": "SimpleScatterChart.js"}} +{{"component": "file://./demos/simple-scatter-chart/index.ts"}} ## MultipleYAxesScatterChart -{{"demo": "MultipleYAxesScatterChart.js"}} +{{"component": "file://./demos/multiple-y-axes-scatter-chart/index.ts"}} diff --git a/docs/data/charts/scatter/BasicScatter.js b/docs/data/charts/scatter/BasicScatter.js deleted file mode 100644 index 69815168efb78..0000000000000 --- a/docs/data/charts/scatter/BasicScatter.js +++ /dev/null @@ -1,20 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; - -export default function BasicScatter() { - return ( - ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} - /> - ); -} diff --git a/docs/data/charts/scatter/BasicScatter.tsx.preview b/docs/data/charts/scatter/BasicScatter.tsx.preview deleted file mode 100644 index 2315905607c81..0000000000000 --- a/docs/data/charts/scatter/BasicScatter.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} -/> \ No newline at end of file diff --git a/docs/data/charts/scatter/ClosestPointInteraction.js b/docs/data/charts/scatter/ClosestPointInteraction.js deleted file mode 100644 index e01fe2271a8fc..0000000000000 --- a/docs/data/charts/scatter/ClosestPointInteraction.js +++ /dev/null @@ -1,90 +0,0 @@ -/* eslint-disable no-nested-ternary */ - -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Typography from '@mui/material/Typography'; -import Slider from '@mui/material/Slider'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import Radio from '@mui/material/Radio'; -import RadioGroup from '@mui/material/RadioGroup'; -import data from '../dataset/random/scatterParallel.json'; - -export default function ClosestPointInteraction() { - const [option, setOption] = React.useState('numeric'); - const [hitAreaRadius, setVoronoiMaxRadius] = React.useState(25); - - const handleMaxRadiusChange = (event, newValue) => { - if (typeof newValue !== 'number') { - return; - } - setVoronoiMaxRadius(newValue); - }; - - return ( - - ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} - /> -
- Maximum radius - setOption(event.target.value)}> - - } - label="'item'" - labelPlacement="end" - value="item" - /> - } - label="undefined" - labelPlacement="end" - value="undefined" - /> - } - label="numeric radius" - labelPlacement="end" - value="numeric" - /> - - - - - Numeric radius - - -
-
- ); -} diff --git a/docs/data/charts/scatter/CustomScatter.js b/docs/data/charts/scatter/CustomScatter.js deleted file mode 100644 index f3290adc1819f..0000000000000 --- a/docs/data/charts/scatter/CustomScatter.js +++ /dev/null @@ -1,59 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { useScatterSeries, useXScale, useYScale } from '@mui/x-charts/hooks'; - -const data1 = [ - { x: 95, y: 200, id: 1 }, - { x: 120, y: 100, id: 2 }, - { x: 170, y: 300, id: 3 }, - { x: 140, y: 250, id: 4 }, - { x: 150, y: 400, id: 5 }, - { x: 110, y: 280, id: 6 }, -]; - -const data2 = [ - { x: 300, y: 300, id: 1 }, - { x: 200, y: 700, id: 2 }, - { x: 400, y: 500, id: 3 }, - { x: 340, y: 350, id: 4 }, - { x: 420, y: 280, id: 5 }, -]; - -const series = [ - { id: 's1', data: data1, label: 'Open' }, - { id: 's2', data: data2, label: 'Closed' }, -]; - -function LinkPoints({ seriesId, close }) { - const scatter = useScatterSeries(seriesId); - const xScale = useXScale(); - const yScale = useYScale(); - - if (!scatter) { - return null; - } - const { color, data } = scatter; - - if (!data) { - return null; - } - - return ( - `${xScale(x)}, ${yScale(y)}`).join(' L')}${ - close ? 'Z' : '' - }`} - /> - ); -} - -export default function CustomScatter() { - return ( - - - - - ); -} diff --git a/docs/data/charts/scatter/CustomScatter.tsx.preview b/docs/data/charts/scatter/CustomScatter.tsx.preview deleted file mode 100644 index f69b4a311bb90..0000000000000 --- a/docs/data/charts/scatter/CustomScatter.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/data/charts/scatter/GridDemo.js b/docs/data/charts/scatter/GridDemo.js deleted file mode 100644 index 48dceb93c36d5..0000000000000 --- a/docs/data/charts/scatter/GridDemo.js +++ /dev/null @@ -1,21 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; - -export default function GridDemo() { - return ( - ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} - grid={{ vertical: true, horizontal: true }} - /> - ); -} diff --git a/docs/data/charts/scatter/GridDemo.tsx b/docs/data/charts/scatter/GridDemo.tsx deleted file mode 100644 index 48dceb93c36d5..0000000000000 --- a/docs/data/charts/scatter/GridDemo.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; - -export default function GridDemo() { - return ( - ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} - grid={{ vertical: true, horizontal: true }} - /> - ); -} diff --git a/docs/data/charts/scatter/GridDemo.tsx.preview b/docs/data/charts/scatter/GridDemo.tsx.preview deleted file mode 100644 index 8d1ed52b8387d..0000000000000 --- a/docs/data/charts/scatter/GridDemo.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - }, - ]} - grid={{ vertical: true, horizontal: true }} -/> \ No newline at end of file diff --git a/docs/data/charts/scatter/ScatterAsyncRenderer.js b/docs/data/charts/scatter/ScatterAsyncRenderer.js deleted file mode 100644 index 33c9e66a6bcdb..0000000000000 --- a/docs/data/charts/scatter/ScatterAsyncRenderer.js +++ /dev/null @@ -1,251 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import Typography from '@mui/material/Typography'; -import Tooltip from '@mui/material/Tooltip'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import Chance from 'chance'; - -const NUMBER_OF_SERIES = 3; - -const POINT_COUNT = 40000; - -// Gaussian-ish blobs so the progressive, batched paint is easy to see. Points -// are split into `NUMBER_OF_SERIES` contiguous series, each offset into its -// own region. -function makeSeries(chance, count) { - const remainder = count % NUMBER_OF_SERIES; - return Array.from({ length: NUMBER_OF_SERIES }, (_, seriesIndex) => { - const size = - Math.floor(count / NUMBER_OF_SERIES) + (seriesIndex < remainder ? 1 : 0); - const offsetX = (seriesIndex % 2) * 50; - const offsetY = seriesIndex * 25; - const data = Array.from({ length: size }, () => { - const angle = chance.floating({ min: 0, max: 2 * Math.PI }); - const radius = Math.sqrt(chance.floating({ min: 0, max: 1 })) * 100; - const noiseX = chance.floating({ min: -100, max: 10 }); - const noiseY = chance.floating({ min: -100, max: 10 }); - return { - x: offsetX + radius * Math.cos(angle) + noiseX, - y: offsetY + radius * Math.sin(angle) + noiseY, - }; - }); - return { - id: `series-${seriesIndex}`, - label: `Series ${seriesIndex + 1}`, - data, - markerSize: 2, - }; - }); -} - -// Built once outside the component so toggling does not regenerate the points -// and the series keep stable references. -const syncSeries = makeSeries(new Chance(42), POINT_COUNT); -const asyncSeries = makeSeries(new Chance(43), POINT_COUNT); - -// A spinner whose rotation is advanced in JS on every animation frame (not a -// CSS animation, which runs on the compositor and stays smooth regardless). -// If the main thread is blocked, this visibly stutters — a live indicator of -// whether the progressive render keeps the main thread responsive. -function MainThreadSpinner() { - const ref = React.useRef(null); - - React.useEffect(() => { - let frame = 0; - let angle = 0; - const tick = () => { - angle = (angle + 6) % 360; - if (ref.current) { - ref.current.style.transform = `rotate(${angle}deg)`; - } - frame = requestAnimationFrame(tick); - }; - frame = requestAnimationFrame(tick); - return () => cancelAnimationFrame(frame); - }, []); - - return ( - - -
- - - ); -} - -// Renders the timing readout in its own component so that updating the -// measured values does NOT re-render the (heavy) chart — otherwise each -// state update would reconcile thousands of points and stall the main -// thread, making the spinner stutter exactly when a value appears. -function RenderTimers(props) { - const { containerRef, startRef, runId } = props; - const [firstMs, setFirstMs] = React.useState(null); - const [totalMs, setTotalMs] = React.useState(null); - // Number of distinct paint steps (frames on which the point count grew). - const [paints, setPaints] = React.useState(0); - - React.useEffect(() => { - setFirstMs(null); - setTotalMs(null); - setPaints(0); - if (runId === 0 || startRef.current === null) { - return undefined; - } - // Rendering is considered complete when the point count stops growing for - // this many consecutive frames (longer than the gap between batches). - const STABLE_FRAMES = 12; - let frame = 0; - let firstSeen = false; - let lastCount = 0; - let stableFrames = 0; - let paintCount = 0; - // Time of the most recent point-count change, so the reported total is the - // moment the last batch painted, not when stability was confirmed. - let lastChangeAt = 0; - const check = () => { - const now = performance.now(); - const count = containerRef.current?.querySelectorAll('circle').length ?? 0; - - if (!firstSeen && count > 0) { - firstSeen = true; - setFirstMs(now - startRef.current); - } - - if (firstSeen) { - if (count === lastCount) { - stableFrames += 1; - } else { - stableFrames = 0; - lastCount = count; - lastChangeAt = now; - paintCount += 1; - setPaints(paintCount); - } - if (stableFrames >= STABLE_FRAMES) { - setTotalMs(lastChangeAt - startRef.current); - return; - } - } - - frame = requestAnimationFrame(check); - }; - frame = requestAnimationFrame(check); - return () => cancelAnimationFrame(frame); - }, [runId, containerRef, startRef]); - - return ( - - - first paint: {firstMs === null ? '—' : `${firstMs.toFixed(0)} ms`} - - - total: {totalMs === null ? '—' : `${totalMs.toFixed(0)} ms`} - - - paints: {paints} - - - ); -} - -export default function ScatterAsyncRenderer() { - // Default to progressive so first paint on docs load does not block the - // main thread while rendering all points at once. - const [mode, setMode] = React.useState('async'); - const series = mode === 'sync' ? syncSeries : asyncSeries; - - const containerRef = React.useRef(null); - // Bumped on every click; `RenderTimers` keys its measurement off it. - const [runId, setRunId] = React.useState(0); - const startRef = React.useRef(null); - - const select = (next) => { - startRef.current = performance.now(); - setRunId((id) => id + 1); - setMode(next); - }; - - return ( - - - - - {mode === 'sync' - ? `${POINT_COUNT.toLocaleString()} points` - : `${POINT_COUNT.toLocaleString()} points`} - - - - - - - - - -
- -
-
- ); -} diff --git a/docs/data/charts/scatter/ScatterBatchRenderer.js b/docs/data/charts/scatter/ScatterBatchRenderer.js deleted file mode 100644 index 0586f0c978beb..0000000000000 --- a/docs/data/charts/scatter/ScatterBatchRenderer.js +++ /dev/null @@ -1,124 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Paper from '@mui/material/Paper'; -import Divider from '@mui/material/Divider'; -import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import Typography from '@mui/material/Typography'; -import { schemePaired } from 'd3-scale-chromatic'; -import { electricityGeneration2024Every6Hours } from '../dataset/electricityGeneration2024Every6Hours'; -import { carbonEmissions2024Every6Hours } from '../dataset/carbonEmissions2024Every6Hours'; -import { countryData, flags } from '../dataset/countryData'; - -const dateFormat = new Intl.DateTimeFormat(undefined, { - month: 'short', - day: 'numeric', -}); - -const timeRangeFormat = new Intl.DateTimeFormat(undefined, { - hour: '2-digit', - minute: '2-digit', -}); - -function getDatesFromIndex(index) { - const from = new Date(2024, 0, 1, index * 6); - const to = new Date(2024, 0, 1, index * 6 + 6); - return [from, to]; -} - -const scatterChartsParams = { - series: Object.entries(electricityGeneration2024Every6Hours).map( - ([countryCode, electricity]) => ({ - id: countryCode, - data: electricity.map((value, index) => ({ - x: value / 1000, - y: carbonEmissions2024Every6Hours[countryCode][index], - })), - markerSize: 1, - label: countryData[countryCode].country, - highlightScope: { - highlight: 'series', - fade: 'global', - }, - }), - ), - xAxis: [ - { min: 0, label: 'Electricity Generation (GWh)', domainSeries: 'visible' }, - ], - yAxis: [ - { - min: 0, - width: 60, - label: 'Life-cycle Carbon Intensity (gCO₂eq/kWh)', - domainSeries: 'visible', - }, - ], - height: 400, - colors: schemePaired, - slotProps: { - legend: { - toggleVisibilityOnClick: true, - position: { vertical: 'bottom' }, - sx: { justifyContent: 'center' }, - }, - }, - slots: { - tooltip: ElectricityTooltip, - }, -}; - -export default function ScatterBatchRenderer() { - return ( - - - Life-cycle Carbon Intensity of Electricity Generation - 2024 - - - Source: ENTSO-E, ElectricityMaps.com - - ); -} - -function ElectricityTooltip() { - return ( - - - - ); -} - -function ElectricityTooltipContent() { - const item = useItemTooltip(); - - if (!item) { - return null; - } - - const [from, to] = getDatesFromIndex(item.identifier.dataIndex); - - return ( - - - {item.label} {flags[item.identifier.seriesId]} - - - {`${dateFormat.format(from)} ${timeRangeFormat.format(from)} - ${timeRangeFormat.format(to)}`} - - - - Generated:{' '} - - {item.value.x.toFixed(2)} GWh - - - - Emitting:{' '} - - {item.value.y.toFixed(2)} gCO₂eq/kWh - - - - ); -} diff --git a/docs/data/charts/scatter/ScatterBatchRenderer.tsx.preview b/docs/data/charts/scatter/ScatterBatchRenderer.tsx.preview deleted file mode 100644 index 07b58972afd03..0000000000000 --- a/docs/data/charts/scatter/ScatterBatchRenderer.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - - Life-cycle Carbon Intensity of Electricity Generation - 2024 - - -Source: ENTSO-E, ElectricityMaps.com \ No newline at end of file diff --git a/docs/data/charts/scatter/ScatterCSSSelectors.js b/docs/data/charts/scatter/ScatterCSSSelectors.js deleted file mode 100644 index 2364908ed3eb0..0000000000000 --- a/docs/data/charts/scatter/ScatterCSSSelectors.js +++ /dev/null @@ -1,36 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; - -const series = [ - { - id: 'series-1', - label: 'Series A', - data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), - highlightScope: { highlight: 'item', fade: 'global' }, - }, - { - id: 'series-2', - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - highlightScope: { highlight: 'item', fade: 'global' }, - }, -]; - -export default function ScatterCSSSelectors() { - return ( - - ); -} diff --git a/docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview b/docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview deleted file mode 100644 index d472c3c3577d9..0000000000000 --- a/docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/scatter/ScatterClick.js b/docs/data/charts/scatter/ScatterClick.js deleted file mode 100644 index e5175d5cfeeb6..0000000000000 --- a/docs/data/charts/scatter/ScatterClick.js +++ /dev/null @@ -1,135 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; - -const scatterChartsParams = { - series: [ - { - id: 'series-1', - data: [ - { x: 6.5e-2, y: -1.3, id: 0 }, - { x: -2.1, y: -7.0e-1, id: 1 }, - { x: -7.6e-1, y: -6.7e-1, id: 2 }, - { x: -1.5e-2, y: -2.0e-1, id: 3 }, - { x: -1.4, y: -9.9e-1, id: 4 }, - { x: -1.1, y: -1.5, id: 5 }, - { x: -7.0e-1, y: -2.7e-1, id: 6 }, - { x: -5.1e-1, y: -8.8e-1, id: 7 }, - { x: -4.0e-3, y: -1.4, id: 8 }, - { x: -1.3, y: -2.2, id: 9 }, - ], - label: 'A', - highlightScope: { - highlight: 'item', - }, - }, - { - id: 'series-2', - data: [ - { x: 1.8, y: -1.7e-2, id: 0 }, - { x: 7.1e-1, y: 2.6e-1, id: 1 }, - { x: -1.2, y: 9.8e-1, id: 2 }, - { x: 2.0, y: -2.0e-1, id: 3 }, - { x: 9.4e-1, y: -2.7e-1, id: 4 }, - { x: -4.8e-1, y: -1.6e-1, id: 5 }, - { x: -1.5, y: 1.1, id: 6 }, - { x: 1.3, y: 3.4e-1, id: 7 }, - { x: -4.2e-1, y: 1.0e-1, id: 8 }, - { x: 5.4e-2, y: 4.0e-1, id: 9 }, - ], - label: 'B', - highlightScope: { - highlight: 'item', - }, - }, - ], - height: 300, -}; - -function getHitRadius(option) { - switch (option) { - case 'item': - return 'item'; - case 'infinite': - return undefined; - case '50px': - return 50; - default: - return undefined; - } -} -export default function ScatterClick() { - const [option, setOption] = React.useState('infinite'); - const [data, setData] = React.useState(); - - const { ...other } = data ?? {}; - const dataDisplayed = data && { - ...other, - }; - return ( - - { - if (newValue !== null) { - setOption(newValue); - } - }} - > - item - infinite - 50px - - - - - setData(d)} - /> - - - - Click on the chart - setData(undefined)} - > - - - - - - - - ); -} diff --git a/docs/data/charts/scatter/ScatterCustomShape.js b/docs/data/charts/scatter/ScatterCustomShape.js deleted file mode 100644 index 17715c1b6e897..0000000000000 --- a/docs/data/charts/scatter/ScatterCustomShape.js +++ /dev/null @@ -1,80 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; - -import data from '../dataset/random/scatterParallel.json'; - -export default function ScatterCustomShape() { - return ( - ({ x: v.x1, y: v.y1, id: v.id })), - markerSize: 1, - labelMarkType: StarLabelMark, - }, - { - id: '2', - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - markerSize: 1, - labelMarkType: DiamondLabelMark, - }, - ]} - slots={{ marker: CustomMarker }} - /> - ); -} - -const star = - 'M0,-7.528L1.69,-2.326L7.16,-2.326L2.735,0.889L4.425,6.09L0,2.875L-4.425,6.09L-2.735,0.889L-7.16,-2.326L-1.69,-2.326Z'; -const diamond = 'M0,-7.423L4.285,0L0,7.423L-4.285,0Z'; - -function CustomMarker({ - size, - x, - y, - seriesId, - isHighlighted, - isFaded, - dataIndex, - color, - ...other -}) { - const props = { - x: 0, - y: 0, - width: (isHighlighted ? 1.2 : 1) * size, - height: (isHighlighted ? 1.2 : 1) * size, - transform: `translate(${x}, ${y})`, - fill: color, - opacity: isFaded ? 0.3 : 1, - ...other, - }; - - return ( - - - - ); -} - -function StarLabelMark({ color, ...props }) { - return ( - - - - ); -} - -function DiamondLabelMark({ color, ...props }) { - return ( - - - - ); -} diff --git a/docs/data/charts/scatter/ScatterCustomSize.js b/docs/data/charts/scatter/ScatterCustomSize.js deleted file mode 100644 index cb288d35bfa38..0000000000000 --- a/docs/data/charts/scatter/ScatterCustomSize.js +++ /dev/null @@ -1,22 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; - -export default function ScatterCustomSize() { - return ( - ({ x: v.x1, y: v.y1, id: v.id })), - markerSize: 8, - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - markerSize: 4, - }, - ]} - /> - ); -} diff --git a/docs/data/charts/scatter/ScatterCustomSize.tsx.preview b/docs/data/charts/scatter/ScatterCustomSize.tsx.preview deleted file mode 100644 index 668c74ae178ce..0000000000000 --- a/docs/data/charts/scatter/ScatterCustomSize.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - ({ x: v.x1, y: v.y1, id: v.id })), - markerSize: 8, - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), - markerSize: 4, - }, - ]} -/> \ No newline at end of file diff --git a/docs/data/charts/scatter/ScatterDataset.js b/docs/data/charts/scatter/ScatterDataset.js deleted file mode 100644 index 45a823c13715e..0000000000000 --- a/docs/data/charts/scatter/ScatterDataset.js +++ /dev/null @@ -1,77 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; - -export default function ScatterDataset() { - return ( - - ); -} - -const dataset = [ - { x1: 373, y1: 434, x2: 304, y2: 349 }, - { x1: 173, y1: 437, x2: 208, y2: 347 }, - { x1: 68, y1: 292, x2: 151, y2: 280 }, - { x1: 121, y1: 116, x2: 185, y2: 176 }, - { x1: 322, y1: 61, x2: 278, y2: 170 }, - { x1: 466, y1: 210, x2: 346, y2: 246 }, - { x1: 418, y1: 403, x2: 326, y2: 333 }, - { x1: 224, y1: 449, x2: 235, y2: 352 }, - { x1: 87, y1: 335, x2: 158, y2: 311 }, - { x1: 104, y1: 167, x2: 166, y2: 218 }, - { x1: 262, y1: 70, x2: 251, y2: 161 }, - { x1: 421, y1: 167, x2: 335, y2: 199 }, - { x1: 442, y1: 352, x2: 341, y2: 302 }, - { x1: 294, y1: 474, x2: 264, y2: 366 }, - { x1: 101, y1: 386, x2: 174, y2: 318 }, - { x1: 64, y1: 198, x2: 154, y2: 227 }, - { x1: 222, y1: 75, x2: 223, y2: 181 }, - { x1: 411, y1: 105, x2: 316, y2: 204 }, - { x1: 457, y1: 290, x2: 349, y2: 274 }, - { x1: 348, y1: 455, x2: 291, y2: 357 }, - { x1: 165, y1: 427, x2: 195, y2: 358 }, - { x1: 65, y1: 277, x2: 150, y2: 265 }, - { x1: 153, y1: 94, x2: 197, y2: 175 }, - { x1: 340, y1: 93, x2: 294, y2: 163 }, - { x1: 476, y1: 253, x2: 352, y2: 264 }, - { x1: 385, y1: 425, x2: 317, y2: 332 }, - { x1: 221, y1: 448, x2: 221, y2: 376 }, - { x1: 60, y1: 327, x2: 154, y2: 281 }, - { x1: 129, y1: 128, x2: 175, y2: 213 }, - { x1: 304, y1: 67, x2: 267, y2: 173 }, - { x1: 447, y1: 175, x2: 343, y2: 223 }, - { x1: 425, y1: 378, x2: 335, y2: 313 }, - { x1: 273, y1: 463, x2: 250, y2: 377 }, - { x1: 80, y1: 387, x2: 166, y2: 304 }, - { x1: 86, y1: 172, x2: 159, y2: 224 }, - { x1: 247, y1: 64, x2: 238, y2: 172 }, - { x1: 419, y1: 126, x2: 328, y2: 200 }, - { x1: 463, y1: 317, x2: 347, y2: 301 }, - { x1: 308, y1: 473, x2: 278, y2: 352 }, - { x1: 147, y1: 405, x2: 183, y2: 356 }, - { x1: 64, y1: 224, x2: 151, y2: 246 }, - { x1: 175, y1: 78, x2: 210, y2: 163 }, - { x1: 384, y1: 96, x2: 308, y2: 187 }, - { x1: 473, y1: 275, x2: 354, y2: 273 }, - { x1: 387, y1: 455, x2: 306, y2: 367 }, - { x1: 193, y1: 445, x2: 208, y2: 372 }, - { x1: 51, y1: 298, x2: 151, y2: 264 }, - { x1: 154, y1: 116, x2: 187, y2: 205 }, - { x1: 342, y1: 73, x2: 283, y2: 184 }, - { x1: 467, y1: 199, x2: 348, y2: 246 }, -]; - -const chartSetting = { - yAxis: [ - { - label: 'rainfall (mm)', - width: 60, - }, - ], - height: 300, -}; diff --git a/docs/data/charts/scatter/ScatterDataset.tsx.preview b/docs/data/charts/scatter/ScatterDataset.tsx.preview deleted file mode 100644 index 822da56f5bcd3..0000000000000 --- a/docs/data/charts/scatter/ScatterDataset.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/scatter/ScatterOverview.js b/docs/data/charts/scatter/ScatterOverview.js deleted file mode 100644 index 39b2b968d05ac..0000000000000 --- a/docs/data/charts/scatter/ScatterOverview.js +++ /dev/null @@ -1,106 +0,0 @@ -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; -import { styled } from '@mui/material/styles'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import Divider from '@mui/material/Divider'; -import Stack from '@mui/material/Stack'; -import data from '../dataset/transistorCPUdata'; - -const chartSetting = { - yAxis: [{ width: 50, scaleType: 'log' }], - xAxis: [{ valueFormatter: (v) => (v ? v.toString() : '') }], -}; - -const constructors = ['Intel', 'Apple', 'AMD']; - -const series = [ - { - type: 'scatter', - label: 'Other', - highlightScope: { highlight: 'series', fade: 'global' }, - markerSize: 3, - data: data - .filter( - (item) => !constructors.includes(item.constructor) && item.density !== null, - ) - .map((item) => ({ x: item.year, y: item.density, id: item.id })), - }, - ...constructors.map((constructor) => ({ - label: constructor, - highlightScope: { highlight: 'series', fade: 'global' }, - markerSize: 3, - data: data - .filter((item) => item.constructor === constructor && item.density !== null) - .map((item) => ({ x: item.year, y: item.density, id: item.id })), - })), -]; - -const numberFormatter = new Intl.NumberFormat('en-US').format; - -const TooltipPaper = styled('div', { - name: 'Tooltip', - slot: 'Paper', -})(({ theme }) => { - return { - padding: theme.spacing(1), - backgroundColor: (theme.vars || theme).palette.background.paper, - color: (theme.vars || theme).palette.text.primary, - borderRadius: (theme.vars || theme).shape?.borderRadius, - border: `solid ${(theme.vars || theme).palette.divider} 1px`, - }; -}); - -function CustomTooltip() { - const item = useItemTooltip(); - - return ( - - - - - {item?.label} - - - - {item?.value.x} - - {item?.value.y == null - ? 'NaN' - : `${numberFormatter(item?.value.y)} transistor/mm²`} - - - - - ); -} - -export default function ScatterOverview() { - return ( - - Processor density (in transistor/mm²) - - - ); -} diff --git a/docs/data/charts/scatter/ScatterOverview.tsx.preview b/docs/data/charts/scatter/ScatterOverview.tsx.preview deleted file mode 100644 index 96f3df55f2f3d..0000000000000 --- a/docs/data/charts/scatter/ScatterOverview.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ -Processor density (in transistor/mm²) - \ No newline at end of file diff --git a/docs/data/charts/scatter/ScatterRegressionLine.js b/docs/data/charts/scatter/ScatterRegressionLine.js deleted file mode 100644 index 696c8ba4a9193..0000000000000 --- a/docs/data/charts/scatter/ScatterRegressionLine.js +++ /dev/null @@ -1,109 +0,0 @@ -import * as React from 'react'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import { useSeries, useXScale, useYScale } from '@mui/x-charts/hooks'; -import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; -import useId from '@mui/utils/useId'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { useTheme } from '@mui/material/styles'; -import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; -import { diamonds } from '../dataset/diamonds'; - -const dollarFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - maximumFractionDigits: 0, -}); - -export default function ScatterRegressionLine() { - return ( - - - Relation between Weight and Price of Diamonds - - dollarFormatter.format(value), - label: 'Price (USD)', - }, - ]} - series={[ - { - id: 'diamonds', - datasetKeys: { x: 'carat', y: 'price' }, - markerSize: 2, - valueFormatter: (v) => `${dollarFormatter.format(v.y)} for ${v.x} carat`, - }, - ]} - > - - - Source: OpenML - - ); -} - -function RegressionLine({ seriesId }) { - const theme = useTheme(); - const palette = rainbowSurgePalette(theme.palette.mode); - const stroke = palette[2]; - const allSeries = useSeries(); - // Scatter's series processor is async, so `allSeries.scatter` is `undefined` - // until it settles. Keep hooks unconditional and bail out of rendering only. - const series = allSeries.scatter?.series[seriesId]; - const xScale = useXScale(series?.xAxisId ?? undefined); - const yScale = useYScale(series?.yAxisId ?? undefined); - const clipPathId = `linear-regression-clip-${useId()}`; - - if (!series) { - return null; - } - - const { m, b } = linearRegression(series.data ?? []); - - const xDomain = xScale.domain(); - const x1 = xScale(xDomain[0]); - const x2 = xScale(xDomain[1]); - const y1 = yScale(m * xDomain[0] + b); - const y2 = yScale(m * xDomain[1] + b); - - return ( - - - - - - - ); -} - -function linearRegression(points) { - const n = points.length; - - // Calculate sums - let sumX = 0, - sumY = 0, - sumXY = 0, - sumX2 = 0; - - for (let i = 0; i < n; i += 1) { - const x = points[i].x; - const y = points[i].y; - sumX += x; - sumY += y; - sumXY += x * y; - sumX2 += x * x; - } - - // Calculate slope (m) and intercept (b) - const m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX); - const b = (sumY - m * sumX) / n; - - return { m, b }; -} diff --git a/docs/data/charts/scatter/ScatterWebGLRenderer.js b/docs/data/charts/scatter/ScatterWebGLRenderer.js deleted file mode 100644 index 2c84be9e97d43..0000000000000 --- a/docs/data/charts/scatter/ScatterWebGLRenderer.js +++ /dev/null @@ -1,65 +0,0 @@ -import * as React from 'react'; -import { ScatterChartPremium } from '@mui/x-charts-premium/ScatterChartPremium'; - -const POINTS_PER_SERIES = 200_000; - -// Inline mulberry32 — deterministic, ~20x faster than `chance.floating`. -// 800k calls during module load with Chance takes several seconds and stalls -// the Next.js build; this runs in ~50ms. -/* eslint-disable no-bitwise */ -function makeRandom(seed) { - let state = seed; - return () => { - state = (state + 0x6d2b79f5) | 0; - let t = state; - t = Math.imul(t ^ (t >>> 15), t | 1); - t ^= t + Math.imul(t ^ (t >>> 7), t | 61); - return ((t ^ (t >>> 14)) >>> 0) / 4_294_967_296; - }; -} -/* eslint-enable no-bitwise */ - -function generateSeries(offset, spread, seed) { - const rand = makeRandom(seed); - const data = new Array(POINTS_PER_SERIES); - for (let i = 0; i < POINTS_PER_SERIES; i += 1) { - const u1 = Math.max(rand(), 1e-6); - const u2 = rand(); - const r = Math.sqrt(-2 * Math.log(u1)); - const theta = 2 * Math.PI * u2; - data[i] = { - id: i, - x: offset + r * Math.cos(theta) * spread, - y: offset + r * Math.sin(theta) * spread, - }; - } - return data; -} - -const DATA_1 = generateSeries(0, 1, 42); -const DATA_2 = generateSeries(4, 1.5, 7); - -export default function ScatterWebGLRenderer() { - const series = React.useMemo( - () => [ - { label: 'Cluster A', data: DATA_1, markerSize: 1 }, - { label: 'Cluster B', data: DATA_2, markerSize: 1 }, - ], - [], - ); - - return ( - - ); -} diff --git a/docs/data/charts/scatter/ScatterWebGLRenderer.tsx.preview b/docs/data/charts/scatter/ScatterWebGLRenderer.tsx.preview deleted file mode 100644 index 6d2212511699a..0000000000000 --- a/docs/data/charts/scatter/ScatterWebGLRenderer.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/scatter/BasicScatter.tsx b/docs/data/charts/scatter/demos/basic-scatter/BasicScatter.tsx similarity index 78% rename from docs/data/charts/scatter/BasicScatter.tsx rename to docs/data/charts/scatter/demos/basic-scatter/BasicScatter.tsx index 69815168efb78..c02e84e2b8866 100644 --- a/docs/data/charts/scatter/BasicScatter.tsx +++ b/docs/data/charts/scatter/demos/basic-scatter/BasicScatter.tsx @@ -1,8 +1,9 @@ import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; +import data from '../../../dataset/random/scatterParallel.json'; export default function BasicScatter() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/scatter/demos/basic-scatter/client.ts b/docs/data/charts/scatter/demos/basic-scatter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/basic-scatter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/basic-scatter/index.ts b/docs/data/charts/scatter/demos/basic-scatter/index.ts new file mode 100644 index 0000000000000..a437069905776 --- /dev/null +++ b/docs/data/charts/scatter/demos/basic-scatter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicScatter from './BasicScatter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicScatter, { ClientProvider }); diff --git a/docs/data/charts/scatter/ClosestPointInteraction.tsx b/docs/data/charts/scatter/demos/closest-point-interaction/ClosestPointInteraction.tsx similarity index 96% rename from docs/data/charts/scatter/ClosestPointInteraction.tsx rename to docs/data/charts/scatter/demos/closest-point-interaction/ClosestPointInteraction.tsx index ba526e26b776f..82a06a6d0496c 100644 --- a/docs/data/charts/scatter/ClosestPointInteraction.tsx +++ b/docs/data/charts/scatter/demos/closest-point-interaction/ClosestPointInteraction.tsx @@ -8,9 +8,10 @@ import Slider from '@mui/material/Slider'; import { ScatterChart } from '@mui/x-charts/ScatterChart'; import Radio from '@mui/material/Radio'; import RadioGroup from '@mui/material/RadioGroup'; -import data from '../dataset/random/scatterParallel.json'; +import data from '../../../dataset/random/scatterParallel.json'; export default function ClosestPointInteraction() { + // @focus-start @padding 1 const [option, setOption] = React.useState<'item' | 'undefined' | 'numeric'>( 'numeric', ); @@ -93,4 +94,5 @@ export default function ClosestPointInteraction() {
); + // @focus-end } diff --git a/docs/data/charts/scatter/demos/closest-point-interaction/client.ts b/docs/data/charts/scatter/demos/closest-point-interaction/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/closest-point-interaction/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/closest-point-interaction/index.ts b/docs/data/charts/scatter/demos/closest-point-interaction/index.ts new file mode 100644 index 0000000000000..da5a38bf36264 --- /dev/null +++ b/docs/data/charts/scatter/demos/closest-point-interaction/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ClosestPointInteraction from './ClosestPointInteraction'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ClosestPointInteraction, { ClientProvider }); diff --git a/docs/data/charts/scatter/CustomScatter.tsx b/docs/data/charts/scatter/demos/custom-scatter/CustomScatter.tsx similarity index 96% rename from docs/data/charts/scatter/CustomScatter.tsx rename to docs/data/charts/scatter/demos/custom-scatter/CustomScatter.tsx index 1cad25f5c7830..17dc26a028b74 100644 --- a/docs/data/charts/scatter/CustomScatter.tsx +++ b/docs/data/charts/scatter/demos/custom-scatter/CustomScatter.tsx @@ -49,9 +49,11 @@ function LinkPoints({ seriesId, close }: { seriesId: string; close?: boolean }) export default function CustomScatter() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/scatter/demos/custom-scatter/client.ts b/docs/data/charts/scatter/demos/custom-scatter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/custom-scatter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/custom-scatter/index.ts b/docs/data/charts/scatter/demos/custom-scatter/index.ts new file mode 100644 index 0000000000000..cf52ee4c00ce3 --- /dev/null +++ b/docs/data/charts/scatter/demos/custom-scatter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomScatter from './CustomScatter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomScatter, { ClientProvider }); diff --git a/docs/data/charts/scatter/demos/grid-demo/GridDemo.tsx b/docs/data/charts/scatter/demos/grid-demo/GridDemo.tsx new file mode 100644 index 0000000000000..e9b3cd11e4326 --- /dev/null +++ b/docs/data/charts/scatter/demos/grid-demo/GridDemo.tsx @@ -0,0 +1,23 @@ +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import data from '../../../dataset/random/scatterParallel.json'; + +export default function GridDemo() { + return ( + // @focus-start @padding 2 + ({ x: v.x1, y: v.y1, id: v.id })), + }, + { + label: 'Series B', + data: data.map((v) => ({ x: v.x2, y: v.y2, id: v.id })), + }, + ]} + grid={{ vertical: true, horizontal: true }} + /> + // @focus-end + ); +} diff --git a/docs/data/charts/scatter/demos/grid-demo/client.ts b/docs/data/charts/scatter/demos/grid-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/grid-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/grid-demo/index.ts b/docs/data/charts/scatter/demos/grid-demo/index.ts new file mode 100644 index 0000000000000..7686107ff7e74 --- /dev/null +++ b/docs/data/charts/scatter/demos/grid-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GridDemo from './GridDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GridDemo, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterAsyncRenderer.tsx b/docs/data/charts/scatter/demos/scatter-async-renderer/ScatterAsyncRenderer.tsx similarity index 99% rename from docs/data/charts/scatter/ScatterAsyncRenderer.tsx rename to docs/data/charts/scatter/demos/scatter-async-renderer/ScatterAsyncRenderer.tsx index fa0ab3e57eae1..12c8f8080c438 100644 --- a/docs/data/charts/scatter/ScatterAsyncRenderer.tsx +++ b/docs/data/charts/scatter/demos/scatter-async-renderer/ScatterAsyncRenderer.tsx @@ -170,6 +170,7 @@ function RenderTimers(props: { export default function ScatterAsyncRenderer() { // Default to progressive so first paint on docs load does not block the // main thread while rendering all points at once. + // @focus-start @padding 1 const [mode, setMode] = React.useState<'sync' | 'async'>('async'); const series = mode === 'sync' ? syncSeries : asyncSeries; @@ -252,4 +253,5 @@ export default function ScatterAsyncRenderer() {
); + // @focus-end } diff --git a/docs/data/charts/scatter/demos/scatter-async-renderer/client.ts b/docs/data/charts/scatter/demos/scatter-async-renderer/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-async-renderer/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-async-renderer/index.ts b/docs/data/charts/scatter/demos/scatter-async-renderer/index.ts new file mode 100644 index 0000000000000..1c2cc402194b8 --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-async-renderer/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterAsyncRenderer from './ScatterAsyncRenderer'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterAsyncRenderer, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterBatchRenderer.tsx b/docs/data/charts/scatter/demos/scatter-batch-renderer/ScatterBatchRenderer.tsx similarity index 88% rename from docs/data/charts/scatter/ScatterBatchRenderer.tsx rename to docs/data/charts/scatter/demos/scatter-batch-renderer/ScatterBatchRenderer.tsx index 6964fbe184d96..2f1f0b7579494 100644 --- a/docs/data/charts/scatter/ScatterBatchRenderer.tsx +++ b/docs/data/charts/scatter/demos/scatter-batch-renderer/ScatterBatchRenderer.tsx @@ -2,12 +2,13 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Divider from '@mui/material/Divider'; import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; -import { ScatterChart, ScatterChartProps } from '@mui/x-charts/ScatterChart'; +import type { ScatterChartProps } from '@mui/x-charts/ScatterChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; import Typography from '@mui/material/Typography'; import { schemePaired } from 'd3-scale-chromatic'; -import { electricityGeneration2024Every6Hours } from '../dataset/electricityGeneration2024Every6Hours'; -import { carbonEmissions2024Every6Hours } from '../dataset/carbonEmissions2024Every6Hours'; -import { countryData, flags } from '../dataset/countryData'; +import { electricityGeneration2024Every6Hours } from '../../../dataset/electricityGeneration2024Every6Hours'; +import { carbonEmissions2024Every6Hours } from '../../../dataset/carbonEmissions2024Every6Hours'; +import { countryData, flags } from '../../../dataset/countryData'; const dateFormat = new Intl.DateTimeFormat(undefined, { month: 'short', @@ -73,11 +74,13 @@ const scatterChartsParams = { export default function ScatterBatchRenderer() { return ( + {/* @focus-start */} Life-cycle Carbon Intensity of Electricity Generation - 2024 Source: ENTSO-E, ElectricityMaps.com + {/* @focus-end */} ); } diff --git a/docs/data/charts/scatter/demos/scatter-batch-renderer/client.ts b/docs/data/charts/scatter/demos/scatter-batch-renderer/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-batch-renderer/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-batch-renderer/index.ts b/docs/data/charts/scatter/demos/scatter-batch-renderer/index.ts new file mode 100644 index 0000000000000..44e2e019bce5e --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-batch-renderer/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterBatchRenderer from './ScatterBatchRenderer'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterBatchRenderer, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterClick.tsx b/docs/data/charts/scatter/demos/scatter-click/ScatterClick.tsx similarity index 97% rename from docs/data/charts/scatter/ScatterClick.tsx rename to docs/data/charts/scatter/demos/scatter-click/ScatterClick.tsx index b07a2473616ec..79fafeb0744c3 100644 --- a/docs/data/charts/scatter/ScatterClick.tsx +++ b/docs/data/charts/scatter/demos/scatter-click/ScatterClick.tsx @@ -8,7 +8,7 @@ import ToggleButton from '@mui/material/ToggleButton'; import UndoOutlinedIcon from '@mui/icons-material/UndoOutlined'; import { ScatterChart } from '@mui/x-charts/ScatterChart'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { ScatterItemIdentifier } from '@mui/x-charts/models'; +import type { ScatterItemIdentifier } from '@mui/x-charts/models'; const scatterChartsParams = { series: [ @@ -67,6 +67,7 @@ function getHitRadius(option: 'item' | 'infinite' | '50px') { } } export default function ScatterClick() { + // @focus-start @padding 1 const [option, setOption] = React.useState<'item' | 'infinite' | '50px'>( 'infinite', ); @@ -135,4 +136,5 @@ export default function ScatterClick() {
); + // @focus-end } diff --git a/docs/data/charts/scatter/demos/scatter-click/client.ts b/docs/data/charts/scatter/demos/scatter-click/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-click/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-click/index.ts b/docs/data/charts/scatter/demos/scatter-click/index.ts new file mode 100644 index 0000000000000..17871b48b0602 --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-click/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterClick from './ScatterClick'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterClick, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterCSSSelectors.tsx b/docs/data/charts/scatter/demos/scatter-css-selectors/ScatterCSSSelectors.tsx similarity index 77% rename from docs/data/charts/scatter/ScatterCSSSelectors.tsx rename to docs/data/charts/scatter/demos/scatter-css-selectors/ScatterCSSSelectors.tsx index 1992a37edf0dd..d5b288feb30fe 100644 --- a/docs/data/charts/scatter/ScatterCSSSelectors.tsx +++ b/docs/data/charts/scatter/demos/scatter-css-selectors/ScatterCSSSelectors.tsx @@ -1,5 +1,6 @@ -import { ScatterChart, ScatterSeries } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; +import type { ScatterSeries } from '@mui/x-charts/ScatterChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import data from '../../../dataset/random/scatterParallel.json'; const series: ScatterSeries[] = [ { @@ -18,6 +19,7 @@ const series: ScatterSeries[] = [ export default function ScatterCSSSelectors() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/scatter/demos/scatter-css-selectors/client.ts b/docs/data/charts/scatter/demos/scatter-css-selectors/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-css-selectors/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-css-selectors/index.ts b/docs/data/charts/scatter/demos/scatter-css-selectors/index.ts new file mode 100644 index 0000000000000..f54c600cc0a55 --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-css-selectors/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterCSSSelectors from './ScatterCSSSelectors'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterCSSSelectors, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterCustomShape.tsx b/docs/data/charts/scatter/demos/scatter-custom-shape/ScatterCustomShape.tsx similarity index 84% rename from docs/data/charts/scatter/ScatterCustomShape.tsx rename to docs/data/charts/scatter/demos/scatter-custom-shape/ScatterCustomShape.tsx index 5473e227ae793..c2f3448891e25 100644 --- a/docs/data/charts/scatter/ScatterCustomShape.tsx +++ b/docs/data/charts/scatter/demos/scatter-custom-shape/ScatterCustomShape.tsx @@ -1,9 +1,11 @@ -import { ScatterChart, ScatterMarkerProps } from '@mui/x-charts/ScatterChart'; -import { ChartsLabelCustomMarkProps } from '@mui/x-charts/ChartsLabel'; -import data from '../dataset/random/scatterParallel.json'; +import type { ScatterMarkerProps } from '@mui/x-charts/ScatterChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import type { ChartsLabelCustomMarkProps } from '@mui/x-charts/ChartsLabel'; +import data from '../../../dataset/random/scatterParallel.json'; export default function ScatterCustomShape() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/scatter/demos/scatter-custom-shape/client.ts b/docs/data/charts/scatter/demos/scatter-custom-shape/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-custom-shape/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-custom-shape/index.ts b/docs/data/charts/scatter/demos/scatter-custom-shape/index.ts new file mode 100644 index 0000000000000..3b5818cd19633 --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-custom-shape/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterCustomShape from './ScatterCustomShape'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterCustomShape, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterCustomSize.tsx b/docs/data/charts/scatter/demos/scatter-custom-size/ScatterCustomSize.tsx similarity index 80% rename from docs/data/charts/scatter/ScatterCustomSize.tsx rename to docs/data/charts/scatter/demos/scatter-custom-size/ScatterCustomSize.tsx index cb288d35bfa38..cd64e6a8b3f78 100644 --- a/docs/data/charts/scatter/ScatterCustomSize.tsx +++ b/docs/data/charts/scatter/demos/scatter-custom-size/ScatterCustomSize.tsx @@ -1,8 +1,9 @@ import { ScatterChart } from '@mui/x-charts/ScatterChart'; -import data from '../dataset/random/scatterParallel.json'; +import data from '../../../dataset/random/scatterParallel.json'; export default function ScatterCustomSize() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/scatter/demos/scatter-custom-size/client.ts b/docs/data/charts/scatter/demos/scatter-custom-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-custom-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-custom-size/index.ts b/docs/data/charts/scatter/demos/scatter-custom-size/index.ts new file mode 100644 index 0000000000000..0594ea248c932 --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-custom-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterCustomSize from './ScatterCustomSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterCustomSize, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterDataset.tsx b/docs/data/charts/scatter/demos/scatter-dataset/ScatterDataset.tsx similarity index 98% rename from docs/data/charts/scatter/ScatterDataset.tsx rename to docs/data/charts/scatter/demos/scatter-dataset/ScatterDataset.tsx index 45a823c13715e..3ff4c57045110 100644 --- a/docs/data/charts/scatter/ScatterDataset.tsx +++ b/docs/data/charts/scatter/demos/scatter-dataset/ScatterDataset.tsx @@ -2,6 +2,7 @@ import { ScatterChart } from '@mui/x-charts/ScatterChart'; export default function ScatterDataset() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/scatter/demos/scatter-dataset/client.ts b/docs/data/charts/scatter/demos/scatter-dataset/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-dataset/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-dataset/index.ts b/docs/data/charts/scatter/demos/scatter-dataset/index.ts new file mode 100644 index 0000000000000..cd82e2ac9cb98 --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-dataset/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterDataset from './ScatterDataset'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterDataset, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterOverview.tsx b/docs/data/charts/scatter/demos/scatter-overview/ScatterOverview.tsx similarity index 93% rename from docs/data/charts/scatter/ScatterOverview.tsx rename to docs/data/charts/scatter/demos/scatter-overview/ScatterOverview.tsx index 7c9497aa16b26..b710a60c12bfd 100644 --- a/docs/data/charts/scatter/ScatterOverview.tsx +++ b/docs/data/charts/scatter/demos/scatter-overview/ScatterOverview.tsx @@ -1,11 +1,12 @@ -import { ScatterChart, ScatterSeries } from '@mui/x-charts/ScatterChart'; +import type { ScatterSeries } from '@mui/x-charts/ScatterChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; import { styled } from '@mui/material/styles'; import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import Divider from '@mui/material/Divider'; import Stack from '@mui/material/Stack'; -import data from '../dataset/transistorCPUdata'; +import data from '../../../dataset/transistorCPUdata'; const chartSetting = { yAxis: [{ width: 50, scaleType: 'log' as const }], @@ -92,6 +93,7 @@ function CustomTooltip() { export default function ScatterOverview() { return ( + {/* @focus-start */} Processor density (in transistor/mm²) + {/* @focus-end */} ); } diff --git a/docs/data/charts/scatter/demos/scatter-overview/client.ts b/docs/data/charts/scatter/demos/scatter-overview/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-overview/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-overview/index.ts b/docs/data/charts/scatter/demos/scatter-overview/index.ts new file mode 100644 index 0000000000000..980e11d5dfd14 --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-overview/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterOverview from './ScatterOverview'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterOverview, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterRegressionLine.tsx b/docs/data/charts/scatter/demos/scatter-regression-line/ScatterRegressionLine.tsx similarity index 96% rename from docs/data/charts/scatter/ScatterRegressionLine.tsx rename to docs/data/charts/scatter/demos/scatter-regression-line/ScatterRegressionLine.tsx index ab9e632f55b25..ddecb906a6ccf 100644 --- a/docs/data/charts/scatter/ScatterRegressionLine.tsx +++ b/docs/data/charts/scatter/demos/scatter-regression-line/ScatterRegressionLine.tsx @@ -7,7 +7,7 @@ import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { useTheme } from '@mui/material/styles'; import { rainbowSurgePalette } from '@mui/x-charts/colorPalettes'; -import { diamonds } from '../dataset/diamonds'; +import { diamonds } from '../../../dataset/diamonds'; const dollarFormatter = new Intl.NumberFormat('en-US', { style: 'currency', @@ -18,6 +18,7 @@ const dollarFormatter = new Intl.NumberFormat('en-US', { export default function ScatterRegressionLine() { return ( + {/* @focus-start */} Relation between Weight and Price of Diamonds @@ -46,6 +47,7 @@ export default function ScatterRegressionLine() { Source: OpenML + {/* @focus-end */} ); } diff --git a/docs/data/charts/scatter/demos/scatter-regression-line/client.ts b/docs/data/charts/scatter/demos/scatter-regression-line/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-regression-line/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-regression-line/index.ts b/docs/data/charts/scatter/demos/scatter-regression-line/index.ts new file mode 100644 index 0000000000000..d46266f4a605d --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-regression-line/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterRegressionLine from './ScatterRegressionLine'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterRegressionLine, { ClientProvider }); diff --git a/docs/data/charts/scatter/ScatterWebGLRenderer.tsx b/docs/data/charts/scatter/demos/scatter-web-gl-renderer/ScatterWebGLRenderer.tsx similarity index 97% rename from docs/data/charts/scatter/ScatterWebGLRenderer.tsx rename to docs/data/charts/scatter/demos/scatter-web-gl-renderer/ScatterWebGLRenderer.tsx index 70655472912b7..72ff901ba4cec 100644 --- a/docs/data/charts/scatter/ScatterWebGLRenderer.tsx +++ b/docs/data/charts/scatter/demos/scatter-web-gl-renderer/ScatterWebGLRenderer.tsx @@ -40,6 +40,7 @@ const DATA_1 = generateSeries(0, 1, 42); const DATA_2 = generateSeries(4, 1.5, 7); export default function ScatterWebGLRenderer() { + // @focus-start @padding 1 const series = React.useMemo( () => [ { label: 'Cluster A', data: DATA_1, markerSize: 1 }, @@ -62,4 +63,5 @@ export default function ScatterWebGLRenderer() { }} /> ); + // @focus-end } diff --git a/docs/data/charts/scatter/demos/scatter-web-gl-renderer/client.ts b/docs/data/charts/scatter/demos/scatter-web-gl-renderer/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-web-gl-renderer/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/scatter/demos/scatter-web-gl-renderer/index.ts b/docs/data/charts/scatter/demos/scatter-web-gl-renderer/index.ts new file mode 100644 index 0000000000000..04969823a378d --- /dev/null +++ b/docs/data/charts/scatter/demos/scatter-web-gl-renderer/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ScatterWebGLRenderer from './ScatterWebGLRenderer'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ScatterWebGLRenderer, { ClientProvider }); diff --git a/docs/data/charts/scatter/scatter.md b/docs/data/charts/scatter/scatter.md index 059dc48aa2fca..649549327153f 100644 --- a/docs/data/charts/scatter/scatter.md +++ b/docs/data/charts/scatter/scatter.md @@ -14,7 +14,7 @@ A scatter chart plots two variables as points on a surface, so you can see how o Each point is one observation, placed by its values on the two axes. Scatter charts are often used for statistical analysis, scientific data, and performance metrics. -{{"demo": "ScatterOverview.js", "disableAd": true, "defaultCodeOpen": false}} +{{"component": "file://./demos/scatter-overview/index.ts", "disableAd": true, "collapseToEmpty": true}} ## Basics @@ -25,7 +25,7 @@ You can also use the `dataset` prop together with `datasetKeys` instead of putti Add an optional `id` on each point so it keeps a stable identity when the data changes. If you animate the series, `id` lets added or removed points transition predictably; without it, updates follow each point's index in the array and existing markers can be repurposed in ways that look wrong. -{{"demo": "BasicScatter.js"}} +{{"component": "file://./demos/basic-scatter/index.ts"}} ### Using a dataset @@ -37,7 +37,7 @@ You can also include optional `id`, `colorValue`, and `sizeValue` keys. See the [Dataset](/x/react-charts/dataset/) page to learn more. -{{"demo": "ScatterDataset.js"}} +{{"component": "file://./demos/scatter-dataset/index.ts"}} ## Interaction @@ -48,7 +48,7 @@ Use the `hitAreaRadius` prop with a number to limit how far the pointer can be f If the pointer is farther than that from any point, no item is selected. Use `hitAreaRadius` with `"item"` to trigger interactions only when the pointer is directly over a marker, instead of selecting whichever point is closest to the pointer in the drawing area. -{{"demo": "ClosestPointInteraction.js"}} +{{"component": "file://./demos/closest-point-interaction/index.ts"}} ## Click event @@ -66,7 +66,7 @@ When `hitAreaRadius` is `"item"`, the user must click directly on the point, and Otherwise, click behavior matches the [interaction section](#interaction), and the mouse event comes from the SVG container. -{{"demo": "ScatterClick.js"}} +{{"component": "file://./demos/scatter-click/index.ts"}} ## Bubble chart @@ -79,7 +79,7 @@ Those are configured with See the [Bubble chart](/x/react-charts/bubble/) page for demos and details. -{{"demo": "../bubble/BubbleChartCO2Emissions.js"}} +{{"component": "file://../bubble/demos/bubble-chart-co2-emissions/index.ts"}} ## Styling @@ -89,7 +89,7 @@ You can add a grid in the background of the chart with the `grid` prop. See [Axis—Grid](/x/react-charts/axis-ticks/#grid) for details. -{{"demo": "GridDemo.js"}} +{{"component": "file://./demos/grid-demo/index.ts"}} ### CSS @@ -103,7 +103,7 @@ Use the `scatterClasses.root` class to select all marker groups. The example below customizes the highlighted style by series. -{{"demo": "ScatterCSSSelectors.js"}} +{{"component": "file://./demos/scatter-css-selectors/index.ts"}} ### Shape @@ -111,7 +111,7 @@ Pass a component to the `marker` slot to customize the shape of scatter points. To keep the legend and tooltip in sync with the custom shape, set the `labelMarkType` property on each series, as shown in the example below. -{{"demo": "ScatterCustomShape.js"}} +{{"component": "file://./demos/scatter-custom-shape/index.ts"}} ### Size @@ -120,7 +120,7 @@ For circles, `markerSize` is the radius in pixels. See the [Bubble chart page](/x/react-charts/bubble/) to modify mark size based on their value. -{{"demo": "ScatterCustomSize.js"}} +{{"component": "file://./demos/scatter-custom-size/index.ts"}} ## Plot customization @@ -131,7 +131,7 @@ It returns the series order and details for each series (data points, color, and See [Custom components](/x/react-charts/components/) for more ways to customize charts. -{{"demo": "CustomScatter.js"}} +{{"component": "file://./demos/custom-scatter/index.ts"}} ## Performance @@ -177,7 +177,7 @@ Use the buttons to compare the single and progressive renderers: the spinner kee Zoom and pan the chart to see the progressive renderer keep only the first level painted while you interact, then fill in the rest once the interaction settles. The first level is the first N points of each series, so it is representative only when the data is unordered; data sorted along an axis may show a partial cloud until the interaction settles. -{{"demo": "ScatterAsyncRenderer.js"}} +{{"component": "file://./demos/scatter-async-renderer/index.ts"}} ### Batch renderer @@ -195,7 +195,7 @@ Behavior also differs in a few ways: The example below uses the `renderer` prop to render 16,000 points with better performance. -{{"demo": "ScatterBatchRenderer.js"}} +{{"component": "file://./demos/scatter-batch-renderer/index.ts"}} ### WebGL renderer [](/x/introduction/licensing/#premium-plan 'Premium plan') @@ -204,7 +204,7 @@ This bypasses per-point SVG entirely and trades item-level interactivity for thr The example below renders 200,000 points. -{{"demo": "ScatterWebGLRenderer.js"}} +{{"component": "file://./demos/scatter-web-gl-renderer/index.ts"}} ## Composition @@ -244,4 +244,4 @@ See [Composition—clipping](/x/react-charts/composition/#clipping) for details. Add a regression line to a scatter plot by composing a custom chart and drawing the line yourself. -{{"demo": "ScatterRegressionLine.js"}} +{{"component": "file://./demos/scatter-regression-line/index.ts"}} diff --git a/docs/data/charts/sparkline/AreaSparkLine.js b/docs/data/charts/sparkline/AreaSparkLine.js deleted file mode 100644 index 693c1553bda34..0000000000000 --- a/docs/data/charts/sparkline/AreaSparkLine.js +++ /dev/null @@ -1,21 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; - -export default function AreaSparkLine() { - return ( - - - - - - - - - ); -} diff --git a/docs/data/charts/sparkline/AreaSparkLine.tsx.preview b/docs/data/charts/sparkline/AreaSparkLine.tsx.preview deleted file mode 100644 index 962f056d4730c..0000000000000 --- a/docs/data/charts/sparkline/AreaSparkLine.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/docs/data/charts/sparkline/BasicSparkLine.js b/docs/data/charts/sparkline/BasicSparkLine.js deleted file mode 100644 index cad2597ecdcbe..0000000000000 --- a/docs/data/charts/sparkline/BasicSparkLine.js +++ /dev/null @@ -1,31 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; - -export default function BasicSparkLine() { - return ( - - - - - - - - - ); -} diff --git a/docs/data/charts/sparkline/BasicSparkLine.tsx.preview b/docs/data/charts/sparkline/BasicSparkLine.tsx.preview deleted file mode 100644 index 92a8fef31c48e..0000000000000 --- a/docs/data/charts/sparkline/BasicSparkLine.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/docs/data/charts/sparkline/BasicSparkLineCustomization.js b/docs/data/charts/sparkline/BasicSparkLineCustomization.js deleted file mode 100644 index 68ab42d27670f..0000000000000 --- a/docs/data/charts/sparkline/BasicSparkLineCustomization.js +++ /dev/null @@ -1,69 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; - -export default function BasicSparkLineCustomization() { - const [showHighlight, setShowHighlight] = React.useState(true); - const [showTooltip, setShowTooltip] = React.useState(true); - - const handleHighlightChange = (event) => { - setShowHighlight(event.target.checked); - }; - - const handleTooltipChange = (event) => { - setShowTooltip(event.target.checked); - }; - - return ( - - - - } - label="showHighlight" - labelPlacement="end" - /> - - } - label="showTooltip" - labelPlacement="end" - /> - - - - - - - - - - - ); -} diff --git a/docs/data/charts/sparkline/ColorCustomization.js b/docs/data/charts/sparkline/ColorCustomization.js deleted file mode 100644 index f664f00dc3368..0000000000000 --- a/docs/data/charts/sparkline/ColorCustomization.js +++ /dev/null @@ -1,17 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; - -const settings = { - height: 100, - yAxis: { min: 0, max: 20 }, -}; - -const values = [0, 2, 3, 4, 6, 8, 7, 9, 15, 6, 8, 7, 12]; - -export default function ColorCustomization() { - return ( - - - - ); -} diff --git a/docs/data/charts/sparkline/ColorCustomization.tsx.preview b/docs/data/charts/sparkline/ColorCustomization.tsx.preview deleted file mode 100644 index 29e0fd333e956..0000000000000 --- a/docs/data/charts/sparkline/ColorCustomization.tsx.preview +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/sparkline/ColorCustomizationMode.js b/docs/data/charts/sparkline/ColorCustomizationMode.js deleted file mode 100644 index 95667d9a91c2c..0000000000000 --- a/docs/data/charts/sparkline/ColorCustomizationMode.js +++ /dev/null @@ -1,50 +0,0 @@ -import * as React from 'react'; -import { createTheme, useTheme, ThemeProvider } from '@mui/material/styles'; -import Stack from '@mui/material/Stack'; -import Button from '@mui/material/Button'; -import Brightness4Icon from '@mui/icons-material/Brightness4'; -import Brightness7Icon from '@mui/icons-material/Brightness7'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; -import Paper from '@mui/material/Paper'; - -const settings = { - height: 100, - yAxis: { min: 0, max: 20 }, -}; - -const values = [0, 2, 3, 4, 6, 8, 7, 9, 15, 6, 8, 7, 12]; - -export default function ColorCustomizationMode() { - return ( - - (mode === 'light' ? 'black' : 'white')} - {...settings} - /> - - ); -} - -function DarkModeWrapper(props) { - const theme = useTheme(); - const [colorMode, setColorMode] = React.useState(theme.palette.mode); - - const newTheme = createTheme({ palette: { mode: colorMode } }); - return ( - - - - {props.children} - - - ); -} diff --git a/docs/data/charts/sparkline/ColorCustomizationMode.tsx.preview b/docs/data/charts/sparkline/ColorCustomizationMode.tsx.preview deleted file mode 100644 index 6aeac2f38438a..0000000000000 --- a/docs/data/charts/sparkline/ColorCustomizationMode.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - - (mode === 'light' ? 'black' : 'white')} - {...settings} - /> - \ No newline at end of file diff --git a/docs/data/charts/sparkline/CustomAxis.js b/docs/data/charts/sparkline/CustomAxis.js deleted file mode 100644 index d8db1c8b0e1b3..0000000000000 --- a/docs/data/charts/sparkline/CustomAxis.js +++ /dev/null @@ -1,55 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; - -export default function CustomAxis() { - return ( - - - value.toISOString().slice(0, 10), - }} - height={100} - showTooltip - showHighlight - /> - - - value.getFullYear(), - }} - /> - - - ); -} diff --git a/docs/data/charts/sparkline/CustomDomainYAxis.js b/docs/data/charts/sparkline/CustomDomainYAxis.js deleted file mode 100644 index dc93610adfb33..0000000000000 --- a/docs/data/charts/sparkline/CustomDomainYAxis.js +++ /dev/null @@ -1,88 +0,0 @@ -import * as React from 'react'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; - -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; - -const settings = { - valueFormatter: (value) => `${value}%`, - height: 100, - showTooltip: true, - showHighlight: true, - data: [60, -15, 66, 68, 87, 82, 83, 85, 92, 75, 76, 50, 91], - margin: { top: 10, bottom: 20, left: 5, right: 5 }, - sx: (theme) => ({ - borderWidth: 1, - borderStyle: 'solid', - borderColor: theme.palette.divider, - }), -}; - -// Extend a value to match a multiple of the step. -function extend(value, step) { - if (value > 0) { - // If >0 go to the next step - return step * Math.ceil(value / step); - } - // If <0 go to the previous step - return step * Math.floor(value / step); -} - -const yRange = { - nice: '-100, 100', - strict: '-15, 92', - function: '-20, 100', -}; -export default function CustomDomainYAxis() { - const [domainLimitKey, setDomainLimitKey] = React.useState('nice'); - - const domainLimit = - domainLimitKey === 'function' - ? (min, max) => ({ - min: extend(min.valueOf(), 10), - max: extend(max.valueOf(), 10), - }) - : domainLimitKey; - return ( - - - setDomainLimitKey(event.target.value)} - label="domain limit" - sx={{ minWidth: 150, mb: 2 }} - > - nice - strict - function - - y-axis range: {yRange[domainLimitKey]} - - - - - - - - - - - ); -} diff --git a/docs/data/charts/sparkline/CustomDomainYAxis.tsx b/docs/data/charts/sparkline/CustomDomainYAxis.tsx deleted file mode 100644 index 061f21a5ff9a1..0000000000000 --- a/docs/data/charts/sparkline/CustomDomainYAxis.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import * as React from 'react'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { Theme } from '@mui/material/styles'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; -import type { NumberValue } from '@mui/x-charts/models'; - -const settings = { - valueFormatter: (value: number | null) => `${value}%`, - height: 100, - showTooltip: true, - showHighlight: true, - data: [60, -15, 66, 68, 87, 82, 83, 85, 92, 75, 76, 50, 91], - margin: { top: 10, bottom: 20, left: 5, right: 5 }, - sx: (theme: Theme) => ({ - borderWidth: 1, - borderStyle: 'solid', - borderColor: theme.palette.divider, - }), -}; - -// Extend a value to match a multiple of the step. -function extend(value: number, step: number) { - if (value > 0) { - // If >0 go to the next step - return step * Math.ceil(value / step); - } - // If <0 go to the previous step - return step * Math.floor(value / step); -} - -const yRange = { - nice: '-100, 100', - strict: '-15, 92', - function: '-20, 100', -}; -export default function CustomDomainYAxis() { - const [domainLimitKey, setDomainLimitKey] = React.useState< - 'nice' | 'strict' | 'function' - >('nice'); - - const domainLimit = - domainLimitKey === 'function' - ? (min: NumberValue, max: NumberValue) => ({ - min: extend(min.valueOf(), 10), - max: extend(max.valueOf(), 10), - }) - : domainLimitKey; - return ( - - - - setDomainLimitKey(event.target.value as 'nice' | 'strict' | 'function') - } - label="domain limit" - sx={{ minWidth: 150, mb: 2 }} - > - nice - strict - function - - y-axis range: {yRange[domainLimitKey]} - - - - - - - - - - - ); -} diff --git a/docs/data/charts/sparkline/CustomYAxis.js b/docs/data/charts/sparkline/CustomYAxis.js deleted file mode 100644 index fe4fe9faec8a7..0000000000000 --- a/docs/data/charts/sparkline/CustomYAxis.js +++ /dev/null @@ -1,53 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; - -const settings = { - valueFormatter: (value) => `${value}%`, - height: 100, - showTooltip: true, - showHighlight: true, -}; - -const smallValues = [0, 2, 3, 4, 6, 8, 7, 9, 15, 6, 8, 7, 12]; -const largeValues = [60, 65, 66, 68, 87, 82, 83, 89, 92, 75, 76, 77, 91]; -export default function CustomYAxis() { - return ( - - Without fixed y-range - - - - - - - - - With y-range fixed to [0, 100] - - - - - - - - - - ); -} diff --git a/docs/data/charts/sparkline/NpmSparkLine.js b/docs/data/charts/sparkline/NpmSparkLine.js deleted file mode 100644 index 6d77d958a2e4f..0000000000000 --- a/docs/data/charts/sparkline/NpmSparkLine.js +++ /dev/null @@ -1,136 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; -import { lineClasses } from '@mui/x-charts/LineChart'; -import { chartsAxisHighlightClasses } from '@mui/x-charts/ChartsAxisHighlight'; -import Box from '@mui/material/Box'; -import data from './weekly-downloads.json'; - -const downloads = data.map((item) => item.downloads); -const weeks = data.map((item) => `${item.start} to ${item.end}`); - -const settings = { - data: downloads, - baseline: 'min', - margin: { bottom: 0, top: 5, left: 4, right: 0 }, - xAxis: { id: 'week-axis', data: weeks }, - yAxis: { - domainLimit: (_, maxValue) => ({ - min: -maxValue / 6, // Hack to add 5px bellow 0 like npm. - max: maxValue, - }), - }, - sx: { - [`& .${lineClasses.area}`]: { opacity: 0.2 }, - [`& .${lineClasses.line}`]: { strokeWidth: 3 }, - [`& .${chartsAxisHighlightClasses.root}`]: { - stroke: 'rgb(137, 86, 255)', - strokeDasharray: 'none', - strokeWidth: 2, - }, - }, - slotProps: { - lineHighlight: { r: 4 }, // Reduce the radius of the axis highlight. - }, - clipAreaOffset: { top: 2, bottom: 2 }, - axisHighlight: { x: 'line' }, -}; - -export default function NpmSparkLine() { - const [weekIndex, setWeekIndex] = React.useState(null); - - return ( - { - switch (event.key) { - case 'ArrowLeft': - setWeekIndex((p) => - p === null ? weeks.length - 1 : (weeks.length + p - 1) % weeks.length, - ); - break; - case 'ArrowRight': - setWeekIndex((p) => (p === null ? 0 : (p + 1) % weeks.length)); - break; - default: - } - }} - onFocus={() => { - setWeekIndex((p) => (p === null ? 0 : p)); - }} - role="button" - aria-label="Showing weekly downloads" - tabIndex={0} - sx={{ - width: '100%', - height: '100%', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - }} - > - - - - {weekIndex === null ? 'Weekly Downloads' : weeks[weekIndex]} - - - - {downloads[weekIndex ?? downloads.length - 1].toLocaleString()} - - - { - setWeekIndex(axisItems[0]?.dataIndex ?? null); - }} - highlightedAxis={ - weekIndex === null - ? [] - : [{ axisId: 'week-axis', dataIndex: weekIndex }] - } - {...settings} - /> - - - - ); -} - -function DownloadIcon(props) { - return ( - - ); -} diff --git a/docs/data/charts/sparkline/SparklineLineWidth.js b/docs/data/charts/sparkline/SparklineLineWidth.js deleted file mode 100644 index 99314cb49a324..0000000000000 --- a/docs/data/charts/sparkline/SparklineLineWidth.js +++ /dev/null @@ -1,89 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Box from '@mui/material/Box'; -import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import Slider from '@mui/material/Slider'; - -const values = [8, 7, 9, 0, 0, 5, 20, 20, 7]; - -const settings = { - data: values, - height: 100, - showHighlight: true, - showTooltip: true, -}; - -export default function SparklineLineWidth() { - const [strokeWidth, setStrokeWidth] = React.useState(2); - const [disableClipping, setDisableClipping] = React.useState(false); - const [clipAreaOffset, setClipAreaOffset] = React.useState(1); - - return ( - - - setDisableClipping(event.target.checked)} - /> - } - label="Disable Clipping" - labelPlacement="end" - /> - setStrokeWidth(value)} - /> - } - label="Stroke Width" - labelPlacement="top" - /> - setClipAreaOffset(value)} - /> - } - label="Clip Area Offset" - labelPlacement="top" - /> - - - - - - ); -} diff --git a/docs/data/charts/sparkline/AreaSparkLine.tsx b/docs/data/charts/sparkline/demos/area-spark-line/AreaSparkLine.tsx similarity index 91% rename from docs/data/charts/sparkline/AreaSparkLine.tsx rename to docs/data/charts/sparkline/demos/area-spark-line/AreaSparkLine.tsx index 693c1553bda34..73f95a524cecb 100644 --- a/docs/data/charts/sparkline/AreaSparkLine.tsx +++ b/docs/data/charts/sparkline/demos/area-spark-line/AreaSparkLine.tsx @@ -5,6 +5,7 @@ import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; export default function AreaSparkLine() { return ( + {/* @focus-start */} @@ -16,6 +17,7 @@ export default function AreaSparkLine() { area /> + {/* @focus-end */} ); } diff --git a/docs/data/charts/sparkline/demos/area-spark-line/client.ts b/docs/data/charts/sparkline/demos/area-spark-line/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/area-spark-line/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/area-spark-line/index.ts b/docs/data/charts/sparkline/demos/area-spark-line/index.ts new file mode 100644 index 0000000000000..37baa2d5737ea --- /dev/null +++ b/docs/data/charts/sparkline/demos/area-spark-line/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AreaSparkLine from './AreaSparkLine'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AreaSparkLine, { ClientProvider }); diff --git a/docs/data/charts/sparkline/BasicSparkLineCustomization.tsx b/docs/data/charts/sparkline/demos/basic-spark-line-customization/BasicSparkLineCustomization.tsx similarity index 97% rename from docs/data/charts/sparkline/BasicSparkLineCustomization.tsx rename to docs/data/charts/sparkline/demos/basic-spark-line-customization/BasicSparkLineCustomization.tsx index 68fa54554f815..2da29c005c67d 100644 --- a/docs/data/charts/sparkline/BasicSparkLineCustomization.tsx +++ b/docs/data/charts/sparkline/demos/basic-spark-line-customization/BasicSparkLineCustomization.tsx @@ -6,6 +6,7 @@ import Switch from '@mui/material/Switch'; import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; export default function BasicSparkLineCustomization() { + // @focus-start @padding 1 const [showHighlight, setShowHighlight] = React.useState(true); const [showTooltip, setShowTooltip] = React.useState(true); @@ -66,4 +67,5 @@ export default function BasicSparkLineCustomization() { ); + // @focus-end } diff --git a/docs/data/charts/sparkline/demos/basic-spark-line-customization/client.ts b/docs/data/charts/sparkline/demos/basic-spark-line-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/basic-spark-line-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/basic-spark-line-customization/index.ts b/docs/data/charts/sparkline/demos/basic-spark-line-customization/index.ts new file mode 100644 index 0000000000000..5ac08de83cf03 --- /dev/null +++ b/docs/data/charts/sparkline/demos/basic-spark-line-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicSparkLineCustomization from './BasicSparkLineCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicSparkLineCustomization, { ClientProvider }); diff --git a/docs/data/charts/sparkline/BasicSparkLine.tsx b/docs/data/charts/sparkline/demos/basic-spark-line/BasicSparkLine.tsx similarity index 93% rename from docs/data/charts/sparkline/BasicSparkLine.tsx rename to docs/data/charts/sparkline/demos/basic-spark-line/BasicSparkLine.tsx index 053469e82c220..7964fa760b461 100644 --- a/docs/data/charts/sparkline/BasicSparkLine.tsx +++ b/docs/data/charts/sparkline/demos/basic-spark-line/BasicSparkLine.tsx @@ -17,6 +17,7 @@ export default function BasicSparkLine() { }, }} > + {/* @focus-start */} @@ -27,6 +28,7 @@ export default function BasicSparkLine() { height={100} /> + {/* @focus-end */} ); } diff --git a/docs/data/charts/sparkline/demos/basic-spark-line/client.ts b/docs/data/charts/sparkline/demos/basic-spark-line/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/basic-spark-line/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/basic-spark-line/index.ts b/docs/data/charts/sparkline/demos/basic-spark-line/index.ts new file mode 100644 index 0000000000000..36f980e4026f0 --- /dev/null +++ b/docs/data/charts/sparkline/demos/basic-spark-line/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicSparkLine from './BasicSparkLine'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicSparkLine, { ClientProvider }); diff --git a/docs/data/charts/sparkline/ColorCustomizationMode.tsx b/docs/data/charts/sparkline/demos/color-customization-mode/ColorCustomizationMode.tsx similarity index 96% rename from docs/data/charts/sparkline/ColorCustomizationMode.tsx rename to docs/data/charts/sparkline/demos/color-customization-mode/ColorCustomizationMode.tsx index 352e5b4428b47..34a5c75807fb7 100644 --- a/docs/data/charts/sparkline/ColorCustomizationMode.tsx +++ b/docs/data/charts/sparkline/demos/color-customization-mode/ColorCustomizationMode.tsx @@ -16,6 +16,7 @@ const values = [0, 2, 3, 4, 6, 8, 7, 9, 15, 6, 8, 7, 12]; export default function ColorCustomizationMode() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/sparkline/demos/color-customization-mode/client.ts b/docs/data/charts/sparkline/demos/color-customization-mode/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/color-customization-mode/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/color-customization-mode/index.ts b/docs/data/charts/sparkline/demos/color-customization-mode/index.ts new file mode 100644 index 0000000000000..672d78221ffc3 --- /dev/null +++ b/docs/data/charts/sparkline/demos/color-customization-mode/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorCustomizationMode from './ColorCustomizationMode'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorCustomizationMode, { ClientProvider }); diff --git a/docs/data/charts/sparkline/ColorCustomization.tsx b/docs/data/charts/sparkline/demos/color-customization/ColorCustomization.tsx similarity index 95% rename from docs/data/charts/sparkline/ColorCustomization.tsx rename to docs/data/charts/sparkline/demos/color-customization/ColorCustomization.tsx index 49a97647b088d..40df6535a962b 100644 --- a/docs/data/charts/sparkline/ColorCustomization.tsx +++ b/docs/data/charts/sparkline/demos/color-customization/ColorCustomization.tsx @@ -11,6 +11,7 @@ const values = [0, 2, 3, 4, 6, 8, 7, 9, 15, 6, 8, 7, 12]; export default function ColorCustomization() { return ( + {/** @focus */} ); diff --git a/docs/data/charts/sparkline/demos/color-customization/client.ts b/docs/data/charts/sparkline/demos/color-customization/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/color-customization/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/color-customization/index.ts b/docs/data/charts/sparkline/demos/color-customization/index.ts new file mode 100644 index 0000000000000..fc4da6f045177 --- /dev/null +++ b/docs/data/charts/sparkline/demos/color-customization/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorCustomization from './ColorCustomization'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorCustomization, { ClientProvider }); diff --git a/docs/data/charts/sparkline/CustomAxis.tsx b/docs/data/charts/sparkline/demos/custom-axis/CustomAxis.tsx similarity index 96% rename from docs/data/charts/sparkline/CustomAxis.tsx rename to docs/data/charts/sparkline/demos/custom-axis/CustomAxis.tsx index d8db1c8b0e1b3..070070c8bb821 100644 --- a/docs/data/charts/sparkline/CustomAxis.tsx +++ b/docs/data/charts/sparkline/demos/custom-axis/CustomAxis.tsx @@ -5,6 +5,7 @@ import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; export default function CustomAxis() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/sparkline/demos/custom-axis/client.ts b/docs/data/charts/sparkline/demos/custom-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/custom-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/custom-axis/index.ts b/docs/data/charts/sparkline/demos/custom-axis/index.ts new file mode 100644 index 0000000000000..13ab9021e4c38 --- /dev/null +++ b/docs/data/charts/sparkline/demos/custom-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomAxis from './CustomAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomAxis, { ClientProvider }); diff --git a/docs/data/charts/sparkline/demos/custom-domain-y-axis/CustomDomainYAxis.tsx b/docs/data/charts/sparkline/demos/custom-domain-y-axis/CustomDomainYAxis.tsx new file mode 100644 index 0000000000000..373384daddf47 --- /dev/null +++ b/docs/data/charts/sparkline/demos/custom-domain-y-axis/CustomDomainYAxis.tsx @@ -0,0 +1,95 @@ +import * as React from 'react'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import Stack from '@mui/material/Stack'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import type { Theme } from '@mui/material/styles'; +import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; +import type { NumberValue } from '@mui/x-charts/models'; + +const settings = { + valueFormatter: (value: number | null) => `${value}%`, + height: 100, + showTooltip: true, + showHighlight: true, + data: [60, -15, 66, 68, 87, 82, 83, 85, 92, 75, 76, 50, 91], + margin: { top: 10, bottom: 20, left: 5, right: 5 }, + sx: (theme: Theme) => ({ + borderWidth: 1, + borderStyle: 'solid', + borderColor: theme.palette.divider, + }), +}; + +// Extend a value to match a multiple of the step. +function extend(value: number, step: number) { + if (value > 0) { + // If >0 go to the next step + return step * Math.ceil(value / step); + } + // If <0 go to the previous step + return step * Math.floor(value / step); +} + +const yRange = { + nice: '-100, 100', + strict: '-15, 92', + function: '-20, 100', +}; +export default function CustomDomainYAxis() { + // @focus-start @padding 1 + const [domainLimitKey, setDomainLimitKey] = React.useState< + 'nice' | 'strict' | 'function' + >('nice'); + + const domainLimit = + domainLimitKey === 'function' + ? (min: NumberValue, max: NumberValue) => ({ + min: extend(min.valueOf(), 10), + max: extend(max.valueOf(), 10), + }) + : domainLimitKey; + return ( + + + + setDomainLimitKey(event.target.value as 'nice' | 'strict' | 'function') + } + label="domain limit" + sx={{ minWidth: 150, mb: 2 }} + > + nice + strict + function + + y-axis range: {yRange[domainLimitKey]} + + + + + + + + + + + ); + // @focus-end +} diff --git a/docs/data/charts/sparkline/demos/custom-domain-y-axis/client.ts b/docs/data/charts/sparkline/demos/custom-domain-y-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/custom-domain-y-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/custom-domain-y-axis/index.ts b/docs/data/charts/sparkline/demos/custom-domain-y-axis/index.ts new file mode 100644 index 0000000000000..22009d536a290 --- /dev/null +++ b/docs/data/charts/sparkline/demos/custom-domain-y-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomDomainYAxis from './CustomDomainYAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomDomainYAxis, { ClientProvider }); diff --git a/docs/data/charts/sparkline/CustomYAxis.tsx b/docs/data/charts/sparkline/demos/custom-y-axis/CustomYAxis.tsx similarity index 96% rename from docs/data/charts/sparkline/CustomYAxis.tsx rename to docs/data/charts/sparkline/demos/custom-y-axis/CustomYAxis.tsx index dc21a0006ce26..16dee9e94690b 100644 --- a/docs/data/charts/sparkline/CustomYAxis.tsx +++ b/docs/data/charts/sparkline/demos/custom-y-axis/CustomYAxis.tsx @@ -15,6 +15,7 @@ const largeValues = [60, 65, 66, 68, 87, 82, 83, 89, 92, 75, 76, 77, 91]; export default function CustomYAxis() { return ( + {/* @focus-start */} Without fixed y-range @@ -48,6 +49,7 @@ export default function CustomYAxis() { /> + {/* @focus-end */} ); } diff --git a/docs/data/charts/sparkline/demos/custom-y-axis/client.ts b/docs/data/charts/sparkline/demos/custom-y-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/custom-y-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/custom-y-axis/index.ts b/docs/data/charts/sparkline/demos/custom-y-axis/index.ts new file mode 100644 index 0000000000000..5686d354b26e5 --- /dev/null +++ b/docs/data/charts/sparkline/demos/custom-y-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomYAxis from './CustomYAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomYAxis, { ClientProvider }); diff --git a/docs/data/charts/sparkline/NpmSparkLine.tsx b/docs/data/charts/sparkline/demos/npm-spark-line/NpmSparkLine.tsx similarity index 94% rename from docs/data/charts/sparkline/NpmSparkLine.tsx rename to docs/data/charts/sparkline/demos/npm-spark-line/NpmSparkLine.tsx index f096fe7d6b2cf..330eb5440aa62 100644 --- a/docs/data/charts/sparkline/NpmSparkLine.tsx +++ b/docs/data/charts/sparkline/demos/npm-spark-line/NpmSparkLine.tsx @@ -1,11 +1,12 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; -import { SparkLineChart, SparkLineChartProps } from '@mui/x-charts/SparkLineChart'; +import type { SparkLineChartProps } from '@mui/x-charts/SparkLineChart'; +import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; import { lineClasses } from '@mui/x-charts/LineChart'; import { chartsAxisHighlightClasses } from '@mui/x-charts/ChartsAxisHighlight'; import Box from '@mui/material/Box'; -import data from './weekly-downloads.json'; +import data from '../../weekly-downloads.json'; const downloads = data.map((item) => item.downloads); const weeks = data.map((item) => `${item.start} to ${item.end}`); @@ -38,6 +39,7 @@ const settings: SparkLineChartProps = { }; export default function NpmSparkLine() { + // @focus-start @padding 1 const [weekIndex, setWeekIndex] = React.useState(null); return ( @@ -118,6 +120,7 @@ export default function NpmSparkLine() { ); + // @focus-end } function DownloadIcon(props: React.SVGProps) { diff --git a/docs/data/charts/sparkline/demos/npm-spark-line/client.ts b/docs/data/charts/sparkline/demos/npm-spark-line/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/npm-spark-line/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/npm-spark-line/index.ts b/docs/data/charts/sparkline/demos/npm-spark-line/index.ts new file mode 100644 index 0000000000000..9e6acbc779282 --- /dev/null +++ b/docs/data/charts/sparkline/demos/npm-spark-line/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import NpmSparkLine from './NpmSparkLine'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, NpmSparkLine, { ClientProvider }); diff --git a/docs/data/charts/sparkline/SparklineLineWidth.tsx b/docs/data/charts/sparkline/demos/sparkline-line-width/SparklineLineWidth.tsx similarity index 93% rename from docs/data/charts/sparkline/SparklineLineWidth.tsx rename to docs/data/charts/sparkline/demos/sparkline-line-width/SparklineLineWidth.tsx index a8929f3d4763a..dbaa680fdd594 100644 --- a/docs/data/charts/sparkline/SparklineLineWidth.tsx +++ b/docs/data/charts/sparkline/demos/sparkline-line-width/SparklineLineWidth.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; -import { SparkLineChart, SparkLineChartProps } from '@mui/x-charts/SparkLineChart'; +import type { SparkLineChartProps } from '@mui/x-charts/SparkLineChart'; +import { SparkLineChart } from '@mui/x-charts/SparkLineChart'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import Slider from '@mui/material/Slider'; @@ -16,6 +17,7 @@ const settings = { } satisfies Partial; export default function SparklineLineWidth() { + // @focus-start @padding 1 const [strokeWidth, setStrokeWidth] = React.useState(2); const [disableClipping, setDisableClipping] = React.useState(false); const [clipAreaOffset, setClipAreaOffset] = React.useState(1); @@ -87,4 +89,5 @@ export default function SparklineLineWidth() { ); + // @focus-end } diff --git a/docs/data/charts/sparkline/demos/sparkline-line-width/client.ts b/docs/data/charts/sparkline/demos/sparkline-line-width/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/sparkline/demos/sparkline-line-width/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/sparkline/demos/sparkline-line-width/index.ts b/docs/data/charts/sparkline/demos/sparkline-line-width/index.ts new file mode 100644 index 0000000000000..c738c7a10083a --- /dev/null +++ b/docs/data/charts/sparkline/demos/sparkline-line-width/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SparklineLineWidth from './SparklineLineWidth'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SparklineLineWidth, { ClientProvider }); diff --git a/docs/data/charts/sparkline/sparkline.md b/docs/data/charts/sparkline/sparkline.md index d007c4e8a52c5..f988f2cc16bc0 100644 --- a/docs/data/charts/sparkline/sparkline.md +++ b/docs/data/charts/sparkline/sparkline.md @@ -16,14 +16,14 @@ The curve or bar shape conveys the trend without scales or labels. The demo below shows how npm displays a package's weekly download trend in a sparkline. -{{"demo": "NpmSparkLine.js"}} +{{"component": "file://./demos/npm-spark-line/index.ts"}} ## Basics `SparkLineChart` only needs the `data` prop, which is an array of numbers. Set `plotType` to `"bar"` to switch from a line chart to a bar chart. -{{"demo": "BasicSparkLine.js"}} +{{"component": "file://./demos/basic-spark-line/index.ts"}} ## Line customization @@ -31,7 +31,7 @@ Set the `area` prop to fill the area under the curve. Use the `curve` prop to change how the line is interpolated between points. See [Lines—Interpolation](/x/react-charts/lines/#interpolation) for curve options. -{{"demo": "AreaSparkLine.js"}} +{{"component": "file://./demos/area-spark-line/index.ts"}} ## Interaction @@ -40,7 +40,7 @@ Use the `showTooltip` and `showHighlight` props to enable the default tooltip an For more control, pass custom props to the `tooltip` and `highlight` slots. See [Tooltip](/x/react-charts/tooltip/) for details. -{{"demo": "BasicSparkLineCustomization.js"}} +{{"component": "file://./demos/basic-spark-line-customization/index.ts"}} ## Axis management @@ -56,7 +56,7 @@ The sparkline has a single axis, so `xAxis` takes one axis configuration object, ``` -{{"demo": "CustomAxis.js"}} +{{"component": "file://./demos/custom-axis/index.ts"}} ### Y-axis range @@ -64,26 +64,26 @@ Set `min` and `max` on the `yAxis` configuration to fix the y-axis range. The demo below shows two sparklines with different value scales: the first row uses the default y-axis, and the second row uses a fixed range from 0 to 100. -{{"demo": "CustomYAxis.js"}} +{{"component": "file://./demos/custom-y-axis/index.ts"}} Use the `domainLimit` option in the `yAxis` configuration to adjust the y-axis range relative to the data. See [Axis—Relative axis subdomain](/x/react-charts/axis/#relative-axis-subdomain) for details. The demo below uses the same data (values from -15 to 92) with different `domainLimit` settings. -{{"demo": "CustomDomainYAxis.js"}} +{{"component": "file://./demos/custom-domain-y-axis/index.ts"}} ## Color customization Pass a color to the `color` prop to set the sparkline color. -{{"demo": "ColorCustomization.js"}} +{{"component": "file://./demos/color-customization/index.ts"}} The `color` prop also accepts a function that receives the mode (`'light'` or `'dark'`), so you can change the color for the current theme. The demo below uses a white line in dark mode and a black line in light mode. -{{"demo": "ColorCustomizationMode.js"}} +{{"component": "file://./demos/color-customization-mode/index.ts"}} ## Line width @@ -96,4 +96,4 @@ Set `disableClipping` to `true` to turn clipping off. The demo below shows how stroke width, `disableClipping`, and `clipAreaOffset` affect the result. -{{"demo": "SparklineLineWidth.js"}} +{{"component": "file://./demos/sparkline-line-width/index.ts"}} diff --git a/docs/data/charts/stacking/BasicStacking.js b/docs/data/charts/stacking/BasicStacking.js deleted file mode 100644 index 7e44092f63ffa..0000000000000 --- a/docs/data/charts/stacking/BasicStacking.js +++ /dev/null @@ -1,26 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -const seriesA = { - data: [2, 3, 1, 4, 5], - label: 'Series A', -}; -const seriesB = { - data: [3, 1, 4, 2, 1], - label: 'Series B', -}; -const seriesC = { - data: [3, 2, 4, 5, 1], - label: 'Series C', -}; -export default function BasicStacking() { - return ( - - ); -} diff --git a/docs/data/charts/stacking/BasicStacking.tsx.preview b/docs/data/charts/stacking/BasicStacking.tsx.preview deleted file mode 100644 index 903d409f78fef..0000000000000 --- a/docs/data/charts/stacking/BasicStacking.tsx.preview +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/stacking/StackOffsetDemo.js b/docs/data/charts/stacking/StackOffsetDemo.js deleted file mode 100644 index 22733b98dc1cf..0000000000000 --- a/docs/data/charts/stacking/StackOffsetDemo.js +++ /dev/null @@ -1,68 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const availableStackOffset = ['expand', 'diverging', 'none']; - -const getSeries = ({ hasNegativeValue, stackOffset }) => [ - { - label: 'A', - data: [125, 450, 492, 625], - stack: 'total', - stackOffset, - }, - { - label: 'B', - data: [50, hasNegativeValue ? -150 : 150, 203, 620], - stack: 'total', - }, - { - label: 'C', - data: [134, 215, 342, 402].map((y) => (hasNegativeValue ? -y : y)), - stack: 'total', - }, - { - label: 'D', - data: [315, 421, 289, 321].map((y) => (hasNegativeValue ? -y : y)), - stack: 'total', - }, -]; - -export default function StackOffsetDemo() { - const [stackOffset, setStackOffset] = React.useState('diverging'); - const [hasNegativeValue, setHasNegativeValue] = React.useState(true); - - return ( - - - setStackOffset(event.target.value)} - > - {availableStackOffset.map((offset) => ( - - {offset} - - ))} - - - setHasNegativeValue(event.target.checked)} - control={} - label="data has negative value" - labelPlacement="end" - /> - - - - ); -} diff --git a/docs/data/charts/stacking/StackOrderDemo.js b/docs/data/charts/stacking/StackOrderDemo.js deleted file mode 100644 index 1997735d7ad33..0000000000000 --- a/docs/data/charts/stacking/StackOrderDemo.js +++ /dev/null @@ -1,127 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import { BarChart } from '@mui/x-charts/BarChart'; - -// Data coming from https://www.insee.fr/fr/statistiques/5013868 -const commonTransportation = [ - 6.5, 12.5, 17.2, 19.6, 20.1, 20.0, 19.5, 18.8, 18.2, 17.3, 16.4, 15.9, 15.2, 14.7, - 14.3, 14.3, 14.3, 14.1, 14.2, 14.2, 14.0, 13.8, 13.8, 13.9, 13.6, 14.0, 14.9, 14.8, - 15.2, 21.1, -]; - -const car = [ - 48.8, 56.3, 63.2, 67.3, 70.2, 72.3, 74.1, 75.8, 76.9, 78.4, 79.7, 80.5, 81.5, 82.4, - 83.0, 83.1, 83.2, 83.6, 83.6, 83.8, 83.9, 84.3, 84.4, 84.4, 84.6, 84.4, 83.6, 83.9, - 83.6, 77.6, -]; - -const motorcycle = [ - 1.3, 2.1, 2.5, 2.6, 2.7, 2.7, 2.6, 2.6, 2.6, 2.5, 2.5, 2.3, 2.2, 2.1, 1.9, 1.9, - 1.8, 1.7, 1.6, 1.6, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.0, 0.9, 0.8, 0.7, -]; - -const biking = [ - 4.0, 5.9, 5.8, 5.0, 4.0, 3.1, 2.4, 1.8, 1.5, 1.2, 0.9, 0.8, 0.7, 0.5, 0.5, 0.4, - 0.4, 0.3, 0.3, 0.2, 0.3, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.1, 0.1, 0.3, -]; - -const walking = [ - 39.4, 23.2, 11.3, 5.5, 3.0, 1.9, 1.4, 1.0, 0.8, 0.6, 0.5, 0.5, 0.4, 0.3, 0.3, 0.3, - 0.3, 0.3, 0.3, 0.2, 0.2, 0.2, 0.3, 0.2, 0.3, 0.2, 0.3, 0.3, 0.3, 0.3, -]; - -const xAxis = { - label: 'Distance between home and office (km)', - data: [ - '0-1', - '1-2', - '2-3', - '3-4', - '4-5', - '5-6', - '6-7', - '7-8', - '8-9', - '9-10', - '10-11', - '11-12', - '12-13', - '13-14', - '14-15', - '15-16', - '16-17', - '17-18', - '18-19', - '19-20', - '20-21', - '21-22', - '22-23', - '23-24', - '24-25', - '25-30', - '30-35', - '35-40', - '40-50', - '>50', - ], -}; - -const series = [ - { label: 'Car', data: car, stack: 'total' }, - { label: 'Public T.', data: commonTransportation, stack: 'total' }, - { label: 'Motorcycle', data: motorcycle, stack: 'total' }, - { label: 'Walk', data: walking, stack: 'total' }, - { label: 'Bike', data: biking, stack: 'total' }, -]; - -const availableStackOrder = [ - 'none', - 'reverse', - 'appearance', - 'ascending', - 'descending', - 'insideOut', -]; - -export default function StackOrderDemo() { - const [stackOrder, setStackOrder] = React.useState('appearance'); - - const modifiedSeries = [{ ...series[0], stackOrder }, ...series.slice(1)]; - return ( - - setStackOrder(event.target.value)} - > - {availableStackOrder.map((offset) => ( - - {offset} - - ))} - - - - - - ); -} diff --git a/docs/data/charts/stacking/BasicStacking.tsx b/docs/data/charts/stacking/demos/basic-stacking/BasicStacking.tsx similarity index 91% rename from docs/data/charts/stacking/BasicStacking.tsx rename to docs/data/charts/stacking/demos/basic-stacking/BasicStacking.tsx index 7e44092f63ffa..aa9228464c8d8 100644 --- a/docs/data/charts/stacking/BasicStacking.tsx +++ b/docs/data/charts/stacking/demos/basic-stacking/BasicStacking.tsx @@ -14,6 +14,7 @@ const seriesC = { }; export default function BasicStacking() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/stacking/demos/basic-stacking/client.ts b/docs/data/charts/stacking/demos/basic-stacking/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/stacking/demos/basic-stacking/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/stacking/demos/basic-stacking/index.ts b/docs/data/charts/stacking/demos/basic-stacking/index.ts new file mode 100644 index 0000000000000..eb8a81c656fea --- /dev/null +++ b/docs/data/charts/stacking/demos/basic-stacking/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicStacking from './BasicStacking'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicStacking, { ClientProvider }); diff --git a/docs/data/charts/stacking/StackOffsetDemo.tsx b/docs/data/charts/stacking/demos/stack-offset-demo/StackOffsetDemo.tsx similarity index 95% rename from docs/data/charts/stacking/StackOffsetDemo.tsx rename to docs/data/charts/stacking/demos/stack-offset-demo/StackOffsetDemo.tsx index 42430294a4d27..faf50b0513fa7 100644 --- a/docs/data/charts/stacking/StackOffsetDemo.tsx +++ b/docs/data/charts/stacking/demos/stack-offset-demo/StackOffsetDemo.tsx @@ -6,7 +6,7 @@ import MenuItem from '@mui/material/MenuItem'; import FormControlLabel from '@mui/material/FormControlLabel'; import Switch from '@mui/material/Switch'; import { BarChart } from '@mui/x-charts/BarChart'; -import { StackOffsetType } from '@mui/x-charts/models'; +import type { StackOffsetType } from '@mui/x-charts/models'; type GetSeriesParams = { hasNegativeValue: boolean; @@ -40,6 +40,7 @@ const getSeries = ({ hasNegativeValue, stackOffset }: GetSeriesParams) => [ ]; export default function StackOffsetDemo() { + // @focus-start @padding 1 const [stackOffset, setStackOffset] = React.useState('diverging'); const [hasNegativeValue, setHasNegativeValue] = React.useState(true); @@ -71,4 +72,5 @@ export default function StackOffsetDemo() { ); + // @focus-end } diff --git a/docs/data/charts/stacking/demos/stack-offset-demo/client.ts b/docs/data/charts/stacking/demos/stack-offset-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/stacking/demos/stack-offset-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/stacking/demos/stack-offset-demo/index.ts b/docs/data/charts/stacking/demos/stack-offset-demo/index.ts new file mode 100644 index 0000000000000..dcce4e5188fde --- /dev/null +++ b/docs/data/charts/stacking/demos/stack-offset-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackOffsetDemo from './StackOffsetDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackOffsetDemo, { ClientProvider }); diff --git a/docs/data/charts/stacking/StackOrderDemo.tsx b/docs/data/charts/stacking/demos/stack-order-demo/StackOrderDemo.tsx similarity index 96% rename from docs/data/charts/stacking/StackOrderDemo.tsx rename to docs/data/charts/stacking/demos/stack-order-demo/StackOrderDemo.tsx index 98a3ec00b2260..67f2a0d965ddd 100644 --- a/docs/data/charts/stacking/StackOrderDemo.tsx +++ b/docs/data/charts/stacking/demos/stack-order-demo/StackOrderDemo.tsx @@ -3,7 +3,7 @@ import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import { BarChart } from '@mui/x-charts/BarChart'; -import { StackOrderType } from '@mui/x-charts/models'; +import type { StackOrderType } from '@mui/x-charts/models'; // Data coming from https://www.insee.fr/fr/statistiques/5013868 const commonTransportation = [ @@ -82,6 +82,7 @@ const availableStackOrder = [ ] as const; export default function StackOrderDemo() { + // @focus-start @padding 1 const [stackOrder, setStackOrder] = React.useState('appearance'); const modifiedSeries = [{ ...series[0], stackOrder }, ...series.slice(1)]; @@ -120,4 +121,5 @@ export default function StackOrderDemo() { ); + // @focus-end } diff --git a/docs/data/charts/stacking/demos/stack-order-demo/client.ts b/docs/data/charts/stacking/demos/stack-order-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/stacking/demos/stack-order-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/stacking/demos/stack-order-demo/index.ts b/docs/data/charts/stacking/demos/stack-order-demo/index.ts new file mode 100644 index 0000000000000..41051af560059 --- /dev/null +++ b/docs/data/charts/stacking/demos/stack-order-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StackOrderDemo from './StackOrderDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StackOrderDemo, { ClientProvider }); diff --git a/docs/data/charts/stacking/stacking.md b/docs/data/charts/stacking/stacking.md index 4ca2d4b701c79..cd6eb8af949dd 100644 --- a/docs/data/charts/stacking/stacking.md +++ b/docs/data/charts/stacking/stacking.md @@ -15,7 +15,7 @@ Bar and line charts support stacking. To stack series together, pass them a `stack` attribute. Series with the same `stack` value are stacked together. -{{"demo": "BasicStacking.js"}} +{{"component": "file://./demos/basic-stacking/index.ts"}} ## Stacking strategy @@ -47,7 +47,7 @@ When turned on: - Series B has one negative value - Series C and D have only negative values -{{"demo": "StackOffsetDemo.js"}} +{{"component": "file://./demos/stack-offset-demo/index.ts"}} ### Stack order @@ -69,7 +69,7 @@ Otherwise, you can order them based on different properties of their values as d To demonstrate stack order, the example below shows statistics about means of transportation used for commuting to work relative to the distance between home and office for commuters. -{{"demo": "StackOrderDemo.js"}} +{{"component": "file://./demos/stack-order-demo/index.ts"}} With the `'appearance'` order, **walking** is first since its maximal percentage is for **0-1km**, and **common transportation** is last because its maximum value is at the **>50km** distance. diff --git a/docs/data/charts/styling/BackgroundStyling.js b/docs/data/charts/styling/BackgroundStyling.js deleted file mode 100644 index 55a7f0298ec57..0000000000000 --- a/docs/data/charts/styling/BackgroundStyling.js +++ /dev/null @@ -1,67 +0,0 @@ -import { useTheme } from '@mui/material/styles'; -import { LinePlot } from '@mui/x-charts/LineChart'; - -import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; -import { ChartsGrid } from '@mui/x-charts/ChartsGrid'; -import { useDrawingArea } from '@mui/x-charts/hooks'; -import { - dateAxisFormatter, - percentageFormatter, - usUnemploymentRate, -} from '../dataset/usUnemploymentRate'; - -function Background() { - const drawingArea = useDrawingArea(); - const theme = useTheme(); - return ( - - ); -} - -export default function BackgroundStyling() { - return ( - - - - - - - - ); -} - -const xAxis = [ - { - dataKey: 'date', - scaleType: 'time', - valueFormatter: dateAxisFormatter, - }, -]; - -const yAxis = [ - { - valueFormatter: percentageFormatter, - }, -]; - -const series = [ - { - type: 'line', - dataKey: 'rate', - valueFormatter: percentageFormatter, - }, -]; diff --git a/docs/data/charts/styling/BackgroundStyling.tsx.preview b/docs/data/charts/styling/BackgroundStyling.tsx.preview deleted file mode 100644 index 64007c598c874..0000000000000 --- a/docs/data/charts/styling/BackgroundStyling.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/docs/data/charts/styling/BasicColor.js b/docs/data/charts/styling/BasicColor.js deleted file mode 100644 index 613b9d893a338..0000000000000 --- a/docs/data/charts/styling/BasicColor.js +++ /dev/null @@ -1,58 +0,0 @@ -import * as React from 'react'; -import { LineChart } from '@mui/x-charts/LineChart'; -import Stack from '@mui/material/Stack'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; - -const Tableau10 = [ - '#4e79a7', - '#f28e2c', - '#e15759', - '#76b7b2', - '#59a14f', - '#edc949', - '#af7aa1', - '#ff9da7', - '#9c755f', - '#bab0ab', -]; - -const chartsParams = { - height: 300, -}; -export default function BasicColor() { - const [color, setColor] = React.useState('#4e79a7'); - - const handleChange = (event, nextColor) => { - setColor(nextColor); - }; - - return ( - - - - {Tableau10.map((value) => ( - -
- - ))} - - - ); -} diff --git a/docs/data/charts/styling/ColorCallback.js b/docs/data/charts/styling/ColorCallback.js deleted file mode 100644 index 1df8dc9a99376..0000000000000 --- a/docs/data/charts/styling/ColorCallback.js +++ /dev/null @@ -1,89 +0,0 @@ -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const clubs = [ - 'Arsenal', - 'Liverpool', - 'Man Utd', - 'Tottenham', - 'Everton', - 'Sunderland', - 'Newcastle', - 'Nottingham Forest', - 'Leeds', - 'Man City', - 'West Ham', - 'Burnley', - 'Fulham', - 'Chelsea', - 'Aston Villa', - 'Wolves', - 'Crystal Palace', - 'Brentford', - 'Bournemouth', - 'Brighton', -]; - -// Source: https://www.squawka.com/en/news/premier-league-net-spend-2025-26/ -const netSpendInPounds = [ - 251.4, 235, 166.9, 137.8, 116, 113.4, 95.6, 95.4, 91.5, 80.2, 69.7, 57.8, 18.93, - 9.5, -8, -14.7, -23, -58.9, -63.3, -68.15, -]; - -const clubColors = [ - '#EF0107', // Arsenal - Red - '#C8102E', // Liverpool - Red - '#DA291C', // Man Utd - Red - '#132257', // Tottenham - Navy Blue - '#003399', // Everton - Royal Blue - '#E03A3E', // Sunderland - Red - '#241F20', // Newcastle - Black - '#DD0000', // Nottingham Forest - Red - '#FFCD00', // Leeds - Yellow - '#6CABDD', // Man City - Sky Blue - '#7A263A', // West Ham - Claret - '#6C1D45', // Burnley - Claret - '#CC0000', // Fulham - Red - '#034694', // Chelsea - Blue - '#670E36', // Aston Villa - Claret - '#FDB913', // Wolves - Gold - '#1B458F', // Crystal Palace - Blue - '#E30613', // Brentford - Red - '#DA291C', // Bournemouth - Red - '#0057B8', // Brighton - Blue -]; - -const valueFormatter = (v) => (v < 0 ? `-£${-v}m` : `£${v}m`); - -const chartsParams = { - margin: { top: 20, right: 40, bottom: 20, left: 20 }, - xAxis: [{ data: clubs, tickLabelStyle: { angle: 45 }, height: 80 }], - yAxis: [ - { - width: 60, - valueFormatter, - }, - ], - series: [ - { - data: netSpendInPounds, - colorGetter: (data) => clubColors[data.dataIndex], - valueFormatter, - }, - ], - height: 400, -}; - -export default function ColorCallback() { - return ( - - - Premier League Clubs Net Spend - Summer 2025 - - - Source: squawka.com - - ); -} diff --git a/docs/data/charts/styling/ColorCallback.tsx.preview b/docs/data/charts/styling/ColorCallback.tsx.preview deleted file mode 100644 index 6fd34cf4c092e..0000000000000 --- a/docs/data/charts/styling/ColorCallback.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - - Premier League Clubs Net Spend - Summer 2025 - - -Source: squawka.com \ No newline at end of file diff --git a/docs/data/charts/styling/ColorTemplate.js b/docs/data/charts/styling/ColorTemplate.js deleted file mode 100644 index 4bd6112afc60f..0000000000000 --- a/docs/data/charts/styling/ColorTemplate.js +++ /dev/null @@ -1,215 +0,0 @@ -import * as React from 'react'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; - -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import Typography from '@mui/material/Typography'; -import { Chance } from 'chance'; - -const chance = new Chance(42); - -function getGaussianSeriesData(mean, stdev = [0.3, 0.4], N = 50) { - return [...Array(N)].map((_, i) => { - const x = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[0] + - mean[0]; - const y = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[1] + - mean[1]; - return { x, y, id: i }; - }); -} - -const legendPlacement = { - slotProps: { - legend: { - position: { - vertical: 'middle', - horizontal: 'end', - }, - direction: 'vertical', - }, - }, -}; -const series = [ - { label: 'Series 1', data: getGaussianSeriesData([-5, 0]) }, - { label: 'Series 2', data: getGaussianSeriesData([-4, 0]) }, - { label: 'Series 3', data: getGaussianSeriesData([-3, 0]) }, - { label: 'Series 4', data: getGaussianSeriesData([-2, 0]) }, - { label: 'Series 5', data: getGaussianSeriesData([-1, 0]) }, - { label: 'Series 6', data: getGaussianSeriesData([0, 0]) }, - { label: 'Series 7', data: getGaussianSeriesData([1, 0]) }, - { label: 'Series 8', data: getGaussianSeriesData([2, 0]) }, - { label: 'Series 9', data: getGaussianSeriesData([3, 0]) }, - { label: 'Series 10', data: getGaussianSeriesData([4, 0]) }, - { label: 'Series 11', data: getGaussianSeriesData([5, 0]) }, - { label: 'Series 12', data: getGaussianSeriesData([6, 0]) }, - { label: 'Series 13', data: getGaussianSeriesData([7, 0]) }, -].map((s) => ({ - ...s, - valueFormatter: (v) => v && `(${v.x.toFixed(1)}, ${v.y.toFixed(1)})`, -})); - -const categories = { - Category10: [ - '#1f77b4', - '#ff7f0e', - '#2ca02c', - '#d62728', - '#9467bd', - '#8c564b', - '#e377c2', - '#7f7f7f', - '#bcbd22', - '#17becf', - ], - Accent: [ - '#7fc97f', - '#beaed4', - '#fdc086', - '#ffff99', - '#386cb0', - '#f0027f', - '#bf5b17', - '#666666', - ], - Dark2: [ - '#1b9e77', - '#d95f02', - '#7570b3', - '#e7298a', - '#66a61e', - '#e6ab02', - '#a6761d', - '#666666', - ], - Paired: [ - '#a6cee3', - '#1f78b4', - '#b2df8a', - '#33a02c', - '#fb9a99', - '#e31a1c', - '#fdbf6f', - '#ff7f00', - '#cab2d6', - '#6a3d9a', - '#ffff99', - '#b15928', - ], - Pastel1: [ - '#fbb4ae', - '#b3cde3', - '#ccebc5', - '#decbe4', - '#fed9a6', - '#ffffcc', - '#e5d8bd', - '#fddaec', - '#f2f2f2', - ], - Pastel2: [ - '#b3e2cd', - '#fdcdac', - '#cbd5e8', - '#f4cae4', - '#e6f5c9', - '#fff2ae', - '#f1e2cc', - '#cccccc', - ], - Set1: [ - '#e41a1c', - '#377eb8', - '#4daf4a', - '#984ea3', - '#ff7f00', - '#ffff33', - '#a65628', - '#f781bf', - '#999999', - ], - Set2: [ - '#66c2a5', - '#fc8d62', - '#8da0cb', - '#e78ac3', - '#a6d854', - '#ffd92f', - '#e5c494', - '#b3b3b3', - ], - Set3: [ - '#8dd3c7', - '#ffffb3', - '#bebada', - '#fb8072', - '#80b1d3', - '#fdb462', - '#b3de69', - '#fccde5', - '#d9d9d9', - '#bc80bd', - '#ccebc5', - '#ffed6f', - ], - Tableau10: [ - '#4e79a7', - '#f28e2c', - '#e15759', - '#76b7b2', - '#59a14f', - '#edc949', - '#af7aa1', - '#ff9da7', - '#9c755f', - '#bab0ab', - ], -}; - -export default function ColorTemplate() { - const [colorScheme, setColorScheme] = React.useState('Category10'); - - return ( - - - setColorScheme(event.target.value)} - > - {Object.entries(categories).map(([name, colors]) => ( - - - {name} -
- {colors.map((c) => ( -
- ))} -
- - - ))} - - - ); -} diff --git a/docs/data/charts/styling/CustomOverlay.js b/docs/data/charts/styling/CustomOverlay.js deleted file mode 100644 index 3f85951ce2d3b..0000000000000 --- a/docs/data/charts/styling/CustomOverlay.js +++ /dev/null @@ -1,70 +0,0 @@ -import { styled } from '@mui/material/styles'; -import Stack from '@mui/material/Stack'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { useDrawingArea, useXScale, useYScale } from '@mui/x-charts/hooks'; - -const ratios = [0.2, 0.8, 0.6, 0.5]; - -const LoadingRect = styled('rect')({ - opacity: 0.2, - fill: 'lightgray', -}); - -const LoadingText = styled('text')(({ theme }) => ({ - stroke: 'none', - fill: theme.palette.text.primary, - shapeRendering: 'crispEdges', - textAnchor: 'middle', - dominantBaseline: 'middle', -})); - -function LoadingOverlay() { - const xScale = useXScale(); - const yScale = useYScale(); - const { left, width, height } = useDrawingArea(); - - const bandWidth = xScale.bandwidth(); - - const [bottom, top] = yScale.range(); - - return ( - - {xScale.domain().map((item, index) => { - const ratio = ratios[index % ratios.length]; - const barHeight = ratio * (bottom - top); - - return ( - - ); - })} - - Loading data… - - - ); -} - -export default function CustomOverlay() { - return ( - - - - - ); -} diff --git a/docs/data/charts/styling/CustomOverlay.tsx.preview b/docs/data/charts/styling/CustomOverlay.tsx.preview deleted file mode 100644 index 8106bc5b571e3..0000000000000 --- a/docs/data/charts/styling/CustomOverlay.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/styling/GradientTooltip.js b/docs/data/charts/styling/GradientTooltip.js deleted file mode 100644 index 7664447ac3fb7..0000000000000 --- a/docs/data/charts/styling/GradientTooltip.js +++ /dev/null @@ -1,41 +0,0 @@ -import { BarChart } from '@mui/x-charts/BarChart'; - -export default function GradientTooltip() { - return ( - - - - - - - - - - - ); -} diff --git a/docs/data/charts/styling/Margin.js b/docs/data/charts/styling/Margin.js deleted file mode 100644 index 3264dd9be84cd..0000000000000 --- a/docs/data/charts/styling/Margin.js +++ /dev/null @@ -1,190 +0,0 @@ -import * as React from 'react'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; -import { BarChart } from '@mui/x-charts/BarChart'; -import { useDrawingArea, useXAxis, useYAxis } from '@mui/x-charts/hooks'; - -const defaultMargin = { - knob: 'number', - defaultValue: 40, - step: 1, - min: 0, - max: 200, -}; - -const defaultAxisSize = { - knob: 'number', - defaultValue: 30, - step: 1, - min: 0, - max: 200, -}; - -export default function Margin() { - return ( - ( -
- - - - - -
- )} - getCode={({ props }) => - `import { BarChart } from '@mui/x-charts/BarChart'; - -` - } - /> - ); -} - -function MarginVisualization() { - const { bottom, left, right, top, height, width } = useDrawingArea(); - const xAxis = useXAxis('x-axis'); - const yAxis = useYAxis('y-axis'); - - const xSize = (xAxis.position !== 'none' ? xAxis.height : 0) ?? 0; - const ySize = (yAxis.position !== 'none' ? yAxis.width : 0) ?? 0; - - return ( - - - - - - - ); -} - -function AxisSizeVisualization() { - const { left, top, height, width } = useDrawingArea(); - const xAxis = useXAxis('x-axis'); - const yAxis = useYAxis('y-axis'); - - return ( - - {xAxis.position !== 'none' && ( - - )} - {yAxis.position !== 'none' && ( - - )} - - ); -} - -function DrawingAreaVisualization() { - const { left, top, height, width } = useDrawingArea(); - - return ( - - ); -} diff --git a/docs/data/charts/styling/MuiColorTemplate.js b/docs/data/charts/styling/MuiColorTemplate.js deleted file mode 100644 index f60fea3e3bbe5..0000000000000 --- a/docs/data/charts/styling/MuiColorTemplate.js +++ /dev/null @@ -1,208 +0,0 @@ -import * as React from 'react'; -import { createTheme, useTheme, ThemeProvider } from '@mui/material/styles'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import Typography from '@mui/material/Typography'; -import Paper from '@mui/material/Paper'; -import Button from '@mui/material/Button'; -import Brightness4Icon from '@mui/icons-material/Brightness4'; -import Brightness7Icon from '@mui/icons-material/Brightness7'; -import { Chance } from 'chance'; -import { ScatterChart } from '@mui/x-charts/ScatterChart'; - -import { - blueberryTwilightPalette, - mangoFusionPalette, - cheerfulFiestaPalette, - strawberrySkyPalette, - rainbowSurgePalette, - bluePalette, - greenPalette, - purplePalette, - redPalette, - orangePalette, - yellowPalette, - cyanPalette, - pinkPalette, -} from '@mui/x-charts/colorPalettes'; -import Divider from '@mui/material/Divider'; -import ListSubheader from '@mui/material/ListSubheader'; - -const chance = new Chance(42); - -function getGaussianSeriesData(mean, stdev = [0.3, 0.4], N = 50) { - return [...Array(N)].map((_, i) => { - const x = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[0] + - mean[0]; - const y = - Math.sqrt(-2.0 * Math.log(1 - chance.floating({ min: 0, max: 0.99 }))) * - Math.cos(2.0 * Math.PI * chance.floating({ min: 0, max: 0.99 })) * - stdev[1] + - mean[1]; - return { x, y, id: i }; - }); -} - -const legendPlacement = { - slotProps: { - legend: { - direction: 'vertical', - }, - }, -}; - -const series = [ - { label: 'Series 1', data: getGaussianSeriesData([-5, 0]) }, - { label: 'Series 2', data: getGaussianSeriesData([-4, 0]) }, - { label: 'Series 3', data: getGaussianSeriesData([-3, 0]) }, - { label: 'Series 4', data: getGaussianSeriesData([-2, 0]) }, - { label: 'Series 5', data: getGaussianSeriesData([-1, 0]) }, - { label: 'Series 6', data: getGaussianSeriesData([0, 0]) }, - { label: 'Series 7', data: getGaussianSeriesData([1, 0]) }, - { label: 'Series 8', data: getGaussianSeriesData([2, 0]) }, - { label: 'Series 9', data: getGaussianSeriesData([3, 0]) }, - { label: 'Series 10', data: getGaussianSeriesData([4, 0]) }, - { label: 'Series 11', data: getGaussianSeriesData([5, 0]) }, - { label: 'Series 12', data: getGaussianSeriesData([6, 0]) }, - { label: 'Series 13', data: getGaussianSeriesData([7, 0]) }, -].map((s) => ({ - ...s, - valueFormatter: (v) => v && `(${v.x.toFixed(1)}, ${v.y.toFixed(1)})`, -})); - -const categorical = { - rainbowSurge: rainbowSurgePalette, - blueberryTwilight: blueberryTwilightPalette, - mangoFusion: mangoFusionPalette, - cheerfulFiesta: cheerfulFiestaPalette, -}; -const sequential = { - strawberrySky: strawberrySkyPalette, - purple: purplePalette, - blue: bluePalette, - cyan: cyanPalette, - green: greenPalette, - yellow: yellowPalette, - orange: orangePalette, - red: redPalette, - pink: pinkPalette, -}; - -const categories = { - ...categorical, - ...sequential, -}; - -export default function MuiColorTemplate() { - const theme = useTheme(); - const [colorScheme, setColorScheme] = React.useState('blueberryTwilight'); - const [colorMode, setColorMode] = React.useState(theme.palette.mode); - - React.useEffect(() => { - setColorMode(theme.palette.mode); - }, [theme.palette.mode]); - - const newTheme = createTheme({ palette: { mode: colorMode } }); - return ( - - - - - -
- -
- setColorScheme(event.target.value)} - > - Categorical - {Object.entries(categorical).map(([name, colors]) => ( - - - {name} -
- {colors(colorMode).map((c) => ( -
- ))} -
- - - ))} - - Sequential - {Object.entries(sequential).map(([name, colors]) => ( - - - {name} -
- {colors(colorMode).map((c) => ( -
- ))} -
- - - ))} - - - - - - ); -} diff --git a/docs/data/charts/styling/Overlay.js b/docs/data/charts/styling/Overlay.js deleted file mode 100644 index ca3b5ad0b9388..0000000000000 --- a/docs/data/charts/styling/Overlay.js +++ /dev/null @@ -1,16 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const emptySeries = { - series: [], - height: 150, -}; - -export default function Overlay() { - return ( - - - - - ); -} diff --git a/docs/data/charts/styling/Overlay.tsx.preview b/docs/data/charts/styling/Overlay.tsx.preview deleted file mode 100644 index caa7653ae1e29..0000000000000 --- a/docs/data/charts/styling/Overlay.tsx.preview +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/charts/styling/OverlayWithAxis.js b/docs/data/charts/styling/OverlayWithAxis.js deleted file mode 100644 index 5bba8328764f4..0000000000000 --- a/docs/data/charts/styling/OverlayWithAxis.js +++ /dev/null @@ -1,36 +0,0 @@ -import Stack from '@mui/material/Stack'; -import { LineChart } from '@mui/x-charts/LineChart'; - -const emptySeries = { - series: [], - height: 150, -}; - -export default function OverlayWithAxis() { - return ( - - - - - ); -} diff --git a/docs/data/charts/styling/SxStyling.js b/docs/data/charts/styling/SxStyling.js deleted file mode 100644 index b2575adcbd5f3..0000000000000 --- a/docs/data/charts/styling/SxStyling.js +++ /dev/null @@ -1,53 +0,0 @@ -import * as React from 'react'; -import { BarChart, barClasses } from '@mui/x-charts/BarChart'; -import { axisClasses } from '@mui/x-charts/ChartsAxis'; - -const labels = ['Group A', 'Group B', 'Group C', 'Group D', 'Group E']; -const lData = [42, 24, 56, 45, 3]; -const rData = [57, 7, 19, 16, 22]; -const colors = ['#006BD6', '#EC407A']; - -export default function SxStyling() { - return ( - ({ - [`.${barClasses.element}`]: { - fill: (theme.vars || theme).palette.background.paper, - strokeWidth: 2, - }, - [`[data-series="l_id"] .${barClasses.element}`]: { - stroke: colors[0], - }, - [`[data-series="r_id"] .${barClasses.element}`]: { - stroke: colors[1], - }, - [`.${axisClasses.root}`]: { - [`.${axisClasses.tick}, .${axisClasses.line}`]: { - stroke: '#006BD6', - strokeWidth: 3, - }, - [`.${axisClasses.tickLabel}`]: { - fill: '#006BD6', - }, - }, - border: '1px solid rgba(0, 0, 0, 0.1)', - backgroundImage: - 'linear-gradient(rgba(0, 0, 0, 0.1) 1px, transparent 1px), linear-gradient(90deg, rgba(0, 0, 0, 0.1) 1px, transparent 1px)', - backgroundSize: '35px 35px', - backgroundPosition: '20px 20px, 20px 20px', - ...theme.applyStyles('dark', { - borderColor: 'rgba(255,255,255, 0.1)', - backgroundImage: - 'linear-gradient(rgba(255,255,255, 0.1) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255, 0.1) 1px, transparent 1px)', - }), - })} - xAxis={[{ data: labels }]} - series={[ - { data: lData, label: 'l', id: 'l_id' }, - { data: rData, label: 'r', id: 'r_id' }, - ]} - colors={colors} - height={300} - /> - ); -} diff --git a/docs/data/charts/styling/TextStyling.js b/docs/data/charts/styling/TextStyling.js deleted file mode 100644 index dbbb3a4f20c01..0000000000000 --- a/docs/data/charts/styling/TextStyling.js +++ /dev/null @@ -1,63 +0,0 @@ -import * as React from 'react'; -import { BarChart } from '@mui/x-charts/BarChart'; - -const months = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec', -]; - -const data = [42, 65, 49, 78, 56, 90, 73, 81, 60, 88, 54, 95]; - -export default function TextStyling() { - return ( - - ); -} diff --git a/docs/data/charts/styling/BackgroundStyling.tsx b/docs/data/charts/styling/demos/background-styling/BackgroundStyling.tsx similarity index 90% rename from docs/data/charts/styling/BackgroundStyling.tsx rename to docs/data/charts/styling/demos/background-styling/BackgroundStyling.tsx index 4c96822218b52..58b4b5fdc4a83 100644 --- a/docs/data/charts/styling/BackgroundStyling.tsx +++ b/docs/data/charts/styling/demos/background-styling/BackgroundStyling.tsx @@ -1,6 +1,6 @@ import { useTheme } from '@mui/material/styles'; import { LinePlot } from '@mui/x-charts/LineChart'; -import { XAxis } from '@mui/x-charts/models'; +import type { XAxis } from '@mui/x-charts/models'; import { ChartsContainer } from '@mui/x-charts/ChartsContainer'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; @@ -10,7 +10,7 @@ import { dateAxisFormatter, percentageFormatter, usUnemploymentRate, -} from '../dataset/usUnemploymentRate'; +} from '../../../dataset/usUnemploymentRate'; function Background() { const drawingArea = useDrawingArea(); @@ -28,6 +28,7 @@ function Background() { export default function BackgroundStyling() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/styling/demos/background-styling/client.ts b/docs/data/charts/styling/demos/background-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/background-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/background-styling/index.ts b/docs/data/charts/styling/demos/background-styling/index.ts new file mode 100644 index 0000000000000..b70973a3162e4 --- /dev/null +++ b/docs/data/charts/styling/demos/background-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BackgroundStyling from './BackgroundStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BackgroundStyling, { ClientProvider }); diff --git a/docs/data/charts/styling/BasicColor.tsx b/docs/data/charts/styling/demos/basic-color/BasicColor.tsx similarity index 96% rename from docs/data/charts/styling/BasicColor.tsx rename to docs/data/charts/styling/demos/basic-color/BasicColor.tsx index d16d803d3e23b..02bafa89ac980 100644 --- a/docs/data/charts/styling/BasicColor.tsx +++ b/docs/data/charts/styling/demos/basic-color/BasicColor.tsx @@ -21,6 +21,7 @@ const chartsParams = { height: 300, }; export default function BasicColor() { + // @focus-start @padding 1 const [color, setColor] = React.useState('#4e79a7'); const handleChange = (event: React.MouseEvent, nextColor: string) => { @@ -55,4 +56,5 @@ export default function BasicColor() { ); + // @focus-end } diff --git a/docs/data/charts/styling/demos/basic-color/client.ts b/docs/data/charts/styling/demos/basic-color/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/basic-color/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/basic-color/index.ts b/docs/data/charts/styling/demos/basic-color/index.ts new file mode 100644 index 0000000000000..e6e870912679d --- /dev/null +++ b/docs/data/charts/styling/demos/basic-color/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicColor from './BasicColor'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicColor, { ClientProvider }); diff --git a/docs/data/charts/styling/ColorCallback.tsx b/docs/data/charts/styling/demos/color-callback/ColorCallback.tsx similarity index 92% rename from docs/data/charts/styling/ColorCallback.tsx rename to docs/data/charts/styling/demos/color-callback/ColorCallback.tsx index dde96cfb0747c..a2a24b198965d 100644 --- a/docs/data/charts/styling/ColorCallback.tsx +++ b/docs/data/charts/styling/demos/color-callback/ColorCallback.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; -import { BarChart, BarChartProps, BarSeries } from '@mui/x-charts/BarChart'; +import type { BarChartProps, BarSeries } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; const clubs = [ 'Arsenal', @@ -78,11 +79,13 @@ const chartsParams = { export default function ColorCallback() { return ( + {/* @focus-start */} Premier League Clubs Net Spend - Summer 2025 Source: squawka.com + {/* @focus-end */} ); } diff --git a/docs/data/charts/styling/demos/color-callback/client.ts b/docs/data/charts/styling/demos/color-callback/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/color-callback/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/color-callback/index.ts b/docs/data/charts/styling/demos/color-callback/index.ts new file mode 100644 index 0000000000000..71dd05ebbfec5 --- /dev/null +++ b/docs/data/charts/styling/demos/color-callback/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorCallback from './ColorCallback'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorCallback, { ClientProvider }); diff --git a/docs/data/charts/styling/ColorTemplate.tsx b/docs/data/charts/styling/demos/color-template/ColorTemplate.tsx similarity index 95% rename from docs/data/charts/styling/ColorTemplate.tsx rename to docs/data/charts/styling/demos/color-template/ColorTemplate.tsx index 303e880771fd1..7d95212df8db6 100644 --- a/docs/data/charts/styling/ColorTemplate.tsx +++ b/docs/data/charts/styling/demos/color-template/ColorTemplate.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; -import { ScatterChart, ScatterChartProps } from '@mui/x-charts/ScatterChart'; -import { ScatterValueType } from '@mui/x-charts/models'; +import type { ScatterChartProps } from '@mui/x-charts/ScatterChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import type { ScatterValueType } from '@mui/x-charts/models'; import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; @@ -178,6 +179,7 @@ const categories: { [key: string]: string[] } = { }; export default function ColorTemplate() { + // @focus-start @padding 1 const [colorScheme, setColorScheme] = React.useState('Category10'); return ( @@ -217,4 +219,5 @@ export default function ColorTemplate() { ); + // @focus-end } diff --git a/docs/data/charts/styling/demos/color-template/client.ts b/docs/data/charts/styling/demos/color-template/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/color-template/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/color-template/index.ts b/docs/data/charts/styling/demos/color-template/index.ts new file mode 100644 index 0000000000000..c25d26afa507e --- /dev/null +++ b/docs/data/charts/styling/demos/color-template/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ColorTemplate from './ColorTemplate'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ColorTemplate, { ClientProvider }); diff --git a/docs/data/charts/styling/CustomOverlay.tsx b/docs/data/charts/styling/demos/custom-overlay/CustomOverlay.tsx similarity index 97% rename from docs/data/charts/styling/CustomOverlay.tsx rename to docs/data/charts/styling/demos/custom-overlay/CustomOverlay.tsx index d9f541bc1b484..1536633d413d3 100644 --- a/docs/data/charts/styling/CustomOverlay.tsx +++ b/docs/data/charts/styling/demos/custom-overlay/CustomOverlay.tsx @@ -53,6 +53,7 @@ function LoadingOverlay() { export default function CustomOverlay() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/styling/demos/custom-overlay/client.ts b/docs/data/charts/styling/demos/custom-overlay/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/custom-overlay/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/custom-overlay/index.ts b/docs/data/charts/styling/demos/custom-overlay/index.ts new file mode 100644 index 0000000000000..0007950ad0cda --- /dev/null +++ b/docs/data/charts/styling/demos/custom-overlay/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomOverlay from './CustomOverlay'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomOverlay, { ClientProvider }); diff --git a/docs/data/charts/styling/GradientTooltip.tsx b/docs/data/charts/styling/demos/gradient-tooltip/GradientTooltip.tsx similarity index 95% rename from docs/data/charts/styling/GradientTooltip.tsx rename to docs/data/charts/styling/demos/gradient-tooltip/GradientTooltip.tsx index 7664447ac3fb7..cbded90d1dc13 100644 --- a/docs/data/charts/styling/GradientTooltip.tsx +++ b/docs/data/charts/styling/demos/gradient-tooltip/GradientTooltip.tsx @@ -2,6 +2,7 @@ import { BarChart } from '@mui/x-charts/BarChart'; export default function GradientTooltip() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/styling/demos/gradient-tooltip/client.ts b/docs/data/charts/styling/demos/gradient-tooltip/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/gradient-tooltip/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/gradient-tooltip/index.ts b/docs/data/charts/styling/demos/gradient-tooltip/index.ts new file mode 100644 index 0000000000000..53f4ff86bcaa8 --- /dev/null +++ b/docs/data/charts/styling/demos/gradient-tooltip/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import GradientTooltip from './GradientTooltip'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, GradientTooltip, { ClientProvider }); diff --git a/docs/data/charts/styling/Margin.tsx b/docs/data/charts/styling/demos/margin/Margin.tsx similarity index 98% rename from docs/data/charts/styling/Margin.tsx rename to docs/data/charts/styling/demos/margin/Margin.tsx index f89bff232f8fa..fbafe990f8eda 100644 --- a/docs/data/charts/styling/Margin.tsx +++ b/docs/data/charts/styling/demos/margin/Margin.tsx @@ -21,6 +21,7 @@ const defaultAxisSize = { export default function Margin() { return ( + // @focus-start @padding 2 ` } /> + // @focus-end ); } diff --git a/docs/data/charts/styling/demos/margin/client.ts b/docs/data/charts/styling/demos/margin/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/margin/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/margin/index.ts b/docs/data/charts/styling/demos/margin/index.ts new file mode 100644 index 0000000000000..5e4c9982d89b9 --- /dev/null +++ b/docs/data/charts/styling/demos/margin/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import Margin from './Margin'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, Margin, { ClientProvider }); diff --git a/docs/data/charts/styling/MuiColorTemplate.tsx b/docs/data/charts/styling/demos/mui-color-template/MuiColorTemplate.tsx similarity index 96% rename from docs/data/charts/styling/MuiColorTemplate.tsx rename to docs/data/charts/styling/demos/mui-color-template/MuiColorTemplate.tsx index cc00d3a9cdfa9..5efd4727a05d0 100644 --- a/docs/data/charts/styling/MuiColorTemplate.tsx +++ b/docs/data/charts/styling/demos/mui-color-template/MuiColorTemplate.tsx @@ -9,8 +9,9 @@ import Button from '@mui/material/Button'; import Brightness4Icon from '@mui/icons-material/Brightness4'; import Brightness7Icon from '@mui/icons-material/Brightness7'; import { Chance } from 'chance'; -import { ScatterChart, ScatterChartProps } from '@mui/x-charts/ScatterChart'; -import { ScatterValueType } from '@mui/x-charts/models'; +import type { ScatterChartProps } from '@mui/x-charts/ScatterChart'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import type { ScatterValueType } from '@mui/x-charts/models'; import { blueberryTwilightPalette, mangoFusionPalette, @@ -105,6 +106,7 @@ const categories = { type PaletteKey = keyof typeof categories; export default function MuiColorTemplate() { + // @focus-start @padding 1 const theme = useTheme(); const [colorScheme, setColorScheme] = React.useState('blueberryTwilight'); @@ -213,4 +215,5 @@ export default function MuiColorTemplate() { ); + // @focus-end } diff --git a/docs/data/charts/styling/demos/mui-color-template/client.ts b/docs/data/charts/styling/demos/mui-color-template/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/mui-color-template/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/mui-color-template/index.ts b/docs/data/charts/styling/demos/mui-color-template/index.ts new file mode 100644 index 0000000000000..bde0ee58ebc03 --- /dev/null +++ b/docs/data/charts/styling/demos/mui-color-template/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MuiColorTemplate from './MuiColorTemplate'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MuiColorTemplate, { ClientProvider }); diff --git a/docs/data/charts/styling/OverlayWithAxis.tsx b/docs/data/charts/styling/demos/overlay-with-axis/OverlayWithAxis.tsx similarity index 94% rename from docs/data/charts/styling/OverlayWithAxis.tsx rename to docs/data/charts/styling/demos/overlay-with-axis/OverlayWithAxis.tsx index 5bba8328764f4..3b8a9ee6bd775 100644 --- a/docs/data/charts/styling/OverlayWithAxis.tsx +++ b/docs/data/charts/styling/demos/overlay-with-axis/OverlayWithAxis.tsx @@ -9,6 +9,7 @@ const emptySeries = { export default function OverlayWithAxis() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/styling/demos/overlay-with-axis/client.ts b/docs/data/charts/styling/demos/overlay-with-axis/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/overlay-with-axis/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/overlay-with-axis/index.ts b/docs/data/charts/styling/demos/overlay-with-axis/index.ts new file mode 100644 index 0000000000000..472f590e12206 --- /dev/null +++ b/docs/data/charts/styling/demos/overlay-with-axis/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import OverlayWithAxis from './OverlayWithAxis'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, OverlayWithAxis, { ClientProvider }); diff --git a/docs/data/charts/styling/Overlay.tsx b/docs/data/charts/styling/demos/overlay/Overlay.tsx similarity index 87% rename from docs/data/charts/styling/Overlay.tsx rename to docs/data/charts/styling/demos/overlay/Overlay.tsx index ca3b5ad0b9388..736fea5faffc3 100644 --- a/docs/data/charts/styling/Overlay.tsx +++ b/docs/data/charts/styling/demos/overlay/Overlay.tsx @@ -9,8 +9,10 @@ const emptySeries = { export default function Overlay() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/styling/demos/overlay/client.ts b/docs/data/charts/styling/demos/overlay/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/overlay/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/overlay/index.ts b/docs/data/charts/styling/demos/overlay/index.ts new file mode 100644 index 0000000000000..60bfd616a74f0 --- /dev/null +++ b/docs/data/charts/styling/demos/overlay/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import Overlay from './Overlay'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, Overlay, { ClientProvider }); diff --git a/docs/data/charts/styling/SxStyling.tsx b/docs/data/charts/styling/demos/sx-styling/SxStyling.tsx similarity index 97% rename from docs/data/charts/styling/SxStyling.tsx rename to docs/data/charts/styling/demos/sx-styling/SxStyling.tsx index 80237b7fc6e2d..713d3b2ee560f 100644 --- a/docs/data/charts/styling/SxStyling.tsx +++ b/docs/data/charts/styling/demos/sx-styling/SxStyling.tsx @@ -9,6 +9,7 @@ const colors: string[] = ['#006BD6', '#EC407A']; export default function SxStyling(): React.JSX.Element { return ( + // @focus-start @padding 2 ({ [`.${barClasses.element}`]: { @@ -49,5 +50,6 @@ export default function SxStyling(): React.JSX.Element { colors={colors} height={300} /> + // @focus-end ); } diff --git a/docs/data/charts/styling/demos/sx-styling/client.ts b/docs/data/charts/styling/demos/sx-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/sx-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/sx-styling/index.ts b/docs/data/charts/styling/demos/sx-styling/index.ts new file mode 100644 index 0000000000000..cfb21192d0ec8 --- /dev/null +++ b/docs/data/charts/styling/demos/sx-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SxStyling from './SxStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SxStyling, { ClientProvider }); diff --git a/docs/data/charts/styling/TextStyling.tsx b/docs/data/charts/styling/demos/text-styling/TextStyling.tsx similarity index 96% rename from docs/data/charts/styling/TextStyling.tsx rename to docs/data/charts/styling/demos/text-styling/TextStyling.tsx index 07d5334af5069..c4fc1c2730e5a 100644 --- a/docs/data/charts/styling/TextStyling.tsx +++ b/docs/data/charts/styling/demos/text-styling/TextStyling.tsx @@ -19,6 +19,7 @@ const data = [42, 65, 49, 78, 56, 90, 73, 81, 60, 88, 54, 95]; export default function TextStyling(): React.JSX.Element { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/styling/demos/text-styling/client.ts b/docs/data/charts/styling/demos/text-styling/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/styling/demos/text-styling/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/styling/demos/text-styling/index.ts b/docs/data/charts/styling/demos/text-styling/index.ts new file mode 100644 index 0000000000000..f3c2591519245 --- /dev/null +++ b/docs/data/charts/styling/demos/text-styling/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TextStyling from './TextStyling'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TextStyling, { ClientProvider }); diff --git a/docs/data/charts/styling/styling.md b/docs/data/charts/styling/styling.md index 2827bcecfe49d..902272a918179 100644 --- a/docs/data/charts/styling/styling.md +++ b/docs/data/charts/styling/styling.md @@ -21,7 +21,7 @@ This is the base color used to render its components. ``` -{{"demo": "BasicColor.js"}} +{{"component": "file://./demos/basic-color/index.ts"}} ### Built-in color palettes @@ -31,7 +31,7 @@ If a series doesn't have a `color` prop, the chart assigns a color based on the You can set a custom color palette using the `colors` prop on chart components (or `ChartsContainer` when composing a custom component). You can pass an array of colors, or a callback whose input is the theme's mode (`'dark'` or `'light'`) and returns the array of colors. -{{"demo": "MuiColorTemplate.js"}} +{{"component": "file://./demos/mui-color-template/index.ts"}} ### Custom color palettes @@ -39,7 +39,7 @@ You can generate custom color palettes using [d3-scale-chromatic](https://observ The example below shows the d3 Categorical color palette. -{{"demo": "ColorTemplate.js"}} +{{"component": "file://./demos/color-template/index.ts"}} ### Value-based colors @@ -113,19 +113,19 @@ The callback function receives a `{ value, dataIndex }` object and should return In components where a series-level color is required (for example, the legend), the `color` prop is used instead. -{{"demo": "ColorCallback.js"}} +{{"component": "file://./demos/color-callback/index.ts"}} ## Overlay Charts have built-in overlays for loading and "no data" states that appear when the `loading` prop is `true` and when there is no data to display, respectively. -{{"demo": "Overlay.js"}} +{{"component": "file://./demos/overlay/index.ts"}} ### Axis display You can provide axis data to display axes while loading the data. -{{"demo": "OverlayWithAxis.js"}} +{{"component": "file://./demos/overlay-with-axis/index.ts"}} ### Custom overlay @@ -142,7 +142,7 @@ To modify the default overlay message or translate it, use the `noData` or `load For more advanced customization, use the `loadingOverlay` and `noDataOverlay` slots as shown in the demo below. -{{"demo": "CustomOverlay.js"}} +{{"component": "file://./demos/custom-overlay/index.ts"}} ## Styling @@ -169,13 +169,13 @@ You can update it using the `xAxis` and `yAxis` configuration: Axes only take up space on the side where they are positioned. If an axis is not displayed (`position: 'none'`), it does not take up any space, regardless of its size. -{{"demo": "Margin.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/margin/index.ts", "hideToolbar": true, "bg": "playground"}} ### CSS Charts use SVG for rendering, so you can customize them using the `sx` prop and target any subcomponents using their class names. -{{"demo": "SxStyling.js"}} +{{"component": "file://./demos/sx-styling/index.ts"}} ### Text customization @@ -201,7 +201,7 @@ Visual attributes such as `fill` don't affect measurement and can be set either The demo below applies a custom font style to both axes and rotates the x-axis tick labels. -{{"demo": "TextStyling.js"}} +{{"component": "file://./demos/text-styling/index.ts"}} ### Drawing area background @@ -210,7 +210,7 @@ This is only possible when [composing custom charts](/x/react-charts/composition The demo below defines a basic `Background` component that adds a light gray background. -{{"demo": "BackgroundStyling.js"}} +{{"component": "file://./demos/background-styling/index.ts"}} ### Gradients and patterns @@ -219,4 +219,4 @@ You can use gradients and patterns to fill charts by passing gradient or pattern Gradients or patterns defined this way are only usable for SVG. A direct definition like `color: "url(#Pattern)"` causes undefined colors in HTML elements. -{{"demo": "GradientTooltip.js"}} +{{"component": "file://./demos/gradient-tooltip/index.ts"}} diff --git a/docs/data/charts/toolbar/ChartsToolbar.js b/docs/data/charts/toolbar/ChartsToolbar.js deleted file mode 100644 index 5882984a8c0c8..0000000000000 --- a/docs/data/charts/toolbar/ChartsToolbar.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import { data } from './randomData'; - -const series = [ - { - label: 'Series A', - data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), - }, -]; - -export default function ChartsToolbar() { - return ( - - ); -} diff --git a/docs/data/charts/toolbar/ChartsToolbar.tsx.preview b/docs/data/charts/toolbar/ChartsToolbar.tsx.preview deleted file mode 100644 index 436b591d0195a..0000000000000 --- a/docs/data/charts/toolbar/ChartsToolbar.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/toolbar/ChartsToolbarCustomElements.js b/docs/data/charts/toolbar/ChartsToolbarCustomElements.js deleted file mode 100644 index 6ee420035bc7f..0000000000000 --- a/docs/data/charts/toolbar/ChartsToolbarCustomElements.js +++ /dev/null @@ -1,43 +0,0 @@ -import * as React from 'react'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; - -import Button from '@mui/material/Button'; -import { chartsToolbarClasses } from '@mui/x-charts/Toolbar'; -import { data } from './randomData'; - -const params = { - height: 300, - series: [ - { - label: 'Series A', - data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), - }, - ], -}; - -const CustomIconButton = React.forwardRef(function CustomIconButton(props, ref) { - return
); + // @focus-end } diff --git a/docs/data/charts/tooltip/demos/custom-tooltip-content/client.ts b/docs/data/charts/tooltip/demos/custom-tooltip-content/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/custom-tooltip-content/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/custom-tooltip-content/index.ts b/docs/data/charts/tooltip/demos/custom-tooltip-content/index.ts new file mode 100644 index 0000000000000..10476988b40e7 --- /dev/null +++ b/docs/data/charts/tooltip/demos/custom-tooltip-content/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomTooltipContent from './CustomTooltipContent'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomTooltipContent, { ClientProvider }); diff --git a/docs/data/charts/tooltip/CustomTooltipPosition.tsx b/docs/data/charts/tooltip/demos/custom-tooltip-position/CustomTooltipPosition.tsx similarity index 90% rename from docs/data/charts/tooltip/CustomTooltipPosition.tsx rename to docs/data/charts/tooltip/demos/custom-tooltip-position/CustomTooltipPosition.tsx index cff40a95aca5a..8617a4c0f0b04 100644 --- a/docs/data/charts/tooltip/CustomTooltipPosition.tsx +++ b/docs/data/charts/tooltip/demos/custom-tooltip-position/CustomTooltipPosition.tsx @@ -13,12 +13,13 @@ import { ChartsTooltipContainer, ChartsItemTooltipContent, } from '@mui/x-charts/ChartsTooltip'; -import { ItemTooltip } from './ItemTooltip'; -import { ItemTooltipFixedY } from './ItemTooltipFixedY'; -import { ItemTooltipTopElement } from './ItemTooltipTopElement'; -import { dataset, valueFormatter } from '../dataset/weather'; +import { ItemTooltip } from '../../ItemTooltip'; +import { ItemTooltipFixedY } from '../../ItemTooltipFixedY'; +import { ItemTooltipTopElement } from '../../ItemTooltipTopElement'; +import { dataset, valueFormatter } from '../../../dataset/weather'; export default function CustomTooltipPosition() { + // @focus-start @padding 1 const [tooltipType, setTootltipType] = React.useState< 'mouse' | 'fixedY' | 'itemTop' >('itemTop'); @@ -81,4 +82,5 @@ export default function CustomTooltipPosition() {
); + // @focus-end } diff --git a/docs/data/charts/tooltip/demos/custom-tooltip-position/client.ts b/docs/data/charts/tooltip/demos/custom-tooltip-position/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/custom-tooltip-position/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/custom-tooltip-position/index.ts b/docs/data/charts/tooltip/demos/custom-tooltip-position/index.ts new file mode 100644 index 0000000000000..895257dfcdd43 --- /dev/null +++ b/docs/data/charts/tooltip/demos/custom-tooltip-position/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomTooltipPosition from './CustomTooltipPosition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomTooltipPosition, { ClientProvider }); diff --git a/docs/data/charts/tooltip/Formatting.tsx b/docs/data/charts/tooltip/demos/formatting/Formatting.tsx similarity index 98% rename from docs/data/charts/tooltip/Formatting.tsx rename to docs/data/charts/tooltip/demos/formatting/Formatting.tsx index f567618876240..717b28f673cb7 100644 --- a/docs/data/charts/tooltip/Formatting.tsx +++ b/docs/data/charts/tooltip/demos/formatting/Formatting.tsx @@ -81,6 +81,7 @@ const currencyFormatter = new Intl.NumberFormat('en-US', { export default function Formatting() { return ( + // @focus-start @padding 2 (v === null ? '' : currencyFormatter(v)), }))} /> + // @focus-end ); } diff --git a/docs/data/charts/tooltip/demos/formatting/client.ts b/docs/data/charts/tooltip/demos/formatting/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/formatting/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/formatting/index.ts b/docs/data/charts/tooltip/demos/formatting/index.ts new file mode 100644 index 0000000000000..d95e308870100 --- /dev/null +++ b/docs/data/charts/tooltip/demos/formatting/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import Formatting from './Formatting'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, Formatting, { ClientProvider }); diff --git a/docs/data/charts/tooltip/Interaction.tsx b/docs/data/charts/tooltip/demos/interaction/Interaction.tsx similarity index 93% rename from docs/data/charts/tooltip/Interaction.tsx rename to docs/data/charts/tooltip/demos/interaction/Interaction.tsx index c7215bae23f5f..bb0a8639aeed0 100644 --- a/docs/data/charts/tooltip/Interaction.tsx +++ b/docs/data/charts/tooltip/demos/interaction/Interaction.tsx @@ -15,8 +15,10 @@ const barChartsParams = { export default function Interaction() { return ( + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/charts/tooltip/demos/interaction/client.ts b/docs/data/charts/tooltip/demos/interaction/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/interaction/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/interaction/index.ts b/docs/data/charts/tooltip/demos/interaction/index.ts new file mode 100644 index 0000000000000..15047bd70e1ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/interaction/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import Interaction from './Interaction'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, Interaction, { ClientProvider }); diff --git a/docs/data/charts/tooltip/SeriesFormatter.tsx b/docs/data/charts/tooltip/demos/series-formatter/SeriesFormatter.tsx similarity index 84% rename from docs/data/charts/tooltip/SeriesFormatter.tsx rename to docs/data/charts/tooltip/demos/series-formatter/SeriesFormatter.tsx index 78f3dabbada43..e061b3e701d4d 100644 --- a/docs/data/charts/tooltip/SeriesFormatter.tsx +++ b/docs/data/charts/tooltip/demos/series-formatter/SeriesFormatter.tsx @@ -1,4 +1,5 @@ -import { PieChart, PieChartProps } from '@mui/x-charts/PieChart'; +import type { PieChartProps } from '@mui/x-charts/PieChart'; +import { PieChart } from '@mui/x-charts/PieChart'; import { legendClasses } from '@mui/x-charts/ChartsLegend'; const otherProps: Partial = { @@ -21,6 +22,7 @@ const data = [ export default function SeriesFormatter() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/tooltip/demos/series-formatter/client.ts b/docs/data/charts/tooltip/demos/series-formatter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/series-formatter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/series-formatter/index.ts b/docs/data/charts/tooltip/demos/series-formatter/index.ts new file mode 100644 index 0000000000000..00c5c30bc06cf --- /dev/null +++ b/docs/data/charts/tooltip/demos/series-formatter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SeriesFormatter from './SeriesFormatter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SeriesFormatter, { ClientProvider }); diff --git a/docs/data/charts/tooltip/SortDemo.tsx b/docs/data/charts/tooltip/demos/sort-demo/SortDemo.tsx similarity index 97% rename from docs/data/charts/tooltip/SortDemo.tsx rename to docs/data/charts/tooltip/demos/sort-demo/SortDemo.tsx index 64078e0c99a44..9f6b0a69d94f7 100644 --- a/docs/data/charts/tooltip/SortDemo.tsx +++ b/docs/data/charts/tooltip/demos/sort-demo/SortDemo.tsx @@ -15,6 +15,7 @@ function getExample(sort: 'none' | 'asc' | 'desc') { } export default function SortDemo() { + // @focus-start @padding 1 const [sort, setSort] = React.useState<'none' | 'asc' | 'desc'>('none'); return ( @@ -52,4 +53,5 @@ export default function SortDemo() { ); + // @focus-end } diff --git a/docs/data/charts/tooltip/demos/sort-demo/client.ts b/docs/data/charts/tooltip/demos/sort-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/sort-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/sort-demo/index.ts b/docs/data/charts/tooltip/demos/sort-demo/index.ts new file mode 100644 index 0000000000000..0d34bc7dd1586 --- /dev/null +++ b/docs/data/charts/tooltip/demos/sort-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SortDemo from './SortDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SortDemo, { ClientProvider }); diff --git a/docs/data/charts/tooltip/SyncTooltip.tsx b/docs/data/charts/tooltip/demos/sync-tooltip/SyncTooltip.tsx similarity index 87% rename from docs/data/charts/tooltip/SyncTooltip.tsx rename to docs/data/charts/tooltip/demos/sync-tooltip/SyncTooltip.tsx index a4465ea83199d..290a4091f47f9 100644 --- a/docs/data/charts/tooltip/SyncTooltip.tsx +++ b/docs/data/charts/tooltip/demos/sync-tooltip/SyncTooltip.tsx @@ -1,14 +1,17 @@ import * as React from 'react'; import Stack from '@mui/material/Stack'; import { styled } from '@mui/material/styles'; -import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; -import { PieChart, PieChartProps } from '@mui/x-charts/PieChart'; -import { BarItemIdentifier, PieItemIdentifier } from '@mui/x-charts/models'; +import type { BarChartProps } from '@mui/x-charts/BarChart'; +import { BarChart } from '@mui/x-charts/BarChart'; +import type { PieChartProps } from '@mui/x-charts/PieChart'; +import { PieChart } from '@mui/x-charts/PieChart'; +import type { BarItemIdentifier, PieItemIdentifier } from '@mui/x-charts/models'; const CodeBlock = styled('pre')({ minHeight: 125, }); export default function SyncTooltip() { + // @focus-start @padding 1 const [pieTooltipItem, setPieTooltipItem] = React.useState(null); const [barTooltipItem, setBarTooltipItem] = @@ -63,6 +66,7 @@ export default function SyncTooltip() {
); + // @focus-end } const barChartsProps: BarChartProps = { diff --git a/docs/data/charts/tooltip/demos/sync-tooltip/client.ts b/docs/data/charts/tooltip/demos/sync-tooltip/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/sync-tooltip/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/sync-tooltip/index.ts b/docs/data/charts/tooltip/demos/sync-tooltip/index.ts new file mode 100644 index 0000000000000..1cdb55e648b08 --- /dev/null +++ b/docs/data/charts/tooltip/demos/sync-tooltip/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SyncTooltip from './SyncTooltip'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SyncTooltip, { ClientProvider }); diff --git a/docs/data/charts/tooltip/SynchronizedTooltip.tsx b/docs/data/charts/tooltip/demos/synchronized-tooltip/SynchronizedTooltip.tsx similarity index 95% rename from docs/data/charts/tooltip/SynchronizedTooltip.tsx rename to docs/data/charts/tooltip/demos/synchronized-tooltip/SynchronizedTooltip.tsx index f92a9275e6e72..e2816d154274b 100644 --- a/docs/data/charts/tooltip/SynchronizedTooltip.tsx +++ b/docs/data/charts/tooltip/demos/synchronized-tooltip/SynchronizedTooltip.tsx @@ -1,11 +1,12 @@ import * as React from 'react'; import NoSsr from '@mui/material/NoSsr'; import Paper from '@mui/material/Paper'; -import Popper, { PopperProps } from '@mui/material/Popper'; +import type { PopperProps } from '@mui/material/Popper'; +import Popper from '@mui/material/Popper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { LineChart } from '@mui/x-charts/LineChart'; -import { AxisItemIdentifier } from '@mui/x-charts/models'; +import type { AxisItemIdentifier } from '@mui/x-charts/models'; const X_AXIS_ID = 'shared-x'; @@ -50,6 +51,7 @@ const charts = [ export default function SynchronizedTooltip() { // Shared between every chart. `[]` when no chart is hovered. + // @focus-start @padding 1 const [highlightedAxis, setHighlightedAxis] = React.useState( [], ); @@ -165,6 +167,7 @@ export default function SynchronizedTooltip() {
); + // @focus-end } const popperModifiers = [ diff --git a/docs/data/charts/tooltip/demos/synchronized-tooltip/client.ts b/docs/data/charts/tooltip/demos/synchronized-tooltip/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/synchronized-tooltip/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/synchronized-tooltip/index.ts b/docs/data/charts/tooltip/demos/synchronized-tooltip/index.ts new file mode 100644 index 0000000000000..27cbd42704707 --- /dev/null +++ b/docs/data/charts/tooltip/demos/synchronized-tooltip/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SynchronizedTooltip from './SynchronizedTooltip'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SynchronizedTooltip, { ClientProvider }); diff --git a/docs/data/charts/tooltip/TooltipPosition.tsx b/docs/data/charts/tooltip/demos/tooltip-position/TooltipPosition.tsx similarity index 94% rename from docs/data/charts/tooltip/TooltipPosition.tsx rename to docs/data/charts/tooltip/demos/tooltip-position/TooltipPosition.tsx index c217c7d6c642a..7292b27ccb5b8 100644 --- a/docs/data/charts/tooltip/TooltipPosition.tsx +++ b/docs/data/charts/tooltip/demos/tooltip-position/TooltipPosition.tsx @@ -2,8 +2,8 @@ import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; import { BarChart } from '@mui/x-charts/BarChart'; -import { AxisValueFormatterContext } from '@mui/x-charts/models'; -import { dataset, valueFormatter } from '../dataset/weather'; +import type { AxisValueFormatterContext } from '@mui/x-charts/models'; +import { dataset, valueFormatter } from '../../../dataset/weather'; const chartSetting = { height: 300, @@ -11,6 +11,7 @@ const chartSetting = { export default function TooltipPosition() { return ( + // @focus-start @padding 2 `} /> + // @focus-end ); } diff --git a/docs/data/charts/tooltip/demos/tooltip-position/client.ts b/docs/data/charts/tooltip/demos/tooltip-position/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/tooltip-position/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/tooltip-position/index.ts b/docs/data/charts/tooltip/demos/tooltip-position/index.ts new file mode 100644 index 0000000000000..7777e27d00bfa --- /dev/null +++ b/docs/data/charts/tooltip/demos/tooltip-position/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TooltipPosition from './TooltipPosition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TooltipPosition, { ClientProvider }); diff --git a/docs/data/charts/tooltip/TooltipStyle.tsx b/docs/data/charts/tooltip/demos/tooltip-style/TooltipStyle.tsx similarity index 91% rename from docs/data/charts/tooltip/TooltipStyle.tsx rename to docs/data/charts/tooltip/demos/tooltip-style/TooltipStyle.tsx index 6c86b0ba241a6..9e878b16b9467 100644 --- a/docs/data/charts/tooltip/TooltipStyle.tsx +++ b/docs/data/charts/tooltip/demos/tooltip-style/TooltipStyle.tsx @@ -10,6 +10,7 @@ const params = { export default function TooltipStyle() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/tooltip/demos/tooltip-style/client.ts b/docs/data/charts/tooltip/demos/tooltip-style/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/tooltip/demos/tooltip-style/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/tooltip/demos/tooltip-style/index.ts b/docs/data/charts/tooltip/demos/tooltip-style/index.ts new file mode 100644 index 0000000000000..a5efd01280e2e --- /dev/null +++ b/docs/data/charts/tooltip/demos/tooltip-style/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TooltipStyle from './TooltipStyle'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TooltipStyle, { ClientProvider }); diff --git a/docs/data/charts/tooltip/tooltip.md b/docs/data/charts/tooltip/tooltip.md index c7063c9c03b4a..cc966bfc84d7b 100644 --- a/docs/data/charts/tooltip/tooltip.md +++ b/docs/data/charts/tooltip/tooltip.md @@ -22,7 +22,7 @@ You can trigger the tooltip with two kinds of events: To pass this trigger attribute to the tooltip, use `slotProps.tooltip.trigger`. -{{"demo": "Interaction.js"}} +{{"component": "file://./demos/interaction/index.ts"}} ## Formatting @@ -34,7 +34,7 @@ The demo below shows: - Time axis values formatted to show only the year - Series values formatted in US dollars -{{"demo": "Formatting.js"}} +{{"component": "file://./demos/formatting/index.ts"}} ### Advanced formatting @@ -42,7 +42,7 @@ The series `valueFormatter` function receives a context as its second argument c The demo below uses `dataIndex` to add each team's rank in the tooltip. -{{"demo": "SeriesFormatter.js"}} +{{"component": "file://./demos/series-formatter/index.ts"}} ### Axis formatter @@ -55,7 +55,7 @@ In this demo, you can see: - The country axis displays only the country code - The label displays annotated data: `Country: name (code)` -{{"demo": "AxisFormatter.js"}} +{{"component": "file://./demos/axis-formatter/index.ts"}} ### Label formatting @@ -109,7 +109,7 @@ This prop accepts the following values: Regardless of the `sort` prop being `'asc'` or `'desc'`, series whose value is `null` are always sorted last. -{{"demo": "SortDemo.js"}} +{{"component": "file://./demos/sort-demo/index.ts"}} ## Position @@ -128,7 +128,7 @@ For example, setting `anchor: 'node'`, `position: 'bottom'`, and `placement: 'to You can pass these props to the tooltip using `slotProps.tooltip`, or directly to either `ChartsTooltip` or `ChartsTooltipContainer` if you're composing a custom component. -{{"demo": "TooltipPosition.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/tooltip-position/index.ts", "hideToolbar": true, "bg": "playground"}} ## Portaling the tooltip @@ -165,7 +165,7 @@ import { chartsTooltipClasses } from '@mui/x-charts'; You can also use the `sx` prop of the tooltip itself via `slotProps.tooltip`. -{{"demo": "TooltipStyle.js"}} +{{"component": "file://./demos/tooltip-style/index.ts"}} ## Using a custom tooltip @@ -196,13 +196,13 @@ Make sure the tooltip `trigger` is set to `"item"`. Otherwise no tooltip will be shown. ::: -{{"demo": "ControlledTooltip.js"}} +{{"component": "file://./demos/controlled-tooltip/index.ts"}} ### Synchronizing item tooltip The item tooltip control can be used to sync tooltips between multiple charts. -{{"demo": "SyncTooltip.js"}} +{{"component": "file://./demos/sync-tooltip/index.ts"}} ## Controlling the axis tooltip @@ -216,7 +216,7 @@ Make sure the tooltip `trigger` is set to `"axis"`. Otherwise no tooltip will be shown. ::: -{{"demo": "ControlledAxisTooltip.js"}} +{{"component": "file://./demos/controlled-axis-tooltip/index.ts"}} ### Synchronizing tooltips across charts @@ -225,7 +225,7 @@ To compare values at the same position across stacked charts, share the highligh Each chart receives the same `highlightedAxis` state and updates it with `onHighlightedAxisChange`, so hovering one chart moves the crosshair on every chart. The built-in tooltip is turned off with `slotProps={{ tooltip: { trigger: 'none' } }}`, and one tooltip reads the value of every chart at the shared `dataIndex`. -{{"demo": "SynchronizedTooltip.js"}} +{{"component": "file://./demos/synchronized-tooltip/index.ts"}} ## Creating a tooltip @@ -263,7 +263,7 @@ Then you can either render built-in content (with `ChartsItemTooltipContent` or The demo below shows how to use additional hooks such as `useXAxis()` and `useDrawingArea()` to customize the tooltip position. -{{"demo": "CustomTooltipPosition.js"}} +{{"component": "file://./demos/custom-tooltip-position/index.ts"}} #### Modifying the content @@ -279,7 +279,7 @@ It contains: - `color`: The color used to display the item, which includes the impact of [`colorMap`](/x/react-charts/styling/#value-based-colors) - `label`, `value`, `formattedValue`: Values computed to simplify tooltip creation -{{"demo": "CustomTooltipContent.js"}} +{{"component": "file://./demos/custom-tooltip-content/index.ts"}} #### Axis content @@ -290,4 +290,4 @@ For each axis, it contains: - `color`: The color used to display the item, which includes the impact of [`colorMap`](/x/react-charts/styling/#value-based-colors) - `label`, `value`, `formattedValue`: Values computed to simplify tooltip creation -{{"demo": "CustomAxisTooltipContent.js"}} +{{"component": "file://./demos/custom-axis-tooltip-content/index.ts"}} diff --git a/docs/data/charts/zoom-and-pan/BrushZoom.js b/docs/data/charts/zoom-and-pan/BrushZoom.js deleted file mode 100644 index 889b9f5889b43..0000000000000 --- a/docs/data/charts/zoom-and-pan/BrushZoom.js +++ /dev/null @@ -1,54 +0,0 @@ -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; - -export default function BrushZoom() { - return ( - - - Click and drag on the chart to select an area to zoom into. Double-tap to - reset the zoom. - - - - ); -} - -const xData = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec', -]; - -const yData = [2, 5.5, 9, 13.5, 18, 21, 23.5, 23, 20, 15, 9, 4]; diff --git a/docs/data/charts/zoom-and-pan/ExternalZoomManagement.js b/docs/data/charts/zoom-and-pan/ExternalZoomManagement.js deleted file mode 100644 index 34015b923e402..0000000000000 --- a/docs/data/charts/zoom-and-pan/ExternalZoomManagement.js +++ /dev/null @@ -1,67 +0,0 @@ -import * as React from 'react'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import Button from '@mui/material/Button'; -import Stack from '@mui/material/Stack'; - -import { useChartProApiRef } from '@mui/x-charts-pro/hooks'; -import { randomData } from './randomData'; - -const initialZoomData = [ - { - axisId: 'my-x-axis', - start: 20, - end: 40, - }, -]; - -export default function ExternalZoomManagement() { - const apiRef = useChartProApiRef(); - const [zoomData, setZoomData] = React.useState(initialZoomData); - - return ( - - i), - }, - ]} - /> -
{JSON.stringify(zoomData, null, 2)}
-
- -
-
- ); -} - -const chartProps = { - height: 300, - sx: { width: '100%' }, - series: [ - { - label: 'Series A', - data: randomData.map((v) => v.y1), - }, - { - label: 'Series B', - data: randomData.map((v) => v.y2), - }, - ], -}; diff --git a/docs/data/charts/zoom-and-pan/ZoomAndPanInteractions.js b/docs/data/charts/zoom-and-pan/ZoomAndPanInteractions.js deleted file mode 100644 index 56c14dd7be037..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomAndPanInteractions.js +++ /dev/null @@ -1,220 +0,0 @@ -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; - -const knobs = { - // Zoom interactions - zoom: { - knob: 'title', - displayName: 'Zoom interactions', - }, - wheel: { - displayName: 'Wheel', - knob: 'switch', - defaultValue: true, - }, - pinch: { - displayName: 'Pinch', - knob: 'switch', - defaultValue: true, - }, - tapAndDrag: { - displayName: 'Tap and drag', - knob: 'switch', - defaultValue: false, - }, - brush: { - displayName: 'Brush', - knob: 'switch', - defaultValue: false, - }, - doubleTapReset: { - displayName: 'Double tap reset', - knob: 'switch', - defaultValue: false, - }, - // Pan interactions - pan: { - knob: 'title', - displayName: 'Pan interactions', - }, - drag: { - displayName: 'Drag', - knob: 'switch', - defaultValue: true, - }, - pressAndDrag: { - displayName: 'Press and drag', - knob: 'switch', - defaultValue: false, - }, - wheelPan: { - displayName: 'Pan on wheel', - knob: 'switch', - defaultValue: true, - }, -}; - -export default function ZoomAndPanInteractions() { - return ( - { - // Build zoom interactions array - const zoomInteractions = []; - if (props.wheel) { - zoomInteractions.push('wheel'); - } - if (props.pinch) { - zoomInteractions.push('pinch'); - } - if (props.tapAndDrag) { - zoomInteractions.push('tapAndDrag'); - } - if (props.brush) { - zoomInteractions.push('brush'); - } - if (props.doubleTapReset) { - zoomInteractions.push('doubleTapReset'); - } - - // Build pan interactions array - const panInteractions = []; - if (props.drag) { - panInteractions.push('drag'); - } - if (props.pressAndDrag) { - panInteractions.push('pressAndDrag'); - } - if (props.wheelPan) { - panInteractions.push('wheel'); - } - - const zoomInteractionConfig = { - zoom: zoomInteractions, - pan: panInteractions, - }; - - return ( -
- i), - zoom: true, - }, - ]} - yAxis={[ - { - zoom: true, - width: 40, - }, - ]} - series={series} - zoomInteractionConfig={zoomInteractionConfig} - /> -
- ); - }} - getCode={({ props }) => { - // Build zoom interactions array for code generation - const zoomInteractions = []; - if (props.wheel) { - zoomInteractions.push('wheel'); - } - if (props.pinch) { - zoomInteractions.push('pinch'); - } - if (props.tapAndDrag) { - zoomInteractions.push('tapAndDrag'); - } - if (props.brush) { - zoomInteractions.push('brush'); - } - if (props.doubleTapReset) { - zoomInteractions.push('doubleTapReset'); - } - - // Build pan interactions array - const panInteractions = []; - if (props.drag) { - panInteractions.push('drag'); - } - if (props.pressAndDrag) { - panInteractions.push('pressAndDrag'); - } - if (props.wheelPan) { - panInteractions.push('wheel'); - } - - const zoomConfig = - zoomInteractions.length > 0 - ? `["${zoomInteractions.join('", "')}"]` - : '[]'; - const panConfig = - panInteractions.length > 0 ? `["${panInteractions.join('", "')}"]` : '[]'; - - return `import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; - -`; - }} - /> - ); -} - -const data = [ - { - x: 443, - y: 153, - }, - { - x: 110, - y: 217, - }, - { - x: 175, - y: 286, - }, - { - x: 195, - y: 325, - }, - { - x: 351, - y: 144, - }, - { - x: 43, - y: 146, - }, - { - x: 376, - y: 309, - }, - { - x: 31, - y: 236, - }, - { - x: 231, - y: 440, - }, - { - x: 108, - y: 20, - }, -]; - -const series = [ - { - label: 'Series A', - data, - }, -]; diff --git a/docs/data/charts/zoom-and-pan/ZoomBarChart.js b/docs/data/charts/zoom-and-pan/ZoomBarChart.js deleted file mode 100644 index 16f1b268ee852..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomBarChart.js +++ /dev/null @@ -1,117 +0,0 @@ -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; - -export default function ZoomBarChart() { - return ( - i), zoom: true }]} - series={series} - /> - ); -} - -const data = [ - { - y1: 443.28, - y2: 153.9, - }, - { - y1: 110.5, - y2: 217.8, - }, - { - y1: 175.23, - y2: 286.32, - }, - { - y1: 195.97, - y2: 325.12, - }, - { - y1: 351.77, - y2: 144.58, - }, - { - y1: 43.253, - y2: 146.51, - }, - { - y1: 376.34, - y2: 309.69, - }, - { - y1: 31.514, - y2: 236.38, - }, - { - y1: 231.31, - y2: 440.72, - }, - { - y1: 108.04, - y2: 20.29, - }, - { - y1: 321.77, - y2: 484.17, - }, - { - y1: 120.18, - y2: 54.962, - }, - { - y1: 366.2, - y2: 418.5, - }, - { - y1: 451.45, - y2: 181.32, - }, - { - y1: 294.8, - y2: 440.9, - }, - { - y1: 121.83, - y2: 273.52, - }, - { - y1: 287.7, - y2: 346.7, - }, - { - y1: 134.06, - y2: 74.528, - }, - { - y1: 104.5, - y2: 150.9, - }, - { - y1: 413.07, - y2: 26.483, - }, - { - y1: 74.68, - y2: 333.2, - }, - { - y1: 360.6, - y2: 422.0, - }, - { - y1: 330.72, - y2: 488.06, - }, -]; - -const series = [ - { - label: 'Series A', - data: data.map((v) => v.y1), - }, - { - label: 'Series B', - data: data.map((v) => v.y2), - }, -]; diff --git a/docs/data/charts/zoom-and-pan/ZoomBarChart.tsx.preview b/docs/data/charts/zoom-and-pan/ZoomBarChart.tsx.preview deleted file mode 100644 index e30c5fb898652..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomBarChart.tsx.preview +++ /dev/null @@ -1,5 +0,0 @@ - i), zoom: true }]} - series={series} -/> \ No newline at end of file diff --git a/docs/data/charts/zoom-and-pan/ZoomControlled.js b/docs/data/charts/zoom-and-pan/ZoomControlled.js deleted file mode 100644 index 7097bc9558529..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomControlled.js +++ /dev/null @@ -1,79 +0,0 @@ -import * as React from 'react'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import Button from '@mui/material/Button'; -import Stack from '@mui/material/Stack'; - -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { randomData } from './randomData'; - -const lineAxis = [ - { - zoom: true, - scaleType: 'point', - id: 'shared-x-axis', - data: randomData.map((v, i) => i), - }, -]; - -const barAxis = [ - { - zoom: true, - id: 'shared-x-axis', - data: randomData.map((v, i) => i), - }, -]; - -const initialZoomData = [ - { - axisId: 'shared-x-axis', - start: 20, - end: 40, - }, -]; - -export default function ZoomControlled() { - const [zoomData, setZoomData] = React.useState(initialZoomData); - - return ( - - - -
{JSON.stringify(zoomData, null, 2)}
-
- -
-
- ); -} - -const chartProps = { - height: 300, - sx: { width: '100%' }, - series: [ - { - label: 'Series A', - data: randomData.map((v) => v.y1), - }, - { - label: 'Series B', - data: randomData.map((v) => v.y2), - }, - ], -}; diff --git a/docs/data/charts/zoom-and-pan/ZoomFilterMode.js b/docs/data/charts/zoom-and-pan/ZoomFilterMode.js deleted file mode 100644 index a0395292463e9..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomFilterMode.js +++ /dev/null @@ -1,19 +0,0 @@ -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { dataset, valueFormatter } from './letterFrequency'; - -export default function ZoomFilterMode() { - return ( - - ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomFilterMode.tsx.preview b/docs/data/charts/zoom-and-pan/ZoomFilterMode.tsx.preview deleted file mode 100644 index 6a8adcf1ca747..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomFilterMode.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/zoom-and-pan/ZoomHeatmap.js b/docs/data/charts/zoom-and-pan/ZoomHeatmap.js deleted file mode 100644 index dc9b884805091..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomHeatmap.js +++ /dev/null @@ -1,142 +0,0 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { Heatmap } from '@mui/x-charts-pro/Heatmap'; - -import { useTheme } from '@mui/system'; -import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; -import data from '../dataset/muiXCommits2024.json'; - -const seriesData = []; - -let maxContributions = 0; - -const firstWeekDay = new Date('2023-12-31').getTime(); -for (const datum of data) { - const date = new Date(datum.date); - const weekNumber = Math.floor( - (date.getTime() - firstWeekDay) / (7 * 24 * 60 * 60 * 1000), - ); - const weekDay = date.getDay(); - const value = datum.count; - seriesData.push([weekNumber, weekDay, value]); - - maxContributions = Math.max(maxContributions, value); -} - -const weeks = Array.from({ length: 53 }).map( - (_, i) => new Date(2023, 11, 31 + i * 7), -); -const weekDays = Array.from({ length: 7 }).map((_, i) => i); - -const darkThemeColors = ['#151b23', '#033a16', '#196c2e', '#2ea043', '#56d364']; -const lightThemeColors = ['#eff2f5', '#aceebb', '#4ac26b', '#2da44e', '#116329']; - -const xAxis = { - data: weeks, - valueFormatter: (date) => { - if (date.getDate() < 8) { - return date.toLocaleString('en-US', { month: 'short' }); - } - - return ''; - }, - tickSize: 0, - ordinalTimeTicks: ['months', 'weeks'], - position: 'top', - disableLine: true, - categoryGapRatio: 0.1, -}; - -const yAxis = { - data: weekDays, - tickSize: 0, - valueFormatter: formatWeekDay, - disableLine: true, - categoryGapRatio: 0.1, -}; - -export default function ZoomHeatmap() { - const theme = useTheme(); - - return ( - - - Daily Commit Count to MUI X Repo (2024) - - v * maxContributions), - colors: - theme.palette.mode === 'light' ? lightThemeColors : darkThemeColors, - }, - }, - ]} - series={[{ data: seriesData }]} - borderRadius={4} - slots={{ tooltip: Tooltip }} - /> - Source: GitHub - - ); -} - -const formattedWeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; - -function formatWeekDay(value, context) { - if (context.location === 'tick') { - switch (value) { - case 1: - case 3: - case 5: - return formattedWeekDays[value]; - default: - return ''; - } - } - - return formattedWeekDays[value]; -} - -function Tooltip() { - return ( - - - - ); -} - -function TooltipContent() { - const tooltipData = useItemTooltip(); - - if (!tooltipData) { - return null; - } - - const { identifier, value } = tooltipData; - - const date = new Date(2023, 11, 31 + identifier.xIndex * 7 + identifier.yIndex); - - return ( - ({ - background: theme.palette.background.paper, - borderRadius: 2, - paddingX: 1, - paddingY: 0.5, - })} - > - - {value} contribution{value === 1 ? '' : 's'} on{' '} - {date.toLocaleString('en-US', { month: 'long', day: 'numeric' })} - - - ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomInitialRange.js b/docs/data/charts/zoom-and-pan/ZoomInitialRange.js deleted file mode 100644 index 7bffe39c374f3..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomInitialRange.js +++ /dev/null @@ -1,153 +0,0 @@ -import * as React from 'react'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; - -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import Stack from '@mui/material/Stack'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; - -// Time axis: calendar intervals, an absolute date range, a function, or a reset. -const linePresets = [ - { - label: '5Y', - code: "{ unit: 'year', step: 5 }", - value: { unit: 'year', step: 5 }, - }, - { - label: '10Y', - code: "{ unit: 'year', step: 10 }", - value: { unit: 'year', step: 10 }, - }, - { - label: '2000s', - code: '[new Date(2000, 0, 1), new Date(2010, 0, 1)]', - value: [new Date(2000, 0, 1), new Date(2010, 0, 1)], - }, - { - label: 'First half', - code: '() => ({ start: 0, end: 50 })', - value: () => ({ start: 0, end: 50 }), - }, - { label: 'All', code: 'null', value: null }, -]; - -// Band axis: a range expressed with the axis values themselves, or a reset. -const barPresets = [ - { label: 'H1', code: "['Jan', 'Jun']", value: ['Jan', 'Jun'] }, - { label: 'H2', code: "['Jul', 'Dec']", value: ['Jul', 'Dec'] }, - { label: 'Spring–Summer', code: "['Mar', 'Aug']", value: ['Mar', 'Aug'] }, - { label: 'All', code: 'null', value: null }, -]; - -const months = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec', -]; - -const sales = [42, 38, 55, 61, 73, 88, 95, 91, 70, 58, 49, 44]; - -export default function ZoomInitialRange() { - const [chartType, setChartType] = React.useState('line'); - const [label, setLabel] = React.useState('10Y'); - - const presets = chartType === 'line' ? linePresets : barPresets; - const preset = presets.find((item) => item.label === label) ?? presets[0]; - - const handleChartType = (_event, nextType) => { - if (nextType === null) { - return; - } - setChartType(nextType); - // Switch to a preset that exists for the newly selected chart. - setLabel((nextType === 'line' ? linePresets : barPresets)[1].label); - }; - - const initialZoom = [{ axisId: 'x', value: preset.value }]; - - return ( - - - - Line - Bar - - setLabel(event.target.value)} - sx={{ minWidth: 180 }} - > - {presets.map((item) => ( - - {item.label} - - ))} - - - - {chartType === 'line' ? ( - `$${(value / 1000).toFixed(0)}k`, - }, - ]} - series={[ - { dataKey: 'fr', label: 'France' }, - { dataKey: 'gb', label: 'UK' }, - { dataKey: 'dl', label: 'Germany' }, - ]} - height={300} - initialZoom={initialZoom} - /> - ) : ( - - )} - - ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomKeyboard.js b/docs/data/charts/zoom-and-pan/ZoomKeyboard.js deleted file mode 100644 index 0b962b76c8034..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomKeyboard.js +++ /dev/null @@ -1,24 +0,0 @@ -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { randomData } from './randomData'; - -export default function ZoomKeyboard() { - return ( - i), zoom: true }]} - yAxis={[{ zoom: true, width: 50 }]} - series={series} - /> - ); -} - -const series = [ - { - label: 'Series A', - data: randomData.map((v) => v.y1), - }, - { - label: 'Series B', - data: randomData.map((v) => v.y2), - }, -]; diff --git a/docs/data/charts/zoom-and-pan/ZoomKeyboard.tsx.preview b/docs/data/charts/zoom-and-pan/ZoomKeyboard.tsx.preview deleted file mode 100644 index e918cf967a0de..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomKeyboard.tsx.preview +++ /dev/null @@ -1,6 +0,0 @@ - i), zoom: true }]} - yAxis={[{ zoom: true, width: 50 }]} - series={series} -/> \ No newline at end of file diff --git a/docs/data/charts/zoom-and-pan/ZoomLineChart.js b/docs/data/charts/zoom-and-pan/ZoomLineChart.js deleted file mode 100644 index 421253ac27a28..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomLineChart.js +++ /dev/null @@ -1,123 +0,0 @@ -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; - -export default function ZoomLineChart() { - return ( - i), - }, - ]} - series={series} - /> - ); -} - -const data = [ - { - y1: 443.28, - y2: 153.9, - }, - { - y1: 110.5, - y2: 217.8, - }, - { - y1: 175.23, - y2: 286.32, - }, - { - y1: 195.97, - y2: 325.12, - }, - { - y1: 351.77, - y2: 144.58, - }, - { - y1: 43.253, - y2: 146.51, - }, - { - y1: 376.34, - y2: 309.69, - }, - { - y1: 31.514, - y2: 236.38, - }, - { - y1: 231.31, - y2: 440.72, - }, - { - y1: 108.04, - y2: 20.29, - }, - { - y1: 321.77, - y2: 484.17, - }, - { - y1: 120.18, - y2: 54.962, - }, - { - y1: 366.2, - y2: 418.5, - }, - { - y1: 451.45, - y2: 181.32, - }, - { - y1: 294.8, - y2: 440.9, - }, - { - y1: 121.83, - y2: 273.52, - }, - { - y1: 287.7, - y2: 346.7, - }, - { - y1: 134.06, - y2: 74.528, - }, - { - y1: 104.5, - y2: 150.9, - }, - { - y1: 413.07, - y2: 26.483, - }, - { - y1: 74.68, - y2: 333.2, - }, - { - y1: 360.6, - y2: 422.0, - }, - { - y1: 330.72, - y2: 488.06, - }, -]; - -const series = [ - { - label: 'Series A', - data: data.map((v) => v.y1), - }, - { - label: 'Series B', - data: data.map((v) => v.y2), - }, -]; diff --git a/docs/data/charts/zoom-and-pan/ZoomLineChart.tsx.preview b/docs/data/charts/zoom-and-pan/ZoomLineChart.tsx.preview deleted file mode 100644 index c1d5d38fb2776..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomLineChart.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - i), - }, - ]} - series={series} -/> \ No newline at end of file diff --git a/docs/data/charts/zoom-and-pan/ZoomOptions.js b/docs/data/charts/zoom-and-pan/ZoomOptions.js deleted file mode 100644 index 46b550a9f7057..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomOptions.js +++ /dev/null @@ -1,141 +0,0 @@ -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import ChartsUsageDemo from 'docs/src/modules/components/ChartsUsageDemo'; - -const knobs = { - panning: { - knob: 'switch', - defaultValue: true, - }, - minStart: { - knob: 'number', - defaultValue: 0, - step: 1, - min: 0, - max: 50, - }, - maxEnd: { - knob: 'number', - defaultValue: 100, - step: 1, - min: 50, - max: 100, - }, - minSpan: { - knob: 'number', - defaultValue: 10, - step: 1, - min: 0, - max: 100, - }, - maxSpan: { - knob: 'number', - defaultValue: 100, - step: 1, - min: 0, - max: 100, - }, - step: { - knob: 'number', - defaultValue: 5, - step: 1, - min: 1, - max: 100, - }, -}; - -export default function ZoomOptions() { - return ( - ( -
- i), - zoom: props, - }, - ]} - series={series} - /> -
- )} - getCode={({ props }) => { - return `import { BarChart } from '@mui/x-charts/BarChart'; - -`; - }} - /> - ); -} - -const data = [ - { - y1: 443.28, - y2: 153.9, - }, - { - y1: 110.5, - y2: 217.8, - }, - { - y1: 175.23, - y2: 286.32, - }, - { - y1: 195.97, - y2: 325.12, - }, - { - y1: 351.77, - y2: 144.58, - }, - { - y1: 43.253, - y2: 146.51, - }, - { - y1: 376.34, - y2: 309.69, - }, - { - y1: 31.514, - y2: 236.38, - }, - { - y1: 231.31, - y2: 440.72, - }, - { - y1: 108.04, - y2: 20.29, - }, -]; - -const series = [ - { - label: 'Series A', - data: data.map((v) => v.y1), - }, - { - label: 'Series B', - data: data.map((v) => v.y2), - }, -]; diff --git a/docs/data/charts/zoom-and-pan/ZoomScatterChart.js b/docs/data/charts/zoom-and-pan/ZoomScatterChart.js deleted file mode 100644 index 7442ec5ef66de..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomScatterChart.js +++ /dev/null @@ -1,195 +0,0 @@ -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; - -export default function ZoomScatterChart() { - return ( - - ); -} - -const data = [ - { - id: 'data-0', - x1: 329.39, - x2: 391.29, - y1: 443.28, - y2: 153.9, - }, - { - id: 'data-1', - x1: 96.94, - x2: 139.6, - y1: 110.5, - y2: 217.8, - }, - { - id: 'data-2', - x1: 336.35, - x2: 282.34, - y1: 175.23, - y2: 286.32, - }, - { - id: 'data-3', - x1: 159.44, - x2: 384.85, - y1: 195.97, - y2: 325.12, - }, - { - id: 'data-4', - x1: 188.86, - x2: 182.27, - y1: 351.77, - y2: 144.58, - }, - { - id: 'data-5', - x1: 143.86, - x2: 360.22, - y1: 43.253, - y2: 146.51, - }, - { - id: 'data-6', - x1: 202.02, - x2: 209.5, - y1: 376.34, - y2: 309.69, - }, - { - id: 'data-7', - x1: 384.41, - x2: 258.93, - y1: 31.514, - y2: 236.38, - }, - { - id: 'data-8', - x1: 256.76, - x2: 70.571, - y1: 231.31, - y2: 440.72, - }, - { - id: 'data-9', - x1: 143.79, - x2: 419.02, - y1: 108.04, - y2: 20.29, - }, - { - id: 'data-10', - x1: 103.48, - x2: 15.886, - y1: 321.77, - y2: 484.17, - }, - { - id: 'data-11', - x1: 272.39, - x2: 189.03, - y1: 120.18, - y2: 54.962, - }, - { - id: 'data-12', - x1: 23.57, - x2: 456.4, - y1: 366.2, - y2: 418.5, - }, - { - id: 'data-13', - x1: 219.73, - x2: 235.96, - y1: 451.45, - y2: 181.32, - }, - { - id: 'data-14', - x1: 54.99, - x2: 434.5, - y1: 294.8, - y2: 440.9, - }, - { - id: 'data-15', - x1: 134.13, - x2: 383.8, - y1: 121.83, - y2: 273.52, - }, - { - id: 'data-16', - x1: 12.7, - x2: 270.8, - y1: 287.7, - y2: 346.7, - }, - { - id: 'data-17', - x1: 176.51, - x2: 119.17, - y1: 134.06, - y2: 74.528, - }, - { - id: 'data-18', - x1: 65.05, - x2: 78.93, - y1: 104.5, - y2: 150.9, - }, - { - id: 'data-19', - x1: 162.25, - x2: 63.707, - y1: 413.07, - y2: 26.483, - }, - { - id: 'data-20', - x1: 68.88, - x2: 150.8, - y1: 74.68, - y2: 333.2, - }, - { - id: 'data-21', - x1: 95.29, - x2: 329.1, - y1: 360.6, - y2: 422.0, - }, - { - id: 'data-22', - x1: 390.62, - x2: 10.01, - y1: 330.72, - y2: 488.06, - }, -]; - -const series = [ - { - label: 'Series A', - data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), - }, - { - label: 'Series B', - data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), - }, -]; diff --git a/docs/data/charts/zoom-and-pan/ZoomScatterChart.tsx.preview b/docs/data/charts/zoom-and-pan/ZoomScatterChart.tsx.preview deleted file mode 100644 index 81bed7a56087e..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomScatterChart.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/charts/zoom-and-pan/ZoomSlider.js b/docs/data/charts/zoom-and-pan/ZoomSlider.js deleted file mode 100644 index b66b5051a0950..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomSlider.js +++ /dev/null @@ -1,59 +0,0 @@ -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; - -const dataLength = 801; -const data = Array.from({ length: dataLength }).map((_, i) => ({ - x: i, - y: 50 + Math.sin(i / 5) * 25, -})); -const series2Data = Array.from({ length: dataLength }).map((_, i) => ({ - x: i, - y: 50 + Math.sin(i / 10) * 25, -})); - -const xData = data.map((d) => d.x); - -export default function ZoomSlider() { - return ( - v.toLocaleString('en-US'), - }, - { - id: 'x2', - data: series2Data.map((d) => d.x), - position: 'top', - zoom: { - slider: { enabled: true }, - }, - }, - ]} - yAxis={[ - { id: 'y', width: 28, zoom: { slider: { enabled: true } } }, - { - id: 'y2', - position: 'right', - width: 28, - zoom: { slider: { enabled: true } }, - }, - ]} - series={[{ data }, { data: series2Data, xAxisId: 'x2', yAxisId: 'y2' }]} - height={400} - margin={{ bottom: 40 }} - initialZoom={[ - { axisId: 'x', start: 45, end: 55 }, - { axisId: 'x2', start: 30, end: 70 }, - { axisId: 'y', start: 40, end: 60 }, - { axisId: 'y2', start: 30, end: 70 }, - ]} - /> - ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderComposition.js b/docs/data/charts/zoom-and-pan/ZoomSliderComposition.js deleted file mode 100644 index 7ebc8be22e4b3..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomSliderComposition.js +++ /dev/null @@ -1,49 +0,0 @@ -import * as React from 'react'; -import { BarPlot } from '@mui/x-charts/BarChart'; -import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; -import { LinePlot } from '@mui/x-charts/LineChart'; -import { ChartsContainerPro } from '@mui/x-charts-pro/ChartsContainerPro'; -import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; -import { ChartsZoomSlider } from '@mui/x-charts-pro/ChartsZoomSlider'; -import { Chance } from 'chance'; - -const chance = new Chance(42); - -const xAxisData = Array.from({ length: 26 }, (_, i) => String.fromCharCode(65 + i)); -const firstSeriesData = Array.from({ length: 26 }, () => - chance.integer({ min: 0, max: 10 }), -); -const secondSeriesData = Array.from({ length: 26 }, () => - chance.integer({ min: 0, max: 10 }), -); - -export default function ZoomSliderComposition() { - const clipPathId = React.useId(); - - return ( - - - - - - - - - - ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderPreview.js b/docs/data/charts/zoom-and-pan/ZoomSliderPreview.js deleted file mode 100644 index 2ceac7eb4989c..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomSliderPreview.js +++ /dev/null @@ -1,330 +0,0 @@ -import * as React from 'react'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; - -import Typography from '@mui/material/Typography'; -import Stack from '@mui/material/Stack'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; -import { CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; - -import { - dateAxisFormatter, - usUnemploymentRate, -} from '../dataset/usUnemploymentRate'; -import { globalCo2GdpPopulation } from '../dataset/globalCo2GdpPopulation'; -import { globalBirthPerWoman } from '../dataset/globalBirthsPerWoman'; -import { - continents, - countriesInContinent, - countryData, -} from '../dataset/countryData'; -import { shareOfRenewables } from '../dataset/shareOfRenewables'; -import { populationPrediction2050 } from '../dataset/populationPrediction2050'; -import { temperatureBerlinPorto } from '../dataset/temperatureBerlinPorto'; -import sp500 from '../dataset/sp500-intraday.json'; - -const lineData = usUnemploymentRate.map((d) => d.rate / 100); - -const percentageFormatter = new Intl.NumberFormat(undefined, { - style: 'percent', - minimumSignificantDigits: 1, - maximumSignificantDigits: 3, -}); -const gdpPerCapitaFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - notation: 'compact', -}); -const populationFormatter = new Intl.NumberFormat('en-US', { notation: 'compact' }); -const dayFormatter = new Intl.DateTimeFormat(undefined, { - day: 'numeric', - month: '2-digit', - year: 'numeric', -}); - -const commonXAxisProps = { - id: 'x', - zoom: { filterMode: 'discard', slider: { enabled: true, preview: true } }, -}; - -const commonProps = { - initialZoom: [{ axisId: 'x', start: 20, end: 80 }], - height: 400, -}; - -const lineXAxis = { - scaleType: 'time', - id: 'x', - data: usUnemploymentRate.map((d) => d.date), - valueFormatter: dateAxisFormatter, -}; - -const lineSettings = { - yAxis: [ - { - id: 'y', - width: 44, - valueFormatter: (v) => percentageFormatter.format(v), - min: 0, - }, - ], - series: [ - { - data: lineData, - valueFormatter: (v) => percentageFormatter.format(v), - }, - ], -}; - -const areaXAxis = { - id: 'x', - data: new Array(101).fill(null).map((_, i) => i), - label: 'Age', - valueFormatter: (v) => (v === 100 ? '100+' : Math.round(v).toString()), -}; - -const areaSettings = { - yAxis: [ - { - id: 'y', - width: 44, - valueFormatter: (v) => populationFormatter.format(v), - }, - ], - series: ['Europe', 'Asia', 'Americas', 'Africa', 'Oceania'].map((continent) => ({ - data: populationPrediction2050 - .filter((point) => point.location === continent) - .map((point) => point.value), - area: true, - label: continent, - stack: 'population', - valueFormatter: (v) => populationFormatter.format(v), - })), -}; - -const scatterXAxis = { - valueFormatter: (v) => gdpPerCapitaFormatter.format(v), -}; -const scatterSettings = { - yAxis: [{ id: 'y', width: 16, min: 0 }], - series: continents.map((continent) => ({ - label: continent, - data: countriesInContinent[continent] - .map((code) => ({ - id: code, - x: globalCo2GdpPopulation.find((d) => d.code === code)?.gdpPerCapita, - y: globalBirthPerWoman.find((d) => d.code === code)?.rate, - })) - .filter((d) => d.x !== undefined && d.y !== undefined), - valueFormatter: (value) => - `${countryData[value.id].country} - Birth rate: ${value.y} - GDP per capita: ${gdpPerCapitaFormatter.format(value.x)}`, - })), -}; - -const sortedShareOfRenewables = shareOfRenewables.toSorted( - (a, b) => a.renewablesPercentage - b.renewablesPercentage, -); -const barXAxis = { - data: sortedShareOfRenewables.map((d) => countryData[d.code].country), - tickLabelStyle: { angle: -45 }, - height: 90, -}; -const barSettings = { - series: [ - { - data: sortedShareOfRenewables.map((d) => d.renewablesPercentage / 100), - valueFormatter: (v) => percentageFormatter.format(v), - }, - ], -}; - -const rangeBarXAxis = { - data: temperatureBerlinPorto.months, - valueFormatter: (v, context) => (context.location === 'tick' ? v.slice(0, 3) : v), -}; -const rangeBarSettings = { - yAxis: [{ valueFormatter: (value) => `${value}°C` }], - series: [ - { - id: 'porto', - type: 'rangeBar', - label: 'Porto, Portugal', - valueFormatter: (value) => - value === null ? null : `${value[0]}°C - ${value[1]}°C`, - data: temperatureBerlinPorto.porto, - }, - { - id: 'berlin', - type: 'rangeBar', - label: 'Berlin, Germany', - valueFormatter: (value) => - value === null ? null : `${value[0]}°C - ${value[1]}°C`, - data: temperatureBerlinPorto.berlin, - }, - ], -}; - -const candlestickXData = sp500.map((entry) => new Date(Date.parse(entry.date))); -const candlestickData = sp500.map((entry) => [ - entry.open, - entry.high, - entry.low, - entry.close, -]); - -export default function ZoomSliderPreview() { - const [chartType, setChartType] = React.useState('bar'); - - const handleChartType = (event, newChartType) => { - if (newChartType !== null) { - setChartType(newChartType); - } - }; - - return ( - - - {['bar', 'rangeBar', 'line', 'area', 'scatter', 'candlestick'].map( - (type) => ( - - {type} - - ), - )} - - {chartType === 'bar' && } - {chartType === 'rangeBar' && } - {chartType === 'line' && } - {chartType === 'area' && } - {chartType === 'scatter' && } - {chartType === 'candlestick' && } - - ); -} - -function LineChartPreview() { - return ( - - - Unemployment Rate in United States (1948-2025) - - - - Source: Federal Reserve Bank of St. Louis. Updated: Jun 6, 2025 7:46 AM CDT. - - - ); -} - -function AreaChartPreview() { - return ( - - - Population by Age Group in 2050 (Projected) - - - - Source: World Population Prospects: The 2024 Revision, United Nations. - - - ); -} - -function BarChartPreview() { - return ( - - - Share of Primary Energy Consumption from Renewables (2023) - - - - Source: Our World in Data. Updated: 2023. - - - ); -} - -function RangeBarChartPreview() { - return ( - - - Average monthly temperature ranges in °C for Porto and Berlin in 1991-2020 - - - - Source: IPMA (Porto), climate-data.org (Berlin) - - - ); -} - -function ScatterChartPreview() { - return ( - - - Births per woman vs GDP per capita (USD, 2023) - - - - GDP per capita is expressed in international dollars at 2021 prices.
- Source: Our World in Data. Updated: 2023. -
-
- ); -} - -function CandlestickChartPreview() { - return ( - - - S&P 500 Intraday Price - - - v === null ? '' : dayFormatter.format(new Date(v)), - zoom: { - minSpan: 1, - filterMode: 'discard', - slider: { enabled: true, preview: true }, - }, - }, - ]} - height={400} - /> - Source: Yahoo Finance - - ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewCustomMarkerSize.js b/docs/data/charts/zoom-and-pan/ZoomSliderPreviewCustomMarkerSize.js deleted file mode 100644 index 6f1d6dafa1e57..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewCustomMarkerSize.js +++ /dev/null @@ -1,98 +0,0 @@ -import * as React from 'react'; - -import Typography from '@mui/material/Typography'; -import Stack from '@mui/material/Stack'; -import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; -import Slider from '@mui/material/Slider'; -import { globalCo2GdpPopulation } from '../dataset/globalCo2GdpPopulation'; -import { globalBirthPerWoman } from '../dataset/globalBirthsPerWoman'; -import { - continents, - countriesInContinent, - countryData, -} from '../dataset/countryData'; - -const gdpPerCapitaFormatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - notation: 'compact', -}); - -const scatterXAxis = { - valueFormatter: (v) => gdpPerCapitaFormatter.format(v), -}; - -const dataPerContinent = continents.map((continent) => - countriesInContinent[continent] - .map((code) => ({ - id: code, - x: globalCo2GdpPopulation.find((d) => d.code === code)?.gdpPerCapita, - y: globalBirthPerWoman.find((d) => d.code === code)?.rate, - })) - .filter((d) => d.x !== undefined && d.y !== undefined), -); - -const scatterSettings = { - yAxis: [{ id: 'y', width: 16, min: 0 }], - height: 300, -}; - -export default function ZoomSliderPreviewCustomMarkerSize() { - const [markerSize, setMarkerSize] = React.useState(2); - const series = continents.map((continent, continentIndex) => ({ - label: continent, - data: dataPerContinent[continentIndex], - preview: { markerSize }, - valueFormatter: (value) => - `${countryData[value.id].country} - Birth rate: ${value.y} - GDP per capita: ${gdpPerCapitaFormatter.format(value.x)}`, - })); - - return ( - - - - Births per woman vs GDP per capita (USD, 2023) - - - - GDP per capita is expressed in international dollars at 2021 prices.
- Source: Our World in Data. Updated: 2023. -
-
- - - Marker Size: {markerSize} - - setMarkerSize(value)} - value={markerSize} - /> - -
- ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.js b/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.js deleted file mode 100644 index 1cf6f88b44aeb..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.js +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from 'react'; -import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { inflationData } from '../dataset/inflationRates'; - -const percentageFormatter = (v) => (v == null ? '' : `${v.toFixed(1)}%`); - -const dataset = inflationData.map((d) => ({ - ...d, - average: (d.rateDE + d.rateUK + d.rateFR) / 3, -})); - -const chartConfig = { - height: 400, - dataset, - yAxis: [{ valueFormatter: percentageFormatter }], - series: [ - { - id: 'germany', - dataKey: 'rateDE', - label: 'Germany', - valueFormatter: percentageFormatter, - }, - { - id: 'uk', - dataKey: 'rateUK', - label: 'United Kingdom', - valueFormatter: percentageFormatter, - }, - { - id: 'average', - dataKey: 'average', - label: 'Average', - valueFormatter: percentageFormatter, - }, - ], -}; - -export default function ZoomSliderPreviewSeriesFilter() { - return ( - `${v}`, - zoom: { - slider: { - enabled: true, - preview: { seriesIds: ['average'] }, - }, - }, - }, - ]} - /> - ); -} diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.tsx.preview b/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.tsx.preview deleted file mode 100644 index e632d4c04e6b4..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - `${v}`, - zoom: { - slider: { - enabled: true, - preview: { seriesIds: ['average'] }, - }, - }, - }, - ]} -/> \ No newline at end of file diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderTooltip.js b/docs/data/charts/zoom-and-pan/ZoomSliderTooltip.js deleted file mode 100644 index 1c615b07de2c2..0000000000000 --- a/docs/data/charts/zoom-and-pan/ZoomSliderTooltip.js +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from 'react'; -import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import Stack from '@mui/material/Stack'; -import FormControl from '@mui/material/FormControl'; -import InputLabel from '@mui/material/InputLabel'; -import Select from '@mui/material/Select'; -import MenuItem from '@mui/material/MenuItem'; - -const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; -const pData = [2400, 1398, -9800, 3908, 4800, -3800, 4300]; - -const xLabels = [ - 'Page A', - 'Page B', - 'Page C', - 'Page D', - 'Page E', - 'Page F', - 'Page G', -]; - -export default function ZoomSliderTooltip() { - const [showTooltip, setShowTooltip] = React.useState('hover'); - - return ( - - - Show Tooltip - - - - location === 'zoom-slider-tooltip' ? `${value.slice(5)}` : `${value}`, - zoom: { slider: { enabled: true, showTooltip } }, - }, - ]} - yAxis={[{ width: 60, max: 10000 }]} - initialZoom={[{ axisId: 'x', start: 20, end: 80 }]} - /> - - ); -} diff --git a/docs/data/charts/zoom-and-pan/BrushZoom.tsx b/docs/data/charts/zoom-and-pan/demos/brush-zoom/BrushZoom.tsx similarity index 95% rename from docs/data/charts/zoom-and-pan/BrushZoom.tsx rename to docs/data/charts/zoom-and-pan/demos/brush-zoom/BrushZoom.tsx index 889b9f5889b43..3df8f752e77aa 100644 --- a/docs/data/charts/zoom-and-pan/BrushZoom.tsx +++ b/docs/data/charts/zoom-and-pan/demos/brush-zoom/BrushZoom.tsx @@ -5,6 +5,7 @@ import Typography from '@mui/material/Typography'; export default function BrushZoom() { return ( + {/* @focus-start */} Click and drag on the chart to select an area to zoom into. Double-tap to reset the zoom. @@ -32,6 +33,7 @@ export default function BrushZoom() { pan: [], }} /> + {/* @focus-end */} ); } diff --git a/docs/data/charts/zoom-and-pan/demos/brush-zoom/client.ts b/docs/data/charts/zoom-and-pan/demos/brush-zoom/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/brush-zoom/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/brush-zoom/index.ts b/docs/data/charts/zoom-and-pan/demos/brush-zoom/index.ts new file mode 100644 index 0000000000000..200ea4b680cab --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/brush-zoom/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BrushZoom from './BrushZoom'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BrushZoom, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ExternalZoomManagement.tsx b/docs/data/charts/zoom-and-pan/demos/external-zoom-management/ExternalZoomManagement.tsx similarity index 90% rename from docs/data/charts/zoom-and-pan/ExternalZoomManagement.tsx rename to docs/data/charts/zoom-and-pan/demos/external-zoom-management/ExternalZoomManagement.tsx index ef870a3796efb..30e0eeefe6d23 100644 --- a/docs/data/charts/zoom-and-pan/ExternalZoomManagement.tsx +++ b/docs/data/charts/zoom-and-pan/demos/external-zoom-management/ExternalZoomManagement.tsx @@ -2,9 +2,9 @@ import * as React from 'react'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import Button from '@mui/material/Button'; import Stack from '@mui/material/Stack'; -import { ZoomData } from '@mui/x-charts-pro/models'; +import type { ZoomData } from '@mui/x-charts-pro/models'; import { useChartProApiRef } from '@mui/x-charts-pro/hooks'; -import { randomData } from './randomData'; +import { randomData } from '../../randomData'; const initialZoomData: ZoomData[] = [ { @@ -14,6 +14,7 @@ const initialZoomData: ZoomData[] = [ }, ]; export default function ExternalZoomManagement() { + // @focus-start @padding 1 const apiRef = useChartProApiRef<'line'>(); const [zoomData, setZoomData] = React.useState(initialZoomData); @@ -48,6 +49,7 @@ export default function ExternalZoomManagement() {
); + // @focus-end } const chartProps = { diff --git a/docs/data/charts/zoom-and-pan/demos/external-zoom-management/client.ts b/docs/data/charts/zoom-and-pan/demos/external-zoom-management/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/external-zoom-management/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/external-zoom-management/index.ts b/docs/data/charts/zoom-and-pan/demos/external-zoom-management/index.ts new file mode 100644 index 0000000000000..06495a98955ad --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/external-zoom-management/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExternalZoomManagement from './ExternalZoomManagement'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExternalZoomManagement, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomAndPanInteractions.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/ZoomAndPanInteractions.tsx similarity index 98% rename from docs/data/charts/zoom-and-pan/ZoomAndPanInteractions.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/ZoomAndPanInteractions.tsx index 3c8bb3886a26d..2530093420cc0 100644 --- a/docs/data/charts/zoom-and-pan/ZoomAndPanInteractions.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/ZoomAndPanInteractions.tsx @@ -57,6 +57,7 @@ const knobs = { export default function ZoomAndPanInteractions() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/index.ts new file mode 100644 index 0000000000000..d95ac806fb0db --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-and-pan-interactions/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomAndPanInteractions from './ZoomAndPanInteractions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomAndPanInteractions, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomBarChart.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/ZoomBarChart.tsx similarity index 96% rename from docs/data/charts/zoom-and-pan/ZoomBarChart.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/ZoomBarChart.tsx index 16f1b268ee852..664e8bd05b178 100644 --- a/docs/data/charts/zoom-and-pan/ZoomBarChart.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/ZoomBarChart.tsx @@ -2,11 +2,13 @@ import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; export default function ZoomBarChart() { return ( + // @focus-start @padding 2 i), zoom: true }]} series={series} /> + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/index.ts new file mode 100644 index 0000000000000..c58e9dca65e40 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-bar-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomBarChart from './ZoomBarChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomBarChart, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomControlled.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-controlled/ZoomControlled.tsx similarity index 91% rename from docs/data/charts/zoom-and-pan/ZoomControlled.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-controlled/ZoomControlled.tsx index 7eb8fe9c07a4e..5800dc9538bb4 100644 --- a/docs/data/charts/zoom-and-pan/ZoomControlled.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-controlled/ZoomControlled.tsx @@ -2,9 +2,9 @@ import * as React from 'react'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import Button from '@mui/material/Button'; import Stack from '@mui/material/Stack'; -import { ZoomData } from '@mui/x-charts-pro/models'; +import type { ZoomData } from '@mui/x-charts-pro/models'; import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { randomData } from './randomData'; +import { randomData } from '../../randomData'; const lineAxis = [ { @@ -31,6 +31,7 @@ const initialZoomData: ZoomData[] = [ }, ]; export default function ZoomControlled() { + // @focus-start @padding 1 const [zoomData, setZoomData] = React.useState(initialZoomData); return ( @@ -60,6 +61,7 @@ export default function ZoomControlled() {
); + // @focus-end } const chartProps = { diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-controlled/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-controlled/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-controlled/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-controlled/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-controlled/index.ts new file mode 100644 index 0000000000000..fdcbd0ceebce7 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-controlled/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomControlled from './ZoomControlled'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomControlled, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomFilterMode.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/ZoomFilterMode.tsx similarity index 78% rename from docs/data/charts/zoom-and-pan/ZoomFilterMode.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/ZoomFilterMode.tsx index a0395292463e9..72db81460de17 100644 --- a/docs/data/charts/zoom-and-pan/ZoomFilterMode.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/ZoomFilterMode.tsx @@ -1,8 +1,9 @@ import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { dataset, valueFormatter } from './letterFrequency'; +import { dataset, valueFormatter } from '../../letterFrequency'; export default function ZoomFilterMode() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/index.ts new file mode 100644 index 0000000000000..4470942d8e095 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-filter-mode/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomFilterMode from './ZoomFilterMode'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomFilterMode, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomHeatmap.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/ZoomHeatmap.tsx similarity index 96% rename from docs/data/charts/zoom-and-pan/ZoomHeatmap.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-heatmap/ZoomHeatmap.tsx index 1a9c7fc43f640..4a4c4dee22112 100644 --- a/docs/data/charts/zoom-and-pan/ZoomHeatmap.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/ZoomHeatmap.tsx @@ -1,7 +1,7 @@ import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { Heatmap } from '@mui/x-charts-pro/Heatmap'; -import { +import type { AxisValueFormatterContext, HeatmapValueType, XAxis, @@ -9,7 +9,7 @@ import { } from '@mui/x-charts-pro/models'; import { useTheme } from '@mui/system'; import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; -import data from '../dataset/muiXCommits2024.json'; +import data from '../../../dataset/muiXCommits2024.json'; const seriesData: HeatmapValueType[] = []; @@ -61,6 +61,7 @@ const yAxis = { } satisfies YAxis<'band'>; export default function ZoomHeatmap() { + // @focus-start @padding 1 const theme = useTheme(); return ( @@ -91,6 +92,7 @@ export default function ZoomHeatmap() { Source: GitHub ); + // @focus-end } const formattedWeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/index.ts new file mode 100644 index 0000000000000..5abc1f8e3d0d3 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-heatmap/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomHeatmap from './ZoomHeatmap'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomHeatmap, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomInitialRange.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/ZoomInitialRange.tsx similarity index 96% rename from docs/data/charts/zoom-and-pan/ZoomInitialRange.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-initial-range/ZoomInitialRange.tsx index 901af185600a8..69ae49ffff9c4 100644 --- a/docs/data/charts/zoom-and-pan/ZoomInitialRange.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/ZoomInitialRange.tsx @@ -1,14 +1,14 @@ import * as React from 'react'; import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; -import { RangeButtonValue } from '@mui/x-charts-pro/ChartsToolbarPro'; +import type { RangeButtonValue } from '@mui/x-charts-pro/ChartsToolbarPro'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; import Stack from '@mui/material/Stack'; import ToggleButton from '@mui/material/ToggleButton'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; import { HighlightedCode } from '@mui/internal-core-docs/HighlightedCode'; -import { dataset } from '../dataset/gdpPerCapitaEvolution'; +import { dataset } from '../../../dataset/gdpPerCapitaEvolution'; interface Preset { /** The label shown in the dropdown. */ @@ -69,6 +69,7 @@ const months = [ const sales = [42, 38, 55, 61, 73, 88, 95, 91, 70, 58, 49, 44]; export default function ZoomInitialRange() { + // @focus-start @padding 1 const [chartType, setChartType] = React.useState<'line' | 'bar'>('line'); const [label, setLabel] = React.useState('10Y'); @@ -161,4 +162,5 @@ export default function ZoomInitialRange() { )} ); + // @focus-end } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/index.ts new file mode 100644 index 0000000000000..9d4778b210cd8 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-initial-range/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomInitialRange from './ZoomInitialRange'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomInitialRange, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomKeyboard.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/ZoomKeyboard.tsx similarity index 82% rename from docs/data/charts/zoom-and-pan/ZoomKeyboard.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-keyboard/ZoomKeyboard.tsx index 0b962b76c8034..c51d04119d618 100644 --- a/docs/data/charts/zoom-and-pan/ZoomKeyboard.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/ZoomKeyboard.tsx @@ -1,14 +1,16 @@ import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; -import { randomData } from './randomData'; +import { randomData } from '../../randomData'; export default function ZoomKeyboard() { return ( + // @focus-start @padding 2 i), zoom: true }]} yAxis={[{ zoom: true, width: 50 }]} series={series} /> + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/index.ts new file mode 100644 index 0000000000000..3f2cf8cf1bb46 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-keyboard/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomKeyboard from './ZoomKeyboard'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomKeyboard, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomLineChart.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/ZoomLineChart.tsx similarity index 96% rename from docs/data/charts/zoom-and-pan/ZoomLineChart.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-line-chart/ZoomLineChart.tsx index 421253ac27a28..f3fbd8dff31a2 100644 --- a/docs/data/charts/zoom-and-pan/ZoomLineChart.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/ZoomLineChart.tsx @@ -2,6 +2,7 @@ import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; export default function ZoomLineChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/index.ts new file mode 100644 index 0000000000000..44fb8bd9f7b4b --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-line-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomLineChart from './ZoomLineChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomLineChart, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomOptions.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-options/ZoomOptions.tsx similarity index 97% rename from docs/data/charts/zoom-and-pan/ZoomOptions.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-options/ZoomOptions.tsx index 17af2fcc409ba..d892335ea8d97 100644 --- a/docs/data/charts/zoom-and-pan/ZoomOptions.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-options/ZoomOptions.tsx @@ -45,6 +45,7 @@ const knobs = { export default function ZoomOptions() { return ( + // @focus-start @padding 2 `; }} /> + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-options/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-options/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-options/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-options/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-options/index.ts new file mode 100644 index 0000000000000..d18c0db40f148 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-options/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomOptions from './ZoomOptions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomOptions, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomScatterChart.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/ZoomScatterChart.tsx similarity index 98% rename from docs/data/charts/zoom-and-pan/ZoomScatterChart.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/ZoomScatterChart.tsx index 7442ec5ef66de..58a5964149af6 100644 --- a/docs/data/charts/zoom-and-pan/ZoomScatterChart.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/ZoomScatterChart.tsx @@ -2,6 +2,7 @@ import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; export default function ZoomScatterChart() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/index.ts new file mode 100644 index 0000000000000..5a2b51f92e80e --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-scatter-chart/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomScatterChart from './ZoomScatterChart'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomScatterChart, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderComposition.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/ZoomSliderComposition.tsx similarity index 97% rename from docs/data/charts/zoom-and-pan/ZoomSliderComposition.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/ZoomSliderComposition.tsx index 7ebc8be22e4b3..921314807ee65 100644 --- a/docs/data/charts/zoom-and-pan/ZoomSliderComposition.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/ZoomSliderComposition.tsx @@ -18,6 +18,7 @@ const secondSeriesData = Array.from({ length: 26 }, () => ); export default function ZoomSliderComposition() { + // @focus-start @padding 1 const clipPathId = React.useId(); return ( @@ -46,4 +47,5 @@ export default function ZoomSliderComposition() { ); + // @focus-end } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/index.ts new file mode 100644 index 0000000000000..b2dbb801cbe67 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-composition/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomSliderComposition from './ZoomSliderComposition'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomSliderComposition, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewCustomMarkerSize.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/ZoomSliderPreviewCustomMarkerSize.tsx similarity index 86% rename from docs/data/charts/zoom-and-pan/ZoomSliderPreviewCustomMarkerSize.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/ZoomSliderPreviewCustomMarkerSize.tsx index 087382a1a1730..461dbcba43983 100644 --- a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewCustomMarkerSize.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/ZoomSliderPreviewCustomMarkerSize.tsx @@ -1,19 +1,17 @@ import * as React from 'react'; -import { ScatterValueType } from '@mui/x-charts/models'; +import type { ScatterValueType } from '@mui/x-charts/models'; import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; -import { - ScatterChartPro, - ScatterChartProProps, -} from '@mui/x-charts-pro/ScatterChartPro'; +import type { ScatterChartProProps } from '@mui/x-charts-pro/ScatterChartPro'; +import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; import Slider from '@mui/material/Slider'; -import { globalCo2GdpPopulation } from '../dataset/globalCo2GdpPopulation'; -import { globalBirthPerWoman } from '../dataset/globalBirthsPerWoman'; +import { globalCo2GdpPopulation } from '../../../dataset/globalCo2GdpPopulation'; +import { globalBirthPerWoman } from '../../../dataset/globalBirthsPerWoman'; import { continents, countriesInContinent, countryData, -} from '../dataset/countryData'; +} from '../../../dataset/countryData'; const gdpPerCapitaFormatter = new Intl.NumberFormat('en-US', { style: 'currency', @@ -44,6 +42,7 @@ const scatterSettings = { } satisfies Partial; export default function ZoomSliderPreviewCustomMarkerSize() { + // @focus-start @padding 1 const [markerSize, setMarkerSize] = React.useState(2); const series = continents.map((continent, continentIndex) => ({ label: continent, @@ -101,4 +100,5 @@ export default function ZoomSliderPreviewCustomMarkerSize() { ); + // @focus-end } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/index.ts new file mode 100644 index 0000000000000..6e3d1c7b163b3 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-custom-marker-size/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomSliderPreviewCustomMarkerSize from './ZoomSliderPreviewCustomMarkerSize'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomSliderPreviewCustomMarkerSize, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/ZoomSliderPreviewSeriesFilter.tsx similarity index 82% rename from docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/ZoomSliderPreviewSeriesFilter.tsx index dd5046bc54281..a74824958382a 100644 --- a/docs/data/charts/zoom-and-pan/ZoomSliderPreviewSeriesFilter.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/ZoomSliderPreviewSeriesFilter.tsx @@ -1,9 +1,7 @@ import * as React from 'react'; -import { - LineChartPro, - type LineChartProProps, -} from '@mui/x-charts-pro/LineChartPro'; -import { inflationData } from '../dataset/inflationRates'; +import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; +import type { LineChartProProps } from '@mui/x-charts-pro/LineChartPro'; +import { inflationData } from '../../../dataset/inflationRates'; const percentageFormatter = (v: number | null) => v == null ? '' : `${v.toFixed(1)}%`; @@ -41,6 +39,7 @@ const chartConfig = { export default function ZoomSliderPreviewSeriesFilter() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/index.ts new file mode 100644 index 0000000000000..8f218862b6c64 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview-series-filter/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomSliderPreviewSeriesFilter from './ZoomSliderPreviewSeriesFilter'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomSliderPreviewSeriesFilter, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderPreview.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/ZoomSliderPreview.tsx similarity index 88% rename from docs/data/charts/zoom-and-pan/ZoomSliderPreview.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/ZoomSliderPreview.tsx index da45b313fa81a..056c5bb4b123a 100644 --- a/docs/data/charts/zoom-and-pan/ZoomSliderPreview.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/ZoomSliderPreview.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; -import { LineChartPro, LineChartProProps } from '@mui/x-charts-pro/LineChartPro'; -import { +import type { LineChartProProps } from '@mui/x-charts-pro/LineChartPro'; +import { LineChartPro } from '@mui/x-charts-pro/LineChartPro'; +import type { AxisValueFormatterContext, ScatterValueType, XAxis, @@ -9,32 +10,29 @@ import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; import ToggleButton from '@mui/material/ToggleButton'; -import { - ScatterChartPro, - ScatterChartProProps, -} from '@mui/x-charts-pro/ScatterChartPro'; -import { BarChartPro, BarChartProProps } from '@mui/x-charts-pro/BarChartPro'; -import { - BarChartPremium, - BarChartPremiumProps, -} from '@mui/x-charts-premium/BarChartPremium'; +import type { ScatterChartProProps } from '@mui/x-charts-pro/ScatterChartPro'; +import { ScatterChartPro } from '@mui/x-charts-pro/ScatterChartPro'; +import type { BarChartProProps } from '@mui/x-charts-pro/BarChartPro'; +import { BarChartPro } from '@mui/x-charts-pro/BarChartPro'; +import type { BarChartPremiumProps } from '@mui/x-charts-premium/BarChartPremium'; +import { BarChartPremium } from '@mui/x-charts-premium/BarChartPremium'; import { CandlestickChart as CandlestickChart } from '@mui/x-charts-premium/CandlestickChart'; -import { OHLCValueType } from '@mui/x-charts-premium/models'; +import type { OHLCValueType } from '@mui/x-charts-premium/models'; import { dateAxisFormatter, usUnemploymentRate, -} from '../dataset/usUnemploymentRate'; -import { globalCo2GdpPopulation } from '../dataset/globalCo2GdpPopulation'; -import { globalBirthPerWoman } from '../dataset/globalBirthsPerWoman'; +} from '../../../dataset/usUnemploymentRate'; +import { globalCo2GdpPopulation } from '../../../dataset/globalCo2GdpPopulation'; +import { globalBirthPerWoman } from '../../../dataset/globalBirthsPerWoman'; import { continents, countriesInContinent, countryData, -} from '../dataset/countryData'; -import { shareOfRenewables } from '../dataset/shareOfRenewables'; -import { populationPrediction2050 } from '../dataset/populationPrediction2050'; -import { temperatureBerlinPorto } from '../dataset/temperatureBerlinPorto'; -import sp500 from '../dataset/sp500-intraday.json'; +} from '../../../dataset/countryData'; +import { shareOfRenewables } from '../../../dataset/shareOfRenewables'; +import { populationPrediction2050 } from '../../../dataset/populationPrediction2050'; +import { temperatureBerlinPorto } from '../../../dataset/temperatureBerlinPorto'; +import sp500 from '../../../dataset/sp500-intraday.json'; const lineData = usUnemploymentRate.map((d) => d.rate / 100); @@ -192,6 +190,7 @@ const candlestickData: Array = sp500.map((entry) => [ ]); export default function ZoomSliderPreview() { + // @focus-start @padding 1 const [chartType, setChartType] = React.useState('bar'); const handleChartType = (event: any, newChartType: string) => { @@ -225,6 +224,7 @@ export default function ZoomSliderPreview() { {chartType === 'candlestick' && } ); + // @focus-end } function LineChartPreview() { diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/index.ts new file mode 100644 index 0000000000000..6596370fe39e9 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-preview/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomSliderPreview from './ZoomSliderPreview'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomSliderPreview, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomSliderTooltip.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/ZoomSliderTooltip.tsx similarity index 97% rename from docs/data/charts/zoom-and-pan/ZoomSliderTooltip.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/ZoomSliderTooltip.tsx index 69b8a56ce8d01..027311ec87bd4 100644 --- a/docs/data/charts/zoom-and-pan/ZoomSliderTooltip.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/ZoomSliderTooltip.tsx @@ -22,6 +22,7 @@ const xLabels = [ ]; export default function ZoomSliderTooltip() { + // @focus-start @padding 1 const [showTooltip, setShowTooltip] = React.useState('hover'); @@ -66,4 +67,5 @@ export default function ZoomSliderTooltip() { /> ); + // @focus-end } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/index.ts new file mode 100644 index 0000000000000..8dd2c33f99e4e --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider-tooltip/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomSliderTooltip from './ZoomSliderTooltip'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomSliderTooltip, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/ZoomSlider.tsx b/docs/data/charts/zoom-and-pan/demos/zoom-slider/ZoomSlider.tsx similarity index 96% rename from docs/data/charts/zoom-and-pan/ZoomSlider.tsx rename to docs/data/charts/zoom-and-pan/demos/zoom-slider/ZoomSlider.tsx index 7433c84ea7716..c568c97fcb779 100644 --- a/docs/data/charts/zoom-and-pan/ZoomSlider.tsx +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider/ZoomSlider.tsx @@ -14,6 +14,7 @@ const xData = data.map((d) => d.x); export default function ZoomSlider() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider/client.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/charts/zoom-and-pan/demos/zoom-slider/index.ts b/docs/data/charts/zoom-and-pan/demos/zoom-slider/index.ts new file mode 100644 index 0000000000000..7589dbc8b5874 --- /dev/null +++ b/docs/data/charts/zoom-and-pan/demos/zoom-slider/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ZoomSlider from './ZoomSlider'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ZoomSlider, { ClientProvider }); diff --git a/docs/data/charts/zoom-and-pan/zoom-and-pan.md b/docs/data/charts/zoom-and-pan/zoom-and-pan.md index 0e9947183a0fd..86e82aeca10a7 100644 --- a/docs/data/charts/zoom-and-pan/zoom-and-pan.md +++ b/docs/data/charts/zoom-and-pan/zoom-and-pan.md @@ -30,10 +30,10 @@ The following actions are enabled by default: You can enable additional zoom interactions through configuration. See [Interactions](#interactions) for the full list. -{{"demo": "ZoomScatterChart.js"}} -{{"demo": "ZoomBarChart.js"}} -{{"demo": "ZoomLineChart.js"}} -{{"demo": "ZoomHeatmap.js"}} +{{"component": "file://./demos/zoom-scatter-chart/index.ts"}} +{{"component": "file://./demos/zoom-bar-chart/index.ts"}} +{{"component": "file://./demos/zoom-line-chart/index.ts"}} +{{"component": "file://./demos/zoom-heatmap/index.ts"}} ## Zooming options @@ -48,7 +48,7 @@ The following options are available: - **maxSpan**: Restricts the maximum span size - **panning**: Enables or disables panning -{{"demo": "ZoomOptions.js", "hideToolbar": true, "bg": "playground"}} +{{"component": "file://./demos/zoom-options/index.ts", "hideToolbar": true, "bg": "playground"}} ## Zoom filtering @@ -59,13 +59,13 @@ Make the zoom of an axis affect one or more axes' extents by setting the `zoom.f The demo below shows how the secondary axis adapts to the visible part of the primary axis. -{{"demo": "ZoomFilterMode.js"}} +{{"component": "file://./demos/zoom-filter-mode/index.ts"}} ## Zoom slider Provide an overview that lets users manipulate the zoomed area by setting the `zoom.slider.enabled` property on the axis config. -{{"demo": "ZoomSlider.js"}} +{{"component": "file://./demos/zoom-slider/index.ts"}} Set the `zoom.slider.size` property to customize the size reserved for the zoom slider. This is useful if you're using a custom zoom slider and want to update the space reserved for it. @@ -90,7 +90,7 @@ Customize the value shown in the tooltip by using the `valueFormatter` property When formatting the zoom slider tooltip, the chart calls `valueFormatter()` with `zoom-slider-tooltip` as its location. -{{"demo": "ZoomSliderTooltip.js"}} +{{"component": "file://./demos/zoom-slider-tooltip/index.ts"}} ### Limits @@ -103,26 +103,26 @@ The zoom slider does not display values outside the range delimited by `minStart When composing a custom component, render the `ChartsZoomSlider` component to show the axes' sliders. -{{"demo": "ZoomSliderComposition.js"}} +{{"component": "file://./demos/zoom-slider-composition/index.ts"}} ## Preview When the zoom slider is enabled, preview the zoomed area by enabling the `zoom.slider.preview` property on the axis config. -{{"demo": "ZoomSliderPreview.js"}} +{{"component": "file://./demos/zoom-slider-preview/index.ts"}} ### Series filter Use `zoom.slider.preview.seriesIds` to select the series to display in the preview. -{{"demo": "ZoomSliderPreviewSeriesFilter.js"}} +{{"component": "file://./demos/zoom-slider-preview-series-filter/index.ts"}} ### Scatter marker size The size of the preview marker in scatter charts is 1px by default. Customize it by setting the `zoom.slider.preview.markerSize` property on the series configuration object. -{{"demo": "ZoomSliderPreviewCustomMarkerSize.js"}} +{{"component": "file://./demos/zoom-slider-preview-custom-marker-size/index.ts"}} ## Zoom management @@ -141,7 +141,7 @@ The `zoom` state is an array of objects that define the zoom state for each axis - **start**: The starting percentage of the axis range - **end**: The ending percentage of the zoom range -{{"demo": "ExternalZoomManagement.js"}} +{{"component": "file://./demos/external-zoom-management/index.ts"}} #### Initialize with a range value @@ -171,13 +171,13 @@ This feature does not support SSR. When providing a range value, the initial frame is rendered un-zoomed and the zoom is applied on the client right after hydration. ::: -{{"demo": "ZoomInitialRange.js"}} +{{"component": "file://./demos/zoom-initial-range/index.ts"}} ### Zoom synchronization Control the zoom state to synchronize zoom between multiple charts. -{{"demo": "ZoomControlled.js"}} +{{"component": "file://./demos/zoom-controlled/index.ts"}} ## Zoom interactions configuration @@ -232,14 +232,14 @@ For example, the "drag" and "brush" interactions do not work well together. If both are needed, the `pointerMode` and `requiredKeys` options described in the next sections can help. ::: -{{"demo": "ZoomAndPanInteractions.js"}} +{{"component": "file://./demos/zoom-and-pan-interactions/index.ts"}} ### Brush zoom The brush zoom interaction lets users select a specific area to zoom into by clicking and dragging to create a selection rectangle. This provides an intuitive way to focus on a particular region of interest in the chart. -{{"demo": "BrushZoom.js"}} +{{"component": "file://./demos/brush-zoom/index.ts"}} ### Keyboard zoom and pan @@ -280,7 +280,7 @@ The visible range is announced to screen readers each time it changes from the k The default message reads `Showing 5% to 95% of the horizontal axis`, and can be customized with the `zoomRangeDescription` [localization key](/x/react-charts/localization/#localize-text). A zoom coming from the pointer or from the application is not announced, because it is not the user driving the chart from the keyboard. -{{"demo": "ZoomKeyboard.js"}} +{{"component": "file://./demos/zoom-keyboard/index.ts"}} ### Key modifiers diff --git a/docs/data/chat/accessibility/accessibility.md b/docs/data/chat/accessibility/accessibility.md index cd832b1258850..dce539e6f9e01 100644 --- a/docs/data/chat/accessibility/accessibility.md +++ b/docs/data/chat/accessibility/accessibility.md @@ -13,7 +13,7 @@ githubLabel: 'scope: chat' The message list is a single Tab stop: a roving tabindex over the `role="article"` messages keeps only one message in the tab order at a time, so tabbing from the composer to the rest of the application never walks through every message. -{{"demo": "../material/message-list/KeyboardNavigation.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../material/message-list/demos/keyboard-navigation/index.ts", "bg": "inline", "collapseToEmpty": true}} | Key | Action | | :----------------------------------------------- | :----------------------------------------------------------------------------------------------- | diff --git a/docs/data/chat/ai-and-agents/reasoning/ReasoningSlotsDemo.js b/docs/data/chat/ai-and-agents/reasoning/ReasoningSlotsDemo.js deleted file mode 100644 index fa647b4b6776c..0000000000000 --- a/docs/data/chat/ai-and-agents/reasoning/ReasoningSlotsDemo.js +++ /dev/null @@ -1,152 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; - -import AutoAwesomeOutlinedIcon from '@mui/icons-material/AutoAwesomeOutlined'; -import { createChunkStream } from 'docs/data/chat/core/examples/shared/demoUtils'; - -const CONVERSATION_ID = 'reasoning-slots-demo'; - -const initialConversations = [{ id: CONVERSATION_ID, title: 'Reasoning slots' }]; - -const initialMessages = [ - { - id: 'seed', - conversationId: CONVERSATION_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'reasoning', - text: 'The user greeted me. A short, friendly reply is enough — no tools needed.', - state: 'done', - }, - { - type: 'text', - text: 'Hi! Send a message to see the restyled reasoning disclosure stream.', - }, - ], - }, -]; - -const adapter = { - async sendMessage({ message }) { - const messageId = `reply-${message.id}`; - // Emit one chunk at a time, with a small delay, so the disclosure visibly streams. - return createChunkStream( - [ - { type: 'start', messageId }, - { type: 'reasoning-start', id: 'r1' }, - { - type: 'reasoning-delta', - id: 'r1', - delta: 'Let me think about how to answer this. ', - }, - { - type: 'reasoning-delta', - id: 'r1', - delta: 'The question is straightforward, ', - }, - { - type: 'reasoning-delta', - id: 'r1', - delta: 'so a concise reply works best.', - }, - { type: 'reasoning-end', id: 'r1' }, - { type: 'text-start', id: 't1' }, - { type: 'text-delta', id: 't1', delta: 'Here is the answer, now that ' }, - { type: 'text-delta', id: 't1', delta: 'the reasoning above has finished.' }, - { type: 'text-end', id: 't1' }, - { type: 'finish', messageId }, - ], - { delayMs: 100 }, - ); - }, -}; - -// Custom `root` slot — a tinted disclosure container. -const CustomRoot = React.forwardRef(function CustomRoot(props, ref) { - const { ownerState, style, ...other } = props; - return ( -
- ); -}); - -// Custom `summary` slot — uses `ownerState.streaming` for a live affordance. -const CustomSummary = React.forwardRef(function CustomSummary(props, ref) { - const { ownerState, children, style, ...other } = props; - const streaming = ownerState?.streaming; - return ( - - - {children} - {streaming ? ( - - ) : null} - - - ); -}); - -export default function ReasoningSlotsDemo() { - return ( - - ); -} diff --git a/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.js b/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.js deleted file mode 100644 index 3f0c9d9ff7536..0000000000000 --- a/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.js +++ /dev/null @@ -1,82 +0,0 @@ -'use client'; -import { ChatBox } from '@mui/x-chat'; - -import { createChunkStream } from 'docs/data/chat/core/examples/shared/demoUtils'; - -const CONVERSATION_ID = 'reasoning-demo'; - -const initialConversations = [{ id: CONVERSATION_ID, title: 'Reasoning' }]; - -const initialMessages = [ - { - id: 'seed', - conversationId: CONVERSATION_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'reasoning', - text: 'The user greeted me. A short, friendly reply is enough — no tools needed.', - state: 'done', - }, - { - type: 'text', - text: 'Hi! Send a message and watch the reasoning stream in above this reply.', - }, - ], - }, -]; - -const adapter = { - async sendMessage({ message }) { - const messageId = `reply-${message.id}`; - // Emit one chunk at a time, with a small delay, so the disclosure visibly streams. - return createChunkStream( - [ - { type: 'start', messageId }, - // Reasoning section — auto-expanded and labelled "Thinking…" while streaming. - { type: 'reasoning-start', id: 'r1' }, - { - type: 'reasoning-delta', - id: 'r1', - delta: 'Let me think about how to answer this. ', - }, - { - type: 'reasoning-delta', - id: 'r1', - delta: 'The question is straightforward, ', - }, - { - type: 'reasoning-delta', - id: 'r1', - delta: 'so a concise reply works best.', - }, - { type: 'reasoning-end', id: 'r1' }, - // Final answer — the reasoning collapses to a "Reasoning" summary as this streams. - { type: 'text-start', id: 't1' }, - { type: 'text-delta', id: 't1', delta: 'Here is the answer, now that ' }, - { type: 'text-delta', id: 't1', delta: 'the reasoning above has finished.' }, - { type: 'text-end', id: 't1' }, - { type: 'finish', messageId }, - ], - { delayMs: 100 }, - ); - }, -}; - -export default function ReasoningStreamingDemo() { - return ( - - ); -} diff --git a/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.tsx.preview b/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.tsx.preview deleted file mode 100644 index 6bccfce765ffc..0000000000000 --- a/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/ai-and-agents/reasoning/ReasoningSlotsDemo.tsx b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/ReasoningSlotsDemo.tsx similarity index 98% rename from docs/data/chat/ai-and-agents/reasoning/ReasoningSlotsDemo.tsx rename to docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/ReasoningSlotsDemo.tsx index 4bb88c8398cbd..adfe5b2010368 100644 --- a/docs/data/chat/ai-and-agents/reasoning/ReasoningSlotsDemo.tsx +++ b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/ReasoningSlotsDemo.tsx @@ -137,6 +137,7 @@ const CustomSummary = React.forwardRef(function CustomSummary( export default function ReasoningSlotsDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/client.ts b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/index.ts b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/index.ts new file mode 100644 index 0000000000000..471c9a1df1d6d --- /dev/null +++ b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-slots-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReasoningSlotsDemo from './ReasoningSlotsDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReasoningSlotsDemo, { ClientProvider }); diff --git a/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.tsx b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/ReasoningStreamingDemo.tsx similarity index 98% rename from docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.tsx rename to docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/ReasoningStreamingDemo.tsx index 848e5d174bdef..392d22e2615de 100644 --- a/docs/data/chat/ai-and-agents/reasoning/ReasoningStreamingDemo.tsx +++ b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/ReasoningStreamingDemo.tsx @@ -66,6 +66,7 @@ const adapter: ChatAdapter = { export default function ReasoningStreamingDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/client.ts b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/index.ts b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/index.ts new file mode 100644 index 0000000000000..1556744d772a6 --- /dev/null +++ b/docs/data/chat/ai-and-agents/reasoning/demos/reasoning-streaming-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ReasoningStreamingDemo from './ReasoningStreamingDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ReasoningStreamingDemo, { ClientProvider }); diff --git a/docs/data/chat/ai-and-agents/reasoning/reasoning.md b/docs/data/chat/ai-and-agents/reasoning/reasoning.md index 1a121ba91c140..a0c141798e788 100644 --- a/docs/data/chat/ai-and-agents/reasoning/reasoning.md +++ b/docs/data/chat/ai-and-agents/reasoning/reasoning.md @@ -21,7 +21,7 @@ Reasoning parts render automatically as a collapsible "Thinking…" section — Reasoning parts render automatically — you don't need to register a renderer to display them. The built-in renderer is a native `
`/`` disclosure that stays open while `state` is `'streaming'` (showing a "Thinking…" label), then collapses to a clickable "Reasoning" summary once the reasoning is `'done'`. -{{"demo": "ReasoningStreamingDemo.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/reasoning-streaming-demo/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Labels @@ -76,7 +76,7 @@ import type { ReasoningPartOwnerState } from '@mui/x-chat/headless'; Partial overrides keep the remaining Material defaults, because the slot maps are merged: a `summary`-only override still uses the default `root` and `content`. -{{"demo": "ReasoningSlotsDemo.js", "bg": "inline", "defaultCodeOpen": true}} +{{"component": "file://./demos/reasoning-slots-demo/index.ts", "bg": "inline", "initialExpanded": true}} See the [`ChatMessageContent` API](/x/api/chat/chat-message-content/) for the full `partProps` shape. diff --git a/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.js b/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.js deleted file mode 100644 index 5a8482e24d26d..0000000000000 --- a/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.js +++ /dev/null @@ -1,164 +0,0 @@ -'use client'; -import * as React from 'react'; -import Divider from '@mui/material/Divider'; -import Typography from '@mui/material/Typography'; -import { ChatBox } from '@mui/x-chat'; - -import { createChunkStream } from 'docs/data/chat/core/examples/shared/demoUtils'; - -// --- Step delimiter renderer ------------------------------------------------- -// This is the exact Material UI renderer documented under -// "### Step progress with Material UI" — `Divider` + a "Step N" caption. - -const partRenderers = { - 'step-start': ({ index, message }) => { - const stepNumber = message.parts - .slice(0, index + 1) - .filter((part) => part.type === 'step-start').length; - return ( - - - Step {stepNumber} - - - ); - }, -}; - -// --- Scripted 3-step stream -------------------------------------------------- -// Mirrors the page's "Step boundary chunks" example: search tool, analyze tool, -// then a final text answer — each wrapped in start-step/finish-step. - -function createStepChunks(messageId) { - const textId = `${messageId}-text`; - - return [ - { type: 'start', messageId }, - // Step 1: Search for information - { type: 'start-step' }, - { - type: 'tool-input-start', - toolCallId: 'call-1', - toolName: 'search', - dynamic: true, - }, - { - type: 'tool-input-available', - toolCallId: 'call-1', - toolName: 'search', - input: { query: 'MUI X Chat documentation' }, - dynamic: true, - }, - { - type: 'tool-output-available', - toolCallId: 'call-1', - output: { results: ['Step tracking guide'] }, - }, - { type: 'finish-step' }, - // Step 2: Analyze results - { type: 'start-step' }, - { - type: 'tool-input-start', - toolCallId: 'call-2', - toolName: 'analyze', - dynamic: true, - }, - { - type: 'tool-input-available', - toolCallId: 'call-2', - toolName: 'analyze', - input: { data: 'Step tracking guide' }, - dynamic: true, - }, - { - type: 'tool-output-available', - toolCallId: 'call-2', - output: { summary: 'Use step-start parts as delimiters' }, - }, - { type: 'finish-step' }, - // Step 3: Final answer - { type: 'start-step' }, - { type: 'text-start', id: textId }, - { - type: 'text-delta', - id: textId, - delta: 'Step tracking delimits each phase with step-start parts.', - }, - { type: 'text-end', id: textId }, - { type: 'finish-step' }, - { type: 'finish', messageId }, - ]; -} - -// --- Seeded exchange --------------------------------------------------------- -// One completed user/assistant pair so the "Step 1/2/3" dividers are visible on -// initial load; the reader can send another message to watch them stream in. - -const seededMessages = [ - { - id: 'seed-user', - role: 'user', - parts: [{ type: 'text', text: 'Find and summarize the step tracking docs.' }], - }, - { - id: 'seed-assistant', - role: 'assistant', - parts: [ - { type: 'step-start' }, - { - type: 'dynamic-tool', - toolInvocation: { - toolCallId: 'seed-call-1', - toolName: 'search', - state: 'output-available', - input: { query: 'MUI X Chat documentation' }, - output: { results: ['Step tracking guide'] }, - }, - }, - { type: 'step-start' }, - { - type: 'dynamic-tool', - toolInvocation: { - toolCallId: 'seed-call-2', - toolName: 'analyze', - state: 'output-available', - input: { data: 'Step tracking guide' }, - output: { summary: 'Use step-start parts as delimiters' }, - }, - }, - { type: 'step-start' }, - { - type: 'text', - text: 'Step tracking delimits each phase with step-start parts.', - }, - ], - }, -]; - -// --- Component --------------------------------------------------------------- - -export default function StepTrackingDemo() { - const adapter = React.useMemo( - () => ({ - async sendMessage() { - return createChunkStream(createStepChunks('msg-1'), { delayMs: 170 }); - }, - }), - [], - ); - - return ( - - ); -} diff --git a/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.tsx.preview b/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.tsx.preview deleted file mode 100644 index ed690bebfb2ea..0000000000000 --- a/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.tsx b/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/StepTrackingDemo.tsx similarity index 99% rename from docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.tsx rename to docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/StepTrackingDemo.tsx index 6ba2b24d4dd96..75e18b26a2020 100644 --- a/docs/data/chat/ai-and-agents/step-tracking/StepTrackingDemo.tsx +++ b/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/StepTrackingDemo.tsx @@ -147,6 +147,7 @@ const seededMessages: ChatMessage[] = [ // --- Component --------------------------------------------------------------- export default function StepTrackingDemo() { + // @focus-start @padding 1 const adapter = React.useMemo( () => ({ async sendMessage() { @@ -170,4 +171,5 @@ export default function StepTrackingDemo() { }} /> ); + // @focus-end } diff --git a/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/client.ts b/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/index.ts b/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/index.ts new file mode 100644 index 0000000000000..a124298a64a99 --- /dev/null +++ b/docs/data/chat/ai-and-agents/step-tracking/demos/step-tracking-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StepTrackingDemo from './StepTrackingDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StepTrackingDemo, { ClientProvider }); diff --git a/docs/data/chat/ai-and-agents/step-tracking/step-tracking.md b/docs/data/chat/ai-and-agents/step-tracking/step-tracking.md index bb15175d448ef..6d26362885eb2 100644 --- a/docs/data/chat/ai-and-agents/step-tracking/step-tracking.md +++ b/docs/data/chat/ai-and-agents/step-tracking/step-tracking.md @@ -132,7 +132,7 @@ When writing a custom step delimiter, preserve the `role="separator"` semantics Material UI's `Divider` renders `role="separator"` automatically. ::: -{{"demo": "StepTrackingDemo.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/step-tracking-demo/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Step delimiter renderer diff --git a/docs/data/chat/ai-and-agents/tool-approval/ChatConfirmationPlayground.js b/docs/data/chat/ai-and-agents/tool-approval/ChatConfirmationPlayground.js deleted file mode 100644 index 7e106354fc09c..0000000000000 --- a/docs/data/chat/ai-and-agents/tool-approval/ChatConfirmationPlayground.js +++ /dev/null @@ -1,110 +0,0 @@ -import * as React from 'react'; -import Alert from '@mui/material/Alert'; -import Box from '@mui/material/Box'; -import Snackbar from '@mui/material/Snackbar'; -import { ChatConfirmation } from '@mui/x-chat'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - DividerLabel, - TextControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const CLASS_DEFS = [ - { name: 'root', description: 'The confirmation card.' }, - { - name: 'icon', - selector: '.MuiChatConfirmation-icon', - description: 'The warning icon container.', - }, - { - name: 'message', - selector: '.MuiChatConfirmation-message', - description: 'The message paragraph.', - }, - { - name: 'actions', - selector: '.MuiChatConfirmation-actions', - description: 'The button row.', - }, - { - name: 'confirmButton', - selector: '.MuiChatConfirmation-confirmButton', - description: 'The primary confirm button.', - }, - { - name: 'cancelButton', - selector: '.MuiChatConfirmation-cancelButton', - description: 'The cancel button.', - }, -]; - -export default function ChatConfirmationPlayground() { - const [message, setMessage] = React.useState( - 'The assistant wants to delete 3 files. Approve this action?', - ); - const [confirmLabel, setConfirmLabel] = React.useState('Allow'); - const [cancelLabel, setCancelLabel] = React.useState('Deny'); - const [resolution, setResolution] = React.useState(null); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const cardSx = classesCustomizations.toClassesSx(); - - return ( - - props - - - - - } - preview={ - - setResolution('confirm')} - onCancel={() => setResolution('cancel')} - sx={cardSx} - /> - setResolution(null)} - > - setResolution(null)} - > - {resolution === 'confirm' ? 'onConfirm fired' : 'onCancel fired'} - - - - } - /> - ); -} diff --git a/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.js b/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.js deleted file mode 100644 index ffa22f52a4750..0000000000000 --- a/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.js +++ /dev/null @@ -1,145 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; - -import { demoUsers } from 'docs/data/chat/core/examples/shared/demoData'; -import { createChunkStream } from 'docs/data/chat/core/examples/shared/demoUtils'; - -const CONVERSATION_ID = 'tool-approval'; - -function createToolApprovalAdapter() { - let onEventRef = null; - let pendingMessage = null; - - return { - async sendMessage() { - const messageId = 'assistant-approval'; - const textId = 'assistant-approval-text'; - const toolCallId = 'cleanup-1'; - - pendingMessage = { - id: messageId, - conversationId: CONVERSATION_ID, - role: 'assistant', - author: demoUsers.agent, - status: 'sent', - parts: [ - { - type: 'text', - text: 'I need approval before deleting these files.', - }, - { - type: 'dynamic-tool', - toolInvocation: { - toolCallId, - toolName: 'delete_files', - state: 'approval-requested', - input: { path: '/tmp/cache', recursive: true }, - approvalId: 'approval-1', - }, - }, - ], - }; - - return createChunkStream( - [ - { type: 'start', messageId, author: demoUsers.agent }, - { type: 'text-start', id: textId }, - { - type: 'text-delta', - id: textId, - delta: 'I need approval before deleting these files.', - }, - { type: 'text-end', id: textId }, - { - type: 'tool-approval-request', - toolCallId, - toolName: 'delete_files', - input: { path: '/tmp/cache', recursive: true }, - // The optional approval id is round-tripped: the built-in widget - // responds with it, and the controller matches the invocation by it. - approvalId: 'approval-1', - dynamic: true, - }, - { type: 'finish', messageId, finishReason: 'tool-call' }, - ], - { delayMs: 240 }, - ); - }, - subscribe({ onEvent }) { - onEventRef = onEvent; - return () => { - onEventRef = null; - }; - }, - async addToolApprovalResponse({ approved, reason }) { - if (!pendingMessage) { - return; - } - - // 1. Move the tool invocation to its terminal state. - onEventRef?.({ - type: 'message-updated', - message: { - ...pendingMessage, - parts: [ - pendingMessage.parts[0], - { - type: 'dynamic-tool', - toolInvocation: { - toolCallId: 'cleanup-1', - toolName: 'delete_files', - state: approved ? 'output-available' : 'output-denied', - input: { path: '/tmp/cache', recursive: true }, - approvalId: 'approval-1', - approval: { approved, reason }, - output: approved ? { deleted: 3 } : undefined, - }, - }, - ], - }, - }); - - // 2. Emit a follow-up assistant message after a short delay. - setTimeout(() => { - onEventRef?.({ - type: 'message-added', - message: { - id: 'assistant-followup', - conversationId: CONVERSATION_ID, - role: 'assistant', - author: demoUsers.agent, - status: 'sent', - parts: [ - { - type: 'text', - text: approved - ? 'Deleted 3 files.' - : "Okay, I won't delete anything.", - }, - ], - }, - }); - }, 400); - }, - }; -} - -export default function ToolApprovalFlow() { - const adapter = React.useMemo(() => createToolApprovalAdapter(), []); - - return ( - - ); -} diff --git a/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.tsx.preview b/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.tsx.preview deleted file mode 100644 index ec0207c5b981d..0000000000000 --- a/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/ai-and-agents/tool-approval/ChatConfirmationPlayground.tsx b/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/ChatConfirmationPlayground.tsx similarity index 93% rename from docs/data/chat/ai-and-agents/tool-approval/ChatConfirmationPlayground.tsx rename to docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/ChatConfirmationPlayground.tsx index d6822a8dc5d06..465be8bd45523 100644 --- a/docs/data/chat/ai-and-agents/tool-approval/ChatConfirmationPlayground.tsx +++ b/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/ChatConfirmationPlayground.tsx @@ -8,10 +8,8 @@ import { DividerLabel, TextControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; type ClassKey = 'root' | 'icon' | 'message' | 'actions' | 'confirmButton' | 'cancelButton'; @@ -46,6 +44,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatConfirmationPlayground() { + // @focus-start @padding 1 const [message, setMessage] = React.useState( 'The assistant wants to delete 3 files. Approve this action?', ); @@ -115,4 +114,5 @@ export default function ChatConfirmationPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/client.ts b/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/index.ts b/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/index.ts new file mode 100644 index 0000000000000..6c42b5c2fe7e0 --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-approval/demos/chat-confirmation-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatConfirmationPlayground from './ChatConfirmationPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatConfirmationPlayground, { ClientProvider }); diff --git a/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.tsx b/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/ToolApprovalFlow.tsx similarity index 98% rename from docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.tsx rename to docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/ToolApprovalFlow.tsx index 269a09633ed4d..45973bdd6adfe 100644 --- a/docs/data/chat/ai-and-agents/tool-approval/ToolApprovalFlow.tsx +++ b/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/ToolApprovalFlow.tsx @@ -130,6 +130,7 @@ function createToolApprovalAdapter(): ChatAdapter { } export default function ToolApprovalFlow() { + // @focus-start @padding 1 const adapter = React.useMemo(() => createToolApprovalAdapter(), []); return ( @@ -146,4 +147,5 @@ export default function ToolApprovalFlow() { }} /> ); + // @focus-end } diff --git a/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/client.ts b/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/index.ts b/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/index.ts new file mode 100644 index 0000000000000..4d117c0b59f3f --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-approval/demos/tool-approval-flow/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ToolApprovalFlow from './ToolApprovalFlow'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ToolApprovalFlow, { ClientProvider }); diff --git a/docs/data/chat/ai-and-agents/tool-approval/tool-approval.md b/docs/data/chat/ai-and-agents/tool-approval/tool-approval.md index 217f222be73d3..6904c241217cc 100644 --- a/docs/data/chat/ai-and-agents/tool-approval/tool-approval.md +++ b/docs/data/chat/ai-and-agents/tool-approval/tool-approval.md @@ -33,7 +33,7 @@ The stream pauses at `approval-requested` until your UI calls `addToolApprovalRe Send the suggested prompt; the stream pauses at `approval-requested` until you approve or deny the call. -{{"demo": "ToolApprovalFlow.js", "bg": "inline"}} +{{"component": "file://./demos/tool-approval-flow/index.ts", "bg": "inline"}} ## Triggering an approval request @@ -126,7 +126,7 @@ import { ChatConfirmation } from '@mui/x-chat'; Preview the `ChatConfirmation` UI in different states: -{{"demo": "ChatConfirmationPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-confirmation-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Custom labels diff --git a/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.js b/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.js deleted file mode 100644 index 62044760edd78..0000000000000 --- a/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.js +++ /dev/null @@ -1,137 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Card from '@mui/material/Card'; -import CardContent from '@mui/material/CardContent'; -import Chip from '@mui/material/Chip'; -import CircularProgress from '@mui/material/CircularProgress'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { ChatBox } from '@mui/x-chat'; - -import { - createChunkStream, - randomId, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -// --- ToolCard: the complete implementation referenced from the docs ---------- - -const stateColor = { - 'input-streaming': 'info', - 'input-available': 'info', - 'approval-requested': 'warning', - 'approval-responded': 'warning', - 'output-available': 'success', - 'output-error': 'error', - 'output-denied': 'error', -}; - -function ToolCard({ invocation }) { - const isWorking = - invocation.state === 'input-streaming' || invocation.state === 'input-available'; - - return ( - - - - {isWorking && } - - {invocation.toolName} - - - - - {invocation.input != null && ( - - {JSON.stringify(invocation.input, null, 2)} - - )} - - {invocation.state === 'output-available' && invocation.output != null && ( - - {JSON.stringify(invocation.output, null, 2)} - - )} - - {invocation.state === 'output-error' && invocation.errorText && ( - - {invocation.errorText} - - )} - - - ); -} - -const partRenderers = { - tool: ({ part }) => , - 'dynamic-tool': ({ part }) => , -}; - -// --- Scripted tool-call stream ----------------------------------------------- - -function createWeatherChunks(messageId) { - const textId = `${messageId}-intro`; - const outroId = `${messageId}-outro`; - const toolCallId = `${messageId}-call`; - - return [ - { type: 'start', messageId }, - { type: 'text-start', id: textId }, - { type: 'text-delta', id: textId, delta: 'Let me check the weather in Paris.' }, - { type: 'text-end', id: textId }, - { type: 'tool-input-start', toolCallId, toolName: 'get_weather', dynamic: true }, - { type: 'tool-input-delta', toolCallId, inputTextDelta: '{"city":' }, - { type: 'tool-input-delta', toolCallId, inputTextDelta: '"Paris"}' }, - { - type: 'tool-input-available', - toolCallId, - toolName: 'get_weather', - input: { city: 'Paris' }, - dynamic: true, - }, - { - type: 'tool-output-available', - toolCallId, - output: { temperature: 22, condition: 'sunny' }, - }, - { type: 'text-start', id: outroId }, - { type: 'text-delta', id: outroId, delta: "It's 22°C and sunny in Paris." }, - { type: 'text-end', id: outroId }, - { type: 'finish', messageId }, - ]; -} - -// --- Component --------------------------------------------------------------- - -export default function ToolCallingLifecycle() { - const adapter = React.useMemo( - () => ({ - async sendMessage() { - return createChunkStream(createWeatherChunks(randomId()), { delayMs: 500 }); - }, - }), - [], - ); - - return ( - - ); -} diff --git a/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.tsx.preview b/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.tsx.preview deleted file mode 100644 index d67eeccb35dfc..0000000000000 --- a/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/ai-and-agents/tool-calling/ToolCardExpansionPlayground.js b/docs/data/chat/ai-and-agents/tool-calling/ToolCardExpansionPlayground.js deleted file mode 100644 index 5d8bb66f7f93a..0000000000000 --- a/docs/data/chat/ai-and-agents/tool-calling/ToolCardExpansionPlayground.js +++ /dev/null @@ -1,203 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, -} from '@mui/x-chat'; -import { useChatStore } from '@mui/x-chat/headless'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - DividerLabel, - SelectControl, - SwitchControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -// Docs-build-specific: every demo compiles in one TS project, so this augmentation -// registers the `write` tool's typed input/output on the shared `ChatToolDefinitionMap`. - -const conversation = { - id: 'tool-expansion-playground', - title: 'Tool card expansion', - participants: [users.me, users.assistant], -}; - -const MESSAGE_ID = 'tool-expansion-demo'; - -// Builds the `write` tool invocation for a given lifecycle state so stepping the -// `state` control drives a real transition on the same card. -function buildInvocation(state) { - const input = { - path: 'src/App.tsx', - contents: 'export const App = () =>
Hello
;\n', - }; - const base = { - toolCallId: 'write-call', - toolName: 'write', - title: 'write', - }; - if (state === 'output-available') { - return { ...base, state, input, output: { bytesWritten: 48, ok: true } }; - } - if (state === 'output-error') { - return { ...base, state, input, errorText: 'EACCES: permission denied' }; - } - return { ...base, state, input }; -} - -// Stable seed so `ScopedChat` does not remount when the controls change — the -// transitions are driven through the store by `ToolStateEffect` instead. -const SEED_MESSAGE = { - id: MESSAGE_ID, - conversationId: conversation.id, - role: 'assistant', - author: users.assistant, - createdAt: '2026-05-03T09:30:00.000Z', - status: 'streaming', - parts: [{ type: 'tool', toolInvocation: buildInvocation('input-streaming') }], -}; - -// Each preset is a single `defaultExpanded` value for the `write` tool — the value -// passed to the component below. The displayed snippet is derived from it (see -// `formatDefaultExpanded`), so there is no separate code string to keep in sync. -const PRESETS = { - 'Built-in default': undefined, - 'Expand while running, collapse when done': { - write: (ownerState) => - ownerState.section - ? undefined - : ownerState.state === 'input-streaming' || - ownerState.state === 'input-available', - }, - 'Open while the message streams': { - write: (ownerState) => - ownerState.section ? undefined : ownerState.isMessageStreaming, - }, - 'Always expanded': { write: true }, - Collapsed: { write: false }, -}; - -// Renders the selected preset as the JSX a consumer would write, derived from the -// live `defaultExpanded` value (resolvers via `Function.prototype.toString`). -function formatDefaultExpanded(value) { - if (!value) { - return '// no defaultExpanded — the package default is used'; - } - const entries = Object.entries(value).map(([tool, expand]) => { - const rendered = - typeof expand === 'function' ? expand.toString() : String(expand); - return ` ${tool}: ${rendered},`; - }); - return `defaultExpanded={{\n${entries.join('\n')}\n}}`; -} - -const DEFAULTS = { - preset: 'Expand while running, collapse when done', - state: 'input-available', - streaming: true, -}; - -// Syncs the `state`/`streaming` controls into the store on the seeded message so the -// card sees genuine lifecycle transitions (same element identity, no remount). -function ToolStateEffect({ state, streaming }) { - const store = useChatStore(); - React.useEffect(() => { - store.updateMessage(MESSAGE_ID, { - status: streaming ? 'streaming' : 'sent', - parts: [{ type: 'tool', toolInvocation: buildInvocation(state) }], - }); - }, [store, state, streaming]); - return null; -} - -export default function ToolCardExpansionPlayground() { - const [preset, setPreset] = React.useState(DEFAULTS.preset); - const [state, setState] = React.useState(DEFAULTS.state); - const [streaming, setStreaming] = React.useState(DEFAULTS.streaming); - - const handleReset = React.useCallback(() => { - setPreset(DEFAULTS.preset); - setState(DEFAULTS.state); - setStreaming(DEFAULTS.streaming); - }, []); - - const defaultExpanded = PRESETS[preset]; - - return ( - - partProps.tool.defaultExpanded - ({ - value, - }))} - onChange={setPreset} - helperText="Each preset maps to a defaultExpanded entry for the write tool." - /> - - theme.typography.fontFamilyCode ?? 'Menlo, monospace', - }} - > - {formatDefaultExpanded(defaultExpanded)} - - fixture (tool lifecycle) - - - - } - preview={ - - - - - - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.tsx b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/ToolCallingLifecycle.tsx similarity index 99% rename from docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.tsx rename to docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/ToolCallingLifecycle.tsx index 5ec01c5a3bb1e..5745f03b78efc 100644 --- a/docs/data/chat/ai-and-agents/tool-calling/ToolCallingLifecycle.tsx +++ b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/ToolCallingLifecycle.tsx @@ -131,6 +131,7 @@ function createWeatherChunks(messageId: string): ChatMessageChunk[] { // --- Component --------------------------------------------------------------- export default function ToolCallingLifecycle() { + // @focus-start @padding 1 const adapter = React.useMemo( () => ({ async sendMessage() { @@ -153,4 +154,5 @@ export default function ToolCallingLifecycle() { }} /> ); + // @focus-end } diff --git a/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/client.ts b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/index.ts b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/index.ts new file mode 100644 index 0000000000000..ed70d7b4b0895 --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-calling-lifecycle/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ToolCallingLifecycle from './ToolCallingLifecycle'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ToolCallingLifecycle, { ClientProvider }); diff --git a/docs/data/chat/ai-and-agents/tool-calling/ToolCardExpansionPlayground.tsx b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/ToolCardExpansionPlayground.tsx similarity index 97% rename from docs/data/chat/ai-and-agents/tool-calling/ToolCardExpansionPlayground.tsx rename to docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/ToolCardExpansionPlayground.tsx index 3b6ca676ecdf8..7a8aa21938ec7 100644 --- a/docs/data/chat/ai-and-agents/tool-calling/ToolCardExpansionPlayground.tsx +++ b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/ToolCardExpansionPlayground.tsx @@ -6,13 +6,13 @@ import { ChatMessageContent, ChatMessageGroup, } from '@mui/x-chat'; -import { - useChatStore, - type ChatConversation, - type ChatMessage, - type ChatToolExpand, - type ChatToolInvocation, - type ChatToolInvocationState, +import { useChatStore } from '@mui/x-chat/headless'; +import type { + ChatConversation, + ChatMessage, + ChatToolExpand, + ChatToolInvocation, + ChatToolInvocationState, } from '@mui/x-chat/headless'; import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; @@ -140,6 +140,7 @@ function ToolStateEffect({ } export default function ToolCardExpansionPlayground() { + // @focus-start @padding 1 const [preset, setPreset] = React.useState(DEFAULTS.preset); const [state, setState] = React.useState(DEFAULTS.state); const [streaming, setStreaming] = React.useState(DEFAULTS.streaming); @@ -226,4 +227,5 @@ export default function ToolCardExpansionPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/client.ts b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/index.ts b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/index.ts new file mode 100644 index 0000000000000..1ea4bf626b11c --- /dev/null +++ b/docs/data/chat/ai-and-agents/tool-calling/demos/tool-card-expansion-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ToolCardExpansionPlayground from './ToolCardExpansionPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ToolCardExpansionPlayground, { ClientProvider }); diff --git a/docs/data/chat/ai-and-agents/tool-calling/tool-calling.md b/docs/data/chat/ai-and-agents/tool-calling/tool-calling.md index c3f8d155f74ae..35b7eb7cd9ff1 100644 --- a/docs/data/chat/ai-and-agents/tool-calling/tool-calling.md +++ b/docs/data/chat/ai-and-agents/tool-calling/tool-calling.md @@ -17,7 +17,7 @@ The runtime tracks the full tool lifecycle through the streaming chunk protocol The demo below streams a `get_weather` tool call through `input-streaming` → `input-available` → `output-available` and renders each stage with a custom tool card: -{{"demo": "ToolCallingLifecycle.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/tool-calling-lifecycle/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Tool message part structure @@ -358,7 +358,7 @@ defaultExpanded={{ The playground below maps a few common policies to presets — pick one, then step the tool state and toggle message streaming to watch the card respond: -{{"demo": "ToolCardExpansionPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/tool-card-expansion-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## See also diff --git a/docs/data/chat/backend/adapters/MinimalAdapterDemo.js b/docs/data/chat/backend/adapters/MinimalAdapterDemo.js deleted file mode 100644 index f262f82ec955a..0000000000000 --- a/docs/data/chat/backend/adapters/MinimalAdapterDemo.js +++ /dev/null @@ -1,91 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; -import { - minimalConversation, - minimalMessages, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; -import { randomId } from 'docs/data/chat/core/examples/shared/demoUtils'; - -function splitIntoDeltas(text, size = 15) { - const pieces = []; - for (let index = 0; index < text.length; index += size) { - pieces.push(text.slice(index, index + size)); - } - return pieces; -} - -// Minimal adapter — sendMessage is the only required method. -const adapter = { - async sendMessage({ signal }) { - const messageId = randomId(); - const textId = randomId(); - const reply = - 'This reply is hand-rolled from the documented chunk shapes: a start chunk, ' + - 'a text-start, several text-delta chunks, a text-end, and a finish chunk. ' + - 'Press stop mid-stream to see the abort signal honored.'; - - // Build the full chunk sequence up front, then emit it one chunk at a time. - const chunks = [ - { type: 'start', messageId, author: demoUsers.agent }, - { type: 'text-start', id: textId }, - ...splitIntoDeltas(reply).map((delta) => ({ - type: 'text-delta', - id: textId, - delta, - })), - { type: 'text-end', id: textId }, - { type: 'finish', messageId }, - ]; - - return new ReadableStream({ - start(controller) { - let index = 0; - let timer; - - const stop = () => { - // On abort, stop enqueuing and close the stream cleanly. - clearTimeout(timer); - signal.removeEventListener('abort', stop); - try { - controller.close(); - } catch { - // Already closed by the consumer; ignore. - } - }; - - const emitNext = () => { - if (signal.aborted || index >= chunks.length) { - stop(); - return; - } - controller.enqueue(chunks[index]); - index += 1; - // ~80ms apart so the bubble visibly grows delta-by-delta. - timer = setTimeout(emitNext, 80); - }; - - signal.addEventListener('abort', stop, { once: true }); - emitNext(); - }, - }); - }, -}; - -export default function MinimalAdapterDemo() { - return ( - - ); -} diff --git a/docs/data/chat/backend/adapters/MinimalAdapterDemo.tsx.preview b/docs/data/chat/backend/adapters/MinimalAdapterDemo.tsx.preview deleted file mode 100644 index b5370bb42b897..0000000000000 --- a/docs/data/chat/backend/adapters/MinimalAdapterDemo.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/backend/adapters/adapters.md b/docs/data/chat/backend/adapters/adapters.md index 4c6bdcee3c73c..62cc49dd5a3b6 100644 --- a/docs/data/chat/backend/adapters/adapters.md +++ b/docs/data/chat/backend/adapters/adapters.md @@ -110,7 +110,7 @@ For the full chunk type reference, see [Streaming](/x/react-chat/behavior/stream Here is the same protocol running live — type a message and watch the chunks arrive: -{{"demo": "MinimalAdapterDemo.js", "bg": "inline"}} +{{"component": "file://./demos/minimal-adapter-demo/index.ts", "bg": "inline"}} ### Abort signal diff --git a/docs/data/chat/backend/adapters/MinimalAdapterDemo.tsx b/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/MinimalAdapterDemo.tsx similarity index 98% rename from docs/data/chat/backend/adapters/MinimalAdapterDemo.tsx rename to docs/data/chat/backend/adapters/demos/minimal-adapter-demo/MinimalAdapterDemo.tsx index cedc4e88cd620..3e5ca448e3177 100644 --- a/docs/data/chat/backend/adapters/MinimalAdapterDemo.tsx +++ b/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/MinimalAdapterDemo.tsx @@ -76,6 +76,7 @@ const adapter: ChatAdapter = { export default function MinimalAdapterDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/client.ts b/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/index.ts b/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/index.ts new file mode 100644 index 0000000000000..2db70bf8fabb9 --- /dev/null +++ b/docs/data/chat/backend/adapters/demos/minimal-adapter-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MinimalAdapterDemo from './MinimalAdapterDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MinimalAdapterDemo, { ClientProvider }); diff --git a/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.js b/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.js deleted file mode 100644 index 31b04ed13e2c3..0000000000000 --- a/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.js +++ /dev/null @@ -1,112 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; -import { useChat } from '@mui/x-chat/headless'; - -import Button from '@mui/material/Button'; - -const CONVERSATION_ID = 'build-adapter-demo'; - -const initialConversations = [{ id: CONVERSATION_ID, title: 'Hand-rolled adapter' }]; - -const initialMessages = [ - { - id: 'welcome', - conversationId: CONVERSATION_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Send a message to watch a hand-built ReadableStream stream the reply. Press Stop mid-stream to see the abort signal in action.', - }, - ], - }, -]; - -const REPLY = - 'Here is a reply streamed one word at a time by a hand-rolled adapter. ' + - 'Each word arrives as its own text-delta chunk. ' + - 'Press Stop at any point to fire the abort signal and halt the stream.'; - -const adapter = { - async sendMessage({ signal }) { - const messageId = `assistant-${Date.now()}`; - const textId = `${messageId}-text`; - const words = REPLY.split(' '); - - return new ReadableStream({ - start(controller) { - controller.enqueue({ type: 'start', messageId }); - controller.enqueue({ type: 'text-start', id: textId }); - - let index = 0; - let closed = false; - - const interval = setInterval(() => { - if (closed) { - return; - } - if (index < words.length) { - const delta = index === 0 ? words[index] : ` ${words[index]}`; - controller.enqueue({ type: 'text-delta', id: textId, delta }); - index += 1; - return; - } - clearInterval(interval); - closed = true; - controller.enqueue({ type: 'text-end', id: textId }); - controller.enqueue({ type: 'finish', messageId }); - controller.close(); - }, 40); - - signal.addEventListener('abort', () => { - if (closed) { - return; - } - clearInterval(interval); - closed = true; - controller.enqueue({ type: 'text-end', id: textId }); - controller.enqueue({ type: 'abort', messageId }); - controller.close(); - }); - }, - }); - }, -}; - -function StopStreamingButton() { - const { isStreaming, stopStreaming } = useChat(); - - return ( - - ); -} - -export default function ManualStreamAdapterDemo() { - return ( - - - - ); -} diff --git a/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.tsx.preview b/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.tsx.preview deleted file mode 100644 index 9d9ca50b01d16..0000000000000 --- a/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/backend/building-an-adapter/building-an-adapter.md b/docs/data/chat/backend/building-an-adapter/building-an-adapter.md index 3d50fc788777e..254aa167d5b54 100644 --- a/docs/data/chat/backend/building-an-adapter/building-an-adapter.md +++ b/docs/data/chat/backend/building-an-adapter/building-an-adapter.md @@ -142,7 +142,7 @@ stop() { The following demo combines Steps 2 and 3: a hand-rolled adapter that streams a canned reply chunk by chunk. `ChatBox` does not render a stop button of its own, so the demo adds one with the headless `stopStreaming()` action — pressing it mid-stream fires the abort signal. -{{"demo": "ManualStreamAdapterDemo.js"}} +{{"component": "file://./demos/manual-stream-adapter-demo/index.ts"}} ## Step 4: Adding message history diff --git a/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.tsx b/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/ManualStreamAdapterDemo.tsx similarity index 98% rename from docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.tsx rename to docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/ManualStreamAdapterDemo.tsx index 60703e1caa5ab..0db7c2610131f 100644 --- a/docs/data/chat/backend/building-an-adapter/ManualStreamAdapterDemo.tsx +++ b/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/ManualStreamAdapterDemo.tsx @@ -93,6 +93,7 @@ function StopStreamingButton() { export default function ManualStreamAdapterDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/client.ts b/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/index.ts b/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/index.ts new file mode 100644 index 0000000000000..a528d9f1d1ddb --- /dev/null +++ b/docs/data/chat/backend/building-an-adapter/demos/manual-stream-adapter-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ManualStreamAdapterDemo from './ManualStreamAdapterDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ManualStreamAdapterDemo, { ClientProvider }); diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.js b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.js deleted file mode 100644 index d22f5fe8ecd05..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.js +++ /dev/null @@ -1,92 +0,0 @@ -'use client'; -import { ChatBox } from '@mui/x-chat'; -import { createAiSdkAdapter } from '@mui/x-chat/headless'; - -const CONVERSATION_ID = 'ai-sdk-mock'; - -const initialConversations = [{ id: CONVERSATION_ID, title: 'Mock stream' }]; - -const initialMessages = [ - { - id: 'welcome', - conversationId: CONVERSATION_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Type anything — I stream the reply back word by word, like the AI SDK UI Message Stream.', - }, - ], - }, -]; - -function getMessageText(message) { - return message.parts - .map((part) => (part.type === 'text' ? part.text : '')) - .join(''); -} - -function replyFor(message) { - const text = getMessageText(message).trim() || 'nothing'; - return `You said: «${text}» — this reply was streamed as AI SDK UI-message chunks, no \`ai\` package involved.`; -} - -// Builds a ReadableStream of AI SDK UI Message Stream chunks, enqueuing one -// `text-delta` per word on a timer so the reply streams in visibly. The -// `start`/`finish` chunks deliberately omit `messageId`, exercising the -// adapter's synthetic-ID path. -function buildMockUiMessageStream(text) { - const words = text.split(' '); - let index = 0; - let timer; - - return new ReadableStream({ - start(controller) { - controller.enqueue({ type: 'start' }); - controller.enqueue({ type: 'text-start', id: 'reply-text' }); - - const pushWord = () => { - if (index >= words.length) { - controller.enqueue({ type: 'text-end', id: 'reply-text' }); - controller.enqueue({ type: 'finish' }); - controller.close(); - return; - } - const delta = index === 0 ? words[index] : ` ${words[index]}`; - controller.enqueue({ type: 'text-delta', id: 'reply-text', delta }); - index += 1; - timer = setTimeout(pushWord, 40); - }; - - timer = setTimeout(pushWord, 40); - }, - cancel() { - if (timer) { - clearTimeout(timer); - } - }, - }); -} - -const adapter = createAiSdkAdapter({ - stream: ({ message }) => buildMockUiMessageStream(replyFor(message)), -}); - -export default function AiSdkMockStreamDemo() { - return ( - - ); -} diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.tsx.preview b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.tsx.preview deleted file mode 100644 index 03e3272d52d03..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.js b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.js deleted file mode 100644 index 401c46aec4a9f..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.js +++ /dev/null @@ -1,67 +0,0 @@ -'use client'; -import { ChatBox } from '@mui/x-chat'; -import { createAiSdkAdapter } from '@mui/x-chat/headless'; - -const CONVERSATION_ID = 'mui-docs'; - -const initialConversations = [{ id: CONVERSATION_ID, title: 'MUI docs assistant' }]; - -const initialMessages = [ - { - id: 'welcome', - conversationId: CONVERSATION_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Hi! Ask me anything about Material UI, MUI X Data Grid, Date Pickers, Charts, Tree View, Scheduler, or Chat.', - }, - ], - }, -]; - -function toPlainMessages(messages) { - return messages.map((message) => ({ - role: message.role, - content: message.parts - .map((part) => (part.type === 'text' ? part.text : '')) - .join(''), - })); -} - -const adapter = createAiSdkAdapter({ - stream: async ({ messages, signal }) => { - const response = await fetch( - 'https://backend.mui.com/public/docs-assistant/chat', - { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ messages: toPlainMessages(messages) }), - signal, - }, - ); - if (!response.ok || !response.body) { - throw new Error(`Docs assistant unavailable (HTTP ${response.status})`); - } - return response.body; - }, -}); - -export default function MuiDocsAssistantDemo() { - return ( - - ); -} diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.tsx.preview b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.tsx.preview deleted file mode 100644 index 263c8c714a88f..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/ai-sdk-adapter.md b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/ai-sdk-adapter.md index 558d57881e729..3534364f4340c 100644 --- a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/ai-sdk-adapter.md +++ b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/ai-sdk-adapter.md @@ -21,7 +21,7 @@ Use this adapter when your backend speaks the AI SDK's UI Message Stream; for pr The demo below talks to a live MUI documentation assistant served using AI SDK. Ask it anything about Material UI or MUI X—it streams text and reasoning back through the adapter. -{{"demo": "MuiDocsAssistantDemo.js", "defaultCodeOpen": true, "bg": "inline"}} +{{"component": "file://./demos/mui-docs-assistant-demo/index.ts", "bg": "inline", "initialExpanded": true}} :::warning The MUI docs assistant endpoint is rate-limited to 20 requests per window for fair public usage. @@ -106,7 +106,7 @@ Don't call this from a browser component with raw API keys—those keys would sh The demo below simulates `toUIMessageStream()` with a hand-built object stream, so you can watch the token-by-token flow without any backend: -{{"demo": "AiSdkMockStreamDemo.js", "bg": "inline"}} +{{"component": "file://./demos/ai-sdk-mock-stream-demo/index.ts", "bg": "inline"}} ## Pattern C: Sharing state with `useChat` diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.tsx b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/AiSdkMockStreamDemo.tsx similarity index 98% rename from docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.tsx rename to docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/AiSdkMockStreamDemo.tsx index 942fea8fefd43..135aaf6055fff 100644 --- a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/AiSdkMockStreamDemo.tsx +++ b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/AiSdkMockStreamDemo.tsx @@ -78,6 +78,7 @@ const adapter = createAiSdkAdapter({ export default function AiSdkMockStreamDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/client.ts b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/index.ts b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/index.ts new file mode 100644 index 0000000000000..cc09f5912b88d --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/ai-sdk-mock-stream-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AiSdkMockStreamDemo from './AiSdkMockStreamDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AiSdkMockStreamDemo, { ClientProvider }); diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.tsx b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/MuiDocsAssistantDemo.tsx similarity index 97% rename from docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.tsx rename to docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/MuiDocsAssistantDemo.tsx index dc037ae389c23..117c2c692c3ac 100644 --- a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/MuiDocsAssistantDemo.tsx +++ b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/MuiDocsAssistantDemo.tsx @@ -51,6 +51,7 @@ const adapter = createAiSdkAdapter({ export default function MuiDocsAssistantDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/client.ts b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/index.ts b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/index.ts new file mode 100644 index 0000000000000..a77897dfce2d0 --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/ai-sdk-adapter/demos/mui-docs-assistant-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MuiDocsAssistantDemo from './MuiDocsAssistantDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MuiDocsAssistantDemo, { ClientProvider }); diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.js b/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.js deleted file mode 100644 index 0ffb45ed78fc6..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.js +++ /dev/null @@ -1,52 +0,0 @@ -'use client'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from '@mui/x-chat/headless'; - -const CONVERSATION_ID = 'canned-demo'; - -const initialConversations = [{ id: CONVERSATION_ID, title: 'Canned replies' }]; - -const initialMessages = [ - { - id: 'welcome', - conversationId: CONVERSATION_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Try asking about "pricing" or "support".', - }, - ], - }, -]; - -const adapter = createEchoAdapter({ - respond: (text) => { - const input = text.toLowerCase(); - if (input.includes('pricing')) { - return 'Plans start at $0 — the echo tier is free forever.'; - } - if (input.includes('support')) { - return 'Support is instant: I only ever talk to you.'; - } - return `I only know about "pricing" and "support", but you said: "${text}".`; - }, -}); - -export default function EchoAdapterCannedReplies() { - return ( - - ); -} diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.tsx.preview b/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.tsx.preview deleted file mode 100644 index 6bccfce765ffc..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.js b/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.js deleted file mode 100644 index 95712a8cda118..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.js +++ /dev/null @@ -1,43 +0,0 @@ -'use client'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from '@mui/x-chat/headless'; - -const CONVERSATION_ID = 'echo-demo'; - -const initialConversations = [{ id: CONVERSATION_ID, title: 'Echo' }]; - -const initialMessages = [ - { - id: 'welcome', - conversationId: CONVERSATION_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Type anything — I echo it back with a small delay.', - }, - ], - }, -]; - -const adapter = createEchoAdapter({ - respond: (text) => `You typed: "${text || 'nothing'}".`, -}); - -export default function EchoAdapterDemo() { - return ( - - ); -} diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.tsx.preview b/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.tsx.preview deleted file mode 100644 index 6bccfce765ffc..0000000000000 --- a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.tsx.preview +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.tsx b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/EchoAdapterCannedReplies.tsx similarity index 96% rename from docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.tsx rename to docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/EchoAdapterCannedReplies.tsx index 00464b11f6118..db3d8c29a9b54 100644 --- a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterCannedReplies.tsx +++ b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/EchoAdapterCannedReplies.tsx @@ -36,6 +36,7 @@ const adapter = createEchoAdapter({ export default function EchoAdapterCannedReplies() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/client.ts b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/index.ts b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/index.ts new file mode 100644 index 0000000000000..f0dbb3af52744 --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-canned-replies/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import EchoAdapterCannedReplies from './EchoAdapterCannedReplies'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, EchoAdapterCannedReplies, { ClientProvider }); diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.tsx b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/EchoAdapterDemo.tsx similarity index 95% rename from docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.tsx rename to docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/EchoAdapterDemo.tsx index b68dd622e241e..e8e9827bc7645 100644 --- a/docs/data/chat/backend/built-in-adapters/echo-adapter/EchoAdapterDemo.tsx +++ b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/EchoAdapterDemo.tsx @@ -27,6 +27,7 @@ const adapter = createEchoAdapter({ export default function EchoAdapterDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/client.ts b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/index.ts b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/index.ts new file mode 100644 index 0000000000000..4828b8ef644c1 --- /dev/null +++ b/docs/data/chat/backend/built-in-adapters/echo-adapter/demos/echo-adapter-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import EchoAdapterDemo from './EchoAdapterDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, EchoAdapterDemo, { ClientProvider }); diff --git a/docs/data/chat/backend/built-in-adapters/echo-adapter/echo-adapter.md b/docs/data/chat/backend/built-in-adapters/echo-adapter/echo-adapter.md index 6a97bef6037bc..d098d8bdc3cbe 100644 --- a/docs/data/chat/backend/built-in-adapters/echo-adapter/echo-adapter.md +++ b/docs/data/chat/backend/built-in-adapters/echo-adapter/echo-adapter.md @@ -16,7 +16,7 @@ githubLabel: 'scope: chat' The adapter below echoes whatever you type after the default 400 ms simulated network delay. The reply arrives as a single text chunk once the delay elapses — the Echo adapter doesn't simulate token-by-token streaming. For real streamed output, swap in [`createAiSdkAdapter`](/x/react-chat/backend/built-in-adapters/ai-sdk-adapter/). -{{"demo": "EchoAdapterDemo.js", "defaultCodeOpen": true, "bg": "inline"}} +{{"component": "file://./demos/echo-adapter-demo/index.ts", "bg": "inline", "initialExpanded": true}} ## Usage @@ -35,7 +35,7 @@ const adapter = createEchoAdapter({ Return different replies based on the input to script deterministic flows for demos and tests: -{{"demo": "EchoAdapterCannedReplies.js", "bg": "inline"}} +{{"component": "file://./demos/echo-adapter-canned-replies/index.ts", "bg": "inline"}} ## Options diff --git a/docs/data/chat/backend/controlled-state/ControlledActiveConversation.js b/docs/data/chat/backend/controlled-state/ControlledActiveConversation.js deleted file mode 100644 index 282eacec94ad6..0000000000000 --- a/docs/data/chat/backend/controlled-state/ControlledActiveConversation.js +++ /dev/null @@ -1,143 +0,0 @@ -'use client'; -import * as React from 'react'; -import SendIcon from '@mui/icons-material/Send'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { - ChatComposer, - ChatComposerSendButton, - ChatComposerTextArea, - ChatComposerToolbar, - ChatConversation, - ChatConversationList, - ChatMessageList, -} from '@mui/x-chat'; -import { ChatProvider, createEchoAdapter } from '@mui/x-chat/headless'; - -const BILLING_ID = 'conv-billing'; -const ONBOARDING_ID = 'conv-onboarding'; - -const adapter = createEchoAdapter({ - respond: (text) => - `You said: "${text || 'nothing'}". The runtime still works under a controlled model.`, -}); - -const initialConversations = [ - { id: BILLING_ID, title: 'Billing' }, - { id: ONBOARDING_ID, title: 'Onboarding' }, -]; - -const initialMessages = [ - { - id: 'billing-1', - conversationId: BILLING_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Welcome to billing support. How can I help with your invoice?', - }, - ], - }, - { - id: 'billing-2', - conversationId: BILLING_ID, - role: 'user', - status: 'sent', - parts: [{ type: 'text', text: 'I was charged twice this month.' }], - }, - { - id: 'onboarding-1', - conversationId: ONBOARDING_ID, - role: 'assistant', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Welcome aboard! Let me walk you through setup.', - }, - ], - }, - { - id: 'onboarding-2', - conversationId: ONBOARDING_ID, - role: 'user', - status: 'sent', - parts: [{ type: 'text', text: 'Where do I add my team members?' }], - }, -]; - -export default function ControlledActiveConversation() { - const [activeId, setActiveId] = React.useState(BILLING_ID); - - return ( - - - { - if (nextId) { - setActiveId(nextId); - } - }} - aria-label="Active conversation" - > - Billing - Onboarding - - - activeConversationId: {activeId ?? 'undefined'} - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/chat/backend/controlled-state/controlled-state.md b/docs/data/chat/backend/controlled-state/controlled-state.md index 83840245beca4..9053515f7dc37 100644 --- a/docs/data/chat/backend/controlled-state/controlled-state.md +++ b/docs/data/chat/backend/controlled-state/controlled-state.md @@ -109,7 +109,7 @@ Switching modes means changing which props your code passes — like other MUI c The demo below controls `activeConversationId` from outside the chat surface — select a conversation with the external buttons, or in the conversation list, and watch the single source of truth stay in sync: -{{"demo": "ControlledActiveConversation.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/controlled-active-conversation/index.ts", "bg": "inline", "collapseToEmpty": true}} ## State model reference @@ -175,7 +175,7 @@ The runtime still handles streaming, normalization, and derived state — you ju Each `ChatProvider` creates an isolated store. To render multiple independent chat surfaces, use separate `ChatBox` instances—each one creates its own provider internally. -{{"demo": "../../material/context/MultipleInstances.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/context/demos/multiple-instances/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Provider props reference diff --git a/docs/data/chat/backend/controlled-state/ControlledActiveConversation.tsx b/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/ControlledActiveConversation.tsx similarity index 98% rename from docs/data/chat/backend/controlled-state/ControlledActiveConversation.tsx rename to docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/ControlledActiveConversation.tsx index 96c87ccefb001..50fcb2d0a6bdd 100644 --- a/docs/data/chat/backend/controlled-state/ControlledActiveConversation.tsx +++ b/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/ControlledActiveConversation.tsx @@ -71,6 +71,7 @@ const initialMessages = [ ]; export default function ControlledActiveConversation() { + // @focus-start @padding 1 const [activeId, setActiveId] = React.useState(BILLING_ID); return ( @@ -140,4 +141,5 @@ export default function ControlledActiveConversation() { ); + // @focus-end } diff --git a/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/client.ts b/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/index.ts b/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/index.ts new file mode 100644 index 0000000000000..8ddbb08b94f3a --- /dev/null +++ b/docs/data/chat/backend/controlled-state/demos/controlled-active-conversation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ControlledActiveConversation from './ControlledActiveConversation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ControlledActiveConversation, { ClientProvider }); diff --git a/docs/data/chat/backend/real-time-adapters/real-time-adapters.md b/docs/data/chat/backend/real-time-adapters/real-time-adapters.md index b8a0373d71b76..7aaa239d52c8d 100644 --- a/docs/data/chat/backend/real-time-adapters/real-time-adapters.md +++ b/docs/data/chat/backend/real-time-adapters/real-time-adapters.md @@ -128,7 +128,7 @@ async markRead({ conversationId, messageId }) { The demo below uses an in-memory adapter whose `subscribe()` hands `onEvent` to the buttons — click them to emit `typing`, `presence`, and `read` events and watch the hooks react. -{{"demo": "../../core/examples/realtime/RealtimeHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../../core/examples/realtime/demos/realtime-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ### Typing indicators diff --git a/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.js b/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.js deleted file mode 100644 index ef1db7fe6c4db..0000000000000 --- a/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.js +++ /dev/null @@ -1,92 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; - -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - createTextMessage, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const CONVERSATION_ID = 'feature-flags-conv'; - -const adapter = createEchoAdapter(); - -const conversations = [ - { - id: CONVERSATION_ID, - title: 'Feature flags', - subtitle: 'dateDivider + unreadMarker enabled', - participants: [demoUsers.you, demoUsers.agent], - readState: 'unread', - unreadCount: 2, - lastMessageAt: '2026-03-15T09:01:00.000Z', - }, -]; - -// The unread marker derives its boundary from the conversation's `unreadCount` -// (boundary = messageCount - unreadCount): with 5 messages and unreadCount 2, -// the marker sits above the 4th message — the first one dated March 15. -const messages = [ - createTextMessage({ - id: 'ff-msg-1', - conversationId: CONVERSATION_ID, - role: 'user', - author: demoUsers.you, - createdAt: '2026-03-14T15:00:00.000Z', - status: 'read', - text: "Can you summarize yesterday's release notes?", - }), - createTextMessage({ - id: 'ff-msg-2', - conversationId: CONVERSATION_ID, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-14T15:00:30.000Z', - status: 'read', - text: 'Sure — the release shipped roving focus, landmarks, and a streaming announcer.', - }), - createTextMessage({ - id: 'ff-msg-3', - conversationId: CONVERSATION_ID, - role: 'user', - author: demoUsers.you, - createdAt: '2026-03-14T15:01:00.000Z', - status: 'read', - text: 'Great, thanks!', - }), - createTextMessage({ - id: 'ff-msg-4', - conversationId: CONVERSATION_ID, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-15T09:00:00.000Z', - text: 'Morning! A new beta is out with the feature flags documented here.', - }), - createTextMessage({ - id: 'ff-msg-5', - conversationId: CONVERSATION_ID, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-15T09:01:00.000Z', - text: 'Toggle dateDivider and unreadMarker to see the separators above.', - }), -]; - -export default function ChatBoxFeatureFlags() { - return ( - - ); -} diff --git a/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.tsx.preview b/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.tsx.preview deleted file mode 100644 index 42bd447b2d1af..0000000000000 --- a/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.tsx.preview +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/basics/chatbox/ChatBoxPlayground.js b/docs/data/chat/basics/chatbox/ChatBoxPlayground.js deleted file mode 100644 index 2da81a8b029b5..0000000000000 --- a/docs/data/chat/basics/chatbox/ChatBoxPlayground.js +++ /dev/null @@ -1,303 +0,0 @@ -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChoiceControl, - DividerLabel, - SwitchControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { - conversations, - initialThreads, - makeAdapter, - sampleSuggestions, - users, -} from 'docs/src/modules/components/chat-playground/data'; - -const DEFAULTS = { - variant: 'default', - density: 'standard', - layoutMode: 'standard', - conversationList: true, - conversationHeader: true, - attachments: true, - suggestions: true, - scrollToBottom: true, - helperText: true, - autoScroll: true, - suggestionsAutoSubmit: false, -}; - -const CLASS_DEFS = [ - { name: 'root', description: 'The outermost ChatBox element.' }, - { - name: 'layout', - selector: '.MuiChatBox-layout', - description: 'The pane layout container.', - }, - { - name: 'threadPane', - selector: '.MuiChatBox-threadPane', - description: 'The active thread column.', - }, - { - name: 'conversationsPane', - selector: '.MuiChatBox-conversationsPane', - description: 'The sidebar listing conversations.', - }, -]; - -function indent(input, prefix) { - return input - .split('\n') - .map((line, idx) => (idx === 0 ? line : `${prefix}${line}`)) - .join('\n'); -} - -export default function ChatBoxPlayground(props = {}) { - const { hideHeader, defaults: defaultsOverride, defaultControlsCollapsed } = props; - const defaults = React.useMemo( - () => ({ ...DEFAULTS, ...defaultsOverride }), - [defaultsOverride], - ); - const [variant, setVariant] = React.useState(defaults.variant); - const [density, setDensity] = React.useState(defaults.density); - const [layoutMode, setLayoutMode] = React.useState(defaults.layoutMode); - const [conversationList, setConversationList] = React.useState( - defaults.conversationList, - ); - const [conversationHeader, setConversationHeader] = React.useState( - defaults.conversationHeader, - ); - const [attachments, setAttachments] = React.useState(defaults.attachments); - const [suggestions, setSuggestions] = React.useState(defaults.suggestions); - const [scrollToBottom, setScrollToBottom] = React.useState( - defaults.scrollToBottom, - ); - const [helperText, setHelperText] = React.useState(defaults.helperText); - const [autoScroll, setAutoScroll] = React.useState(defaults.autoScroll); - const [suggestionsAutoSubmit, setSuggestionsAutoSubmit] = React.useState( - defaults.suggestionsAutoSubmit, - ); - const [activeConversationId, setActiveConversationId] = React.useState( - conversations[0].id, - ); - const classesCustomizations = useCustomizations(CLASS_DEFS); - const threadMapRef = React.useRef(initialThreads); - const adapter = React.useMemo(() => makeAdapter(threadMapRef.current), []); - - const handleReset = React.useCallback(() => { - setVariant(defaults.variant); - setDensity(defaults.density); - setLayoutMode(defaults.layoutMode); - setConversationList(defaults.conversationList); - setConversationHeader(defaults.conversationHeader); - setAttachments(defaults.attachments); - setSuggestions(defaults.suggestions); - setScrollToBottom(defaults.scrollToBottom); - setHelperText(defaults.helperText); - setAutoScroll(defaults.autoScroll); - setSuggestionsAutoSubmit(defaults.suggestionsAutoSubmit); - setActiveConversationId(conversations[0].id); - }, [defaults]); - - const outerSx = React.useMemo( - () => classesCustomizations.toClassesSx({ height: '100%' }), - [classesCustomizations], - ); - - // split / overlay layouts only make sense alongside the conversation list and - // its header, so force them on (and lock the toggles) for those modes. - const layoutRequiresConversation = - layoutMode === 'split' || layoutMode === 'overlay'; - const effectiveConversationList = layoutRequiresConversation || conversationList; - const effectiveConversationHeader = - layoutRequiresConversation || conversationHeader; - const layoutLockHint = layoutRequiresConversation - ? `Required by layoutMode="${layoutMode}".` - : undefined; - - // Without the conversation list there's no UI to pick a conversation, so - // restore the first one whenever the user lands in that state (e.g. after - // a back-click in split mode cleared the selection). - React.useEffect(() => { - if (!effectiveConversationList && !activeConversationId) { - setActiveConversationId(conversations[0].id); - } - }, [effectiveConversationList, activeConversationId]); - - const copyCode = React.useCallback(() => { - const classEntries = Object.keys(classesCustomizations.values) - .filter((key) => classesCustomizations.values[key].trim()) - .map((key) => { - const def = CLASS_DEFS.find((d) => d.name === key); - if (key === 'root') { - return ` ...${indent(classesCustomizations.values[key].trim(), ' ')}`; - } - return ` '& ${def.selector}': ${indent(classesCustomizations.values[key].trim(), ' ')},`; - }); - - const sxLines = - classEntries.length > 0 - ? `\n sx={{\n height: '100%',\n${classEntries.join('\n')}\n }}` - : `\n sx={{ height: '100%' }}`; - - const featuresLines = [ - effectiveConversationList ? ' conversationList: true,' : null, - effectiveConversationHeader ? ' conversationHeader: true,' : null, - scrollToBottom ? ' scrollToBottom: true,' : ' scrollToBottom: false,', - attachments ? ' attachments: true,' : null, - helperText ? ' helperText: true,' : ' helperText: false,', - autoScroll ? ' autoScroll: true,' : ' autoScroll: false,', - suggestions ? ' suggestions: true,' : null, - ] - .filter(Boolean) - .join('\n'); - - return ``; - }, [ - variant, - density, - layoutMode, - effectiveConversationList, - effectiveConversationHeader, - attachments, - suggestions, - scrollToBottom, - helperText, - autoScroll, - suggestionsAutoSubmit, - classesCustomizations.values, - ]); - - return ( - - Appearance - - - - features - - - - - - - - Suggestions - - - } - preview={ - - } - /> - ); -} diff --git a/docs/data/chat/basics/chatbox/chatbox.md b/docs/data/chat/basics/chatbox/chatbox.md index 63409bca9d3ef..ad32d5e4bd5d6 100644 --- a/docs/data/chat/basics/chatbox/chatbox.md +++ b/docs/data/chat/basics/chatbox/chatbox.md @@ -21,7 +21,7 @@ ChatBox ships full keyboard navigation and screen-reader support out of the box Try the `ChatBox` props live—toggle variant, density, layout mode, and the built-in features: -{{"demo": "ChatBoxPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-box-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} The playground starts with `features.conversationList` enabled to showcase the full surface; on `ChatBox` itself the conversation list is off by default. @@ -47,7 +47,7 @@ No additional configuration is needed—`ChatBox` reads `palette`, `typography`, The demo below shows `ChatBox` picking up the active Material UI theme: -{{"demo": "../../material/examples/basic-ai-chat/BasicAiChat.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://../../material/examples/basic-ai-chat/demos/basic-ai-chat/index.ts", "bg": "inline", "collapseToEmpty": true}} ## ChatBox vs. ChatProvider @@ -56,17 +56,17 @@ The demo below shows `ChatBox` picking up the active Material UI theme: `ChatBox` is the right choice when you want a complete chat surface with minimal setup. It creates a `ChatProvider` internally, so all [hooks](/x/react-chat/resources/hooks/) work inside any component rendered as a child or descendant of `ChatBox`: -{{"demo": "../../material/context/ChatBoxWithHooks.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/context/demos/chat-box-with-hooks/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Using ChatProvider for a custom layout When you need full control over the markup, use `ChatProvider` directly and compose only the pieces you need—here, just the message list and a composer: -{{"demo": "../../material/context/ChatProviderCustomLayout.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/context/demos/chat-provider-custom-layout/index.ts", "bg": "inline", "collapseToEmpty": true}} The same approach scales up to a full inbox layout—a conversation list in a sidebar next to the active thread. See the [Layout](/x/react-chat/basics/layout/) page for the building blocks: -{{"demo": "../layout/LayoutTwoPaneStandalone.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../layout/demos/layout-two-pane-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} :::warning `ChatBox` always creates its own internal `ChatProvider`. @@ -96,7 +96,7 @@ Everything you saw in the all-in-one surface above is governed by the `features` The demo below enables `dateDivider` and `unreadMarker`—the divider marks the day boundary and the marker sits above the first unread message: -{{"demo": "ChatBoxFeatureFlags.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/chat-box-feature-flags/index.ts", "bg": "inline", "collapseToEmpty": true}} The `conversationList`, `dateDivider`, and `unreadMarker` flags each have a dedicated page: [Conversation list](/x/react-chat/multi-conversation/conversation-list/), [Date divider](/x/react-chat/display/date-divider/), and [Unread marker](/x/react-chat/display/unread-marker/). @@ -174,4 +174,4 @@ For example, control the active conversation while letting the internal store ma Each `ChatBox` creates its own isolated store. To render multiple independent chat surfaces side by side, use separate `ChatBox` instances: -{{"demo": "../../material/context/MultipleInstances.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/context/demos/multiple-instances/index.ts", "bg": "inline", "collapseToEmpty": true}} diff --git a/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.tsx b/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/ChatBoxFeatureFlags.tsx similarity index 98% rename from docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.tsx rename to docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/ChatBoxFeatureFlags.tsx index 95bd27c8d5a5f..ebfcdd976aaa6 100644 --- a/docs/data/chat/basics/chatbox/ChatBoxFeatureFlags.tsx +++ b/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/ChatBoxFeatureFlags.tsx @@ -75,6 +75,7 @@ const messages = [ export default function ChatBoxFeatureFlags() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/client.ts b/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/index.ts b/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/index.ts new file mode 100644 index 0000000000000..2708f8b174808 --- /dev/null +++ b/docs/data/chat/basics/chatbox/demos/chat-box-feature-flags/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatBoxFeatureFlags from './ChatBoxFeatureFlags'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatBoxFeatureFlags, { ClientProvider }); diff --git a/docs/data/chat/basics/chatbox/ChatBoxPlayground.tsx b/docs/data/chat/basics/chatbox/demos/chat-box-playground/ChatBoxPlayground.tsx similarity index 97% rename from docs/data/chat/basics/chatbox/ChatBoxPlayground.tsx rename to docs/data/chat/basics/chatbox/demos/chat-box-playground/ChatBoxPlayground.tsx index 7ea4b56a81a91..be7c5b45dd303 100644 --- a/docs/data/chat/basics/chatbox/ChatBoxPlayground.tsx +++ b/docs/data/chat/basics/chatbox/demos/chat-box-playground/ChatBoxPlayground.tsx @@ -8,10 +8,8 @@ import { DividerLabel, SwitchControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { conversations, initialThreads, @@ -72,6 +70,7 @@ export interface ChatBoxPlaygroundProps { } export default function ChatBoxPlayground(props: ChatBoxPlaygroundProps = {}) { + // @focus-start @padding 1 const { hideHeader, defaults: defaultsOverride, defaultControlsCollapsed } = props; const defaults = React.useMemo( () => ({ ...DEFAULTS, ...defaultsOverride }), @@ -317,4 +316,5 @@ ${featuresLines} } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/chatbox/demos/chat-box-playground/client.ts b/docs/data/chat/basics/chatbox/demos/chat-box-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/chatbox/demos/chat-box-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/chatbox/demos/chat-box-playground/index.ts b/docs/data/chat/basics/chatbox/demos/chat-box-playground/index.ts new file mode 100644 index 0000000000000..4fc54a2143636 --- /dev/null +++ b/docs/data/chat/basics/chatbox/demos/chat-box-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatBoxPlayground from './ChatBoxPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatBoxPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/composer/ChatComposerPlayground.js b/docs/data/chat/basics/composer/ChatComposerPlayground.js deleted file mode 100644 index 4401d5f5c9610..0000000000000 --- a/docs/data/chat/basics/composer/ChatComposerPlayground.js +++ /dev/null @@ -1,260 +0,0 @@ -import * as React from 'react'; -import AttachIcon from '@mui/icons-material/AttachFile'; -import SendIcon from '@mui/icons-material/Send'; -import Box from '@mui/material/Box'; -import { - ChatComposer, - ChatComposerAttachButton, - ChatComposerAttachmentList, - ChatComposerHelperText, - ChatComposerSendButton, - ChatComposerTextArea, - ChatComposerToolbar, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ScopedChat, - ChatChrome, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { emptyConversation } from 'docs/src/modules/components/chat-playground/sharedFixtures'; -import { - ChoiceControl, - DividerLabel, - NumberControl, - SwitchControl, - TextControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const DEFAULTS = { - variant: 'default', - disabled: false, - attachments: true, - showHelperText: true, - maxFileCount: 0, - maxFileSizeMB: 0, - acceptedMimeTypes: 'image/*,application/pdf', - placeholder: 'Ask anything…', -}; - -const CLASS_DEFS = [ - { name: 'root', description: 'Outermost form element.' }, - { - name: 'disabled', - selector: '.MuiChatComposer-disabled', - description: 'Applied to the root when disabled.', - }, - { - name: 'variantCompact', - selector: '.MuiChatComposer-variantCompact', - description: 'Applied to the root when variant="compact".', - }, - { - name: 'textArea', - selector: '.MuiChatComposer-textArea', - description: 'Applied to the text area input.', - }, - { - name: 'sendButton', - selector: '.MuiChatComposer-sendButton', - description: 'Applied to the send button.', - }, - { - name: 'attachButton', - selector: '.MuiChatComposer-attachButton', - description: 'Applied to the attach button.', - }, - { - name: 'toolbar', - selector: '.MuiChatComposer-toolbar', - description: 'Applied to the toolbar row.', - }, - { - name: 'attachmentList', - selector: '.MuiChatComposer-attachmentList', - description: 'Applied to the attachment list above the textarea.', - }, - { - name: 'helperText', - selector: '.MuiChatComposer-helperText', - description: 'Applied to the helper text below the textarea.', - }, -]; - -export default function ChatComposerPlayground() { - const [variant, setVariant] = React.useState(DEFAULTS.variant); - const [disabled, setDisabled] = React.useState(DEFAULTS.disabled); - const [attachments, setAttachments] = React.useState(DEFAULTS.attachments); - const [showHelperText, setShowHelperText] = React.useState( - DEFAULTS.showHelperText, - ); - const [maxFileCount, setMaxFileCount] = React.useState(DEFAULTS.maxFileCount); - const [maxFileSizeMB, setMaxFileSizeMB] = React.useState(DEFAULTS.maxFileSizeMB); - const [acceptedMimeTypes, setAcceptedMimeTypes] = React.useState( - DEFAULTS.acceptedMimeTypes, - ); - const [placeholder, setPlaceholder] = React.useState(DEFAULTS.placeholder); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const handleReset = React.useCallback(() => { - setVariant(DEFAULTS.variant); - setDisabled(DEFAULTS.disabled); - setAttachments(DEFAULTS.attachments); - setShowHelperText(DEFAULTS.showHelperText); - setMaxFileCount(DEFAULTS.maxFileCount); - setMaxFileSizeMB(DEFAULTS.maxFileSizeMB); - setAcceptedMimeTypes(DEFAULTS.acceptedMimeTypes); - setPlaceholder(DEFAULTS.placeholder); - }, []); - - const attachmentConfig = React.useMemo(() => { - if (!attachments) { - return false; - } - const config = {}; - const types = acceptedMimeTypes - .split(',') - .map((s) => s.trim()) - .filter(Boolean); - if (types.length > 0) { - config.acceptedMimeTypes = types; - } - if (maxFileCount > 0) { - config.maxFileCount = maxFileCount; - } - if (maxFileSizeMB > 0) { - config.maxFileSize = maxFileSizeMB * 1024 * 1024; - } - return Object.keys(config).length === 0 ? true : config; - }, [attachments, acceptedMimeTypes, maxFileCount, maxFileSizeMB]); - - const composerSx = classesCustomizations.toClassesSx(); - return ( - - props - - - features.attachments - - - (value === 0 ? '∞' : value.toString())} - helperText="0 disables the limit." - onChange={setMaxFileCount} - /> - (value === 0 ? 'unlimited' : `${value}MB`)} - helperText="0 disables the limit." - onChange={setMaxFileSizeMB} - /> - composition (children) - - - - } - preview={ - - - - {variant === 'default' ? ( - - {attachments ? : null} - - {showHelperText ? ( - - Press Enter to send, Shift+Enter for a new line. - - ) : null} - - {attachments ? ( - - - - ) : null} - - - - - - ) : ( - - {attachments ? : null} - {attachments ? ( - - - - ) : null} - - - - - - )} - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/composer/ComposerControlledStandalone.js b/docs/data/chat/basics/composer/ComposerControlledStandalone.js deleted file mode 100644 index 3e7b7ed839129..0000000000000 --- a/docs/data/chat/basics/composer/ComposerControlledStandalone.js +++ /dev/null @@ -1,21 +0,0 @@ -'use client'; -import * as React from 'react'; -import Typography from '@mui/material/Typography'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerControlledStandalone() { - const [value, setValue] = React.useState(''); - - return ( - - Composer value: {value ? `"${value}"` : '(empty)'} - - } - composerValue={value} - onComposerValueChange={setValue} - helperText="The current draft value is controlled outside the composer." - /> - ); -} diff --git a/docs/data/chat/basics/composer/ComposerControlledStandalone.tsx.preview b/docs/data/chat/basics/composer/ComposerControlledStandalone.tsx.preview deleted file mode 100644 index 40681f8a24e58..0000000000000 --- a/docs/data/chat/basics/composer/ComposerControlledStandalone.tsx.preview +++ /dev/null @@ -1,10 +0,0 @@ - - Composer value: {value ? `"${value}"` : '(empty)'} - - } - composerValue={value} - onComposerValueChange={setValue} - helperText="The current draft value is controlled outside the composer." -/> \ No newline at end of file diff --git a/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.js b/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.js deleted file mode 100644 index ac3fc351611b8..0000000000000 --- a/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.js +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerCustomPlaceholderStandalone() { - return ( - - ); -} diff --git a/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx b/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx deleted file mode 100644 index ac3fc351611b8..0000000000000 --- a/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerCustomPlaceholderStandalone() { - return ( - - ); -} diff --git a/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx.preview b/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx.preview deleted file mode 100644 index ab275c31510e7..0000000000000 --- a/docs/data/chat/basics/composer/ComposerCustomPlaceholderStandalone.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/basics/composer/ComposerDisabledStandalone.js b/docs/data/chat/basics/composer/ComposerDisabledStandalone.js deleted file mode 100644 index 23a64a3cdcf94..0000000000000 --- a/docs/data/chat/basics/composer/ComposerDisabledStandalone.js +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerDisabledStandalone() { - return ( - - ); -} diff --git a/docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx b/docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx deleted file mode 100644 index 23a64a3cdcf94..0000000000000 --- a/docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerDisabledStandalone() { - return ( - - ); -} diff --git a/docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx.preview b/docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx.preview deleted file mode 100644 index 71ab68ff651fe..0000000000000 --- a/docs/data/chat/basics/composer/ComposerDisabledStandalone.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/basics/composer/ComposerHelperTextStandalone.js b/docs/data/chat/basics/composer/ComposerHelperTextStandalone.js deleted file mode 100644 index cf627e26f85f1..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHelperTextStandalone.js +++ /dev/null @@ -1,7 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerHelperTextStandalone() { - return ; -} diff --git a/docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx b/docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx deleted file mode 100644 index cf627e26f85f1..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx +++ /dev/null @@ -1,7 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerHelperTextStandalone() { - return ; -} diff --git a/docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx.preview b/docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx.preview deleted file mode 100644 index df460ee651804..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHelperTextStandalone.tsx.preview +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.js b/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.js deleted file mode 100644 index 95c666ffae458..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.js +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerHiddenAttachButtonStandalone() { - return ( - - ); -} diff --git a/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx b/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx deleted file mode 100644 index 95c666ffae458..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -export default function ComposerHiddenAttachButtonStandalone() { - return ( - - ); -} diff --git a/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx.preview b/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx.preview deleted file mode 100644 index 94937dc4d2d78..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHiddenAttachButtonStandalone.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/basics/composer/ComposerHookStateStandalone.js b/docs/data/chat/basics/composer/ComposerHookStateStandalone.js deleted file mode 100644 index aaf098ae917ad..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHookStateStandalone.js +++ /dev/null @@ -1,40 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Typography from '@mui/material/Typography'; -import { useChatComposer } from '@mui/x-chat/headless'; -import { ComposerDemoShell } from './ComposerDemoShell'; - -function ComposerInfo() { - const composer = useChatComposer(); - return ( - - - Current value: {composer.value ? `"${composer.value}"` : '(empty)'} - - - Attachments: {composer.attachments.length} - - - Submitting: {composer.isSubmitting ? 'Yes' : 'No'} - - - - ); -} - -export default function ComposerHookStateStandalone() { - return ( - } - helperText="Type, attach a file, or send to watch the hook state update." - /> - ); -} diff --git a/docs/data/chat/basics/composer/ComposerHookStateStandalone.tsx.preview b/docs/data/chat/basics/composer/ComposerHookStateStandalone.tsx.preview deleted file mode 100644 index ccd3f61de7246..0000000000000 --- a/docs/data/chat/basics/composer/ComposerHookStateStandalone.tsx.preview +++ /dev/null @@ -1,4 +0,0 @@ -} - helperText="Type, attach a file, or send to watch the hook state update." -/> \ No newline at end of file diff --git a/docs/data/chat/basics/composer/ComposerVariantsStandalone.js b/docs/data/chat/basics/composer/ComposerVariantsStandalone.js deleted file mode 100644 index 61a1d4e871d9d..0000000000000 --- a/docs/data/chat/basics/composer/ComposerVariantsStandalone.js +++ /dev/null @@ -1,68 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { - ChatComposer, - ChatComposerAttachButton, - ChatComposerAttachmentList, - ChatComposerSendButton, - ChatComposerTextArea, - ChatComposerToolbar, -} from '@mui/x-chat'; -import { ChatProvider } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { minimalConversation } from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ - respond: (text) => `Draft submitted: "${text}".`, -}); - -export default function ComposerVariantsStandalone() { - return ( - - - - variant="default" - - - - - - Attach - Send - - - - - - - variant="compact" - - - - - Attach - - Send - - - - - ); -} diff --git a/docs/data/chat/basics/composer/composer.md b/docs/data/chat/basics/composer/composer.md index 9c7f638b72e16..266be257dc066 100644 --- a/docs/data/chat/basics/composer/composer.md +++ b/docs/data/chat/basics/composer/composer.md @@ -22,7 +22,7 @@ The demos on this page render only the composer plus the provider context it dep Try the `ChatComposer` props live: toggle variant, attachments, helper text, and placeholder: -{{"demo": "ChatComposerPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-composer-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Import @@ -64,7 +64,7 @@ ChatComposer ←
element, border-top divider The variant can also come from the surrounding chat context; an explicit prop wins over the context value. -{{"demo": "ComposerVariantsStandalone.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/composer-variants-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Text area @@ -77,7 +77,7 @@ Use `maxRows` to cap the auto-grow: the textarea starts at one row and grows up Customize the placeholder directly on `ChatComposerTextArea`: -{{"demo": "ComposerCustomPlaceholderStandalone.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/composer-custom-placeholder-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} ### IME composition @@ -100,7 +100,7 @@ Selected files are queued as draft attachments and previewed in the composer are Omit `ChatComposerAttachButton` from the toolbar when attachments are not part of the surface: -{{"demo": "ComposerHiddenAttachButtonStandalone.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/composer-hidden-attach-button-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} Files that exceed the configured limits (`maxFileCount`, `maxFileSize`, `acceptedMimeTypes`) are not queued and there is no built-in rejection UI — handle the `onAttachmentReject` callback to surface feedback. @@ -111,20 +111,20 @@ See [Attachments](/x/react-chat/behavior/attachments/) for details on accepted M A helper text line appears below the composer. Use it for legal disclaimers, character counts, or contextual hints. -{{"demo": "ComposerHelperTextStandalone.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/composer-helper-text-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Controlled composer value Control the composer value externally through `ChatProvider` state. The demo below mirrors the current composer value above the standalone composer: -{{"demo": "ComposerControlledStandalone.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/composer-controlled-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Accessing composer state with a hook For deeper control, the `useChatComposer()` hook provides direct access to the composer state: -{{"demo": "ComposerHookStateStandalone.js", "defaultCodeOpen": true, "bg": "inline"}} +{{"component": "file://./demos/composer-hook-state-standalone/index.ts", "bg": "inline", "initialExpanded": true}} The hook returns: @@ -144,7 +144,7 @@ The hook returns: Pass `disabled` to `ChatComposer` to prevent all interaction. When disabled, the text area is read-only and the send button is inert. -{{"demo": "ComposerDisabledStandalone.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/composer-disabled-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Accessibility diff --git a/docs/data/chat/basics/composer/ChatComposerPlayground.tsx b/docs/data/chat/basics/composer/demos/chat-composer-playground/ChatComposerPlayground.tsx similarity index 97% rename from docs/data/chat/basics/composer/ChatComposerPlayground.tsx rename to docs/data/chat/basics/composer/demos/chat-composer-playground/ChatComposerPlayground.tsx index cc01f923e201d..424c3e53b6620 100644 --- a/docs/data/chat/basics/composer/ChatComposerPlayground.tsx +++ b/docs/data/chat/basics/composer/demos/chat-composer-playground/ChatComposerPlayground.tsx @@ -25,10 +25,8 @@ import { SwitchControl, TextControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; const DEFAULTS = { variant: 'default' as ChatVariant, @@ -97,6 +95,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatComposerPlayground() { + // @focus-start @padding 1 const [variant, setVariant] = React.useState(DEFAULTS.variant); const [disabled, setDisabled] = React.useState(DEFAULTS.disabled); const [attachments, setAttachments] = React.useState(DEFAULTS.attachments); @@ -271,4 +270,5 @@ export default function ChatComposerPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/composer/demos/chat-composer-playground/client.ts b/docs/data/chat/basics/composer/demos/chat-composer-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/chat-composer-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/chat-composer-playground/index.ts b/docs/data/chat/basics/composer/demos/chat-composer-playground/index.ts new file mode 100644 index 0000000000000..07f7c25a2a3f4 --- /dev/null +++ b/docs/data/chat/basics/composer/demos/chat-composer-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatComposerPlayground from './ChatComposerPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatComposerPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/composer/ComposerControlledStandalone.tsx b/docs/data/chat/basics/composer/demos/composer-controlled-standalone/ComposerControlledStandalone.tsx similarity index 84% rename from docs/data/chat/basics/composer/ComposerControlledStandalone.tsx rename to docs/data/chat/basics/composer/demos/composer-controlled-standalone/ComposerControlledStandalone.tsx index 3e7b7ed839129..15ecb2762cb21 100644 --- a/docs/data/chat/basics/composer/ComposerControlledStandalone.tsx +++ b/docs/data/chat/basics/composer/demos/composer-controlled-standalone/ComposerControlledStandalone.tsx @@ -1,9 +1,10 @@ 'use client'; import * as React from 'react'; import Typography from '@mui/material/Typography'; -import { ComposerDemoShell } from './ComposerDemoShell'; +import { ComposerDemoShell } from '../../ComposerDemoShell'; export default function ComposerControlledStandalone() { + // @focus-start @padding 1 const [value, setValue] = React.useState(''); return ( @@ -18,4 +19,5 @@ export default function ComposerControlledStandalone() { helperText="The current draft value is controlled outside the composer." /> ); + // @focus-end } diff --git a/docs/data/chat/basics/composer/demos/composer-controlled-standalone/client.ts b/docs/data/chat/basics/composer/demos/composer-controlled-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-controlled-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/composer-controlled-standalone/index.ts b/docs/data/chat/basics/composer/demos/composer-controlled-standalone/index.ts new file mode 100644 index 0000000000000..858aa77e6441b --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-controlled-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerControlledStandalone from './ComposerControlledStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerControlledStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/ComposerCustomPlaceholderStandalone.tsx b/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/ComposerCustomPlaceholderStandalone.tsx new file mode 100644 index 0000000000000..0616802af4268 --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/ComposerCustomPlaceholderStandalone.tsx @@ -0,0 +1,14 @@ +'use client'; +import * as React from 'react'; +import { ComposerDemoShell } from '../../ComposerDemoShell'; + +export default function ComposerCustomPlaceholderStandalone() { + return ( + // @focus-start @padding 2 + + // @focus-end + ); +} diff --git a/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/client.ts b/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/index.ts b/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/index.ts new file mode 100644 index 0000000000000..a0336f4dace0b --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-custom-placeholder-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerCustomPlaceholderStandalone from './ComposerCustomPlaceholderStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerCustomPlaceholderStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/composer/demos/composer-disabled-standalone/ComposerDisabledStandalone.tsx b/docs/data/chat/basics/composer/demos/composer-disabled-standalone/ComposerDisabledStandalone.tsx new file mode 100644 index 0000000000000..0e93b457eaa89 --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-disabled-standalone/ComposerDisabledStandalone.tsx @@ -0,0 +1,14 @@ +'use client'; +import * as React from 'react'; +import { ComposerDemoShell } from '../../ComposerDemoShell'; + +export default function ComposerDisabledStandalone() { + return ( + // @focus-start @padding 2 + + // @focus-end + ); +} diff --git a/docs/data/chat/basics/composer/demos/composer-disabled-standalone/client.ts b/docs/data/chat/basics/composer/demos/composer-disabled-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-disabled-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/composer-disabled-standalone/index.ts b/docs/data/chat/basics/composer/demos/composer-disabled-standalone/index.ts new file mode 100644 index 0000000000000..1a93de35565a7 --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-disabled-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerDisabledStandalone from './ComposerDisabledStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerDisabledStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/ComposerHelperTextStandalone.tsx b/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/ComposerHelperTextStandalone.tsx new file mode 100644 index 0000000000000..440a57d1f369b --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/ComposerHelperTextStandalone.tsx @@ -0,0 +1,10 @@ +'use client'; +import * as React from 'react'; +import { ComposerDemoShell } from '../../ComposerDemoShell'; + +export default function ComposerHelperTextStandalone() { + return ( + // @focus @padding 2 + + ); +} diff --git a/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/client.ts b/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/index.ts b/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/index.ts new file mode 100644 index 0000000000000..345b2bf7f93fa --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-helper-text-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerHelperTextStandalone from './ComposerHelperTextStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerHelperTextStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/ComposerHiddenAttachButtonStandalone.tsx b/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/ComposerHiddenAttachButtonStandalone.tsx new file mode 100644 index 0000000000000..0722db3ca2e97 --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/ComposerHiddenAttachButtonStandalone.tsx @@ -0,0 +1,14 @@ +'use client'; +import * as React from 'react'; +import { ComposerDemoShell } from '../../ComposerDemoShell'; + +export default function ComposerHiddenAttachButtonStandalone() { + return ( + // @focus-start @padding 2 + + // @focus-end + ); +} diff --git a/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/client.ts b/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/index.ts b/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/index.ts new file mode 100644 index 0000000000000..53de8b4c539ae --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-hidden-attach-button-standalone/index.ts @@ -0,0 +1,8 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerHiddenAttachButtonStandalone from './ComposerHiddenAttachButtonStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerHiddenAttachButtonStandalone, { + ClientProvider, +}); diff --git a/docs/data/chat/basics/composer/ComposerHookStateStandalone.tsx b/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/ComposerHookStateStandalone.tsx similarity index 91% rename from docs/data/chat/basics/composer/ComposerHookStateStandalone.tsx rename to docs/data/chat/basics/composer/demos/composer-hook-state-standalone/ComposerHookStateStandalone.tsx index aaf098ae917ad..f47829aed50ea 100644 --- a/docs/data/chat/basics/composer/ComposerHookStateStandalone.tsx +++ b/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/ComposerHookStateStandalone.tsx @@ -4,7 +4,7 @@ import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import { useChatComposer } from '@mui/x-chat/headless'; -import { ComposerDemoShell } from './ComposerDemoShell'; +import { ComposerDemoShell } from '../../ComposerDemoShell'; function ComposerInfo() { const composer = useChatComposer(); @@ -32,9 +32,11 @@ function ComposerInfo() { export default function ComposerHookStateStandalone() { return ( + // @focus-start @padding 2 } helperText="Type, attach a file, or send to watch the hook state update." /> + // @focus-end ); } diff --git a/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/client.ts b/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/index.ts b/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/index.ts new file mode 100644 index 0000000000000..78238c32830b4 --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-hook-state-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerHookStateStandalone from './ComposerHookStateStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerHookStateStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/composer/ComposerVariantsStandalone.tsx b/docs/data/chat/basics/composer/demos/composer-variants-standalone/ComposerVariantsStandalone.tsx similarity index 97% rename from docs/data/chat/basics/composer/ComposerVariantsStandalone.tsx rename to docs/data/chat/basics/composer/demos/composer-variants-standalone/ComposerVariantsStandalone.tsx index 61a1d4e871d9d..4b3339a5b8f56 100644 --- a/docs/data/chat/basics/composer/ComposerVariantsStandalone.tsx +++ b/docs/data/chat/basics/composer/demos/composer-variants-standalone/ComposerVariantsStandalone.tsx @@ -21,6 +21,7 @@ const adapter = createEchoAdapter({ export default function ComposerVariantsStandalone() { return ( + {/* @focus-start */} variant="default" @@ -63,6 +64,7 @@ export default function ComposerVariantsStandalone() { + {/* @focus-end */} ); } diff --git a/docs/data/chat/basics/composer/demos/composer-variants-standalone/client.ts b/docs/data/chat/basics/composer/demos/composer-variants-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-variants-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/composer/demos/composer-variants-standalone/index.ts b/docs/data/chat/basics/composer/demos/composer-variants-standalone/index.ts new file mode 100644 index 0000000000000..4c07a1ef6c831 --- /dev/null +++ b/docs/data/chat/basics/composer/demos/composer-variants-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerVariantsStandalone from './ComposerVariantsStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerVariantsStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/conversation/ChatConversationPlayground.js b/docs/data/chat/basics/conversation/ChatConversationPlayground.js deleted file mode 100644 index 3786f35d11faf..0000000000000 --- a/docs/data/chat/basics/conversation/ChatConversationPlayground.js +++ /dev/null @@ -1,161 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatComposer, - ChatConversation, - ChatConversationHeader, - ChatConversationHeaderActions, - ChatConversationHeaderInfo, - ChatConversationSubtitle, - ChatConversationTitle, - ChatMessageList, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - directoryConversations, - longThreadMessages, -} from 'docs/src/modules/components/chat-playground/sharedFixtures'; -import { MessageBubble } from 'docs/src/modules/components/chat-playground/MessageBubble'; -import { - ChoiceControl, - DividerLabel, - SwitchControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const DEFAULTS = { - variant: 'default', - density: 'standard', - showHeader: true, - showComposer: true, -}; - -const CLASS_DEFS = [ - { name: 'root', description: 'The outermost element of ChatConversation.' }, - { - name: 'header', - selector: '.MuiChatConversation-header', - description: 'The conversation header bar.', - }, - { - name: 'headerInfo', - selector: '.MuiChatConversation-headerInfo', - description: 'The title/subtitle group in the header.', - }, - { - name: 'headerActions', - selector: '.MuiChatConversation-headerActions', - description: 'The actions area on the right of the header.', - }, - { - name: 'title', - selector: '.MuiChatConversation-title', - description: 'The conversation title element.', - }, - { - name: 'subtitle', - selector: '.MuiChatConversation-subtitle', - description: 'The conversation subtitle element.', - }, -]; - -export default function ChatConversationPlayground() { - const [variant, setVariant] = React.useState(DEFAULTS.variant); - const [density, setDensity] = React.useState(DEFAULTS.density); - const [showHeader, setShowHeader] = React.useState(DEFAULTS.showHeader); - const [showComposer, setShowComposer] = React.useState(DEFAULTS.showComposer); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const handleReset = React.useCallback(() => { - setVariant(DEFAULTS.variant); - setDensity(DEFAULTS.density); - setShowHeader(DEFAULTS.showHeader); - setShowComposer(DEFAULTS.showComposer); - }, []); - - const conversationSx = classesCustomizations.toClassesSx(); - - return ( - - Chrome provider - - - Composition - - - - } - preview={ - - - - - {showHeader ? ( - - - - - - - - ) : null} - m.id)} - renderItem={({ id }) => } - /> - {showComposer ? : null} - - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/conversation/ConversationBasicStandalone.js b/docs/data/chat/basics/conversation/ConversationBasicStandalone.js deleted file mode 100644 index 4133f636112b6..0000000000000 --- a/docs/data/chat/basics/conversation/ConversationBasicStandalone.js +++ /dev/null @@ -1,67 +0,0 @@ -'use client'; -import * as React from 'react'; -import MoreIcon from '@mui/icons-material/MoreVert'; -import Box from '@mui/material/Box'; -import IconButton from '@mui/material/IconButton'; -import { - ChatComposer, - ChatConversation, - ChatConversationHeader, - ChatConversationHeaderActions, - ChatConversationHeaderInfo, - ChatConversationSubtitle, - ChatConversationTitle, - ChatMessageGroup, - ChatMessageList, -} from '@mui/x-chat'; -import { ChatProvider } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ - respond: (text) => - `Received: "${text}". This thread is rendered by a single ChatConversation.`, -}); - -export default function ConversationBasicStandalone() { - const renderItem = React.useCallback( - (params) => , - [], - ); - - return ( - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/chat/basics/conversation/conversation.md b/docs/data/chat/basics/conversation/conversation.md index 45dc2943f9515..e1027a2f42896 100644 --- a/docs/data/chat/basics/conversation/conversation.md +++ b/docs/data/chat/basics/conversation/conversation.md @@ -58,13 +58,13 @@ See [Conversation header](/x/react-chat/multi-conversation/conversation-header/) The demo below wires `ChatConversation` to a `ChatProvider` with a demo adapter. The title and subtitle come from the active conversation; send a message to see the list scroll and the echo reply arrive. -{{"demo": "ConversationBasicStandalone.js", "bg": "inline", "defaultCodeOpen": true}} +{{"component": "file://./demos/conversation-basic-standalone/index.ts", "bg": "inline", "initialExpanded": true}} ## Interactive playground The demo below lets you toggle whether the header and composer are rendered, and switch the surrounding variant and density: -{{"demo": "ChatConversationPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-conversation-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} :::info The conversation surface is the chat's main scroll region: the message list manages roving focus and `Page Up`/`Page Down` scrolling, and the composer is reachable with `Tab`. diff --git a/docs/data/chat/basics/conversation/ChatConversationPlayground.tsx b/docs/data/chat/basics/conversation/demos/chat-conversation-playground/ChatConversationPlayground.tsx similarity index 95% rename from docs/data/chat/basics/conversation/ChatConversationPlayground.tsx rename to docs/data/chat/basics/conversation/demos/chat-conversation-playground/ChatConversationPlayground.tsx index 5ca7956eedee1..c91208137edd9 100644 --- a/docs/data/chat/basics/conversation/ChatConversationPlayground.tsx +++ b/docs/data/chat/basics/conversation/demos/chat-conversation-playground/ChatConversationPlayground.tsx @@ -26,10 +26,8 @@ import { DividerLabel, SwitchControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; const DEFAULTS = { variant: 'default' as ChatVariant, @@ -71,6 +69,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatConversationPlayground() { + // @focus-start @padding 1 const [variant, setVariant] = React.useState(DEFAULTS.variant); const [density, setDensity] = React.useState(DEFAULTS.density); const [showHeader, setShowHeader] = React.useState(DEFAULTS.showHeader); @@ -164,4 +163,5 @@ export default function ChatConversationPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/conversation/demos/chat-conversation-playground/client.ts b/docs/data/chat/basics/conversation/demos/chat-conversation-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/conversation/demos/chat-conversation-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/conversation/demos/chat-conversation-playground/index.ts b/docs/data/chat/basics/conversation/demos/chat-conversation-playground/index.ts new file mode 100644 index 0000000000000..59890723c476b --- /dev/null +++ b/docs/data/chat/basics/conversation/demos/chat-conversation-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatConversationPlayground from './ChatConversationPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatConversationPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/conversation/ConversationBasicStandalone.tsx b/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/ConversationBasicStandalone.tsx similarity index 97% rename from docs/data/chat/basics/conversation/ConversationBasicStandalone.tsx rename to docs/data/chat/basics/conversation/demos/conversation-basic-standalone/ConversationBasicStandalone.tsx index f0be0607e7a34..7288d0e8d503e 100644 --- a/docs/data/chat/basics/conversation/ConversationBasicStandalone.tsx +++ b/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/ConversationBasicStandalone.tsx @@ -27,6 +27,7 @@ const adapter = createEchoAdapter({ }); export default function ConversationBasicStandalone() { + // @focus-start @padding 1 const renderItem = React.useCallback( (params: { id: string }) => ( @@ -66,4 +67,5 @@ export default function ConversationBasicStandalone() { ); + // @focus-end } diff --git a/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/client.ts b/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/index.ts b/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/index.ts new file mode 100644 index 0000000000000..ce0b143d10877 --- /dev/null +++ b/docs/data/chat/basics/conversation/demos/conversation-basic-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ConversationBasicStandalone from './ConversationBasicStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ConversationBasicStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/layout/LayoutRecomposedStandalone.js b/docs/data/chat/basics/layout/LayoutRecomposedStandalone.js deleted file mode 100644 index c7b5b5f2aa44d..0000000000000 --- a/docs/data/chat/basics/layout/LayoutRecomposedStandalone.js +++ /dev/null @@ -1,89 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatComposer, - ChatComposerSendButton, - ChatComposerTextArea, - ChatComposerToolbar, - ChatConversation, - ChatConversationHeader, - ChatConversationHeaderActions, - ChatConversationSubtitle, - ChatConversationTitle, - ChatMessageGroup, - ChatMessageList, -} from '@mui/x-chat'; -import { ChatLayout, ChatProvider } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ - respond: (text) => - `Received: "${text}". This thread is recomposed from individual components, with a pinned notice between the header and the messages.`, -}); - -export default function LayoutRecomposedStandalone() { - const renderItem = React.useCallback( - (params) => ( - - ), - [], - ); - - return ( - - - - - - - - - - - - - - {/* Custom pinned notice between header and messages */} - - Responses are AI-generated. Verify before acting. - - - - - - - - - - - - - - ); -} diff --git a/docs/data/chat/basics/layout/LayoutResponsiveStandalone.js b/docs/data/chat/basics/layout/LayoutResponsiveStandalone.js deleted file mode 100644 index bd8958071f742..0000000000000 --- a/docs/data/chat/basics/layout/LayoutResponsiveStandalone.js +++ /dev/null @@ -1,183 +0,0 @@ -'use client'; -import * as React from 'react'; -import AttachIcon from '@mui/icons-material/AttachFile'; -import BackIcon from '@mui/icons-material/ArrowBack'; -import SendIcon from '@mui/icons-material/Send'; -import Box from '@mui/material/Box'; -import IconButton from '@mui/material/IconButton'; -import Slider from '@mui/material/Slider'; -import Tooltip from '@mui/material/Tooltip'; -import Typography from '@mui/material/Typography'; -import { - ChatComposer, - ChatComposerAttachButton, - ChatComposerSendButton, - ChatComposerTextArea, - ChatComposerToolbar, - ChatConversation, - ChatConversationHeader, - ChatConversationList, - ChatConversationSubtitle, - ChatConversationTitle, - ChatMessageGroup, - ChatMessageList, -} from '@mui/x-chat'; -import { ChatLayout, ChatProvider } from '@mui/x-chat/headless'; - -import { - createEchoAdapter, - syncConversationPreview, -} from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - inboxConversations, - inboxThreads, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ - respond: (text) => - `Received: "${text}". This responsive example switches ChatLayout between two-pane and single-pane compositions.`, -}); - -export default function LayoutResponsiveStandalone() { - const [width, setWidth] = React.useState(720); - const [activeConversationId, setActiveConversationId] = React.useState( - () => inboxConversations[0].id, - ); - const [conversations, setConversations] = React.useState(() => - inboxConversations.map((conversation) => ({ ...conversation })), - ); - const [threads, setThreads] = React.useState(() => - Object.fromEntries( - Object.entries(inboxThreads).map(([id, messages]) => [ - id, - messages.map((message) => ({ ...message })), - ]), - ), - ); - - const isNarrow = width < 600; - const effectiveConversationId = activeConversationId ?? inboxConversations[0].id; - const messages = threads[effectiveConversationId] ?? []; - const showList = !isNarrow || !activeConversationId; - const showThread = !isNarrow || Boolean(activeConversationId); - - const renderItem = React.useCallback( - (params) => , - [], - ); - - return ( - - - - Container width - - setWidth(value)} - min={320} - max={900} - valueLabelDisplay="auto" - valueLabelFormat={(value) => `${value}px`} - /> - - {width}px - - - - { - if (!effectiveConversationId) { - return; - } - - setThreads((prev) => ({ - ...prev, - [effectiveConversationId]: nextMessages, - })); - setConversations((prev) => - syncConversationPreview(prev, effectiveConversationId, nextMessages), - ); - }} - onConversationsChange={setConversations} - > - - - {showList && ( - - )} - {showThread && ( - - - {isNarrow && activeConversationId ? ( - - setActiveConversationId(undefined)} - sx={{ mr: 1 }} - > - - - - ) : null} - - - - - - - - - - - - - - - - - - - )} - - - - - - ); -} diff --git a/docs/data/chat/basics/layout/LayoutThreadOnlyStandalone.js b/docs/data/chat/basics/layout/LayoutThreadOnlyStandalone.js deleted file mode 100644 index 6418fc9db75f3..0000000000000 --- a/docs/data/chat/basics/layout/LayoutThreadOnlyStandalone.js +++ /dev/null @@ -1,78 +0,0 @@ -'use client'; -import * as React from 'react'; -import AttachIcon from '@mui/icons-material/AttachFile'; -import SendIcon from '@mui/icons-material/Send'; -import Box from '@mui/material/Box'; -import { - ChatComposer, - ChatComposerAttachButton, - ChatComposerSendButton, - ChatComposerTextArea, - ChatComposerToolbar, - ChatConversation, - ChatConversationHeader, - ChatConversationSubtitle, - ChatConversationTitle, - ChatMessageGroup, - ChatMessageList, -} from '@mui/x-chat'; -import { ChatLayout, ChatProvider } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ - respond: (text) => - `Received: "${text}". Only the thread pane is mounted in this ChatLayout example.`, -}); - -export default function LayoutThreadOnlyStandalone() { - const renderItem = React.useCallback( - (params) => , - [], - ); - - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/chat/basics/layout/LayoutTwoPaneStandalone.js b/docs/data/chat/basics/layout/LayoutTwoPaneStandalone.js deleted file mode 100644 index 622e69aa969dc..0000000000000 --- a/docs/data/chat/basics/layout/LayoutTwoPaneStandalone.js +++ /dev/null @@ -1,128 +0,0 @@ -'use client'; -import * as React from 'react'; -import AttachIcon from '@mui/icons-material/AttachFile'; -import SendIcon from '@mui/icons-material/Send'; -import Box from '@mui/material/Box'; -import { - ChatComposer, - ChatComposerAttachButton, - ChatComposerSendButton, - ChatComposerTextArea, - ChatComposerToolbar, - ChatConversation, - ChatConversationHeader, - ChatConversationList, - ChatConversationSubtitle, - ChatConversationTitle, - ChatMessageGroup, - ChatMessageList, -} from '@mui/x-chat'; -import { ChatLayout, ChatProvider } from '@mui/x-chat/headless'; - -import { - createEchoAdapter, - syncConversationPreview, -} from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - inboxConversations, - inboxThreads, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ - respond: (text) => - `Received: "${text}". This demo renders ChatLayout with an explicit conversation pane and thread pane.`, -}); - -export default function LayoutTwoPaneStandalone() { - const [activeConversationId, setActiveConversationId] = React.useState( - () => inboxConversations[0].id, - ); - const [conversations, setConversations] = React.useState(() => - inboxConversations.map((conversation) => ({ ...conversation })), - ); - const [threads, setThreads] = React.useState(() => - Object.fromEntries( - Object.entries(inboxThreads).map(([id, messages]) => [ - id, - messages.map((message) => ({ ...message })), - ]), - ), - ); - - const messages = threads[activeConversationId] ?? []; - - const renderItem = React.useCallback( - (params) => , - [], - ); - - return ( - { - if (nextId) { - setActiveConversationId(nextId); - } - }} - onMessagesChange={(nextMessages) => { - setThreads((prev) => ({ - ...prev, - [activeConversationId]: nextMessages, - })); - setConversations((prev) => - syncConversationPreview(prev, activeConversationId, nextMessages), - ); - }} - onConversationsChange={setConversations} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/docs/data/chat/basics/layout/LayoutRecomposedStandalone.tsx b/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/LayoutRecomposedStandalone.tsx similarity index 98% rename from docs/data/chat/basics/layout/LayoutRecomposedStandalone.tsx rename to docs/data/chat/basics/layout/demos/layout-recomposed-standalone/LayoutRecomposedStandalone.tsx index df3bc4d15572e..7a99624bec37e 100644 --- a/docs/data/chat/basics/layout/LayoutRecomposedStandalone.tsx +++ b/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/LayoutRecomposedStandalone.tsx @@ -27,6 +27,7 @@ const adapter = createEchoAdapter({ }); export default function LayoutRecomposedStandalone() { + // @focus-start @padding 1 const renderItem = React.useCallback( (params: { id: string; index: number }) => ( @@ -87,4 +88,5 @@ export default function LayoutRecomposedStandalone() { ); + // @focus-end } diff --git a/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/client.ts b/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/index.ts b/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/index.ts new file mode 100644 index 0000000000000..38ef071ac9838 --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-recomposed-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LayoutRecomposedStandalone from './LayoutRecomposedStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LayoutRecomposedStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/layout/LayoutResponsiveStandalone.tsx b/docs/data/chat/basics/layout/demos/layout-responsive-standalone/LayoutResponsiveStandalone.tsx similarity index 99% rename from docs/data/chat/basics/layout/LayoutResponsiveStandalone.tsx rename to docs/data/chat/basics/layout/demos/layout-responsive-standalone/LayoutResponsiveStandalone.tsx index 2b119f88ecb3f..48fcea2afa3e6 100644 --- a/docs/data/chat/basics/layout/LayoutResponsiveStandalone.tsx +++ b/docs/data/chat/basics/layout/demos/layout-responsive-standalone/LayoutResponsiveStandalone.tsx @@ -42,6 +42,7 @@ const adapter = createEchoAdapter({ }); export default function LayoutResponsiveStandalone() { + // @focus-start @padding 1 const [width, setWidth] = React.useState(720); const [activeConversationId, setActiveConversationId] = React.useState< string | undefined @@ -185,4 +186,5 @@ export default function LayoutResponsiveStandalone() { ); + // @focus-end } diff --git a/docs/data/chat/basics/layout/demos/layout-responsive-standalone/client.ts b/docs/data/chat/basics/layout/demos/layout-responsive-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-responsive-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/layout/demos/layout-responsive-standalone/index.ts b/docs/data/chat/basics/layout/demos/layout-responsive-standalone/index.ts new file mode 100644 index 0000000000000..510d515585590 --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-responsive-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LayoutResponsiveStandalone from './LayoutResponsiveStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LayoutResponsiveStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/layout/LayoutThreadOnlyStandalone.tsx b/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/LayoutThreadOnlyStandalone.tsx similarity index 98% rename from docs/data/chat/basics/layout/LayoutThreadOnlyStandalone.tsx rename to docs/data/chat/basics/layout/demos/layout-thread-only-standalone/LayoutThreadOnlyStandalone.tsx index b96ebf0b22313..1c590a032fcc1 100644 --- a/docs/data/chat/basics/layout/LayoutThreadOnlyStandalone.tsx +++ b/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/LayoutThreadOnlyStandalone.tsx @@ -29,6 +29,7 @@ const adapter = createEchoAdapter({ }); export default function LayoutThreadOnlyStandalone() { + // @focus-start @padding 1 const renderItem = React.useCallback( (params: { id: string }) => ( @@ -77,4 +78,5 @@ export default function LayoutThreadOnlyStandalone() { ); + // @focus-end } diff --git a/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/client.ts b/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/index.ts b/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/index.ts new file mode 100644 index 0000000000000..dcc738449c89b --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-thread-only-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LayoutThreadOnlyStandalone from './LayoutThreadOnlyStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LayoutThreadOnlyStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/layout/LayoutTwoPaneStandalone.tsx b/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/LayoutTwoPaneStandalone.tsx similarity index 98% rename from docs/data/chat/basics/layout/LayoutTwoPaneStandalone.tsx rename to docs/data/chat/basics/layout/demos/layout-two-pane-standalone/LayoutTwoPaneStandalone.tsx index 6714c572a0e59..f13df7ee44c5f 100644 --- a/docs/data/chat/basics/layout/LayoutTwoPaneStandalone.tsx +++ b/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/LayoutTwoPaneStandalone.tsx @@ -37,6 +37,7 @@ const adapter = createEchoAdapter({ }); export default function LayoutTwoPaneStandalone() { + // @focus-start @padding 1 const [activeConversationId, setActiveConversationId] = React.useState( () => inboxConversations[0].id, ); @@ -130,4 +131,5 @@ export default function LayoutTwoPaneStandalone() { ); + // @focus-end } diff --git a/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/client.ts b/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/index.ts b/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/index.ts new file mode 100644 index 0000000000000..9772b1fd5cf84 --- /dev/null +++ b/docs/data/chat/basics/layout/demos/layout-two-pane-standalone/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LayoutTwoPaneStandalone from './LayoutTwoPaneStandalone'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LayoutTwoPaneStandalone, { ClientProvider }); diff --git a/docs/data/chat/basics/layout/layout.md b/docs/data/chat/basics/layout/layout.md index 2ea4ce9ba2c89..8789fb93aad7b 100644 --- a/docs/data/chat/basics/layout/layout.md +++ b/docs/data/chat/basics/layout/layout.md @@ -50,7 +50,7 @@ ChatLayout The default composition renders the conversation list and the active thread side by side. Select a conversation in the sidebar to switch the thread: -{{"demo": "LayoutTwoPaneStandalone.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/layout-two-pane-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Sizing the panes @@ -73,7 +73,7 @@ Each pane slot receives a `pane` owner state (`'conversations'` or `'thread'`), When your application manages conversations externally, render only the thread pane inside `ChatLayout`. The demo below keeps the provider, message list, and composer but omits the conversation pane: -{{"demo": "LayoutThreadOnlyStandalone.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/layout-thread-only-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} In thread-only mode the active conversation fills the entire `ChatLayout` container. @@ -140,7 +140,7 @@ function CustomThread() { } ``` -{{"demo": "LayoutRecomposedStandalone.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/layout-recomposed-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} Wrap `CustomThread` with a [`ChatProvider`](/x/react-chat/headless/) from `@mui/x-chat/headless` to wire runtime state to your adapter. @@ -174,7 +174,7 @@ Drag the slider below to switch the same composition between: The demo below keeps the logic explicit so you can swap it for route-based navigation, a drawer, or any other responsive pattern: -{{"demo": "LayoutResponsiveStandalone.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/layout-responsive-standalone/index.ts", "bg": "inline", "collapseToEmpty": true}} When collapsing to a single pane, keep the navigation accessible: label the conversation list (for example `aria-label="Conversations"`) and give the narrow-mode back control an explicit label such as `aria-label="Back to conversations"`, as the demo above does. diff --git a/docs/data/chat/basics/messages/ChatMessageAuthorLabelPlayground.js b/docs/data/chat/basics/messages/ChatMessageAuthorLabelPlayground.js deleted file mode 100644 index dcb67273df7f2..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessageAuthorLabelPlayground.js +++ /dev/null @@ -1,91 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAuthorLabel, - ChatMessageGroup, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'author-label-playground', - title: 'Parts', - participants: [users.me, users.assistant], -}; - -function makeMessage(role, status, text) { - const author = role === 'user' ? users.me : users.assistant; - return { - id: `author-label-${role}-${status}`, - conversationId: conversation.id, - role, - author, - createdAt: '2026-05-03T09:30:00.000Z', - status, - parts: [{ type: 'text', text }], - }; -} - -const CLASS_DEFS = [ - { - name: 'authorLabel', - selector: '.MuiChatMessage-authorLabel', - description: 'Applied to the author label element above the bubble group.', - }, -]; - -export default function ChatMessageAuthorLabelPlayground() { - const [role, setRole] = React.useState('assistant'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const message = React.useMemo( - () => makeMessage(role, 'read', 'Author label preview message.'), - [role], - ); - - const labelSx = classesCustomizations.toClassesSx(); - - return ( - - fixture (message data) - - - } - preview={ - - - - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessageAvatarPlayground.js b/docs/data/chat/basics/messages/ChatMessageAvatarPlayground.js deleted file mode 100644 index e81d32dbb0b68..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessageAvatarPlayground.js +++ /dev/null @@ -1,106 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'avatar-playground', - title: 'Parts', - participants: [users.me, users.assistant], -}; - -function makeMessage(role, status, text) { - const author = role === 'user' ? users.me : users.assistant; - return { - id: `avatar-${role}-${status}`, - conversationId: conversation.id, - role, - author, - createdAt: '2026-05-03T09:30:00.000Z', - status, - parts: [{ type: 'text', text }], - }; -} - -const CLASS_DEFS = [ - { - name: 'avatar', - selector: '.MuiChatMessage-avatar', - description: 'Applied to the avatar element of the message row.', - }, -]; - -export default function ChatMessageAvatarPlayground() { - const [role, setRole] = React.useState('assistant'); - const [variant, setVariant] = React.useState('default'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const message = React.useMemo( - () => makeMessage(role, 'read', 'Avatar preview message.'), - [role], - ); - - const avatarSx = classesCustomizations.toClassesSx(); - - return ( - - fixture (message data) - - chrome provider - - - } - preview={ - - - - - - - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessageContentPlayground.js b/docs/data/chat/basics/messages/ChatMessageContentPlayground.js deleted file mode 100644 index 0aeb75dd87ced..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessageContentPlayground.js +++ /dev/null @@ -1,122 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, - SelectControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'content-playground', - title: 'Parts', - participants: [users.me, users.assistant], -}; - -function makeMessage(role, status, text) { - const author = role === 'user' ? users.me : users.assistant; - return { - id: `content-${role}-${status}`, - conversationId: conversation.id, - role, - author, - createdAt: '2026-05-03T09:30:00.000Z', - status, - parts: [{ type: 'text', text }], - }; -} - -const CLASS_DEFS = [ - { - name: 'content', - selector: '.MuiChatMessage-content', - description: 'The content slot wrapping the bubble + inline meta.', - }, - { - name: 'bubble', - selector: '.MuiChatMessage-bubble', - description: 'The actual rounded bubble element.', - }, -]; - -export default function ChatMessageContentPlayground() { - const [content, setContent] = React.useState('markdown'); - const [role, setRole] = React.useState('assistant'); - const [variant, setVariant] = React.useState('default'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const text = - content === 'markdown' - ? `**Markdown** is rendered automatically:\n\n- bullet one\n- bullet two\n\nInline \`code\` works too.` - : `Plain text with no formatting—just wraps naturally.`; - - const message = React.useMemo(() => makeMessage(role, 'read', text), [role, text]); - - const contentSx = classesCustomizations.toClassesSx(); - - return ( - - fixture (message data) - - - chrome provider - - - } - preview={ - - - - - - - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessageGroupPlayground.js b/docs/data/chat/basics/messages/ChatMessageGroupPlayground.js deleted file mode 100644 index b2ab1f60f5399..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessageGroupPlayground.js +++ /dev/null @@ -1,143 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, - NumberControl, - SwitchControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'group-playground', - title: 'Grouped messages', - participants: [users.me, users.assistant], -}; - -const sampleSnippets = [ - 'Three quick notes on theming.', - 'First—the avatar only renders for the first message in a group.', - 'Second—bubbles tighten vertically when grouped.', - 'Third—the meta line stays attached to the last bubble.', - 'Bonus—try toggling the variant on the right.', -]; - -const DEFAULTS = { - count: 3, - author: 'assistant', - variant: 'default', - density: 'standard', - interleave: false, -}; - -export default function ChatMessageGroupPlayground() { - const [count, setCount] = React.useState(DEFAULTS.count); - const [author, setAuthor] = React.useState(DEFAULTS.author); - const [variant, setVariant] = React.useState(DEFAULTS.variant); - const [density, setDensity] = React.useState(DEFAULTS.density); - const [interleave, setInterleave] = React.useState(DEFAULTS.interleave); - - const handleReset = React.useCallback(() => { - setCount(DEFAULTS.count); - setAuthor(DEFAULTS.author); - setVariant(DEFAULTS.variant); - setDensity(DEFAULTS.density); - setInterleave(DEFAULTS.interleave); - }, []); - - const messages = React.useMemo(() => { - const created = Date.UTC(2026, 4, 3, 10, 0, 0); - const flippedAuthor = author === 'assistant' ? 'user' : 'assistant'; - return Array.from({ length: count }, (_, i) => { - const altAuthor = interleave && i % 2 === 1 ? flippedAuthor : author; - const messageAuthor = altAuthor === 'user' ? users.me : users.assistant; - return { - id: `group-msg-${i}`, - conversationId: conversation.id, - role: altAuthor, - author: messageAuthor, - createdAt: new Date(created + i * 30_000).toISOString(), - status: 'read', - parts: [{ type: 'text', text: sampleSnippets[i % sampleSnippets.length] }], - }; - }); - }, [count, author, interleave]); - return ( - - fixture data - - - - chrome provider - - - - } - preview={ - - - - {messages.map((message) => ( - - - - - - - ))} - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessageInlineMetaPlayground.js b/docs/data/chat/basics/messages/ChatMessageInlineMetaPlayground.js deleted file mode 100644 index 9d8ab883d0946..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessageInlineMetaPlayground.js +++ /dev/null @@ -1,116 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, - ChatMessageInlineMeta, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'inline-meta-playground', - title: 'Parts', - participants: [users.me, users.assistant], -}; - -function makeMessage(role, status, text) { - const author = role === 'user' ? users.me : users.assistant; - return { - id: `inline-meta-${role}-${status}`, - conversationId: conversation.id, - role, - author, - createdAt: '2026-05-03T09:30:00.000Z', - status, - parts: [{ type: 'text', text }], - }; -} - -const CLASS_DEFS = [ - { - name: 'inlineMeta', - selector: '.MuiChatMessage-inlineMeta', - description: 'The container floating at the bottom-right of the bubble.', - }, - { - name: 'inlineMetaSpacer', - selector: '.MuiChatMessage-inlineMetaSpacer', - description: 'Reserved whitespace so text wraps around the meta block.', - }, -]; - -export default function ChatMessageInlineMetaPlayground() { - const [role, setRole] = React.useState('user'); - const [status, setStatus] = React.useState('read'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - const message = React.useMemo( - () => - makeMessage( - role, - status, - 'Inline meta sits at the bottom-right of this bubble.', - ), - [role, status], - ); - - const inlineSx = classesCustomizations.toClassesSx(); - - return ( - - fixture (message data) - - - - } - preview={ - - - - - - - } /> - - - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessageListPlayground.js b/docs/data/chat/basics/messages/ChatMessageListPlayground.js deleted file mode 100644 index c7184cf440071..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessageListPlayground.js +++ /dev/null @@ -1,246 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { ChatMessageList } from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, - NumberControl, - SwitchControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'list-playground', - title: 'Message list', - participants: [users.me, users.assistant, users.alice], -}; - -function buildMessages(messageCount, spanDays) { - const baseDay = Date.UTC(2026, 4, 3, 9, 0, 0); - const dayMs = 24 * 60 * 60 * 1000; - const authorRotation = [users.alice, users.assistant, users.me]; - return Array.from({ length: messageCount }, (_, i) => { - const author = authorRotation[i % authorRotation.length]; - const role = author === users.assistant ? 'assistant' : 'user'; - const dayOffset = spanDays - ? Math.floor(i / Math.max(1, Math.ceil(messageCount / 3))) - : 0; - const created = baseDay - dayOffset * dayMs + (i % 6) * 60_000; - return { - id: `list-msg-${i}`, - conversationId: conversation.id, - role, - author, - createdAt: new Date(created).toISOString(), - status: 'read', - parts: [ - { - type: 'text', - text: `Message ${i + 1} from ${author.displayName}.`, - }, - ], - }; - }).reverse(); -} - -const DEFAULTS = { - count: 8, - spanDays: true, - dateDivider: true, - autoScroll: true, - autoScrollBuffer: 150, - showOverlay: false, - variant: 'default', - density: 'standard', -}; - -const CLASS_DEFS = [ - { name: 'root', description: 'The root list element.' }, - { - name: 'scroller', - selector: '.MuiChatMessageList-scroller', - description: 'Scroller wrapper.', - }, - { - name: 'content', - selector: '.MuiChatMessageList-content', - description: 'Inner content area.', - }, -]; - -export default function ChatMessageListPlayground() { - const [count, setCount] = React.useState(DEFAULTS.count); - const [spanDays, setSpanDays] = React.useState(DEFAULTS.spanDays); - const [dateDivider, setDateDivider] = React.useState(DEFAULTS.dateDivider); - const [autoScroll, setAutoScroll] = React.useState(DEFAULTS.autoScroll); - const [autoScrollBuffer, setAutoScrollBuffer] = React.useState( - DEFAULTS.autoScrollBuffer, - ); - const [showOverlay, setShowOverlay] = React.useState(DEFAULTS.showOverlay); - const [variant, setVariant] = React.useState(DEFAULTS.variant); - const [density, setDensity] = React.useState(DEFAULTS.density); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const handleReset = React.useCallback(() => { - setCount(DEFAULTS.count); - setSpanDays(DEFAULTS.spanDays); - setDateDivider(DEFAULTS.dateDivider); - setAutoScroll(DEFAULTS.autoScroll); - setAutoScrollBuffer(DEFAULTS.autoScrollBuffer); - setShowOverlay(DEFAULTS.showOverlay); - setVariant(DEFAULTS.variant); - setDensity(DEFAULTS.density); - }, []); - - const messages = React.useMemo( - () => buildMessages(count, spanDays), - [count, spanDays], - ); - - let autoScrollValue; - if (!autoScroll) { - autoScrollValue = false; - } else if (autoScrollBuffer === DEFAULTS.autoScrollBuffer) { - autoScrollValue = true; - } else { - autoScrollValue = { buffer: autoScrollBuffer }; - } - - const overlay = showOverlay ? ( - ({ - position: 'absolute', - inset: theme.spacing(1), - display: 'flex', - alignItems: 'flex-start', - justifyContent: 'flex-end', - pointerEvents: 'none', - })} - > - ({ - pointerEvents: 'auto', - padding: theme.spacing(0.5, 1.25), - borderRadius: 16, - bgcolor: 'background.paper', - border: '1px solid', - borderColor: 'divider', - boxShadow: theme.shadows[1], - })} - > - - overlay slot - - - - ) : null; - - const listSx = classesCustomizations.toClassesSx(); - return ( - - props - - `${value}px`} - helperText="Distance from bottom to still trigger auto-scroll." - onChange={setAutoScrollBuffer} - /> - - - fixture data - - - chrome provider - - - - } - preview={ - - - - m.id)} - autoScroll={autoScrollValue} - overlay={overlay} - features={{ dateDivider }} - sx={listSx} - /> - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessageMetaPlayground.js b/docs/data/chat/basics/messages/ChatMessageMetaPlayground.js deleted file mode 100644 index ef59ea3c83a83..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessageMetaPlayground.js +++ /dev/null @@ -1,114 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, - ChatMessageMeta, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'meta-playground', - title: 'Parts', - participants: [users.me, users.assistant], -}; - -function makeMessage(role, status, text) { - const author = role === 'user' ? users.me : users.assistant; - return { - id: `meta-${role}-${status}`, - conversationId: conversation.id, - role, - author, - createdAt: '2026-05-03T09:30:00.000Z', - status, - parts: [{ type: 'text', text }], - }; -} - -const CLASS_DEFS = [ - { - name: 'meta', - selector: '.MuiChatMessage-meta', - description: 'External meta row containing timestamp + status.', - }, -]; - -export default function ChatMessageMetaPlayground() { - const [role, setRole] = React.useState('user'); - const [status, setStatus] = React.useState('read'); - const [variant, setVariant] = React.useState('compact'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - const message = React.useMemo( - () => makeMessage(role, status, 'Meta preview message.'), - [role, status], - ); - - const metaSx = classesCustomizations.toClassesSx(); - - return ( - - fixture (message data) - - - chrome provider - - - } - preview={ - - - - - - - - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessagePlayground.js b/docs/data/chat/basics/messages/ChatMessagePlayground.js deleted file mode 100644 index 13cd343686b6d..0000000000000 --- a/docs/data/chat/basics/messages/ChatMessagePlayground.js +++ /dev/null @@ -1,201 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - MessageErrorEffect, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { sampleTexts } from 'docs/src/modules/components/chat-playground/sharedFixtures'; -import { - ChoiceControl, - DividerLabel, - SelectControl, - SwitchControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'msg-playground', - title: 'Single message', - participants: [users.me, users.assistant], -}; - -const DEFAULTS = { - role: 'assistant', - status: 'read', - length: 'medium', - variant: 'default', - density: 'standard', - grouped: false, -}; - -const CLASS_DEFS = [ - { name: 'root', description: 'The message row.' }, - { - name: 'bubble', - selector: '.MuiChatMessage-bubble', - description: 'The actual rounded bubble inside the content slot.', - }, - { - name: 'roleUser', - selector: '.MuiChatMessage-roleUser', - description: 'Applied to rows whose role is "user".', - }, - { - name: 'roleAssistant', - selector: '.MuiChatMessage-roleAssistant', - description: 'Applied to rows whose role is "assistant".', - }, - { - name: 'streaming', - selector: '.MuiChatMessage-streaming', - description: 'Applied while the message is streaming.', - }, - { - name: 'error', - selector: '.MuiChatMessage-error', - description: 'Applied when the message has an error status.', - }, -]; - -export default function ChatMessagePlayground() { - const [role, setRole] = React.useState(DEFAULTS.role); - const [status, setStatus] = React.useState(DEFAULTS.status); - const [length, setLength] = React.useState(DEFAULTS.length); - const [variant, setVariant] = React.useState(DEFAULTS.variant); - const [density, setDensity] = React.useState(DEFAULTS.density); - const [grouped, setGrouped] = React.useState(DEFAULTS.grouped); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const handleReset = React.useCallback(() => { - setRole(DEFAULTS.role); - setStatus(DEFAULTS.status); - setLength(DEFAULTS.length); - setVariant(DEFAULTS.variant); - setDensity(DEFAULTS.density); - setGrouped(DEFAULTS.grouped); - }, []); - - const author = role === 'user' ? users.me : users.assistant; - - const message = React.useMemo( - () => ({ - id: 'msg-playground-bubble', - conversationId: conversation.id, - role, - author, - createdAt: '2026-05-03T09:30:00.000Z', - status, - parts: [{ type: 'text', text: sampleTexts[length] }], - }), - [role, author, status, length], - ); - - const messageSx = classesCustomizations.toClassesSx(); - - return ( - - props - - fixture (message data) - - - - chrome provider - - - - variant and density mainly affect meta and bubble spacing—see the Meta - and Inline meta playgrounds below. - - - } - preview={ - - - - - - - - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/basics/messages/StandaloneMessages.js b/docs/data/chat/basics/messages/StandaloneMessages.js deleted file mode 100644 index a5c6259022306..0000000000000 --- a/docs/data/chat/basics/messages/StandaloneMessages.js +++ /dev/null @@ -1,34 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { ChatConversation, ChatMessageList } from '@mui/x-chat'; -import { ChatProvider } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -export default function StandaloneMessages() { - return ( - - - - - - - - ); -} diff --git a/docs/data/chat/basics/messages/ChatMessageAuthorLabelPlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/ChatMessageAuthorLabelPlayground.tsx similarity index 92% rename from docs/data/chat/basics/messages/ChatMessageAuthorLabelPlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-author-label-playground/ChatMessageAuthorLabelPlayground.tsx index b4e9209679652..42cb3b6bc5290 100644 --- a/docs/data/chat/basics/messages/ChatMessageAuthorLabelPlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/ChatMessageAuthorLabelPlayground.tsx @@ -12,10 +12,8 @@ import { ChoiceControl, DividerLabel, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -51,6 +49,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageAuthorLabelPlayground() { + // @focus-start @padding 1 const [role, setRole] = React.useState('assistant'); const classesCustomizations = useCustomizations(CLASS_DEFS); @@ -96,4 +95,5 @@ export default function ChatMessageAuthorLabelPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/index.ts new file mode 100644 index 0000000000000..98b36d2388d79 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-author-label-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageAuthorLabelPlayground from './ChatMessageAuthorLabelPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageAuthorLabelPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/ChatMessageAvatarPlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/ChatMessageAvatarPlayground.tsx similarity index 93% rename from docs/data/chat/basics/messages/ChatMessageAvatarPlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-avatar-playground/ChatMessageAvatarPlayground.tsx index 2da7191c28640..4044d35b0f732 100644 --- a/docs/data/chat/basics/messages/ChatMessageAvatarPlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/ChatMessageAvatarPlayground.tsx @@ -20,10 +20,8 @@ import { ChoiceControl, DividerLabel, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -59,6 +57,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageAvatarPlayground() { + // @focus-start @padding 1 const [role, setRole] = React.useState('assistant'); const [variant, setVariant] = React.useState('default'); const classesCustomizations = useCustomizations(CLASS_DEFS); @@ -115,4 +114,5 @@ export default function ChatMessageAvatarPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/index.ts new file mode 100644 index 0000000000000..b171a8767c244 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-avatar-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageAvatarPlayground from './ChatMessageAvatarPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageAvatarPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/ChatMessageContentPlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-content-playground/ChatMessageContentPlayground.tsx similarity index 94% rename from docs/data/chat/basics/messages/ChatMessageContentPlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-content-playground/ChatMessageContentPlayground.tsx index ee71738d1a7be..b36467b2c1944 100644 --- a/docs/data/chat/basics/messages/ChatMessageContentPlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-content-playground/ChatMessageContentPlayground.tsx @@ -21,10 +21,8 @@ import { DividerLabel, SelectControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -65,6 +63,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageContentPlayground() { + // @focus-start @padding 1 const [content, setContent] = React.useState<'plain' | 'markdown'>('markdown'); const [role, setRole] = React.useState('assistant'); const [variant, setVariant] = React.useState('default'); @@ -131,4 +130,5 @@ export default function ChatMessageContentPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-content-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-content-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-content-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-content-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-content-playground/index.ts new file mode 100644 index 0000000000000..e06f36034ea01 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-content-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageContentPlayground from './ChatMessageContentPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageContentPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/ChatMessageGroupPlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-group-playground/ChatMessageGroupPlayground.tsx similarity index 99% rename from docs/data/chat/basics/messages/ChatMessageGroupPlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-group-playground/ChatMessageGroupPlayground.tsx index 1077d5bb396a8..9528e43fa82dd 100644 --- a/docs/data/chat/basics/messages/ChatMessageGroupPlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-group-playground/ChatMessageGroupPlayground.tsx @@ -48,6 +48,7 @@ const DEFAULTS = { }; export default function ChatMessageGroupPlayground() { + // @focus-start @padding 1 const [count, setCount] = React.useState(DEFAULTS.count); const [author, setAuthor] = React.useState<'assistant' | 'user'>(DEFAULTS.author); const [variant, setVariant] = React.useState(DEFAULTS.variant); @@ -145,4 +146,5 @@ export default function ChatMessageGroupPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-group-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-group-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-group-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-group-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-group-playground/index.ts new file mode 100644 index 0000000000000..ec40e3b4a61ea --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-group-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageGroupPlayground from './ChatMessageGroupPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageGroupPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/ChatMessageInlineMetaPlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/ChatMessageInlineMetaPlayground.tsx similarity index 93% rename from docs/data/chat/basics/messages/ChatMessageInlineMetaPlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/ChatMessageInlineMetaPlayground.tsx index 77ac3d2e2bf64..a4b0e9cac0d3f 100644 --- a/docs/data/chat/basics/messages/ChatMessageInlineMetaPlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/ChatMessageInlineMetaPlayground.tsx @@ -17,10 +17,8 @@ import { ChoiceControl, DividerLabel, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -61,6 +59,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageInlineMetaPlayground() { + // @focus-start @padding 1 const [role, setRole] = React.useState('user'); const [status, setStatus] = React.useState('read'); const classesCustomizations = useCustomizations(CLASS_DEFS); @@ -121,4 +120,5 @@ export default function ChatMessageInlineMetaPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/index.ts new file mode 100644 index 0000000000000..c03c798691779 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-inline-meta-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageInlineMetaPlayground from './ChatMessageInlineMetaPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageInlineMetaPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/ChatMessageListPlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-list-playground/ChatMessageListPlayground.tsx similarity index 96% rename from docs/data/chat/basics/messages/ChatMessageListPlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-list-playground/ChatMessageListPlayground.tsx index 9a4d21fb5b3e5..6537b0a85418f 100644 --- a/docs/data/chat/basics/messages/ChatMessageListPlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-list-playground/ChatMessageListPlayground.tsx @@ -19,10 +19,8 @@ import { NumberControl, SwitchControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -87,6 +85,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageListPlayground() { + // @focus-start @padding 1 const [count, setCount] = React.useState(DEFAULTS.count); const [spanDays, setSpanDays] = React.useState(DEFAULTS.spanDays); const [dateDivider, setDateDivider] = React.useState(DEFAULTS.dateDivider); @@ -253,4 +252,5 @@ export default function ChatMessageListPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-list-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-list-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-list-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-list-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-list-playground/index.ts new file mode 100644 index 0000000000000..bffe562ab1ac5 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-list-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageListPlayground from './ChatMessageListPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageListPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/ChatMessageMetaPlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-meta-playground/ChatMessageMetaPlayground.tsx similarity index 93% rename from docs/data/chat/basics/messages/ChatMessageMetaPlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-meta-playground/ChatMessageMetaPlayground.tsx index 1037b6a0a9de7..52a3ca7a7f25c 100644 --- a/docs/data/chat/basics/messages/ChatMessageMetaPlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-meta-playground/ChatMessageMetaPlayground.tsx @@ -21,10 +21,8 @@ import { ChoiceControl, DividerLabel, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -60,6 +58,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageMetaPlayground() { + // @focus-start @padding 1 const [role, setRole] = React.useState('user'); const [status, setStatus] = React.useState('read'); const [variant, setVariant] = React.useState('compact'); @@ -123,4 +122,5 @@ export default function ChatMessageMetaPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-meta-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-meta-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-meta-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-meta-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-meta-playground/index.ts new file mode 100644 index 0000000000000..a63e41806d6f6 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-meta-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageMetaPlayground from './ChatMessageMetaPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageMetaPlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/ChatMessagePlayground.tsx b/docs/data/chat/basics/messages/demos/chat-message-playground/ChatMessagePlayground.tsx similarity index 96% rename from docs/data/chat/basics/messages/ChatMessagePlayground.tsx rename to docs/data/chat/basics/messages/demos/chat-message-playground/ChatMessagePlayground.tsx index e196fddc0848f..71cadc11f2531 100644 --- a/docs/data/chat/basics/messages/ChatMessagePlayground.tsx +++ b/docs/data/chat/basics/messages/demos/chat-message-playground/ChatMessagePlayground.tsx @@ -26,10 +26,8 @@ import { SelectControl, SwitchControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -84,6 +82,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessagePlayground() { + // @focus-start @padding 1 const [role, setRole] = React.useState(DEFAULTS.role); const [status, setStatus] = React.useState(DEFAULTS.status); const [length, setLength] = React.useState(DEFAULTS.length); @@ -213,4 +212,5 @@ export default function ChatMessagePlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/basics/messages/demos/chat-message-playground/client.ts b/docs/data/chat/basics/messages/demos/chat-message-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/chat-message-playground/index.ts b/docs/data/chat/basics/messages/demos/chat-message-playground/index.ts new file mode 100644 index 0000000000000..84dc93ec1ffb2 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/chat-message-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessagePlayground from './ChatMessagePlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessagePlayground, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/StandaloneMessages.tsx b/docs/data/chat/basics/messages/demos/standalone-messages/StandaloneMessages.tsx similarity index 94% rename from docs/data/chat/basics/messages/StandaloneMessages.tsx rename to docs/data/chat/basics/messages/demos/standalone-messages/StandaloneMessages.tsx index a5c6259022306..936ef136ade8e 100644 --- a/docs/data/chat/basics/messages/StandaloneMessages.tsx +++ b/docs/data/chat/basics/messages/demos/standalone-messages/StandaloneMessages.tsx @@ -13,6 +13,7 @@ const adapter = createEchoAdapter(); export default function StandaloneMessages() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/basics/messages/demos/standalone-messages/client.ts b/docs/data/chat/basics/messages/demos/standalone-messages/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/basics/messages/demos/standalone-messages/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/basics/messages/demos/standalone-messages/index.ts b/docs/data/chat/basics/messages/demos/standalone-messages/index.ts new file mode 100644 index 0000000000000..30c6fd3e3ec87 --- /dev/null +++ b/docs/data/chat/basics/messages/demos/standalone-messages/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StandaloneMessages from './StandaloneMessages'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StandaloneMessages, { ClientProvider }); diff --git a/docs/data/chat/basics/messages/messages.md b/docs/data/chat/basics/messages/messages.md index 8832b4ea796f3..67d6854f7dc6a 100644 --- a/docs/data/chat/basics/messages/messages.md +++ b/docs/data/chat/basics/messages/messages.md @@ -16,19 +16,19 @@ components: ChatMessageList, ChatMessageGroup, ChatMessageAvatar, ChatMessageAut Toggle role, status, density, and grouping on a single `ChatMessage` bubble: -{{"demo": "ChatMessagePlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Group playground `ChatMessageGroup` collapses consecutive messages from the same author into a single visual cluster: -{{"demo": "ChatMessageGroupPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-group-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ### List playground `ChatMessageList` virtualizes rendering, manages auto-scroll, and can insert opt-in dividers between days: -{{"demo": "ChatMessageListPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-list-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## The `ChatMessage` data model @@ -159,7 +159,7 @@ The message list is a single Tab stop: a roving tabindex over the `role="article - The scroller is a `role="log"` polite live region, and a visually hidden `role="status"` region announces streaming transitions ("Assistant is responding" / "Response complete") exactly once each. - The thread, composer, and conversation list are exposed as labeled landmarks. -{{"demo": "../../material/message-list/KeyboardNavigation.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/message-list/demos/keyboard-navigation/index.ts", "bg": "inline", "collapseToEmpty": true}} Set `enableRovingFocus={false}` on the message list to opt out, and use the `useMessageContentTabIndex()` hook from `@mui/x-chat/headless` to let custom interactive content participate. @@ -170,7 +170,7 @@ See the complete model—including the drill-in lifecycle, per-list focus memory When building a custom layout outside of `ChatBox`, render `ChatMessageList` inside `ChatConversation` within a `ChatProvider`. The demo below isolates the message surface with only the provider, an active conversation scope, a bounded frame, and the message list composition: -{{"demo": "StandaloneMessages.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/standalone-messages/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Message slots @@ -180,28 +180,28 @@ Each slot inside the `ChatMessage` row has its own playground—iterate on a sin The author avatar slot—falls back to initials when no `avatarUrl` is set. -{{"demo": "ChatMessageAvatarPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-avatar-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} #### Author label Displays the author name above grouped messages. -{{"demo": "ChatMessageAuthorLabelPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-author-label-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} #### Content The bubble interior—renders markdown, code fences, and tool or source parts. -{{"demo": "ChatMessageContentPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-content-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} #### Meta External timestamp and delivery status, used by compact bubbles. -{{"demo": "ChatMessageMetaPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-meta-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} #### Inline meta Telegram-style timestamp and status flowing inside the bubble. -{{"demo": "ChatMessageInlineMetaPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-inline-meta-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} diff --git a/docs/data/chat/basics/variants-and-density/variants-and-density.md b/docs/data/chat/basics/variants-and-density/variants-and-density.md index 33394314724da..3e7d9bac0d6f4 100644 --- a/docs/data/chat/basics/variants-and-density/variants-and-density.md +++ b/docs/data/chat/basics/variants-and-density/variants-and-density.md @@ -41,7 +41,7 @@ Compact mode applies the following changes to the message list: The demo below shows the compact variant applied to a `ChatBox`: -{{"demo": "../../material/message-list/CompactVariant.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/message-list/demos/compact-variant/index.ts", "bg": "inline", "collapseToEmpty": true}} ### When to use each variant @@ -68,7 +68,7 @@ Three values are available—`compact`, `standard` (default), and `comfortable` Use the toggle in the demo below to compare the three density levels: -{{"demo": "../../material/message-list/DensityProp.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/message-list/demos/density-prop/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Density effects diff --git a/docs/data/chat/behavior/attachments/AttachmentValidation.js b/docs/data/chat/behavior/attachments/AttachmentValidation.js deleted file mode 100644 index 3c3cf7604749e..0000000000000 --- a/docs/data/chat/behavior/attachments/AttachmentValidation.js +++ /dev/null @@ -1,56 +0,0 @@ -'use client'; -import * as React from 'react'; -import Alert from '@mui/material/Alert'; -import { ChatBox } from '@mui/x-chat'; - -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -const REASON_LABELS = { - 'mime-type': 'file type not accepted (images and PDF only)', - 'file-size': 'larger than 500 KB', - 'file-count': 'more than 3 files per message', -}; - -export default function AttachmentValidation() { - const [rejections, setRejections] = React.useState([]); - - return ( -
- - {rejections.length > 0 && ( - setRejections([])} sx={{ mt: 1 }}> - {rejections.map(({ file, reason }) => ( -
- {file.name} — {REASON_LABELS[reason]} -
- ))} -
- )} -
- ); -} diff --git a/docs/data/chat/behavior/attachments/ChatComposerAttachButtonPlayground.js b/docs/data/chat/behavior/attachments/ChatComposerAttachButtonPlayground.js deleted file mode 100644 index daa846eccb332..0000000000000 --- a/docs/data/chat/behavior/attachments/ChatComposerAttachButtonPlayground.js +++ /dev/null @@ -1,99 +0,0 @@ -import * as React from 'react'; -import ImageIcon from '@mui/icons-material/Image'; -import PaperclipIcon from '@mui/icons-material/AttachFile'; -import Box from '@mui/material/Box'; -import { - ChatComposer, - ChatComposerAttachButton, - ChatComposerTextArea, -} from '@mui/x-chat'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { emptyConversation } from 'docs/src/modules/components/chat-playground/sharedFixtures'; -import { - ChoiceControl, - DividerLabel, - SwitchControl, - TextControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const icons = { - paperclip: , - image: , -}; - -const CLASS_DEFS = [ - { - name: 'attachButton', - selector: '.MuiChatComposer-attachButton', - description: 'The attach button element inside the composer.', - }, -]; - -export default function ChatComposerAttachButtonPlayground() { - const [icon, setIcon] = React.useState('paperclip'); - const [accept, setAccept] = React.useState('image/*,application/pdf'); - const [disabled, setDisabled] = React.useState(false); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const wrapperSx = classesCustomizations.toClassesSx(); - - return ( - - props - - composition - - features.attachments (parent) - - - } - preview={ - - - s.trim()), - }, - }} - > - - - - {icons[icon]} - - - - - - } - /> - ); -} diff --git a/docs/data/chat/behavior/attachments/ChatComposerAttachmentListPlayground.js b/docs/data/chat/behavior/attachments/ChatComposerAttachmentListPlayground.js deleted file mode 100644 index 493acf13665d9..0000000000000 --- a/docs/data/chat/behavior/attachments/ChatComposerAttachmentListPlayground.js +++ /dev/null @@ -1,113 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { ChatComposerAttachmentList } from '@mui/x-chat'; -import { useChatStore } from '@mui/x-chat/headless'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { emptyConversation } from 'docs/src/modules/components/chat-playground/sharedFixtures'; -import { - ChoiceControl, - DividerLabel, - NumberControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const POOL = [ - { name: 'design-spec.pdf', type: 'application/pdf', size: 134_512 }, - { name: 'screenshot.png', type: 'image/png', size: 982_146 }, - { name: 'release-notes.md', type: 'text/markdown', size: 4_220 }, - { name: 'palette.svg', type: 'image/svg+xml', size: 18_734 }, - { name: 'spec-v2.docx', type: 'application/vnd.openxmlformats', size: 76_891 }, -]; - -const PROGRESS_BY_STATUS = { - queued: 0, - uploading: 45, - uploaded: 100, - error: 0, -}; - -function makeDraftAttachments(files, status) { - return files.map((spec, index) => { - const file = new File(['placeholder'], spec.name, { type: spec.type }); - try { - Object.defineProperty(file, 'size', { value: spec.size }); - } catch { - // size is read-only in some runtimes; the preview still renders the chip. - } - return { - localId: `demo-attachment-${index}-${spec.name.replace(/[^a-z0-9]+/gi, '-').toLowerCase()}`, - file, - status, - progress: PROGRESS_BY_STATUS[status], - }; - }); -} - -function AttachmentsEffect({ files, status }) { - const store = useChatStore(); - React.useEffect(() => { - store.setComposerAttachments(makeDraftAttachments(files, status)); - return () => { - store.setComposerAttachments([]); - }; - }, [store, files, status]); - return null; -} - -const CLASS_DEFS = [ - { - name: 'attachmentList', - selector: '.MuiChatComposer-attachmentList', - description: 'The pending attachments row above the textarea.', - }, -]; - -export default function ChatComposerAttachmentListPlayground() { - const [count, setCount] = React.useState(2); - const [status, setStatus] = React.useState('uploaded'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - const files = React.useMemo(() => POOL.slice(0, count), [count]); - - const wrapperSx = classesCustomizations.toClassesSx(); - - return ( - - state (store) - - - - } - preview={ - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/behavior/attachments/attachments.md b/docs/data/chat/behavior/attachments/attachments.md index e82f9f2da4483..c6343a0925f54 100644 --- a/docs/data/chat/behavior/attachments/attachments.md +++ b/docs/data/chat/behavior/attachments/attachments.md @@ -20,9 +20,9 @@ Selected files are queued as draft attachments and previewed in the composer are The demos below let you tune the attach button and the pending-attachment list: The attachment-list playground seeds draft attachments directly into the chat store so that every status can be previewed without uploading files — in an app, attachments are added through the file picker or `addAttachment()`. -{{"demo": "ChatComposerAttachButtonPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-composer-attach-button-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} -{{"demo": "ChatComposerAttachmentListPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-composer-attachment-list-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Disabling attachments @@ -33,7 +33,7 @@ To hide the attach button entirely, set the `attachments` feature flag to `false ``` -{{"demo": "../../material/composer/ComposerHiddenAttachButton.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/composer/demos/composer-hidden-attach-button/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Validating attachments @@ -59,7 +59,7 @@ Pass a configuration object to the `attachments` feature flag to control which f Try attaching a file that is not an image or PDF, or one larger than 500 KB: -{{"demo": "AttachmentValidation.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/attachment-validation/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Attachments configuration reference diff --git a/docs/data/chat/behavior/attachments/AttachmentValidation.tsx b/docs/data/chat/behavior/attachments/demos/attachment-validation/AttachmentValidation.tsx similarity index 97% rename from docs/data/chat/behavior/attachments/AttachmentValidation.tsx rename to docs/data/chat/behavior/attachments/demos/attachment-validation/AttachmentValidation.tsx index 37563dec7a386..d2c3b88e55a35 100644 --- a/docs/data/chat/behavior/attachments/AttachmentValidation.tsx +++ b/docs/data/chat/behavior/attachments/demos/attachment-validation/AttachmentValidation.tsx @@ -18,6 +18,7 @@ const REASON_LABELS: Record = { }; export default function AttachmentValidation() { + // @focus-start @padding 1 const [rejections, setRejections] = React.useState([]); return ( @@ -53,4 +54,5 @@ export default function AttachmentValidation() { )}
); + // @focus-end } diff --git a/docs/data/chat/behavior/attachments/demos/attachment-validation/client.ts b/docs/data/chat/behavior/attachments/demos/attachment-validation/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/attachments/demos/attachment-validation/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/attachments/demos/attachment-validation/index.ts b/docs/data/chat/behavior/attachments/demos/attachment-validation/index.ts new file mode 100644 index 0000000000000..3a4e56e6f3cc9 --- /dev/null +++ b/docs/data/chat/behavior/attachments/demos/attachment-validation/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AttachmentValidation from './AttachmentValidation'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AttachmentValidation, { ClientProvider }); diff --git a/docs/data/chat/behavior/attachments/ChatComposerAttachButtonPlayground.tsx b/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/ChatComposerAttachButtonPlayground.tsx similarity index 93% rename from docs/data/chat/behavior/attachments/ChatComposerAttachButtonPlayground.tsx rename to docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/ChatComposerAttachButtonPlayground.tsx index 0f1ac281457ae..8776d6cd98db9 100644 --- a/docs/data/chat/behavior/attachments/ChatComposerAttachButtonPlayground.tsx +++ b/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/ChatComposerAttachButtonPlayground.tsx @@ -16,10 +16,8 @@ import { SwitchControl, TextControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; type IconChoice = 'paperclip' | 'image'; @@ -39,6 +37,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatComposerAttachButtonPlayground() { + // @focus-start @padding 1 const [icon, setIcon] = React.useState('paperclip'); const [accept, setAccept] = React.useState('image/*,application/pdf'); const [disabled, setDisabled] = React.useState(false); @@ -103,4 +102,5 @@ export default function ChatComposerAttachButtonPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/client.ts b/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/index.ts b/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/index.ts new file mode 100644 index 0000000000000..34597f5424806 --- /dev/null +++ b/docs/data/chat/behavior/attachments/demos/chat-composer-attach-button-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatComposerAttachButtonPlayground from './ChatComposerAttachButtonPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatComposerAttachButtonPlayground, { ClientProvider }); diff --git a/docs/data/chat/behavior/attachments/ChatComposerAttachmentListPlayground.tsx b/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/ChatComposerAttachmentListPlayground.tsx similarity index 91% rename from docs/data/chat/behavior/attachments/ChatComposerAttachmentListPlayground.tsx rename to docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/ChatComposerAttachmentListPlayground.tsx index 83f9fc8fc94b2..3d670e8eedf26 100644 --- a/docs/data/chat/behavior/attachments/ChatComposerAttachmentListPlayground.tsx +++ b/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/ChatComposerAttachmentListPlayground.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import { ChatComposerAttachmentList } from '@mui/x-chat'; -import { useChatStore, type ChatDraftAttachmentStatus } from '@mui/x-chat/headless'; +import { useChatStore } from '@mui/x-chat/headless'; +import type { ChatDraftAttachmentStatus } from '@mui/x-chat/headless'; import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; import { emptyConversation } from 'docs/src/modules/components/chat-playground/sharedFixtures'; @@ -10,10 +11,8 @@ import { DividerLabel, NumberControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; interface FileSpec { name: string; @@ -81,6 +80,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatComposerAttachmentListPlayground() { + // @focus-start @padding 1 const [count, setCount] = React.useState(2); const [status, setStatus] = React.useState('uploaded'); const classesCustomizations = useCustomizations(CLASS_DEFS); @@ -127,4 +127,5 @@ export default function ChatComposerAttachmentListPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/client.ts b/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/index.ts b/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/index.ts new file mode 100644 index 0000000000000..9255bd87d10f1 --- /dev/null +++ b/docs/data/chat/behavior/attachments/demos/chat-composer-attachment-list-playground/index.ts @@ -0,0 +1,8 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatComposerAttachmentListPlayground from './ChatComposerAttachmentListPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatComposerAttachmentListPlayground, { + ClientProvider, +}); diff --git a/docs/data/chat/behavior/error-handling/ChatMessageErrorPlayground.js b/docs/data/chat/behavior/error-handling/ChatMessageErrorPlayground.js deleted file mode 100644 index 820700f79b7bf..0000000000000 --- a/docs/data/chat/behavior/error-handling/ChatMessageErrorPlayground.js +++ /dev/null @@ -1,143 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { ChatMessage } from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - MessageErrorEffect, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, - SwitchControl, - TextControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'error-playground', - title: 'Error preview', - participants: [users.me, users.assistant], -}; - -const message = { - // A user message: the built-in retry button only renders for user messages - // (retrying re-sends the original prompt), so the `retryable` toggle below is - // only meaningful here. - id: 'error-msg', - conversationId: conversation.id, - role: 'user', - author: users.me, - createdAt: '2026-05-03T10:00:00.000Z', - status: 'error', - parts: [{ type: 'text', text: 'This message failed to send.' }], -}; - -const CLASS_DEFS = [ - { name: 'root', description: 'The error card root element.' }, - { - name: 'message', - selector: '.MuiChatMessageError-message', - description: 'The error message text.', - }, - { - name: 'retryButton', - selector: '.MuiChatMessageError-retryButton', - description: 'The retry button.', - }, -]; - -export default function ChatMessageErrorPlayground() { - const [enabled, setEnabled] = React.useState(true); - const [code, setCode] = React.useState('SEND_ERROR'); - const [retryable, setRetryable] = React.useState(true); - const [text, setText] = React.useState('Could not reach the chat server.'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const errorRowSx = classesCustomizations.toClassesSx(); - - return ( - - state (message error) - - - - - - } - preview={ - - - - {/* - The retry button rendered inside ChatMessageError already calls the - public useChat().retry(messageId) action for you — no extra wiring - is needed here. - */} - - - {enabled - ? `ChatError — code: ${code} · retryable: ${retryable}` - : 'Error disabled'} - - - - } - /> - ); -} diff --git a/docs/data/chat/behavior/error-handling/RetryRecovery.js b/docs/data/chat/behavior/error-handling/RetryRecovery.js deleted file mode 100644 index f439bb74f95f1..0000000000000 --- a/docs/data/chat/behavior/error-handling/RetryRecovery.js +++ /dev/null @@ -1,80 +0,0 @@ -'use client'; -import * as React from 'react'; -import Alert from '@mui/material/Alert'; -import { ChatBox } from '@mui/x-chat'; - -import { - minimalConversation, - minimalMessages, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; -import { - createChunkStream, - createTextResponseChunks, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -const demoMembers = [demoUsers.you, demoUsers.agent]; - -function useFlakyAdapter() { - // Tracks the message ids that already failed once. The first attempt for a - // given id always throws; the retry (same id) succeeds. - const failedOnce = React.useRef(new Set()); - - return React.useMemo( - () => ({ - async sendMessage({ message }) { - if (!failedOnce.current.has(message.id)) { - failedOnce.current.add(message.id); - throw new Error( - 'Network error: the first attempt always fails in this demo.', - ); - } - - return createChunkStream( - createTextResponseChunks( - `${message.id}-reply`, - 'Recovered! The retry reached the server and this reply streamed in.', - { author: demoUsers.agent }, - ), - ); - }, - }), - [], - ); -} - -export default function RetryRecovery() { - const adapter = useFlakyAdapter(); - const [error, setError] = React.useState(null); - - return ( -
- { - // A successful retry streams a reply to completion — clear the banner. - if (!isError && !isAbort && !isDisconnect) { - setError(null); - } - }} - sx={{ - height: 460, - border: '1px solid', - borderColor: 'divider', - borderRadius: 1, - }} - /> - {error && ( - - {error.code} · {error.source} · recoverable: {String(error.recoverable)} · - retryable: {String(error.retryable ?? false)} - - )} -
- ); -} diff --git a/docs/data/chat/behavior/error-handling/ChatMessageErrorPlayground.tsx b/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/ChatMessageErrorPlayground.tsx similarity index 95% rename from docs/data/chat/behavior/error-handling/ChatMessageErrorPlayground.tsx rename to docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/ChatMessageErrorPlayground.tsx index 001790ce1ea70..2b0cfdbb9cffb 100644 --- a/docs/data/chat/behavior/error-handling/ChatMessageErrorPlayground.tsx +++ b/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/ChatMessageErrorPlayground.tsx @@ -17,10 +17,8 @@ import { SwitchControl, TextControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -61,6 +59,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageErrorPlayground() { + // @focus-start @padding 1 const [enabled, setEnabled] = React.useState(true); const [code, setCode] = React.useState('SEND_ERROR'); const [retryable, setRetryable] = React.useState(true); @@ -152,4 +151,5 @@ export default function ChatMessageErrorPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/client.ts b/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/index.ts b/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/index.ts new file mode 100644 index 0000000000000..af28f9ab2255c --- /dev/null +++ b/docs/data/chat/behavior/error-handling/demos/chat-message-error-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageErrorPlayground from './ChatMessageErrorPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageErrorPlayground, { ClientProvider }); diff --git a/docs/data/chat/behavior/error-handling/RetryRecovery.tsx b/docs/data/chat/behavior/error-handling/demos/retry-recovery/RetryRecovery.tsx similarity index 98% rename from docs/data/chat/behavior/error-handling/RetryRecovery.tsx rename to docs/data/chat/behavior/error-handling/demos/retry-recovery/RetryRecovery.tsx index 065fb450ab9ac..6883988736ebf 100644 --- a/docs/data/chat/behavior/error-handling/RetryRecovery.tsx +++ b/docs/data/chat/behavior/error-handling/demos/retry-recovery/RetryRecovery.tsx @@ -44,6 +44,7 @@ function useFlakyAdapter(): ChatAdapter { } export default function RetryRecovery() { + // @focus-start @padding 1 const adapter = useFlakyAdapter(); const [error, setError] = React.useState(null); @@ -77,4 +78,5 @@ export default function RetryRecovery() { )} ); + // @focus-end } diff --git a/docs/data/chat/behavior/error-handling/demos/retry-recovery/client.ts b/docs/data/chat/behavior/error-handling/demos/retry-recovery/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/error-handling/demos/retry-recovery/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/error-handling/demos/retry-recovery/index.ts b/docs/data/chat/behavior/error-handling/demos/retry-recovery/index.ts new file mode 100644 index 0000000000000..b70062fb34ed9 --- /dev/null +++ b/docs/data/chat/behavior/error-handling/demos/retry-recovery/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RetryRecovery from './RetryRecovery'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RetryRecovery, { ClientProvider }); diff --git a/docs/data/chat/behavior/error-handling/error-handling.md b/docs/data/chat/behavior/error-handling/error-handling.md index 43917097e84ae..e2294e783c5a1 100644 --- a/docs/data/chat/behavior/error-handling/error-handling.md +++ b/docs/data/chat/behavior/error-handling/error-handling.md @@ -19,7 +19,7 @@ You don't need to catch errors inside adapter methods. The runtime handles them The demo below lets you toggle a message error and observe the `ChatMessageError` component rendered under the failed message: -{{"demo": "ChatMessageErrorPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-error-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Error propagation @@ -49,7 +49,7 @@ Use the `onError` prop on `ChatBox` to handle errors at the application level: The demo below shows the default error UI surfaced by `ChatBox` when `sendMessage()` fails: -{{"demo": "../../material/examples/error-state/ErrorState.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/examples/error-state/demos/error-state/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Error object structure @@ -133,7 +133,7 @@ function RetryButton({ messageId }: { messageId: string }) { The demo below fails the first send attempt, then succeeds when you click **Retry**: -{{"demo": "RetryRecovery.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/retry-recovery/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Error from adapter methods diff --git a/docs/data/chat/behavior/scrolling/AutoScrollBuffer.js b/docs/data/chat/behavior/scrolling/AutoScrollBuffer.js deleted file mode 100644 index d210b6820557f..0000000000000 --- a/docs/data/chat/behavior/scrolling/AutoScrollBuffer.js +++ /dev/null @@ -1,115 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Stack from '@mui/material/Stack'; -import Switch from '@mui/material/Switch'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import Typography from '@mui/material/Typography'; -import { ChatBox } from '@mui/x-chat'; - -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - createTextMessage, - demoUsers, - minimalConversation, -} from 'docs/data/chat/core/examples/shared/demoData'; - -// A handful of short messages so the list overflows and there is room to scroll -// up while a reply streams in. -const filler = Array.from({ length: 12 }, (_, i) => - createTextMessage({ - id: `buffer-msg-${i}`, - conversationId: minimalConversation.id, - role: i % 2 === 0 ? 'user' : 'assistant', - createdAt: new Date(Date.UTC(2026, 2, 15, 9, 30, i)).toISOString(), - text: - i % 2 === 0 - ? `Question ${i / 2 + 1}: how does the buffer threshold work?` - : `Answer ${Math.ceil(i / 2)}: auto-scroll keeps following until you scroll past it.`, - }), -); - -const initialMessages = filler; - -// A long, multi-sentence reply so streaming lasts long enough to scroll during it. -const longReply = [ - 'Auto-scroll keeps the newest content in view while a response streams in.', - 'It only follows along while you stay close to the bottom of the list.', - 'The buffer is the distance, in pixels, from the bottom where following stops.', - 'Scroll up past the buffer and the list stops chasing the stream.', - 'That lets you read earlier messages without the view yanking back down.', - 'Scroll back within the buffer and auto-scroll resumes immediately.', - 'A larger buffer keeps following even when you nudge the list up a little.', - 'A smaller buffer pauses sooner, the moment you start scrolling away.', - 'When auto-scroll is off, the stream never moves the viewport for you.', - 'Use the scroll-to-bottom affordance to jump back to the latest message.', -].join(' '); - -const adapter = createEchoAdapter({ - agent: demoUsers.agent, - delayMs: 120, - respond: () => longReply, -}); - -export default function AutoScrollBuffer() { - const [autoScroll, setAutoScroll] = React.useState(true); - const [buffer, setBuffer] = React.useState(150); - - return ( - - - setAutoScroll(event.target.checked)} - /> - } - label="Auto-scroll" - /> -
- - buffer (px) - - { - if (next != null) { - setBuffer(next); - } - }} - > - 150 - 300 - 600 - -
-
- -
- ); -} diff --git a/docs/data/chat/behavior/scrolling/ChatScrollToBottomAffordancePlayground.js b/docs/data/chat/behavior/scrolling/ChatScrollToBottomAffordancePlayground.js deleted file mode 100644 index a1c0ecdc11d2d..0000000000000 --- a/docs/data/chat/behavior/scrolling/ChatScrollToBottomAffordancePlayground.js +++ /dev/null @@ -1,177 +0,0 @@ -import * as React from 'react'; -import Alert from '@mui/material/Alert'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; - -import { ChatMessageList, ChatScrollToBottomAffordance } from '@mui/x-chat'; -import { useChat, useChatStore } from '@mui/x-chat/headless'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { MessageBubble } from 'docs/src/modules/components/chat-playground/MessageBubble'; -import { - ChoiceControl, - DividerLabel, - NumberControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'scroll-playground', - title: 'Scroll preview', - participants: [users.me, users.assistant], -}; - -function buildMessages(count) { - return Array.from({ length: count }, (_, i) => ({ - id: `scroll-msg-${i}`, - conversationId: conversation.id, - role: i % 2 === 0 ? 'assistant' : 'user', - author: i % 2 === 0 ? users.assistant : users.me, - createdAt: new Date(Date.UTC(2026, 4, 3, 9, 0, i)).toISOString(), - status: 'read', - parts: [{ type: 'text', text: `Message ${i + 1} of ${count}` }], - })); -} - -function buildAppendedMessage(n) { - return { - id: `scroll-extra-${n}`, - conversationId: conversation.id, - role: 'assistant', - author: users.assistant, - createdAt: new Date(Date.UTC(2026, 4, 3, 10, 0, n)).toISOString(), - status: 'read', - parts: [ - { - type: 'text', - text: `New message #${n} arrived while you were scrolled up.`, - }, - ], - }; -} - -const CLASS_DEFS = [ - { name: 'root', description: 'The floating affordance button.' }, -]; - -/** - * Renders the live message list and appends a message on demand. - * - * The list is fed from live store state (`useChat().messages`), not the seed - * array, so an appended message shows up as a pure append — which is what grows - * the affordance's `unseenMessageCount` badge while the user is scrolled up. - * - * `appendRequest` is a counter owned by the parent (bumped by the "Append - * message" button). Adding a message to a chat is a store operation, so we call - * the public `useChatStore().addMessage()` from inside the provider rather than - * plumbing a callback back out to the button. Each new counter value appends one - * assistant message; `addMessage` is idempotent per id, so re-runs are harmless. - */ -function ScrollPreview({ scrollBehavior, buttonSx, appendRequest }) { - const { messages: liveMessages } = useChat(); - const store = useChatStore(); - - React.useEffect(() => { - if (appendRequest > 0) { - store.addMessage(buildAppendedMessage(appendRequest)); - } - }, [store, appendRequest]); - - return ( - - m.id)} - autoScroll={false} - renderItem={({ id }) => } - overlay={ - - } - /> - - ); -} - -export default function ChatScrollToBottomAffordancePlayground() { - const [count, setCount] = React.useState(20); - const [scrollBehavior, setScrollBehavior] = React.useState('smooth'); - // Bumped by the "Append message" button; consumed by `ScrollPreview` inside - // the provider to append one message to the live store. - const [appendRequest, setAppendRequest] = React.useState(0); - const classesCustomizations = useCustomizations(CLASS_DEFS); - const messages = React.useMemo(() => buildMessages(count), [count]); - - const buttonSx = classesCustomizations.toClassesSx(); - - return ( - - props - - fixture data - { - setCount(next); - setAppendRequest(0); - }} - /> - - - Scroll up inside the preview to make the affordance appear. Auto-scroll - is disabled in this preview so the affordance stays reachable. Append - messages while scrolled up to see the unseen-count badge. - - - } - preview={ - - - - } - /> - ); -} diff --git a/docs/data/chat/behavior/scrolling/AutoScrollBuffer.tsx b/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/AutoScrollBuffer.tsx similarity index 98% rename from docs/data/chat/behavior/scrolling/AutoScrollBuffer.tsx rename to docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/AutoScrollBuffer.tsx index 50c1d5e08de0d..e45fa935fe68d 100644 --- a/docs/data/chat/behavior/scrolling/AutoScrollBuffer.tsx +++ b/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/AutoScrollBuffer.tsx @@ -56,6 +56,7 @@ const adapter = createEchoAdapter({ type Buffer = 150 | 300 | 600; export default function AutoScrollBuffer() { + // @focus-start @padding 1 const [autoScroll, setAutoScroll] = React.useState(true); const [buffer, setBuffer] = React.useState(150); @@ -114,4 +115,5 @@ export default function AutoScrollBuffer() { /> ); + // @focus-end } diff --git a/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/client.ts b/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/index.ts b/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/index.ts new file mode 100644 index 0000000000000..026fb4e965bc2 --- /dev/null +++ b/docs/data/chat/behavior/scrolling/demos/auto-scroll-buffer/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AutoScrollBuffer from './AutoScrollBuffer'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AutoScrollBuffer, { ClientProvider }); diff --git a/docs/data/chat/behavior/scrolling/ChatScrollToBottomAffordancePlayground.tsx b/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/ChatScrollToBottomAffordancePlayground.tsx similarity index 94% rename from docs/data/chat/behavior/scrolling/ChatScrollToBottomAffordancePlayground.tsx rename to docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/ChatScrollToBottomAffordancePlayground.tsx index 71ce13d8161ce..0aec6b53b992c 100644 --- a/docs/data/chat/behavior/scrolling/ChatScrollToBottomAffordancePlayground.tsx +++ b/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/ChatScrollToBottomAffordancePlayground.tsx @@ -4,12 +4,8 @@ import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import type { SxProps, Theme } from '@mui/system'; import { ChatMessageList, ChatScrollToBottomAffordance } from '@mui/x-chat'; -import { - useChat, - useChatStore, - type ChatConversation, - type ChatMessage, -} from '@mui/x-chat/headless'; +import { useChat, useChatStore } from '@mui/x-chat/headless'; +import type { ChatConversation, ChatMessage } from '@mui/x-chat/headless'; import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; import { MessageBubble } from 'docs/src/modules/components/chat-playground/MessageBubble'; @@ -18,10 +14,8 @@ import { DividerLabel, NumberControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -125,6 +119,7 @@ interface ScrollPreviewProps { } export default function ChatScrollToBottomAffordancePlayground() { + // @focus-start @padding 1 const [count, setCount] = React.useState(20); const [scrollBehavior, setScrollBehavior] = React.useState('smooth'); @@ -197,4 +192,5 @@ export default function ChatScrollToBottomAffordancePlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/client.ts b/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/index.ts b/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/index.ts new file mode 100644 index 0000000000000..a3e7cb17e9352 --- /dev/null +++ b/docs/data/chat/behavior/scrolling/demos/chat-scroll-to-bottom-affordance-playground/index.ts @@ -0,0 +1,8 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatScrollToBottomAffordancePlayground from './ChatScrollToBottomAffordancePlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatScrollToBottomAffordancePlayground, { + ClientProvider, +}); diff --git a/docs/data/chat/behavior/scrolling/scrolling.md b/docs/data/chat/behavior/scrolling/scrolling.md index a033f1587159d..0a70bfea5d209 100644 --- a/docs/data/chat/behavior/scrolling/scrolling.md +++ b/docs/data/chat/behavior/scrolling/scrolling.md @@ -16,7 +16,7 @@ components: ChatMessageList, ChatScrollToBottomAffordance Try the scroll-to-bottom affordance live: scroll up inside the preview to reveal the jump-to-latest button, and try each `scrollBehavior`. -{{"demo": "ChatScrollToBottomAffordancePlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-scroll-to-bottom-affordance-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} The message list automatically manages scroll position so new messages and streaming content stay visible without user intervention. Users can still scroll up to read earlier messages without losing their place. @@ -52,7 +52,7 @@ When auto-scroll is disabled, users can still scroll to the bottom manually usin Send a message, then scroll up while the long reply streams in — auto-scroll pauses once you're more than `buffer` pixels from the bottom and resumes when you scroll back within it. -{{"demo": "AutoScrollBuffer.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/auto-scroll-buffer/index.ts", "bg": "inline", "collapseToEmpty": true}} :::info Scrolling to the bottom when the user sends a message is always active, regardless of the `autoScroll` setting. diff --git a/docs/data/chat/behavior/streaming/ChatStreamingIndicatorDemo.js b/docs/data/chat/behavior/streaming/ChatStreamingIndicatorDemo.js deleted file mode 100644 index 686bf72043dfc..0000000000000 --- a/docs/data/chat/behavior/streaming/ChatStreamingIndicatorDemo.js +++ /dev/null @@ -1,197 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { ChatBox } from '@mui/x-chat'; - -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'streaming-indicator-demo', - title: 'Streaming indicator preview', - participants: [users.me, users.assistant], -}; - -const greeting = { - id: 'streaming-indicator-greeting', - conversationId: conversation.id, - role: 'assistant', - author: users.assistant, - createdAt: '2026-05-03T10:00:00.000Z', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Send a message — the dots appear while I "think", then follow the reply as it streams.', - }, - ], -}; - -let replyCounter = 0; -function nextReplyId() { - replyCounter += 1; - return `streaming-indicator-reply-${replyCounter}`; -} - -// `thinkingDelay` holds back the `start` chunk to simulate model latency — -// that gap is the indicator's waiting phase. Once `start` lands, the dots -// move inside the assistant bubble until `finish`. -function createStream(text, thinkingDelay) { - const messageId = nextReplyId(); - const words = text.split(' '); - const chunks = [ - { type: 'start', messageId, author: users.assistant }, - { type: 'text-start', id: `${messageId}-text` }, - ...words.map((word, index) => ({ - type: 'text-delta', - id: `${messageId}-text`, - delta: index === 0 ? word : ` ${word}`, - })), - { type: 'text-end', id: `${messageId}-text` }, - { type: 'finish', messageId, finishReason: 'stop' }, - ]; - - const timers = []; - let cancelled = false; - - return new ReadableStream({ - start(controller) { - chunks.forEach((chunk, index) => { - timers.push( - setTimeout( - () => { - if (cancelled) { - return; - } - controller.enqueue(chunk); - if (index === chunks.length - 1) { - controller.close(); - } - }, - thinkingDelay + 120 * index, - ), - ); - }); - }, - cancel() { - cancelled = true; - timers.forEach((timer) => clearTimeout(timer)); - }, - }); -} - -const MODE_OPTIONS = [ - { label: "'auto' (default)", value: 'auto' }, - { label: 'true (always)', value: 'always' }, - { label: 'false (never)', value: 'never' }, -]; - -const FEATURE_VALUE = { - auto: 'auto', - always: true, - never: false, -}; - -const THINKING_OPTIONS = [ - { label: '1 s', value: 1000 }, - { label: '2.5 s', value: 2500 }, - { label: '5 s', value: 5000 }, -]; - -export default function ChatStreamingIndicatorDemo() { - const [mode, setMode] = React.useState('auto'); - const [thinkingDelay, setThinkingDelay] = React.useState(2500); - - // Read the latest delay through a ref so the adapter identity stays stable - // while still honoring the current selector value on each send. - const thinkingDelayRef = React.useRef(thinkingDelay); - thinkingDelayRef.current = thinkingDelay; - - const adapter = React.useMemo( - () => ({ - async listMessages() { - return { messages: [greeting], hasMore: false }; - }, - async sendMessage({ message }) { - const prompt = message.parts - .map((part) => (part.type === 'text' ? part.text : '')) - .join(' ') - .trim(); - const reply = - prompt.length === 0 - ? 'The dots covered the silence while this reply was on its way.' - : `You said: "${prompt}". The animated dots bridged the wait, and now they trail this reply until it finishes streaming.`; - return createStream(reply, thinkingDelayRef.current); - }, - }), - [], - ); - - return ( - - - - - features.streamingIndicator - - { - if (value !== null) { - setMode(value); - } - }} - aria-label="Streaming indicator mode" - > - {MODE_OPTIONS.map((option) => ( - - {option.label} - - ))} - - - - - Thinking delay - - { - if (value !== null) { - setThinkingDelay(value); - } - }} - aria-label="Thinking delay" - > - {THINKING_OPTIONS.map((option) => ( - - {option.label} - - ))} - - - - - - - - ); -} diff --git a/docs/data/chat/behavior/streaming/ChatStreamingPlayground.js b/docs/data/chat/behavior/streaming/ChatStreamingPlayground.js deleted file mode 100644 index c1a730f7da947..0000000000000 --- a/docs/data/chat/behavior/streaming/ChatStreamingPlayground.js +++ /dev/null @@ -1,192 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { ChatBox } from '@mui/x-chat'; - -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'streaming-playground', - title: 'Streaming preview', - participants: [users.me, users.assistant], -}; - -const greeting = { - id: 'streaming-greeting', - conversationId: conversation.id, - role: 'assistant', - author: users.assistant, - createdAt: '2026-05-03T10:00:00.000Z', - status: 'sent', - parts: [ - { - type: 'text', - text: 'Ask me anything — I will stream the reply back one word at a time.', - }, - ], -}; - -let replyCounter = 0; -function nextReplyId() { - replyCounter += 1; - return `streaming-reply-${replyCounter}`; -} - -// Mirrors the "Building a stream" snippet: start → text-start → one -// text-delta per word → text-end → finish. Honors cancel() so the composer -// stop button clears pending timers and stops enqueuing mid-stream. -function createStream(text, chunkDelay) { - const messageId = nextReplyId(); - const words = text.split(' '); - const chunks = [ - { type: 'start', messageId, author: users.assistant }, - { type: 'text-start', id: `${messageId}-text` }, - ...words.map((word, index) => ({ - type: 'text-delta', - id: `${messageId}-text`, - delta: index === 0 ? word : ` ${word}`, - })), - { type: 'text-end', id: `${messageId}-text` }, - { type: 'finish', messageId, finishReason: 'stop' }, - ]; - - const timers = []; - let cancelled = false; - - return new ReadableStream({ - start(controller) { - chunks.forEach((chunk, index) => { - timers.push( - setTimeout( - () => { - if (cancelled) { - return; - } - controller.enqueue(chunk); - if (index === chunks.length - 1) { - controller.close(); - } - }, - chunkDelay * (index + 1), - ), - ); - }); - }, - cancel() { - cancelled = true; - timers.forEach((timer) => clearTimeout(timer)); - }, - }); -} - -const FLUSH_OPTIONS = [ - { label: '0 ms', value: 0 }, - { label: '16 ms (default)', value: 16 }, - { label: '100 ms', value: 100 }, - { label: '300 ms', value: 300 }, -]; - -const DELAY_OPTIONS = [ - { label: '10 ms', value: 10 }, - { label: '40 ms', value: 40 }, - { label: '120 ms', value: 120 }, -]; - -export default function ChatStreamingPlayground() { - const [flushInterval, setFlushInterval] = React.useState(16); - const [chunkDelay, setChunkDelay] = React.useState(40); - - // Read the latest chunk delay through a ref so the adapter identity stays - // stable while still honoring the current selector value on each send. - const chunkDelayRef = React.useRef(chunkDelay); - chunkDelayRef.current = chunkDelay; - - const adapter = React.useMemo( - () => ({ - async listMessages() { - return { messages: [greeting], hasMore: false }; - }, - async sendMessage({ message }) { - const prompt = message.parts - .map((part) => (part.type === 'text' ? part.text : '')) - .join(' ') - .trim(); - const reply = - prompt.length === 0 - ? 'Type a prompt and watch each word arrive as a separate chunk.' - : `You said: "${prompt}". Here is a streamed reply so you can watch tokens land and feel the flush interval.`; - return createStream(reply, chunkDelayRef.current); - }, - }), - [], - ); - - return ( - - - - - Flush interval - - { - if (value !== null) { - setFlushInterval(value); - } - }} - aria-label="Flush interval" - > - {FLUSH_OPTIONS.map((option) => ( - - {option.label} - - ))} - - - - - Chunk delay - - { - if (value !== null) { - setChunkDelay(value); - } - }} - aria-label="Chunk delay" - > - {DELAY_OPTIONS.map((option) => ( - - {option.label} - - ))} - - - - - - - - ); -} diff --git a/docs/data/chat/behavior/streaming/ChatStreamingIndicatorDemo.tsx b/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/ChatStreamingIndicatorDemo.tsx similarity index 99% rename from docs/data/chat/behavior/streaming/ChatStreamingIndicatorDemo.tsx rename to docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/ChatStreamingIndicatorDemo.tsx index 4892645a18bd4..4b5d733023967 100644 --- a/docs/data/chat/behavior/streaming/ChatStreamingIndicatorDemo.tsx +++ b/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/ChatStreamingIndicatorDemo.tsx @@ -108,6 +108,7 @@ const THINKING_OPTIONS = [ ]; export default function ChatStreamingIndicatorDemo() { + // @focus-start @padding 1 const [mode, setMode] = React.useState('auto'); const [thinkingDelay, setThinkingDelay] = React.useState(2500); @@ -201,4 +202,5 @@ export default function ChatStreamingIndicatorDemo() { ); + // @focus-end } diff --git a/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/client.ts b/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/index.ts b/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/index.ts new file mode 100644 index 0000000000000..7547194abaf18 --- /dev/null +++ b/docs/data/chat/behavior/streaming/demos/chat-streaming-indicator-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatStreamingIndicatorDemo from './ChatStreamingIndicatorDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatStreamingIndicatorDemo, { ClientProvider }); diff --git a/docs/data/chat/behavior/streaming/ChatStreamingPlayground.tsx b/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/ChatStreamingPlayground.tsx similarity index 99% rename from docs/data/chat/behavior/streaming/ChatStreamingPlayground.tsx rename to docs/data/chat/behavior/streaming/demos/chat-streaming-playground/ChatStreamingPlayground.tsx index 2b8e84bebafed..dbd47e6c8b01f 100644 --- a/docs/data/chat/behavior/streaming/ChatStreamingPlayground.tsx +++ b/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/ChatStreamingPlayground.tsx @@ -101,6 +101,7 @@ const DELAY_OPTIONS = [ ]; export default function ChatStreamingPlayground() { + // @focus-start @padding 1 const [flushInterval, setFlushInterval] = React.useState(16); const [chunkDelay, setChunkDelay] = React.useState(40); @@ -194,4 +195,5 @@ export default function ChatStreamingPlayground() { ); + // @focus-end } diff --git a/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/client.ts b/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/index.ts b/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/index.ts new file mode 100644 index 0000000000000..dccf028b2a925 --- /dev/null +++ b/docs/data/chat/behavior/streaming/demos/chat-streaming-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatStreamingPlayground from './ChatStreamingPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatStreamingPlayground, { ClientProvider }); diff --git a/docs/data/chat/behavior/streaming/streaming.md b/docs/data/chat/behavior/streaming/streaming.md index a495d9ace4f48..9b1933bfbb413 100644 --- a/docs/data/chat/behavior/streaming/streaming.md +++ b/docs/data/chat/behavior/streaming/streaming.md @@ -118,7 +118,7 @@ Lower values mean faster visual updates but more store mutations. Higher values reduce mutation frequency at the cost of perceived latency. ::: -{{"demo": "ChatStreamingPlayground.js"}} +{{"component": "file://./demos/chat-streaming-playground/index.ts"}} ## Streaming indicator @@ -128,7 +128,7 @@ The indicator covers two phases: 1. **Waiting** — after the user sends a message and before the `start` chunk arrives, the indicator renders as an incoming assistant row below the last message: the assistant's avatar (when resolvable from `members` or the conversation's `participants`) next to a typing bubble holding the dots. 2. **Streaming** — once the assistant message exists with `status: 'streaming'`, the dots move inside the real assistant bubble, below the streamed content, and disappear when the stream finishes. -{{"demo": "ChatStreamingIndicatorDemo.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-streaming-indicator-demo/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Enabling and disabling diff --git a/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.js b/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.js deleted file mode 100644 index 9d8c76bcede46..0000000000000 --- a/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.js +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { minimalConversation } from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -export default function AutoSubmitSuggestions() { - return ( - - ); -} diff --git a/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.tsx.preview b/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.tsx.preview deleted file mode 100644 index 92c227b03ff6e..0000000000000 --- a/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/behavior/suggestions/ChatSuggestionsPlayground.js b/docs/data/chat/behavior/suggestions/ChatSuggestionsPlayground.js deleted file mode 100644 index dafb9150263ef..0000000000000 --- a/docs/data/chat/behavior/suggestions/ChatSuggestionsPlayground.js +++ /dev/null @@ -1,113 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { ChatSuggestions } from '@mui/x-chat'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - directoryConversations, - emptyConversation, - groupThreadMessages, -} from 'docs/src/modules/components/chat-playground/sharedFixtures'; -import { - DividerLabel, - NumberControl, - SwitchControl, - TextControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const POOL = [ - 'Show me the default ChatComposer', - 'How do I style ChatMessage bubbles?', - 'Render code blocks with syntax highlighting', - 'Wire up RAG sources', - 'Toggle dark mode in MUI X Chat', - 'Customise the conversation list row', - 'Disable attachments on the composer', -]; - -const CLASS_DEFS = [ - { name: 'root', description: 'The root container of the suggestions row.' }, - { - name: 'item', - selector: '.MuiChatSuggestions-item', - description: 'Each suggestion pill.', - }, -]; - -export default function ChatSuggestionsPlayground() { - const [count, setCount] = React.useState(4); - const [autoSubmit, setAutoSubmit] = React.useState(false); - const [alwaysVisible, setAlwaysVisible] = React.useState(false); - const [hasMessages, setHasMessages] = React.useState(false); - const [first, setFirst] = React.useState(POOL[0]); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const suggestions = React.useMemo(() => { - const list = [first, ...POOL.slice(1)].slice(0, count); - return list; - }, [count, first]); - - const rootSx = classesCustomizations.toClassesSx(); - - return ( - - props - - - preview state - - suggestions data - - - - } - preview={ - - - - - - } - /> - ); -} diff --git a/docs/data/chat/behavior/suggestions/SuggestionsAboveComposer.js b/docs/data/chat/behavior/suggestions/SuggestionsAboveComposer.js deleted file mode 100644 index e1ac61ab4e750..0000000000000 --- a/docs/data/chat/behavior/suggestions/SuggestionsAboveComposer.js +++ /dev/null @@ -1,35 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -export default function SuggestionsAboveComposer() { - return ( - - ); -} diff --git a/docs/data/chat/behavior/suggestions/SuggestionsWithLabels.js b/docs/data/chat/behavior/suggestions/SuggestionsWithLabels.js deleted file mode 100644 index 4b2d80bf3e410..0000000000000 --- a/docs/data/chat/behavior/suggestions/SuggestionsWithLabels.js +++ /dev/null @@ -1,39 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { minimalConversation } from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -export default function SuggestionsWithLabels() { - return ( - - ); -} diff --git a/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.tsx b/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/AutoSubmitSuggestions.tsx similarity index 94% rename from docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.tsx rename to docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/AutoSubmitSuggestions.tsx index 9d8c76bcede46..57ac844cd2511 100644 --- a/docs/data/chat/behavior/suggestions/AutoSubmitSuggestions.tsx +++ b/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/AutoSubmitSuggestions.tsx @@ -8,6 +8,7 @@ const adapter = createEchoAdapter(); export default function AutoSubmitSuggestions() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/client.ts b/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/index.ts b/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/index.ts new file mode 100644 index 0000000000000..9359261b39654 --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/auto-submit-suggestions/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AutoSubmitSuggestions from './AutoSubmitSuggestions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AutoSubmitSuggestions, { ClientProvider }); diff --git a/docs/data/chat/behavior/suggestions/ChatSuggestionsPlayground.tsx b/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/ChatSuggestionsPlayground.tsx similarity index 94% rename from docs/data/chat/behavior/suggestions/ChatSuggestionsPlayground.tsx rename to docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/ChatSuggestionsPlayground.tsx index 9628aeead8ccc..27c6371292ef5 100644 --- a/docs/data/chat/behavior/suggestions/ChatSuggestionsPlayground.tsx +++ b/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/ChatSuggestionsPlayground.tsx @@ -14,10 +14,8 @@ import { SwitchControl, TextControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; const POOL = [ 'Show me the default ChatComposer', @@ -41,6 +39,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatSuggestionsPlayground() { + // @focus-start @padding 1 const [count, setCount] = React.useState(4); const [autoSubmit, setAutoSubmit] = React.useState(false); const [alwaysVisible, setAlwaysVisible] = React.useState(false); @@ -115,4 +114,5 @@ export default function ChatSuggestionsPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/client.ts b/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/index.ts b/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/index.ts new file mode 100644 index 0000000000000..8e468f557a87a --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/chat-suggestions-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatSuggestionsPlayground from './ChatSuggestionsPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatSuggestionsPlayground, { ClientProvider }); diff --git a/docs/data/chat/behavior/suggestions/SuggestionsAboveComposer.tsx b/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/SuggestionsAboveComposer.tsx similarity index 94% rename from docs/data/chat/behavior/suggestions/SuggestionsAboveComposer.tsx rename to docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/SuggestionsAboveComposer.tsx index e1ac61ab4e750..a6da50fdd4464 100644 --- a/docs/data/chat/behavior/suggestions/SuggestionsAboveComposer.tsx +++ b/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/SuggestionsAboveComposer.tsx @@ -11,6 +11,7 @@ const adapter = createEchoAdapter(); export default function SuggestionsAboveComposer() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/client.ts b/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/index.ts b/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/index.ts new file mode 100644 index 0000000000000..bdb4ac7d4afe4 --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/suggestions-above-composer/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SuggestionsAboveComposer from './SuggestionsAboveComposer'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SuggestionsAboveComposer, { ClientProvider }); diff --git a/docs/data/chat/behavior/suggestions/SuggestionsWithLabels.tsx b/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/SuggestionsWithLabels.tsx similarity index 96% rename from docs/data/chat/behavior/suggestions/SuggestionsWithLabels.tsx rename to docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/SuggestionsWithLabels.tsx index 4b2d80bf3e410..3055bf35e029f 100644 --- a/docs/data/chat/behavior/suggestions/SuggestionsWithLabels.tsx +++ b/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/SuggestionsWithLabels.tsx @@ -8,6 +8,7 @@ const adapter = createEchoAdapter(); export default function SuggestionsWithLabels() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/client.ts b/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/index.ts b/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/index.ts new file mode 100644 index 0000000000000..353ad27265465 --- /dev/null +++ b/docs/data/chat/behavior/suggestions/demos/suggestions-with-labels/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SuggestionsWithLabels from './SuggestionsWithLabels'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SuggestionsWithLabels, { ClientProvider }); diff --git a/docs/data/chat/behavior/suggestions/suggestions.md b/docs/data/chat/behavior/suggestions/suggestions.md index d4679a9396f80..8a7b6a34d6be5 100644 --- a/docs/data/chat/behavior/suggestions/suggestions.md +++ b/docs/data/chat/behavior/suggestions/suggestions.md @@ -20,7 +20,7 @@ Clicking a suggestion pre-fills the composer with the suggestion text, giving us Edit the suggestion list and toggle layout options: -{{"demo": "ChatSuggestionsPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-suggestions-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Implementing suggestions @@ -45,7 +45,7 @@ Once the first message appears, `ChatBox` moves them to a row above the composer For more control, pass `ChatSuggestion` objects instead of plain strings. This lets you set a display label that differs from the value pre-filled into the composer: -{{"demo": "SuggestionsWithLabels.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/suggestions-with-labels/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Suggestion object structure @@ -62,13 +62,13 @@ Strings are internally normalized to `{ value: string }`. By default, clicking a suggestion pre-fills the composer so users can review or edit before sending. Set `suggestionsAutoSubmit` to automatically submit the message when a suggestion is clicked: -{{"demo": "AutoSubmitSuggestions.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/auto-submit-suggestions/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Suggestions in active conversations When the conversation already has messages, `ChatBox` keeps the suggestions visible as a horizontal, scrollable row above the composer — useful for offering follow-up prompts. -{{"demo": "SuggestionsAboveComposer.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/suggestions-above-composer/index.ts", "bg": "inline", "collapseToEmpty": true}} `ChatBox` switches between the two placements automatically and has no `alwaysVisible` prop. When composing a custom layout with the standalone `ChatSuggestions` component, suggestions only render while the thread is empty by default — set `alwaysVisible` to render them regardless of message count: diff --git a/docs/data/chat/behavior/typing-indicators/ChatTypingIndicatorPlayground.js b/docs/data/chat/behavior/typing-indicators/ChatTypingIndicatorPlayground.js deleted file mode 100644 index 86dd4b0105932..0000000000000 --- a/docs/data/chat/behavior/typing-indicators/ChatTypingIndicatorPlayground.js +++ /dev/null @@ -1,82 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import { ChatTypingIndicator } from '@mui/x-chat'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ScopedChat, - TypingEffect, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { emptyConversation } from 'docs/src/modules/components/chat-playground/sharedFixtures'; -import { - DividerLabel, - NumberControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const candidates = [users.alice, users.mira]; - -const CLASS_DEFS = [ - { name: 'root', description: 'The typing indicator container.' }, -]; - -export default function ChatTypingIndicatorPlayground() { - const [count, setCount] = React.useState(1); - const classesCustomizations = useCustomizations(CLASS_DEFS); - const userIds = React.useMemo( - () => candidates.slice(0, count).map((u) => u.id), - [count], - ); - - const indicatorSx = classesCustomizations.toClassesSx(); - - const label = React.useMemo(() => { - if (count === 0) { - return '(renders nothing)'; - } - const names = candidates.slice(0, count).map((u) => u.displayName ?? u.id); - return `${names.join(', ')}${count === 1 ? ' is typing' : ' are typing'}`; - }, [count]); - - return ( - - state (store) - - - } - preview={ - - - - - - count: {count} · data-count="{count}" · label: {label} - - - - } - /> - ); -} diff --git a/docs/data/chat/behavior/typing-indicators/ChatTypingIndicatorPlayground.tsx b/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/ChatTypingIndicatorPlayground.tsx similarity index 91% rename from docs/data/chat/behavior/typing-indicators/ChatTypingIndicatorPlayground.tsx rename to docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/ChatTypingIndicatorPlayground.tsx index 6970e07448588..a58591081214d 100644 --- a/docs/data/chat/behavior/typing-indicators/ChatTypingIndicatorPlayground.tsx +++ b/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/ChatTypingIndicatorPlayground.tsx @@ -12,10 +12,8 @@ import { DividerLabel, NumberControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const candidates = [users.alice, users.mira]; @@ -27,6 +25,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatTypingIndicatorPlayground() { + // @focus-start @padding 1 const [count, setCount] = React.useState(1); const classesCustomizations = useCustomizations(CLASS_DEFS); const userIds = React.useMemo( @@ -84,4 +83,5 @@ export default function ChatTypingIndicatorPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/client.ts b/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/index.ts b/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/index.ts new file mode 100644 index 0000000000000..0ee9cfe1021f7 --- /dev/null +++ b/docs/data/chat/behavior/typing-indicators/demos/chat-typing-indicator-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatTypingIndicatorPlayground from './ChatTypingIndicatorPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatTypingIndicatorPlayground, { ClientProvider }); diff --git a/docs/data/chat/behavior/typing-indicators/typing-indicators.md b/docs/data/chat/behavior/typing-indicators/typing-indicators.md index 3b30e594483a9..b7487428a22fe 100644 --- a/docs/data/chat/behavior/typing-indicators/typing-indicators.md +++ b/docs/data/chat/behavior/typing-indicators/typing-indicators.md @@ -21,7 +21,7 @@ For the animated dots shown while the _assistant_ generates a response, see the Toggle which users appear as typing in the current conversation: -{{"demo": "ChatTypingIndicatorPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-typing-indicator-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} Typing indicators show labels like "Alice Chen is typing" or "Alice Chen, Mira Patel are typing" in the chat UI. The feature connects the adapter's `setTyping()` method (outbound) with real-time `typing` events (inbound) so the local composer's typing state and remote participants' typing state stay in sync. diff --git a/docs/data/chat/core/adapters/adapters.md b/docs/data/chat/core/adapters/adapters.md index bd1e076eefeb3..f90e483431ee5 100644 --- a/docs/data/chat/core/adapters/adapters.md +++ b/docs/data/chat/core/adapters/adapters.md @@ -19,7 +19,7 @@ import type { ChatAdapter } from '@mui/x-chat/headless'; The following demo shows a minimal adapter in action: -{{"demo": "../examples/minimal-chat/MinimalHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../examples/minimal-chat/demos/minimal-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ## Minimal adapter diff --git a/docs/data/chat/core/core.md b/docs/data/chat/core/core.md index 0b89755895cde..e5ce29d3935ea 100644 --- a/docs/data/chat/core/core.md +++ b/docs/data/chat/core/core.md @@ -40,7 +40,7 @@ Those concerns belong to [Headless](/x/react-chat/headless/). The demo below shows the core runtime with a minimal custom UI: -{{"demo": "examples/minimal-chat/MinimalHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://./examples/minimal-chat/demos/minimal-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} The runtime works as a pipeline: diff --git a/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.js b/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.js deleted file mode 100644 index f9cc6dcbd4700..0000000000000 --- a/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.js +++ /dev/null @@ -1,255 +0,0 @@ -import * as React from 'react'; -import { useStore } from '@base-ui/utils/store'; -import { - ChatProvider, - chatSelectors, - useChat, - useChatComposer, - useChatStore, -} from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; -import SendRoundedIcon from '@mui/icons-material/SendRounded'; -import { - cloneConversations, - demoConversations, - demoThreads, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; -import { - createChunkStream, - createTextResponseChunks, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -const adapter = { - async sendMessage({ conversationId }) { - return createChunkStream( - createTextResponseChunks( - `advanced-${conversationId}`, - 'The store escape hatch lets you build custom dashboards with chatSelectors.', - ), - { delayMs: 160 }, - ); - }, -}; - -function AdvancedMetrics() { - const store = useChatStore(); - const messageCount = useStore(store, chatSelectors.messageCount); - const conversationCount = useStore(store, chatSelectors.conversationCount); - const activeConversation = useStore(store, chatSelectors.activeConversation); - const composerValue = useStore(store, chatSelectors.composerValue); - const typingUserIds = useStore( - store, - chatSelectors.typingUserIdsForActiveConversation, - ); - const { messages, sendMessage, setActiveConversation } = useChat(); - const composer = useChatComposer(); - - return ( - - {/* Header */} - - - Store escape hatch - - - The runtime stays headless, but advanced consumers can subscribe to exactly - the slices they need. - - - - {/* Stats row */} - - - {[ - { label: 'Messages', value: messageCount }, - { label: 'Conversations', value: conversationCount }, - { label: 'Active title', value: activeConversation?.title ?? 'none' }, - { label: 'Composer value', value: composerValue || 'empty' }, - { label: 'Typing users', value: typingUserIds.join(', ') || 'none' }, - ].map((stat) => ( - - - {stat.label} - - - {stat.value} - - - ))} - - - {/* Action buttons */} - - - - - - - {/* Message list */} - - {messages.length === 0 ? ( - - No messages yet. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - {message.author?.displayName ?? message.role} - {message.status ? ` · ${message.status}` : ''} - - {message.parts.map((part, index) => ( - - {'text' in part ? part.text : JSON.stringify(part)} - - ))} - - ); - }) - )} - - - {/* Input area */} - - composer.setValue(event.target.value)} - placeholder="Type a message…" - /> - - - - - ); -} - -export default function AdvancedStoreAccessHeadlessChat() { - return ( - - - - ); -} diff --git a/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.tsx.preview b/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.tsx.preview deleted file mode 100644 index df496e78448ec..0000000000000 --- a/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/core/examples/advanced-store-access/advanced-store-access.md b/docs/data/chat/core/examples/advanced-store-access/advanced-store-access.md index 6515eeb85cc88..f2c7cc7d520c6 100644 --- a/docs/data/chat/core/examples/advanced-store-access/advanced-store-access.md +++ b/docs/data/chat/core/examples/advanced-store-access/advanced-store-access.md @@ -76,7 +76,7 @@ For standard rendering, the built-in hooks (`useChat()`, `useMessageIds()`, `use The demo below shows how to combine `useChatStore()` with `chatSelectors` to render live counts and streaming state: -{{"demo": "AdvancedStoreAccessHeadlessChat.js"}} +{{"component": "file://./demos/advanced-store-access-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.tsx b/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/AdvancedStoreAccessHeadlessChat.tsx similarity index 98% rename from docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.tsx rename to docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/AdvancedStoreAccessHeadlessChat.tsx index 59292b26f7912..3b41b995de364 100644 --- a/docs/data/chat/core/examples/advanced-store-access/AdvancedStoreAccessHeadlessChat.tsx +++ b/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/AdvancedStoreAccessHeadlessChat.tsx @@ -6,8 +6,8 @@ import { useChat, useChatComposer, useChatStore, - type ChatAdapter, } from '@mui/x-chat/headless'; +import type { ChatAdapter } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; @@ -243,6 +243,7 @@ function AdvancedMetrics() { export default function AdvancedStoreAccessHeadlessChat() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/client.ts b/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/index.ts b/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/index.ts new file mode 100644 index 0000000000000..8c4921dc18aa9 --- /dev/null +++ b/docs/data/chat/core/examples/advanced-store-access/demos/advanced-store-access-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import AdvancedStoreAccessHeadlessChat from './AdvancedStoreAccessHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, AdvancedStoreAccessHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/composer/ComposerHeadlessChat.js b/docs/data/chat/core/examples/composer/ComposerHeadlessChat.js deleted file mode 100644 index db3d8f301f00b..0000000000000 --- a/docs/data/chat/core/examples/composer/ComposerHeadlessChat.js +++ /dev/null @@ -1,299 +0,0 @@ -import * as React from 'react'; -import { - ChatProvider, - useChat, - useChatComposer, - useChatStore, -} from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; -import AttachFileRoundedIcon from '@mui/icons-material/AttachFileRounded'; -import SendRoundedIcon from '@mui/icons-material/SendRounded'; -import { - createChunkStream, - createTextResponseChunks, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -const adapter = { - async sendMessage({ message }) { - return createChunkStream( - createTextResponseChunks( - `composer-assistant-${message.id}`, - 'The composer demo covers attachments, preview URLs, and IME-safe submit behavior.', - ), - { delayMs: 180 }, - ); - }, -}; - -function ComposerInner() { - const { messages } = useChat(); - const composer = useChatComposer(); - const store = useChatStore(); - const inputRef = React.useRef(null); - const listRef = React.useRef(null); - - React.useEffect(() => { - if (listRef.current) { - listRef.current.scrollTop = listRef.current.scrollHeight; - } - }, [messages]); - - return ( - - {/* Header */} - - - Composer with attachments - - - - - {/* Messages */} - - {messages.length === 0 ? ( - - Use the composer to create the first message. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - - {message.parts.map((part, index) => { - if (part.type === 'text') { - return ( - - {part.text} - - ); - } - if (part.type === 'file') { - return part.mediaType.startsWith('image/') ? ( - - ) : ( - - {part.filename ?? part.url} - - ); - } - return null; - })} - - - ); - }) - )} - - - {/* Attachments */} - {composer.attachments.length > 0 ? ( - - {composer.attachments.map((attachment) => ( - - {attachment.previewUrl ? ( - - ) : null} - - - {attachment.file.name} - - - {attachment.status} - - - - - ))} - - ) : null} - - {/* Textarea */} - - composer.setValue(event.target.value)} - onCompositionStart={() => store.setComposerIsComposing(true)} - onCompositionEnd={() => store.setComposerIsComposing(false)} - onKeyDown={(event) => { - if (event.key === 'Enter' && !event.shiftKey) { - event.preventDefault(); - void composer.submit(); - } - }} - /> - - - {/* Hidden file input */} - { - Array.from(event.target.files ?? []).forEach((file) => - composer.addAttachment(file), - ); - event.target.value = ''; - }} - /> - {/* Action buttons */} - - - - - - - ); -} - -export default function ComposerHeadlessChat() { - return ( - - - - ); -} diff --git a/docs/data/chat/core/examples/composer/ComposerHeadlessChat.tsx.preview b/docs/data/chat/core/examples/composer/ComposerHeadlessChat.tsx.preview deleted file mode 100644 index a199f3e16c7ba..0000000000000 --- a/docs/data/chat/core/examples/composer/ComposerHeadlessChat.tsx.preview +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/core/examples/composer/composer.md b/docs/data/chat/core/examples/composer/composer.md index 6be8215b9a1d7..de62f68bcedbf 100644 --- a/docs/data/chat/core/examples/composer/composer.md +++ b/docs/data/chat/core/examples/composer/composer.md @@ -88,7 +88,7 @@ Wire composition events on your input element: The demo below shows the full composer wired up with attachments, image previews, and IME-safe submission: -{{"demo": "ComposerHeadlessChat.js"}} +{{"component": "file://./demos/composer-headless-chat/index.ts"}} ## See also diff --git a/docs/data/chat/core/examples/composer/ComposerHeadlessChat.tsx b/docs/data/chat/core/examples/composer/demos/composer-headless-chat/ComposerHeadlessChat.tsx similarity index 98% rename from docs/data/chat/core/examples/composer/ComposerHeadlessChat.tsx rename to docs/data/chat/core/examples/composer/demos/composer-headless-chat/ComposerHeadlessChat.tsx index 5d8b63923288c..b30452a261c4b 100644 --- a/docs/data/chat/core/examples/composer/ComposerHeadlessChat.tsx +++ b/docs/data/chat/core/examples/composer/demos/composer-headless-chat/ComposerHeadlessChat.tsx @@ -4,8 +4,8 @@ import { useChat, useChatComposer, useChatStore, - type ChatAdapter, } from '@mui/x-chat/headless'; +import type { ChatAdapter } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Chip from '@mui/material/Chip'; @@ -294,8 +294,10 @@ function ComposerInner() { export default function ComposerHeadlessChat() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/core/examples/composer/demos/composer-headless-chat/client.ts b/docs/data/chat/core/examples/composer/demos/composer-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/composer/demos/composer-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/composer/demos/composer-headless-chat/index.ts b/docs/data/chat/core/examples/composer/demos/composer-headless-chat/index.ts new file mode 100644 index 0000000000000..4a37ea9cc135b --- /dev/null +++ b/docs/data/chat/core/examples/composer/demos/composer-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerHeadlessChat from './ComposerHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat.js b/docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat.js deleted file mode 100644 index 687b51847166d..0000000000000 --- a/docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat.js +++ /dev/null @@ -1,268 +0,0 @@ -import * as React from 'react'; -import { ChatProvider, useChat, useChatComposer } from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; -import SendRoundedIcon from '@mui/icons-material/SendRounded'; -import { - cloneConversations, - cloneMessages, - demoConversations, - demoThreads, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; -import { - createChunkStream, - createTextResponseChunks, - getMessageText, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -function ControlledStateChat({ activeConversationId }) { - const { messages, conversations, setActiveConversation } = useChat(); - const composer = useChatComposer(); - const listRef = React.useRef(null); - - React.useEffect(() => { - if (listRef.current) { - listRef.current.scrollTop = listRef.current.scrollHeight; - } - }, [messages]); - - return ( - - {/* Header */} - - - Controlled headless state - - - - - {/* Conversation selector */} - - {conversations.map((conversation) => ( - { - void setActiveConversation(conversation.id); - }} - /> - ))} - - - {/* Stats */} - - {[ - { label: 'Messages', value: messages.length }, - { label: 'Conversations', value: conversations.length }, - { label: 'Active', value: activeConversationId ?? 'none' }, - { label: 'Composer', value: composer.value || 'empty' }, - ].map((stat) => ( - - - {stat.label} - - - {stat.value} - - - ))} - - - {/* Messages */} - - {messages.length === 0 ? ( - - Switch conversations to load controlled messages. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - - {message.parts.map((part, index) => ( - - {part.type === 'text' ? part.text : null} - - ))} - - - ); - }) - )} - - - {/* Input */} - - composer.setValue(event.target.value)} - onKeyDown={(event) => { - if (event.key === 'Enter' && !event.shiftKey) { - event.preventDefault(); - void composer.submit(); - } - }} - /> - - - - ); -} - -export default function ControlledStateHeadlessChat() { - const allConversations = React.useMemo( - () => cloneConversations(demoConversations.slice(0, 2)), - [], - ); - const [conversations, setConversations] = React.useState(allConversations); - const [activeConversationId, setActiveConversationId] = React.useState('product'); - const [composerValue, setComposerValue] = React.useState( - 'Document the controlled models.', - ); - const [messagesByConversation, setMessagesByConversation] = React.useState({ - support: cloneMessages(demoThreads.support), - product: cloneMessages(demoThreads.product), - }); - - const messages = activeConversationId - ? (messagesByConversation[activeConversationId] ?? []) - : []; - - const adapter = React.useMemo( - () => ({ - async sendMessage({ conversationId: _conversationId, message }) { - return createChunkStream( - createTextResponseChunks( - `controlled-${message.id}`, - `Controlled state still streams through the normalized runtime: "${getMessageText(message)}".`, - ), - { delayMs: 160 }, - ); - }, - }), - [], - ); - - return ( - { - setMessagesByConversation((previous) => ({ - ...previous, - [activeConversationId ?? 'support']: nextMessages.map((message) => ({ - ...message, - author: - message.author ?? - (message.role === 'user' ? demoUsers.sam : demoUsers.agent), - })), - })); - }} - composerValue={composerValue} - onComposerValueChange={setComposerValue} - > - - - ); -} diff --git a/docs/data/chat/core/examples/controlled-state/controlled-state.md b/docs/data/chat/core/examples/controlled-state/controlled-state.md index 241868d065a6d..ba6a20903d172 100644 --- a/docs/data/chat/core/examples/controlled-state/controlled-state.md +++ b/docs/data/chat/core/examples/controlled-state/controlled-state.md @@ -56,7 +56,7 @@ Use controlled state when you need to: The demo below shows controlled state wired through `ChatProvider`: -{{"demo": "ControlledStateHeadlessChat.js"}} +{{"component": "file://./demos/controlled-state-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat.tsx b/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/ControlledStateHeadlessChat.tsx similarity index 97% rename from docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat.tsx rename to docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/ControlledStateHeadlessChat.tsx index 9b65c91e3f449..4ca856ddba86e 100644 --- a/docs/data/chat/core/examples/controlled-state/ControlledStateHeadlessChat.tsx +++ b/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/ControlledStateHeadlessChat.tsx @@ -1,11 +1,9 @@ import * as React from 'react'; -import { - ChatProvider, - useChat, - useChatComposer, - type ChatAdapter, - type ChatConversation, - type ChatMessage, +import { ChatProvider, useChat, useChatComposer } from '@mui/x-chat/headless'; +import type { + ChatAdapter, + ChatConversation, + ChatMessage, } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -218,6 +216,7 @@ function ControlledStateChat({ } export default function ControlledStateHeadlessChat() { + // @focus-start @padding 1 const allConversations = React.useMemo( () => cloneConversations(demoConversations.slice(0, 2)), [], @@ -281,4 +280,5 @@ export default function ControlledStateHeadlessChat() { ); + // @focus-end } diff --git a/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/client.ts b/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/index.ts b/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/index.ts new file mode 100644 index 0000000000000..b65b28363d0f3 --- /dev/null +++ b/docs/data/chat/core/examples/controlled-state/demos/controlled-state-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ControlledStateHeadlessChat from './ControlledStateHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ControlledStateHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.js b/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.js deleted file mode 100644 index 8c58e998a0a92..0000000000000 --- a/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.js +++ /dev/null @@ -1,185 +0,0 @@ -import * as React from 'react'; -import { ChatProvider, useChat } from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; -import SendRoundedIcon from '@mui/icons-material/SendRounded'; -import { demoUsers } from 'docs/data/chat/core/examples/shared/demoData'; -import { - createChunkStream, - createTextResponseChunks, - getMessageText, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -const adapter = { - async sendMessage({ message }) { - return createChunkStream( - createTextResponseChunks( - `minimal-assistant-${message.id}`, - `You said: "${getMessageText(message)}". This response came from a streamed headless adapter.`, - ), - { delayMs: 220 }, - ); - }, -}; - -function MinimalChatInner() { - const { messages, sendMessage, isStreaming } = useChat(); - const [draft, setDraft] = React.useState('Show me the smallest working chat.'); - const listRef = React.useRef(null); - - const submit = React.useCallback(async () => { - if (draft.trim() === '') { - return; - } - - await sendMessage({ - conversationId: 'support', - author: demoUsers.alice, - parts: [{ type: 'text', text: draft }], - }); - - setDraft(''); - }, [draft, sendMessage]); - - React.useEffect(() => { - if (listRef.current) { - listRef.current.scrollTop = listRef.current.scrollHeight; - } - }, [messages]); - - return ( - - {/* Header */} - - - Minimal headless chat - - - - - {/* Messages */} - - {messages.length === 0 ? ( - - Send the first message to start the thread. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - - {message.parts.map((part, index) => ( - - {part.type === 'text' ? part.text : null} - - ))} - - - ); - }) - )} - - - {/* Input */} - - setDraft(event.target.value)} - onKeyDown={(event) => { - if (event.key === 'Enter' && !event.shiftKey) { - event.preventDefault(); - submit(); - } - }} - /> - - - - ); -} - -export default function MinimalHeadlessChat() { - return ( - - - - ); -} diff --git a/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.tsx.preview b/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.tsx.preview deleted file mode 100644 index c5e1312469fe9..0000000000000 --- a/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.tsx.preview +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.tsx b/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/MinimalHeadlessChat.tsx similarity index 96% rename from docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.tsx rename to docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/MinimalHeadlessChat.tsx index 69e8760a807ae..d99bfb96d1a61 100644 --- a/docs/data/chat/core/examples/minimal-chat/MinimalHeadlessChat.tsx +++ b/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/MinimalHeadlessChat.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; -import { ChatProvider, useChat, type ChatAdapter } from '@mui/x-chat/headless'; +import { ChatProvider, useChat } from '@mui/x-chat/headless'; +import type { ChatAdapter } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Chip from '@mui/material/Chip'; @@ -178,8 +179,10 @@ function MinimalChatInner() { export default function MinimalHeadlessChat() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/client.ts b/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/index.ts b/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/index.ts new file mode 100644 index 0000000000000..1a5058805da14 --- /dev/null +++ b/docs/data/chat/core/examples/minimal-chat/demos/minimal-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MinimalHeadlessChat from './MinimalHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MinimalHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/minimal-chat/minimal-chat.md b/docs/data/chat/core/examples/minimal-chat/minimal-chat.md index d9e6acd901eb4..6a1c6bc07cd9d 100644 --- a/docs/data/chat/core/examples/minimal-chat/minimal-chat.md +++ b/docs/data/chat/core/examples/minimal-chat/minimal-chat.md @@ -59,7 +59,7 @@ Inside `ChatProvider`, call `useChat()` to get messages, streaming state, and ac const { messages, sendMessage, isStreaming } = useChat(); ``` -{{"demo": "MinimalHeadlessChat.js"}} +{{"component": "file://./demos/minimal-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.js b/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.js deleted file mode 100644 index 9f0f7a7e167e7..0000000000000 --- a/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.js +++ /dev/null @@ -1,363 +0,0 @@ -import * as React from 'react'; -import { ChatProvider, useChat } from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { - cloneConversations, - cloneMessages, - demoConversations, - demoThreads, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; - -function createRealtimeSyncAdapter() { - let onEventRef = null; - - return { - adapter: { - async sendMessage() { - return new ReadableStream({ - start(controller) { - controller.close(); - }, - }); - }, - subscribe({ onEvent }) { - onEventRef = onEvent; - return () => { - onEventRef = null; - }; - }, - }, - emit(event) { - onEventRef?.(event); - }, - }; -} - -function RealtimeThreadSyncInner({ emit }) { - const { conversations, messages, activeConversationId, setActiveConversation } = - useChat(); - const messageCounter = React.useRef(0); - const conversationCounter = React.useRef(0); - const activeConversation = conversations.find( - (conversation) => conversation.id === activeConversationId, - ); - - const addMessage = () => { - if (!activeConversationId) { - return; - } - - messageCounter.current += 1; - const nextMessage = { - id: `live-message-${messageCounter.current}`, - conversationId: activeConversationId, - role: 'assistant', - author: demoUsers.agent, - status: 'sent', - parts: [ - { - type: 'text', - text: `Realtime message ${messageCounter.current} arrived for ${activeConversationId}.`, - }, - ], - }; - - emit({ type: 'message-added', message: nextMessage }); - }; - - const updateLastMessage = () => { - const target = [...messages] - .reverse() - .find((message) => message.role === 'assistant'); - - if (!target) { - return; - } - - emit({ - type: 'message-updated', - message: { - ...target, - parts: [ - { - type: 'text', - text: 'This assistant message was patched by a realtime update.', - }, - ], - }, - }); - }; - - const removeLastMessage = () => { - const target = [...messages] - .reverse() - .find((message) => message.role === 'assistant'); - - if (!target) { - return; - } - - emit({ type: 'message-removed', messageId: target.id }); - }; - - const addConversation = () => { - conversationCounter.current += 1; - const conversation = { - id: `live-conversation-${conversationCounter.current}`, - title: `Escalation ${conversationCounter.current}`, - subtitle: 'Created by realtime sync', - readState: 'unread', - unreadCount: 1, - participants: [demoUsers.alice, demoUsers.agent], - }; - - emit({ type: 'conversation-added', conversation }); - }; - - const renameActiveConversation = () => { - if (!activeConversation) { - return; - } - - emit({ - type: 'conversation-updated', - conversation: { - ...activeConversation, - title: `${activeConversation.title} (live)`, - subtitle: 'Renamed by realtime event', - }, - }); - }; - - const removeActiveConversation = () => { - if (!activeConversationId) { - return; - } - - emit({ type: 'conversation-removed', conversationId: activeConversationId }); - }; - - return ( - - {/* Header */} - - - Realtime collection sync - - - Message and conversation events can reshape the thread without a manual - refetch. - - - - {/* Conversation selector */} - - {conversations.map((conversation) => ( - { - void setActiveConversation(conversation.id); - }} - /> - ))} - - - {/* Stats */} - - {[ - { label: 'Conversations', value: conversations.length }, - { label: 'Active', value: activeConversation?.title ?? 'none' }, - { label: 'Messages', value: messages.length }, - ].map((stat) => ( - - - {stat.label} - - - {stat.value} - - - ))} - - - {/* Action buttons */} - - - - - - - - - - {/* Messages */} - - {messages.length === 0 ? ( - - Select or create a conversation. Removing the active thread clears the - message view. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - - {message.parts.map((part, index) => ( - - {part.type === 'text' ? part.text : null} - - ))} - - - ); - }) - )} - - - ); -} - -export default function RealtimeThreadSyncHeadlessChat() { - const { adapter, emit } = React.useMemo(() => createRealtimeSyncAdapter(), []); - - return ( - - - - ); -} diff --git a/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.tsx.preview b/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.tsx.preview deleted file mode 100644 index 4a63aedb29731..0000000000000 --- a/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.tsx b/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/RealtimeThreadSyncHeadlessChat.tsx similarity index 98% rename from docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.tsx rename to docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/RealtimeThreadSyncHeadlessChat.tsx index 3ccb4258f0966..09e3597fa3e6f 100644 --- a/docs/data/chat/core/examples/realtime-thread-sync/RealtimeThreadSyncHeadlessChat.tsx +++ b/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/RealtimeThreadSyncHeadlessChat.tsx @@ -1,11 +1,10 @@ import * as React from 'react'; -import { - ChatProvider, - useChat, - type ChatAdapter, - type ChatConversation, - type ChatMessage, - type ChatRealtimeEvent, +import { ChatProvider, useChat } from '@mui/x-chat/headless'; +import type { + ChatAdapter, + ChatConversation, + ChatMessage, + ChatRealtimeEvent, } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -356,6 +355,7 @@ function RealtimeThreadSyncInner({ } export default function RealtimeThreadSyncHeadlessChat() { + // @focus-start @padding 1 const { adapter, emit } = React.useMemo(() => createRealtimeSyncAdapter(), []); return ( @@ -371,4 +371,5 @@ export default function RealtimeThreadSyncHeadlessChat() { ); + // @focus-end } diff --git a/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/client.ts b/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/index.ts b/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/index.ts new file mode 100644 index 0000000000000..fd14bdee210fb --- /dev/null +++ b/docs/data/chat/core/examples/realtime-thread-sync/demos/realtime-thread-sync-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RealtimeThreadSyncHeadlessChat from './RealtimeThreadSyncHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RealtimeThreadSyncHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/realtime-thread-sync/realtime-thread-sync.md b/docs/data/chat/core/examples/realtime-thread-sync/realtime-thread-sync.md index fcab1ebdd37aa..c27351df522c2 100644 --- a/docs/data/chat/core/examples/realtime-thread-sync/realtime-thread-sync.md +++ b/docs/data/chat/core/examples/realtime-thread-sync/realtime-thread-sync.md @@ -51,7 +51,7 @@ The UI can respond by showing a placeholder or selecting the next conversation. The demo below shows collection events driving thread and sidebar updates in real time: -{{"demo": "RealtimeThreadSyncHeadlessChat.js"}} +{{"component": "file://./demos/realtime-thread-sync-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.js b/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.js deleted file mode 100644 index 8c961e2141d8c..0000000000000 --- a/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.js +++ /dev/null @@ -1,282 +0,0 @@ -import * as React from 'react'; -import { - ChatProvider, - useChat, - useChatStatus, - useConversation, - useConversations, -} from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { - cloneConversations, - demoConversations, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; -import { - createChunkStream, - createTextResponseChunks, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -function createRealtimeAdapter() { - let onEventRef = null; - - return { - adapter: { - async sendMessage({ conversationId }) { - return createChunkStream( - createTextResponseChunks( - `realtime-${conversationId}`, - 'Realtime subscriptions keep presence, typing, and read state synced.', - ), - ); - }, - subscribe({ onEvent }) { - onEventRef = onEvent; - return () => { - onEventRef = null; - }; - }, - }, - emit(event) { - onEventRef?.(event); - }, - }; -} - -function getOnlineNames(conversations) { - const seen = new Set(); - const names = []; - - for (const conversation of conversations) { - for (const participant of conversation.participants ?? []) { - if (participant.isOnline && !seen.has(participant.id)) { - seen.add(participant.id); - names.push(participant.displayName ?? participant.id); - } - } - } - - return names.join(', ') || 'none'; -} - -function RealtimeInner({ emit }) { - const { messages } = useChat(); - const { typingUserIds } = useChatStatus(); - const conversations = useConversations(); - const activeConversation = useConversation('support'); - - return ( - - {/* Header */} - - - Realtime presence and typing - - - Typing, presence, and read-state changes come in through - adapter.subscribe(). - - - - {/* Stats */} - - {[ - { label: 'Typing users', value: typingUserIds.join(', ') || 'none' }, - { label: 'Online', value: getOnlineNames(conversations) }, - { label: 'Unread', value: activeConversation?.unreadCount ?? 0 }, - { - label: 'Read state', - value: activeConversation?.readState ?? 'unknown', - }, - ].map((item) => ( - - - {item.label} - - - {item.value} - - - ))} - - - {/* Action buttons */} - - - - - - - - - {/* Messages */} - - {messages.length === 0 ? ( - - This example focuses on state reactions from realtime events. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - - {message.parts.map((part, index) => ( - - {part.type === 'text' ? part.text : null} - - ))} - - - ); - }) - )} - - - ); -} - -export default function RealtimeHeadlessChat() { - const { adapter, emit } = React.useMemo(() => createRealtimeAdapter(), []); - - return ( - - - - ); -} diff --git a/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.tsx.preview b/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.tsx.preview deleted file mode 100644 index 7e7928d7011b0..0000000000000 --- a/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.tsx b/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/RealtimeHeadlessChat.tsx similarity index 98% rename from docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.tsx rename to docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/RealtimeHeadlessChat.tsx index 5a86b0c5f8249..ccb4852c7c13f 100644 --- a/docs/data/chat/core/examples/realtime/RealtimeHeadlessChat.tsx +++ b/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/RealtimeHeadlessChat.tsx @@ -5,9 +5,8 @@ import { useChatStatus, useConversation, useConversations, - type ChatAdapter, - type ChatRealtimeEvent, } from '@mui/x-chat/headless'; +import type { ChatAdapter, ChatRealtimeEvent } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; @@ -270,6 +269,7 @@ function RealtimeInner({ emit }: { emit: (event: ChatRealtimeEvent) => void }) { } export default function RealtimeHeadlessChat() { + // @focus-start @padding 1 const { adapter, emit } = React.useMemo(() => createRealtimeAdapter(), []); return ( @@ -281,4 +281,5 @@ export default function RealtimeHeadlessChat() { ); + // @focus-end } diff --git a/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/client.ts b/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/index.ts b/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/index.ts new file mode 100644 index 0000000000000..a91fa548bee2e --- /dev/null +++ b/docs/data/chat/core/examples/realtime/demos/realtime-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RealtimeHeadlessChat from './RealtimeHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RealtimeHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/realtime/realtime.md b/docs/data/chat/core/examples/realtime/realtime.md index ea62b28c35669..366a07bdde4f1 100644 --- a/docs/data/chat/core/examples/realtime/realtime.md +++ b/docs/data/chat/core/examples/realtime/realtime.md @@ -89,7 +89,7 @@ onEvent({ The demo below wires all three event types into a single adapter: -{{"demo": "RealtimeHeadlessChat.js"}} +{{"component": "file://./demos/realtime-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/selector-driven-thread/SelectorDrivenThread.js b/docs/data/chat/core/examples/selector-driven-thread/SelectorDrivenThread.js deleted file mode 100644 index 0eef8a70ece35..0000000000000 --- a/docs/data/chat/core/examples/selector-driven-thread/SelectorDrivenThread.js +++ /dev/null @@ -1,203 +0,0 @@ -import * as React from 'react'; -import { - ChatProvider, - useConversation, - useConversations, - useMessage, - useMessageIds, -} from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { demoUsers } from 'docs/data/chat/core/examples/shared/demoData'; - -function createMessages() { - return Array.from({ length: 14 }, (_, index) => ({ - id: `selector-${index + 1}`, - conversationId: 'selectors', - role: index % 2 === 0 ? 'assistant' : 'user', - author: index % 2 === 0 ? demoUsers.agent : demoUsers.alice, - status: 'sent', - parts: [ - { - type: 'text', - text: `Row ${index + 1} is subscribed independently.`, - }, - ], - })); -} - -const MessageRow = React.memo(function MessageRow({ id }) { - const message = useMessage(id); - const renders = React.useRef(0); - - React.useEffect(() => { - renders.current += 1; - }); - - if (!message) { - return null; - } - - return ( - - - {message.id} · renders {renders.current} - - - {message.author?.displayName ?? message.role} - - - {message.parts[0]?.type === 'text' ? message.parts[0].text : null} - - - ); -}); - -function SelectorThread() { - const messageIds = useMessageIds(); - const conversations = useConversations(); - const conversation = useConversation('selectors'); - - return ( - - {/* Header */} - - - {conversation?.title ?? 'Selector lab'} - - - Update one controlled message from the parent to see only the matching row - rerender. - - - - {/* Conversations */} - - - {conversations.map((conv) => ( - - ))} - - - - {/* Message rows */} - - {messageIds.map((id) => ( - - ))} - - - ); -} - -export default function SelectorDrivenThread() { - const [messages, setMessages] = React.useState(createMessages); - const [conversations] = React.useState([ - { - id: 'selectors', - title: 'Selector-driven thread', - subtitle: 'Row-level subscriptions', - }, - ]); - - const adapter = React.useMemo( - () => ({ - async sendMessage() { - return new ReadableStream({ - start(controller) { - controller.close(); - }, - }); - }, - }), - [], - ); - - return ( - - - - - - - - - - ); -} diff --git a/docs/data/chat/core/examples/selector-driven-thread/SelectorDrivenThread.tsx b/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/SelectorDrivenThread.tsx similarity index 97% rename from docs/data/chat/core/examples/selector-driven-thread/SelectorDrivenThread.tsx rename to docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/SelectorDrivenThread.tsx index 765e6ab762221..79491bcae7985 100644 --- a/docs/data/chat/core/examples/selector-driven-thread/SelectorDrivenThread.tsx +++ b/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/SelectorDrivenThread.tsx @@ -5,9 +5,11 @@ import { useConversations, useMessage, useMessageIds, - type ChatAdapter, - type ChatConversation, - type ChatMessage, +} from '@mui/x-chat/headless'; +import type { + ChatAdapter, + ChatConversation, + ChatMessage, } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -120,6 +122,7 @@ function SelectorThread() { } export default function SelectorDrivenThread() { + // @focus-start @padding 1 const [messages, setMessages] = React.useState(createMessages); const [conversations] = React.useState([ { @@ -203,4 +206,5 @@ export default function SelectorDrivenThread() { ); + // @focus-end } diff --git a/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/client.ts b/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/index.ts b/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/index.ts new file mode 100644 index 0000000000000..c292ce982a005 --- /dev/null +++ b/docs/data/chat/core/examples/selector-driven-thread/demos/selector-driven-thread/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import SelectorDrivenThread from './SelectorDrivenThread'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, SelectorDrivenThread, { ClientProvider }); diff --git a/docs/data/chat/core/examples/selector-driven-thread/selector-driven-thread.md b/docs/data/chat/core/examples/selector-driven-thread/selector-driven-thread.md index e106c07587519..c17ede45d11ba 100644 --- a/docs/data/chat/core/examples/selector-driven-thread/selector-driven-thread.md +++ b/docs/data/chat/core/examples/selector-driven-thread/selector-driven-thread.md @@ -65,7 +65,7 @@ const conversation = useConversation('selectors'); The demo below shows the selector-driven thread pattern end to end: -{{"demo": "SelectorDrivenThread.js"}} +{{"component": "file://./demos/selector-driven-thread/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.js b/docs/data/chat/core/examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.js deleted file mode 100644 index 7b9fc8f62c6e2..0000000000000 --- a/docs/data/chat/core/examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.js +++ /dev/null @@ -1,324 +0,0 @@ -import * as React from 'react'; -import { ChatProvider, useChat } from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; -import SendRoundedIcon from '@mui/icons-material/SendRounded'; -import { demoUsers } from 'docs/data/chat/core/examples/shared/demoData'; -import { - createChunkStream, - createTextResponseChunks, - getMessageText, -} from 'docs/data/chat/core/examples/shared/demoUtils'; - -function createStreamingAdapter() { - return { - async sendMessage({ message }) { - const text = getMessageText(message); - const messageId = `streaming-assistant-${message.id}`; - const textId = `${messageId}-text`; - - if (text.includes('fail')) { - return createChunkStream( - [ - { type: 'start', messageId }, - { type: 'text-start', id: textId }, - { - type: 'text-delta', - id: textId, - delta: 'The stream will fail', - }, - { - type: 'text-delta', - id: textId, - delta: ' after this chunk.', - }, - ], - { - delayMs: 260, - errorAfterChunk: 3, - error: new Error('Demo transport lost the stream.'), - }, - ); - } - - if (text.includes('slow')) { - return createChunkStream( - createTextResponseChunks( - messageId, - 'This long-running stream is useful for demonstrating stopStreaming().', - ), - { delayMs: 420 }, - ); - } - - return createChunkStream( - [ - { type: 'start', messageId }, - { type: 'text-start', id: textId }, - { - type: 'text-delta', - id: textId, - delta: 'Streaming updates are visible', - }, - { - type: 'text-delta', - id: textId, - delta: ' before the final chunk arrives.', - }, - { - type: 'data-insight', - id: `${messageId}-data`, - data: { source: 'demo', confidence: 0.92 }, - }, - { type: 'text-end', id: textId }, - { type: 'finish', messageId, finishReason: 'stop' }, - ], - { delayMs: 220 }, - ); - }, - }; -} - -export default function StreamingLifecycleHeadlessChat() { - const adapter = React.useMemo(() => createStreamingAdapter(), []); - - return ( - { - console.log('onData', part.type); - }} - onFinish={(payload) => { - console.log( - 'onFinish', - payload.finishReason, - payload.isError, - payload.isAbort, - ); - }} - onError={(error) => { - console.log('onError', error.message); - }} - > - - - ); -} - -function StreamingLifecycleWithLogs() { - const { messages, isStreaming, sendMessage, stopStreaming, retry } = useChat(); - const [draft, setDraft] = React.useState('success'); - const [events, setEvents] = React.useState([]); - - const appendLog = React.useCallback((entry) => { - setEvents((previous) => [entry, ...previous].slice(0, 8)); - }, []); - - React.useEffect(() => { - const originalLog = console.log; - - console.log = (...args) => { - appendLog( - args - .map((arg) => (typeof arg === 'string' ? arg : JSON.stringify(arg))) - .join(' '), - ); - originalLog(...args); - }; - - return () => { - console.log = originalLog; - }; - }, [appendLog]); - - return ( - - {/* Header */} - - - Streaming lifecycle - - - - - {/* Event log */} - - - {events.join('\n') || 'Callback events will appear here.'} - - - - {/* Messages */} - - {messages.length === 0 ? ( - - No messages yet. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - {message.status ? ` · ${message.status}` : null} - - {message.parts.map((part, index) => ( - - {part.type === 'text' ? part.text : null} - {part.type.startsWith('data-') && 'data' in part - ? JSON.stringify(part.data, null, 2) - : null} - - ))} - - - ); - }) - )} - - - {/* Input */} - - setDraft(event.target.value)} - onKeyDown={(event) => { - if (event.key === 'Enter' && !event.shiftKey) { - event.preventDefault(); - void sendMessage({ - conversationId: 'support', - author: demoUsers.alice, - parts: [{ type: 'text', text: draft }], - }); - } - }} - /> - - - - {/* Scenario buttons */} - - - - - {messages - .filter( - (message) => - message.role === 'user' && - (message.status === 'error' || message.status === 'cancelled'), - ) - .map((message) => ( - - ))} - - - ); -} diff --git a/docs/data/chat/core/examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.tsx b/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/StreamingLifecycleHeadlessChat.tsx similarity index 98% rename from docs/data/chat/core/examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.tsx rename to docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/StreamingLifecycleHeadlessChat.tsx index f78ebda87780a..25fb1a43fd7b5 100644 --- a/docs/data/chat/core/examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.tsx +++ b/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/StreamingLifecycleHeadlessChat.tsx @@ -1,10 +1,6 @@ import * as React from 'react'; -import { - ChatProvider, - useChat, - type ChatAdapter, - type ChatDataMessagePart, -} from '@mui/x-chat/headless'; +import { ChatProvider, useChat } from '@mui/x-chat/headless'; +import type { ChatAdapter, ChatDataMessagePart } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; @@ -89,6 +85,7 @@ function createStreamingAdapter(): ChatAdapter { } export default function StreamingLifecycleHeadlessChat() { + // @focus-start @padding 1 const adapter = React.useMemo(() => createStreamingAdapter(), []); return ( @@ -113,6 +110,7 @@ export default function StreamingLifecycleHeadlessChat() { ); + // @focus-end } function StreamingLifecycleWithLogs() { diff --git a/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/client.ts b/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/index.ts b/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/index.ts new file mode 100644 index 0000000000000..0d1ad5737c59a --- /dev/null +++ b/docs/data/chat/core/examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StreamingLifecycleHeadlessChat from './StreamingLifecycleHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StreamingLifecycleHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/streaming-lifecycle/streaming-lifecycle.md b/docs/data/chat/core/examples/streaming-lifecycle/streaming-lifecycle.md index c425ba4acbba9..6bb106d55d968 100644 --- a/docs/data/chat/core/examples/streaming-lifecycle/streaming-lifecycle.md +++ b/docs/data/chat/core/examples/streaming-lifecycle/streaming-lifecycle.md @@ -56,7 +56,7 @@ Register callbacks on `ChatProvider` to observe lifecycle events: The demo below exercises every lifecycle callback alongside `sendMessage()`, `stopStreaming()`, and `retry()`: -{{"demo": "StreamingLifecycleHeadlessChat.js"}} +{{"component": "file://./demos/streaming-lifecycle-headless-chat/index.ts"}} ## Lifecycle summary diff --git a/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.js b/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.js deleted file mode 100644 index b442ec0cae293..0000000000000 --- a/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.js +++ /dev/null @@ -1,340 +0,0 @@ -import * as React from 'react'; -import { ChatProvider, useChat, useChatPartRenderer } from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Divider from '@mui/material/Divider'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { demoUsers } from 'docs/data/chat/core/examples/shared/demoData'; -import { createChunkStream } from 'docs/data/chat/core/examples/shared/demoUtils'; - -function createToolAdapter() { - let onEventRef = null; - let callCounter = 0; - let latestAssistantMessage = null; - - const pollPart = { - type: 'poll', - question: 'Was this approval flow understandable?', - options: ['Yes', 'Mostly', 'Needs work'], - }; - - return { - adapter: { - async sendMessage() { - callCounter += 1; - const messageId = `assistant-tool-${callCounter}`; - const textId = `assistant-tool-text-${callCounter}`; - const toolCallId = `weather-approval-${callCounter}`; - - latestAssistantMessage = { - id: messageId, - conversationId: 'tools', - role: 'assistant', - author: demoUsers.agent, - status: 'sent', - parts: [ - { - type: 'text', - text: 'I can fetch the weather, but the tool call needs approval first.', - }, - { - type: 'tool', - toolInvocation: { - toolCallId, - toolName: 'weather', - state: 'approval-requested', - input: { location: 'Prague' }, - }, - }, - ], - }; - - return createChunkStream( - [ - { type: 'start', messageId }, - { type: 'text-start', id: textId }, - { - type: 'text-delta', - id: textId, - delta: - 'I can fetch the weather, but the tool call needs approval first.', - }, - { type: 'text-end', id: textId }, - { - type: 'tool-approval-request', - toolCallId, - toolName: 'weather', - input: { location: 'Prague' }, - }, - { - type: 'finish', - messageId, - finishReason: 'tool-call', - }, - ], - { delayMs: 220 }, - ); - }, - subscribe({ onEvent }) { - onEventRef = onEvent; - return () => { - onEventRef = null; - }; - }, - async addToolApprovalResponse({ id, approved, reason }) { - if (!latestAssistantMessage) { - return; - } - - // 1. Update the tool invocation state on the current message - onEventRef?.({ - type: 'message-updated', - message: { - ...latestAssistantMessage, - parts: [ - latestAssistantMessage.parts[0], - { - type: 'tool', - toolInvocation: { - toolCallId: id, - toolName: 'weather', - state: approved ? 'output-available' : 'output-denied', - input: { location: 'Prague' }, - approval: { - approved, - reason, - }, - output: approved - ? { - forecast: 'Cloudy', - temperatureC: 18, - } - : undefined, - }, - }, - ...(approved ? [pollPart] : []), - ], - }, - }); - - // 2. Emit a follow-up assistant message after a short delay - setTimeout(() => { - const followUpText = approved - ? 'The weather in Prague is Cloudy with a temperature of 18 °C.' - : `The weather tool call was denied${reason ? `: ${reason}` : ''}. Let me know if you change your mind.`; - - onEventRef?.({ - type: 'message-added', - message: { - id: `assistant-followup-${id}`, - conversationId: 'tools', - role: 'assistant', - author: demoUsers.agent, - status: 'sent', - parts: [{ type: 'text', text: followUpText }], - }, - }); - }, 400); - }, - }, - }; -} - -function PollPart({ message, index, part }) { - const renderer = useChatPartRenderer('poll'); - - if (!renderer) { - return null; - } - - return {renderer({ part, message, index })}; -} - -function ToolAndRendererInner() { - const { messages, sendMessage, addToolApprovalResponse } = useChat(); - - return ( - - {/* Header */} - -
- - Tool approval and custom renderers - - - Approve or deny the tool call, then render the custom poll part through - the registry. - -
- -
- - {/* Message list */} - - {messages.map((message) => ( - - - {message.role} - - - {message.parts.map((part, index) => { - if (part.type === 'text') { - return ( - - {part.text} - - ); - } - - if (part.type === 'tool') { - return ( - - - - {part.toolInvocation.toolName} - {' · '} - {part.toolInvocation.state} - - {part.toolInvocation.output ? ( - - {JSON.stringify(part.toolInvocation.output, null, 2)} - - ) : null} - {part.toolInvocation.state === 'output-denied' ? ( - - {part.toolInvocation.approval?.reason ?? - 'Tool execution was denied'} - - ) : null} - {part.toolInvocation.state === 'approval-requested' ? ( - - - - - ) : null} - - ); - } - - if (part.type === 'poll') { - return ( - - ); - } - - return null; - })} - - - ))} - -
- ); -} - -const partRenderers = { - poll: ({ part }) => ( -
- - - {part.question} - - - {part.options.map((option) => ( - - ))} - -
- ), -}; - -export default function ToolApprovalAndRenderersHeadlessChat() { - const { adapter } = React.useMemo(() => createToolAdapter(), []); - - return ( - - - - ); -} diff --git a/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.tsx.preview b/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.tsx.preview deleted file mode 100644 index 8e03636e84d85..0000000000000 --- a/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.tsx.preview +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.tsx b/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/ToolApprovalAndRenderersHeadlessChat.tsx similarity index 98% rename from docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.tsx rename to docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/ToolApprovalAndRenderersHeadlessChat.tsx index 77c5df4eaa3c8..47fbfa94d5a39 100644 --- a/docs/data/chat/core/examples/tool-approval-and-renderers/ToolApprovalAndRenderersHeadlessChat.tsx +++ b/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/ToolApprovalAndRenderersHeadlessChat.tsx @@ -1,12 +1,10 @@ import * as React from 'react'; -import { - ChatProvider, - useChat, - useChatPartRenderer, - type ChatAdapter, - type ChatMessage, - type ChatRealtimeEvent, - type ChatPartRendererMap, +import { ChatProvider, useChat, useChatPartRenderer } from '@mui/x-chat/headless'; +import type { + ChatAdapter, + ChatMessage, + ChatRealtimeEvent, + ChatPartRendererMap, } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -352,6 +350,7 @@ const partRenderers: ChatPartRendererMap = { }; export default function ToolApprovalAndRenderersHeadlessChat() { + // @focus-start @padding 1 const { adapter } = React.useMemo(() => createToolAdapter(), []); return ( @@ -363,4 +362,5 @@ export default function ToolApprovalAndRenderersHeadlessChat() { ); + // @focus-end } diff --git a/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/client.ts b/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/index.ts b/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/index.ts new file mode 100644 index 0000000000000..be61160921bbc --- /dev/null +++ b/docs/data/chat/core/examples/tool-approval-and-renderers/demos/tool-approval-and-renderers-headless-chat/index.ts @@ -0,0 +1,8 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ToolApprovalAndRenderersHeadlessChat from './ToolApprovalAndRenderersHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ToolApprovalAndRenderersHeadlessChat, { + ClientProvider, +}); diff --git a/docs/data/chat/core/examples/tool-approval-and-renderers/tool-approval-and-renderers.md b/docs/data/chat/core/examples/tool-approval-and-renderers/tool-approval-and-renderers.md index 60e300ef764c0..60ff00fdc9497 100644 --- a/docs/data/chat/core/examples/tool-approval-and-renderers/tool-approval-and-renderers.md +++ b/docs/data/chat/core/examples/tool-approval-and-renderers/tool-approval-and-renderers.md @@ -81,7 +81,7 @@ See [Type augmentation](/x/react-chat/core/examples/type-augmentation/) for deta The demo below combines the approval flow and a custom part renderer: -{{"demo": "ToolApprovalAndRenderersHeadlessChat.js"}} +{{"component": "file://./demos/tool-approval-and-renderers-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/tool-call-events/ToolCallEventsHeadlessChat.js b/docs/data/chat/core/examples/tool-call-events/ToolCallEventsHeadlessChat.js deleted file mode 100644 index f6e5a5b9eccb1..0000000000000 --- a/docs/data/chat/core/examples/tool-call-events/ToolCallEventsHeadlessChat.js +++ /dev/null @@ -1,233 +0,0 @@ -import * as React from 'react'; -import { ChatProvider, useChat } from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { demoUsers } from 'docs/data/chat/core/examples/shared/demoData'; -import { createChunkStream } from 'docs/data/chat/core/examples/shared/demoUtils'; - -const adapter = { - async sendMessage({ message }) { - const messageId = `tool-events-assistant-${message.id}`; - const textId = `${messageId}-text`; - const toolCallId = `inventory-${message.id}`; - - return createChunkStream( - [ - { type: 'start', messageId }, - { type: 'text-start', id: textId }, - { - type: 'text-delta', - id: textId, - delta: - 'I am checking inventory and will keep the tool state in sync as it changes.', - }, - { type: 'text-end', id: textId }, - { - type: 'tool-input-start', - toolCallId, - toolName: 'inventory.search', - }, - { - type: 'tool-input-available', - toolCallId, - toolName: 'inventory.search', - input: { sku: 'CHAIR-04', warehouse: 'prg-1' }, - }, - { - type: 'tool-output-available', - toolCallId, - output: { - sku: 'CHAIR-04', - available: 14, - warehouse: 'prg-1', - }, - }, - { type: 'finish', messageId, finishReason: 'stop' }, - ], - { delayMs: 220 }, - ); - }, -}; - -function ToolCallEventsInner() { - const { messages, sendMessage, isStreaming } = useChat(); - - return ( - - {/* Header */} - - - Tool call callback log - - - - - {/* Messages */} - - {messages.length === 0 ? ( - - Send a message to stream a tool invocation and watch the callback log - update. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - - {message.parts.map((part, index) => ( - - {part.type === 'text' ? part.text : null} - {part.type === 'tool' - ? `${part.toolInvocation.toolName}: ${part.toolInvocation.state}` - : null} - - ))} - - - ); - }) - )} - - - ); -} - -export default function ToolCallEventsHeadlessChat() { - const [events, setEvents] = React.useState([]); - const [latestState, setLatestState] = React.useState('idle'); - const [toolName, setToolName] = React.useState('none'); - - const handleToolCall = React.useCallback((payload) => { - const entry = `${payload.toolCall.toolName} -> ${payload.toolCall.state}`; - - setToolName(payload.toolCall.toolName); - setLatestState(payload.toolCall.state); - setEvents((previous) => [entry, ...previous].slice(0, 8)); - }, []); - - return ( - - - - {/* Stats */} - - {[ - { label: 'Tool', value: toolName }, - { label: 'Latest state', value: latestState }, - { label: 'Events', value: events.length }, - ].map((stat) => ( - - - {stat.label} - - - {stat.value} - - - ))} - - - {/* Event log */} - - - {events.join('\n') || 'Tool events will appear here.'} - - - - - ); -} diff --git a/docs/data/chat/core/examples/tool-call-events/ToolCallEventsHeadlessChat.tsx b/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/ToolCallEventsHeadlessChat.tsx similarity index 97% rename from docs/data/chat/core/examples/tool-call-events/ToolCallEventsHeadlessChat.tsx rename to docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/ToolCallEventsHeadlessChat.tsx index 5283357057249..526031ceee30c 100644 --- a/docs/data/chat/core/examples/tool-call-events/ToolCallEventsHeadlessChat.tsx +++ b/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/ToolCallEventsHeadlessChat.tsx @@ -1,10 +1,6 @@ import * as React from 'react'; -import { - ChatProvider, - useChat, - type ChatAdapter, - type ChatOnToolCallPayload, -} from '@mui/x-chat/headless'; +import { ChatProvider, useChat } from '@mui/x-chat/headless'; +import type { ChatAdapter, ChatOnToolCallPayload } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; @@ -167,6 +163,7 @@ function ToolCallEventsInner() { } export default function ToolCallEventsHeadlessChat() { + // @focus-start @padding 1 const [events, setEvents] = React.useState([]); const [latestState, setLatestState] = React.useState('idle'); const [toolName, setToolName] = React.useState('none'); @@ -236,4 +233,5 @@ export default function ToolCallEventsHeadlessChat() { ); + // @focus-end } diff --git a/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/client.ts b/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/index.ts b/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/index.ts new file mode 100644 index 0000000000000..dd3b5c5ebb933 --- /dev/null +++ b/docs/data/chat/core/examples/tool-call-events/demos/tool-call-events-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ToolCallEventsHeadlessChat from './ToolCallEventsHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ToolCallEventsHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/tool-call-events/tool-call-events.md b/docs/data/chat/core/examples/tool-call-events/tool-call-events.md index 2d20132ff9198..c86c19fabfed3 100644 --- a/docs/data/chat/core/examples/tool-call-events/tool-call-events.md +++ b/docs/data/chat/core/examples/tool-call-events/tool-call-events.md @@ -62,7 +62,7 @@ The `toolCall` object includes `toolCallId`, `toolName`, `state`, `input`, `outp The demo below shows how `onToolCall` observes state transitions and feeds an external audit log: -{{"demo": "ToolCallEventsHeadlessChat.js"}} +{{"component": "file://./demos/tool-call-events-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.js b/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.js deleted file mode 100644 index e705c224ba97f..0000000000000 --- a/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.js +++ /dev/null @@ -1,404 +0,0 @@ -import * as React from 'react'; -import { - ChatProvider, - useChat, - useChatPartRenderer, - useConversation, -} from '@mui/x-chat/headless'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { demoUsers } from 'docs/data/chat/core/examples/shared/demoData'; -import { createChunkStream } from 'docs/data/chat/core/examples/shared/demoUtils'; - -const triageUser = { - ...demoUsers.alice, - metadata: { - team: 'support', - shift: 'day', - }, -}; - -const triageAgent = { - ...demoUsers.agent, - metadata: { - team: 'ops', - shift: 'day', - }, -}; - -const conversations = [ - { - id: 'triage', - title: 'Typed extensions', - subtitle: 'Module augmentation in action', - readState: 'read', - participants: [triageUser, triageAgent], - metadata: { - channel: 'support', - slaMinutes: 45, - escalated: true, - }, - }, -]; - -const initialMessages = [ - { - id: 'typed-seed', - conversationId: 'triage', - role: 'assistant', - author: triageAgent, - status: 'sent', - metadata: { - model: 'gpt-5', - confidence: 'high', - }, - parts: [ - { - type: 'text', - text: 'This thread is using app-specific metadata, typed tools, typed data parts, and a custom summary card.', - }, - { - type: 'ticket-summary', - ticketId: 'CHAT-128', - severity: 'high', - summary: - 'Checkout assistance is blocked by an expired integration token and needs ops review.', - }, - ], - }, -]; - -const partRenderers = { - 'ticket-summary': ({ part }) => ( - - - - {part.ticketId} - - - - {part.summary} - - ), -}; - -const adapter = { - async sendMessage({ message }) { - const messageId = `typed-response-${message.id}`; - const textId = `${messageId}-text`; - const toolCallId = `ticket-lookup-${message.id}`; - - return createChunkStream( - [ - { type: 'start', messageId }, - { type: 'text-start', id: textId }, - { - type: 'text-delta', - id: textId, - delta: - 'The runtime is now streaming typed tool, metadata, and data-part updates.', - }, - { type: 'text-end', id: textId }, - { - type: 'tool-input-available', - toolCallId, - toolName: 'ticket.lookup', - input: { - ticketId: 'CHAT-128', - }, - }, - { - type: 'tool-output-available', - toolCallId, - output: { - status: 'blocked', - owner: 'Sam', - priority: 'high', - }, - }, - { - type: 'data-ticket-status', - id: `${messageId}-ticket-status`, - data: { - ticketId: 'CHAT-128', - status: 'blocked', - lastUpdated: '10:24 UTC', - }, - }, - { - type: 'message-metadata', - metadata: { - model: 'gpt-5', - confidence: 'high', - }, - }, - { type: 'finish', messageId, finishReason: 'stop' }, - ], - { delayMs: 180 }, - ); - }, -}; - -function TicketSummaryPart({ message, index, part }) { - const renderer = useChatPartRenderer('ticket-summary'); - - if (!renderer) { - return null; - } - - return {renderer({ part, message, index })}; -} - -function isTicketLookupInvocation(invocation) { - return invocation.toolName === 'ticket.lookup'; -} - -function renderPart(part, message, index) { - if (part.type === 'text') { - return ( - - {part.text} - {index === 0 ? ( - - {message.author?.metadata ? ( - - ) : null} - {message.metadata?.model ? ( - - ) : null} - {message.metadata?.confidence ? ( - - ) : null} - - ) : null} - - ); - } - - if (part.type === 'tool') { - const { toolInvocation } = part; - const ticketLookup = isTicketLookupInvocation(toolInvocation) - ? toolInvocation - : null; - - return ( - - - {toolInvocation.toolName} · {toolInvocation.state} - - {ticketLookup?.input ? ( - - Lookup ticket: {ticketLookup.input.ticketId} - - ) : null} - {ticketLookup?.output ? ( - - {ticketLookup.output.status} · owner {ticketLookup.output.owner}{' '} - · {ticketLookup.output.priority} priority - - ) : null} - - ); - } - - if (part.type === 'data-ticket-status') { - return ( - - - data-ticket-status - - - {part.data.ticketId} is - - - Last updated {part.data.lastUpdated} - - - ); - } - - if (part.type === 'ticket-summary') { - return ; - } - - return null; -} - -function TypeAugmentationInner() { - const { messages, sendMessage, isStreaming } = useChat(); - const conversation = useConversation('triage'); - - return ( - - {/* Header */} - - - Type augmentation - - - - - {/* Stats */} - - {[ - { - label: 'Channel', - value: conversation?.metadata?.channel ?? 'n/a', - }, - { - label: 'SLA', - value: `${conversation?.metadata?.slaMinutes ?? 0}m`, - }, - { - label: 'Escalated', - value: conversation?.metadata?.escalated ? 'yes' : 'no', - }, - ].map((stat) => ( - - - {stat.label} - - - {stat.value} - - - ))} - - - {/* Messages */} - - {messages.length === 0 ? ( - - Send a message to stream typed tool and data-part updates. - - ) : ( - messages.map((message) => { - const isUser = message.role === 'user'; - return ( - - - - {message.author?.displayName ?? message.role} - - - {message.parts.map((part, index) => ( - - {renderPart(part, message, index)} - - ))} - - - - ); - }) - )} - - - ); -} - -export default function TypeAugmentationHeadlessChat() { - return ( - - - - ); -} diff --git a/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.tsx.preview b/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.tsx.preview deleted file mode 100644 index 7bcc95ae41dfa..0000000000000 --- a/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.tsx.preview +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.tsx b/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/TypeAugmentationHeadlessChat.tsx similarity index 98% rename from docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.tsx rename to docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/TypeAugmentationHeadlessChat.tsx index 547a551e66a84..c50f1057beb68 100644 --- a/docs/data/chat/core/examples/type-augmentation/TypeAugmentationHeadlessChat.tsx +++ b/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/TypeAugmentationHeadlessChat.tsx @@ -4,11 +4,13 @@ import { useChat, useChatPartRenderer, useConversation, - type ChatAdapter, - type ChatConversation, - type ChatMessage, - type ChatPartRendererMap, - type ChatUser, +} from '@mui/x-chat/headless'; +import type { + ChatAdapter, + ChatConversation, + ChatMessage, + ChatPartRendererMap, + ChatUser, } from '@mui/x-chat/headless'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -503,6 +505,7 @@ function TypeAugmentationInner() { export default function TypeAugmentationHeadlessChat() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/client.ts b/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/index.ts b/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/index.ts new file mode 100644 index 0000000000000..8dc7281a8c346 --- /dev/null +++ b/docs/data/chat/core/examples/type-augmentation/demos/type-augmentation-headless-chat/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import TypeAugmentationHeadlessChat from './TypeAugmentationHeadlessChat'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, TypeAugmentationHeadlessChat, { ClientProvider }); diff --git a/docs/data/chat/core/examples/type-augmentation/type-augmentation.md b/docs/data/chat/core/examples/type-augmentation/type-augmentation.md index 06c8177f0f6ca..a7e50a4104bd0 100644 --- a/docs/data/chat/core/examples/type-augmentation/type-augmentation.md +++ b/docs/data/chat/core/examples/type-augmentation/type-augmentation.md @@ -88,7 +88,7 @@ const renderer = useChatPartRenderer('ticket-summary'); The demo below shows how a single augmentation flows through metadata, a typed tool, a typed `data-*` part, and a custom message part: -{{"demo": "TypeAugmentationHeadlessChat.js"}} +{{"component": "file://./demos/type-augmentation-headless-chat/index.ts"}} ## Key takeaways diff --git a/docs/data/chat/core/hooks/hooks.md b/docs/data/chat/core/hooks/hooks.md index 4705f6db97ee3..b484dc1ad0b70 100644 --- a/docs/data/chat/core/hooks/hooks.md +++ b/docs/data/chat/core/hooks/hooks.md @@ -30,7 +30,7 @@ All hooks must be called inside a ``. The demo below shows hooks in action inside a minimal custom chat: -{{"demo": "../examples/minimal-chat/MinimalHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../examples/minimal-chat/demos/minimal-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ## `useChat()` diff --git a/docs/data/chat/core/realtime/realtime.md b/docs/data/chat/core/realtime/realtime.md index abf86383c6e6c..76b4e7ab61fee 100644 --- a/docs/data/chat/core/realtime/realtime.md +++ b/docs/data/chat/core/realtime/realtime.md @@ -14,7 +14,7 @@ The runtime calls it on mount and cleans it up on unmount, keeping the subscript The demo below shows real-time events flowing into the runtime: -{{"demo": "../examples/realtime/RealtimeHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../examples/realtime/demos/realtime-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ## Subscription lifecycle diff --git a/docs/data/chat/core/selectors/selectors.md b/docs/data/chat/core/selectors/selectors.md index 8eb6189676fc8..ef1ffa0670e7e 100644 --- a/docs/data/chat/core/selectors/selectors.md +++ b/docs/data/chat/core/selectors/selectors.md @@ -18,7 +18,7 @@ import { chatSelectors, useChatStore } from '@mui/x-chat/headless'; The demo below shows selectors driving row-level subscriptions in a chat thread: -{{"demo": "../examples/selector-driven-thread/SelectorDrivenThread.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../examples/selector-driven-thread/demos/selector-driven-thread/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ## Selector reference diff --git a/docs/data/chat/core/state/state.md b/docs/data/chat/core/state/state.md index d86016ed72723..64f2f755d4a62 100644 --- a/docs/data/chat/core/state/state.md +++ b/docs/data/chat/core/state/state.md @@ -14,7 +14,7 @@ It creates the chat store, wires the adapter, and makes hooks and selectors avai The following demo shows controlled state in action: -{{"demo": "../examples/controlled-state/ControlledStateHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../examples/controlled-state/demos/controlled-state-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ## Configuring the runtime diff --git a/docs/data/chat/core/streaming/streaming.md b/docs/data/chat/core/streaming/streaming.md index 6407866796668..eb2729f3f6f0a 100644 --- a/docs/data/chat/core/streaming/streaming.md +++ b/docs/data/chat/core/streaming/streaming.md @@ -15,7 +15,7 @@ UI components consume the updates through hooks and selectors. The following demo visualizes the streaming lifecycle: -{{"demo": "../examples/streaming-lifecycle/StreamingLifecycleHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../examples/streaming-lifecycle/demos/streaming-lifecycle-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ## Chunk categories diff --git a/docs/data/chat/core/types/types.md b/docs/data/chat/core/types/types.md index 6b30d482b08c2..f11d5678c891b 100644 --- a/docs/data/chat/core/types/types.md +++ b/docs/data/chat/core/types/types.md @@ -14,7 +14,7 @@ Your app-specific types flow through the entire stack—messages, stream chunks, The demo below shows type augmentation in practice: -{{"demo": "../examples/type-augmentation/TypeAugmentationHeadlessChat.js", "bg": "inline", "defaultCodeOpen": false, "hideToolbar": true}} +{{"component": "file://../examples/type-augmentation/demos/type-augmentation-headless-chat/index.ts", "bg": "inline", "hideToolbar": true, "collapseToEmpty": true}} ## Registry interface reference diff --git a/docs/data/chat/customization/look-and-feel/ComposerVariantsDemo.js b/docs/data/chat/customization/look-and-feel/ComposerVariantsDemo.js deleted file mode 100644 index dcd111ec0cca9..0000000000000 --- a/docs/data/chat/customization/look-and-feel/ComposerVariantsDemo.js +++ /dev/null @@ -1,82 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { ChatComposer } from '@mui/x-chat'; -import { ChatProvider } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - demoUsers, - minimalConversation, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ respond: () => 'echo' }); - -function VariantCard({ title, description, children }) { - return ( - - - {title} - - {description} - - -
{children}
-
- ); -} - -export default function ComposerVariantsDemo() { - return ( - - - - - - - - - - - - - - ); -} diff --git a/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.js b/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.js deleted file mode 100644 index dab02581c5d2d..0000000000000 --- a/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.js +++ /dev/null @@ -1,64 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Paper from '@mui/material/Paper'; -import Typography from '@mui/material/Typography'; -import { ChatBox } from '@mui/x-chat'; - -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - demoUsers, - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ respond: () => 'echo' }); - -function DensityPanel({ density, caption }) { - return ( - - - {caption} - - - - - - ); -} - -export default function DensityComparisonDemo() { - return ( - - - - - - ); -} diff --git a/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.tsx.preview b/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.tsx.preview deleted file mode 100644 index 7023a7fab94c0..0000000000000 --- a/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.tsx.preview +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/docs/data/chat/customization/look-and-feel/LookAndFeelPlayground.js b/docs/data/chat/customization/look-and-feel/LookAndFeelPlayground.js deleted file mode 100644 index 99b3aa7758307..0000000000000 --- a/docs/data/chat/customization/look-and-feel/LookAndFeelPlayground.js +++ /dev/null @@ -1,168 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import CssBaseline from '@mui/material/CssBaseline'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import Typography from '@mui/material/Typography'; -import { createTheme, ThemeProvider } from '@mui/material/styles'; -import { ChatBox } from '@mui/x-chat'; - -import { - ChoiceControl, - NumberControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - inboxConversations, - inboxThreads, - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -// Enough height to show the conversation list, header, and a few messages at once. -const PREVIEW_HEIGHT = 540; -// `shape.borderRadius` stays in a range that reads on chat bubbles without turning them into pills. -const MAX_BORDER_RADIUS = 28; - -const PRIMARY_PRESETS = [ - { label: 'Indigo', value: '#5b6cff' }, - { label: 'Slack', value: '#611f69' }, - { label: 'WhatsApp', value: '#25d366' }, - { label: 'Telegram', value: '#0088cc' }, - { label: 'Claude', value: '#da7756' }, -]; - -const allConversations = [minimalConversation, ...inboxConversations]; -const allMessages = [...minimalMessages, ...Object.values(inboxThreads).flat()]; - -const adapter = createEchoAdapter({ - respond: (text) => - `Echo: "${text}". Every bubble color, radius, and density above is driven by the props on the right.`, -}); - -export default function LookAndFeelPlayground() { - const [variant, setVariant] = React.useState('default'); - const [density, setDensity] = React.useState('standard'); - const [primary, setPrimary] = React.useState(PRIMARY_PRESETS[0].value); - const [radius, setRadius] = React.useState(12); - - const theme = React.useMemo( - () => - createTheme({ - palette: { primary: { main: primary } }, - shape: { borderRadius: radius }, - }), - [primary, radius], - ); - - return ( - - - - - - - - - - - Every change re-themes the live chat on the left. - - - - - - - palette.primary.main - - { - if (next !== null) { - setPrimary(next); - } - }} - aria-label="palette.primary.main" - sx={{ flexWrap: 'wrap', gap: 0.5, border: 0 }} - > - {PRIMARY_PRESETS.map((preset) => ( - - ))} - - - - `${value}px`} - onChange={setRadius} - /> - - - ); -} diff --git a/docs/data/chat/customization/look-and-feel/MessageStatesDemo.js b/docs/data/chat/customization/look-and-feel/MessageStatesDemo.js deleted file mode 100644 index 4a2ce60390a19..0000000000000 --- a/docs/data/chat/customization/look-and-feel/MessageStatesDemo.js +++ /dev/null @@ -1,147 +0,0 @@ -'use client'; -import * as React from 'react'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import { - ChatMessage, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, -} from '@mui/x-chat'; -import { ChatProvider, useChatStore } from '@mui/x-chat/headless'; - -import { - demoUsers, - createTextMessage, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const noopAdapter = { - async sendMessage() { - return new ReadableStream({ - start(controller) { - controller.close(); - }, - }); - }, -}; - -const conversation = { - id: 'message-states-demo', - title: 'Message states', - participants: [demoUsers.you, demoUsers.agent], - readState: 'read', - unreadCount: 0, -}; - -const messages = [ - createTextMessage({ - id: 'states-msg-assistant', - conversationId: conversation.id, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-15T09:30:00.000Z', - text: 'Default assistant bubble — uses palette.grey[100] (light) / palette.grey[800] (dark).', - }), - createTextMessage({ - id: 'states-msg-user', - conversationId: conversation.id, - role: 'user', - author: demoUsers.you, - createdAt: '2026-03-15T09:31:00.000Z', - text: 'Outgoing user bubble — uses `palette.primary.main`.', - }), - { - ...createTextMessage({ - id: 'states-msg-streaming', - conversationId: conversation.id, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-15T09:32:00.000Z', - text: 'Streaming bubble — animates while the assistant is typing…', - }), - status: 'streaming', - }, - { - ...createTextMessage({ - id: 'states-msg-error', - conversationId: conversation.id, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-15T09:33:00.000Z', - text: 'This message failed to send.', - }), - status: 'error', - }, -]; - -function ErrorEffect({ messageId }) { - const store = useChatStore(); - React.useEffect(() => { - store.setMessageError(messageId, { - code: 'SEND_ERROR', - source: 'send', - message: 'Could not reach the chat server.', - recoverable: true, - retryable: true, - }); - return () => { - store.setMessageError(messageId, null); - }; - }, [store, messageId]); - return null; -} - -function MessageBubble({ messageId }) { - return ( - - - - - - - ); -} - -const STATE_LABELS = { - 'states-msg-assistant': 'role="assistant" — status="sent"', - 'states-msg-user': 'role="user" — status="sent"', - 'states-msg-streaming': 'role="assistant" — status="streaming"', - 'states-msg-error': 'role="assistant" — status="error"', -}; - -export default function MessageStatesDemo() { - return ( - - - - - {messages.map((message) => ( - - - {STATE_LABELS[message.id]} - -
- -
-
- ))} -
-
-
- ); -} diff --git a/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.js b/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.js deleted file mode 100644 index f4aa2138de817..0000000000000 --- a/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.js +++ /dev/null @@ -1,63 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Paper from '@mui/material/Paper'; -import Typography from '@mui/material/Typography'; -import { ChatBox } from '@mui/x-chat'; - -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - demoUsers, - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ respond: () => 'echo' }); - -function VariantPanel({ variant, caption }) { - return ( - - - {caption} - - - - - - ); -} - -export default function MessageVariantsDemo() { - return ( - - - - - ); -} diff --git a/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.tsx.preview b/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.tsx.preview deleted file mode 100644 index c5e18f5177b75..0000000000000 --- a/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.tsx.preview +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/data/chat/customization/look-and-feel/ThemeAndSlotsDemo.js b/docs/data/chat/customization/look-and-feel/ThemeAndSlotsDemo.js deleted file mode 100644 index c0288de1eb629..0000000000000 --- a/docs/data/chat/customization/look-and-feel/ThemeAndSlotsDemo.js +++ /dev/null @@ -1,57 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { createTheme, ThemeProvider } from '@mui/material/styles'; -import { ChatBox } from '@mui/x-chat'; - -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - demoUsers, - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ respond: () => 'echo' }); - -const theme = createTheme({ - typography: { fontFamily: '"Inter", sans-serif' }, - components: { - MuiChatBox: { - styleOverrides: { - root: ({ theme: t }) => ({ - border: '1px solid', - borderColor: t.palette.divider, - }), - }, - }, - MuiChatMessage: { - styleOverrides: { - bubble: ({ theme: t }) => ({ - borderRadius: Number(t.shape.borderRadius) * 3, - }), - }, - }, - }, -}); - -export default function ThemeAndSlotsDemo() { - return ( - - - - - - ); -} diff --git a/docs/data/chat/customization/look-and-feel/ComposerVariantsDemo.tsx b/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/ComposerVariantsDemo.tsx similarity index 97% rename from docs/data/chat/customization/look-and-feel/ComposerVariantsDemo.tsx rename to docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/ComposerVariantsDemo.tsx index b432062b54297..471d89c627c19 100644 --- a/docs/data/chat/customization/look-and-feel/ComposerVariantsDemo.tsx +++ b/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/ComposerVariantsDemo.tsx @@ -54,6 +54,7 @@ export default function ComposerVariantsDemo() { width: '100%', }} > + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/client.ts b/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/index.ts b/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/index.ts new file mode 100644 index 0000000000000..9e0111c52dedc --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/composer-variants-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ComposerVariantsDemo from './ComposerVariantsDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ComposerVariantsDemo, { ClientProvider }); diff --git a/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.tsx b/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/DensityComparisonDemo.tsx similarity index 97% rename from docs/data/chat/customization/look-and-feel/DensityComparisonDemo.tsx rename to docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/DensityComparisonDemo.tsx index ff63352cb36ff..7c9f1adfa2c6a 100644 --- a/docs/data/chat/customization/look-and-feel/DensityComparisonDemo.tsx +++ b/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/DensityComparisonDemo.tsx @@ -61,9 +61,11 @@ export default function DensityComparisonDemo() { width: '100%', }} > + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/client.ts b/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/index.ts b/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/index.ts new file mode 100644 index 0000000000000..962b976a60d4d --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/density-comparison-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DensityComparisonDemo from './DensityComparisonDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DensityComparisonDemo, { ClientProvider }); diff --git a/docs/data/chat/customization/look-and-feel/LookAndFeelPlayground.tsx b/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/LookAndFeelPlayground.tsx similarity index 99% rename from docs/data/chat/customization/look-and-feel/LookAndFeelPlayground.tsx rename to docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/LookAndFeelPlayground.tsx index da75c13678b1d..438f8175d052a 100644 --- a/docs/data/chat/customization/look-and-feel/LookAndFeelPlayground.tsx +++ b/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/LookAndFeelPlayground.tsx @@ -44,6 +44,7 @@ const adapter = createEchoAdapter({ }); export default function LookAndFeelPlayground() { + // @focus-start @padding 1 const [variant, setVariant] = React.useState('default'); const [density, setDensity] = React.useState('standard'); const [primary, setPrimary] = React.useState(PRIMARY_PRESETS[0].value); @@ -166,4 +167,5 @@ export default function LookAndFeelPlayground() { ); + // @focus-end } diff --git a/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/client.ts b/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/index.ts b/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/index.ts new file mode 100644 index 0000000000000..a155f7be7056c --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/look-and-feel-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LookAndFeelPlayground from './LookAndFeelPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LookAndFeelPlayground, { ClientProvider }); diff --git a/docs/data/chat/customization/look-and-feel/MessageStatesDemo.tsx b/docs/data/chat/customization/look-and-feel/demos/message-states-demo/MessageStatesDemo.tsx similarity index 98% rename from docs/data/chat/customization/look-and-feel/MessageStatesDemo.tsx rename to docs/data/chat/customization/look-and-feel/demos/message-states-demo/MessageStatesDemo.tsx index 95ef4ab4f4238..e3c70bc375c16 100644 --- a/docs/data/chat/customization/look-and-feel/MessageStatesDemo.tsx +++ b/docs/data/chat/customization/look-and-feel/demos/message-states-demo/MessageStatesDemo.tsx @@ -116,6 +116,7 @@ const STATE_LABELS: Record = { export default function MessageStatesDemo() { return ( + // @focus-start @padding 2
+ // @focus-end ); } diff --git a/docs/data/chat/customization/look-and-feel/demos/message-states-demo/client.ts b/docs/data/chat/customization/look-and-feel/demos/message-states-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/message-states-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/look-and-feel/demos/message-states-demo/index.ts b/docs/data/chat/customization/look-and-feel/demos/message-states-demo/index.ts new file mode 100644 index 0000000000000..64f8d5818fbd6 --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/message-states-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MessageStatesDemo from './MessageStatesDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MessageStatesDemo, { ClientProvider }); diff --git a/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.tsx b/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/MessageVariantsDemo.tsx similarity index 97% rename from docs/data/chat/customization/look-and-feel/MessageVariantsDemo.tsx rename to docs/data/chat/customization/look-and-feel/demos/message-variants-demo/MessageVariantsDemo.tsx index 539bc0c65a29f..887ee70924fb3 100644 --- a/docs/data/chat/customization/look-and-feel/MessageVariantsDemo.tsx +++ b/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/MessageVariantsDemo.tsx @@ -61,8 +61,10 @@ export default function MessageVariantsDemo() { width: '100%', }} > + {/* @focus-start */} + {/* @focus-end */} ); } diff --git a/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/client.ts b/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/index.ts b/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/index.ts new file mode 100644 index 0000000000000..de6076d280d47 --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/message-variants-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import MessageVariantsDemo from './MessageVariantsDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, MessageVariantsDemo, { ClientProvider }); diff --git a/docs/data/chat/customization/look-and-feel/ThemeAndSlotsDemo.tsx b/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/ThemeAndSlotsDemo.tsx similarity index 97% rename from docs/data/chat/customization/look-and-feel/ThemeAndSlotsDemo.tsx rename to docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/ThemeAndSlotsDemo.tsx index c21aa9b821d3d..7774444c5b414 100644 --- a/docs/data/chat/customization/look-and-feel/ThemeAndSlotsDemo.tsx +++ b/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/ThemeAndSlotsDemo.tsx @@ -36,6 +36,7 @@ const theme = createTheme({ export default function ThemeAndSlotsDemo() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/client.ts b/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/index.ts b/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/index.ts new file mode 100644 index 0000000000000..612dd1b1976f2 --- /dev/null +++ b/docs/data/chat/customization/look-and-feel/demos/theme-and-slots-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ThemeAndSlotsDemo from './ThemeAndSlotsDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ThemeAndSlotsDemo, { ClientProvider }); diff --git a/docs/data/chat/customization/look-and-feel/look-and-feel.md b/docs/data/chat/customization/look-and-feel/look-and-feel.md index 44c2fac324811..669447d6db49c 100644 --- a/docs/data/chat/customization/look-and-feel/look-and-feel.md +++ b/docs/data/chat/customization/look-and-feel/look-and-feel.md @@ -16,7 +16,7 @@ components: ChatBox The same `ChatBox` re-themes itself when you swap the layout variant, density, primary color, or border radius—every change comes from a single Material UI theme and two top-level props (`variant` and `density`): -{{"demo": "LookAndFeelPlayground.js", "bg": "inline"}} +{{"component": "file://./demos/look-and-feel-playground/index.ts", "bg": "inline"}} :::warning Own-message bubbles use `palette.primary.main` as their background with `palette.primary.contrastText` text—when picking a brand primary, check the pair meets WCAG contrast. @@ -36,11 +36,11 @@ The `variant` prop controls how messages and the composer are arranged: The same conversation rendered with each variant—`default` uses colored bubbles with own messages on the trailing edge; `compact` drops the bubble and shows the author inline: -{{"demo": "MessageVariantsDemo.js", "bg": "inline"}} +{{"component": "file://./demos/message-variants-demo/index.ts", "bg": "inline"}} The demo below shows how the same `variant` prop drives the composer's two stock layouts: -{{"demo": "ComposerVariantsDemo.js", "bg": "inline"}} +{{"component": "file://./demos/composer-variants-demo/index.ts", "bg": "inline"}} ## Choosing a density @@ -54,13 +54,13 @@ The `density` prop controls vertical spacing between messages: `standard` is the default when the prop is omitted. -{{"demo": "DensityComparisonDemo.js", "bg": "inline"}} +{{"component": "file://./demos/density-comparison-demo/index.ts", "bg": "inline"}} ## Message states `ChatMessage` adapts to the role and status it reads from the store—no extra props required: -{{"demo": "MessageStatesDemo.js", "bg": "inline"}} +{{"component": "file://./demos/message-states-demo/index.ts", "bg": "inline"}} ## Applying one-off styles with `sx` @@ -126,7 +126,7 @@ Style any internal subcomponent without replacing it: Both techniques applied to a live `ChatBox`—the theme override rounds every bubble, and `slotProps` restyles the send button and placeholder: -{{"demo": "ThemeAndSlotsDemo.js", "bg": "inline"}} +{{"component": "file://./demos/theme-and-slots-demo/index.ts", "bg": "inline"}} To replace subcomponents entirely, see [Slot overrides](/x/react-chat/material/slot-overrides/). diff --git a/docs/data/chat/customization/overview/EightyTwentyDemo.js b/docs/data/chat/customization/overview/EightyTwentyDemo.js deleted file mode 100644 index b0def39744e41..0000000000000 --- a/docs/data/chat/customization/overview/EightyTwentyDemo.js +++ /dev/null @@ -1,62 +0,0 @@ -'use client'; -import * as React from 'react'; -import Stack from '@mui/material/Stack'; -import ToggleButton from '@mui/material/ToggleButton'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import { createTheme, ThemeProvider } from '@mui/material/styles'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter({ - respond: (text) => - `Echo: "${text}". Switch to Branded above to restyle this chat with theme + sx alone.`, -}); - -const brandTheme = createTheme({ - palette: { primary: { main: '#5b6cff' } }, - shape: { borderRadius: 16 }, -}); - -export default function EightyTwentyDemo() { - const [skin, setSkin] = React.useState('default'); - - const chat = ( - - ); - - return ( - - { - if (next !== null) { - setSkin(next); - } - }} - aria-label="Theme skin" - > - Default - Branded - - - {skin === 'branded' ? ( - {chat} - ) : ( - chat - )} - - ); -} diff --git a/docs/data/chat/customization/overview/EightyTwentyDemo.tsx b/docs/data/chat/customization/overview/demos/eighty-twenty-demo/EightyTwentyDemo.tsx similarity index 97% rename from docs/data/chat/customization/overview/EightyTwentyDemo.tsx rename to docs/data/chat/customization/overview/demos/eighty-twenty-demo/EightyTwentyDemo.tsx index c8fc89df5f111..e65c24543cfe1 100644 --- a/docs/data/chat/customization/overview/EightyTwentyDemo.tsx +++ b/docs/data/chat/customization/overview/demos/eighty-twenty-demo/EightyTwentyDemo.tsx @@ -24,6 +24,7 @@ const brandTheme = createTheme({ type Skin = 'default' | 'branded'; export default function EightyTwentyDemo() { + // @focus-start @padding 1 const [skin, setSkin] = React.useState('default'); const chat = ( @@ -61,4 +62,5 @@ export default function EightyTwentyDemo() { )} ); + // @focus-end } diff --git a/docs/data/chat/customization/overview/demos/eighty-twenty-demo/client.ts b/docs/data/chat/customization/overview/demos/eighty-twenty-demo/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/overview/demos/eighty-twenty-demo/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/overview/demos/eighty-twenty-demo/index.ts b/docs/data/chat/customization/overview/demos/eighty-twenty-demo/index.ts new file mode 100644 index 0000000000000..ea8aef7a63963 --- /dev/null +++ b/docs/data/chat/customization/overview/demos/eighty-twenty-demo/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import EightyTwentyDemo from './EightyTwentyDemo'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, EightyTwentyDemo, { ClientProvider }); diff --git a/docs/data/chat/customization/overview/overview.md b/docs/data/chat/customization/overview/overview.md index f32b30a5616ec..e2afec30d6f94 100644 --- a/docs/data/chat/customization/overview/overview.md +++ b/docs/data/chat/customization/overview/overview.md @@ -58,7 +58,7 @@ Most apps only need the top two layers: ``` -{{"demo": "EightyTwentyDemo.js", "bg": "inline"}} +{{"component": "file://./demos/eighty-twenty-demo/index.ts", "bg": "inline"}} Reach for `slots` or `partRenderers` only when the theme can't express what you need—for example, replacing the Composer with a fully custom input, or rendering tool-call results as cards instead of JSON. diff --git a/docs/data/chat/customization/structure/StructureRecipes.js b/docs/data/chat/customization/structure/StructureRecipes.js deleted file mode 100644 index f4be6b4a4ab2a..0000000000000 --- a/docs/data/chat/customization/structure/StructureRecipes.js +++ /dev/null @@ -1,48 +0,0 @@ -'use client'; -import * as React from 'react'; -import IconButton from '@mui/material/IconButton'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; -import SendRoundedIcon from '@mui/icons-material/SendRounded'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; - -const adapter = createEchoAdapter(); - -function CustomEmptyState() { - return ( - - - Ask me anything - - ); -} - -function CustomSendButton(props) { - return ( - - - - ); -} - -export default function StructureRecipes() { - return ( - - ); -} diff --git a/docs/data/chat/customization/structure/StructureRecipes.tsx.preview b/docs/data/chat/customization/structure/StructureRecipes.tsx.preview deleted file mode 100644 index 415a5cc1b0b2a..0000000000000 --- a/docs/data/chat/customization/structure/StructureRecipes.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/customization/structure/StructureRecipes.tsx b/docs/data/chat/customization/structure/demos/structure-recipes/StructureRecipes.tsx similarity index 96% rename from docs/data/chat/customization/structure/StructureRecipes.tsx rename to docs/data/chat/customization/structure/demos/structure-recipes/StructureRecipes.tsx index b22d6cbbf1531..3acc94073774e 100644 --- a/docs/data/chat/customization/structure/StructureRecipes.tsx +++ b/docs/data/chat/customization/structure/demos/structure-recipes/StructureRecipes.tsx @@ -29,6 +29,7 @@ function CustomSendButton(props: React.ComponentProps) { export default function StructureRecipes() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/customization/structure/demos/structure-recipes/client.ts b/docs/data/chat/customization/structure/demos/structure-recipes/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/customization/structure/demos/structure-recipes/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/customization/structure/demos/structure-recipes/index.ts b/docs/data/chat/customization/structure/demos/structure-recipes/index.ts new file mode 100644 index 0000000000000..adcddc125bb65 --- /dev/null +++ b/docs/data/chat/customization/structure/demos/structure-recipes/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import StructureRecipes from './StructureRecipes'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, StructureRecipes, { ClientProvider }); diff --git a/docs/data/chat/customization/structure/structure.md b/docs/data/chat/customization/structure/structure.md index 8220d04badabf..3d1ed657e3acb 100644 --- a/docs/data/chat/customization/structure/structure.md +++ b/docs/data/chat/customization/structure/structure.md @@ -16,7 +16,7 @@ components: ChatBox The recipes below cover common customizations. -{{"demo": "StructureRecipes.js"}} +{{"component": "file://./demos/structure-recipes/index.ts"}} Several of the recipes below applied at once. diff --git a/docs/data/chat/display/date-divider/ChatDateDividerPlayground.js b/docs/data/chat/display/date-divider/ChatDateDividerPlayground.js deleted file mode 100644 index 9c4cfbbda4c28..0000000000000 --- a/docs/data/chat/display/date-divider/ChatDateDividerPlayground.js +++ /dev/null @@ -1,171 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { ChatDateDivider, ChatMessage } from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, - SelectControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'date-playground', - title: 'Date divider', - participants: [users.me, users.assistant], -}; - -const NOW = new Date('2026-05-03T09:00:00.000Z'); - -function makeMessage(id, day) { - const created = new Date(NOW); - if (day === 'yesterday') { - created.setUTCDate(NOW.getUTCDate() - 1); - } - if (day === 'lastWeek') { - created.setUTCDate(NOW.getUTCDate() - 7); - } - if (day === 'lastYear') { - created.setUTCFullYear(NOW.getUTCFullYear() - 1); - } - return { - id, - conversationId: conversation.id, - role: 'assistant', - author: users.assistant, - createdAt: created.toISOString(), - status: 'read', - parts: [{ type: 'text', text: `Sent ${day}` }], - }; -} - -function relativeFormat(date) { - const diffMs = - Date.UTC(NOW.getUTCFullYear(), NOW.getUTCMonth(), NOW.getUTCDate()) - - Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); - const days = Math.floor(diffMs / (24 * 60 * 60 * 1000)); - if (days === 0) { - return 'today'; - } - if (days === 1) { - return 'yesterday'; - } - if (days < 7) { - return `${days} days ago`; - } - if (days < 365) { - return `${Math.floor(days / 7)} weeks ago`; - } - return `${Math.floor(days / 365)} year(s) ago`; -} - -const FORMATTERS = { - default: undefined, - iso: (date) => date.toISOString().slice(0, 10), - relative: relativeFormat, -}; - -const CLASS_DEFS = [ - { - name: 'dateDivider', - selector: '.MuiChatMessage-dateDivider', - description: 'The date divider element.', - }, - { - name: 'dateDividerLine', - selector: '.MuiChatMessage-dateDividerLine', - description: 'The horizontal rule on each side of the label.', - }, - { - name: 'dateDividerLabel', - selector: '.MuiChatMessage-dateDividerLabel', - description: 'The formatted day label.', - }, -]; - -export default function ChatDateDividerPlayground() { - const [day, setDay] = React.useState('today'); - const [format, setFormat] = React.useState('default'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - // ChatDateDivider only renders at a calendar boundary, so we seed a prior - // message with an old `createdAt` to guarantee the boundary regardless of - // the selected `day`. - const messages = React.useMemo(() => { - const prior = makeMessage('date-prior', 'lastYear'); - // For `lastYear`, pull the prior even further back so the boundary still triggers. - if (day === 'lastYear') { - prior.createdAt = new Date( - Date.UTC(NOW.getUTCFullYear() - 2, NOW.getUTCMonth(), NOW.getUTCDate()), - ).toISOString(); - } - return [prior, makeMessage('date-target', day)]; - }, [day]); - const items = React.useMemo(() => messages.map((m) => m.id), [messages]); - - const dividerSx = classesCustomizations.toClassesSx(); - - return ( - - props - - fixture (message data) - - - } - preview={ - - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/display/date-divider/DateDividerByWeek.js b/docs/data/chat/display/date-divider/DateDividerByWeek.js deleted file mode 100644 index b0493f27a7733..0000000000000 --- a/docs/data/chat/display/date-divider/DateDividerByWeek.js +++ /dev/null @@ -1,111 +0,0 @@ -'use client'; -import * as React from 'react'; -import { ChatBox } from '@mui/x-chat'; - -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - createTextMessage, - demoUsers, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -const CONV_ID = 'date-divider-by-week'; - -const conversation = { - id: CONV_ID, - title: 'Date divider by week', - participants: [demoUsers.you, demoUsers.agent], - readState: 'read', - unreadCount: 0, - lastMessageAt: '2026-03-17T10:00:00.000Z', -}; - -const messages = [ - createTextMessage({ - id: 'dd-week-1', - conversationId: CONV_ID, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-02T15:00:00.000Z', - text: 'Kicking off the project this week.', - }), - createTextMessage({ - id: 'dd-week-2', - conversationId: CONV_ID, - role: 'user', - author: demoUsers.you, - createdAt: '2026-03-04T09:30:00.000Z', - text: 'Same week — no new divider above me.', - }), - createTextMessage({ - id: 'dd-week-3', - conversationId: CONV_ID, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-10T10:00:00.000Z', - text: 'A new week starts here.', - }), - createTextMessage({ - id: 'dd-week-4', - conversationId: CONV_ID, - role: 'user', - author: demoUsers.you, - createdAt: '2026-03-12T11:00:00.000Z', - text: 'Still the same week as the previous message.', - }), - createTextMessage({ - id: 'dd-week-5', - conversationId: CONV_ID, - role: 'assistant', - author: demoUsers.agent, - createdAt: '2026-03-17T08:00:00.000Z', - text: 'And another week begins.', - }), -]; - -// Back to the Monday that starts the date's ISO week, in UTC. -function startOfWeek(date) { - const d = new Date(date); - d.setUTCDate(d.getUTCDate() - ((d.getUTCDay() + 6) % 7)); - return d; -} - -function startOfWeekIso(date) { - return startOfWeek(date).toISOString().slice(0, 10); -} - -const shouldShowDivider = ({ date, previousDate }) => - date != null && - previousDate != null && - startOfWeekIso(date) !== startOfWeekIso(previousDate); - -const formatDate = (date) => - `Week of ${startOfWeek(date).toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - })}`; - -export default function DateDividerByWeek() { - return ( - - ); -} diff --git a/docs/data/chat/display/date-divider/date-divider.md b/docs/data/chat/display/date-divider/date-divider.md index 925c011d3e255..58dc943265117 100644 --- a/docs/data/chat/display/date-divider/date-divider.md +++ b/docs/data/chat/display/date-divider/date-divider.md @@ -59,7 +59,7 @@ Divider slot customizations only take effect while the feature is enabled. Witho The demo below enables the feature on a conversation spanning three days — a divider appears at each day boundary: -{{"demo": "../../material/message-list/DateDividerFormat.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://../../material/message-list/demos/date-divider-format/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Customizing divider placement @@ -84,7 +84,7 @@ const shouldShowDivider = ({ date, previousDate }) => startOfWeekIso(date) !== startOfWeekIso(previousDate); ``` -{{"demo": "DateDividerByWeek.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/date-divider-by-week/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Divider every N messages @@ -111,7 +111,7 @@ The same hook supports any rule: for example, group by the viewer's **local** da The playground below renders the divider between two messages and lets you change `formatDate` and the second message's `createdAt`: -{{"demo": "ChatDateDividerPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-date-divider-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## See also diff --git a/docs/data/chat/display/date-divider/ChatDateDividerPlayground.tsx b/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/ChatDateDividerPlayground.tsx similarity index 95% rename from docs/data/chat/display/date-divider/ChatDateDividerPlayground.tsx rename to docs/data/chat/display/date-divider/demos/chat-date-divider-playground/ChatDateDividerPlayground.tsx index 787927b145011..0a89101ccbc17 100644 --- a/docs/data/chat/display/date-divider/ChatDateDividerPlayground.tsx +++ b/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/ChatDateDividerPlayground.tsx @@ -12,10 +12,8 @@ import { DividerLabel, SelectControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -102,6 +100,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatDateDividerPlayground() { + // @focus-start @padding 1 const [day, setDay] = React.useState('today'); const [format, setFormat] = React.useState('default'); const classesCustomizations = useCustomizations(CLASS_DEFS); @@ -183,4 +182,5 @@ export default function ChatDateDividerPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/client.ts b/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/index.ts b/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/index.ts new file mode 100644 index 0000000000000..6fd51aa6c4527 --- /dev/null +++ b/docs/data/chat/display/date-divider/demos/chat-date-divider-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatDateDividerPlayground from './ChatDateDividerPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatDateDividerPlayground, { ClientProvider }); diff --git a/docs/data/chat/display/date-divider/DateDividerByWeek.tsx b/docs/data/chat/display/date-divider/demos/date-divider-by-week/DateDividerByWeek.tsx similarity index 98% rename from docs/data/chat/display/date-divider/DateDividerByWeek.tsx rename to docs/data/chat/display/date-divider/demos/date-divider-by-week/DateDividerByWeek.tsx index 538937d3e31d6..0463d3104bec6 100644 --- a/docs/data/chat/display/date-divider/DateDividerByWeek.tsx +++ b/docs/data/chat/display/date-divider/demos/date-divider-by-week/DateDividerByWeek.tsx @@ -94,6 +94,7 @@ const formatDate = (date: Date) => export default function DateDividerByWeek() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/display/date-divider/demos/date-divider-by-week/client.ts b/docs/data/chat/display/date-divider/demos/date-divider-by-week/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/date-divider/demos/date-divider-by-week/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/date-divider/demos/date-divider-by-week/index.ts b/docs/data/chat/display/date-divider/demos/date-divider-by-week/index.ts new file mode 100644 index 0000000000000..41e36e6d8086b --- /dev/null +++ b/docs/data/chat/display/date-divider/demos/date-divider-by-week/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import DateDividerByWeek from './DateDividerByWeek'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, DateDividerByWeek, { ClientProvider }); diff --git a/docs/data/chat/display/loading-and-empty-states/ChatMessageSkeletonPlayground.js b/docs/data/chat/display/loading-and-empty-states/ChatMessageSkeletonPlayground.js deleted file mode 100644 index 381218296f90b..0000000000000 --- a/docs/data/chat/display/loading-and-empty-states/ChatMessageSkeletonPlayground.js +++ /dev/null @@ -1,52 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { ChatMessageSkeleton } from '@mui/x-chat'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - DividerLabel, - NumberControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const CLASS_DEFS = [ - { name: 'root', description: 'The skeleton container.' }, - { - name: 'line', - selector: '.MuiChatMessageSkeleton-line', - description: 'Each shimmer line.', - }, -]; - -export default function ChatMessageSkeletonPlayground() { - const [lines, setLines] = React.useState(3); - const classesCustomizations = useCustomizations(CLASS_DEFS); - - const skeletonSx = classesCustomizations.toClassesSx(); - - return ( - - props - - - } - preview={ - - - - } - /> - ); -} diff --git a/docs/data/chat/display/loading-and-empty-states/CustomEmptyState.js b/docs/data/chat/display/loading-and-empty-states/CustomEmptyState.js deleted file mode 100644 index 3a2466a893b1b..0000000000000 --- a/docs/data/chat/display/loading-and-empty-states/CustomEmptyState.js +++ /dev/null @@ -1,107 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Typography from '@mui/material/Typography'; -import { - ChatConversation, - ChatConversationHeader, - ChatMessageList, - ChatMessageGroup, - ChatComposer, -} from '@mui/x-chat'; -import { ChatProvider, useChat } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; - -const emptyConversation = { - id: 'custom-empty-conv', - title: 'New conversation', - subtitle: 'Pick a prompt to get started', - participants: [], - readState: 'read', - unreadCount: 0, - lastMessageAt: '2026-03-15T10:00:00.000Z', -}; - -function EmptyStateContent() { - const { messages, sendMessage } = useChat(); - - if (messages.length > 0) { - return null; - } - - return ( - - How can I help you today? - - - - - - ); -} - -const adapter = createEchoAdapter(); - -export default function CustomEmptyState() { - return ( - - - - - } - renderItem={({ id, index }) => ( - - )} - /> - - - - - ); -} diff --git a/docs/data/chat/display/loading-and-empty-states/LoadingSkeletonInList.js b/docs/data/chat/display/loading-and-empty-states/LoadingSkeletonInList.js deleted file mode 100644 index 51349570c6e39..0000000000000 --- a/docs/data/chat/display/loading-and-empty-states/LoadingSkeletonInList.js +++ /dev/null @@ -1,102 +0,0 @@ -'use client'; -import * as React from 'react'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import { - ChatConversation, - ChatConversationHeader, - ChatMessageList, - ChatMessageGroup, - ChatComposer, - ChatMessageSkeleton, -} from '@mui/x-chat'; -import { ChatProvider } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -function LoadingMessages() { - return ( - - - - - - ); -} - -export default function LoadingSkeletonInList() { - const [loading, setLoading] = React.useState(true); - - React.useEffect(() => { - if (!loading) { - return undefined; - } - const timer = setTimeout(() => setLoading(false), 1500); - return () => clearTimeout(timer); - }, [loading]); - - return ( - - - - - - - - - {loading ? ( - - ) : ( - ( - - )} - /> - )} - - - - - - ); -} diff --git a/docs/data/chat/display/loading-and-empty-states/ChatMessageSkeletonPlayground.tsx b/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/ChatMessageSkeletonPlayground.tsx similarity index 86% rename from docs/data/chat/display/loading-and-empty-states/ChatMessageSkeletonPlayground.tsx rename to docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/ChatMessageSkeletonPlayground.tsx index e93f173da1fbf..3b8a3bc2cfad5 100644 --- a/docs/data/chat/display/loading-and-empty-states/ChatMessageSkeletonPlayground.tsx +++ b/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/ChatMessageSkeletonPlayground.tsx @@ -6,10 +6,8 @@ import { DividerLabel, NumberControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; type ClassKey = 'root' | 'line'; @@ -23,6 +21,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageSkeletonPlayground() { + // @focus-start @padding 1 const [lines, setLines] = React.useState(3); const classesCustomizations = useCustomizations(CLASS_DEFS); @@ -54,4 +53,5 @@ export default function ChatMessageSkeletonPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/client.ts b/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/index.ts b/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/index.ts new file mode 100644 index 0000000000000..6aa1ea2731be9 --- /dev/null +++ b/docs/data/chat/display/loading-and-empty-states/demos/chat-message-skeleton-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageSkeletonPlayground from './ChatMessageSkeletonPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageSkeletonPlayground, { ClientProvider }); diff --git a/docs/data/chat/display/loading-and-empty-states/CustomEmptyState.tsx b/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/CustomEmptyState.tsx similarity index 98% rename from docs/data/chat/display/loading-and-empty-states/CustomEmptyState.tsx rename to docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/CustomEmptyState.tsx index 242783b85c93b..28eeb329274d4 100644 --- a/docs/data/chat/display/loading-and-empty-states/CustomEmptyState.tsx +++ b/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/CustomEmptyState.tsx @@ -78,6 +78,7 @@ const adapter = createEchoAdapter(); export default function CustomEmptyState() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/client.ts b/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/index.ts b/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/index.ts new file mode 100644 index 0000000000000..9aba12d5f2c6c --- /dev/null +++ b/docs/data/chat/display/loading-and-empty-states/demos/custom-empty-state/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import CustomEmptyState from './CustomEmptyState'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, CustomEmptyState, { ClientProvider }); diff --git a/docs/data/chat/display/loading-and-empty-states/LoadingSkeletonInList.tsx b/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/LoadingSkeletonInList.tsx similarity index 98% rename from docs/data/chat/display/loading-and-empty-states/LoadingSkeletonInList.tsx rename to docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/LoadingSkeletonInList.tsx index 51349570c6e39..b9fc15f27d709 100644 --- a/docs/data/chat/display/loading-and-empty-states/LoadingSkeletonInList.tsx +++ b/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/LoadingSkeletonInList.tsx @@ -43,6 +43,7 @@ function LoadingMessages() { } export default function LoadingSkeletonInList() { + // @focus-start @padding 1 const [loading, setLoading] = React.useState(true); React.useEffect(() => { @@ -99,4 +100,5 @@ export default function LoadingSkeletonInList() { ); + // @focus-end } diff --git a/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/client.ts b/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/index.ts b/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/index.ts new file mode 100644 index 0000000000000..85b76101f1271 --- /dev/null +++ b/docs/data/chat/display/loading-and-empty-states/demos/loading-skeleton-in-list/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import LoadingSkeletonInList from './LoadingSkeletonInList'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, LoadingSkeletonInList, { ClientProvider }); diff --git a/docs/data/chat/display/loading-and-empty-states/loading-and-empty-states.md b/docs/data/chat/display/loading-and-empty-states/loading-and-empty-states.md index a2f82e3e995e1..bb16630f320de 100644 --- a/docs/data/chat/display/loading-and-empty-states/loading-and-empty-states.md +++ b/docs/data/chat/display/loading-and-empty-states/loading-and-empty-states.md @@ -21,7 +21,7 @@ Use it during initial data fetching or when loading older messages via [history Use the demo below to adjust the number of shimmer lines: -{{"demo": "ChatMessageSkeletonPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-skeleton-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Importing the component @@ -53,7 +53,7 @@ Nothing renders the skeleton automatically — you decide where it appears. Render skeletons in the message area while the fetch is in flight, then swap to `ChatMessageList` once the data arrives. Set `aria-busy` on the swapping container and `aria-hidden` on each skeleton so assistive technology treats the placeholders as decorative. -{{"demo": "LoadingSkeletonInList.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/loading-skeleton-in-list/index.ts", "bg": "inline", "collapseToEmpty": true}} When older messages are being fetched via history pagination, render a skeleton at the top of the list instead. The `isLoadingHistory` flag from `useChat()` reports when a page is in flight. @@ -148,7 +148,7 @@ if (messages.length === 0) { The message area below is intentionally empty — only the conversation header and the composer render: -{{"demo": "../../material/examples/empty-state/EmptyState.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/examples/empty-state/demos/empty-state/index.ts", "bg": "inline", "collapseToEmpty": true}} Key characteristics of the empty state: @@ -161,7 +161,7 @@ Key characteristics of the empty state: Provide custom empty state content by composing the thread from individual components. A common pattern is to display suggested prompts that help users start a conversation: -{{"demo": "CustomEmptyState.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/custom-empty-state/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Streaming indicator diff --git a/docs/data/chat/display/message-actions/BasicMessageActions.js b/docs/data/chat/display/message-actions/BasicMessageActions.js deleted file mode 100644 index 45dcd01a07988..0000000000000 --- a/docs/data/chat/display/message-actions/BasicMessageActions.js +++ /dev/null @@ -1,50 +0,0 @@ -'use client'; -import * as React from 'react'; -import IconButton from '@mui/material/IconButton'; -import ContentCopyIcon from '@mui/icons-material/ContentCopy'; -import EditIcon from '@mui/icons-material/Edit'; -import DeleteIcon from '@mui/icons-material/Delete'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -function MyMessageActions() { - return ( - - - - - - - - - - - - ); -} - -const adapter = createEchoAdapter(); - -export default function BasicMessageActions() { - return ( - - ); -} diff --git a/docs/data/chat/display/message-actions/BasicMessageActions.tsx.preview b/docs/data/chat/display/message-actions/BasicMessageActions.tsx.preview deleted file mode 100644 index f350afaaba058..0000000000000 --- a/docs/data/chat/display/message-actions/BasicMessageActions.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/display/message-actions/ChatMessageActionsPlayground.js b/docs/data/chat/display/message-actions/ChatMessageActionsPlayground.js deleted file mode 100644 index 94ad4c140bf26..0000000000000 --- a/docs/data/chat/display/message-actions/ChatMessageActionsPlayground.js +++ /dev/null @@ -1,163 +0,0 @@ -import * as React from 'react'; -import CopyIcon from '@mui/icons-material/ContentCopy'; -import ThumbsUpIcon from '@mui/icons-material/ThumbUp'; -import Box from '@mui/material/Box'; -import IconButton from '@mui/material/IconButton'; -import Tooltip from '@mui/material/Tooltip'; -import { - ChatMessage as ChatMessageComponent, - ChatMessageActions, - ChatMessageAvatar, - ChatMessageContent, - ChatMessageGroup, -} from '@mui/x-chat'; - -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - ChatChrome, - ScopedChat, -} from 'docs/src/modules/components/chat-playground/sharedProviders'; -import { - ChoiceControl, - DividerLabel, - SwitchControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; -import { users } from 'docs/src/modules/components/chat-playground/data'; - -const conversation = { - id: 'actions-playground', - title: 'Actions', - participants: [users.me, users.assistant], -}; - -function makeMessage(role, status, text) { - const author = role === 'user' ? users.me : users.assistant; - return { - id: `actions-${role}-${status}`, - conversationId: conversation.id, - role, - author, - createdAt: '2026-05-03T09:30:00.000Z', - status, - parts: [{ type: 'text', text }], - }; -} - -const CLASS_DEFS = [ - { - name: 'actions', - selector: '.MuiChatMessage-actions', - description: 'The hover-revealed action toolbar.', - }, -]; - -export default function ChatMessageActionsPlayground() { - const [showCopy, setShowCopy] = React.useState(true); - const [showLike, setShowLike] = React.useState(true); - const [revealed, setRevealed] = React.useState(true); - const [variant, setVariant] = React.useState('default'); - const [density, setDensity] = React.useState('standard'); - const classesCustomizations = useCustomizations(CLASS_DEFS); - const message = React.useMemo( - () => - makeMessage( - 'assistant', - 'read', - 'Toggle "reveal actions", or hover this bubble.', - ), - [], - ); - - const wrapperSx = classesCustomizations.toClassesSx(); - - return ( - - composition (children) - - - visibility - - chrome provider - - - - } - preview={ - - - - - - - - - {showCopy ? ( - - - - - - ) : null} - {showLike ? ( - - - - - - ) : null} - - - - - - - } - /> - ); -} diff --git a/docs/data/chat/display/message-actions/ExtraActionsMessageActions.js b/docs/data/chat/display/message-actions/ExtraActionsMessageActions.js deleted file mode 100644 index aadac96c5415f..0000000000000 --- a/docs/data/chat/display/message-actions/ExtraActionsMessageActions.js +++ /dev/null @@ -1,43 +0,0 @@ -'use client'; -import * as React from 'react'; -import RefreshIcon from '@mui/icons-material/Refresh'; -import { ChatBox } from '@mui/x-chat'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -const adapter = createEchoAdapter(); - -export default function ExtraActionsMessageActions() { - return ( - - message?.role === 'assistant' - ? { - extraActions: [ - { - id: 'regenerate', - label: 'Regenerate', - icon: , - onClick: (event, { chat }) => chat.regenerate(message.id), - }, - ], - } - : {}, - }} - sx={{ - height: 500, - border: '1px solid', - borderColor: 'divider', - borderRadius: 1, - }} - /> - ); -} diff --git a/docs/data/chat/display/message-actions/RoleBasedMessageActions.js b/docs/data/chat/display/message-actions/RoleBasedMessageActions.js deleted file mode 100644 index c1374bffc4c54..0000000000000 --- a/docs/data/chat/display/message-actions/RoleBasedMessageActions.js +++ /dev/null @@ -1,65 +0,0 @@ -'use client'; -import * as React from 'react'; -import IconButton from '@mui/material/IconButton'; -import ContentCopyIcon from '@mui/icons-material/ContentCopy'; -import EditIcon from '@mui/icons-material/Edit'; -import RefreshIcon from '@mui/icons-material/Refresh'; -import { ChatBox } from '@mui/x-chat'; -import { useChatActions, useMessage } from '@mui/x-chat/headless'; -import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils'; -import { - minimalConversation, - minimalMessages, -} from 'docs/data/chat/core/examples/shared/demoData'; - -function RoleBasedActions({ messageId }) { - const message = useMessage(messageId); - // `useChatActions` exposes the runtime actions without subscribing to message - // state, so the toolbar never re-renders as the conversation streams. - const chat = useChatActions(); - const role = message?.role; - - return ( - - - - - {role === 'assistant' && ( - chat.regenerate(messageId)} - > - - - )} - {role === 'user' && ( - - - - )} - - ); -} - -const adapter = createEchoAdapter(); - -export default function RoleBasedMessageActions() { - return ( - - ); -} diff --git a/docs/data/chat/display/message-actions/RoleBasedMessageActions.tsx.preview b/docs/data/chat/display/message-actions/RoleBasedMessageActions.tsx.preview deleted file mode 100644 index 4c0ed9209f9ed..0000000000000 --- a/docs/data/chat/display/message-actions/RoleBasedMessageActions.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/chat/display/message-actions/BasicMessageActions.tsx b/docs/data/chat/display/message-actions/demos/basic-message-actions/BasicMessageActions.tsx similarity index 96% rename from docs/data/chat/display/message-actions/BasicMessageActions.tsx rename to docs/data/chat/display/message-actions/demos/basic-message-actions/BasicMessageActions.tsx index 45dcd01a07988..e8fa18891d9e0 100644 --- a/docs/data/chat/display/message-actions/BasicMessageActions.tsx +++ b/docs/data/chat/display/message-actions/demos/basic-message-actions/BasicMessageActions.tsx @@ -31,6 +31,7 @@ const adapter = createEchoAdapter(); export default function BasicMessageActions() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/display/message-actions/demos/basic-message-actions/client.ts b/docs/data/chat/display/message-actions/demos/basic-message-actions/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/basic-message-actions/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/message-actions/demos/basic-message-actions/index.ts b/docs/data/chat/display/message-actions/demos/basic-message-actions/index.ts new file mode 100644 index 0000000000000..8757a39d90e11 --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/basic-message-actions/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import BasicMessageActions from './BasicMessageActions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, BasicMessageActions, { ClientProvider }); diff --git a/docs/data/chat/display/message-actions/ChatMessageActionsPlayground.tsx b/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/ChatMessageActionsPlayground.tsx similarity index 95% rename from docs/data/chat/display/message-actions/ChatMessageActionsPlayground.tsx rename to docs/data/chat/display/message-actions/demos/chat-message-actions-playground/ChatMessageActionsPlayground.tsx index 2f0951dd7e9dc..4f69848d6b11e 100644 --- a/docs/data/chat/display/message-actions/ChatMessageActionsPlayground.tsx +++ b/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/ChatMessageActionsPlayground.tsx @@ -27,10 +27,8 @@ import { DividerLabel, SwitchControl, } from 'docs/src/modules/components/chat-playground/controls'; -import { - useCustomizations, - type CustomizationDef, -} from 'docs/src/modules/components/chat-playground/useCustomizations'; +import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; +import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations'; import { users } from 'docs/src/modules/components/chat-playground/data'; const conversation: ChatConversation = { @@ -66,6 +64,7 @@ const CLASS_DEFS: ReadonlyArray> = [ ]; export default function ChatMessageActionsPlayground() { + // @focus-start @padding 1 const [showCopy, setShowCopy] = React.useState(true); const [showLike, setShowLike] = React.useState(true); const [revealed, setRevealed] = React.useState(true); @@ -173,4 +172,5 @@ export default function ChatMessageActionsPlayground() { } /> ); + // @focus-end } diff --git a/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/client.ts b/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/index.ts b/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/index.ts new file mode 100644 index 0000000000000..c810b6e4addf6 --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/chat-message-actions-playground/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ChatMessageActionsPlayground from './ChatMessageActionsPlayground'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ChatMessageActionsPlayground, { ClientProvider }); diff --git a/docs/data/chat/display/message-actions/ExtraActionsMessageActions.tsx b/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/ExtraActionsMessageActions.tsx similarity index 96% rename from docs/data/chat/display/message-actions/ExtraActionsMessageActions.tsx rename to docs/data/chat/display/message-actions/demos/extra-actions-message-actions/ExtraActionsMessageActions.tsx index aadac96c5415f..97b61381af6e4 100644 --- a/docs/data/chat/display/message-actions/ExtraActionsMessageActions.tsx +++ b/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/ExtraActionsMessageActions.tsx @@ -12,6 +12,7 @@ const adapter = createEchoAdapter(); export default function ExtraActionsMessageActions() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/client.ts b/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/index.ts b/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/index.ts new file mode 100644 index 0000000000000..f2d10c71c2cff --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/extra-actions-message-actions/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import ExtraActionsMessageActions from './ExtraActionsMessageActions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, ExtraActionsMessageActions, { ClientProvider }); diff --git a/docs/data/chat/display/message-actions/RoleBasedMessageActions.tsx b/docs/data/chat/display/message-actions/demos/role-based-message-actions/RoleBasedMessageActions.tsx similarity index 97% rename from docs/data/chat/display/message-actions/RoleBasedMessageActions.tsx rename to docs/data/chat/display/message-actions/demos/role-based-message-actions/RoleBasedMessageActions.tsx index 6d863c95689e0..f575352ceb53c 100644 --- a/docs/data/chat/display/message-actions/RoleBasedMessageActions.tsx +++ b/docs/data/chat/display/message-actions/demos/role-based-message-actions/RoleBasedMessageActions.tsx @@ -46,6 +46,7 @@ const adapter = createEchoAdapter(); export default function RoleBasedMessageActions() { return ( + // @focus-start @padding 2 + // @focus-end ); } diff --git a/docs/data/chat/display/message-actions/demos/role-based-message-actions/client.ts b/docs/data/chat/display/message-actions/demos/role-based-message-actions/client.ts new file mode 100644 index 0000000000000..c874a2038b3ef --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/role-based-message-actions/client.ts @@ -0,0 +1,7 @@ +'use client'; + +import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient'; + +const ClientProvider = createDemoClient(import.meta.url); + +export default ClientProvider; diff --git a/docs/data/chat/display/message-actions/demos/role-based-message-actions/index.ts b/docs/data/chat/display/message-actions/demos/role-based-message-actions/index.ts new file mode 100644 index 0000000000000..6d6a27c4b9cec --- /dev/null +++ b/docs/data/chat/display/message-actions/demos/role-based-message-actions/index.ts @@ -0,0 +1,6 @@ +import { createDemo } from '@mui/internal-core-docs/utils/createDemo'; + +import RoleBasedMessageActions from './RoleBasedMessageActions'; +import ClientProvider from './client'; + +export default createDemo(import.meta.url, RoleBasedMessageActions, { ClientProvider }); diff --git a/docs/data/chat/display/message-actions/message-actions.md b/docs/data/chat/display/message-actions/message-actions.md index afdc27e6c759b..e155ea152413b 100644 --- a/docs/data/chat/display/message-actions/message-actions.md +++ b/docs/data/chat/display/message-actions/message-actions.md @@ -19,7 +19,7 @@ The actions area occupies the `actions` grid area of the message row; the reveal Toggle action buttons, variant, and density to preview the hover-revealed toolbar: -{{"demo": "ChatMessageActionsPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://./demos/chat-message-actions-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Import @@ -82,14 +82,14 @@ There are three ways to customize message actions: - The standalone `ChatMessageActions` component (custom layouts) exposes an `actions` slot whose slot props callback receives the message [owner state](#owner-state). ::: -{{"demo": "BasicMessageActions.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/basic-message-actions/index.ts", "bg": "inline", "collapseToEmpty": true}} ### Accessing message context The component you pass to the `messageActions` slot receives a `messageId` prop. Pass it to the `useMessage()` hook (exported from `@mui/x-chat/headless`) to read the current message and show different actions for user and assistant messages. Reach the runtime actions with [`useChatActions()`](/x/react-chat/core/hooks/)—it returns `sendMessage`, `retry`, `regenerate`, and the rest without subscribing to message state, so the toolbar does not re-render while a response streams: -{{"demo": "RoleBasedMessageActions.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/role-based-message-actions/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Adding actions declaratively @@ -97,7 +97,7 @@ Instead of replacing the `messageActions` slot component, pass a function to `sl The function receives the message context, so you can target specific rows—for example, a working "Regenerate" button on assistant replies. Each action's `onClick` receives `(event, { message, chat })`; call `chat.regenerate(message.id)` to request a fresh reply through the runtime: -{{"demo": "ExtraActionsMessageActions.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://./demos/extra-actions-message-actions/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Owner state diff --git a/docs/data/chat/display/message-appearance/message-appearance.md b/docs/data/chat/display/message-appearance/message-appearance.md index dbc3d9d74b854..7df0bcc5cc98b 100644 --- a/docs/data/chat/display/message-appearance/message-appearance.md +++ b/docs/data/chat/display/message-appearance/message-appearance.md @@ -23,7 +23,7 @@ By default, all consecutive messages from the same author are grouped together, To split groups by time, pass `createTimeWindowGroupKey(windowMs)` (from `@mui/x-chat/headless`; the window defaults to 5 minutes) as the group's `groupKey` through `slotProps.messageGroup`. The demo below uses a 1-minute window: -{{"demo": "../../material/message-list/MessageGrouping.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/message-list/demos/message-grouping/index.ts", "bg": "inline", "collapseToEmpty": true}} By default, a new group starts when: @@ -38,7 +38,7 @@ Dividers are disabled by default—enable them with `features={{ dateDivider: tr The demo below enables the feature and customizes the date format through `slotProps`: -{{"demo": "../../material/message-list/DateDividerFormat.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/message-list/demos/date-divider-format/index.ts", "bg": "inline", "collapseToEmpty": true}} Date dividers render with `role="separator"` and are not focusable; message rows remain individually focusable — see [Accessibility](/x/react-chat/accessibility/) for the focus model. @@ -53,7 +53,7 @@ Avatar resolution follows the same rules as the built-in message primitives: The avatar is omitted entirely (the component returns `null`, no placeholder) in two cases: for every message after the first in a group, and for the first message when no `avatarUrl` resolves and no custom `messageAvatar` slot is provided. -{{"demo": "../../basics/messages/ChatMessageAvatarPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://../../basics/messages/demos/chat-message-avatar-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Timestamps and metadata @@ -64,11 +64,11 @@ Both derive the timestamp from `createdAt` and the edited label from `editedAt`. The default variant renders inline meta inside the bubble: -{{"demo": "../../basics/messages/ChatMessageInlineMetaPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://../../basics/messages/demos/chat-message-inline-meta-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} The compact variant renders external meta beside the message: -{{"demo": "../../basics/messages/ChatMessageMetaPlayground.js", "bg": "inline", "defaultCodeOpen": false}} +{{"component": "file://../../basics/messages/demos/chat-message-meta-playground/index.ts", "bg": "inline", "collapseToEmpty": true}} ## Component anatomy @@ -92,7 +92,7 @@ ChatMessageList ← scrollable container Set `variant="compact"` on `ChatBox` to switch to a dense, messenger-style layout with no bubbles, left-aligned messages, and group header timestamps. In the compact layout the inline meta is replaced by the external `ChatMessageMeta` rendered beside the message (use the `messageMeta` slot to customize it; in the default variant use `messageInlineMeta` instead). -{{"demo": "../../material/message-list/CompactVariant.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/message-list/demos/compact-variant/index.ts", "bg": "inline", "collapseToEmpty": true}} See [Variants and density](/x/react-chat/basics/variants-and-density/) for details. @@ -100,7 +100,7 @@ See [Variants and density](/x/react-chat/basics/variants-and-density/) for detai The `density` prop controls the vertical spacing between messages independently of the variant. Three values are available: `compact`, `standard` (default), and `comfortable`. -{{"demo": "../../material/message-list/DensityProp.js", "defaultCodeOpen": false, "bg": "inline"}} +{{"component": "file://../../material/message-list/demos/density-prop/index.ts", "bg": "inline", "collapseToEmpty": true}} See [Variants and density](/x/react-chat/basics/variants-and-density/) for details. diff --git a/docs/data/chat/display/message-parts/code-blocks/ChatCodeBlockPlayground.js b/docs/data/chat/display/message-parts/code-blocks/ChatCodeBlockPlayground.js deleted file mode 100644 index 7da55bb17cb84..0000000000000 --- a/docs/data/chat/display/message-parts/code-blocks/ChatCodeBlockPlayground.js +++ /dev/null @@ -1,162 +0,0 @@ -import * as React from 'react'; -import Box from '@mui/material/Box'; -import { ChatCodeBlock } from '@mui/x-chat'; -import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard'; -import { - DividerLabel, - SelectControl, - TextControl, -} from 'docs/src/modules/components/chat-playground/controls'; -import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations'; - -const SAMPLES = { - tsx: `import { ChatBox } from '@mui/x-chat'; - -export function MyChat() { - return ; -}`, - bash: `pnpm add @mui/x-chat -pnpm add @mui/material @emotion/react`, - json: `{ - "name": "@mui/x-chat", - "version": "8.0.0", - "main": "./dist/index.js" -}`, - css: `.MuiChatComposer-root { - border-radius: 16px; - box-shadow: var(--mui-shadows-1); -}`, -}; - -// Simple demo "highlighter" — splits on whitespace and shades the tokens. -function tokensHighlighter(code) { - return code.split(/(\s+)/).map((part, i) => { - if (/^\s+$/.test(part)) { - return part; - } - if ( - /^(import|export|function|return|const|let|var|from|class|interface)$/.test( - part, - ) - ) { - return ( - - {part} - - ); - } - if (/^["'`].*/.test(part)) { - return ( - - {part} - - ); - } - if (/^\d+$/.test(part)) { - return ( - - {part} - - ); - } - return part; - }); -} - -const HIGHLIGHTERS = { - none: undefined, - tokens: tokensHighlighter, -}; - -const CLASS_DEFS = [ - { name: 'root', description: 'The outer code block container.' }, - { - name: 'header', - selector: '.MuiChatCodeBlock-header', - description: 'The header row (language label + copy).', - }, - { - name: 'languageLabel', - selector: '.MuiChatCodeBlock-languageLabel', - description: 'The language identifier label.', - }, - { - name: 'copyButton', - selector: '.MuiChatCodeBlock-copyButton', - description: 'The copy button.', - }, - { - name: 'pre', - selector: '.MuiChatCodeBlock-pre', - description: 'The
 wrapper.',
-  },
-  {
-    name: 'code',
-    selector: '.MuiChatCodeBlock-code',
-    description: 'The  element.',
-  },
-];
-
-export default function ChatCodeBlockPlayground() {
-  const [language, setLanguage] = React.useState('tsx');
-  const [code, setCode] = React.useState(SAMPLES.tsx);
-  const [highlighter, setHighlighter] = React.useState('none');
-  const classesCustomizations = useCustomizations(CLASS_DEFS);
-
-  React.useEffect(() => {
-    setCode(SAMPLES[language]);
-  }, [language]);
-
-  const blockSx = classesCustomizations.toClassesSx();
-
-  return (
-    
-          props
-           ({
-              value,
-            }))}
-            onChange={setLanguage}
-          />
-          
-          
-        
-      }
-      preview={
-        
-          
-            {code}
-          
-        
-      }
-    />
-  );
-}
diff --git a/docs/data/chat/display/message-parts/code-blocks/code-blocks.md b/docs/data/chat/display/message-parts/code-blocks/code-blocks.md
index 143eeaf028fa0..49113619acc12 100644
--- a/docs/data/chat/display/message-parts/code-blocks/code-blocks.md
+++ b/docs/data/chat/display/message-parts/code-blocks/code-blocks.md
@@ -18,7 +18,7 @@ components: ChatCodeBlock
 
 The demo below lets you swap languages and content live:
 
-{{"demo": "ChatCodeBlockPlayground.js", "bg": "inline", "defaultCodeOpen": false}}
+{{"component": "file://./demos/chat-code-block-playground/index.ts", "bg": "inline", "collapseToEmpty": true}}
 
 ## Import
 
@@ -39,7 +39,7 @@ def greet(name):
 
 The language specified after the opening backticks (for example, `python`) appears in the header bar, as the demo below shows:
 
-{{"demo": "../../../material/examples/code-block/CodeBlock.js", "defaultCodeOpen": false, "bg": "inline"}}
+{{"component": "file://../../../material/examples/code-block/demos/code-block/index.ts", "bg": "inline", "collapseToEmpty": true}}
 
 ## Standalone usage
 
diff --git a/docs/data/chat/display/message-parts/code-blocks/ChatCodeBlockPlayground.tsx b/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/ChatCodeBlockPlayground.tsx
similarity index 94%
rename from docs/data/chat/display/message-parts/code-blocks/ChatCodeBlockPlayground.tsx
rename to docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/ChatCodeBlockPlayground.tsx
index 8d0c403300d42..5a10ab2cc2138 100644
--- a/docs/data/chat/display/message-parts/code-blocks/ChatCodeBlockPlayground.tsx
+++ b/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/ChatCodeBlockPlayground.tsx
@@ -7,10 +7,8 @@ import {
   SelectControl,
   TextControl,
 } from 'docs/src/modules/components/chat-playground/controls';
-import {
-  useCustomizations,
-  type CustomizationDef,
-} from 'docs/src/modules/components/chat-playground/useCustomizations';
+import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations';
+import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations';
 
 const SAMPLES: Record = {
   tsx: `import { ChatBox } from '@mui/x-chat';
@@ -110,6 +108,7 @@ const CLASS_DEFS: ReadonlyArray> = [
 ];
 
 export default function ChatCodeBlockPlayground() {
+  // @focus-start @padding 1
   const [language, setLanguage] = React.useState('tsx');
   const [code, setCode] = React.useState(SAMPLES.tsx);
   const [highlighter, setHighlighter] = React.useState('none');
@@ -171,4 +170,5 @@ export default function ChatCodeBlockPlayground() {
       }
     />
   );
+  // @focus-end
 }
diff --git a/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/client.ts b/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/index.ts b/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/index.ts
new file mode 100644
index 0000000000000..d432c96686fc7
--- /dev/null
+++ b/docs/data/chat/display/message-parts/code-blocks/demos/chat-code-block-playground/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import ChatCodeBlockPlayground from './ChatCodeBlockPlayground';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, ChatCodeBlockPlayground, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.js b/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.js
deleted file mode 100644
index 66a15da3cd514..0000000000000
--- a/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.js
+++ /dev/null
@@ -1,146 +0,0 @@
-'use client';
-import * as React from 'react';
-import { ChatBox } from '@mui/x-chat';
-
-import {
-  createChunkStream,
-  randomId,
-} from 'docs/data/chat/core/examples/shared/demoUtils';
-
-// Register the payload type for the `data-ticket-status` part. This merges with
-// the docs-wide augmentation, so the `data` field is typed everywhere below.
-
-const STATUS_COLORS = {
-  open: { fg: '#0b5cad', bg: 'rgba(25, 118, 210, 0.12)' },
-  blocked: { fg: '#b3261e', bg: 'rgba(211, 47, 47, 0.12)' },
-  resolved: { fg: '#1b5e20', bg: 'rgba(46, 125, 50, 0.12)' },
-};
-
-const STATUS_CYCLE = ['open', 'blocked', 'resolved'];
-
-function TicketStatusBadge({ ticketId, status, lastUpdated }) {
-  const colors = STATUS_COLORS[status];
-  return (
-    
-      
-        {ticketId} · {status}
-      
-      
-        updated {lastUpdated}
-      
-    
-  );
-}
-
-const partRenderers = {
-  'data-ticket-status': ({ part }) => (
-    
-  ),
-};
-
-const initialMessages = [
-  {
-    id: 'seed-user',
-    role: 'user',
-    status: 'sent',
-    parts: [{ type: 'text', text: "What's the status of ticket T-1042?" }],
-  },
-  {
-    id: 'seed-assistant',
-    role: 'assistant',
-    status: 'sent',
-    parts: [
-      { type: 'text', text: 'Here is the latest status:' },
-      {
-        type: 'data-ticket-status',
-        data: {
-          ticketId: 'T-1042',
-          status: 'blocked',
-          lastUpdated: '2026-06-10',
-        },
-      },
-    ],
-  },
-];
-
-export default function CustomDataPartChat() {
-  const cycleRef = React.useRef(0);
-
-  const adapter = React.useMemo(
-    () => ({
-      async sendMessage() {
-        const messageId = randomId();
-        const textId = `${messageId}-text`;
-        const status = STATUS_CYCLE[cycleRef.current % STATUS_CYCLE.length];
-        cycleRef.current += 1;
-
-        return createChunkStream(
-          [
-            { type: 'start', messageId },
-            { type: 'text-start', id: textId },
-            {
-              type: 'text-delta',
-              id: textId,
-              delta: 'Latest ticket status:',
-            },
-            { type: 'text-end', id: textId },
-            {
-              type: 'data-ticket-status',
-              id: `${messageId}-ticket-status`,
-              data: {
-                ticketId: 'T-1042',
-                status,
-                lastUpdated: new Date().toISOString().slice(0, 10),
-              },
-            },
-            { type: 'finish', messageId, finishReason: 'stop' },
-          ],
-          { delayMs: 120 },
-        );
-      },
-    }),
-    [],
-  );
-
-  return (
-    
-  );
-}
diff --git a/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.tsx.preview b/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.tsx.preview
deleted file mode 100644
index 2bb0c4e4a5492..0000000000000
--- a/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.tsx.preview
+++ /dev/null
@@ -1,11 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/data/chat/display/message-parts/custom-parts/custom-parts.md b/docs/data/chat/display/message-parts/custom-parts/custom-parts.md
index 5234fb270eb8b..a771b90cb481d 100644
--- a/docs/data/chat/display/message-parts/custom-parts/custom-parts.md
+++ b/docs/data/chat/display/message-parts/custom-parts/custom-parts.md
@@ -87,7 +87,7 @@ Custom parts are included in the `ChatMessagePart` union, so they appear in `mes
 
 A renderer is a function that receives the part and returns the JSX to display in its place. The following demo registers a `data-ticket-status` renderer that turns the raw payload into a colored status badge—send a message to see new badges stream in instead of the default JSON fallback.
 
-{{"demo": "CustomDataPartChat.js", "bg": "inline", "defaultCodeOpen": false}}
+{{"component": "file://./demos/custom-data-part-chat/index.ts", "bg": "inline", "collapseToEmpty": true}}
 
 ### With `ChatProvider`
 
diff --git a/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.tsx b/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/CustomDataPartChat.tsx
similarity index 98%
rename from docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.tsx
rename to docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/CustomDataPartChat.tsx
index f30ff63f0a384..343e510997d8c 100644
--- a/docs/data/chat/display/message-parts/custom-parts/CustomDataPartChat.tsx
+++ b/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/CustomDataPartChat.tsx
@@ -115,6 +115,7 @@ const initialMessages: ChatMessage[] = [
 ];
 
 export default function CustomDataPartChat() {
+  // @focus-start @padding 1
   const cycleRef = React.useRef(0);
 
   const adapter = React.useMemo(
@@ -166,4 +167,5 @@ export default function CustomDataPartChat() {
       }}
     />
   );
+  // @focus-end
 }
diff --git a/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/client.ts b/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/index.ts b/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/index.ts
new file mode 100644
index 0000000000000..18b7fd96c268f
--- /dev/null
+++ b/docs/data/chat/display/message-parts/custom-parts/demos/custom-data-part-chat/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import CustomDataPartChat from './CustomDataPartChat';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, CustomDataPartChat, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartCustomizationDemo.js b/docs/data/chat/display/message-parts/files-and-images/ChatFilePartCustomizationDemo.js
deleted file mode 100644
index 65e08bb56b109..0000000000000
--- a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartCustomizationDemo.js
+++ /dev/null
@@ -1,79 +0,0 @@
-'use client';
-import * as React from 'react';
-import Box from '@mui/material/Box';
-import { styled } from '@mui/material/styles';
-import { ChatConversation, ChatMessageList } from '@mui/x-chat';
-import { ChatProvider } from '@mui/x-chat/headless';
-
-import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils';
-
-const adapter = createEchoAdapter();
-
-const LargePreview = styled('img')({
-  width: '100%',
-  maxWidth: 240,
-  borderRadius: 8,
-  display: 'block',
-});
-
-const conversation = {
-  id: 'files-custom-conv',
-  title: 'Files and images',
-  participants: [],
-  readState: 'read',
-  unreadCount: 0,
-  lastMessageAt: '2026-03-15T10:00:00.000Z',
-};
-
-const messages = [
-  {
-    id: 'files-custom-msg-1',
-    conversationId: 'files-custom-conv',
-    role: 'assistant',
-    status: 'sent',
-    createdAt: '2026-03-15T10:00:00.000Z',
-    parts: [
-      { type: 'text', text: 'Here are the requested files:' },
-      {
-        type: 'file',
-        mediaType: 'image/svg+xml',
-        url: '/static/x/chat/quarterly-chart.svg',
-        filename: 'quarterly-chart.svg',
-      },
-      {
-        type: 'file',
-        mediaType: 'text/csv',
-        url: '/static/x/chat/q4-metrics.csv',
-        filename: 'q4-metrics.csv',
-      },
-    ],
-  },
-];
-
-export default function ChatFilePartCustomizationDemo() {
-  return (
-    
-      
-        
-          
-        
-      
-    
-  );
-}
diff --git a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.js b/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.js
deleted file mode 100644
index daa8f5fef602e..0000000000000
--- a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use client';
-import * as React from 'react';
-import Box from '@mui/material/Box';
-import { ChatConversation, ChatMessageList } from '@mui/x-chat';
-import { ChatProvider } from '@mui/x-chat/headless';
-
-import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils';
-
-const adapter = createEchoAdapter();
-
-const conversation = {
-  id: 'files-conv',
-  title: 'Files and images',
-  participants: [],
-  readState: 'read',
-  unreadCount: 0,
-  lastMessageAt: '2026-03-15T10:00:00.000Z',
-};
-
-const messages = [
-  {
-    id: 'files-msg-1',
-    conversationId: 'files-conv',
-    role: 'assistant',
-    status: 'sent',
-    createdAt: '2026-03-15T10:00:00.000Z',
-    parts: [
-      { type: 'text', text: 'Here are the requested files:' },
-      {
-        type: 'file',
-        mediaType: 'image/svg+xml',
-        url: '/static/x/chat/quarterly-chart.svg',
-        filename: 'quarterly-chart.svg',
-      },
-      {
-        type: 'file',
-        mediaType: 'text/csv',
-        url: '/static/x/chat/q4-metrics.csv',
-        filename: 'q4-metrics.csv',
-      },
-    ],
-  },
-];
-
-export default function ChatFilePartsDemo() {
-  return (
-    
-      
-        
-          
-        
-      
-    
-  );
-}
diff --git a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.tsx.preview b/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.tsx.preview
deleted file mode 100644
index 0d25ec5c3ff8e..0000000000000
--- a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.tsx.preview
+++ /dev/null
@@ -1,12 +0,0 @@
-
-  
-    
-      
-    
-  
-
\ No newline at end of file
diff --git a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartCustomizationDemo.tsx b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/ChatFilePartCustomizationDemo.tsx
similarity index 97%
rename from docs/data/chat/display/message-parts/files-and-images/ChatFilePartCustomizationDemo.tsx
rename to docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/ChatFilePartCustomizationDemo.tsx
index 28eea98471e23..c0d2c090a31b9 100644
--- a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartCustomizationDemo.tsx
+++ b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/ChatFilePartCustomizationDemo.tsx
@@ -55,6 +55,7 @@ const messages: ChatMessage[] = [
 
 export default function ChatFilePartCustomizationDemo() {
   return (
+    // @focus-start @padding 2
     
       
     
+    // @focus-end
   );
 }
diff --git a/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/client.ts b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/index.ts b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/index.ts
new file mode 100644
index 0000000000000..5c5a9fdc1d17a
--- /dev/null
+++ b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-part-customization-demo/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import ChatFilePartCustomizationDemo from './ChatFilePartCustomizationDemo';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, ChatFilePartCustomizationDemo, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.tsx b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/ChatFilePartsDemo.tsx
similarity index 97%
rename from docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.tsx
rename to docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/ChatFilePartsDemo.tsx
index 380e54f8e3d69..ad6b9b25652e1 100644
--- a/docs/data/chat/display/message-parts/files-and-images/ChatFilePartsDemo.tsx
+++ b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/ChatFilePartsDemo.tsx
@@ -47,6 +47,7 @@ const messages: ChatMessage[] = [
 
 export default function ChatFilePartsDemo() {
   return (
+    // @focus-start @padding 2
     
       
     
+    // @focus-end
   );
 }
diff --git a/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/client.ts b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/index.ts b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/index.ts
new file mode 100644
index 0000000000000..638b9f35afcc8
--- /dev/null
+++ b/docs/data/chat/display/message-parts/files-and-images/demos/chat-file-parts-demo/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import ChatFilePartsDemo from './ChatFilePartsDemo';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, ChatFilePartsDemo, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/files-and-images/files-and-images.md b/docs/data/chat/display/message-parts/files-and-images/files-and-images.md
index 1878d9c54b40d..8b0dcb5e8dae6 100644
--- a/docs/data/chat/display/message-parts/files-and-images/files-and-images.md
+++ b/docs/data/chat/display/message-parts/files-and-images/files-and-images.md
@@ -21,7 +21,7 @@ See [Attachments](/x/react-chat/behavior/attachments/) for the upload flow.
 
 The demo below shows a message containing an image part and a document part:
 
-{{"demo": "ChatFilePartsDemo.js", "bg": "inline", "defaultCodeOpen": false}}
+{{"component": "file://./demos/chat-file-parts-demo/index.ts", "bg": "inline", "collapseToEmpty": true}}
 
 ## File part structure
 
@@ -124,7 +124,7 @@ Override file part rendering through `slotProps.messageContent.partProps.file`:
 
 The demo below replaces the default chip with a card-style preview:
 
-{{"demo": "ChatFilePartCustomizationDemo.js", "bg": "inline", "defaultCodeOpen": false}}
+{{"component": "file://./demos/chat-file-part-customization-demo/index.ts", "bg": "inline", "collapseToEmpty": true}}
 
 ## Streaming
 
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/ChatMessageSourcesPlayground.js b/docs/data/chat/display/message-parts/sources-and-citations/ChatMessageSourcesPlayground.js
deleted file mode 100644
index 5110e3ef410ec..0000000000000
--- a/docs/data/chat/display/message-parts/sources-and-citations/ChatMessageSourcesPlayground.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import * as React from 'react';
-import { ChatMessageSource, ChatMessageSources } from '@mui/x-chat';
-import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard';
-import {
-  DividerLabel,
-  NumberControl,
-  TextControl,
-} from 'docs/src/modules/components/chat-playground/controls';
-import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations';
-
-const POOL = [
-  { href: 'https://mui.com/x/react-chat/', title: 'MUI X Chat overview' },
-  {
-    href: 'https://mui.com/material-ui/customization/theming/',
-    title: 'Material UI theming',
-  },
-  { href: 'https://mui.com/x/api/chat/chat-box/', title: 'ChatBox API' },
-  { href: 'https://mui.com/x/react-chat/material/', title: 'Material adapter' },
-  { href: 'https://mui.com/system/styled/', title: 'styled() utility' },
-];
-
-const CLASS_DEFS = [
-  { name: 'root', description: 'The sources container.' },
-  {
-    name: 'label',
-    selector: '.MuiChatMessageSources-label',
-    description: 'The "Sources" label above the list.',
-  },
-  {
-    name: 'list',
-    selector: '.MuiChatMessageSources-list',
-    description: 'The ordered list element.',
-  },
-];
-
-export default function ChatMessageSourcesPlayground() {
-  const [count, setCount] = React.useState(3);
-  const [label, setLabel] = React.useState('Sources');
-  const classesCustomizations = useCustomizations(CLASS_DEFS);
-
-  const rootSx = classesCustomizations.toClassesSx();
-
-  return (
-    
-          props
-          
-          fixture data
-          
-        
-      }
-      preview={
-        
-          {POOL.slice(0, count).map((source, i) => (
-            
-          ))}
-        
-      }
-    />
-  );
-}
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/SourcePartsDemo.js b/docs/data/chat/display/message-parts/sources-and-citations/SourcePartsDemo.js
deleted file mode 100644
index 1251e33e261da..0000000000000
--- a/docs/data/chat/display/message-parts/sources-and-citations/SourcePartsDemo.js
+++ /dev/null
@@ -1,76 +0,0 @@
-'use client';
-import * as React from 'react';
-import Box from '@mui/material/Box';
-import { ChatConversation, ChatMessageList } from '@mui/x-chat';
-import { ChatProvider } from '@mui/x-chat/headless';
-
-import { createEchoAdapter } from 'docs/data/chat/core/examples/shared/demoUtils';
-
-const adapter = createEchoAdapter();
-
-const conversation = {
-  id: 'sources-demo',
-  title: 'Sources and citations',
-  participants: [],
-  readState: 'read',
-  unreadCount: 0,
-  lastMessageAt: '2026-03-15T10:00:00.000Z',
-};
-
-const messages = [
-  {
-    id: 'msg-1',
-    conversationId: conversation.id,
-    role: 'user',
-    status: 'sent',
-    createdAt: '2026-03-15T09:59:00.000Z',
-    parts: [{ type: 'text', text: 'How do I override the source link styles?' }],
-  },
-  {
-    id: 'msg-2',
-    conversationId: conversation.id,
-    role: 'assistant',
-    status: 'sent',
-    createdAt: '2026-03-15T10:00:00.000Z',
-    parts: [
-      {
-        type: 'text',
-        text: 'According to the documentation [1], use the partProps slot overrides. The theming guide covers the resolution order:',
-      },
-      {
-        type: 'source-url',
-        sourceId: 'src-1',
-        url: 'https://mui.com/x/react-chat/',
-        title: 'MUI X Chat documentation',
-      },
-      {
-        type: 'source-document',
-        sourceId: 'src-2',
-        title: 'Theming guide — slot overrides',
-        text: 'Slots are resolved in order: theme defaults first, then component-level props.',
-      },
-    ],
-  },
-];
-
-export default function SourcePartsDemo() {
-  return (
-    
-      
-        
-          
-        
-      
-    
-  );
-}
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/ChatMessageSourcesPlayground.tsx b/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/ChatMessageSourcesPlayground.tsx
similarity index 91%
rename from docs/data/chat/display/message-parts/sources-and-citations/ChatMessageSourcesPlayground.tsx
rename to docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/ChatMessageSourcesPlayground.tsx
index 9cac7c8c53fde..18af999a627fa 100644
--- a/docs/data/chat/display/message-parts/sources-and-citations/ChatMessageSourcesPlayground.tsx
+++ b/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/ChatMessageSourcesPlayground.tsx
@@ -6,10 +6,8 @@ import {
   NumberControl,
   TextControl,
 } from 'docs/src/modules/components/chat-playground/controls';
-import {
-  useCustomizations,
-  type CustomizationDef,
-} from 'docs/src/modules/components/chat-playground/useCustomizations';
+import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations';
+import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations';
 
 const POOL = [
   { href: 'https://mui.com/x/react-chat/', title: 'MUI X Chat overview' },
@@ -39,6 +37,7 @@ const CLASS_DEFS: ReadonlyArray> = [
 ];
 
 export default function ChatMessageSourcesPlayground() {
+  // @focus-start @padding 1
   const [count, setCount] = React.useState(3);
   const [label, setLabel] = React.useState('Sources');
   const classesCustomizations = useCustomizations(CLASS_DEFS);
@@ -80,4 +79,5 @@ export default function ChatMessageSourcesPlayground() {
       }
     />
   );
+  // @focus-end
 }
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/client.ts b/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/index.ts b/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/index.ts
new file mode 100644
index 0000000000000..9b55ff2ca7f5f
--- /dev/null
+++ b/docs/data/chat/display/message-parts/sources-and-citations/demos/chat-message-sources-playground/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import ChatMessageSourcesPlayground from './ChatMessageSourcesPlayground';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, ChatMessageSourcesPlayground, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/SourcePartsDemo.tsx b/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/SourcePartsDemo.tsx
similarity index 97%
rename from docs/data/chat/display/message-parts/sources-and-citations/SourcePartsDemo.tsx
rename to docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/SourcePartsDemo.tsx
index 546f52a2702d1..d5195b03d5d8a 100644
--- a/docs/data/chat/display/message-parts/sources-and-citations/SourcePartsDemo.tsx
+++ b/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/SourcePartsDemo.tsx
@@ -58,6 +58,7 @@ const messages: ChatMessage[] = [
 
 export default function SourcePartsDemo() {
   return (
+    // @focus-start @padding 2
     
       
     
+    // @focus-end
   );
 }
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/client.ts b/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/index.ts b/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/index.ts
new file mode 100644
index 0000000000000..62d4dce0ffd7b
--- /dev/null
+++ b/docs/data/chat/display/message-parts/sources-and-citations/demos/source-parts-demo/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import SourcePartsDemo from './SourcePartsDemo';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, SourcePartsDemo, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/sources-and-citations/sources-and-citations.md b/docs/data/chat/display/message-parts/sources-and-citations/sources-and-citations.md
index c529b26792103..3d46736279234 100644
--- a/docs/data/chat/display/message-parts/sources-and-citations/sources-and-citations.md
+++ b/docs/data/chat/display/message-parts/sources-and-citations/sources-and-citations.md
@@ -19,7 +19,7 @@ Two part types cover the common citation patterns: URL references and document e
 
 The demo below seeds an assistant message containing a `source-url` and a `source-document` part. Both are rendered automatically by the built-in part renderers:
 
-{{"demo": "SourcePartsDemo.js", "bg": "inline", "defaultCodeOpen": false}}
+{{"component": "file://./demos/source-parts-demo/index.ts", "bg": "inline", "collapseToEmpty": true}}
 
 ## Source URL parts
 
@@ -190,7 +190,7 @@ Source parts render inline where they appear in the message. To present a consol
 
 `ChatMessageSources` renders an ordered list (`ol`/`li`), so assistive technology announces the citation count and position.
 
-{{"demo": "ChatMessageSourcesPlayground.js", "bg": "inline", "defaultCodeOpen": false}}
+{{"component": "file://./demos/chat-message-sources-playground/index.ts", "bg": "inline", "collapseToEmpty": true}}
 
 ## See also
 
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/MarkdownPlayground.js b/docs/data/chat/display/message-parts/text-and-markdown/MarkdownPlayground.js
deleted file mode 100644
index 5374e5e1cac42..0000000000000
--- a/docs/data/chat/display/message-parts/text-and-markdown/MarkdownPlayground.js
+++ /dev/null
@@ -1,93 +0,0 @@
-'use client';
-import * as React from 'react';
-import Box from '@mui/material/Box';
-import Stack from '@mui/material/Stack';
-import TextField from '@mui/material/TextField';
-import Typography from '@mui/material/Typography';
-import { ChatConversation, ChatMessageList } from '@mui/x-chat';
-
-import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders';
-
-const MARKDOWN_SAMPLE = `### Markdown rendering
-
-The built-in renderer turns model output into **bold**, _italic_, and \`inline code\`.
-
-- First item
-- Second item with a [link](https://mui.com)
-- Third item
-
-\`\`\`ts
-const greeting: string = 'Hello, markdown!';
-console.log(greeting);
-\`\`\`
-
-Footnotes are supported too.[^1]
-
-Raw HTML stays escaped text.
-
-[^1]: This is the footnote definition.
-`;
-
-const conversation = {
-  id: 'markdown-playground',
-  title: 'Markdown playground',
-  participants: [],
-};
-
-export default function MarkdownPlayground() {
-  const [source, setSource] = React.useState(MARKDOWN_SAMPLE);
-
-  // The assistant message is re-seeded whenever the textarea changes; ScopedChat
-  // remounts the provider on seed-key change so the bubble re-renders live.
-  const messages = React.useMemo(
-    () => [
-      {
-        id: 'markdown-playground-msg',
-        conversationId: conversation.id,
-        role: 'assistant',
-        status: 'sent',
-        createdAt: '2026-03-15T10:00:00.000Z',
-        parts: [{ type: 'text', text: source }],
-      },
-    ],
-    [source],
-  );
-
-  return (
-    
-      
-        Markdown source
-         setSource(event.target.value)}
-          multiline
-          minRows={14}
-          fullWidth
-          slotProps={{ input: { sx: { fontFamily: 'monospace', fontSize: 13 } } }}
-        />
-      
-      
-        Rendered message
-        
-          
-            
-              
-            
-          
-        
-      
-    
-  );
-}
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.js b/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.js
deleted file mode 100644
index 65e8b4bffe183..0000000000000
--- a/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.js
+++ /dev/null
@@ -1,70 +0,0 @@
-'use client';
-import * as React from 'react';
-import { ChatBox } from '@mui/x-chat';
-
-import {
-  createChunkStream,
-  createTextResponseChunks,
-  randomId,
-} from 'docs/data/chat/core/examples/shared/demoUtils';
-
-// A markdown-rich answer whose bold span and fenced code block are deliberately
-// long enough that mid-stream chunks split inside `**…**` and inside the fence —
-// so you can watch the built-in streaming repair render them cleanly instead of
-// flashing raw `**` or an unclosed code fence.
-const MARKDOWN_REPLY = `**Here is what I found** for your request:
-
-1. Markdown streams in token by token.
-2. Partial **bold** and code fences are repaired mid-stream.
-3. The bubble never leaks raw \`**\` markers.
-
-\`\`\`ts
-function greet(name: string): string {
-  return \`Hello, \${name}!\`;
-}
-\`\`\`
-`;
-
-const conversation = {
-  id: 'streaming-markdown',
-  title: 'Streaming markdown',
-  participants: [],
-};
-
-const messages = [
-  {
-    id: 'streaming-markdown-welcome',
-    conversationId: conversation.id,
-    role: 'assistant',
-    status: 'sent',
-    createdAt: '2026-03-15T10:00:00.000Z',
-    parts: [
-      { type: 'text', text: 'Send anything — I reply with streaming markdown.' },
-    ],
-  },
-];
-
-const streamingAdapter = {
-  async sendMessage() {
-    return createChunkStream(createTextResponseChunks(randomId(), MARKDOWN_REPLY), {
-      delayMs: 60,
-    });
-  },
-};
-
-export default function StreamingMarkdown() {
-  return (
-    
-  );
-}
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.tsx.preview b/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.tsx.preview
deleted file mode 100644
index 6a63e37967041..0000000000000
--- a/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.tsx.preview
+++ /dev/null
@@ -1,12 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/MarkdownPlayground.tsx b/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/MarkdownPlayground.tsx
similarity index 98%
rename from docs/data/chat/display/message-parts/text-and-markdown/MarkdownPlayground.tsx
rename to docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/MarkdownPlayground.tsx
index a8ce2a5a82177..ad41c73e5960b 100644
--- a/docs/data/chat/display/message-parts/text-and-markdown/MarkdownPlayground.tsx
+++ b/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/MarkdownPlayground.tsx
@@ -38,6 +38,7 @@ const conversation: ChatConversationType = {
 };
 
 export default function MarkdownPlayground() {
+  // @focus-start @padding 1
   const [source, setSource] = React.useState(MARKDOWN_SAMPLE);
 
   // The assistant message is re-seeded whenever the textarea changes; ScopedChat
@@ -93,4 +94,5 @@ export default function MarkdownPlayground() {
       
     
   );
+  // @focus-end
 }
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/client.ts b/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/index.ts b/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/index.ts
new file mode 100644
index 0000000000000..bb1970f817acc
--- /dev/null
+++ b/docs/data/chat/display/message-parts/text-and-markdown/demos/markdown-playground/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import MarkdownPlayground from './MarkdownPlayground';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, MarkdownPlayground, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.tsx b/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/StreamingMarkdown.tsx
similarity index 97%
rename from docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.tsx
rename to docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/StreamingMarkdown.tsx
index d52cf23102ab2..a285ee2d02b46 100644
--- a/docs/data/chat/display/message-parts/text-and-markdown/StreamingMarkdown.tsx
+++ b/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/StreamingMarkdown.tsx
@@ -58,6 +58,7 @@ const streamingAdapter: ChatAdapter = {
 
 export default function StreamingMarkdown() {
   return (
+    // @focus-start @padding 2
     
+    // @focus-end
   );
 }
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/client.ts b/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/index.ts b/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/index.ts
new file mode 100644
index 0000000000000..2208c5b0343d6
--- /dev/null
+++ b/docs/data/chat/display/message-parts/text-and-markdown/demos/streaming-markdown/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import StreamingMarkdown from './StreamingMarkdown';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, StreamingMarkdown, { ClientProvider });
diff --git a/docs/data/chat/display/message-parts/text-and-markdown/text-and-markdown.md b/docs/data/chat/display/message-parts/text-and-markdown/text-and-markdown.md
index 72889937f777e..49f1e4f2698d3 100644
--- a/docs/data/chat/display/message-parts/text-and-markdown/text-and-markdown.md
+++ b/docs/data/chat/display/message-parts/text-and-markdown/text-and-markdown.md
@@ -75,7 +75,7 @@ The built-in parser supports:
 This keeps untrusted model output XSS-safe by construction.
 :::
 
-{{"demo": "MarkdownPlayground.js"}}
+{{"component": "file://./demos/markdown-playground/index.ts"}}
 
 ### Customizing text rendering
 
@@ -121,7 +121,7 @@ Once the `text-end` chunk arrives, `state` transitions to `'done'`, as shown bel
 { type: 'text', text: 'The answer is 42.', state: 'done' }
 ```
 
-{{"demo": "StreamingMarkdown.js"}}
+{{"component": "file://./demos/streaming-markdown/index.ts"}}
 
 When composing a fully custom message renderer (for example with the headless package), use the part's `state` field to show a typing indicator or pulsing cursor while content is arriving:
 
diff --git a/docs/data/chat/display/unread-marker/ChatUnreadMarkerPlayground.js b/docs/data/chat/display/unread-marker/ChatUnreadMarkerPlayground.js
deleted file mode 100644
index d7a9f9465e8a9..0000000000000
--- a/docs/data/chat/display/unread-marker/ChatUnreadMarkerPlayground.js
+++ /dev/null
@@ -1,122 +0,0 @@
-import * as React from 'react';
-import Box from '@mui/material/Box';
-import { ChatUnreadMarker } from '@mui/x-chat';
-
-import { PlaygroundCard } from 'docs/src/modules/components/chat-playground/PlaygroundCard';
-import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders';
-import { MessageBubble } from 'docs/src/modules/components/chat-playground/MessageBubble';
-import {
-  DividerLabel,
-  NumberControl,
-  TextControl,
-} from 'docs/src/modules/components/chat-playground/controls';
-import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations';
-import { users } from 'docs/src/modules/components/chat-playground/data';
-
-const CONVERSATION_ID = 'unread-playground';
-
-function buildMessages(count) {
-  const base = Date.UTC(2026, 4, 3, 8, 30, 0);
-  return Array.from({ length: count }, (_, i) => ({
-    id: `unread-msg-${i}`,
-    conversationId: CONVERSATION_ID,
-    role: 'assistant',
-    author: users.assistant,
-    createdAt: new Date(base + i * 60_000).toISOString(),
-    status: i < Math.floor(count / 2) ? 'read' : 'sent',
-    parts: [{ type: 'text', text: `Message ${i + 1}` }],
-  }));
-}
-
-const CLASS_DEFS = [
-  { name: 'root', description: 'The unread marker row.' },
-  {
-    name: 'label',
-    selector: '.MuiChatUnreadMarker-label',
-    description: 'The "New messages" label inside the divider.',
-  },
-];
-
-export default function ChatUnreadMarkerPlayground() {
-  const [count, setCount] = React.useState(4);
-  const [boundary, setBoundary] = React.useState(2);
-  const [label, setLabel] = React.useState('');
-  const classesCustomizations = useCustomizations(CLASS_DEFS);
-  const messages = React.useMemo(() => buildMessages(count), [count]);
-  const safeBoundary = Math.min(boundary, count - 1);
-
-  // The headless UnreadMarker derives its boundary from the conversation's
-  // `unreadCount` (boundary = messageCount - unreadCount). Keep it in sync with
-  // the slider so the marker renders at the selected index for any message count.
-  const conversation = React.useMemo(
-    () => ({
-      id: CONVERSATION_ID,
-      title: 'Unread thread',
-      participants: [users.me, users.assistant],
-      unreadCount: count - safeBoundary,
-      readState: 'unread',
-    }),
-    [count, safeBoundary],
-  );
-
-  const markerSx = classesCustomizations.toClassesSx();
-
-  return (
-    
-          fixture (thread shape)
-          
-          
-          props
-          
-        
-      }
-      preview={
-        
-          
-            {messages.map((message, i) => (
-              
-                {i === safeBoundary ? (
-                  
-                ) : null}
-                
-              
-            ))}
-          
-        
-      }
-    />
-  );
-}
diff --git a/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.js b/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.js
deleted file mode 100644
index 1fe7d6b0ef87d..0000000000000
--- a/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import * as React from 'react';
-import Box from '@mui/material/Box';
-import { ChatUnreadMarker } from '@mui/x-chat';
-
-import { ScopedChat } from 'docs/src/modules/components/chat-playground/sharedProviders';
-import { MessageBubble } from 'docs/src/modules/components/chat-playground/MessageBubble';
-import { users } from 'docs/src/modules/components/chat-playground/data';
-
-const CONVERSATION_ID = 'standalone-thread';
-
-const conversation = {
-  id: CONVERSATION_ID,
-  title: 'Standalone thread',
-  participants: [users.me, users.assistant],
-  unreadCount: 2,
-  readState: 'unread',
-};
-
-const base = Date.UTC(2026, 4, 3, 8, 30, 0);
-
-const messages = Array.from({ length: 5 }, (_, i) => ({
-  id: `standalone-msg-${i}`,
-  conversationId: CONVERSATION_ID,
-  role: i % 2 === 0 ? 'assistant' : 'user',
-  author: i % 2 === 0 ? users.assistant : users.me,
-  createdAt: new Date(base + i * 60_000).toISOString(),
-  parts: [{ type: 'text', text: `Message ${i + 1}` }],
-}));
-
-export default function UnreadMarkerStandalone() {
-  return (
-    
-      
-        {messages.map((message) => (
-          
-            
-            
-          
-        ))}
-      
-    
-  );
-}
diff --git a/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.tsx.preview b/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.tsx.preview
deleted file mode 100644
index 190a772691521..0000000000000
--- a/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.tsx.preview
+++ /dev/null
@@ -1,14 +0,0 @@
-
-  
-    {messages.map((message) => (
-      
-        
-        
-      
-    ))}
-  
-
\ No newline at end of file
diff --git a/docs/data/chat/display/unread-marker/ChatUnreadMarkerPlayground.tsx b/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/ChatUnreadMarkerPlayground.tsx
similarity index 94%
rename from docs/data/chat/display/unread-marker/ChatUnreadMarkerPlayground.tsx
rename to docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/ChatUnreadMarkerPlayground.tsx
index 1e08213670b0f..3584c09887eaf 100644
--- a/docs/data/chat/display/unread-marker/ChatUnreadMarkerPlayground.tsx
+++ b/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/ChatUnreadMarkerPlayground.tsx
@@ -10,10 +10,8 @@ import {
   NumberControl,
   TextControl,
 } from 'docs/src/modules/components/chat-playground/controls';
-import {
-  useCustomizations,
-  type CustomizationDef,
-} from 'docs/src/modules/components/chat-playground/useCustomizations';
+import { useCustomizations } from 'docs/src/modules/components/chat-playground/useCustomizations';
+import type { CustomizationDef } from 'docs/src/modules/components/chat-playground/useCustomizations';
 import { users } from 'docs/src/modules/components/chat-playground/data';
 
 const CONVERSATION_ID = 'unread-playground';
@@ -43,6 +41,7 @@ const CLASS_DEFS: ReadonlyArray> = [
 ];
 
 export default function ChatUnreadMarkerPlayground() {
+  // @focus-start @padding 1
   const [count, setCount] = React.useState(4);
   const [boundary, setBoundary] = React.useState(2);
   const [label, setLabel] = React.useState('');
@@ -124,4 +123,5 @@ export default function ChatUnreadMarkerPlayground() {
       }
     />
   );
+  // @focus-end
 }
diff --git a/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/client.ts b/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/index.ts b/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/index.ts
new file mode 100644
index 0000000000000..1a6b1beb7f402
--- /dev/null
+++ b/docs/data/chat/display/unread-marker/demos/chat-unread-marker-playground/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import ChatUnreadMarkerPlayground from './ChatUnreadMarkerPlayground';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, ChatUnreadMarkerPlayground, { ClientProvider });
diff --git a/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.tsx b/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/UnreadMarkerStandalone.tsx
similarity index 97%
rename from docs/data/chat/display/unread-marker/UnreadMarkerStandalone.tsx
rename to docs/data/chat/display/unread-marker/demos/unread-marker-standalone/UnreadMarkerStandalone.tsx
index 0eb909464b39a..41fed626a3a30 100644
--- a/docs/data/chat/display/unread-marker/UnreadMarkerStandalone.tsx
+++ b/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/UnreadMarkerStandalone.tsx
@@ -29,6 +29,7 @@ const messages: ChatMessage[] = Array.from({ length: 5 }, (_, i) => ({
 
 export default function UnreadMarkerStandalone() {
   return (
+    // @focus-start @padding 2
     
     
+    // @focus-end
   );
 }
diff --git a/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/client.ts b/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/client.ts
new file mode 100644
index 0000000000000..c874a2038b3ef
--- /dev/null
+++ b/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/client.ts
@@ -0,0 +1,7 @@
+'use client';
+
+import { createDemoClient } from '@mui/internal-core-docs/utils/createDemoClient';
+
+const ClientProvider = createDemoClient(import.meta.url);
+
+export default ClientProvider;
diff --git a/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/index.ts b/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/index.ts
new file mode 100644
index 0000000000000..39ff70ef1932a
--- /dev/null
+++ b/docs/data/chat/display/unread-marker/demos/unread-marker-standalone/index.ts
@@ -0,0 +1,6 @@
+import { createDemo } from '@mui/internal-core-docs/utils/createDemo';
+
+import UnreadMarkerStandalone from './UnreadMarkerStandalone';
+import ClientProvider from './client';
+
+export default createDemo(import.meta.url, UnreadMarkerStandalone, { ClientProvider });
diff --git a/docs/data/chat/display/unread-marker/unread-marker.md b/docs/data/chat/display/unread-marker/unread-marker.md
index c6d76fcd479f3..9b3f63d3284b9 100644
--- a/docs/data/chat/display/unread-marker/unread-marker.md
+++ b/docs/data/chat/display/unread-marker/unread-marker.md
@@ -53,7 +53,7 @@ Render it once per message and pass the required `messageId` prop — the compon
 When you pass a custom `renderItem` to `ChatMessageList`, the `features` prop is ignored — including `features.unreadMarker`. Embed `ChatUnreadMarker` inside your `renderItem` as shown below to keep the marker.
 :::
 
-{{"demo": "UnreadMarkerStandalone.js", "bg": "inline"}}
+{{"component": "file://./demos/unread-marker-standalone/index.ts", "bg": "inline"}}
 
 ## Accessibility
 
@@ -67,4 +67,4 @@ For the full keyboard navigation and screen-reader model of the message list, se
 
 The demo below shows the unread marker rendering above the first unread message:
 
-{{"demo": "ChatUnreadMarkerPlayground.js", "bg": "inline", "defaultCodeOpen": false}}
+{{"component": "file://./demos/chat-unread-marker-playground/index.ts", "bg": "inline", "collapseToEmpty": true}}
diff --git a/docs/data/chat/headless/composer/composer.md b/docs/data/chat/headless/composer/composer.md
index 51c399fb38b5a..98ee022f4429f 100644
--- a/docs/data/chat/headless/composer/composer.md
+++ b/docs/data/chat/headless/composer/composer.md
@@ -12,7 +12,7 @@ githubLabel: 'scope: chat'
 
 {{"component": "@mui/internal-core-docs/ComponentLinkHeader"}}
 
-{{"demo": "../examples/composer-with-attachments/ComposerWithAttachments.js", "hideToolbar": true}}
+{{"component": "file://../examples/composer-with-attachments/demos/composer-with-attachments/index.ts", "hideToolbar": true}}
 
 ## Composer primitives
 
diff --git a/docs/data/chat/headless/composition/composition.md b/docs/data/chat/headless/composition/composition.md
index 2b6f8ad56ae10..8b2d2e13ee878 100644
--- a/docs/data/chat/headless/composition/composition.md
+++ b/docs/data/chat/headless/composition/composition.md
@@ -14,7 +14,7 @@ githubLabel: 'scope: chat'
 
 The demo below shows a minimal unstyled chat shell composed from the headless primitives:
 
-{{"demo": "../examples/minimal-shell/MinimalUnstyledShell.js", "hideToolbar": true}}
+{{"component": "file://../examples/minimal-shell/demos/minimal-unstyled-shell/index.ts", "hideToolbar": true}}
 
 The canonical headless shell combines a provider-backed root, pane layout, conversation rail, thread view, message list, and composer:
 
diff --git a/docs/data/chat/headless/conversation-list/conversation-list.md b/docs/data/chat/headless/conversation-list/conversation-list.md
index e9a15341ff9ec..3b86bacf0506c 100644
--- a/docs/data/chat/headless/conversation-list/conversation-list.md
+++ b/docs/data/chat/headless/conversation-list/conversation-list.md
@@ -12,7 +12,7 @@ githubLabel: 'scope: chat'
 
 {{"component": "@mui/internal-core-docs/ComponentLinkHeader"}}
 
-{{"demo": "../examples/two-pane-inbox/TwoPaneInbox.js", "hideToolbar": true}}
+{{"component": "file://../examples/two-pane-inbox/demos/two-pane-inbox/index.ts", "hideToolbar": true}}
 
 ## Conversation list primitives
 
diff --git a/docs/data/chat/headless/customization/customization.md b/docs/data/chat/headless/customization/customization.md
index 420ff964560d4..74327e55debfd 100644
--- a/docs/data/chat/headless/customization/customization.md
+++ b/docs/data/chat/headless/customization/customization.md
@@ -11,7 +11,7 @@ githubLabel: 'scope: chat'
 
 The demo below replaces multiple headless slots in a single surface:
 
-{{"demo": "../examples/slot-customization/SlotCustomization.js", "hideToolbar": true}}
+{{"component": "file://../examples/slot-customization/demos/slot-customization/index.ts", "hideToolbar": true}}
 
 ## Customization model
 
diff --git a/docs/data/chat/headless/examples/chatgpt-style/ChatGptStyleChat.js b/docs/data/chat/headless/examples/chatgpt-style/ChatGptStyleChat.js
deleted file mode 100644
index 40438949f1319..0000000000000
--- a/docs/data/chat/headless/examples/chatgpt-style/ChatGptStyleChat.js
+++ /dev/null
@@ -1,1141 +0,0 @@
-import * as React from 'react';
-import ArchiveOutlinedIcon from '@mui/icons-material/ArchiveOutlined';
-import ArrowUpwardRoundedIcon from '@mui/icons-material/ArrowUpwardRounded';
-import AutoAwesomeOutlinedIcon from '@mui/icons-material/AutoAwesomeOutlined';
-import CheckRoundedIcon from '@mui/icons-material/CheckRounded';
-import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined';
-import DriveFileRenameOutlineOutlinedIcon from '@mui/icons-material/DriveFileRenameOutlineOutlined';
-import IosShareIcon from '@mui/icons-material/IosShare';
-import ManageSearchRoundedIcon from '@mui/icons-material/ManageSearchRounded';
-import MicNoneRoundedIcon from '@mui/icons-material/MicNoneRounded';
-import MoreHorizRoundedIcon from '@mui/icons-material/MoreHorizRounded';
-import PushPinOutlinedIcon from '@mui/icons-material/PushPinOutlined';
-import {
-  Chat,
-  Conversation,
-  Composer,
-  ConversationList,
-  Message,
-  MessageGroup,
-  MessageList,
-} from '@mui/x-chat/headless';
-
-import {
-  createEchoAdapter,
-  cloneConversations,
-  cloneMessages,
-  syncConversationPreview,
-} from 'docs/data/chat/headless/examples/shared/demoUtils';
-
-// ---------------------------------------------------------------------------
-// ChatGPT-style brand tokens
-// ---------------------------------------------------------------------------
-const gpt = {
-  bg: '#212121',
-  sidebar: '#171717',
-  sidebarHover: '#2f2f2f',
-  sidebarSelected: '#2f2f2f',
-  surface: '#212121',
-  text: '#ececec',
-  textSecondary: '#b4b4b4',
-  textMuted: '#8e8e8e',
-  border: '#2f2f2f',
-  composerBg: '#2f2f2f',
-  composerBorder: '#424242',
-  accent: '#10a37f',
-  userBubble: '#2f2f2f',
-  unreadDot: '#3b82f6',
-};
-
-// ---------------------------------------------------------------------------
-// Demo data
-// ---------------------------------------------------------------------------
-const assistant = {
-  id: 'chatgpt',
-  displayName: 'ChatGPT',
-  avatarUrl: undefined,
-};
-
-const you = {
-  id: 'you',
-  displayName: 'You',
-  avatarUrl: undefined,
-};
-
-const conversations = [
-  {
-    id: 'historical',
-    title: 'Fascinating Historical Figure',
-    subtitle: 'Tell me about a fascinating historical figure',
-    participants: [you, assistant],
-    readState: 'read',
-    unreadCount: 0,
-    lastMessageAt: '2026-03-15T14:00:00.000Z',
-  },
-  {
-    id: 'cooking',
-    title: 'Quick Pasta Recipe',
-    subtitle: 'What is a quick pasta recipe?',
-    participants: [you, assistant],
-    readState: 'unread',
-    unreadCount: 1,
-    lastMessageAt: '2026-03-14T10:00:00.000Z',
-  },
-  {
-    id: 'coding',
-    title: 'React Custom Hooks',
-    subtitle: 'How do I create a custom hook in React?',
-    participants: [you, assistant],
-    readState: 'read',
-    unreadCount: 0,
-    lastMessageAt: '2026-03-13T16:30:00.000Z',
-  },
-];
-
-const allThreads = {
-  historical: [
-    {
-      id: 'h-u1',
-      conversationId: 'historical',
-      role: 'user',
-      status: 'sent',
-      createdAt: '2026-03-15T13:55:00.000Z',
-      author: you,
-      parts: [
-        {
-          type: 'text',
-          text: 'Tell me about a fascinating historical figure that most people have never heard of.',
-        },
-      ],
-    },
-    {
-      id: 'h-a1',
-      conversationId: 'historical',
-      role: 'assistant',
-      status: 'sent',
-      createdAt: '2026-03-15T14:00:00.000Z',
-      author: assistant,
-      parts: [
-        {
-          type: 'reasoning',
-          text: "The user wants someone truly remarkable yet underrecognized.\n\nRamanujan immediately stands out — a self-taught prodigy from rural India who independently discovered thousands of theorems with no formal training. His partnership with Hardy, the taxicab number story, and results still being verified today make him a perfect answer.\n\nI'll highlight the most striking facts: the sheer volume of his work, the Hardy letter, and the 1729 number.",
-          state: 'done',
-        },
-        {
-          type: 'text',
-          text: 'One of history\'s most fascinating yet overlooked figures is **Srinivasa Ramanujan** (1887\u20131920), an Indian mathematician who made extraordinary contributions to number theory, continued fractions, and infinite series.\n\nHere are some remarkable facts about him:\n\n- He had almost no formal training in mathematics, yet independently compiled nearly 3,900 results\n- Many of his theorems were so ahead of their time that mathematicians are still proving them correct today\n- He famously wrote a letter to G.H. Hardy at Cambridge, which Hardy described as "the most remarkable letter I have ever received"\n- The number 1729 is known as the "Hardy-Ramanujan number" \u2014 the smallest number expressible as the sum of two cubes in two different ways',
-        },
-      ],
-    },
-  ],
-  cooking: [
-    {
-      id: 'c-u1',
-      conversationId: 'cooking',
-      role: 'user',
-      status: 'sent',
-      createdAt: '2026-03-14T09:55:00.000Z',
-      author: you,
-      parts: [
-        {
-          type: 'text',
-          text: 'What is a quick pasta recipe I can make in 15 minutes?',
-        },
-      ],
-    },
-    {
-      id: 'c-a1',
-      conversationId: 'cooking',
-      role: 'assistant',
-      status: 'sent',
-      createdAt: '2026-03-14T10:00:00.000Z',
-      author: assistant,
-      parts: [
-        {
-          type: 'text',
-          text: "Here's a quick **Aglio e Olio** recipe:\n\n1. Boil spaghetti in salted water until al dente\n2. Slice 4-5 garlic cloves thinly\n3. Heat olive oil in a pan, saut\u00e9 garlic until golden\n4. Add red pepper flakes to taste\n5. Toss the drained pasta in the garlic oil\n6. Finish with fresh parsley and parmesan\n\nTotal time: about 12 minutes. Simple and delicious!",
-        },
-      ],
-    },
-  ],
-  coding: [
-    {
-      id: 'r-u1',
-      conversationId: 'coding',
-      role: 'user',
-      status: 'sent',
-      createdAt: '2026-03-13T16:25:00.000Z',
-      author: you,
-      parts: [{ type: 'text', text: 'How do I create a custom hook in React?' }],
-    },
-    {
-      id: 'r-a1',
-      conversationId: 'coding',
-      role: 'assistant',
-      status: 'sent',
-      createdAt: '2026-03-13T16:30:00.000Z',
-      author: assistant,
-      parts: [
-        {
-          type: 'dynamic-tool',
-          toolInvocation: {
-            toolCallId: 'tc-search-1',
-            toolName: 'search_docs',
-            title: 'Search React Docs',
-            state: 'output-available',
-            input: { query: 'custom hooks React rules' },
-            output: {
-              results: [
-                'Hook names must start with "use" followed by a capital letter',
-                'Only call hooks at the top level — not inside loops or conditions',
-                'Only call hooks from React function components or other custom hooks',
-              ],
-            },
-          },
-        },
-        {
-          type: 'text',
-          text: "A custom hook is just a JavaScript function whose name starts with `use` and that can call other hooks.\n\nHere's a simple example:\n\n```tsx\nfunction useWindowWidth() {\n  const [width, setWidth] = React.useState(window.innerWidth);\n\n  React.useEffect(() => {\n    const handleResize = () => setWidth(window.innerWidth);\n    window.addEventListener('resize', handleResize);\n    return () => window.removeEventListener('resize', handleResize);\n  }, []);\n\n  return width;\n}\n```\n\nKey rules:\n- Always prefix with `use`\n- Only call hooks at the top level\n- Only call hooks from React functions",
-        },
-      ],
-    },
-  ],
-};
-
-// ---------------------------------------------------------------------------
-// 3-dot dropdown menu
-// ---------------------------------------------------------------------------
-function ConversationMenu({ anchorEl, onClose }) {
-  if (!anchorEl) {
-    return null;
-  }
-
-  const rect = anchorEl.getBoundingClientRect();
-  const menuItems = [
-    { icon: , label: 'Share' },
-    {
-      icon: ,
-      label: 'Rename',
-    },
-    { icon: , label: 'Pin chat' },
-    { icon: , label: 'Archive' },
-    {
-      icon: ,
-      label: 'Delete',
-      color: '#ef4444',
-    },
-  ];
-
-  return (
-    
-      {/* Backdrop */}
-      {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
-      
- {/* Menu */} -
- {menuItems.map((item) => ( - - ))} -
- - ); -} - -// --------------------------------------------------------------------------- -// Slot components — Sidebar -// --------------------------------------------------------------------------- -const GptConversationItem = React.forwardRef( - function GptConversationItem(props, ref) { - const { - children, - ownerState, - conversation, - selected, - unread, - focused, - style, - ...other - } = props; - const [hovered, setHovered] = React.useState(false); - const [menuAnchor, setMenuAnchor] = React.useState(null); - const hasUnread = conversation?.unreadCount - ? conversation.unreadCount > 0 - : false; - - return ( - -
setHovered(true)} - onMouseLeave={() => setHovered(false)} - style={{ - display: 'flex', - alignItems: 'center', - gap: 8, - padding: '6px 8px', - borderRadius: 8, - background: (() => { - if (ownerState?.selected) { - return gpt.sidebarSelected; - } - if (hovered) { - return gpt.sidebarHover; - } - return 'transparent'; - })(), - color: gpt.text, - fontSize: 14, - cursor: 'pointer', - position: 'relative', - ...style, - }} - {...other} - > - {children} - {/* Unread dot */} - {hasUnread && !ownerState?.selected ? ( - - ) : null} - {/* 3-dot menu button on hover */} - {hovered ? ( - - ) : null} -
- setMenuAnchor(null)} - /> -
- ); - }, -); - -const GptConversationAvatar = React.forwardRef( - function GptConversationAvatar(props, ref) { - const { ownerState, conversation, selected, unread, focused, style, ...other } = - props; - return
; - }, -); - -const GptConversationTitle = React.forwardRef( - function GptConversationTitle(props, ref) { - const { conversation, ownerState, selected, unread, focused, style, ...other } = - props; - return ( -
- {conversation?.title} -
- ); - }, -); - -const GptConversationPreview = React.forwardRef( - function GptConversationPreview(props, ref) { - const { ownerState, conversation, selected, unread, focused, ...other } = props; - return
; - }, -); - -const GptConversationTimestamp = React.forwardRef( - function GptConversationTimestamp(props, ref) { - const { ownerState, conversation, selected, unread, focused, ...other } = props; - return
; - }, -); - -const GptConversationUnreadBadge = React.forwardRef( - function GptConversationUnreadBadge(props, ref) { - const { ownerState, conversation, selected, unread, focused, ...other } = props; - return ; - }, -); - -// --------------------------------------------------------------------------- -// Slot components — Messages -// --------------------------------------------------------------------------- -const GptMessageGroup = React.forwardRef(function GptMessageGroup(props, ref) { - const { children, ownerState, style, ...other } = props; - return ( -
- {children} -
- ); -}); - -// Hide author name completely -const GptAuthorName = React.forwardRef(function GptAuthorName(props, ref) { - const { children, ownerState, style, ...other } = props; - return
; -}); - -const GptMessageRoot = React.forwardRef(function GptMessageRoot(props, ref) { - const { children, ownerState, style, ...other } = props; - const isUser = ownerState?.role === 'user'; - - return ( -
- {children} -
- ); -}); - -// Avatar: show only for assistant (ChatGPT sparkle icon), hide for user -const GptAvatar = React.forwardRef(function GptAvatar(props, ref) { - const { ownerState, children, style, ...other } = props; - - return
; -}); - -// Bubble: user gets a rounded bubble, assistant gets flat text -const GptBubble = React.forwardRef(function GptBubble(props, ref) { - const { children, ownerState, style, ...other } = props; - const isUser = ownerState?.role === 'user'; - - return ( -
- {children} -
- ); -}); - -// Hide timestamps -const GptMeta = React.forwardRef(function GptMeta(props, ref) { - const { ownerState, style, ...other } = props; - return
; -}); - -// --------------------------------------------------------------------------- -// Slot components — Reasoning (thinking block) -// --------------------------------------------------------------------------- -const GptReasoningRoot = React.forwardRef(function GptReasoningRoot(props, ref) { - const { ownerState, style, ...other } = props; - return ( -
- ); -}); - -const GptReasoningSummary = React.forwardRef( - function GptReasoningSummary(props, ref) { - const { ownerState, children, style, ...other } = props; - return ( - - - {children} - - ); - }, -); - -const GptReasoningContent = React.forwardRef( - function GptReasoningContent(props, ref) { - const { ownerState, style, ...other } = props; - return ( -
- ); - }, -); - -// --------------------------------------------------------------------------- -// Slot components — Tool call block -// --------------------------------------------------------------------------- -const GptToolRoot = React.forwardRef(function GptToolRoot(props, ref) { - const { ownerState, style, ...other } = props; - return ( -
- ); -}); - -const GptToolHeader = React.forwardRef(function GptToolHeader(props, ref) { - const { ownerState, style, ...other } = props; - return ( -
- ); -}); - -const GptToolTitle = React.forwardRef(function GptToolTitle(props, ref) { - const { ownerState, children, style, ...other } = props; - return ( -
- - {children} -
- ); -}); - -const GptToolState = React.forwardRef(function GptToolState(props, ref) { - const { ownerState, style, ...other } = props; - const isDone = ownerState?.state === 'output-available'; - return ( - - {isDone ? : null} - - ); -}); - -const GptToolSection = React.forwardRef(function GptToolSection(props, ref) { - const { ownerState, style, ...other } = props; - return ( -
- ); -}); - -const GptToolSectionContent = React.forwardRef( - function GptToolSectionContent(props, ref) { - const { ownerState, style, ...other } = props; - return ( -
-    );
-  },
-);
-
-// ---------------------------------------------------------------------------
-// Slot components — Composer
-// ---------------------------------------------------------------------------
-const GptComposerRoot = React.forwardRef(function GptComposerRoot(props, ref) {
-  const { children, ownerState, style, ...other } = props;
-  return (
-    
-      {children}
-    
-  );
-});
-
-const GptTextArea = React.forwardRef(function GptTextArea(props, ref) {
-  const { ownerState, style, ...other } = props;
-  return (
-