@trionesdev/antd-mobile-react 0.0.2-beta.12 → 0.0.2-beta.14
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.
- package/dist/Calendar/calendar-grid.d.ts +10 -9
- package/dist/Calendar/calendar-grid.js +41 -64
- package/dist/Calendar/calendar-header.d.ts +3 -2
- package/dist/Calendar/calendar-header.js +6 -6
- package/dist/Calendar/calendar-range.d.ts +4 -3
- package/dist/Calendar/calendar-range.js +12 -11
- package/dist/Calendar/calendar.d.ts +5 -4
- package/dist/Calendar/calendar.js +23 -15
- package/dist/Calendar/touchable-calendar-grid.d.ts +6 -5
- package/dist/Calendar/touchable-calendar-grid.js +58 -50
- package/dist/CalendarDatetimePicker/CalendarDatetimePicker.d.ts +8 -6
- package/dist/CalendarDatetimePicker/CalendarDatetimePicker.js +123 -42
- package/dist/{CalendarDatetimePopup → CalendarDatetimePicker}/DateTimeSwitch.d.ts +3 -2
- package/dist/{CalendarDatetimePopup → CalendarDatetimePicker}/DateTimeSwitch.js +4 -3
- package/dist/CalendarDatetimePicker/demo/base.js +21 -5
- package/dist/CalendarDatetimePicker/index.d.ts +2 -2
- package/dist/CalendarDatetimePicker/style.scss +50 -6
- package/dist/CalendarDatetimePicker/types.d.ts +5 -1
- package/dist/CalendarDatetimePicker/types.js +6 -1
- package/dist/CalendarDatetimePickerCell/CalendarDatetimePickerCell.d.ts +10 -0
- package/dist/CalendarDatetimePickerCell/CalendarDatetimePickerCell.js +60 -0
- package/dist/{CalendarDatetimePopup → CalendarDatetimePickerCell}/demo/base.js +5 -22
- package/dist/CalendarDatetimePickerCell/index.d.ts +3 -0
- package/dist/CalendarDatetimePickerCell/index.js +2 -0
- package/dist/CalendarDatetimePickerCell/style.scss +10 -0
- package/dist/CalendarDatetimePickerCell/types.d.ts +1 -0
- package/dist/CalendarDatetimePickerCell/types.js +1 -0
- package/dist/CalendarPicker/calendar-picker.d.ts +4 -0
- package/dist/{CalendarPopup/calendar-popup.js → CalendarPicker/calendar-picker.js} +4 -4
- package/dist/CalendarPicker/calendar-range-picker.d.ts +4 -0
- package/dist/{CalendarPopup/calendar-range-popup.js → CalendarPicker/calendar-range-picker.js} +7 -6
- package/dist/{CalendarPopup → CalendarPicker}/demo/base.js +3 -3
- package/dist/CalendarPicker/index.d.ts +9 -0
- package/dist/CalendarPicker/index.js +5 -0
- package/dist/{CalendarPopup → CalendarPicker}/style.scss +2 -2
- package/dist/{CalendarPopup → CalendarPicker}/types.d.ts +9 -8
- package/dist/CalendarPickerCell/CalendarPickerCell.d.ts +11 -0
- package/dist/CalendarPickerCell/CalendarPickerCell.js +54 -0
- package/dist/CalendarPickerCell/CalendarRangePickerCell.d.ts +11 -0
- package/dist/CalendarPickerCell/CalendarRangePickerCell.js +56 -0
- package/dist/CalendarPickerCell/demo/base.d.ts +3 -0
- package/dist/CalendarPickerCell/demo/base.js +33 -0
- package/dist/CalendarPickerCell/index.d.ts +8 -0
- package/dist/CalendarPickerCell/index.js +5 -0
- package/dist/{CascaderPopup/cascader-popup.d.ts → CascaderPicker/cascader-picker.d.ts} +2 -2
- package/dist/{CascaderPopup/cascader-popup.js → CascaderPicker/cascader-picker.js} +8 -8
- package/dist/CascaderPicker/demo/base.js +16 -7
- package/dist/CascaderPicker/index.d.ts +1 -1
- package/dist/CascaderPicker/index.js +1 -1
- package/dist/CascaderPicker/style.scss +33 -12
- package/dist/{CascaderPicker/CascaderPicker.d.ts → CascaderPickerCell/CascaderPickerCell.d.ts} +4 -8
- package/dist/{CascaderPicker/CascaderPicker.js → CascaderPickerCell/CascaderPickerCell.js} +7 -15
- package/dist/{CascaderPopup → CascaderPickerCell}/demo/base.js +6 -16
- package/dist/CascaderPickerCell/index.d.ts +3 -0
- package/dist/CascaderPickerCell/index.js +2 -0
- package/dist/CascaderPickerCell/style.scss +24 -0
- package/dist/FloatButton/FloatButton.d.ts +21 -0
- package/dist/FloatButton/FloatButton.js +66 -0
- package/dist/FloatButton/FloatButtonGroup.d.ts +21 -0
- package/dist/FloatButton/FloatButtonGroup.js +120 -0
- package/dist/FloatButton/context.d.ts +13 -0
- package/dist/FloatButton/context.js +2 -0
- package/dist/FloatButton/demo/base.d.ts +3 -0
- package/dist/FloatButton/demo/base.js +10 -0
- package/dist/FloatButton/demo/group.d.ts +3 -0
- package/dist/FloatButton/demo/group.js +20 -0
- package/dist/FloatButton/demo/square.d.ts +3 -0
- package/dist/FloatButton/demo/square.js +12 -0
- package/dist/FloatButton/index.d.ts +10 -0
- package/dist/FloatButton/index.js +5 -0
- package/dist/FloatButton/style.scss +123 -0
- package/dist/Picker/picker.d.ts +1 -0
- package/dist/Picker/picker.js +3 -6
- package/dist/Segmented/demo/base.d.ts +3 -0
- package/dist/Segmented/demo/base.js +33 -0
- package/dist/Segmented/index.d.ts +3 -0
- package/dist/Segmented/index.js +2 -0
- package/dist/index.d.ts +14 -6
- package/dist/index.js +7 -3
- package/dist/utils/dayjs.d.ts +4 -0
- package/dist/utils/dayjs.js +42 -0
- package/package.json +4 -4
- package/dist/CalendarDatetimePopup/CalendarDatetimePopup.d.ts +0 -10
- package/dist/CalendarDatetimePopup/CalendarDatetimePopup.js +0 -142
- package/dist/CalendarDatetimePopup/index.d.ts +0 -3
- package/dist/CalendarDatetimePopup/index.js +0 -2
- package/dist/CalendarDatetimePopup/style.scss +0 -54
- package/dist/CalendarDatetimePopup/types.d.ts +0 -5
- package/dist/CalendarDatetimePopup/types.js +0 -6
- package/dist/CalendarPopup/calendar-popup.d.ts +0 -4
- package/dist/CalendarPopup/calendar-range-popup.d.ts +0 -4
- package/dist/CalendarPopup/index.d.ts +0 -9
- package/dist/CalendarPopup/index.js +0 -5
- package/dist/CascaderPopup/index.d.ts +0 -3
- package/dist/CascaderPopup/index.js +0 -2
- package/dist/CascaderPopup/style.scss +0 -45
- /package/dist/{CalendarDatetimePopup → CalendarDatetimePickerCell}/demo/base.d.ts +0 -0
- /package/dist/{CalendarPopup → CalendarPicker}/demo/base.d.ts +0 -0
- /package/dist/{CalendarPopup → CalendarPicker}/types.js +0 -0
- /package/dist/{CascaderPopup → CascaderPickerCell}/demo/base.d.ts +0 -0
|
@@ -1,24 +1,45 @@
|
|
|
1
1
|
@use "../style/variable" as variable;
|
|
2
2
|
$cascaderPickerCls: 'triones-antm-cascader-picker';
|
|
3
3
|
|
|
4
|
-
.#{$cascaderPickerCls}{
|
|
4
|
+
.#{$cascaderPickerCls} {
|
|
5
5
|
width: 100%;
|
|
6
|
-
|
|
6
|
+
height: 300Px;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
position: relative;
|
|
7
9
|
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
8
11
|
|
|
9
|
-
&-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
&-header {
|
|
13
|
+
display: flex;
|
|
14
|
+
justify-content: space-between;
|
|
15
|
+
align-items: center;
|
|
16
|
+
border-bottom: 1Px solid variable.$trionesBorderColor;
|
|
17
|
+
padding: 4Px;
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
&-button {
|
|
20
|
+
|
|
21
|
+
padding: 8Px;
|
|
22
|
+
font-size: 12Px;
|
|
23
|
+
&-cancel{
|
|
24
|
+
color: variable.$trionesColorTextSecondary;
|
|
25
|
+
}
|
|
26
|
+
&-ok{
|
|
27
|
+
color: variable.$trionesColorPrimary;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
16
30
|
|
|
17
|
-
|
|
18
|
-
|
|
31
|
+
&-title {
|
|
32
|
+
}
|
|
19
33
|
}
|
|
20
34
|
|
|
21
|
-
&-
|
|
22
|
-
|
|
35
|
+
&-body {
|
|
36
|
+
flex: 1 1;
|
|
37
|
+
width: 100%;
|
|
38
|
+
pointer-events: unset;
|
|
39
|
+
overflow: hidden;
|
|
23
40
|
}
|
|
41
|
+
&-view{
|
|
42
|
+
--height: 100%;
|
|
43
|
+
}
|
|
44
|
+
|
|
24
45
|
}
|
package/dist/{CascaderPicker/CascaderPicker.d.ts → CascaderPickerCell/CascaderPickerCell.d.ts}
RENAMED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { FC } from "react";
|
|
2
2
|
import "./style.scss";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { CellProps } from "../Cell";
|
|
4
|
+
export type CascaderPickerCellProps = Omit<CellProps, 'value'> & {
|
|
5
5
|
onChange?: (value: any[]) => void;
|
|
6
|
-
align?: 'left' | 'right' | 'center';
|
|
7
|
-
className?: string;
|
|
8
|
-
style?: React.CSSProperties;
|
|
9
|
-
title?: React.ReactNode;
|
|
10
6
|
options?: any[];
|
|
11
7
|
/**
|
|
12
8
|
* @description 是否把每个选项的 label 包装到 value 中,会把 Select 的 value 类型从 string 变为 { value: string, label: ReactNode } 的格式
|
|
@@ -22,4 +18,4 @@ export type CascaderPickerProps = {
|
|
|
22
18
|
value?: any[];
|
|
23
19
|
asyncRequest?: (parentValue?: any) => Promise<any>;
|
|
24
20
|
};
|
|
25
|
-
export declare const
|
|
21
|
+
export declare const CascaderPickerCell: FC<CascaderPickerCellProps>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
var _excluded = ["
|
|
2
|
+
var _excluded = ["onChange", "value", "labelInValue"];
|
|
3
3
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
4
4
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
5
5
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
@@ -15,17 +15,12 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
|
|
|
15
15
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
16
16
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
17
17
|
import React, { useEffect, useState } from "react";
|
|
18
|
-
import
|
|
19
|
-
import { isEmpty } from "lodash-es";
|
|
20
|
-
import CascaderPopup from "../CascaderPopup";
|
|
18
|
+
import CascaderPopup from "../CascaderPicker";
|
|
21
19
|
import "./style.scss";
|
|
20
|
+
import Cell from "../Cell";
|
|
22
21
|
var cls = 'triones-antm-cascader-picker';
|
|
23
|
-
export var
|
|
24
|
-
var
|
|
25
|
-
placeholder = _ref$placeholder === void 0 ? '请选择' : _ref$placeholder,
|
|
26
|
-
onChange = _ref.onChange,
|
|
27
|
-
_ref$align = _ref.align,
|
|
28
|
-
align = _ref$align === void 0 ? 'left' : _ref$align,
|
|
22
|
+
export var CascaderPickerCell = function CascaderPickerCell(_ref) {
|
|
23
|
+
var onChange = _ref.onChange,
|
|
29
24
|
value = _ref.value,
|
|
30
25
|
_ref$labelInValue = _ref.labelInValue,
|
|
31
26
|
labelInValue = _ref$labelInValue === void 0 ? true : _ref$labelInValue,
|
|
@@ -67,12 +62,9 @@ export var CascaderPicker = function CascaderPicker(_ref) {
|
|
|
67
62
|
setOpen(false);
|
|
68
63
|
onChange === null || onChange === void 0 || onChange(value || []);
|
|
69
64
|
}
|
|
70
|
-
})), /*#__PURE__*/React.createElement(
|
|
71
|
-
className: classNames(cls, "".concat(cls, "-").concat(align)),
|
|
65
|
+
})), /*#__PURE__*/React.createElement(Cell, _extends({
|
|
72
66
|
onClick: function onClick() {
|
|
73
67
|
setOpen(true);
|
|
74
68
|
}
|
|
75
|
-
},
|
|
76
|
-
className: "".concat(cls, "-placeholder")
|
|
77
|
-
}, placeholder) : /*#__PURE__*/React.createElement("div", null, valueText())));
|
|
69
|
+
}, rest), valueText()));
|
|
78
70
|
};
|
|
@@ -6,8 +6,7 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
|
|
|
6
6
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
7
|
import React from "react";
|
|
8
8
|
import { DemoBlock } from "../../DemoBlock";
|
|
9
|
-
import
|
|
10
|
-
import { CascaderPopup } from "../cascader-popup";
|
|
9
|
+
import CascaderPicker from "../index";
|
|
11
10
|
export default (function () {
|
|
12
11
|
var _React$useState = React.useState(false),
|
|
13
12
|
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
@@ -64,19 +63,10 @@ export default (function () {
|
|
|
64
63
|
}];
|
|
65
64
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DemoBlock, {
|
|
66
65
|
title: "\u57FA\u672C\u4F7F\u7528"
|
|
67
|
-
}, /*#__PURE__*/React.createElement(
|
|
68
|
-
open: open,
|
|
66
|
+
}, /*#__PURE__*/React.createElement(CascaderPicker, {
|
|
69
67
|
options: options,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
setOpen(false);
|
|
75
|
-
}
|
|
76
|
-
}), /*#__PURE__*/React.createElement(Button, {
|
|
77
|
-
block: true,
|
|
78
|
-
onClick: function onClick() {
|
|
79
|
-
setOpen(true);
|
|
80
|
-
}
|
|
81
|
-
}, "\u7EA7\u8054\u9009\u62E9")));
|
|
68
|
+
label: 'Label',
|
|
69
|
+
wrapperAlign: "right",
|
|
70
|
+
placeholder: '请选择'
|
|
71
|
+
})));
|
|
82
72
|
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
@use "../style/variable" as variable;
|
|
2
|
+
$cascaderPickerCls: 'triones-antm-cascader-picker';
|
|
3
|
+
|
|
4
|
+
.#{$cascaderPickerCls}{
|
|
5
|
+
width: 100%;
|
|
6
|
+
line-height: 1.4;
|
|
7
|
+
display: flex;
|
|
8
|
+
|
|
9
|
+
&-left {
|
|
10
|
+
justify-content: flex-start;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
&-center {
|
|
14
|
+
justify-content: center;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
&-right {
|
|
18
|
+
justify-content: flex-end;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
&-placeholder{
|
|
22
|
+
color: variable.$trionesColorTextPlaceholder;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React, { FC } from 'react';
|
|
2
|
+
import type { BadgeProps } from '@trionesdev/antd-mobile-base-react';
|
|
3
|
+
import './style.scss';
|
|
4
|
+
export type FloatButtonProps = {
|
|
5
|
+
icon?: React.ReactNode;
|
|
6
|
+
/** 文字等内容;仅建议在 `shape="square"` 时使用 */
|
|
7
|
+
content?: React.ReactNode;
|
|
8
|
+
type?: 'primary' | 'default';
|
|
9
|
+
shape?: 'circle' | 'square';
|
|
10
|
+
onClick?: (e: any) => void;
|
|
11
|
+
href?: string;
|
|
12
|
+
target?: string;
|
|
13
|
+
htmlType?: 'button' | 'submit' | 'reset';
|
|
14
|
+
badge?: Partial<BadgeProps>;
|
|
15
|
+
className?: string;
|
|
16
|
+
style?: React.CSSProperties;
|
|
17
|
+
right?: number;
|
|
18
|
+
bottom?: number;
|
|
19
|
+
zIndex?: number;
|
|
20
|
+
};
|
|
21
|
+
export declare const FloatButton: FC<FloatButtonProps>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
import classNames from 'classnames';
|
|
8
|
+
import React, { useContext } from 'react';
|
|
9
|
+
import { Badge } from '@trionesdev/antd-mobile-base-react';
|
|
10
|
+
import { FloatButtonGroupContext } from "./context";
|
|
11
|
+
import "./style.scss";
|
|
12
|
+
import { AddOutline } from '@trionesdev/antd-mobile-icons-react';
|
|
13
|
+
var cls = 'triones-antm-float-button';
|
|
14
|
+
export var FloatButton = function FloatButton(_ref) {
|
|
15
|
+
var _groupCtx$shape;
|
|
16
|
+
var icon = _ref.icon,
|
|
17
|
+
content = _ref.content,
|
|
18
|
+
_ref$type = _ref.type,
|
|
19
|
+
type = _ref$type === void 0 ? 'default' : _ref$type,
|
|
20
|
+
_ref$shape = _ref.shape,
|
|
21
|
+
shape = _ref$shape === void 0 ? 'circle' : _ref$shape,
|
|
22
|
+
onClick = _ref.onClick,
|
|
23
|
+
href = _ref.href,
|
|
24
|
+
target = _ref.target,
|
|
25
|
+
_ref$htmlType = _ref.htmlType,
|
|
26
|
+
htmlType = _ref$htmlType === void 0 ? 'button' : _ref$htmlType,
|
|
27
|
+
badge = _ref.badge,
|
|
28
|
+
className = _ref.className,
|
|
29
|
+
style = _ref.style,
|
|
30
|
+
right = _ref.right,
|
|
31
|
+
bottom = _ref.bottom,
|
|
32
|
+
zIndex = _ref.zIndex;
|
|
33
|
+
var groupCtx = useContext(FloatButtonGroupContext);
|
|
34
|
+
var mergedShape = (_groupCtx$shape = groupCtx === null || groupCtx === void 0 ? void 0 : groupCtx.shape) !== null && _groupCtx$shape !== void 0 ? _groupCtx$shape : shape;
|
|
35
|
+
var mergedContent = content;
|
|
36
|
+
var mergedIcon = icon !== null && icon !== void 0 ? icon : /*#__PURE__*/React.createElement(AddOutline, null);
|
|
37
|
+
var mergedRight = right !== null && right !== void 0 ? right : 24;
|
|
38
|
+
var mergedBottom = bottom !== null && bottom !== void 0 ? bottom : 24;
|
|
39
|
+
var mergedZIndex = zIndex !== null && zIndex !== void 0 ? zIndex : 100;
|
|
40
|
+
var rootClass = classNames(cls, "".concat(cls, "--type-").concat(type), "".concat(cls, "--shape-").concat(mergedShape), _defineProperty(_defineProperty({}, "".concat(cls, "--embedded"), groupCtx === null || groupCtx === void 0 ? void 0 : groupCtx.inGroup), "".concat(cls, "--has-content"), mergedShape === 'square' && mergedContent != null && mergedContent !== false), className);
|
|
41
|
+
var inner = /*#__PURE__*/React.createElement(React.Fragment, null, mergedIcon ? /*#__PURE__*/React.createElement("span", {
|
|
42
|
+
className: "".concat(cls, "-icon")
|
|
43
|
+
}, mergedIcon) : null, mergedShape === 'square' && mergedContent ? /*#__PURE__*/React.createElement("span", {
|
|
44
|
+
className: "".concat(cls, "-content")
|
|
45
|
+
}, mergedContent) : null);
|
|
46
|
+
var interactive = href ? /*#__PURE__*/React.createElement("a", {
|
|
47
|
+
className: "".concat(cls, "-body"),
|
|
48
|
+
href: href,
|
|
49
|
+
target: target,
|
|
50
|
+
rel: target === '_blank' ? 'noopener noreferrer' : undefined,
|
|
51
|
+
onClick: onClick
|
|
52
|
+
}, inner) : /*#__PURE__*/React.createElement("button", {
|
|
53
|
+
type: htmlType,
|
|
54
|
+
className: "".concat(cls, "-body"),
|
|
55
|
+
onClick: onClick
|
|
56
|
+
}, inner);
|
|
57
|
+
var withBadge = badge != null && Object.keys(badge).length > 0 ? /*#__PURE__*/React.createElement(Badge, badge, interactive) : interactive;
|
|
58
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
59
|
+
className: rootClass,
|
|
60
|
+
style: _objectSpread({
|
|
61
|
+
zIndex: groupCtx !== null && groupCtx !== void 0 && groupCtx.inGroup ? undefined : mergedZIndex,
|
|
62
|
+
right: groupCtx !== null && groupCtx !== void 0 && groupCtx.inGroup ? undefined : "".concat(mergedRight, "Px"),
|
|
63
|
+
bottom: groupCtx !== null && groupCtx !== void 0 && groupCtx.inGroup ? undefined : "calc(".concat(mergedBottom, "Px + env(safe-area-inset-bottom, 0px))")
|
|
64
|
+
}, style)
|
|
65
|
+
}, withBadge);
|
|
66
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React, { FC } from 'react';
|
|
2
|
+
import './style.scss';
|
|
3
|
+
export type FloatButtonGroupProps = {
|
|
4
|
+
shape?: 'circle' | 'square';
|
|
5
|
+
type?: 'primary' | 'default';
|
|
6
|
+
/** 菜单模式下主按钮图标(收起态) */
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
trigger?: 'click' | 'hover';
|
|
9
|
+
open?: boolean;
|
|
10
|
+
onOpenChange?: (open: boolean) => void;
|
|
11
|
+
closeIcon?: React.ReactNode;
|
|
12
|
+
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
13
|
+
onClick?: (e: React.MouseEvent) => void;
|
|
14
|
+
className?: string;
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
children?: React.ReactNode;
|
|
17
|
+
right?: number;
|
|
18
|
+
bottom?: number;
|
|
19
|
+
zIndex?: number;
|
|
20
|
+
};
|
|
21
|
+
export declare const FloatButtonGroup: FC<FloatButtonGroupProps>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
8
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
9
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
10
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
11
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
12
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
13
|
+
import classNames from 'classnames';
|
|
14
|
+
import { CloseOutline } from "@trionesdev/antd-mobile-icons-react";
|
|
15
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
16
|
+
import { FloatButton } from "./FloatButton";
|
|
17
|
+
import { FloatButtonGroupContext } from "./context";
|
|
18
|
+
import "./style.scss";
|
|
19
|
+
var groupCls = 'triones-antm-float-button-group';
|
|
20
|
+
export var FloatButtonGroup = function FloatButtonGroup(_ref) {
|
|
21
|
+
var _ref$shape = _ref.shape,
|
|
22
|
+
shape = _ref$shape === void 0 ? 'circle' : _ref$shape,
|
|
23
|
+
_ref$type = _ref.type,
|
|
24
|
+
type = _ref$type === void 0 ? 'default' : _ref$type,
|
|
25
|
+
icon = _ref.icon,
|
|
26
|
+
trigger = _ref.trigger,
|
|
27
|
+
openProp = _ref.open,
|
|
28
|
+
onOpenChange = _ref.onOpenChange,
|
|
29
|
+
closeIcon = _ref.closeIcon,
|
|
30
|
+
_ref$placement = _ref.placement,
|
|
31
|
+
placement = _ref$placement === void 0 ? 'top' : _ref$placement,
|
|
32
|
+
onClick = _ref.onClick,
|
|
33
|
+
className = _ref.className,
|
|
34
|
+
style = _ref.style,
|
|
35
|
+
children = _ref.children,
|
|
36
|
+
_ref$right = _ref.right,
|
|
37
|
+
right = _ref$right === void 0 ? 24 : _ref$right,
|
|
38
|
+
_ref$bottom = _ref.bottom,
|
|
39
|
+
bottom = _ref$bottom === void 0 ? 24 : _ref$bottom,
|
|
40
|
+
_ref$zIndex = _ref.zIndex,
|
|
41
|
+
zIndex = _ref$zIndex === void 0 ? 100 : _ref$zIndex;
|
|
42
|
+
var rootRef = useRef(null);
|
|
43
|
+
var isMenu = trigger === 'click' || trigger === 'hover';
|
|
44
|
+
var _useState = useState(false),
|
|
45
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
46
|
+
uncontrolledOpen = _useState2[0],
|
|
47
|
+
setUncontrolledOpen = _useState2[1];
|
|
48
|
+
var mergedOpen = openProp !== null && openProp !== void 0 ? openProp : uncontrolledOpen;
|
|
49
|
+
var setOpen = useCallback(function (next) {
|
|
50
|
+
if (openProp === undefined) {
|
|
51
|
+
setUncontrolledOpen(next);
|
|
52
|
+
}
|
|
53
|
+
onOpenChange === null || onOpenChange === void 0 || onOpenChange(next);
|
|
54
|
+
}, [openProp, onOpenChange]);
|
|
55
|
+
var triggerOpen = useCallback(function (next) {
|
|
56
|
+
if (mergedOpen !== next) {
|
|
57
|
+
setOpen(next);
|
|
58
|
+
}
|
|
59
|
+
}, [mergedOpen, setOpen]);
|
|
60
|
+
useEffect(function () {
|
|
61
|
+
if (!isMenu || trigger !== 'click') return;
|
|
62
|
+
var onDoc = function onDoc(e) {
|
|
63
|
+
var _rootRef$current;
|
|
64
|
+
if ((_rootRef$current = rootRef.current) !== null && _rootRef$current !== void 0 && _rootRef$current.contains(e.target)) return;
|
|
65
|
+
triggerOpen(false);
|
|
66
|
+
};
|
|
67
|
+
document.addEventListener('click', onDoc, true);
|
|
68
|
+
return function () {
|
|
69
|
+
return document.removeEventListener('click', onDoc, true);
|
|
70
|
+
};
|
|
71
|
+
}, [isMenu, trigger, triggerOpen]);
|
|
72
|
+
var onMouseEnter = function onMouseEnter() {
|
|
73
|
+
if (trigger === 'hover') triggerOpen(true);
|
|
74
|
+
};
|
|
75
|
+
var onMouseLeave = function onMouseLeave() {
|
|
76
|
+
if (trigger === 'hover') triggerOpen(false);
|
|
77
|
+
};
|
|
78
|
+
var onTriggerClick = function onTriggerClick(e) {
|
|
79
|
+
if (trigger === 'click') {
|
|
80
|
+
triggerOpen(!mergedOpen);
|
|
81
|
+
}
|
|
82
|
+
onClick === null || onClick === void 0 || onClick(e);
|
|
83
|
+
};
|
|
84
|
+
var mergedCloseIcon = closeIcon !== null && closeIcon !== void 0 ? closeIcon : /*#__PURE__*/React.createElement(CloseOutline, null);
|
|
85
|
+
var listVisible = !isMenu || mergedOpen;
|
|
86
|
+
var listNode = /*#__PURE__*/React.createElement("div", {
|
|
87
|
+
className: classNames("".concat(groupCls, "-list"), _defineProperty({}, "".concat(groupCls, "-list--hidden"), !listVisible)),
|
|
88
|
+
"aria-hidden": !listVisible
|
|
89
|
+
}, children);
|
|
90
|
+
var triggerNode = /*#__PURE__*/React.createElement(FloatButton, {
|
|
91
|
+
type: type,
|
|
92
|
+
shape: shape,
|
|
93
|
+
icon: mergedOpen ? mergedCloseIcon : icon,
|
|
94
|
+
onClick: onTriggerClick
|
|
95
|
+
});
|
|
96
|
+
var ctxValue = useMemo(function () {
|
|
97
|
+
return {
|
|
98
|
+
inGroup: true,
|
|
99
|
+
shape: shape,
|
|
100
|
+
individual: shape === 'circle',
|
|
101
|
+
right: right,
|
|
102
|
+
bottom: bottom,
|
|
103
|
+
zIndex: zIndex
|
|
104
|
+
};
|
|
105
|
+
}, [shape, right, bottom, zIndex]);
|
|
106
|
+
var rootClass = classNames(groupCls, "".concat(groupCls, "--placement-").concat(placement), _defineProperty({}, "".concat(groupCls, "--menu"), isMenu), className);
|
|
107
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
108
|
+
ref: rootRef,
|
|
109
|
+
className: rootClass,
|
|
110
|
+
style: _objectSpread({
|
|
111
|
+
zIndex: zIndex,
|
|
112
|
+
right: "".concat(right, "Px"),
|
|
113
|
+
bottom: "calc(".concat(bottom, "Px + env(safe-area-inset-bottom, 0px))")
|
|
114
|
+
}, style),
|
|
115
|
+
onMouseEnter: onMouseEnter,
|
|
116
|
+
onMouseLeave: onMouseLeave
|
|
117
|
+
}, /*#__PURE__*/React.createElement(FloatButtonGroupContext.Provider, {
|
|
118
|
+
value: ctxValue
|
|
119
|
+
}, isMenu ? /*#__PURE__*/React.createElement(React.Fragment, null, placement === 'bottom' ? /*#__PURE__*/React.createElement(React.Fragment, null, triggerNode, listNode) : placement === 'right' ? /*#__PURE__*/React.createElement(React.Fragment, null, triggerNode, listNode) : /*#__PURE__*/React.createElement(React.Fragment, null, listNode, triggerNode)) : children));
|
|
120
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type FloatButtonGroupContextValue = {
|
|
3
|
+
/** 是否在 FloatButton.Group 内(组内子按钮不使用 fixed 定位) */
|
|
4
|
+
inGroup: boolean;
|
|
5
|
+
/** 组级 shape,覆盖子项 */
|
|
6
|
+
shape?: 'circle' | 'square';
|
|
7
|
+
/** 与 antd 一致:circle 组为 true */
|
|
8
|
+
individual?: boolean;
|
|
9
|
+
right?: number;
|
|
10
|
+
bottom?: number;
|
|
11
|
+
zIndex?: number;
|
|
12
|
+
};
|
|
13
|
+
export declare const FloatButtonGroupContext: React.Context<FloatButtonGroupContextValue | null>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { DemoBlock } from "../../DemoBlock";
|
|
3
|
+
import FloatButton from "../index";
|
|
4
|
+
export default (function () {
|
|
5
|
+
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(DemoBlock, {
|
|
6
|
+
title: "\u57FA\u7840\u7528\u6CD5"
|
|
7
|
+
}, /*#__PURE__*/React.createElement(FloatButton, {
|
|
8
|
+
type: "primary"
|
|
9
|
+
})));
|
|
10
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { DemoBlock } from "../../DemoBlock";
|
|
3
|
+
import FloatButton from "../index";
|
|
4
|
+
export default (function () {
|
|
5
|
+
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(DemoBlock, {
|
|
6
|
+
title: "\u6309\u94AE\u7EC4\uFF08\u83DC\u5355\uFF09"
|
|
7
|
+
}, /*#__PURE__*/React.createElement(FloatButton.Group, {
|
|
8
|
+
trigger: "click",
|
|
9
|
+
type: "primary",
|
|
10
|
+
placement: "top"
|
|
11
|
+
}, /*#__PURE__*/React.createElement(FloatButton, {
|
|
12
|
+
icon: /*#__PURE__*/React.createElement("span", {
|
|
13
|
+
"aria-label": "search"
|
|
14
|
+
}, "\uD83D\uDD0D")
|
|
15
|
+
}), /*#__PURE__*/React.createElement(FloatButton, {
|
|
16
|
+
icon: /*#__PURE__*/React.createElement("span", {
|
|
17
|
+
"aria-label": "edit"
|
|
18
|
+
}, "\u270E")
|
|
19
|
+
}))));
|
|
20
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { DemoBlock } from "../../DemoBlock";
|
|
3
|
+
import FloatButton from "../index";
|
|
4
|
+
export default (function () {
|
|
5
|
+
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(DemoBlock, {
|
|
6
|
+
title: "\u65B9\u5F62\u4E0E\u63CF\u8FF0"
|
|
7
|
+
}, /*#__PURE__*/React.createElement(FloatButton, {
|
|
8
|
+
type: "primary",
|
|
9
|
+
shape: "square",
|
|
10
|
+
content: "\u5E2E\u52A9"
|
|
11
|
+
})));
|
|
12
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FloatButton as InternalFloatButton, FloatButtonProps } from "./FloatButton";
|
|
2
|
+
import { FloatButtonGroup } from "./FloatButtonGroup";
|
|
3
|
+
type InternalFloatButtonType = typeof InternalFloatButton;
|
|
4
|
+
type CompoundedComponent = InternalFloatButtonType & {
|
|
5
|
+
Group: typeof FloatButtonGroup;
|
|
6
|
+
};
|
|
7
|
+
declare const FloatButton: CompoundedComponent;
|
|
8
|
+
export type { FloatButtonProps };
|
|
9
|
+
export type { FloatButtonGroupProps } from "./FloatButtonGroup";
|
|
10
|
+
export default FloatButton;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
@use "../style/variable" as variable;
|
|
2
|
+
|
|
3
|
+
$floatButtonCls: "triones-antm-float-button";
|
|
4
|
+
$floatButtonGroupCls: "triones-antm-float-button-group";
|
|
5
|
+
|
|
6
|
+
$floatButtonSize: 48Px;
|
|
7
|
+
$floatButtonShadow: 0 6Px 16Px 0 rgba(0, 0, 0, 0.08),
|
|
8
|
+
0 3Px 6Px -4Px rgba(0, 0, 0, 0.12), 0 9Px 28Px 8Px rgba(0, 0, 0, 0.05);
|
|
9
|
+
|
|
10
|
+
.#{$floatButtonCls} {
|
|
11
|
+
position: fixed;
|
|
12
|
+
display: inline-flex;
|
|
13
|
+
flex-shrink: 0;
|
|
14
|
+
box-sizing: border-box;
|
|
15
|
+
|
|
16
|
+
&--embedded {
|
|
17
|
+
position: relative;
|
|
18
|
+
right: auto;
|
|
19
|
+
bottom: auto;
|
|
20
|
+
z-index: auto;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&-body {
|
|
24
|
+
box-sizing: border-box;
|
|
25
|
+
margin: 0;
|
|
26
|
+
padding: 0;
|
|
27
|
+
display: inline-flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
justify-content: center;
|
|
30
|
+
gap: 8Px;
|
|
31
|
+
min-width: $floatButtonSize;
|
|
32
|
+
min-height: $floatButtonSize;
|
|
33
|
+
border: none;
|
|
34
|
+
border-radius: 50%;
|
|
35
|
+
cursor: pointer;
|
|
36
|
+
font-size: 20Px;
|
|
37
|
+
line-height: 1;
|
|
38
|
+
color: rgba(0, 0, 0, 0.88);
|
|
39
|
+
background: #fff;
|
|
40
|
+
box-shadow: $floatButtonShadow;
|
|
41
|
+
transition: color 0.2s, background 0.2s, box-shadow 0.2s;
|
|
42
|
+
-webkit-tap-highlight-color: transparent;
|
|
43
|
+
text-decoration: none;
|
|
44
|
+
|
|
45
|
+
&:active {
|
|
46
|
+
filter: brightness(0.95);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&--shape-square &-body {
|
|
51
|
+
border-radius: variable.$trionesBorderRadius;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&--has-content &-body {
|
|
55
|
+
min-height: $floatButtonSize;
|
|
56
|
+
display: inline-flex;
|
|
57
|
+
flex-direction: column;
|
|
58
|
+
align-items: center;
|
|
59
|
+
justify-content: center;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&--type-primary &-body {
|
|
63
|
+
color: #fff;
|
|
64
|
+
background: variable.$trionesColorPrimary;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&-icon {
|
|
68
|
+
display: inline-flex;
|
|
69
|
+
align-items: center;
|
|
70
|
+
justify-content: center;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&-content {
|
|
74
|
+
font-size: variable.$trionesFontSizeSm;
|
|
75
|
+
font-weight: 500;
|
|
76
|
+
white-space: nowrap;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.#{$floatButtonGroupCls} {
|
|
81
|
+
position: fixed;
|
|
82
|
+
z-index: 100;
|
|
83
|
+
bottom: calc(24Px + env(safe-area-inset-bottom, 0px));
|
|
84
|
+
display: flex;
|
|
85
|
+
gap: 12Px;
|
|
86
|
+
align-items: flex-end;
|
|
87
|
+
box-sizing: border-box;
|
|
88
|
+
|
|
89
|
+
&--placement {
|
|
90
|
+
&-top {
|
|
91
|
+
flex-direction: column;
|
|
92
|
+
}
|
|
93
|
+
&-bottom {
|
|
94
|
+
flex-direction: column;
|
|
95
|
+
}
|
|
96
|
+
&-left {
|
|
97
|
+
flex-direction: row;
|
|
98
|
+
}
|
|
99
|
+
&-right {
|
|
100
|
+
flex-direction: row;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
&--menu {
|
|
105
|
+
align-items: center;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
&-list {
|
|
109
|
+
display: flex;
|
|
110
|
+
flex-direction: column;
|
|
111
|
+
gap: 12Px;
|
|
112
|
+
align-items: flex-end;
|
|
113
|
+
|
|
114
|
+
&--hidden {
|
|
115
|
+
display: none;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
&--placement-left &-list,
|
|
120
|
+
&--placement-right &-list {
|
|
121
|
+
flex-direction: column;
|
|
122
|
+
}
|
|
123
|
+
}
|