@atlaskit/radio 5.3.13 → 5.4.1
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/CHANGELOG.md +16 -0
- package/Radio/package.json +8 -1
- package/RadioGroup/package.json +8 -1
- package/dist/cjs/radio.js +13 -13
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/radio.js +2 -2
- package/dist/es2019/version.json +1 -1
- package/dist/esm/radio.js +2 -2
- package/dist/esm/version.json +1 -1
- package/dist/types/radio.d.ts +1 -1
- package/dist/types-ts4.0/index.d.ts +2 -0
- package/dist/types-ts4.0/radio-group.d.ts +50 -0
- package/dist/types-ts4.0/radio.d.ts +45 -0
- package/dist/types-ts4.0/styles.d.ts +18 -0
- package/dist/types-ts4.0/types.d.ts +118 -0
- package/package.json +13 -6
- package/types/package.json +8 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/radio
|
|
2
2
|
|
|
3
|
+
## 5.4.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`8cc2f888c83`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8cc2f888c83) - Upgrade Typescript from `4.3.5` to `4.5.5`
|
|
8
|
+
|
|
9
|
+
## 5.4.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [`54a5b7576a6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/54a5b7576a6) - Updates `@emotion/core` to `@emotion/react`; v10 to v11. There is no expected behavior change.
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
|
|
3
19
|
## 5.3.13
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/Radio/package.json
CHANGED
|
@@ -4,5 +4,12 @@
|
|
|
4
4
|
"module": "../dist/esm/radio.js",
|
|
5
5
|
"module:es2019": "../dist/es2019/radio.js",
|
|
6
6
|
"sideEffects": false,
|
|
7
|
-
"types": "../dist/types/radio.d.ts"
|
|
7
|
+
"types": "../dist/types/radio.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
">=4.0 <4.5": {
|
|
10
|
+
"*": [
|
|
11
|
+
"../dist/types-ts4.0/radio.d.ts"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
8
15
|
}
|
package/RadioGroup/package.json
CHANGED
|
@@ -4,5 +4,12 @@
|
|
|
4
4
|
"module": "../dist/esm/radio-group.js",
|
|
5
5
|
"module:es2019": "../dist/es2019/radio-group.js",
|
|
6
6
|
"sideEffects": false,
|
|
7
|
-
"types": "../dist/types/radio-group.d.ts"
|
|
7
|
+
"types": "../dist/types/radio-group.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
">=4.0 <4.5": {
|
|
10
|
+
"*": [
|
|
11
|
+
"../dist/types-ts4.0/radio-group.d.ts"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
8
15
|
}
|
package/dist/cjs/radio.js
CHANGED
|
@@ -13,7 +13,7 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
|
|
|
13
13
|
|
|
14
14
|
var _react = require("react");
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _react2 = require("@emotion/react");
|
|
17
17
|
|
|
18
18
|
var _usePlatformLeafEventHandler = require("@atlaskit/analytics-next/usePlatformLeafEventHandler");
|
|
19
19
|
|
|
@@ -29,13 +29,13 @@ var _styles = _interopRequireDefault(require("./styles"));
|
|
|
29
29
|
|
|
30
30
|
var _excluded = ["ariaLabel", "isDisabled", "isRequired", "isInvalid", "isChecked", "label", "mode", "name", "onChange", "value", "testId", "analyticsContext"];
|
|
31
31
|
var packageName = "@atlaskit/radio";
|
|
32
|
-
var packageVersion = "5.
|
|
32
|
+
var packageVersion = "5.4.1";
|
|
33
33
|
var fontFamily = (0, _constants.fontFamily)();
|
|
34
34
|
var noop = _noop.default;
|
|
35
|
-
var labelPaddingStyles = (0,
|
|
35
|
+
var labelPaddingStyles = (0, _react2.css)({
|
|
36
36
|
padding: '2px 4px'
|
|
37
37
|
});
|
|
38
|
-
var labelStyles = (0,
|
|
38
|
+
var labelStyles = (0, _react2.css)({
|
|
39
39
|
display: 'flex',
|
|
40
40
|
boxSizing: 'border-box',
|
|
41
41
|
position: 'relative',
|
|
@@ -47,13 +47,13 @@ var labelStyles = (0, _core.css)({
|
|
|
47
47
|
cursor: 'not-allowed'
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
|
-
var lightLabelStyles = (0,
|
|
50
|
+
var lightLabelStyles = (0, _react2.css)({
|
|
51
51
|
color: "var(--ds-text, ".concat(_colors.N900, ")")
|
|
52
52
|
});
|
|
53
|
-
var darkLabelStyles = (0,
|
|
53
|
+
var darkLabelStyles = (0, _react2.css)({
|
|
54
54
|
color: "var(--ds-text, ".concat(_colors.DN600, ")")
|
|
55
55
|
});
|
|
56
|
-
var radioStyles = (0,
|
|
56
|
+
var radioStyles = (0, _react2.css)({
|
|
57
57
|
display: 'flex',
|
|
58
58
|
|
|
59
59
|
/*
|
|
@@ -173,17 +173,17 @@ var RadioWithMode = /*#__PURE__*/(0, _react.forwardRef)(function Radio(props, re
|
|
|
173
173
|
packageVersion: packageVersion
|
|
174
174
|
});
|
|
175
175
|
var radioCustomProperties = (0, _react.useMemo)(function () {
|
|
176
|
-
return (0,
|
|
176
|
+
return (0, _react2.css)((0, _styles.default)(mode));
|
|
177
177
|
}, [mode]);
|
|
178
178
|
return (// https://product-fabric.atlassian.net/browse/DST-1971
|
|
179
179
|
// eslint-disable-next-line jsx-a11y/label-has-associated-control,jsx-a11y/label-has-for
|
|
180
|
-
(0,
|
|
180
|
+
(0, _react2.jsx)("label", {
|
|
181
181
|
"data-testid": testId && "".concat(testId, "--radio-label"),
|
|
182
182
|
"data-disabled": isDisabled ? 'true' : undefined // TODO these will no longer be dynamic styles when legacy theming removed
|
|
183
183
|
// eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
|
|
184
184
|
,
|
|
185
185
|
css: [labelStyles, mode === 'light' ? lightLabelStyles : darkLabelStyles]
|
|
186
|
-
}, (0,
|
|
186
|
+
}, (0, _react2.jsx)("input", (0, _extends2.default)({}, rest, {
|
|
187
187
|
"aria-label": ariaLabel,
|
|
188
188
|
checked: isChecked,
|
|
189
189
|
disabled: isDisabled,
|
|
@@ -200,7 +200,7 @@ var RadioWithMode = /*#__PURE__*/(0, _react.forwardRef)(function Radio(props, re
|
|
|
200
200
|
,
|
|
201
201
|
css: [radioStyles, radioCustomProperties],
|
|
202
202
|
ref: ref
|
|
203
|
-
})), label ? (0,
|
|
203
|
+
})), label ? (0, _react2.jsx)("span", {
|
|
204
204
|
css: labelPaddingStyles
|
|
205
205
|
}, label) : null)
|
|
206
206
|
);
|
|
@@ -216,9 +216,9 @@ var RadioWithMode = /*#__PURE__*/(0, _react.forwardRef)(function Radio(props, re
|
|
|
216
216
|
*/
|
|
217
217
|
|
|
218
218
|
var Radio = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef)(function Radio(props, ref) {
|
|
219
|
-
return (0,
|
|
219
|
+
return (0, _react2.jsx)(_components.default.Consumer, null, function (_ref) {
|
|
220
220
|
var mode = _ref.mode;
|
|
221
|
-
return (0,
|
|
221
|
+
return (0, _react2.jsx)(RadioWithMode, (0, _extends2.default)({}, props, {
|
|
222
222
|
ref: ref,
|
|
223
223
|
mode: mode
|
|
224
224
|
}));
|
package/dist/cjs/version.json
CHANGED
package/dist/es2019/radio.js
CHANGED
|
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
2
2
|
|
|
3
3
|
/** @jsx jsx */
|
|
4
4
|
import { forwardRef, memo, useMemo } from 'react';
|
|
5
|
-
import { css, jsx } from '@emotion/
|
|
5
|
+
import { css, jsx } from '@emotion/react';
|
|
6
6
|
import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler';
|
|
7
7
|
import __noop from '@atlaskit/ds-lib/noop';
|
|
8
8
|
import { DN600, N80, N900 } from '@atlaskit/theme/colors';
|
|
@@ -10,7 +10,7 @@ import GlobalTheme from '@atlaskit/theme/components';
|
|
|
10
10
|
import { fontFamily as getFontFamily } from '@atlaskit/theme/constants';
|
|
11
11
|
import getRadioCustomProperties from './styles';
|
|
12
12
|
const packageName = "@atlaskit/radio";
|
|
13
|
-
const packageVersion = "5.
|
|
13
|
+
const packageVersion = "5.4.1";
|
|
14
14
|
const fontFamily = getFontFamily();
|
|
15
15
|
const noop = __noop;
|
|
16
16
|
const labelPaddingStyles = css({
|
package/dist/es2019/version.json
CHANGED
package/dist/esm/radio.js
CHANGED
|
@@ -4,7 +4,7 @@ var _excluded = ["ariaLabel", "isDisabled", "isRequired", "isInvalid", "isChecke
|
|
|
4
4
|
|
|
5
5
|
/** @jsx jsx */
|
|
6
6
|
import { forwardRef, memo, useMemo } from 'react';
|
|
7
|
-
import { css, jsx } from '@emotion/
|
|
7
|
+
import { css, jsx } from '@emotion/react';
|
|
8
8
|
import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler';
|
|
9
9
|
import __noop from '@atlaskit/ds-lib/noop';
|
|
10
10
|
import { DN600, N80, N900 } from '@atlaskit/theme/colors';
|
|
@@ -12,7 +12,7 @@ import GlobalTheme from '@atlaskit/theme/components';
|
|
|
12
12
|
import { fontFamily as getFontFamily } from '@atlaskit/theme/constants';
|
|
13
13
|
import getRadioCustomProperties from './styles';
|
|
14
14
|
var packageName = "@atlaskit/radio";
|
|
15
|
-
var packageVersion = "5.
|
|
15
|
+
var packageVersion = "5.4.1";
|
|
16
16
|
var fontFamily = getFontFamily();
|
|
17
17
|
var noop = __noop;
|
|
18
18
|
var labelPaddingStyles = css({
|
package/dist/esm/version.json
CHANGED
package/dist/types/radio.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ declare const Radio: import("react").MemoExoticComponent<import("react").Forward
|
|
|
30
30
|
value?: string | undefined;
|
|
31
31
|
testId?: string | undefined;
|
|
32
32
|
analyticsContext?: Record<string, any> | undefined;
|
|
33
|
-
} & import("@atlaskit/analytics-next").WithAnalyticsEventsProps, "accept" | "alt" | "autoComplete" | "autoFocus" | "capture" | "crossOrigin" | "form" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "height" | "list" | "max" | "maxLength" | "min" | "minLength" | "multiple" | "name" | "pattern" | "placeholder" | "readOnly" | "size" | "src" | "step" | "type" | "width" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "inputMode" | "is" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" |
|
|
33
|
+
} & import("@atlaskit/analytics-next").WithAnalyticsEventsProps, "accept" | "alt" | "autoComplete" | "autoFocus" | "capture" | "crossOrigin" | "form" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "height" | "list" | "max" | "maxLength" | "min" | "minLength" | "multiple" | "name" | "pattern" | "placeholder" | "readOnly" | "size" | "src" | "step" | "type" | "width" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "inputMode" | "is" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | keyof {
|
|
34
34
|
ariaLabel?: string | undefined;
|
|
35
35
|
isDisabled?: boolean | undefined;
|
|
36
36
|
isRequired?: boolean | undefined;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React, { SyntheticEvent } from 'react';
|
|
2
|
+
import { UIAnalyticsEvent } from '@atlaskit/analytics-next';
|
|
3
|
+
import { OptionsPropType, RadioValue } from './types';
|
|
4
|
+
export interface RadioGroupProps {
|
|
5
|
+
/**
|
|
6
|
+
* Once set, controls the selected value on the `RadioGroup`
|
|
7
|
+
*/
|
|
8
|
+
value?: RadioValue | null;
|
|
9
|
+
/**
|
|
10
|
+
* Sets the initial selected value on the `RadioGroup`
|
|
11
|
+
*/
|
|
12
|
+
defaultValue?: RadioValue | null;
|
|
13
|
+
/**
|
|
14
|
+
* Sets the disabled state of all `Radio` elements in the group. Overrides the `isDisabled` setting of all child `Radio` items.
|
|
15
|
+
*/
|
|
16
|
+
isDisabled?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Sets the required state of all `Radio` elements in the group
|
|
19
|
+
*/
|
|
20
|
+
isRequired?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Sets the invalid state of all `Radio` elements in the group
|
|
23
|
+
*/
|
|
24
|
+
isInvalid?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* An array of objects, each object is mapped onto a `Radio` element within the group. Name must be unique to the group.
|
|
27
|
+
*/
|
|
28
|
+
options: OptionsPropType;
|
|
29
|
+
/**
|
|
30
|
+
* Function that gets fired after each invalid event
|
|
31
|
+
*/
|
|
32
|
+
onInvalid?: (event: SyntheticEvent<any>) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Function that gets after each change event
|
|
35
|
+
*/
|
|
36
|
+
onChange?: (e: React.ChangeEvent<HTMLInputElement>, analyticsEvent: UIAnalyticsEvent) => void;
|
|
37
|
+
/**
|
|
38
|
+
* Sets the `name` prop on each of the `Radio` elements in the group
|
|
39
|
+
*/
|
|
40
|
+
name?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Additional information to be included in the `context` of analytics events that come from radio
|
|
43
|
+
*/
|
|
44
|
+
analyticsContext?: Record<string, any>;
|
|
45
|
+
/**
|
|
46
|
+
* The id of the element that links to this radiogroup.
|
|
47
|
+
*/
|
|
48
|
+
'aria-labelledby'?: string;
|
|
49
|
+
}
|
|
50
|
+
export default function RadioGroup(props: RadioGroupProps): JSX.Element;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
/**
|
|
3
|
+
* __Radio__
|
|
4
|
+
*
|
|
5
|
+
* A radio input allows users to select only one option from a number of choices. Radio is generally displayed in a radio group.
|
|
6
|
+
*
|
|
7
|
+
* - [Examples](https://atlassian.design/components/radio/examples)
|
|
8
|
+
* - [Code](https://atlassian.design/components/radio/code)
|
|
9
|
+
* - [Usage](https://atlassian.design/components/radio/usage)
|
|
10
|
+
*/
|
|
11
|
+
declare const Radio: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Pick<Omit<Omit<import("react").InputHTMLAttributes<HTMLInputElement>, "aria-label" | "disabled" | "required" | "checked" | "value">, keyof {
|
|
12
|
+
ariaLabel?: string | undefined;
|
|
13
|
+
isDisabled?: boolean | undefined;
|
|
14
|
+
isRequired?: boolean | undefined;
|
|
15
|
+
isInvalid?: boolean | undefined;
|
|
16
|
+
isChecked?: boolean | undefined;
|
|
17
|
+
label?: import("react").ReactNode;
|
|
18
|
+
onChange?: ((e: import("react").ChangeEvent<HTMLInputElement>, analyticsEvent: import("@atlaskit/analytics-next").UIAnalyticsEvent) => void) | undefined;
|
|
19
|
+
value?: string | undefined;
|
|
20
|
+
testId?: string | undefined;
|
|
21
|
+
analyticsContext?: Record<string, any> | undefined;
|
|
22
|
+
}> & {
|
|
23
|
+
ariaLabel?: string | undefined;
|
|
24
|
+
isDisabled?: boolean | undefined;
|
|
25
|
+
isRequired?: boolean | undefined;
|
|
26
|
+
isInvalid?: boolean | undefined;
|
|
27
|
+
isChecked?: boolean | undefined;
|
|
28
|
+
label?: import("react").ReactNode;
|
|
29
|
+
onChange?: ((e: import("react").ChangeEvent<HTMLInputElement>, analyticsEvent: import("@atlaskit/analytics-next").UIAnalyticsEvent) => void) | undefined;
|
|
30
|
+
value?: string | undefined;
|
|
31
|
+
testId?: string | undefined;
|
|
32
|
+
analyticsContext?: Record<string, any> | undefined;
|
|
33
|
+
} & import("@atlaskit/analytics-next").WithAnalyticsEventsProps, "accept" | "alt" | "autoComplete" | "autoFocus" | "capture" | "crossOrigin" | "form" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "height" | "list" | "max" | "maxLength" | "min" | "minLength" | "multiple" | "name" | "pattern" | "placeholder" | "readOnly" | "size" | "src" | "step" | "type" | "width" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "inputMode" | "is" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | keyof {
|
|
34
|
+
ariaLabel?: string | undefined;
|
|
35
|
+
isDisabled?: boolean | undefined;
|
|
36
|
+
isRequired?: boolean | undefined;
|
|
37
|
+
isInvalid?: boolean | undefined;
|
|
38
|
+
isChecked?: boolean | undefined;
|
|
39
|
+
label?: import("react").ReactNode;
|
|
40
|
+
onChange?: ((e: import("react").ChangeEvent<HTMLInputElement>, analyticsEvent: import("@atlaskit/analytics-next").UIAnalyticsEvent) => void) | undefined;
|
|
41
|
+
value?: string | undefined;
|
|
42
|
+
testId?: string | undefined;
|
|
43
|
+
analyticsContext?: Record<string, any> | undefined;
|
|
44
|
+
} | "createAnalyticsEvent"> & import("react").RefAttributes<HTMLInputElement>>>;
|
|
45
|
+
export default Radio;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ThemeModes } from '@atlaskit/theme/types';
|
|
2
|
+
export default function getRadioCustomProperties(mode: ThemeModes): {
|
|
3
|
+
'--local-background': "var(--ds-background-input)";
|
|
4
|
+
'--local-background-active': "var(--ds-background-input-pressed)";
|
|
5
|
+
'--local-background-checked': "var(--ds-background-brand-bold)";
|
|
6
|
+
'--local-background-checked-active': "var(--ds-background-brand-bold-pressed)";
|
|
7
|
+
'--local-background-checked-hover': "var(--ds-background-brand-bold-hovered)";
|
|
8
|
+
'--local-background-disabled': "var(--ds-background-input)";
|
|
9
|
+
'--local-background-hover': "var(--ds-background-input-hovered)";
|
|
10
|
+
'--local-border': "var(--ds-border-input)";
|
|
11
|
+
'--local-border-disabled': "var(--ds-background-disabled)";
|
|
12
|
+
'--local-border-hover': "var(--ds-border-input)";
|
|
13
|
+
'--local-border-focus': "var(--ds-border-focused)";
|
|
14
|
+
'--local-dot-active': "var(--ds-text-inverse)";
|
|
15
|
+
'--local-dot-checked': "var(--ds-text-inverse)";
|
|
16
|
+
'--local-dot-disabled': "var(--ds-text-disabled)";
|
|
17
|
+
'--local-invalid': "var(--ds-icon-danger)";
|
|
18
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ReactNode, SyntheticEvent } from 'react';
|
|
2
|
+
import { UIAnalyticsEvent, WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
|
|
3
|
+
export declare type OptionPropType = {
|
|
4
|
+
isDisabled?: boolean;
|
|
5
|
+
label?: ReactNode;
|
|
6
|
+
name?: string;
|
|
7
|
+
value?: RadioValue;
|
|
8
|
+
testId?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare type OptionsPropType = Array<OptionPropType>;
|
|
11
|
+
export declare type RadioValue = string;
|
|
12
|
+
declare type OwnProps = {
|
|
13
|
+
/**
|
|
14
|
+
* the aria-label attribute associated with the radio element
|
|
15
|
+
*/
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Makes a `Radio` field unselectable when true. Overridden by `isDisabled` prop of `RadioGroup`.
|
|
19
|
+
*/
|
|
20
|
+
isDisabled?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Marks this as a required field
|
|
23
|
+
*/
|
|
24
|
+
isRequired?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Field is invalid
|
|
27
|
+
*/
|
|
28
|
+
isInvalid?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Set the field as checked
|
|
31
|
+
*/
|
|
32
|
+
isChecked?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* The label value for the input rendered to the dom
|
|
35
|
+
*/
|
|
36
|
+
label?: ReactNode;
|
|
37
|
+
/**
|
|
38
|
+
* onChange event handler, passed into the props of each `Radio` Component instantiated within `RadioGroup`
|
|
39
|
+
*/
|
|
40
|
+
onChange?: (e: React.ChangeEvent<HTMLInputElement>, analyticsEvent: UIAnalyticsEvent) => void;
|
|
41
|
+
/**
|
|
42
|
+
* Field value
|
|
43
|
+
*/
|
|
44
|
+
value?: RadioValue;
|
|
45
|
+
/**
|
|
46
|
+
* A `testId` prop is provided for specified elements, which is a unique string that appears as a data attribute `data-testid` in the rendered code, serving as a hook for automated tests
|
|
47
|
+
* we have 2 different testid generated based on the one you pass to the Radio component:
|
|
48
|
+
* - `{testId}--radio-input` to check if it got changed to checked/unchecked.
|
|
49
|
+
* - `{testId}--radio-label` to click the input
|
|
50
|
+
*/
|
|
51
|
+
testId?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Additional information to be included in the `context` of analytics events that come from radio
|
|
54
|
+
*/
|
|
55
|
+
analyticsContext?: Record<string, any>;
|
|
56
|
+
};
|
|
57
|
+
declare type Combine<First, Second> = Omit<First, keyof Second> & Second;
|
|
58
|
+
export declare type RadioProps = Combine<Omit<React.InputHTMLAttributes<HTMLInputElement>, 'aria-label' | 'disabled' | 'required' | 'checked' | 'value'>, OwnProps> & WithAnalyticsEventsProps;
|
|
59
|
+
export interface ExtractReactTypeProps extends WithAnalyticsEventsProps {
|
|
60
|
+
/**
|
|
61
|
+
* the aria-label attribute associated with the radio element
|
|
62
|
+
*/
|
|
63
|
+
ariaLabel?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Field disabled
|
|
66
|
+
*/
|
|
67
|
+
isDisabled?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Marks this as a required field
|
|
70
|
+
*/
|
|
71
|
+
isRequired?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Field is invalid
|
|
74
|
+
*/
|
|
75
|
+
isInvalid?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Set the field as checked
|
|
78
|
+
*/
|
|
79
|
+
isChecked?: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* The label value for the input rendered to the dom
|
|
82
|
+
*/
|
|
83
|
+
label?: ReactNode;
|
|
84
|
+
/**
|
|
85
|
+
* Field name, must be unique to the radio group
|
|
86
|
+
*/
|
|
87
|
+
name?: string;
|
|
88
|
+
/**
|
|
89
|
+
* `onChange` event handler, passed into the props of each `Radio` Component instantiated within RadioGroup
|
|
90
|
+
*/
|
|
91
|
+
onChange?: (e: React.ChangeEvent<HTMLInputElement>, analyticsEvent: UIAnalyticsEvent) => void;
|
|
92
|
+
onBlur?: React.FocusEventHandler<HTMLInputElement>;
|
|
93
|
+
onFocus?: React.FocusEventHandler<HTMLInputElement>;
|
|
94
|
+
onMouseDown?: React.MouseEventHandler;
|
|
95
|
+
onMouseUp?: React.MouseEventHandler;
|
|
96
|
+
onMouseEnter?: React.MouseEventHandler;
|
|
97
|
+
onMouseLeave?: React.MouseEventHandler;
|
|
98
|
+
/**
|
|
99
|
+
* `onInvalid` event handler, passed into the props of each `Radio` component instantiated within `RadioGroup`
|
|
100
|
+
*/
|
|
101
|
+
onInvalid?: (e: SyntheticEvent<any>) => void;
|
|
102
|
+
/**
|
|
103
|
+
* Field value
|
|
104
|
+
*/
|
|
105
|
+
value?: RadioValue;
|
|
106
|
+
/**
|
|
107
|
+
* A `testId` prop is provided for specified elements, which is a unique string that appears as a data attribute `data-testid` in the rendered code, serving as a hook for automated tests
|
|
108
|
+
* we have two different `testId`s generated based on the one you pass to the Radio component:
|
|
109
|
+
* - `{testId}--radio-input` to check if it got changed to checked/unchecked.
|
|
110
|
+
* - `{testId}--radio-label` to click the input
|
|
111
|
+
*/
|
|
112
|
+
testId?: string;
|
|
113
|
+
/**
|
|
114
|
+
* Additional information to be included in the `context` of analytics events that come from radio
|
|
115
|
+
*/
|
|
116
|
+
analyticsContext?: Record<string, any>;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/radio",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.1",
|
|
4
4
|
"description": "A radio input allows users to select only one option from a number of choices. Radio is generally displayed in a radio group.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
"module": "dist/esm/index.js",
|
|
13
13
|
"module:es2019": "dist/es2019/index.js",
|
|
14
14
|
"types": "dist/types/index.d.ts",
|
|
15
|
+
"typesVersions": {
|
|
16
|
+
">=4.0 <4.5": {
|
|
17
|
+
"*": [
|
|
18
|
+
"dist/types-ts4.0/*"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
},
|
|
15
22
|
"sideEffects": false,
|
|
16
23
|
"atlaskit:src": "src/index.tsx",
|
|
17
24
|
"atlassian": {
|
|
@@ -31,10 +38,10 @@
|
|
|
31
38
|
"dependencies": {
|
|
32
39
|
"@atlaskit/analytics-next": "^8.0.0",
|
|
33
40
|
"@atlaskit/ds-lib": "^2.1.0",
|
|
34
|
-
"@atlaskit/theme": "^12.
|
|
41
|
+
"@atlaskit/theme": "^12.2.0",
|
|
35
42
|
"@atlaskit/tokens": "^0.10.0",
|
|
36
43
|
"@babel/runtime": "^7.0.0",
|
|
37
|
-
"@emotion/
|
|
44
|
+
"@emotion/react": "^11.7.1"
|
|
38
45
|
},
|
|
39
46
|
"peerDependencies": {
|
|
40
47
|
"react": "^16.8.0"
|
|
@@ -44,15 +51,15 @@
|
|
|
44
51
|
"@atlaskit/checkbox": "^12.3.0",
|
|
45
52
|
"@atlaskit/docs": "^9.0.0",
|
|
46
53
|
"@atlaskit/form": "^8.5.0",
|
|
47
|
-
"@atlaskit/section-message": "^6.
|
|
54
|
+
"@atlaskit/section-message": "^6.2.0",
|
|
48
55
|
"@atlaskit/ssr": "*",
|
|
49
56
|
"@atlaskit/visual-regression": "*",
|
|
50
57
|
"@atlaskit/webdriver-runner": "*",
|
|
51
58
|
"@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1",
|
|
52
|
-
"@testing-library/react": "^
|
|
59
|
+
"@testing-library/react": "^12.1.5",
|
|
53
60
|
"react-dom": "^16.8.0",
|
|
54
61
|
"storybook-addon-performance": "^0.16.0",
|
|
55
|
-
"typescript": "4.
|
|
62
|
+
"typescript": "4.5.5"
|
|
56
63
|
},
|
|
57
64
|
"keywords": [
|
|
58
65
|
"atlaskit",
|
package/types/package.json
CHANGED
|
@@ -4,5 +4,12 @@
|
|
|
4
4
|
"module": "../dist/esm/types.js",
|
|
5
5
|
"module:es2019": "../dist/es2019/types.js",
|
|
6
6
|
"sideEffects": false,
|
|
7
|
-
"types": "../dist/types/types.d.ts"
|
|
7
|
+
"types": "../dist/types/types.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
">=4.0 <4.5": {
|
|
10
|
+
"*": [
|
|
11
|
+
"../dist/types-ts4.0/types.d.ts"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
8
15
|
}
|