interface ExampleConfig {
name: string;
dependencyKeys: (string | [string, string])[];
cssPre: string[];
cssPost: string[];
tsxImports: string[];
additionalDeclarations: string[];
wrapper: [string, string] | null;
props: string[];
compileToJS: boolean;
isCompatPackage: boolean;
enableDnD: boolean;
}
export const configs: Record<string, ExampleConfig> = {
basic: {
name: 'Basic',
dependencyKeys: [],
cssPre: [],
cssPost: [],
tsxImports: [],
additionalDeclarations: [],
wrapper: null,
props: [],
compileToJS: true,
isCompatPackage: false,
enableDnD: false,
},
'basic-ts': {
name: 'Basic TypeScript',
dependencyKeys: [],
cssPre: [],
cssPost: [],
tsxImports: [],
additionalDeclarations: [],
wrapper: null,
props: [],
compileToJS: false,
isCompatPackage: false,
enableDnD: false,
},
dnd: {
name: 'Drag-and-drop',
dependencyKeys: ['react-dnd', 'react-dnd-html5-backend', 'react-dnd-touch-backend'],
cssPre: [],
cssPost: [
`kbd{color:#333;border:1px solid #ccc;border-radius:4px;display:inline-block;font-size:12px;font-weight:700;line-height:1;padding:3px 4px;margin:1px 2px;white-space:nowrap;box-shadow:1px 1px gray;}`,
],
tsxImports: [`import { QueryBuilderDnD } from '@react-querybuilder/dnd';`],
additionalDeclarations: [],
wrapper: [
`<ul><li>Hold <kbd>Alt</kbd>/<kbd>⌥ Option</kbd> before and during dragging to clone the source rule.</li><li>Hold <kbd>Ctrl</kbd> before and during dragging to create a new group with the target and source rules.</li></ul><QueryBuilderDnD>`,
`</QueryBuilderDnD>`,
],
props: [],
compileToJS: false,
isCompatPackage: false,
enableDnD: true,
},
datetime: {
name: 'Date/Time',
dependencyKeys: [],
cssPre: [`@import '@react-querybuilder/datetime/dist/datetime.css';`],
cssPost: [],
tsxImports: [`import { QueryBuilderDateTime } from '@react-querybuilder/datetime/ui';`],
additionalDeclarations: [],
wrapper: [`<QueryBuilderDateTime>`, `</QueryBuilderDateTime>`],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
expr: {
name: 'Expressions',
dependencyKeys: [],
cssPre: [`@import '@react-querybuilder/expr/dist/expressions.css';`],
cssPost: [],
tsxImports: [`import { QueryBuilderExpressions } from '@react-querybuilder/expr/ui';`],
additionalDeclarations: [
`for (const field of fields) { field.valueSources = ['value', 'expression']; }`,
],
wrapper: [`<QueryBuilderExpressions>`, `</QueryBuilderExpressions>`],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
antd: {
name: 'Ant Design',
dependencyKeys: ['@ant-design/icons', 'antd'],
cssPre: [],
cssPost: [`.queryBuilder .ant-input{width:auto;}`],
tsxImports: [`import { QueryBuilderAntD } from '@react-querybuilder/antd';`],
additionalDeclarations: [],
wrapper: ['<QueryBuilderAntD>', '</QueryBuilderAntD>'],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
bootstrap: {
name: 'Bootstrap',
dependencyKeys: ['bootstrap', 'bootstrap-icons', ['@popperjs/core', '^2.11.5']],
cssPre: [`@import 'bootstrap/dist/css/bootstrap.css';`],
cssPost: [
`.queryBuilder .form-control,.queryBuilder .form-select{display:inline-block;width:auto;}`,
],
tsxImports: [
`import { QueryBuilderBootstrap } from '@react-querybuilder/bootstrap';`,
`import 'bootstrap-icons/font/bootstrap-icons.css';`,
],
additionalDeclarations: [],
wrapper: ['<QueryBuilderBootstrap>', '</QueryBuilderBootstrap>'],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
bulma: {
name: 'Bulma',
dependencyKeys: ['bulma'],
cssPre: [`@import 'bulma/css/bulma.css';`],
cssPost: [`.queryBuilder .input{width: auto;}`],
tsxImports: [`import { QueryBuilderBulma } from '@react-querybuilder/bulma';`],
additionalDeclarations: [],
wrapper: ['<QueryBuilderBulma>', '</QueryBuilderBulma>'],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
chakra: {
name: 'Chakra UI',
dependencyKeys: ['@chakra-ui/react', '@emotion/react', 'next-themes', 'react-icons'],
cssPre: [],
cssPost: [
`.queryBuilder .chakra-native-select__root {width:fit-content;display:inline-block;}
.queryBuilder .chakra-input {width:auto;display:inline-block;}`,
],
tsxImports: [
`import { ChakraProvider, Theme, createSystem, defaultConfig } from '@chakra-ui/react';`,
`import { QueryBuilderChakra } from '@react-querybuilder/chakra';`,
`import { ThemeProvider } from 'next-themes';`,
],
additionalDeclarations: [
`const chakraTheme = createSystem(defaultConfig);
const Provider = (props: React.PropsWithChildren) => (
<ChakraProvider value={chakraTheme}>
<ThemeProvider attribute="class" disableTransitionOnChange>
{props.children}
</ThemeProvider>
</ChakraProvider>
);`,
],
wrapper: [
'<Provider><Theme colorPalette="teal"><QueryBuilderChakra>',
'</QueryBuilderChakra></Theme></Provider>',
],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
fluent: {
name: 'Fluent UI',
dependencyKeys: ['@fluentui/react-components'],
cssPre: [],
cssPost: [],
tsxImports: [
`import { FluentProvider, webLightTheme } from '@fluentui/react-components';`,
`import { QueryBuilderFluent } from '@react-querybuilder/fluent';`,
],
additionalDeclarations: [],
wrapper: [
'<FluentProvider theme={webLightTheme}><QueryBuilderFluent>',
'</QueryBuilderFluent></FluentProvider>',
],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
mantine: {
name: 'Mantine',
dependencyKeys: ['@mantine/core', '@mantine/dates', '@mantine/hooks', 'dayjs'],
cssPre: [`@import '@mantine/core/styles.css';`],
cssPost: [],
tsxImports: [
`import { MantineProvider } from '@mantine/core';`,
`import { QueryBuilderMantine } from '@react-querybuilder/mantine';`,
],
additionalDeclarations: [],
wrapper: ['<MantineProvider><QueryBuilderMantine>', '</QueryBuilderMantine></MantineProvider>'],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
material: {
name: 'MUI/Material',
dependencyKeys: ['@emotion/react', '@emotion/styled', '@mui/icons-material', '@mui/material'],
cssPre: [],
cssPost: [],
tsxImports: [
`import { teal } from "@mui/material/colors";`,
`import { createTheme, ThemeProvider } from '@mui/material/styles';`,
`import { QueryBuilderMaterial } from '@react-querybuilder/material';`,
],
additionalDeclarations: [
`const muiTheme = createTheme({
palette: {
secondary: {
main: teal[500]
}
}
});`,
],
wrapper: [
'<ThemeProvider theme={muiTheme}><QueryBuilderMaterial>',
'</QueryBuilderMaterial></ThemeProvider>',
],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
prime: {
name: 'PrimeReact',
dependencyKeys: ['primereact', 'primeicons'],
cssPre: [
`@import 'primereact/resources/themes/lara-light-cyan/theme.css';`,
`@import 'primereact/resources/primereact.min.css';`,
`@import 'primeicons/primeicons.css';`,
],
cssPost: [],
tsxImports: [`import { QueryBuilderPrime } from '@react-querybuilder/prime';`],
additionalDeclarations: [],
wrapper: ['<QueryBuilderPrime>', '</QueryBuilderPrime>'],
props: [],
compileToJS: false,
isCompatPackage: true,
enableDnD: false,
},
};