ant-design/ant-design

View on GitHub
.dumi/theme/common/Color/ColorStyle.tsx

Summary

Maintainability
C
1 day
Test Coverage
import React from 'react';
import { css, Global } from '@emotion/react';
import { useTheme } from 'antd-style';

const gray: { [key: number]: string } = {
  1: '#fff',
  2: '#fafafa',
  3: '#f5f5f5',
  4: '#f0f0f0',
  5: '#d9d9d9',
  6: '#bfbfbf',
  7: '#8c8c8c',
  8: '#595959',
  9: '#434343',
  10: '#262626',
  11: '#1f1f1f',
  12: '#141414',
  13: '#000',
};

const ColorStyle: React.FC = () => {
  const token = useTheme();

  const makePalette = (color: string, index: number = 1): string => {
    if (index <= 10) {
      return `
.palette-${color}-${index} {
  background: ${(token as any)[`${color}-${index}`]};
}
${makePalette(color, index + 1)}
    `;
    }
    return '';
  };

  const makeGrayPalette = (index: number = 1): string => {
    if (index <= 13) {
      return `
.palette-gray-${index} {
  background: ${gray[index]};
}
${makeGrayPalette(index + 1)}
    `;
    }
    return '';
  };

  return (
    <Global
      styles={css`
        .color-palettes {
          margin: 0 1%;

          &-dark {
            margin: 0;
            padding: 0 28px;
            background-color: #141414;

            .color-title {
              color: rgba(255, 255, 255, 0.85);
            }

            .color-description {
              color: rgba(255, 255, 255, 0.45);
            }

            .color-palette {
              margin: 45px 3.5% 45px 0;

              &:nth-of-type(3n) {
                margin-inline-end: 0;
              }

              .main-color-item {
                margin-inline-end: 0;

                &:hover {
                  margin-inline-end: -${token.paddingXS}px;
                }
              }
            }
          }
        }

        .color-palette {
          display: inline-block;
          width: 31%;
          margin: 45px 1%;

          &-pick {
            margin: 0 0 ${token.marginMD}px;
            font-size: ${token.fontSizeXL}px;
            text-align: center;
          }

          &-picker {
            margin: ${token.marginLG}px 0;

            &-value {
              position: relative;
              top: -3px;
              margin-inline-start: ${token.margin}px;
              font-size: ${token.fontSize}px;
              font-family: Consolas, sans-serif;
              .ant-row-rtl & {
                margin-inline-end: ${token.margin}px;
                margin-inline-start: 0;
              }
            }

            &-validation {
              position: relative;
              top: -3px;
              margin-inline-start: ${token.margin}px;
              color: ${token.colorError};
              font-size: ${token.fontSize}px;

              .ant-row-rtl & {
                margin-inline-end: ${token.margin}px;
                margin-inline-start: 0;
              }

              &-dark {
                margin-inline-start: 0;
              }
            }
          }
        }

        .main-color {
          ${makePalette('blue')}
          ${makePalette('purple')}
  ${makePalette('cyan')}
  ${makePalette('green')}
  ${makePalette('magenta')}
  ${makePalette('red')}
  ${makePalette('volcano')}
  ${makePalette('orange')}
  ${makePalette('gold')}
  ${makePalette('yellow')}
  ${makePalette('lime')}
  ${makePalette('geekblue')}
  ${makeGrayPalette()}

  text-align: left;

          &-item {
            position: relative;
            height: 44px;
            margin-inline-end: ${token.marginXXS}px;
            padding: 0 ${token.paddingSM}px;
            font-size: ${token.fontSize}px;
            font-family: Consolas, sans-serif;
            line-height: 44px;
            cursor: pointer;
            transition: all ${token.motionDurationMid};

            &:first-child {
              border-radius: ${token.borderRadiusSM}px ${token.borderRadiusSM}px 0 0;
            }

            &:last-child {
              border-radius: 0 0 ${token.borderRadiusSM}px ${token.borderRadiusSM}px;
            }

            &:hover {
              margin-inline-end: -${token.marginXS}px;
              border-radius: 0 ${token.borderRadiusSM}px ${token.borderRadiusSM}px 0;
            }
          }

          &-item &-text {
            float: left;
            transition: all ${token.motionDurationSlow};
          }

          &-item &-value {
            position: relative;
            left: 3px;
            float: right;
            transform: scale(0.85);
            transform-origin: 100% 50%;
            opacity: 0;
            transition: all ${token.motionDurationSlow};
          }
        }

        .color-title {
          margin: 0 0 ${token.marginLG}px;
          color: #5c6b77;
          font-weight: 500;
          font-size: 22px;
          text-align: center;
          text-transform: capitalize;
        }

        .color-description {
          display: block;
          color: #777;
          font-weight: lighter;
          font-size: ${token.fontSize}px;
        }

        .main-color:hover {
          .main-color-value {
            left: 0;
            opacity: 0.7;
          }
        }

        .color-palette-horizontal {
          box-sizing: border-box;
          width: 100%;

          &-dark {
            height: 303px;
            padding: ${token.paddingXL}px ${token.paddingXL - 4}px;
            background-color: #141414;

            .color-palette-picker {
              margin-bottom: 0;
            }

            .color-palette-pick {
              color: rgba(255, 255, 255, 0.65);
              text-align: left;

              &-hex {
                color: rgba(255, 255, 255, 0.65);
              }

              .ant-row-rtl & {
                direction: rtl;
                text-align: right;
              }
            }
          }

          .main-color {
            display: flex;

            &-item {
              position: relative;
              flex: 1;
              box-sizing: border-box;
              height: 86px;
              margin-inline-end: 0;
              padding: 37px 0 0;
              line-height: normal;
              text-align: center;
              border-radius: 0;

              .main-color-text {
                float: none;
              }

              &:hover {
                height: 96px;
                margin-top: -10px;
                border-radius: ${token.borderRadiusSM}px ${token.borderRadiusSM}px 0 0;
              }
            }

            &-value {
              position: absolute;
              bottom: 0;
              left: 0;
              width: 100%;
              text-align: center;
              transform-origin: unset;
            }

            &:hover {
              .main-color-item {
                padding-top: ${token.paddingXS}px;
              }

              .main-color-value {
                bottom: 8px;
                opacity: 0.7;
              }
            }
          }
        }
      `}
    />
  );
};

export default ColorStyle;