@atlaskit/media-avatar-picker 26.0.7 → 26.1.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 (30) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/avatar-picker-dialog/layout-const.js +3 -2
  3. package/dist/cjs/image-cropper/index.compiled.css +6 -2
  4. package/dist/cjs/image-cropper/index.js +78 -6
  5. package/dist/cjs/image-navigator/index.js +28 -4
  6. package/dist/cjs/image-navigator/slider.js +11 -5
  7. package/dist/cjs/index.js +2 -2
  8. package/dist/es2019/avatar-picker-dialog/layout-const.js +2 -1
  9. package/dist/es2019/image-cropper/index.compiled.css +6 -2
  10. package/dist/es2019/image-cropper/index.js +81 -6
  11. package/dist/es2019/image-navigator/index.js +30 -4
  12. package/dist/es2019/image-navigator/slider.js +12 -4
  13. package/dist/es2019/index.js +1 -1
  14. package/dist/esm/avatar-picker-dialog/layout-const.js +2 -1
  15. package/dist/esm/image-cropper/index.compiled.css +6 -2
  16. package/dist/esm/image-cropper/index.js +78 -6
  17. package/dist/esm/image-navigator/index.js +28 -4
  18. package/dist/esm/image-navigator/slider.js +10 -4
  19. package/dist/esm/index.js +1 -1
  20. package/dist/types/avatar-picker-dialog/layout-const.d.ts +1 -0
  21. package/dist/types/image-cropper/index.d.ts +5 -0
  22. package/dist/types/image-navigator/index.d.ts +1 -0
  23. package/dist/types/image-navigator/slider.d.ts +6 -1
  24. package/dist/types/index.d.ts +1 -1
  25. package/dist/types-ts4.5/avatar-picker-dialog/layout-const.d.ts +1 -0
  26. package/dist/types-ts4.5/image-cropper/index.d.ts +5 -0
  27. package/dist/types-ts4.5/image-navigator/index.d.ts +1 -0
  28. package/dist/types-ts4.5/image-navigator/slider.d.ts +6 -1
  29. package/dist/types-ts4.5/index.d.ts +1 -1
  30. package/package.json +6 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @atlaskit/media-avatar-picker
2
2
 
3
+ ## 26.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#141250](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/141250)
8
+ [`97fb574ab2188`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/97fb574ab2188) -
9
+ Keyboard only & screen reader navigation support for avatar image cropping functionality & added
10
+ a11y label for the zoom-in & zoom-out buttons
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
16
+ ## 26.0.8
17
+
18
+ ### Patch Changes
19
+
20
+ - Updated dependencies
21
+
3
22
  ## 26.0.7
4
23
 
5
24
  ### Patch Changes
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PREDEFINED_AVATARS_VIEW_WIDTH = exports.PREDEFINED_AVATARS_VIEW_HEIGHT = exports.DEFAULT_VISIBLE_PREDEFINED_AVATARS = exports.CONTAINER_SIZE = exports.CONTAINER_RECT = exports.CONTAINER_PADDING = exports.CONTAINER_INNER_SIZE = exports.AVATAR_DIALOG_WIDTH = exports.AVATAR_DIALOG_HEIGHT = void 0;
6
+ exports.PREDEFINED_AVATARS_VIEW_WIDTH = exports.PREDEFINED_AVATARS_VIEW_HEIGHT = exports.IMAGE_MOVE_UNIT = exports.DEFAULT_VISIBLE_PREDEFINED_AVATARS = exports.CONTAINER_SIZE = exports.CONTAINER_RECT = exports.CONTAINER_PADDING = exports.CONTAINER_INNER_SIZE = exports.AVATAR_DIALOG_WIDTH = exports.AVATAR_DIALOG_HEIGHT = void 0;
7
7
  var _mediaUi = require("@atlaskit/media-ui");
8
8
  var DEFAULT_VISIBLE_PREDEFINED_AVATARS = exports.DEFAULT_VISIBLE_PREDEFINED_AVATARS = 5;
9
9
  var AVATAR_DIALOG_WIDTH = exports.AVATAR_DIALOG_WIDTH = 375;
@@ -13,4 +13,5 @@ var PREDEFINED_AVATARS_VIEW_HEIGHT = exports.PREDEFINED_AVATARS_VIEW_HEIGHT = 29
13
13
  var CONTAINER_SIZE = exports.CONTAINER_SIZE = 8 * 32;
14
14
  var CONTAINER_INNER_SIZE = exports.CONTAINER_INNER_SIZE = 8 * 25;
15
15
  var CONTAINER_PADDING = exports.CONTAINER_PADDING = (CONTAINER_SIZE - CONTAINER_INNER_SIZE) / 2;
16
- var CONTAINER_RECT = exports.CONTAINER_RECT = new _mediaUi.Rectangle(CONTAINER_SIZE, CONTAINER_SIZE);
16
+ var CONTAINER_RECT = exports.CONTAINER_RECT = new _mediaUi.Rectangle(CONTAINER_SIZE, CONTAINER_SIZE);
17
+ var IMAGE_MOVE_UNIT = exports.IMAGE_MOVE_UNIT = 5;
@@ -1,6 +1,7 @@
1
1
 
2
2
  ._2rko14q2{border-radius:var(--ds-border-radius-circle,2002pc)}
3
- ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._154i1b66{top:var(--ds-space-050,4px)}
3
+ ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}
4
+ ._154i1b66{top:var(--ds-space-050,4px)}
4
5
  ._18m915vq{overflow-y:hidden}
5
6
  ._1bsb1osq{width:100%}
6
7
  ._1reo15vq{overflow-x:hidden}
@@ -9,4 +10,7 @@
9
10
  ._80om15ng{cursor:move}
10
11
  ._kqswh2mm{position:relative}
11
12
  ._kqswstnw{position:absolute}
12
- ._uiztglyw{-webkit-user-select:none;-ms-user-select:none;user-select:none}
13
+ ._uiztglyw{-webkit-user-select:none;-ms-user-select:none;user-select:none}._128m1bk5:focus-visible{outline-width:var(--ds-border-width-outline,2px)}
14
+ ._1ah3v77o:focus-visible{outline-offset:var(--ds-space-025,2px)}
15
+ ._mizu1p6i:focus-visible{outline-color:var(--ds-border-focused,#388bff)}
16
+ ._ra3xnqa1:focus-visible{outline-style:solid}
@@ -28,6 +28,8 @@ var _avatarPickerDialog = require("../avatar-picker-dialog");
28
28
  var _layoutConst = require("../avatar-picker-dialog/layout-const");
29
29
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
30
30
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
+ 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; }
32
+ 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) { (0, _defineProperty2.default)(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; }
31
33
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
32
34
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
33
35
  var CONTAINER_PADDING = 28;
@@ -38,7 +40,7 @@ var dragOverlayStyles = {
38
40
  root: "_kqswstnw _1bsb1osq _4t3i1osq _80om15ng"
39
41
  };
40
42
  var maskPositionStyle = {
41
- root: "_kqswstnw"
43
+ root: "_kqswstnw _1ah3v77o _128m1bk5 _mizu1p6i _ra3xnqa1"
42
44
  };
43
45
  var maskStyles = {
44
46
  top: "".concat(CONTAINER_PADDING, "px"),
@@ -48,6 +50,15 @@ var maskStyles = {
48
50
  opacity: "var(--ds-opacity-disabled, 0.4)",
49
51
  boxShadow: "0 0 0 100px ".concat("var(--ds-surface-overlay, rgba(255, 255, 255))")
50
52
  };
53
+ var offscreenStyles = {
54
+ clip: 'rect(1px, 1px, 1px, 1px)',
55
+ clipPath: 'inset(50%)',
56
+ height: '1px',
57
+ width: '1px',
58
+ margin: '-1px',
59
+ overflow: 'hidden',
60
+ padding: 0
61
+ };
51
62
  var rectMaskStyles = {
52
63
  root: "_2rkoiti9"
53
64
  };
@@ -68,6 +79,45 @@ var ImageCropper = exports.ImageCropper = /*#__PURE__*/function (_Component) {
68
79
  args[_key] = arguments[_key];
69
80
  }
70
81
  _this = _callSuper(this, ImageCropper, [].concat(args));
82
+ (0, _defineProperty2.default)(_this, "state", {
83
+ liveMsg: ''
84
+ });
85
+ (0, _defineProperty2.default)(_this, "onKeyDown", function (e) {
86
+ var formatMessage = _this.props.intl.formatMessage;
87
+ var msg = '';
88
+ switch (e.key) {
89
+ case 'ArrowLeft':
90
+ msg = formatMessage(_mediaUi.messages.image_cropper_image_moved, {
91
+ from: 'left',
92
+ to: 'right'
93
+ });
94
+ break;
95
+ case 'ArrowRight':
96
+ msg = formatMessage(_mediaUi.messages.image_cropper_image_moved, {
97
+ from: 'right',
98
+ to: 'left'
99
+ });
100
+ break;
101
+ case 'ArrowUp':
102
+ msg = formatMessage(_mediaUi.messages.image_cropper_image_moved, {
103
+ from: 'top',
104
+ to: 'bottom'
105
+ });
106
+ break;
107
+ case 'ArrowDown':
108
+ msg = formatMessage(_mediaUi.messages.image_cropper_image_moved, {
109
+ from: 'bottom',
110
+ to: 'top'
111
+ });
112
+ break;
113
+ default:
114
+ return;
115
+ }
116
+ _this.props.moveImage && _this.props.moveImage(e.key);
117
+ _this.setState({
118
+ liveMsg: msg
119
+ });
120
+ });
71
121
  (0, _defineProperty2.default)(_this, "onDragStarted", function (e) {
72
122
  if (_this.props.onDragStarted) {
73
123
  _this.props.onDragStarted(e.screenX, e.screenY);
@@ -143,16 +193,38 @@ var ImageCropper = exports.ImageCropper = /*#__PURE__*/function (_Component) {
143
193
  onImageLoad: onImageLoaded,
144
194
  onImageError: this.onImageError
145
195
  })), isCircularMask ? /*#__PURE__*/_react.default.createElement(_compiled.Box, {
146
- xcss: (0, _css.cx)(circularMaskStyles.root, maskPositionStyle.root),
147
- style: maskStyles
196
+ testId: "image-cropper-mask",
197
+ xcss: (0, _css.cx)(circularMaskStyles.root, maskPositionStyle.root)
198
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
199
+ ,
200
+ style: maskStyles,
201
+ tabIndex: 0,
202
+ onKeyDown: this.onKeyDown,
203
+ "aria-label": formatMessage(_mediaUi.messages.image_cropper_arrow_keys_label)
148
204
  }) : /*#__PURE__*/_react.default.createElement(_compiled.Box, {
149
- xcss: (0, _css.cx)(rectMaskStyles.root, maskPositionStyle.root),
150
- style: maskStyles
205
+ testId: "image-cropper-mask",
206
+ xcss: (0, _css.cx)(rectMaskStyles.root, maskPositionStyle.root)
207
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
208
+ ,
209
+ style: maskStyles,
210
+ tabIndex: 0,
211
+ onKeyDown: this.onKeyDown,
212
+ "aria-label": formatMessage(_mediaUi.messages.image_cropper_arrow_keys_label)
151
213
  }), /*#__PURE__*/_react.default.createElement(_compiled.Box, {
152
214
  id: "drag-overlay",
153
215
  xcss: dragOverlayStyles.root,
154
216
  onMouseDown: this.onDragStarted
155
- }), /*#__PURE__*/_react.default.createElement(_compiled.Box, {
217
+ }), /*#__PURE__*/_react.default.createElement("div", {
218
+ id: "image-cropper-image-movements-log",
219
+ "aria-live": "assertive",
220
+ role: "log",
221
+ "aria-atomic": "true"
222
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
223
+ ,
224
+ style: _objectSpread(_objectSpread({}, offscreenStyles), {}, {
225
+ position: 'absolute'
226
+ })
227
+ }, this.state.liveMsg), /*#__PURE__*/_react.default.createElement(_compiled.Box, {
156
228
  id: "remove-image-container",
157
229
  xcss: removeImageContainerStyles.root
158
230
  }, /*#__PURE__*/_react.default.createElement(_new.IconButton, {
@@ -30,7 +30,7 @@ var _images = require("./images");
30
30
  var _util = require("../util");
31
31
  var _avatarPickerDialog = require("../avatar-picker-dialog");
32
32
  var _viewport2 = require("../viewport");
33
- var _slider = require("./slider");
33
+ var _slider = _interopRequireDefault(require("./slider"));
34
34
  var _layoutConst = require("../avatar-picker-dialog/layout-const");
35
35
  var _dragZone = require("./dragZone");
36
36
  var _exportCroppedImage = require("./exportCroppedImage");
@@ -78,6 +78,28 @@ var ImageNavigator = exports.ImageNavigator = /*#__PURE__*/function (_Component)
78
78
  dragStartPoint: new _mediaUi.Vector2(x, y)
79
79
  });
80
80
  });
81
+ (0, _defineProperty2.default)(_this, "moveImage", function (key) {
82
+ var viewport = _this.state.viewport;
83
+ switch (key) {
84
+ case 'ArrowLeft':
85
+ viewport.dragMove(viewport.itemBounds.x + _layoutConst.IMAGE_MOVE_UNIT, viewport.itemBounds.y);
86
+ break;
87
+ case 'ArrowRight':
88
+ viewport.dragMove(viewport.itemBounds.x - _layoutConst.IMAGE_MOVE_UNIT, viewport.itemBounds.y);
89
+ break;
90
+ case 'ArrowUp':
91
+ viewport.dragMove(viewport.itemBounds.x, viewport.itemBounds.y + _layoutConst.IMAGE_MOVE_UNIT);
92
+ break;
93
+ case 'ArrowDown':
94
+ viewport.dragMove(viewport.itemBounds.x, viewport.itemBounds.y - _layoutConst.IMAGE_MOVE_UNIT);
95
+ break;
96
+ default:
97
+ return;
98
+ }
99
+ _this.setState({
100
+ viewport: viewport
101
+ });
102
+ });
81
103
  (0, _defineProperty2.default)(_this, "onMouseMove", function (e) {
82
104
  if (_this.state.isDragging) {
83
105
  var _this$state = _this.state,
@@ -370,7 +392,8 @@ var ImageNavigator = exports.ImageNavigator = /*#__PURE__*/function (_Component)
370
392
  var onImageError = this.props.onImageError;
371
393
  var onDragStarted = this.onDragStarted,
372
394
  onImageLoaded = this.onImageLoaded,
373
- onRemoveImage = this.onRemoveImage;
395
+ onRemoveImage = this.onRemoveImage,
396
+ moveImage = this.moveImage;
374
397
  var itemBounds = viewport.itemBounds;
375
398
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
376
399
  style: {
@@ -389,10 +412,11 @@ var ImageNavigator = exports.ImageNavigator = /*#__PURE__*/function (_Component)
389
412
  onDragStarted: onDragStarted,
390
413
  onImageLoaded: onImageLoaded,
391
414
  onRemoveImage: onRemoveImage,
392
- onImageError: onImageError
415
+ onImageError: onImageError,
416
+ moveImage: moveImage
393
417
  }), /*#__PURE__*/_react.default.createElement("div", {
394
418
  className: (0, _runtime.ax)(["_4cvr1h6o _1bah1h6o _1e0c1txw _2lx2vrvc _19pku2gc _bfhk1bhr _v69yidpf _ogxmidpf _1qtqidpf _n9z4idpf _40631ntv"])
395
- }, /*#__PURE__*/_react.default.createElement(_slider.Slider, {
419
+ }, /*#__PURE__*/_react.default.createElement(_slider.default, {
396
420
  value: scale,
397
421
  onChange: this.onScaleChange
398
422
  })), isDragging ? /*#__PURE__*/_react.default.createElement("div", {
@@ -6,7 +6,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
6
6
  Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
- exports.defaultProps = exports.Slider = void 0;
9
+ exports.defaultProps = exports.default = exports.Slider = void 0;
10
10
  require("./slider.compiled.css");
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var React = _react;
@@ -18,9 +18,11 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
18
18
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
19
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
20
  var _range = _interopRequireDefault(require("@atlaskit/range"));
21
+ var _mediaUi = require("@atlaskit/media-ui");
21
22
  var _imageMediaServicesScaleLarge = _interopRequireDefault(require("@atlaskit/icon/core/migration/image--media-services-scale-large"));
22
23
  var _imageMediaServicesScaleSmall = _interopRequireDefault(require("@atlaskit/icon/core/migration/image--media-services-scale-small"));
23
24
  var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
25
+ var _reactIntlNext = require("react-intl-next");
24
26
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
25
27
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
26
28
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
@@ -40,7 +42,8 @@ var Slider = exports.Slider = /*#__PURE__*/function (_Component) {
40
42
  value: function render() {
41
43
  var _this$props = this.props,
42
44
  value = _this$props.value,
43
- onChange = _this$props.onChange;
45
+ onChange = _this$props.onChange,
46
+ formatMessage = _this$props.intl.formatMessage;
44
47
  return /*#__PURE__*/React.createElement("div", {
45
48
  "data-testid": "slider",
46
49
  className: (0, _runtime.ax)(["_1e0c1txw _4cvr1h6o _1bsb1osq _yw87h2mm _1grc1i6y"])
@@ -53,7 +56,8 @@ var Slider = exports.Slider = /*#__PURE__*/function (_Component) {
53
56
  }),
54
57
  onClick: function onClick() {
55
58
  return onChange(0);
56
- }
59
+ },
60
+ "aria-label": formatMessage(_mediaUi.messages.image_cropper_zoom_out)
57
61
  }), /*#__PURE__*/React.createElement(_range.default, {
58
62
  value: value,
59
63
  onChange: onChange
@@ -66,9 +70,11 @@ var Slider = exports.Slider = /*#__PURE__*/function (_Component) {
66
70
  }),
67
71
  onClick: function onClick() {
68
72
  return onChange(100);
69
- }
73
+ },
74
+ "aria-label": formatMessage(_mediaUi.messages.image_cropper_zoom_in)
70
75
  }));
71
76
  }
72
77
  }]);
73
78
  }(_react.Component);
74
- (0, _defineProperty2.default)(Slider, "defaultProps", defaultProps);
79
+ (0, _defineProperty2.default)(Slider, "defaultProps", defaultProps);
80
+ var _default = exports.default = (0, _reactIntlNext.injectIntl)(Slider);
package/dist/cjs/index.js CHANGED
@@ -25,7 +25,7 @@ Object.defineProperty(exports, "ImageNavigator", {
25
25
  Object.defineProperty(exports, "Slider", {
26
26
  enumerable: true,
27
27
  get: function get() {
28
- return _slider.Slider;
28
+ return _slider.default;
29
29
  }
30
30
  });
31
31
  Object.defineProperty(exports, "Viewport", {
@@ -49,7 +49,7 @@ Object.defineProperty(exports, "exportCroppedImage", {
49
49
  var _avatarPickerDialogLoader = _interopRequireDefault(require("./avatar-picker-dialog/avatar-picker-dialog-loader"));
50
50
  var _imageNavigator = _interopRequireDefault(require("./image-navigator"));
51
51
  var _imageCropper = _interopRequireDefault(require("./image-cropper"));
52
- var _slider = require("./image-navigator/slider");
52
+ var _slider = _interopRequireDefault(require("./image-navigator/slider"));
53
53
  var _viewport = require("./viewport");
54
54
  var _images = require("./image-navigator/images");
55
55
  var _exportCroppedImage = require("./image-navigator/exportCroppedImage");
@@ -7,4 +7,5 @@ export const PREDEFINED_AVATARS_VIEW_HEIGHT = 290;
7
7
  export const CONTAINER_SIZE = 8 * 32;
8
8
  export const CONTAINER_INNER_SIZE = 8 * 25;
9
9
  export const CONTAINER_PADDING = (CONTAINER_SIZE - CONTAINER_INNER_SIZE) / 2;
10
- export const CONTAINER_RECT = new Rectangle(CONTAINER_SIZE, CONTAINER_SIZE);
10
+ export const CONTAINER_RECT = new Rectangle(CONTAINER_SIZE, CONTAINER_SIZE);
11
+ export const IMAGE_MOVE_UNIT = 5;
@@ -1,6 +1,7 @@
1
1
 
2
2
  ._2rko14q2{border-radius:var(--ds-border-radius-circle,2002pc)}
3
- ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._154i1b66{top:var(--ds-space-050,4px)}
3
+ ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}
4
+ ._154i1b66{top:var(--ds-space-050,4px)}
4
5
  ._18m915vq{overflow-y:hidden}
5
6
  ._1bsb1osq{width:100%}
6
7
  ._1reo15vq{overflow-x:hidden}
@@ -9,4 +10,7 @@
9
10
  ._80om15ng{cursor:move}
10
11
  ._kqswh2mm{position:relative}
11
12
  ._kqswstnw{position:absolute}
12
- ._uiztglyw{-webkit-user-select:none;-ms-user-select:none;user-select:none}
13
+ ._uiztglyw{-webkit-user-select:none;-ms-user-select:none;user-select:none}._128m1bk5:focus-visible{outline-width:var(--ds-border-width-outline,2px)}
14
+ ._1ah3v77o:focus-visible{outline-offset:var(--ds-space-025,2px)}
15
+ ._mizu1p6i:focus-visible{outline-color:var(--ds-border-focused,#388bff)}
16
+ ._ra3xnqa1:focus-visible{outline-style:solid}
@@ -22,7 +22,7 @@ const dragOverlayStyles = {
22
22
  root: "_kqswstnw _1bsb1osq _4t3i1osq _80om15ng"
23
23
  };
24
24
  const maskPositionStyle = {
25
- root: "_kqswstnw"
25
+ root: "_kqswstnw _1ah3v77o _128m1bk5 _mizu1p6i _ra3xnqa1"
26
26
  };
27
27
  const maskStyles = {
28
28
  top: `${CONTAINER_PADDING}px`,
@@ -32,6 +32,15 @@ const maskStyles = {
32
32
  opacity: "var(--ds-opacity-disabled, 0.4)",
33
33
  boxShadow: `0 0 0 100px ${"var(--ds-surface-overlay, rgba(255, 255, 255))"}`
34
34
  };
35
+ const offscreenStyles = {
36
+ clip: 'rect(1px, 1px, 1px, 1px)',
37
+ clipPath: 'inset(50%)',
38
+ height: '1px',
39
+ width: '1px',
40
+ margin: '-1px',
41
+ overflow: 'hidden',
42
+ padding: 0
43
+ };
35
44
  const rectMaskStyles = {
36
45
  root: "_2rkoiti9"
37
46
  };
@@ -47,6 +56,49 @@ const imageContainerStyles = {
47
56
  export class ImageCropper extends Component {
48
57
  constructor(...args) {
49
58
  super(...args);
59
+ _defineProperty(this, "state", {
60
+ liveMsg: ''
61
+ });
62
+ _defineProperty(this, "onKeyDown", e => {
63
+ const {
64
+ intl: {
65
+ formatMessage
66
+ }
67
+ } = this.props;
68
+ let msg = '';
69
+ switch (e.key) {
70
+ case 'ArrowLeft':
71
+ msg = formatMessage(messages.image_cropper_image_moved, {
72
+ from: 'left',
73
+ to: 'right'
74
+ });
75
+ break;
76
+ case 'ArrowRight':
77
+ msg = formatMessage(messages.image_cropper_image_moved, {
78
+ from: 'right',
79
+ to: 'left'
80
+ });
81
+ break;
82
+ case 'ArrowUp':
83
+ msg = formatMessage(messages.image_cropper_image_moved, {
84
+ from: 'top',
85
+ to: 'bottom'
86
+ });
87
+ break;
88
+ case 'ArrowDown':
89
+ msg = formatMessage(messages.image_cropper_image_moved, {
90
+ from: 'bottom',
91
+ to: 'top'
92
+ });
93
+ break;
94
+ default:
95
+ return;
96
+ }
97
+ this.props.moveImage && this.props.moveImage(e.key);
98
+ this.setState({
99
+ liveMsg: msg
100
+ });
101
+ });
50
102
  _defineProperty(this, "onDragStarted", e => {
51
103
  if (this.props.onDragStarted) {
52
104
  this.props.onDragStarted(e.screenX, e.screenY);
@@ -125,16 +177,39 @@ export class ImageCropper extends Component {
125
177
  onImageLoad: onImageLoaded,
126
178
  onImageError: this.onImageError
127
179
  })), isCircularMask ? /*#__PURE__*/React.createElement(Box, {
128
- xcss: cx(circularMaskStyles.root, maskPositionStyle.root),
129
- style: maskStyles
180
+ testId: "image-cropper-mask",
181
+ xcss: cx(circularMaskStyles.root, maskPositionStyle.root)
182
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
183
+ ,
184
+ style: maskStyles,
185
+ tabIndex: 0,
186
+ onKeyDown: this.onKeyDown,
187
+ "aria-label": formatMessage(messages.image_cropper_arrow_keys_label)
130
188
  }) : /*#__PURE__*/React.createElement(Box, {
131
- xcss: cx(rectMaskStyles.root, maskPositionStyle.root),
132
- style: maskStyles
189
+ testId: "image-cropper-mask",
190
+ xcss: cx(rectMaskStyles.root, maskPositionStyle.root)
191
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
192
+ ,
193
+ style: maskStyles,
194
+ tabIndex: 0,
195
+ onKeyDown: this.onKeyDown,
196
+ "aria-label": formatMessage(messages.image_cropper_arrow_keys_label)
133
197
  }), /*#__PURE__*/React.createElement(Box, {
134
198
  id: "drag-overlay",
135
199
  xcss: dragOverlayStyles.root,
136
200
  onMouseDown: this.onDragStarted
137
- }), /*#__PURE__*/React.createElement(Box, {
201
+ }), /*#__PURE__*/React.createElement("div", {
202
+ id: "image-cropper-image-movements-log",
203
+ "aria-live": "assertive",
204
+ role: "log",
205
+ "aria-atomic": "true"
206
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
207
+ ,
208
+ style: {
209
+ ...offscreenStyles,
210
+ position: 'absolute'
211
+ }
212
+ }, this.state.liveMsg), /*#__PURE__*/React.createElement(Box, {
138
213
  id: "remove-image-container",
139
214
  xcss: removeImageContainerStyles.root
140
215
  }, /*#__PURE__*/React.createElement(IconButton, {
@@ -15,8 +15,8 @@ import { uploadPlaceholder, errorIcon } from './images';
15
15
  import { fileSizeMb } from '../util';
16
16
  import { ERROR, MAX_SIZE_MB, ACCEPT } from '../avatar-picker-dialog';
17
17
  import { Viewport } from '../viewport';
18
- import { Slider } from './slider';
19
- import { CONTAINER_SIZE, CONTAINER_PADDING } from '../avatar-picker-dialog/layout-const';
18
+ import Slider from './slider';
19
+ import { CONTAINER_SIZE, CONTAINER_PADDING, IMAGE_MOVE_UNIT } from '../avatar-picker-dialog/layout-const';
20
20
  import { DragZone } from './dragZone';
21
21
  import { exportCroppedImage } from './exportCroppedImage';
22
22
  const checkeredBg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAABCJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpTZXEvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4OjA3OjE4IDEwOjA3OjUwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuNy4zPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrsp//0AAAAKUlEQVQIHWP8//8/Aww8ffoUxmRggrPQGKRLsCCbKy0tDTeQdKNw6gAAbSMIvvnXfF4AAAAASUVORK5CYII=';
@@ -54,6 +54,30 @@ export class ImageNavigator extends Component {
54
54
  dragStartPoint: new Vector2(x, y)
55
55
  });
56
56
  });
57
+ _defineProperty(this, "moveImage", key => {
58
+ const {
59
+ viewport
60
+ } = this.state;
61
+ switch (key) {
62
+ case 'ArrowLeft':
63
+ viewport.dragMove(viewport.itemBounds.x + IMAGE_MOVE_UNIT, viewport.itemBounds.y);
64
+ break;
65
+ case 'ArrowRight':
66
+ viewport.dragMove(viewport.itemBounds.x - IMAGE_MOVE_UNIT, viewport.itemBounds.y);
67
+ break;
68
+ case 'ArrowUp':
69
+ viewport.dragMove(viewport.itemBounds.x, viewport.itemBounds.y + IMAGE_MOVE_UNIT);
70
+ break;
71
+ case 'ArrowDown':
72
+ viewport.dragMove(viewport.itemBounds.x, viewport.itemBounds.y - IMAGE_MOVE_UNIT);
73
+ break;
74
+ default:
75
+ return;
76
+ }
77
+ this.setState({
78
+ viewport
79
+ });
80
+ });
57
81
  _defineProperty(this, "onMouseMove", e => {
58
82
  if (this.state.isDragging) {
59
83
  const {
@@ -323,7 +347,8 @@ export class ImageNavigator extends Component {
323
347
  const {
324
348
  onDragStarted,
325
349
  onImageLoaded,
326
- onRemoveImage
350
+ onRemoveImage,
351
+ moveImage
327
352
  } = this;
328
353
  const {
329
354
  itemBounds
@@ -345,7 +370,8 @@ export class ImageNavigator extends Component {
345
370
  onDragStarted: onDragStarted,
346
371
  onImageLoaded: onImageLoaded,
347
372
  onRemoveImage: onRemoveImage,
348
- onImageError: onImageError
373
+ onImageError: onImageError,
374
+ moveImage: moveImage
349
375
  }), /*#__PURE__*/React.createElement("div", {
350
376
  className: ax(["_4cvr1h6o _1bah1h6o _1e0c1txw _2lx2vrvc _19pku2gc _bfhk1bhr _v69yidpf _ogxmidpf _1qtqidpf _n9z4idpf _40631ntv"])
351
377
  }, /*#__PURE__*/React.createElement(Slider, {
@@ -5,9 +5,11 @@ import * as React from 'react';
5
5
  import { ax, ix } from "@compiled/react/runtime";
6
6
  import { Component } from 'react';
7
7
  import FieldRange from '@atlaskit/range';
8
+ import { messages } from '@atlaskit/media-ui';
8
9
  import ScaleLargeIcon from '@atlaskit/icon/core/migration/image--media-services-scale-large';
9
10
  import ScaleSmallIcon from '@atlaskit/icon/core/migration/image--media-services-scale-small';
10
11
  import Button from '@atlaskit/button/standard-button';
12
+ import { injectIntl } from 'react-intl-next';
11
13
  export const defaultProps = {
12
14
  value: 0
13
15
  };
@@ -16,7 +18,10 @@ export class Slider extends Component {
16
18
  render() {
17
19
  const {
18
20
  value,
19
- onChange
21
+ onChange,
22
+ intl: {
23
+ formatMessage
24
+ }
20
25
  } = this.props;
21
26
  return /*#__PURE__*/React.createElement("div", {
22
27
  "data-testid": "slider",
@@ -28,7 +33,8 @@ export class Slider extends Component {
28
33
  iconAfter: /*#__PURE__*/React.createElement(ScaleSmallIcon, {
29
34
  label: "scale-small-icon"
30
35
  }),
31
- onClick: () => onChange(0)
36
+ onClick: () => onChange(0),
37
+ "aria-label": formatMessage(messages.image_cropper_zoom_out)
32
38
  }), /*#__PURE__*/React.createElement(FieldRange, {
33
39
  value: value,
34
40
  onChange: onChange
@@ -39,8 +45,10 @@ export class Slider extends Component {
39
45
  iconAfter: /*#__PURE__*/React.createElement(ScaleLargeIcon, {
40
46
  label: "scale-large-icon"
41
47
  }),
42
- onClick: () => onChange(100)
48
+ onClick: () => onChange(100),
49
+ "aria-label": formatMessage(messages.image_cropper_zoom_in)
43
50
  }));
44
51
  }
45
52
  }
46
- _defineProperty(Slider, "defaultProps", defaultProps);
53
+ _defineProperty(Slider, "defaultProps", defaultProps);
54
+ export default injectIntl(Slider);
@@ -1,7 +1,7 @@
1
1
  export { default as AvatarPickerDialog } from './avatar-picker-dialog/avatar-picker-dialog-loader';
2
2
  export { default as ImageNavigator } from './image-navigator';
3
3
  export { default as ImageCropper } from './image-cropper';
4
- export { Slider } from './image-navigator/slider';
4
+ export { default as Slider } from './image-navigator/slider';
5
5
  export { Viewport } from './viewport';
6
6
  export { checkeredBg } from './image-navigator/images';
7
7
  export { exportCroppedImage } from './image-navigator/exportCroppedImage';
@@ -7,4 +7,5 @@ export var PREDEFINED_AVATARS_VIEW_HEIGHT = 290;
7
7
  export var CONTAINER_SIZE = 8 * 32;
8
8
  export var CONTAINER_INNER_SIZE = 8 * 25;
9
9
  export var CONTAINER_PADDING = (CONTAINER_SIZE - CONTAINER_INNER_SIZE) / 2;
10
- export var CONTAINER_RECT = new Rectangle(CONTAINER_SIZE, CONTAINER_SIZE);
10
+ export var CONTAINER_RECT = new Rectangle(CONTAINER_SIZE, CONTAINER_SIZE);
11
+ export var IMAGE_MOVE_UNIT = 5;
@@ -1,6 +1,7 @@
1
1
 
2
2
  ._2rko14q2{border-radius:var(--ds-border-radius-circle,2002pc)}
3
- ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._154i1b66{top:var(--ds-space-050,4px)}
3
+ ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}
4
+ ._154i1b66{top:var(--ds-space-050,4px)}
4
5
  ._18m915vq{overflow-y:hidden}
5
6
  ._1bsb1osq{width:100%}
6
7
  ._1reo15vq{overflow-x:hidden}
@@ -9,4 +10,7 @@
9
10
  ._80om15ng{cursor:move}
10
11
  ._kqswh2mm{position:relative}
11
12
  ._kqswstnw{position:absolute}
12
- ._uiztglyw{-webkit-user-select:none;-ms-user-select:none;user-select:none}
13
+ ._uiztglyw{-webkit-user-select:none;-ms-user-select:none;user-select:none}._128m1bk5:focus-visible{outline-width:var(--ds-border-width-outline,2px)}
14
+ ._1ah3v77o:focus-visible{outline-offset:var(--ds-space-025,2px)}
15
+ ._mizu1p6i:focus-visible{outline-color:var(--ds-border-focused,#388bff)}
16
+ ._ra3xnqa1:focus-visible{outline-style:solid}
@@ -8,6 +8,8 @@ import _inherits from "@babel/runtime/helpers/inherits";
8
8
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
9
9
  import "./index.compiled.css";
10
10
  import { ax, ix } from "@compiled/react/runtime";
11
+ 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; }
12
+ 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; }
11
13
  function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
12
14
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
13
15
  import React from 'react';
@@ -29,7 +31,7 @@ var dragOverlayStyles = {
29
31
  root: "_kqswstnw _1bsb1osq _4t3i1osq _80om15ng"
30
32
  };
31
33
  var maskPositionStyle = {
32
- root: "_kqswstnw"
34
+ root: "_kqswstnw _1ah3v77o _128m1bk5 _mizu1p6i _ra3xnqa1"
33
35
  };
34
36
  var maskStyles = {
35
37
  top: "".concat(CONTAINER_PADDING, "px"),
@@ -39,6 +41,15 @@ var maskStyles = {
39
41
  opacity: "var(--ds-opacity-disabled, 0.4)",
40
42
  boxShadow: "0 0 0 100px ".concat("var(--ds-surface-overlay, rgba(255, 255, 255))")
41
43
  };
44
+ var offscreenStyles = {
45
+ clip: 'rect(1px, 1px, 1px, 1px)',
46
+ clipPath: 'inset(50%)',
47
+ height: '1px',
48
+ width: '1px',
49
+ margin: '-1px',
50
+ overflow: 'hidden',
51
+ padding: 0
52
+ };
42
53
  var rectMaskStyles = {
43
54
  root: "_2rkoiti9"
44
55
  };
@@ -59,6 +70,45 @@ export var ImageCropper = /*#__PURE__*/function (_Component) {
59
70
  args[_key] = arguments[_key];
60
71
  }
61
72
  _this = _callSuper(this, ImageCropper, [].concat(args));
73
+ _defineProperty(_this, "state", {
74
+ liveMsg: ''
75
+ });
76
+ _defineProperty(_this, "onKeyDown", function (e) {
77
+ var formatMessage = _this.props.intl.formatMessage;
78
+ var msg = '';
79
+ switch (e.key) {
80
+ case 'ArrowLeft':
81
+ msg = formatMessage(messages.image_cropper_image_moved, {
82
+ from: 'left',
83
+ to: 'right'
84
+ });
85
+ break;
86
+ case 'ArrowRight':
87
+ msg = formatMessage(messages.image_cropper_image_moved, {
88
+ from: 'right',
89
+ to: 'left'
90
+ });
91
+ break;
92
+ case 'ArrowUp':
93
+ msg = formatMessage(messages.image_cropper_image_moved, {
94
+ from: 'top',
95
+ to: 'bottom'
96
+ });
97
+ break;
98
+ case 'ArrowDown':
99
+ msg = formatMessage(messages.image_cropper_image_moved, {
100
+ from: 'bottom',
101
+ to: 'top'
102
+ });
103
+ break;
104
+ default:
105
+ return;
106
+ }
107
+ _this.props.moveImage && _this.props.moveImage(e.key);
108
+ _this.setState({
109
+ liveMsg: msg
110
+ });
111
+ });
62
112
  _defineProperty(_this, "onDragStarted", function (e) {
63
113
  if (_this.props.onDragStarted) {
64
114
  _this.props.onDragStarted(e.screenX, e.screenY);
@@ -134,16 +184,38 @@ export var ImageCropper = /*#__PURE__*/function (_Component) {
134
184
  onImageLoad: onImageLoaded,
135
185
  onImageError: this.onImageError
136
186
  })), isCircularMask ? /*#__PURE__*/React.createElement(Box, {
137
- xcss: cx(circularMaskStyles.root, maskPositionStyle.root),
138
- style: maskStyles
187
+ testId: "image-cropper-mask",
188
+ xcss: cx(circularMaskStyles.root, maskPositionStyle.root)
189
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
190
+ ,
191
+ style: maskStyles,
192
+ tabIndex: 0,
193
+ onKeyDown: this.onKeyDown,
194
+ "aria-label": formatMessage(messages.image_cropper_arrow_keys_label)
139
195
  }) : /*#__PURE__*/React.createElement(Box, {
140
- xcss: cx(rectMaskStyles.root, maskPositionStyle.root),
141
- style: maskStyles
196
+ testId: "image-cropper-mask",
197
+ xcss: cx(rectMaskStyles.root, maskPositionStyle.root)
198
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
199
+ ,
200
+ style: maskStyles,
201
+ tabIndex: 0,
202
+ onKeyDown: this.onKeyDown,
203
+ "aria-label": formatMessage(messages.image_cropper_arrow_keys_label)
142
204
  }), /*#__PURE__*/React.createElement(Box, {
143
205
  id: "drag-overlay",
144
206
  xcss: dragOverlayStyles.root,
145
207
  onMouseDown: this.onDragStarted
146
- }), /*#__PURE__*/React.createElement(Box, {
208
+ }), /*#__PURE__*/React.createElement("div", {
209
+ id: "image-cropper-image-movements-log",
210
+ "aria-live": "assertive",
211
+ role: "log",
212
+ "aria-atomic": "true"
213
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
214
+ ,
215
+ style: _objectSpread(_objectSpread({}, offscreenStyles), {}, {
216
+ position: 'absolute'
217
+ })
218
+ }, this.state.liveMsg), /*#__PURE__*/React.createElement(Box, {
147
219
  id: "remove-image-container",
148
220
  xcss: removeImageContainerStyles.root
149
221
  }, /*#__PURE__*/React.createElement(IconButton, {
@@ -25,8 +25,8 @@ import { uploadPlaceholder, errorIcon } from './images';
25
25
  import { fileSizeMb } from '../util';
26
26
  import { ERROR, MAX_SIZE_MB, ACCEPT } from '../avatar-picker-dialog';
27
27
  import { Viewport } from '../viewport';
28
- import { Slider } from './slider';
29
- import { CONTAINER_SIZE, CONTAINER_PADDING } from '../avatar-picker-dialog/layout-const';
28
+ import Slider from './slider';
29
+ import { CONTAINER_SIZE, CONTAINER_PADDING, IMAGE_MOVE_UNIT } from '../avatar-picker-dialog/layout-const';
30
30
  import { DragZone } from './dragZone';
31
31
  import { exportCroppedImage } from './exportCroppedImage';
32
32
  var checkeredBg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAABCJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpTZXEvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4OjA3OjE4IDEwOjA3OjUwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuNy4zPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrsp//0AAAAKUlEQVQIHWP8//8/Aww8ffoUxmRggrPQGKRLsCCbKy0tDTeQdKNw6gAAbSMIvvnXfF4AAAAASUVORK5CYII=';
@@ -69,6 +69,28 @@ export var ImageNavigator = /*#__PURE__*/function (_Component) {
69
69
  dragStartPoint: new Vector2(x, y)
70
70
  });
71
71
  });
72
+ _defineProperty(_this, "moveImage", function (key) {
73
+ var viewport = _this.state.viewport;
74
+ switch (key) {
75
+ case 'ArrowLeft':
76
+ viewport.dragMove(viewport.itemBounds.x + IMAGE_MOVE_UNIT, viewport.itemBounds.y);
77
+ break;
78
+ case 'ArrowRight':
79
+ viewport.dragMove(viewport.itemBounds.x - IMAGE_MOVE_UNIT, viewport.itemBounds.y);
80
+ break;
81
+ case 'ArrowUp':
82
+ viewport.dragMove(viewport.itemBounds.x, viewport.itemBounds.y + IMAGE_MOVE_UNIT);
83
+ break;
84
+ case 'ArrowDown':
85
+ viewport.dragMove(viewport.itemBounds.x, viewport.itemBounds.y - IMAGE_MOVE_UNIT);
86
+ break;
87
+ default:
88
+ return;
89
+ }
90
+ _this.setState({
91
+ viewport: viewport
92
+ });
93
+ });
72
94
  _defineProperty(_this, "onMouseMove", function (e) {
73
95
  if (_this.state.isDragging) {
74
96
  var _this$state = _this.state,
@@ -361,7 +383,8 @@ export var ImageNavigator = /*#__PURE__*/function (_Component) {
361
383
  var onImageError = this.props.onImageError;
362
384
  var onDragStarted = this.onDragStarted,
363
385
  onImageLoaded = this.onImageLoaded,
364
- onRemoveImage = this.onRemoveImage;
386
+ onRemoveImage = this.onRemoveImage,
387
+ moveImage = this.moveImage;
365
388
  var itemBounds = viewport.itemBounds;
366
389
  return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
367
390
  style: {
@@ -380,7 +403,8 @@ export var ImageNavigator = /*#__PURE__*/function (_Component) {
380
403
  onDragStarted: onDragStarted,
381
404
  onImageLoaded: onImageLoaded,
382
405
  onRemoveImage: onRemoveImage,
383
- onImageError: onImageError
406
+ onImageError: onImageError,
407
+ moveImage: moveImage
384
408
  }), /*#__PURE__*/React.createElement("div", {
385
409
  className: ax(["_4cvr1h6o _1bah1h6o _1e0c1txw _2lx2vrvc _19pku2gc _bfhk1bhr _v69yidpf _ogxmidpf _1qtqidpf _n9z4idpf _40631ntv"])
386
410
  }, /*#__PURE__*/React.createElement(Slider, {
@@ -12,9 +12,11 @@ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstruct
12
12
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
13
13
  import { Component } from 'react';
14
14
  import FieldRange from '@atlaskit/range';
15
+ import { messages } from '@atlaskit/media-ui';
15
16
  import ScaleLargeIcon from '@atlaskit/icon/core/migration/image--media-services-scale-large';
16
17
  import ScaleSmallIcon from '@atlaskit/icon/core/migration/image--media-services-scale-small';
17
18
  import Button from '@atlaskit/button/standard-button';
19
+ import { injectIntl } from 'react-intl-next';
18
20
  export var defaultProps = {
19
21
  value: 0
20
22
  };
@@ -30,7 +32,8 @@ export var Slider = /*#__PURE__*/function (_Component) {
30
32
  value: function render() {
31
33
  var _this$props = this.props,
32
34
  value = _this$props.value,
33
- onChange = _this$props.onChange;
35
+ onChange = _this$props.onChange,
36
+ formatMessage = _this$props.intl.formatMessage;
34
37
  return /*#__PURE__*/React.createElement("div", {
35
38
  "data-testid": "slider",
36
39
  className: ax(["_1e0c1txw _4cvr1h6o _1bsb1osq _yw87h2mm _1grc1i6y"])
@@ -43,7 +46,8 @@ export var Slider = /*#__PURE__*/function (_Component) {
43
46
  }),
44
47
  onClick: function onClick() {
45
48
  return onChange(0);
46
- }
49
+ },
50
+ "aria-label": formatMessage(messages.image_cropper_zoom_out)
47
51
  }), /*#__PURE__*/React.createElement(FieldRange, {
48
52
  value: value,
49
53
  onChange: onChange
@@ -56,9 +60,11 @@ export var Slider = /*#__PURE__*/function (_Component) {
56
60
  }),
57
61
  onClick: function onClick() {
58
62
  return onChange(100);
59
- }
63
+ },
64
+ "aria-label": formatMessage(messages.image_cropper_zoom_in)
60
65
  }));
61
66
  }
62
67
  }]);
63
68
  }(Component);
64
- _defineProperty(Slider, "defaultProps", defaultProps);
69
+ _defineProperty(Slider, "defaultProps", defaultProps);
70
+ export default injectIntl(Slider);
package/dist/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { default as AvatarPickerDialog } from './avatar-picker-dialog/avatar-picker-dialog-loader';
2
2
  export { default as ImageNavigator } from './image-navigator';
3
3
  export { default as ImageCropper } from './image-cropper';
4
- export { Slider } from './image-navigator/slider';
4
+ export { default as Slider } from './image-navigator/slider';
5
5
  export { Viewport } from './viewport';
6
6
  export { checkeredBg } from './image-navigator/images';
7
7
  export { exportCroppedImage } from './image-navigator/exportCroppedImage';
@@ -8,3 +8,4 @@ export declare const CONTAINER_SIZE: number;
8
8
  export declare const CONTAINER_INNER_SIZE: number;
9
9
  export declare const CONTAINER_PADDING: number;
10
10
  export declare const CONTAINER_RECT: Rectangle;
11
+ export declare const IMAGE_MOVE_UNIT = 5;
@@ -14,6 +14,7 @@ export interface ImageCropperProp {
14
14
  onImageLoaded: (image: HTMLImageElement) => void;
15
15
  onRemoveImage: () => void;
16
16
  onImageError: (errorMessage: string) => void;
17
+ moveImage?: (key: string) => void;
17
18
  }
18
19
  export declare class ImageCropper extends Component<ImageCropperProp & WrappedComponentProps, {}> {
19
20
  static defaultProps: {
@@ -22,7 +23,11 @@ export declare class ImageCropper extends Component<ImageCropperProp & WrappedCo
22
23
  onDragStarted: () => void;
23
24
  onImageSize: () => void;
24
25
  };
26
+ state: {
27
+ liveMsg: string;
28
+ };
25
29
  componentDidMount(): void;
30
+ onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;
26
31
  onDragStarted: (e: React.MouseEvent<{}>) => void;
27
32
  onImageError: () => void;
28
33
  render(): React.JSX.Element | null;
@@ -47,6 +47,7 @@ export declare class ImageNavigator extends Component<Props & WrappedComponentPr
47
47
  componentDidMount(): void;
48
48
  componentWillUnmount(): void;
49
49
  onDragStarted: (x: number, y: number) => void;
50
+ moveImage: (key: string) => void;
50
51
  onMouseMove: (e: MouseEvent) => void;
51
52
  onMouseUp: () => void;
52
53
  /**
@@ -1,4 +1,5 @@
1
1
  import { Component } from 'react';
2
+ import { WrappedComponentProps } from 'react-intl-next';
2
3
  export interface SliderProps {
3
4
  value: number;
4
5
  onChange: (value: number) => void;
@@ -6,9 +7,13 @@ export interface SliderProps {
6
7
  export declare const defaultProps: {
7
8
  value: number;
8
9
  };
9
- export declare class Slider extends Component<SliderProps, {}> {
10
+ export declare class Slider extends Component<SliderProps & WrappedComponentProps, {}> {
10
11
  static defaultProps: {
11
12
  value: number;
12
13
  };
13
14
  render(): JSX.Element;
14
15
  }
16
+ declare const _default: import("react").FC<import("react-intl-next").WithIntlProps<SliderProps & WrappedComponentProps>> & {
17
+ WrappedComponent: import("react").ComponentType<SliderProps & WrappedComponentProps>;
18
+ };
19
+ export default _default;
@@ -4,7 +4,7 @@ export { default as ImageNavigator } from './image-navigator';
4
4
  export type { Props as ImageNavigatorProps, OnLoadHandler, LoadParameters, } from './image-navigator';
5
5
  export type { Avatar } from './avatar-list';
6
6
  export { default as ImageCropper } from './image-cropper';
7
- export { Slider } from './image-navigator/slider';
7
+ export { default as Slider } from './image-navigator/slider';
8
8
  export { Viewport } from './viewport';
9
9
  export { checkeredBg } from './image-navigator/images';
10
10
  export { exportCroppedImage } from './image-navigator/exportCroppedImage';
@@ -8,3 +8,4 @@ export declare const CONTAINER_SIZE: number;
8
8
  export declare const CONTAINER_INNER_SIZE: number;
9
9
  export declare const CONTAINER_PADDING: number;
10
10
  export declare const CONTAINER_RECT: Rectangle;
11
+ export declare const IMAGE_MOVE_UNIT = 5;
@@ -14,6 +14,7 @@ export interface ImageCropperProp {
14
14
  onImageLoaded: (image: HTMLImageElement) => void;
15
15
  onRemoveImage: () => void;
16
16
  onImageError: (errorMessage: string) => void;
17
+ moveImage?: (key: string) => void;
17
18
  }
18
19
  export declare class ImageCropper extends Component<ImageCropperProp & WrappedComponentProps, {}> {
19
20
  static defaultProps: {
@@ -22,7 +23,11 @@ export declare class ImageCropper extends Component<ImageCropperProp & WrappedCo
22
23
  onDragStarted: () => void;
23
24
  onImageSize: () => void;
24
25
  };
26
+ state: {
27
+ liveMsg: string;
28
+ };
25
29
  componentDidMount(): void;
30
+ onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;
26
31
  onDragStarted: (e: React.MouseEvent<{}>) => void;
27
32
  onImageError: () => void;
28
33
  render(): React.JSX.Element | null;
@@ -47,6 +47,7 @@ export declare class ImageNavigator extends Component<Props & WrappedComponentPr
47
47
  componentDidMount(): void;
48
48
  componentWillUnmount(): void;
49
49
  onDragStarted: (x: number, y: number) => void;
50
+ moveImage: (key: string) => void;
50
51
  onMouseMove: (e: MouseEvent) => void;
51
52
  onMouseUp: () => void;
52
53
  /**
@@ -1,4 +1,5 @@
1
1
  import { Component } from 'react';
2
+ import { WrappedComponentProps } from 'react-intl-next';
2
3
  export interface SliderProps {
3
4
  value: number;
4
5
  onChange: (value: number) => void;
@@ -6,9 +7,13 @@ export interface SliderProps {
6
7
  export declare const defaultProps: {
7
8
  value: number;
8
9
  };
9
- export declare class Slider extends Component<SliderProps, {}> {
10
+ export declare class Slider extends Component<SliderProps & WrappedComponentProps, {}> {
10
11
  static defaultProps: {
11
12
  value: number;
12
13
  };
13
14
  render(): JSX.Element;
14
15
  }
16
+ declare const _default: import("react").FC<import("react-intl-next").WithIntlProps<SliderProps & WrappedComponentProps>> & {
17
+ WrappedComponent: import("react").ComponentType<SliderProps & WrappedComponentProps>;
18
+ };
19
+ export default _default;
@@ -4,7 +4,7 @@ export { default as ImageNavigator } from './image-navigator';
4
4
  export type { Props as ImageNavigatorProps, OnLoadHandler, LoadParameters, } from './image-navigator';
5
5
  export type { Avatar } from './avatar-list';
6
6
  export { default as ImageCropper } from './image-cropper';
7
- export { Slider } from './image-navigator/slider';
7
+ export { default as Slider } from './image-navigator/slider';
8
8
  export { Viewport } from './viewport';
9
9
  export { checkeredBg } from './image-navigator/images';
10
10
  export { exportCroppedImage } from './image-navigator/exportCroppedImage';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-avatar-picker",
3
- "version": "26.0.7",
3
+ "version": "26.1.0",
4
4
  "description": "A component to select, drag and resize image avatars. It also provides a default list of predefined avatars.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -35,19 +35,19 @@
35
35
  "runReact18": true
36
36
  },
37
37
  "dependencies": {
38
- "@atlaskit/button": "^22.0.0",
38
+ "@atlaskit/button": "^23.0.0",
39
39
  "@atlaskit/css": "^0.10.0",
40
40
  "@atlaskit/flag": "^17.1.0",
41
41
  "@atlaskit/form": "^12.0.0",
42
- "@atlaskit/icon": "^25.2.0",
42
+ "@atlaskit/icon": "^25.6.0",
43
43
  "@atlaskit/media-ui": "^28.1.0",
44
- "@atlaskit/modal-dialog": "^14.0.0",
45
- "@atlaskit/primitives": "^14.2.0",
44
+ "@atlaskit/modal-dialog": "^14.1.0",
45
+ "@atlaskit/primitives": "^14.4.0",
46
46
  "@atlaskit/range": "^9.0.0",
47
47
  "@atlaskit/spinner": "^18.0.0",
48
48
  "@atlaskit/textfield": "^8.0.0",
49
49
  "@atlaskit/theme": "^18.0.0",
50
- "@atlaskit/tokens": "^4.5.0",
50
+ "@atlaskit/tokens": "^4.8.0",
51
51
  "@atlaskit/visually-hidden": "^3.0.0",
52
52
  "@babel/runtime": "^7.0.0",
53
53
  "@compiled/react": "^0.18.3",