chore: sync master into feature

This commit is contained in:
thinkasany
2026-01-07 19:23:51 +08:00
10 changed files with 54 additions and 16 deletions

View File

@@ -227,7 +227,7 @@ const Overview: React.FC = () => {
src={
isDark && component.coverDark ? component.coverDark : component.cover
}
alt={component.title}
alt=""
/>
</div>
</Card>

View File

@@ -96,6 +96,33 @@ describe('ConfigProvider.DynamicTheme', () => {
).toBeTruthy();
});
it('icon styles should use cssVar key from theme config', () => {
render(
<ConfigProvider theme={{ cssVar: { key: 'custom-css-var' } }}>
<SmileOutlined />
</ConfigProvider>,
);
const dynamicStyles = Array.from(document.querySelectorAll('style[data-css-hash]'));
// Should have styles with the custom cssVar key
expect(
dynamicStyles.some((style) => {
const { innerHTML } = style;
return innerHTML.includes('.custom-css-var');
}),
).toBeTruthy();
// Should NOT have styles with the default css-var-root key
// This ensures icon styles registered inside ConfigProvider use the correct context
expect(
dynamicStyles.some((style) => {
const { innerHTML } = style;
return innerHTML.includes('.css-var-root');
}),
).toBeFalsy();
});
// eslint-disable-next-line jest/no-disabled-tests
it.skip('layer should affect icon', () => {
render(

View File

@@ -91,6 +91,18 @@ import type { SizeType } from './SizeContext';
import SizeContext, { SizeContextProvider } from './SizeContext';
import useStyle from './style';
/**
* This component registers icon styles inside the DesignTokenContext.Provider
* so that CSS variables use the correct cssVar key from the theme config.
*/
const IconStyle: React.FC<{ iconPrefixCls: string; csp?: CSPConfig }> = ({
iconPrefixCls,
csp,
}) => {
useStyle(iconPrefixCls, csp);
return null;
};
export type { Variant };
export { Variants };
@@ -440,8 +452,6 @@ const ProviderChildren: React.FC<ProviderChildrenProps> = (props) => {
const iconPrefixCls = customIconPrefixCls || parentContext.iconPrefixCls || defaultIconPrefixCls;
const csp = customCsp || parentContext.csp;
useStyle(iconPrefixCls, csp);
const mergedTheme = useTheme(theme, parentContext.theme, { prefixCls: getPrefixCls('') });
if (process.env.NODE_ENV !== 'production') {
@@ -591,6 +601,7 @@ const ProviderChildren: React.FC<ProviderChildrenProps> = (props) => {
let childNode = (
<>
<IconStyle iconPrefixCls={iconPrefixCls} csp={csp} />
<PropWarning dropdownMatchSelectWidth={dropdownMatchSelectWidth} />
{children}
</>

View File

@@ -26,7 +26,7 @@ export default function useItems(
// convert legacy type
return React.useMemo(() => {
const mergedItems: TimelineItemType[] = parseItems.map((item, index) => {
const mergedItems = parseItems.map<TimelineItemType>((item, index) => {
const {
label,
children,

View File

@@ -1094,8 +1094,8 @@ describe('immutable data', () => {
const [targetKeys, setTargetKeys] = useState<TransferProps['targetKeys']>([]);
const getMock = () => {
const tempTargetKeys = [];
const tempMockData = [];
const tempTargetKeys: React.Key[] = [];
const tempMockData: DefaultRecordType[] = [];
for (let i = 0; i < 2; i++) {
const data = {
key: i.toString(),

View File

@@ -14,8 +14,8 @@ const App: React.FC = () => {
const [targetKeys, setTargetKeys] = useState<TransferProps['targetKeys']>([]);
const getMock = () => {
const tempTargetKeys = [];
const tempMockData = [];
const tempTargetKeys: React.Key[] = [];
const tempMockData: RecordType[] = [];
for (let i = 0; i < 20; i++) {
const data = {
key: i.toString(),

View File

@@ -14,8 +14,8 @@ const App: React.FC = () => {
const [targetKeys, setTargetKeys] = useState<React.Key[]>([]);
const getMock = () => {
const tempTargetKeys = [];
const tempMockData = [];
const tempTargetKeys: React.Key[] = [];
const tempMockData: RecordType[] = [];
for (let i = 0; i < 20; i++) {
const data = {
key: i.toString(),

View File

@@ -15,8 +15,8 @@ const App: React.FC = () => {
const [targetKeys, setTargetKeys] = useState<React.Key[]>([]);
useEffect(() => {
const newTargetKeys = [];
const newMockData = [];
const newTargetKeys: React.Key[] = [];
const newMockData: RecordType[] = [];
for (let i = 0; i < 2000; i++) {
const data = {
key: i.toString(),

View File

@@ -14,8 +14,8 @@ const App: React.FC = () => {
const [targetKeys, setTargetKeys] = useState<TransferProps['targetKeys']>([]);
const getMock = () => {
const tempTargetKeys = [];
const tempMockData = [];
const tempTargetKeys: React.Key[] = [];
const tempMockData: RecordType[] = [];
for (let i = 0; i < 20; i++) {
const data = {
key: i.toString(),

View File

@@ -117,12 +117,12 @@
"@babel/runtime": "^7.28.4",
"@rc-component/cascader": "~1.11.0",
"@rc-component/checkbox": "~1.0.1",
"@rc-component/collapse": "~1.1.2",
"@rc-component/collapse": "~1.2.0",
"@rc-component/color-picker": "~3.0.3",
"@rc-component/dialog": "~1.8.0",
"@rc-component/drawer": "~1.4.0",
"@rc-component/dropdown": "~1.0.2",
"@rc-component/form": "~1.6.0",
"@rc-component/form": "~1.6.1",
"@rc-component/image": "~1.6.0",
"@rc-component/input": "~1.1.2",
"@rc-component/input-number": "~1.6.2",