Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Invalid CSS when using Button wrapped with Popover and layer enabled #195

Open
ethos-vitalii opened this issue Aug 25, 2024 · 0 comments
Open

Comments

@ethos-vitalii
Copy link

ethos-vitalii commented Aug 25, 2024

I use Next.js with antd and @ant-design/nextjs-registry:

<AntdRegistry layer>
  ...
    <Popover title="smth" content="smth" trigger="click">
      <Button>Smth</Button>
    </Popover>
  ...
</AntdRegistry>

AntdRegistry internally wraps everything in StyleProvider and uses extractStyle. I've noticed that whenever Popover is wrapping a button on any page, extractStyle returns an invalid CSS. Here's an example:

...

.css-var-R2cq.ant-popover {
  --ant-popover-title-min-width: 177px;
  --ant-popover-z-index-popup: 1030;
  --ant-popover-arrow-shadow-width: 8.970562748477143px;
  --ant-popover-arrow-path: path('M 0 8 A 4 4 0 0 0 2.82842712474619 6.82842712474619 L 6.585786437626905 3.0710678118654755 A 2 2 0 0 1 9.414213562373096 3.0710678118654755 L 13.17157287525381 6.82842712474619 A 4 4 0 0 0 16 8 Z');
  --ant-popover-arrow-polygon: polygon(1.6568542494923806px 100%, 50% 1.6568542494923806px, 14.34314575050762px 100%, 1.6568542494923806px 100%);
  --ant-popover-arrow-offset-horizontal: 12px;
  --ant-popover-arrow-offset-vertical: 8px;
  --ant-popover-inner-padding: 12px;
  --ant-popover-title-margin-bottom: 8px;
  --ant-popover-title-padding: 0px;
  --ant-popover-title-border-bottom: none;
  --ant-popover-inner-content-padding: 0px;
}

@layer antd@layer antd { /* Here's the problem it includes "@layer antd" twice */
  .ant-progress { /* I have Progress component in a different place on that page */
    font-family: var(--ant-font-family);
    font-size: var(--ant-font-size);
    box-sizing: border-box;
  }

...

@Kiyumi-v reproduced the problem here ant-design/ant-design#49853 (comment) (you might find more details about the issue there).

Workaround

So far, the workaround is to copy the AntdRegistry component and modify the extracted styles not to include duplication of @layer antd@layer antd and replace with one @layer antd.

const AntdRegistry: FC<AntdRegistryProps> = (props) => {
  const [cache] = useState(() => createCache());
  const inserted = useRef(false);

  useServerInsertedHTML(() => {
    let styleText = extractStyle(cache, { plain: true });

    if (inserted.current) {
      return null;
    }
    inserted.current = true;

+   styleText = styleText.replaceAll(/@layer antd@layer antd/g, '@layer antd');

    return (
      <style
        id="antd-cssinjs"
        // to make sure this style is inserted before Ant Design's style generated by client
        data-rc-order="prepend"
        data-rc-priority="-1000"
        dangerouslySetInnerHTML={{ __html: styleText }}
      />
    );
  });

  return <StyleProvider {...props} cache={cache} />;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant