mantine-custom-components by mantinedev/skills
npx skills add https://github.com/mantinedev/skills --skill mantine-custom-componentsimport {
Box, BoxProps, createVarsResolver, ElementProps,
factory, Factory, getRadius, MantineRadius,
StylesApiProps, useProps, useStyles,
} from '@mantine/core';
import classes from './MyComponent.module.css';
export type MyComponentStylesNames = 'root' | 'inner';
export type MyComponentVariant = 'filled' | 'outline';
export type MyComponentCssVariables = { root: '--my-radius' };
export interface MyComponentProps
extends BoxProps, StylesApiProps<MyComponentFactory>, ElementProps<'div'> {
radius?: MantineRadius;
}
export type MyComponentFactory = Factory<{
props: MyComponentProps;
ref: HTMLDivElement;
stylesNames: MyComponentStylesNames;
vars: MyComponentCssVariables;
variant: MyComponentVariant;
}>;
const defaultProps = { radius: 'md' } satisfies Partial<MyComponentProps>;
const varsResolver = createVarsResolver<MyComponentFactory>((_theme, { radius }) => ({
root: { '--my-radius': getRadius(radius) },
}));
export const MyComponent = factory<MyComponentFactory>((_props) => {
const props = useProps('MyComponent', defaultProps, _props);
const { classNames, className, style, styles, unstyled, vars, attributes, radius, ...others } = props;
const getStyles = useStyles<MyComponentFactory>({
name: 'MyComponent', classes, props,
className, style, classNames, styles, unstyled, vars, attributes, varsResolver,
});
return <Box {...getStyles('root')} {...others} />;
});
MyComponent.displayName = '@mantine/core/MyComponent';
MyComponent.classes = classes;
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 场景 | 工厂函数 | 类型 |
|---|---|---|
| 标准组件 | factory() | Factory<{}> |
支持 component 属性(多态) | polymorphicFactory() | PolymorphicFactory<{}> — 需添加 defaultComponent 和 defaultRef |
属性基于泛型变化(例如 multiple) | genericFactory() | Factory<{ signature: ... }> |
请谨慎使用 polymorphicFactory — 它会增加 TypeScript 开销并降低 IDE 自动补全速度。
Factory<{
props: MyComponentProps; // 必需
ref: HTMLDivElement; // 用于转发引用的元素类型
stylesNames: 'root' | 'inner'; // 样式 API 选择器的联合类型
vars: { root: '--my-var' }; // 每个选择器的 CSS 变量映射
variant: 'filled' | 'outline'; // 可接受的变体字符串
staticComponents: { // 子组件(复合模式)
Item: typeof MyComponentItem;
};
compound?: boolean; // true = 子组件;禁用主题类名/样式/变量
ctx?: MyContextType; // 作为第三个参数传递给样式/变量解析器
signature?: (...) => JSX.Element; // 仅用于 genericFactory
}>
用户和主题可以通过 Component.extend() 覆盖默认值:
const theme = createTheme({
components: {
MyComponent: MyComponent.extend({
defaultProps: { radius: 'xl' },
classNames: { root: 'my-root' },
styles: { root: { color: 'red' } },
vars: (_theme, props) => ({ root: { '--my-radius': getRadius(props.radius) } }),
}),
},
});
references/api.md — 所有导入项:factory、useProps、useStyles、createVarsResolver、createSafeContext、StylesApiProps、CompoundStylesApiProps、BoxProps、ElementProps、主题助手(getSize、getRadius 等)references/patterns.md — 完整示例:带上下文的复合组件、多态组件、泛型组件、主题集成每周安装量
102
代码仓库
GitHub 星标数
29
首次出现
2026年2月19日
安全审计
安装于
codex96
gemini-cli95
kimi-cli95
cursor95
opencode95
amp95
import {
Box, BoxProps, createVarsResolver, ElementProps,
factory, Factory, getRadius, MantineRadius,
StylesApiProps, useProps, useStyles,
} from '@mantine/core';
import classes from './MyComponent.module.css';
export type MyComponentStylesNames = 'root' | 'inner';
export type MyComponentVariant = 'filled' | 'outline';
export type MyComponentCssVariables = { root: '--my-radius' };
export interface MyComponentProps
extends BoxProps, StylesApiProps<MyComponentFactory>, ElementProps<'div'> {
radius?: MantineRadius;
}
export type MyComponentFactory = Factory<{
props: MyComponentProps;
ref: HTMLDivElement;
stylesNames: MyComponentStylesNames;
vars: MyComponentCssVariables;
variant: MyComponentVariant;
}>;
const defaultProps = { radius: 'md' } satisfies Partial<MyComponentProps>;
const varsResolver = createVarsResolver<MyComponentFactory>((_theme, { radius }) => ({
root: { '--my-radius': getRadius(radius) },
}));
export const MyComponent = factory<MyComponentFactory>((_props) => {
const props = useProps('MyComponent', defaultProps, _props);
const { classNames, className, style, styles, unstyled, vars, attributes, radius, ...others } = props;
const getStyles = useStyles<MyComponentFactory>({
name: 'MyComponent', classes, props,
className, style, classNames, styles, unstyled, vars, attributes, varsResolver,
});
return <Box {...getStyles('root')} {...others} />;
});
MyComponent.displayName = '@mantine/core/MyComponent';
MyComponent.classes = classes;
| Scenario | Factory function | Type |
|---|---|---|
| Standard component | factory() | Factory<{}> |
Supports component prop (polymorphic) | polymorphicFactory() | PolymorphicFactory<{}> — add defaultComponent and defaultRef |
Props change based on a generic (e.g. multiple) |
Use polymorphicFactory sparingly — it adds TypeScript overhead and slows IDE autocomplete.
Factory<{
props: MyComponentProps; // required
ref: HTMLDivElement; // element type for the forwarded ref
stylesNames: 'root' | 'inner'; // union of Styles API selectors
vars: { root: '--my-var' }; // CSS variable map per selector
variant: 'filled' | 'outline'; // accepted variant strings
staticComponents: { // sub-components (compound pattern)
Item: typeof MyComponentItem;
};
compound?: boolean; // true = sub-component; disables theme classNames/styles/vars
ctx?: MyContextType; // passed to styles/vars resolvers as third arg
signature?: (...) => JSX.Element; // only for genericFactory
}>
Users and the theme can override defaults via Component.extend():
const theme = createTheme({
components: {
MyComponent: MyComponent.extend({
defaultProps: { radius: 'xl' },
classNames: { root: 'my-root' },
styles: { root: { color: 'red' } },
vars: (_theme, props) => ({ root: { '--my-radius': getRadius(props.radius) } }),
}),
},
});
references/api.md — All imports: factory, useProps, useStyles, createVarsResolver, createSafeContext, StylesApiProps, CompoundStylesApiProps, BoxProps, ElementProps, theme helpers (, , etc.)Weekly Installs
102
Repository
GitHub Stars
29
First Seen
Feb 19, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex96
gemini-cli95
kimi-cli95
cursor95
opencode95
amp95
TanStack Query v5 完全指南:React 数据管理、乐观更新、离线支持
2,500 周安装
genericFactory() |
Factory<{ signature: ... }> |
getSizegetRadiusreferences/patterns.md — Full examples: compound components with context, polymorphic component, generic component, theme integration