rsuite 5.26.1 → 5.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/Button/styles/index.less +12 -1
  2. package/CHANGELOG.md +11 -0
  3. package/cjs/Button/Button.d.ts +4 -0
  4. package/cjs/Button/Button.js +18 -9
  5. package/cjs/Message/Message.d.ts +4 -0
  6. package/cjs/Message/Message.js +8 -2
  7. package/cjs/Notification/Notification.d.ts +3 -0
  8. package/cjs/Notification/Notification.js +8 -2
  9. package/cjs/Schema/Schema.d.ts +2 -1
  10. package/cjs/Schema/Schema.js +2 -1
  11. package/cjs/toaster/ToastContainer.d.ts +6 -1
  12. package/cjs/toaster/ToastContainer.js +12 -5
  13. package/cjs/toaster/ToastContext.d.ts +6 -0
  14. package/cjs/toaster/ToastContext.js +16 -0
  15. package/cjs/toaster/toaster.js +7 -5
  16. package/cjs/toaster/useToaster.js +1 -1
  17. package/dist/rsuite-rtl.css +38 -5
  18. package/dist/rsuite-rtl.min.css +1 -1
  19. package/dist/rsuite-rtl.min.css.map +1 -1
  20. package/dist/rsuite.css +38 -5
  21. package/dist/rsuite.js +18 -7
  22. package/dist/rsuite.js.map +1 -1
  23. package/dist/rsuite.min.css +1 -1
  24. package/dist/rsuite.min.css.map +1 -1
  25. package/dist/rsuite.min.js +1 -1
  26. package/dist/rsuite.min.js.map +1 -1
  27. package/esm/Button/Button.d.ts +4 -0
  28. package/esm/Button/Button.js +18 -9
  29. package/esm/Message/Message.d.ts +4 -0
  30. package/esm/Message/Message.js +8 -3
  31. package/esm/Notification/Notification.d.ts +3 -0
  32. package/esm/Notification/Notification.js +8 -3
  33. package/esm/Schema/Schema.d.ts +2 -1
  34. package/esm/Schema/Schema.js +3 -2
  35. package/esm/toaster/ToastContainer.d.ts +6 -1
  36. package/esm/toaster/ToastContainer.js +11 -5
  37. package/esm/toaster/ToastContext.d.ts +6 -0
  38. package/esm/toaster/ToastContext.js +6 -0
  39. package/esm/toaster/toaster.js +7 -5
  40. package/esm/toaster/useToaster.js +1 -1
  41. package/package.json +1 -1
  42. package/styles/variables.less +3 -0
@@ -8,7 +8,8 @@
8
8
 
9
9
  // Default Button
10
10
  .rs-btn {
11
- display: inline-block;
11
+ display: inline-flex;
12
+ align-items: center;
12
13
  margin-bottom: 0; // For input.btn
13
14
  font-weight: @btn-font-weight;
14
15
  text-align: center;
@@ -52,6 +53,16 @@
52
53
  .with-ripple();
53
54
  }
54
55
 
56
+ .rs-btn-start-icon {
57
+ line-height: 0; // Eliminate whitespace
58
+ margin-right: @btn-icon-gap;
59
+ }
60
+
61
+ .rs-btn-end-icon {
62
+ line-height: 0; // Eliminate whitespace
63
+ margin-left: @btn-icon-gap;
64
+ }
65
+
55
66
  // Appearance variants
56
67
  // --------------------------------------------------
57
68
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ # [5.27.0](https://github.com/rsuite/rsuite/compare/v5.26.1...v5.27.0) (2023-02-17)
2
+
3
+ ### Bug Fixes
4
+
5
+ - **Message,Notification:** duration property migrated to `toaster.push` option ([#3065](https://github.com/rsuite/rsuite/issues/3065)) ([f18cc32](https://github.com/rsuite/rsuite/commit/f18cc32e4822fa3596b350efe0dc31f286b3918b))
6
+ - **Schema:** add missing Types.MixedType ([#3058](https://github.com/rsuite/rsuite/issues/3058)) ([b6c9654](https://github.com/rsuite/rsuite/commit/b6c965449f5eb1d13b72b02cfd16f454bc942c90))
7
+
8
+ ### Features
9
+
10
+ - **Button:** add startIcon and endIcon props ([#3067](https://github.com/rsuite/rsuite/issues/3067)) ([d3e967e](https://github.com/rsuite/rsuite/commit/d3e967e3be84ab6f76eb5a2415989a4f592c6674))
11
+
1
12
  ## [5.26.1](https://github.com/rsuite/rsuite/compare/v5.26.0...v5.26.1) (2023-02-09)
2
13
 
3
14
  ### Bug Fixes
@@ -21,6 +21,10 @@ export interface ButtonProps extends WithAsProps, React.HTMLAttributes<HTMLEleme
21
21
  disabled?: boolean;
22
22
  /** Ripple after button click */
23
23
  ripple?: boolean;
24
+ /** The icon element placed _before_ the button text */
25
+ startIcon?: React.ReactNode;
26
+ /** The icon element placed _after_ the button text */
27
+ endIcon?: React.ReactNode;
24
28
  /** Defines HTML button type attribute */
25
29
  type?: 'button' | 'reset' | 'submit';
26
30
  }
@@ -25,7 +25,7 @@ var _Ripple = _interopRequireDefault(require("../Ripple"));
25
25
 
26
26
  var _utils = require("../utils");
27
27
 
28
- var _templateObject;
28
+ var _templateObject, _templateObject2, _templateObject3;
29
29
 
30
30
  var Button = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
31
31
  var as = props.as,
@@ -43,8 +43,10 @@ var Button = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
43
43
  _props$ripple = props.ripple,
44
44
  ripple = _props$ripple === void 0 ? true : _props$ripple,
45
45
  sizeProp = props.size,
46
+ startIcon = props.startIcon,
47
+ endIcon = props.endIcon,
46
48
  typeProp = props.type,
47
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "active", "appearance", "block", "className", "children", "classPrefix", "color", "disabled", "loading", "ripple", "size", "type"]);
49
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "active", "appearance", "block", "className", "children", "classPrefix", "color", "disabled", "loading", "ripple", "size", "startIcon", "endIcon", "type"]);
48
50
  var buttonGroup = (0, _react.useContext)(_ButtonGroup.ButtonGroupContext);
49
51
  var size = sizeProp !== null && sizeProp !== void 0 ? sizeProp : buttonGroup === null || buttonGroup === void 0 ? void 0 : buttonGroup.size;
50
52
 
@@ -59,11 +61,18 @@ var Button = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
59
61
  loading: loading,
60
62
  block: block
61
63
  }));
62
- var rippleElement = ripple && !(0, _utils.isOneOf)(appearance, ['link', 'ghost']) ? /*#__PURE__*/_react.default.createElement(_Ripple.default, null) : null;
63
-
64
- var spin = /*#__PURE__*/_react.default.createElement("span", {
65
- className: prefix(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["spin"])))
66
- });
64
+ var renderButtonContent = (0, _react.useCallback)(function () {
65
+ var spin = /*#__PURE__*/_react.default.createElement("span", {
66
+ className: prefix(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["spin"])))
67
+ });
68
+
69
+ var rippleElement = ripple && !(0, _utils.isOneOf)(appearance, ['link', 'ghost']) ? /*#__PURE__*/_react.default.createElement(_Ripple.default, null) : null;
70
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, loading && spin, startIcon ? /*#__PURE__*/_react.default.createElement("span", {
71
+ className: prefix(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteralLoose2.default)(["start-icon"])))
72
+ }, startIcon) : null, children, endIcon ? /*#__PURE__*/_react.default.createElement("span", {
73
+ className: prefix(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteralLoose2.default)(["end-icon"])))
74
+ }, endIcon) : null, rippleElement);
75
+ }, [appearance, children, endIcon, loading, prefix, ripple, startIcon]);
67
76
 
68
77
  if (rest.href) {
69
78
  return /*#__PURE__*/_react.default.createElement(_SafeAnchor.default, (0, _extends2.default)({}, rest, {
@@ -72,7 +81,7 @@ var Button = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
72
81
  "aria-disabled": disabled,
73
82
  disabled: disabled,
74
83
  className: classes
75
- }), loading && spin, children, rippleElement);
84
+ }), renderButtonContent());
76
85
  }
77
86
 
78
87
  var Component = as || 'button';
@@ -85,7 +94,7 @@ var Button = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
85
94
  disabled: disabled,
86
95
  "aria-disabled": disabled,
87
96
  className: classes
88
- }), loading && spin, children, rippleElement);
97
+ }), renderButtonContent());
89
98
  });
90
99
 
91
100
  Button.displayName = 'Button';
@@ -9,6 +9,10 @@ export interface MessageProps extends WithAsProps {
9
9
  * Delay automatic removal of messages.
10
10
  * When set to 0, the message is not automatically removed.
11
11
  * (Unit: milliseconds)
12
+ *
13
+ * @default 2000
14
+ * @deprecated Use `toaster.push(<Message />, { duration: 2000 })` instead.
15
+ *
12
16
  */
13
17
  duration?: number;
14
18
  /** The title of the message */
@@ -21,6 +21,8 @@ var _utils = require("../utils");
21
21
 
22
22
  var _CloseButton = _interopRequireDefault(require("../CloseButton"));
23
23
 
24
+ var _ToastContext = _interopRequireDefault(require("../toaster/ToastContext"));
25
+
24
26
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
25
27
 
26
28
  var Message = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
@@ -52,9 +54,13 @@ var Message = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
52
54
  merge = _useClassNames.merge,
53
55
  prefix = _useClassNames.prefix;
54
56
 
55
- var isMounted = (0, _utils.useIsMounted)(); // Timed close message
57
+ var isMounted = (0, _utils.useIsMounted)();
58
+
59
+ var _useContext = (0, _react.useContext)(_ToastContext.default),
60
+ usedToaster = _useContext.usedToaster; // Timed close message
61
+
56
62
 
57
- var _useTimeout = (0, _utils.useTimeout)(onClose, duration, duration > 0),
63
+ var _useTimeout = (0, _utils.useTimeout)(onClose, duration, usedToaster && duration > 0),
58
64
  clear = _useTimeout.clear;
59
65
 
60
66
  var handleClose = (0, _react.useCallback)(function (event) {
@@ -8,6 +8,9 @@ export interface NotificationProps extends WithAsProps {
8
8
  * Delay automatic removal of messages.
9
9
  * When set to 0, the message is not automatically removed.
10
10
  * (Unit: milliseconds)
11
+ *
12
+ * @default 4500
13
+ * @deprecated Use `toaster.push(<Notification />, { duration: 4500 })` instead.
11
14
  */
12
15
  duration?: number;
13
16
  /**
@@ -21,6 +21,8 @@ var _utils = require("../utils");
21
21
 
22
22
  var _CloseButton = _interopRequireDefault(require("../CloseButton"));
23
23
 
24
+ var _ToastContext = _interopRequireDefault(require("../toaster/ToastContext"));
25
+
24
26
  var _templateObject, _templateObject2;
25
27
 
26
28
  var Notification = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
@@ -47,9 +49,13 @@ var Notification = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
47
49
  merge = _useClassNames.merge,
48
50
  prefix = _useClassNames.prefix;
49
51
 
50
- var isMounted = (0, _utils.useIsMounted)(); // Timed close message
52
+ var isMounted = (0, _utils.useIsMounted)();
53
+
54
+ var _useContext = (0, _react.useContext)(_ToastContext.default),
55
+ usedToaster = _useContext.usedToaster; // Timed close message
56
+
51
57
 
52
- var _useTimeout = (0, _utils.useTimeout)(onClose, duration, duration > 0),
58
+ var _useTimeout = (0, _utils.useTimeout)(onClose, duration, usedToaster && duration > 0),
53
59
  clear = _useTimeout.clear; // Click to trigger to close the message
54
60
 
55
61
 
@@ -1,4 +1,4 @@
1
- import { SchemaModel, StringType, NumberType, ArrayType, DateType, ObjectType, BooleanType } from 'schema-typed';
1
+ import { SchemaModel, StringType, NumberType, ArrayType, DateType, ObjectType, BooleanType, MixedType } from 'schema-typed';
2
2
  declare const SchemaTyped: {
3
3
  Model: typeof SchemaModel;
4
4
  Types: {
@@ -8,6 +8,7 @@ declare const SchemaTyped: {
8
8
  DateType: typeof DateType;
9
9
  ObjectType: typeof ObjectType;
10
10
  BooleanType: typeof BooleanType;
11
+ MixedType: typeof MixedType;
11
12
  };
12
13
  };
13
14
  export default SchemaTyped;
@@ -13,7 +13,8 @@ var SchemaTyped = {
13
13
  ArrayType: _schemaTyped.ArrayType,
14
14
  DateType: _schemaTyped.DateType,
15
15
  ObjectType: _schemaTyped.ObjectType,
16
- BooleanType: _schemaTyped.BooleanType
16
+ BooleanType: _schemaTyped.BooleanType,
17
+ MixedType: _schemaTyped.MixedType
17
18
  }
18
19
  };
19
20
  var _default = SchemaTyped;
@@ -7,11 +7,16 @@ export interface ToastContainerProps extends WithAsProps {
7
7
  placement?: PlacementType;
8
8
  /** Set the message to appear in the specified container */
9
9
  container?: HTMLElement | (() => HTMLElement);
10
+ /** The number of milliseconds to wait before automatically closing a message. */
11
+ duration?: number;
10
12
  callback?: (ref: React.RefObject<ToastContainerInstance>) => void;
11
13
  }
14
+ interface PushOptions {
15
+ duration?: number;
16
+ }
12
17
  export interface ToastContainerInstance {
13
18
  root: HTMLElement;
14
- push: (message: React.ReactNode) => string;
19
+ push: (message: React.ReactNode, options?: PushOptions) => string;
15
20
  remove: (key: string) => void;
16
21
  clear: () => void;
17
22
  destroy: () => void;
@@ -21,6 +21,8 @@ var _Transition = _interopRequireDefault(require("../Animation/Transition"));
21
21
 
22
22
  var _utils = require("../utils");
23
23
 
24
+ var _ToastContext = _interopRequireDefault(require("./ToastContext"));
25
+
24
26
  var toastPlacements = ['topCenter', 'bottomCenter', 'topStart', 'topEnd', 'bottomStart', 'bottomEnd'];
25
27
  exports.toastPlacements = toastPlacements;
26
28
 
@@ -36,14 +38,14 @@ var useMessages = function useMessages() {
36
38
 
37
39
  return key;
38
40
  }, [messages]);
39
- var push = (0, _react.useCallback)(function (message) {
41
+ var push = (0, _react.useCallback)(function (message, options) {
40
42
  var key = (0, _utils.guid)();
41
43
  setMessages(function (prevMessages) {
42
- return [].concat(prevMessages, [{
44
+ return [].concat(prevMessages, [(0, _extends2.default)({
43
45
  key: key,
44
46
  visible: true,
45
47
  node: message
46
- }]);
48
+ }, options)]);
47
49
  });
48
50
  return key;
49
51
  }, []);
@@ -133,6 +135,7 @@ var ToastContainer = /*#__PURE__*/_react.default.forwardRef(function (props, ref
133
135
  rest = (0, _objectWithoutPropertiesLoose2.default)(transitionProps, ["className"]);
134
136
  return /*#__PURE__*/_react.default.cloneElement(item.node, (0, _extends2.default)({}, rest, {
135
137
  ref: ref,
138
+ duration: item.duration,
136
139
  // Remove the message after the specified time.
137
140
  onClose: (0, _utils.createChainedFunction)((_item$node = item.node) === null || _item$node === void 0 ? void 0 : (_item$node$props = _item$node.props) === null || _item$node$props === void 0 ? void 0 : _item$node$props.onClose, function () {
138
141
  return remove(item.key);
@@ -141,13 +144,17 @@ var ToastContainer = /*#__PURE__*/_react.default.forwardRef(function (props, ref
141
144
  }));
142
145
  });
143
146
  });
144
- return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, rest, {
147
+ return /*#__PURE__*/_react.default.createElement(_ToastContext.default.Provider, {
148
+ value: {
149
+ usedToaster: true
150
+ }
151
+ }, /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, rest, {
145
152
  ref: function ref(selfRef) {
146
153
  rootRef.current = selfRef;
147
154
  callback === null || callback === void 0 ? void 0 : callback(selfRef);
148
155
  },
149
156
  className: classes
150
- }), elements);
157
+ }), elements));
151
158
  });
152
159
 
153
160
  ToastContainer.getInstance = function (props) {
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface ToastContextProps {
3
+ usedToaster?: boolean;
4
+ }
5
+ declare const ToastContext: React.Context<ToastContextProps>;
6
+ export default ToastContext;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ exports.__esModule = true;
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var ToastContext = /*#__PURE__*/_react.default.createContext({
11
+ usedToaster: false
12
+ });
13
+
14
+ ToastContext.displayName = 'ToastContext';
15
+ var _default = ToastContext;
16
+ exports.default = _default;
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
 
10
+ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
+
10
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
13
 
12
14
  var _ToastContainer = _interopRequireDefault(require("./ToastContainer"));
@@ -68,23 +70,23 @@ var toaster = function toaster(message) {
68
70
  };
69
71
 
70
72
  toaster.push = function (message, options) {
71
- var _options;
72
-
73
73
  if (options === void 0) {
74
74
  options = {};
75
75
  }
76
76
 
77
- var containerId = (_options = options) === null || _options === void 0 ? void 0 : _options.placement;
77
+ var _options = options,
78
+ containerId = _options.placement,
79
+ restOptions = (0, _objectWithoutPropertiesLoose2.default)(_options, ["placement"]);
78
80
  var container = getContainer(containerId);
79
81
 
80
82
  if (container !== null && container !== void 0 && container.current) {
81
- return container.current.push(message);
83
+ return container.current.push(message, restOptions);
82
84
  }
83
85
 
84
86
  return createContainer(containerId !== null && containerId !== void 0 ? containerId : '', options).then(function (ref) {
85
87
  var _ref$current;
86
88
 
87
- return (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.push(message);
89
+ return (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.push(message, restOptions);
88
90
  });
89
91
  };
90
92
 
@@ -22,7 +22,7 @@ var useToaster = function useToaster() {
22
22
  var _toasters$current;
23
23
 
24
24
  var customToaster = toasters === null || toasters === void 0 ? void 0 : (_toasters$current = toasters.current) === null || _toasters$current === void 0 ? void 0 : _toasters$current.get((options === null || options === void 0 ? void 0 : options.placement) || 'topCenter');
25
- return customToaster ? customToaster.push(message) : _toaster.default.push(message, options);
25
+ return customToaster ? customToaster.push(message, options) : _toaster.default.push(message, options);
26
26
  },
27
27
  remove: function remove(key) {
28
28
  toasters ? Array.from(toasters.current).forEach(function (_ref) {
@@ -1849,7 +1849,12 @@ tbody.rs-anim-collapse.rs-anim-in {
1849
1849
  margin: 0 4px;
1850
1850
  }
1851
1851
  .rs-btn {
1852
- display: inline-block;
1852
+ display: -webkit-inline-box;
1853
+ display: -ms-inline-flexbox;
1854
+ display: inline-flex;
1855
+ -webkit-box-align: center;
1856
+ -ms-flex-align: center;
1857
+ align-items: center;
1853
1858
  margin-bottom: 0;
1854
1859
  font-weight: normal;
1855
1860
  text-align: center;
@@ -1954,6 +1959,14 @@ tbody.rs-anim-collapse.rs-anim-in {
1954
1959
  /* stylelint-enable */
1955
1960
  }
1956
1961
  }
1962
+ .rs-btn-start-icon {
1963
+ line-height: 0;
1964
+ margin-left: 5px;
1965
+ }
1966
+ .rs-btn-end-icon {
1967
+ line-height: 0;
1968
+ margin-right: 5px;
1969
+ }
1957
1970
  .rs-btn-primary {
1958
1971
  color: #fff;
1959
1972
  color: var(--rs-btn-primary-text);
@@ -10398,7 +10411,12 @@ textarea.rs-picker-search-input {
10398
10411
  padding: 1px 7px;
10399
10412
  }
10400
10413
  .rs-pagination-btn {
10401
- display: inline-block;
10414
+ display: -webkit-inline-box;
10415
+ display: -ms-inline-flexbox;
10416
+ display: inline-flex;
10417
+ -webkit-box-align: center;
10418
+ -ms-flex-align: center;
10419
+ align-items: center;
10402
10420
  margin-bottom: 0;
10403
10421
  font-weight: normal;
10404
10422
  text-align: center;
@@ -10853,7 +10871,12 @@ textarea.rs-picker-search-input {
10853
10871
  box-shadow: var(--rs-state-focus-shadow);
10854
10872
  }
10855
10873
  .rs-picker-toggle {
10856
- display: inline-block;
10874
+ display: -webkit-inline-box;
10875
+ display: -ms-inline-flexbox;
10876
+ display: inline-flex;
10877
+ -webkit-box-align: center;
10878
+ -ms-flex-align: center;
10879
+ align-items: center;
10857
10880
  margin-bottom: 0;
10858
10881
  font-weight: normal;
10859
10882
  text-align: center;
@@ -12775,7 +12798,12 @@ textarea.rs-picker-menu .rs-picker-search-bar .rs-picker-search-bar-input {
12775
12798
  display: none;
12776
12799
  }
12777
12800
  .rs-radio-group-picker .rs-radio-checker > label {
12778
- display: inline-block;
12801
+ display: -webkit-inline-box;
12802
+ display: -ms-inline-flexbox;
12803
+ display: inline-flex;
12804
+ -webkit-box-align: center;
12805
+ -ms-flex-align: center;
12806
+ align-items: center;
12779
12807
  margin-bottom: 0;
12780
12808
  font-weight: normal;
12781
12809
  text-align: center;
@@ -15957,7 +15985,12 @@ textarea.rs-picker-menu .rs-picker-search-bar .rs-picker-search-bar-input {
15957
15985
  clear: both;
15958
15986
  }
15959
15987
  .rs-uploader-picture .rs-uploader-trigger-btn {
15960
- display: inline-block;
15988
+ display: -webkit-inline-box;
15989
+ display: -ms-inline-flexbox;
15990
+ display: inline-flex;
15991
+ -webkit-box-align: center;
15992
+ -ms-flex-align: center;
15993
+ align-items: center;
15961
15994
  margin-bottom: 0;
15962
15995
  font-weight: normal;
15963
15996
  text-align: center;