Meteor React 1.4 中的 Ant Design 主题定制

Ant Design Theme Customization in Meteor React 1.4

自定义Ant Design主题的说明在这里:

https://ant.design/docs/react/customize-theme

这如何与 Meteor React 1.4+ 一起使用? "Overriding Less variables (alternative way)" 是正确的使用方法吗? LESS 文件会去哪里,在 React 中如何访问它?

如果您使用 babel-plugin-import components less 文件将为您包含在内,您需要做的就是将您的 webpack 配置为使用 less 加载器。如果你想自定义主题,那么你可以在less loader中添加modifyVar选项,它会为你替换。

你可以查看他们的配置文件,我照做了,成功了 https://github.com/ant-tool/atool-build/blob/a4b3e3eec4ffc09b0e2352d7f9d279c4c28fdb99/src/getWebpackCommonConfig.js#L131-L138

  • 添加 less 包(用于 meteor)
  • 在客户端添加一个theme.less文件
  • 粘贴来自 ant 的默认 less 变量
  • 根据需要自定义

示例文件较少:

@import '{}/node_modules/antd/dist/antd.less';



@font-face {
   font-family: 'Bariol_Bold';
    src: url('/fonts/Bariol_Bold.otf');
}

@font-face {
   font-family: 'Bariol_Bold_italic';
    src: url('/fonts/Bariol_Bold_italic.otf');
}

@font-face {
   font-family: 'Bariol_Light';
    src: url('/fonts/Bariol_Light.otf');
}

@font-face {
   font-family: 'Bariol_Light_italic';
    src: url('/fonts/Bariol_Light_italic.otf');
}

@font-face {
   font-family: 'Bariol_Thin';
    src: url('/fonts/Bariol_Thin.otf');
}

@font-face {
   font-family: 'Bariol_Thin_italic';
    src: url('/fonts/Bariol_Thin_italic.otf');
}




// Prefix
@ant-prefix             : ant;

// Color
//@primary-color          : #108ee9;
@primary-color          : #d70b52;
@success-color          : #87d068;
@error-color            : #f50;
@highlight-color        : #f50;
@warning-color          : #fa0;
@normal-color           : #d9d9d9;

// ------ Base & Require ------
@body-background        : #fff;
@component-background   : #fff;
@font-family            : 'Bariol_Thin', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
@code-family            : Consolas, Menlo, Courier, monospace;
@text-color             : #666;
@heading-color          : #404040;
@text-color-secondary   : #999;
@font-size-base         : 12px;
@font-size-lg           : @font-size-base + 2px;
@line-height-base       : 1.5;
@border-radius-base     : 4px;
@border-radius-sm       : 2px;

// ICONFONT
@iconfont-css-prefix    : anticon;
@icon-url               : "https://at.alicdn.com/t/font_r5u29ls31bgldi";

// LINK
@link-color             : #108ee9;
@link-hover-color       : tint(@link-color, 20%);
@link-active-color      : shade(@link-color, 5%);
@link-hover-decoration  : none;

// Animation
@ease-out            : cubic-bezier(0.215, 0.61, 0.355, 1);
@ease-in             : cubic-bezier(0.55, 0.055, 0.675, 0.19);
@ease-in-out         : cubic-bezier(0.645, 0.045, 0.355, 1);
@ease-out-back       : cubic-bezier(0.12, 0.4, 0.29, 1.46);
@ease-in-back        : cubic-bezier(0.71, -0.46, 0.88, 0.6);
@ease-in-out-back    : cubic-bezier(0.71, -0.46, 0.29, 1.46);
@ease-out-circ       : cubic-bezier(0.08, 0.82, 0.17, 1);
@ease-in-circ        : cubic-bezier(0.6, 0.04, 0.98, 0.34);
@ease-in-out-circ    : cubic-bezier(0.78, 0.14, 0.15, 0.86);
@ease-out-quint      : cubic-bezier(0.23, 1, 0.32, 1);
@ease-in-quint       : cubic-bezier(0.755, 0.05, 0.855, 0.06);
@ease-in-out-quint   : cubic-bezier(0.86, 0, 0.07, 1);

// Border color
@border-color-base      : #d9d9d9;        // base border outline a component
@border-color-split     : #e9e9e9;        // split border inside a component

// Outline
@outline-blur-size      : 0;
@outline-width          : 2px;
@outline-color          : @primary-color;

// Background color
@background-color-base  : #f7f7f7;        // basic gray background

// Shadow
@shadow-color           : rgba(0, 0, 0, .2);
@box-shadow-base        : @shadow-1-down;
@shadow-1-up            : 0 -1px 6px @shadow-color;
@shadow-1-down          : 0 1px 6px @shadow-color;
@shadow-1-left          : -1px 0 6px @shadow-color;
@shadow-1-right         : 1px 0 6px @shadow-color;
@shadow-2               : 0 2px 8px @shadow-color;

// Buttons
@btn-font-weight        : 500;
@btn-border-radius-base : @border-radius-base;
@btn-border-radius-sm   : @border-radius-sm;

@btn-primary-color      : #fff;
@btn-primary-bg         : @primary-color;
@btn-group-border       : shade(@primary-color, 5%);

@btn-default-color      : @text-color;
@btn-default-bg         : @background-color-base;
@btn-default-border     : @border-color-base;

@btn-ghost-color        : @text-color;
@btn-ghost-bg           : transparent;
@btn-ghost-border       : @border-color-base;

@btn-disable-color      : #ccc;
@btn-disable-bg         : @background-color-base;
@btn-disable-border     : @border-color-base;

@btn-padding-base       : 4px 15px;
@btn-font-size-lg       : @font-size-lg;
@btn-padding-lg         : 4px 15px 5px 15px;
@btn-padding-sm         : 1px 7px;

@btn-circle-size        : 28px;
@btn-circle-size-lg     : 32px;
@btn-circle-size-sm     : 22px;

// Media queries breakpoints
// Extra small screen / phone
@screen-xs              : 480px;
@screen-xs-min          : @screen-xs;
@screen-xs-max          : (@screen-xs-min - 1);

// Small screen / tablet
@screen-sm              : 768px;
@screen-sm-min          : @screen-sm;
@screen-sm-max          : (@screen-sm-min - 1);

// Medium screen / desktop
@screen-md              : 992px;
@screen-md-min          : @screen-md;
@screen-md-max          : (@screen-md-min - 1);

// Large screen / wide desktop
@screen-lg              : 1200px;
@screen-lg-min          : @screen-lg;
@screen-lg-max          : (@screen-lg-min - 1);

// Grid system
@grid-columns           : 24;
@grid-gutter-width      : 0;

// Layout
@layout-body-background    : #ececec;
@layout-header-background  : @heading-color;
@layout-header-height      : 64px;
@layout-header-padding     : 0 50px;
@layout-footer-padding     : 24px 50px;
@layout-sider-background   : @heading-color;
@layout-content-margin     : 24px;
@layout-trigger-height     : 48px;

// z-index list
@zindex-affix           : 10;
@zindex-back-top        : 10;
@zindex-modal-mask      : 1000;
@zindex-modal           : 1000;
@zindex-notification    : 1010;
@zindex-message         : 1010;
@zindex-popover         : 1030;
@zindex-picker          : 1050;
@zindex-dropdown        : 1050;
@zindex-tooltip         : 1060;

// Animation
@animation-duration-slow: .3s; // Modal
@animation-duration-base: .2s;
@animation-duration-fast: .1s; // Tooltip

// Form
// ---
@label-required-color        : @highlight-color;
@label-color                 : @text-color;
@form-item-margin-bottom     : 24px;

// Input
// ---
@input-height-base           : 28px;
@input-height-lg             : 32px;
@input-height-sm             : 22px;
@input-padding-horizontal    : 7px;
@input-padding-vertical-base : 4px;
@input-padding-vertical-sm   : 1px;
@input-padding-vertical-lg   : 6px;
@input-placeholder-color     : #ccc;
@input-color                 : @text-color;
@input-border-color          : @border-color-base;
@input-bg                    : #fff;
@input-hover-border-color    : @primary-color;
@input-disabled-bg           : @background-color-base;

// Tooltip
// ---
//* Tooltip max width
@tooltip-max-width: 250px;
//** Tooltip text color
@tooltip-color: #fff;
//** Tooltip background color
@tooltip-bg: rgba(64, 64, 64, .85);
//** Tooltip arrow width
@tooltip-arrow-width: 5px;
//** Tooltip distance with trigger
@tooltip-distance: @tooltip-arrow-width - 1 + 4;
//** Tooltip arrow color
@tooltip-arrow-color: @tooltip-bg;



// Popover
// ---
//** Popover body background color
@popover-bg: #fff;
//** Popover maximum width
@popover-min-width: 177px;
//** Popover arrow width
@popover-arrow-width: 4px;
//** Popover arrow color
@popover-arrow-color: @popover-bg;
//** Popover outer arrow width
@popover-arrow-outer-width: (@popover-arrow-width + 1);
//** Popover outer arrow color
@popover-arrow-outer-color: fadeout(@border-color-base, 30%);

// Progress
// --
@process-default-color: @primary-color;





// CUSTOM STYLES
// ===================== 

h1, h2, h3 {
    font-family: 'Bariol_Bold';
    -webkit-font-smoothing: antialiased;
    -webkit-margin-after: 0px;
    -webkit-margin-before: 10px;
    -webkit-margin-end: 0px;
    -webkit-margin-start: 0px;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}



p {
    font-family: 'Bariol_Bold';
    -webkit-font-smoothing: antialiased;
    -webkit-margin-after: 10px;
    -webkit-margin-before: 5px;
    -webkit-margin-end: 0px;
    -webkit-margin-start: 0px;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}


.ant-menu-item {
    font-weight: 500;
    -webkit-font-smoothing: antialiased;
    font-size: 14px;
}



.landing-menu {
    .ant-menu-item {
        color: #f1beba;
    }

    li.ant-menu-item-selected {
        color: #fff;
        border-bottom: 2px solid #fff;
    }   
}

.ant-timeline-item-head-custom {
    background: #fafafa !important; 
}

.ant-timeline-item-head {
    background: #fafafa !important; 
}


ul.ant-menu-horizontal {
    border-bottom: none;
}


#search-box {
    height: 45px !important;    
    border-radius: 5px !important;
    border-bottom-right-radius: 0px !important;
    border-top-right-radius: 0px !important;
    border: none !important;
    padding-right: 35px !important;
    &:focus {
        outline: 0
    }

}

#search-box-results {
    #search-box;
    border: 2px solid #efefef !important;
}

.ant-input:focus {
    border-color: none  !important; 
    outline: 0  !important; 
    box-shadow: none  !important;   
}

.rc-progress-circle-path {
    stroke: @primary-color !important;
}


.ant-menu-item {
    font-family: 'Bariol_Bold';
}







.cant-find-form {
    input {
        height: 50px !important;
        border-radius: 3px !important;
        border: 2px solid #efefef !important;
        &:focus {
            outline: 0
        }
    }
}

#app-navigation {
    .ant-menu-horizontal > .ant-menu-item:hover, .ant-menu-horizontal > .ant-menu-submenu:hover {
        border-bottom: 2px solid transparent !important;
        color: @primary-color !important;
    }
}

.ant-btn {
    font-family: 'Bariol_Bold';
}

.vendor-title {
    font-family: 'Bariol_Light';
    margin-top: 20px;
    font-size: 28px;
}

a {
  text-decoration: none;
}

#react-root {
  minHeight: 100vh;
}

html, body {
  //background: #FAFAFA !important;
  margin: 0;
  padding: 0;
  height: 100%;
  width: 100%;
}

body {
    overflow-x: hidden;
}

与 arcom 的回答类似,其中包含有关 .babelrc 的更多详细信息。这使用 antd 2.7.1 有效:

在 .babelrc 中

{
  "plugins": [
    "transform-class-properties",
    "babel-root-slash-import"
  ]
}

安装

meteor npm i --save babel-plugin-transform-class-properties babel-root-slash-import

在 theme.less 中,antd 变量可以访问并且新值覆盖默认值

@import '{}/node_modules/antd/dist/antd.less';

// Color
@primary-color          : @green-6;