@atlaskit/media-avatar-picker 24.3.0 → 24.3.2
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 +12 -0
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/version.json +1 -1
- package/dist/esm/version.json +1 -1
- package/dist/types/avatar-picker-dialog/avatar-picker-dialog-loader.d.ts +1 -1
- package/dist/types/avatar-picker-dialog/index.d.ts +2 -2
- package/dist/types/image-navigator/index.d.ts +2 -2
- package/dist/types/image-placer/styles.d.ts +2 -2
- package/dist/types/viewport/viewport-render.d.ts +1 -1
- package/dist/types-ts4.5/avatar-list/index.d.ts +19 -0
- package/dist/types-ts4.5/avatar-list/styles.d.ts +6 -0
- package/dist/types-ts4.5/avatar-picker-dialog/avatar-picker-dialog-loader.d.ts +19 -0
- package/dist/types-ts4.5/avatar-picker-dialog/index.d.ts +49 -0
- package/dist/types-ts4.5/avatar-picker-dialog/layout-const.d.ts +10 -0
- package/dist/types-ts4.5/avatar-picker-dialog/styles.d.ts +4 -0
- package/dist/types-ts4.5/avatar-picker-dialog/types.d.ts +49 -0
- package/dist/types-ts4.5/image-cropper/crop-to-data-uri.d.ts +7 -0
- package/dist/types-ts4.5/image-cropper/index.d.ts +33 -0
- package/dist/types-ts4.5/image-cropper/isImageRemote.d.ts +1 -0
- package/dist/types-ts4.5/image-cropper/styles.d.ts +20 -0
- package/dist/types-ts4.5/image-navigator/dragZone.d.ts +3 -0
- package/dist/types-ts4.5/image-navigator/images.d.ts +3 -0
- package/dist/types-ts4.5/image-navigator/index.d.ts +80 -0
- package/dist/types-ts4.5/image-navigator/slider.d.ts +16 -0
- package/dist/types-ts4.5/image-navigator/styles.d.ts +21 -0
- package/dist/types-ts4.5/image-placer/constraints.d.ts +6 -0
- package/dist/types-ts4.5/image-placer/container.d.ts +28 -0
- package/dist/types-ts4.5/image-placer/containerWrapper.d.ts +3 -0
- package/dist/types-ts4.5/image-placer/image.d.ts +20 -0
- package/dist/types-ts4.5/image-placer/imagePlacerErrorWrapper.d.ts +3 -0
- package/dist/types-ts4.5/image-placer/imageProcessor.d.ts +16 -0
- package/dist/types-ts4.5/image-placer/imageWrapper.d.ts +3 -0
- package/dist/types-ts4.5/image-placer/index.d.ts +105 -0
- package/dist/types-ts4.5/image-placer/margin.d.ts +14 -0
- package/dist/types-ts4.5/image-placer/styles.d.ts +35 -0
- package/dist/types-ts4.5/index.d.ts +5 -0
- package/dist/types-ts4.5/predefined-avatar-list/index.d.ts +17 -0
- package/dist/types-ts4.5/predefined-avatar-list/styles.d.ts +1 -0
- package/dist/types-ts4.5/predefined-avatar-view/index.d.ts +19 -0
- package/dist/types-ts4.5/predefined-avatar-view/largeImageAvatar.d.ts +3 -0
- package/dist/types-ts4.5/predefined-avatar-view/smallImageAvatar.d.ts +3 -0
- package/dist/types-ts4.5/predefined-avatar-view/styles.d.ts +3 -0
- package/dist/types-ts4.5/util.d.ts +5 -0
- package/dist/types-ts4.5/viewport/index.d.ts +2 -0
- package/dist/types-ts4.5/viewport/viewport-render.d.ts +3 -0
- package/dist/types-ts4.5/viewport/viewport.d.ts +57 -0
- package/package.json +12 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atlaskit/media-avatar-picker
|
|
2
2
|
|
|
3
|
+
## 24.3.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
|
|
9
|
+
## 24.3.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [`41fae2c6f68`](https://bitbucket.org/atlassian/atlassian-frontend/commits/41fae2c6f68) - Upgrade Typescript from `4.5.5` to `4.9.5`
|
|
14
|
+
|
|
3
15
|
## 24.3.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/dist/cjs/version.json
CHANGED
package/dist/es2019/version.json
CHANGED
package/dist/esm/version.json
CHANGED
|
@@ -5,7 +5,7 @@ import { AvatarPickerDialogProps } from './types';
|
|
|
5
5
|
export interface AsyncAvatarPickerDialogState {
|
|
6
6
|
AvatarPickerDialog?: typeof AvatarPickerDialog;
|
|
7
7
|
}
|
|
8
|
-
export
|
|
8
|
+
export type AsyncAvatarPickerDialogProps = AvatarPickerDialogProps & {
|
|
9
9
|
placeholder?: ReactNode;
|
|
10
10
|
};
|
|
11
11
|
export default class AsyncAvatarPickerDialog extends React.PureComponent<AsyncAvatarPickerDialogProps, AsyncAvatarPickerDialogState> {
|
|
@@ -15,7 +15,7 @@ export declare const ERROR: {
|
|
|
15
15
|
};
|
|
16
16
|
export declare const ACCEPT: string[];
|
|
17
17
|
export declare const fixedCrop: CropProperties;
|
|
18
|
-
export
|
|
18
|
+
export type AvatarPickerDialogWithIntlProps = AvatarPickerDialogProps & Partial<WrappedComponentProps>;
|
|
19
19
|
export declare class AvatarPickerDialog extends PureComponent<AvatarPickerDialogWithIntlProps, AvatarPickerDialogState> {
|
|
20
20
|
static defaultProps: {
|
|
21
21
|
avatars: never[];
|
|
@@ -28,7 +28,7 @@ export declare class AvatarPickerDialog extends PureComponent<AvatarPickerDialog
|
|
|
28
28
|
* Initialised with no-op function. Is assigned cropped image exporting
|
|
29
29
|
* function when internal ImageCropper mounts via this.onImageNavigatorLoad
|
|
30
30
|
*/
|
|
31
|
-
exportCroppedImage: (outputSize?: number
|
|
31
|
+
exportCroppedImage: (outputSize?: number) => string;
|
|
32
32
|
onSaveClick: () => void;
|
|
33
33
|
onShowMore: () => void;
|
|
34
34
|
onGoBack: () => void;
|
|
@@ -8,7 +8,7 @@ import { Viewport } from '../viewport';
|
|
|
8
8
|
export interface LoadParameters {
|
|
9
9
|
export: (outputSize?: number) => string;
|
|
10
10
|
}
|
|
11
|
-
export
|
|
11
|
+
export type OnLoadHandler = (params: LoadParameters) => void;
|
|
12
12
|
export declare const viewport: Viewport;
|
|
13
13
|
export interface CropProperties {
|
|
14
14
|
x: number;
|
|
@@ -58,7 +58,7 @@ export declare class ImageNavigator extends Component<Props & WrappedComponentPr
|
|
|
58
58
|
* @param height the height of the image
|
|
59
59
|
*/
|
|
60
60
|
onImageLoaded: (image: HTMLImageElement) => void;
|
|
61
|
-
exportCroppedImage: (outputSize?: number
|
|
61
|
+
exportCroppedImage: (outputSize?: number) => string;
|
|
62
62
|
exportCrop(): void;
|
|
63
63
|
validateFile(imageFile: File): string | null;
|
|
64
64
|
readFile(imageFile: File): Promise<void>;
|
|
@@ -21,10 +21,10 @@ export interface TransformProps {
|
|
|
21
21
|
}
|
|
22
22
|
export declare const imagePlacerWrapperStyles: (props: ColorProps) => import("@emotion/react").SerializedStyles;
|
|
23
23
|
export declare const imagePlacerErrorWrapperStyles: import("@emotion/react").SerializedStyles;
|
|
24
|
-
export
|
|
24
|
+
export type ContainerWrapperProps = MarginProps & SizeProps & ColorProps & HTMLAttributes<{}>;
|
|
25
25
|
export declare const containerWrapperStyles: ({ width, height, margin, }: ContainerWrapperProps) => import("@emotion/react").SerializedStyles;
|
|
26
26
|
export declare const EASING = 0.15;
|
|
27
|
-
export
|
|
27
|
+
export type ImageWrapperProps = ImgHTMLAttributes<{}> & TransformProps & BoundsProps;
|
|
28
28
|
export declare const imageWrapperStyles: ({ x, y, width, height, transform, }: ImageWrapperProps) => import("@emotion/react").SerializedStyles;
|
|
29
29
|
export interface MarginWrapperProps {
|
|
30
30
|
width: number;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Viewport } from './viewport';
|
|
2
2
|
export declare const radians: (deg: number) => number;
|
|
3
|
-
export declare const renderViewport: (viewport: Viewport, image: HTMLImageElement, canvas?: HTMLCanvasElement, outputSize?: number
|
|
3
|
+
export declare const renderViewport: (viewport: Viewport, image: HTMLImageElement, canvas?: HTMLCanvasElement, outputSize?: number) => HTMLCanvasElement | null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { jsx } from '@emotion/react';
|
|
3
|
+
import { PureComponent } from 'react';
|
|
4
|
+
export interface Avatar {
|
|
5
|
+
dataURI: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AvatarListProps {
|
|
9
|
+
avatars: Array<Avatar>;
|
|
10
|
+
onItemClick?: (avatar: Avatar) => void;
|
|
11
|
+
selectedAvatar?: Avatar;
|
|
12
|
+
}
|
|
13
|
+
export declare class AvatarList extends PureComponent<AvatarListProps, {}> {
|
|
14
|
+
static defaultProps: {
|
|
15
|
+
avatars: never[];
|
|
16
|
+
};
|
|
17
|
+
render(): jsx.JSX.Element;
|
|
18
|
+
onItemClick: (avatar: Avatar) => () => void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { default as AvatarPickerDialog } from '.';
|
|
4
|
+
import { AvatarPickerDialogProps } from './types';
|
|
5
|
+
export interface AsyncAvatarPickerDialogState {
|
|
6
|
+
AvatarPickerDialog?: typeof AvatarPickerDialog;
|
|
7
|
+
}
|
|
8
|
+
export type AsyncAvatarPickerDialogProps = AvatarPickerDialogProps & {
|
|
9
|
+
placeholder?: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export default class AsyncAvatarPickerDialog extends React.PureComponent<AsyncAvatarPickerDialogProps, AsyncAvatarPickerDialogState> {
|
|
12
|
+
static displayName: string;
|
|
13
|
+
static AvatarPickerDialog?: typeof AvatarPickerDialog;
|
|
14
|
+
state: {
|
|
15
|
+
AvatarPickerDialog: React.FC<AvatarPickerDialogProps> | undefined;
|
|
16
|
+
};
|
|
17
|
+
UNSAFE_componentWillMount(): Promise<void>;
|
|
18
|
+
render(): {};
|
|
19
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { jsx } from '@emotion/react';
|
|
4
|
+
import { PureComponent } from 'react';
|
|
5
|
+
import { WrappedComponentProps } from 'react-intl-next';
|
|
6
|
+
import { Avatar } from '../avatar-list';
|
|
7
|
+
import { CropProperties } from '../image-navigator';
|
|
8
|
+
import { LoadParameters } from '../image-navigator/index';
|
|
9
|
+
import { AvatarPickerDialogProps, AvatarPickerDialogState } from './types';
|
|
10
|
+
export declare const MAX_SIZE_MB = 10;
|
|
11
|
+
export declare const ERROR: {
|
|
12
|
+
URL: import("react-intl-next").MessageDescriptor;
|
|
13
|
+
FORMAT: import("react-intl-next").MessageDescriptor;
|
|
14
|
+
SIZE: import("react-intl-next").MessageDescriptor;
|
|
15
|
+
};
|
|
16
|
+
export declare const ACCEPT: string[];
|
|
17
|
+
export declare const fixedCrop: CropProperties;
|
|
18
|
+
export type AvatarPickerDialogWithIntlProps = AvatarPickerDialogProps & Partial<WrappedComponentProps>;
|
|
19
|
+
export declare class AvatarPickerDialog extends PureComponent<AvatarPickerDialogWithIntlProps, AvatarPickerDialogState> {
|
|
20
|
+
static defaultProps: {
|
|
21
|
+
avatars: never[];
|
|
22
|
+
};
|
|
23
|
+
state: AvatarPickerDialogState;
|
|
24
|
+
setSelectedImageState: (selectedImage: File) => Promise<void>;
|
|
25
|
+
setSelectedAvatarState: (avatar: Avatar) => void;
|
|
26
|
+
onImageNavigatorLoad: (loadParams: LoadParameters) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Initialised with no-op function. Is assigned cropped image exporting
|
|
29
|
+
* function when internal ImageCropper mounts via this.onImageNavigatorLoad
|
|
30
|
+
*/
|
|
31
|
+
exportCroppedImage: (outputSize?: number) => string;
|
|
32
|
+
onSaveClick: () => void;
|
|
33
|
+
onShowMore: () => void;
|
|
34
|
+
onGoBack: () => void;
|
|
35
|
+
onRemoveImage: () => void;
|
|
36
|
+
clearErrorState: () => void;
|
|
37
|
+
setErrorState: (errorMessage: string) => void;
|
|
38
|
+
onImageUploaded: () => void;
|
|
39
|
+
onImageError: (errorMessage: string) => void;
|
|
40
|
+
render(): jsx.JSX.Element;
|
|
41
|
+
headerContent: () => jsx.JSX.Element;
|
|
42
|
+
footerContent: () => jsx.JSX.Element;
|
|
43
|
+
get isDisabled(): boolean;
|
|
44
|
+
getPredefinedAvatars(): Avatar[];
|
|
45
|
+
renderPredefinedAvatarList(): jsx.JSX.Element | null;
|
|
46
|
+
renderBody(): jsx.JSX.Element;
|
|
47
|
+
}
|
|
48
|
+
declare const _default: React.FC<AvatarPickerDialogProps>;
|
|
49
|
+
export default _default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Rectangle } from '@atlaskit/media-ui';
|
|
2
|
+
export declare const DEFAULT_VISIBLE_PREDEFINED_AVATARS = 5;
|
|
3
|
+
export declare const AVATAR_DIALOG_WIDTH = 375;
|
|
4
|
+
export declare const AVATAR_DIALOG_HEIGHT = 470;
|
|
5
|
+
export declare const PREDEFINED_AVATARS_VIEW_WIDTH = 343;
|
|
6
|
+
export declare const PREDEFINED_AVATARS_VIEW_HEIGHT = 290;
|
|
7
|
+
export declare const CONTAINER_SIZE: number;
|
|
8
|
+
export declare const CONTAINER_INNER_SIZE: number;
|
|
9
|
+
export declare const CONTAINER_PADDING: number;
|
|
10
|
+
export declare const CONTAINER_RECT: Rectangle;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const avatarPickerViewWrapperStyles: import("@emotion/react").SerializedStyles;
|
|
2
|
+
export declare const modalHeaderStyles: import("@emotion/react").SerializedStyles;
|
|
3
|
+
export declare const croppingWrapperStyles: import("@emotion/react").SerializedStyles;
|
|
4
|
+
export declare const modalFooterButtonsStyles: import("@emotion/react").SerializedStyles;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Avatar } from '../avatar-list';
|
|
2
|
+
import { CropProperties } from '../image-navigator';
|
|
3
|
+
export declare enum Mode {
|
|
4
|
+
Cropping = 0,
|
|
5
|
+
PredefinedAvatars = 1
|
|
6
|
+
}
|
|
7
|
+
export interface AvatarPickerDialogProps {
|
|
8
|
+
/** This property is used to provide an array of pre-defined avatars. The **Avatar** object is a simple type with a single **dataURI: string** property. For convenience, this type is exported from the **@atlassian/media-avatar-picker** module along with the **AvatarPickerDialog** component. */
|
|
9
|
+
avatars: Array<Avatar>;
|
|
10
|
+
/** This property is used along with the **avatar** property. It allows you to set the currently selected pre-defined avatar. By default, there is no pre-defined avatar selected, even if the **avatars** property is set. */
|
|
11
|
+
defaultSelectedAvatar?: Avatar;
|
|
12
|
+
/** This property is raised when the user clicks the **Save** button and there is a pre-defined avatar selected, and no image selected. An **Avatar** object with a **dataURI** property is passed. */
|
|
13
|
+
onAvatarPicked: (avatar: Avatar) => void;
|
|
14
|
+
/** This optional property is used to set the selected image so that the component opens up with it visible already. The value should be a valid dataURI string. If an invalid dataURI is given, the bad format error state will be triggered and a message shown. */
|
|
15
|
+
imageSource?: string;
|
|
16
|
+
/** This property is raised when the user clicks the **Save** button and there is a selected image.
|
|
17
|
+
* Two arguments are passed, the **file:File** which is a blob, and the crop settings which is an object containing **x:number**,**y:number**, and **size:number** values, which are all relative to the coordinates of the selected image. **Note** due to limitations on Safari <= 10.0 and IE11, a **Blob** object will be returned instead of a **File**.
|
|
18
|
+
* This still allows access to the image byte data to facilitate uploads, essentially minus the filename and date attributes.
|
|
19
|
+
*/
|
|
20
|
+
onImagePicked?: (file: File, crop: CropProperties) => void;
|
|
21
|
+
/** This property is raised when the user clicks the **Save** button and there is a selected image. The selected image is provided as a dataURI string. */
|
|
22
|
+
onImagePickedDataURI?: (dataUri: string) => void;
|
|
23
|
+
/** This property is raised when the user clicks **Cancel** button.
|
|
24
|
+
* **Note** this does not close the dialog.
|
|
25
|
+
* It is up to the consumer to re-render and remove the dialog from the UI.
|
|
26
|
+
*/
|
|
27
|
+
onCancel: () => void;
|
|
28
|
+
/** The title text for the dialog. The default is _Upload an avatar_. */
|
|
29
|
+
title?: string;
|
|
30
|
+
/** The primary button text. The default is _Save_. */
|
|
31
|
+
primaryButtonText?: string;
|
|
32
|
+
/** This optional property allows the consumer to display an error message. This may occur from a call to a service. The string is clipped if greater than 125 charaters (approximately 3 lines within the dialog). */
|
|
33
|
+
errorMessage?: string;
|
|
34
|
+
/** This optional property is used while the avatar is loaded. */
|
|
35
|
+
isLoading?: boolean;
|
|
36
|
+
/** This property decribe the text related to the Avatar. */
|
|
37
|
+
predefinedAvatarsText?: string;
|
|
38
|
+
/** The target width/height of the resulting (square) avatar. Leave blank for default (200x200) */
|
|
39
|
+
outputSize?: number;
|
|
40
|
+
/** This optional property allows the consumer to define the maximum image size that can be uploaded. */
|
|
41
|
+
maxImageSize?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface AvatarPickerDialogState {
|
|
44
|
+
mode: Mode;
|
|
45
|
+
selectedAvatar?: Avatar;
|
|
46
|
+
selectedImage?: File;
|
|
47
|
+
selectedImageSource?: string;
|
|
48
|
+
errorMessage?: string;
|
|
49
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { jsx } from '@emotion/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Component } from 'react';
|
|
5
|
+
import { WrappedComponentProps } from 'react-intl-next';
|
|
6
|
+
export interface ImageCropperProp {
|
|
7
|
+
imageSource: string;
|
|
8
|
+
containerSize?: number;
|
|
9
|
+
isCircularMask?: boolean;
|
|
10
|
+
top: number;
|
|
11
|
+
left: number;
|
|
12
|
+
imageWidth?: number;
|
|
13
|
+
imageHeight?: number;
|
|
14
|
+
imageOrientation: number;
|
|
15
|
+
onDragStarted?: (x: number, y: number) => void;
|
|
16
|
+
onImageLoaded: (image: HTMLImageElement) => void;
|
|
17
|
+
onRemoveImage: () => void;
|
|
18
|
+
onImageError: (errorMessage: string) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare class ImageCropper extends Component<ImageCropperProp & WrappedComponentProps, {}> {
|
|
21
|
+
static defaultProps: {
|
|
22
|
+
containerSize: number;
|
|
23
|
+
isCircleMask: boolean;
|
|
24
|
+
onDragStarted: () => void;
|
|
25
|
+
onImageSize: () => void;
|
|
26
|
+
};
|
|
27
|
+
componentDidMount(): void;
|
|
28
|
+
onDragStarted: (e: React.MouseEvent<{}>) => void;
|
|
29
|
+
onImageError: () => void;
|
|
30
|
+
render(): jsx.JSX.Element | null;
|
|
31
|
+
}
|
|
32
|
+
declare const _default: React.FC<ImageCropperProp>;
|
|
33
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isImageRemote: (imageUrl: string, windowOrigin?: string) => boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
declare module 'react' {
|
|
2
|
+
interface ImgHTMLAttributes<T> {
|
|
3
|
+
alt?: string;
|
|
4
|
+
crossOrigin?: 'anonymous' | 'use-credentials' | '';
|
|
5
|
+
height?: number | string;
|
|
6
|
+
sizes?: string;
|
|
7
|
+
src?: string;
|
|
8
|
+
srcSet?: string;
|
|
9
|
+
useMap?: string;
|
|
10
|
+
width?: number | string;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export declare const containerStyles: import("@emotion/react").SerializedStyles;
|
|
14
|
+
export declare const imageContainerStyles: import("@emotion/react").SerializedStyles;
|
|
15
|
+
export declare const CONTAINER_PADDING = 28;
|
|
16
|
+
export declare const rectMaskStyles: import("@emotion/react").SerializedStyles;
|
|
17
|
+
export declare const circularMaskStyles: import("@emotion/react").SerializedStyles;
|
|
18
|
+
export declare const dragOverlayStyles: import("@emotion/react").SerializedStyles;
|
|
19
|
+
export declare const removeImageContainerStyles: import("@emotion/react").SerializedStyles;
|
|
20
|
+
export declare const removeImageButtonStyles: import("@emotion/react").SerializedStyles;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const uploadPlaceholder = "data:image/png;base64,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";
|
|
2
|
+
export declare const errorIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAACECAYAAAC9HST0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAABCRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEyNTwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTMyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAg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";
|
|
3
|
+
export declare const checkeredBg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAABCJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpTZXEvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4OjA3OjE4IDEwOjA3OjUwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuNy4zPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrsp//0AAAAKUlEQVQIHWP8//8/Aww8ffoUxmRggrPQGKRLsCCbKy0tDTeQdKNw6gAAbSMIvvnXfF4AAAAASUVORK5CYII=";
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { jsx } from '@emotion/react';
|
|
4
|
+
import { Component } from 'react';
|
|
5
|
+
import { WrappedComponentProps } from 'react-intl-next';
|
|
6
|
+
import { Vector2 } from '@atlaskit/media-ui';
|
|
7
|
+
import { Viewport } from '../viewport';
|
|
8
|
+
export interface LoadParameters {
|
|
9
|
+
export: (outputSize?: number) => string;
|
|
10
|
+
}
|
|
11
|
+
export type OnLoadHandler = (params: LoadParameters) => void;
|
|
12
|
+
export declare const viewport: Viewport;
|
|
13
|
+
export interface CropProperties {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
size: number;
|
|
17
|
+
}
|
|
18
|
+
export interface Props {
|
|
19
|
+
imageSource?: string;
|
|
20
|
+
errorMessage?: string;
|
|
21
|
+
onImageLoaded: (file: File) => void;
|
|
22
|
+
onLoad?: OnLoadHandler;
|
|
23
|
+
onCropChanged?: (x: number, y: number, size: number) => void;
|
|
24
|
+
onRemoveImage: () => void;
|
|
25
|
+
onImageUploaded: (file: File) => void;
|
|
26
|
+
onImageError: (errorMessage: string) => void;
|
|
27
|
+
isLoading?: boolean;
|
|
28
|
+
maxImageSize?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface State {
|
|
31
|
+
imagePos: Vector2;
|
|
32
|
+
dragStartPoint: Vector2;
|
|
33
|
+
scale: number;
|
|
34
|
+
isDragging: boolean;
|
|
35
|
+
fileImageSource?: string;
|
|
36
|
+
imageFile?: File;
|
|
37
|
+
isDroppingFile: boolean;
|
|
38
|
+
imageOrientation: number;
|
|
39
|
+
viewport: Viewport;
|
|
40
|
+
}
|
|
41
|
+
export declare class ImageNavigator extends Component<Props & WrappedComponentProps, State> {
|
|
42
|
+
state: State;
|
|
43
|
+
imageElement?: HTMLImageElement;
|
|
44
|
+
UNSAFE_componentWillMount(): void;
|
|
45
|
+
componentWillUnmount(): void;
|
|
46
|
+
onDragStarted: (x: number, y: number) => void;
|
|
47
|
+
onMouseMove: (e: MouseEvent) => void;
|
|
48
|
+
onMouseUp: () => void;
|
|
49
|
+
/**
|
|
50
|
+
* When newScale change we want to zoom in/out relative to the center of the frame.
|
|
51
|
+
* @param newScale New scale in 0-100 format.
|
|
52
|
+
*/
|
|
53
|
+
onScaleChange: (scale: number) => void;
|
|
54
|
+
/**
|
|
55
|
+
* This gets called when the cropper loads an image
|
|
56
|
+
* at this point we will be able to get the height/width
|
|
57
|
+
* @param width the width of the image
|
|
58
|
+
* @param height the height of the image
|
|
59
|
+
*/
|
|
60
|
+
onImageLoaded: (image: HTMLImageElement) => void;
|
|
61
|
+
exportCroppedImage: (outputSize?: number) => string;
|
|
62
|
+
exportCrop(): void;
|
|
63
|
+
validateFile(imageFile: File): string | null;
|
|
64
|
+
readFile(imageFile: File): Promise<void>;
|
|
65
|
+
onUploadButtonClick: React.MouseEventHandler;
|
|
66
|
+
onFileChange: (e: React.SyntheticEvent<HTMLInputElement>) => void;
|
|
67
|
+
updateDroppingState(e: React.DragEvent<{}>, state: boolean): void;
|
|
68
|
+
onDragEnter: (e: React.DragEvent<{}>) => void;
|
|
69
|
+
onDragOver: (e: React.DragEvent<{}>) => void;
|
|
70
|
+
onDragLeave: (e: React.DragEvent<{}>) => void;
|
|
71
|
+
onDrop: (e: React.DragEvent<{}>) => void;
|
|
72
|
+
renderDragZone: () => jsx.JSX.Element;
|
|
73
|
+
renderImageUploader(): jsx.JSX.Element;
|
|
74
|
+
onRemoveImage: () => void;
|
|
75
|
+
renderImageCropper(dataURI: string): jsx.JSX.Element;
|
|
76
|
+
private get dataURI();
|
|
77
|
+
render(): jsx.JSX.Element;
|
|
78
|
+
}
|
|
79
|
+
declare const _default: React.FC<Props>;
|
|
80
|
+
export default _default;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { jsx } from '@emotion/react';
|
|
3
|
+
import { Component } from 'react';
|
|
4
|
+
export interface SliderProps {
|
|
5
|
+
value: number;
|
|
6
|
+
onChange: (value: number) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const defaultProps: {
|
|
9
|
+
value: number;
|
|
10
|
+
};
|
|
11
|
+
export declare class Slider extends Component<SliderProps, {}> {
|
|
12
|
+
static defaultProps: {
|
|
13
|
+
value: number;
|
|
14
|
+
};
|
|
15
|
+
render(): jsx.JSX.Element;
|
|
16
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const imageBgStyles: import("@emotion/react").SerializedStyles;
|
|
2
|
+
export declare const containerStyles: import("@emotion/react").SerializedStyles;
|
|
3
|
+
export declare const sliderContainerStyles: import("@emotion/react").SerializedStyles;
|
|
4
|
+
export declare const fileInputStyles: import("@emotion/react").SerializedStyles;
|
|
5
|
+
export declare const imageUploaderStyles: import("@emotion/react").SerializedStyles;
|
|
6
|
+
export interface DragZoneProps {
|
|
7
|
+
isDroppingFile: boolean;
|
|
8
|
+
showBorder: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const dragZoneStyles: {
|
|
11
|
+
(props: DragZoneProps): import("@emotion/react").SerializedStyles;
|
|
12
|
+
displayName: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const dragZoneImageStyles: import("@emotion/react").SerializedStyles;
|
|
15
|
+
export interface DragZoneTextProps {
|
|
16
|
+
isFullSize: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const dragZoneTextStyles: (props: DragZoneTextProps) => import("@emotion/react").SerializedStyles;
|
|
19
|
+
export declare const selectionBlockerStyles: import("@emotion/react").SerializedStyles;
|
|
20
|
+
export declare const paddedBreakStyles: import("@emotion/react").SerializedStyles;
|
|
21
|
+
export declare const sliderWrapperStyles: import("@emotion/react").SerializedStyles;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Rectangle, Bounds, Vector2 } from '@atlaskit/media-ui';
|
|
2
|
+
export declare function zoomToFit(imageWidth: number, imageHeight: number, visibleBounds: Bounds): Rectangle;
|
|
3
|
+
export declare function applyConstraints(useConstraints: boolean, imageBounds: Bounds, visibleBounds: Bounds): Vector2;
|
|
4
|
+
export declare function applyFullConstraints(imageBounds: Bounds, visibleBounds: Bounds): Vector2;
|
|
5
|
+
export declare function applyPartialConstraints(imageBounds: Bounds, visibleBounds: Bounds): Vector2;
|
|
6
|
+
export declare function transformVisibleBoundsToImageCoords(visibleBoundsX: number, visibleBoundsY: number, imageSourceRect: Rectangle, imageBounds: Bounds, visibleBounds: Bounds): Vector2;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Container is responsible for implementing the mouse/touch events.
|
|
3
|
+
* This way, you can still move the image without clicking directly on it.
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { Vector2 } from '@atlaskit/media-ui';
|
|
7
|
+
export interface ImagePlacerContainerProps {
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
margin: number;
|
|
11
|
+
onDragStart: () => void;
|
|
12
|
+
onDragMove: (delta: Vector2) => void;
|
|
13
|
+
onWheel: (delta: number) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare class ImagePlacerContainer extends React.Component<ImagePlacerContainerProps, {}> {
|
|
16
|
+
private dragClientStart?;
|
|
17
|
+
UNSAFE_componentWillMount(): void;
|
|
18
|
+
componentWillUnmount(): void;
|
|
19
|
+
get isDragging(): boolean;
|
|
20
|
+
get isTouch(): boolean;
|
|
21
|
+
onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
22
|
+
onTouchStart: (e: React.TouchEvent<HTMLDivElement>) => void;
|
|
23
|
+
onMouseMove: (e: MouseEvent) => void;
|
|
24
|
+
onTouchMove: (e: TouchEvent) => void;
|
|
25
|
+
onMouseUp: () => void;
|
|
26
|
+
onWheel: (e: React.WheelEvent<HTMLDivElement>) => void;
|
|
27
|
+
render(): JSX.Element;
|
|
28
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface ImagePlacerImageProps {
|
|
3
|
+
src?: string;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
onLoad: (imageElement: HTMLImageElement, width: number, height: number) => void;
|
|
9
|
+
onError: (errorMessage: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare const IMAGE_ERRORS: {
|
|
12
|
+
BAD_URL: string;
|
|
13
|
+
LOAD_FAIL: string;
|
|
14
|
+
};
|
|
15
|
+
export declare class ImagePlacerImage extends React.Component<ImagePlacerImageProps, {}> {
|
|
16
|
+
UNSAFE_componentWillMount(): void;
|
|
17
|
+
onLoad: (e: React.SyntheticEvent<HTMLImageElement>) => void;
|
|
18
|
+
onError: () => void;
|
|
19
|
+
render(): JSX.Element | null;
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Rectangle, Bounds, FileInfo } from '@atlaskit/media-ui';
|
|
2
|
+
export declare function radians(deg: number): number;
|
|
3
|
+
export interface ViewInfo {
|
|
4
|
+
containerRect: Rectangle;
|
|
5
|
+
imageBounds: Bounds;
|
|
6
|
+
sourceBounds: Bounds;
|
|
7
|
+
visibleBounds: Bounds;
|
|
8
|
+
}
|
|
9
|
+
export declare function applyOrientation(img: HTMLImageElement, canvasWidth: number, canvasHeight: number, orientation: number, sourceWidth: number, sourceHeight: number, destWidth: number, destHeight: number): string;
|
|
10
|
+
export interface PreviewInfo {
|
|
11
|
+
fileInfo: FileInfo;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function initialiseImagePreview(fileInfo: FileInfo, containerRect: Rectangle, maxZoom: number): Promise<PreviewInfo | null>;
|
|
16
|
+
export declare function renderImageAtCurrentView(imageElement: HTMLImageElement | undefined, viewInfo: ViewInfo, useConstraints: boolean, useCircularClipWithActions: boolean, backgroundColor: string): HTMLCanvasElement;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**@jsx jsx */
|
|
2
|
+
import { jsx } from '@emotion/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Rectangle, Vector2, Bounds, FileInfo } from '@atlaskit/media-ui';
|
|
5
|
+
export interface ImageActions {
|
|
6
|
+
toCanvas: () => HTMLCanvasElement;
|
|
7
|
+
toDataURL: () => string;
|
|
8
|
+
toFile: () => File;
|
|
9
|
+
}
|
|
10
|
+
export interface ImagePlacerProps {
|
|
11
|
+
containerWidth: number;
|
|
12
|
+
containerHeight: number;
|
|
13
|
+
src?: string | File;
|
|
14
|
+
margin: number;
|
|
15
|
+
zoom: number;
|
|
16
|
+
maxZoom: number;
|
|
17
|
+
originX: number;
|
|
18
|
+
originY: number;
|
|
19
|
+
useConstraints: boolean;
|
|
20
|
+
isCircular: boolean;
|
|
21
|
+
useCircularClipWithActions: boolean;
|
|
22
|
+
backgroundColor: string;
|
|
23
|
+
onImageChange?: (imageElement: HTMLImageElement) => void;
|
|
24
|
+
onZoomChange?: (zoom: number) => void;
|
|
25
|
+
onImageActions?: (actions: ImageActions) => void;
|
|
26
|
+
onRenderError?: (errorMessage: string) => JSX.Element;
|
|
27
|
+
}
|
|
28
|
+
export declare const DEFAULT_MAX_ZOOM = 4;
|
|
29
|
+
export declare const DEFAULT_MARGIN = 28;
|
|
30
|
+
export declare const DEFAULT_CONTAINER_SIZE = 200;
|
|
31
|
+
export declare const DEFAULT_ZOOM = 0;
|
|
32
|
+
export declare const DEFAULT_ORIGIN_X = 0;
|
|
33
|
+
export declare const DEFAULT_ORIGIN_Y = 0;
|
|
34
|
+
export declare const DEFAULT_USE_CONSTRAINTS = true;
|
|
35
|
+
export declare const DEFAULT_USE_CIRCULAR = false;
|
|
36
|
+
export declare const DEFAULT_USE_CIRCULAR_CLIP_WITH_ACTIONS = false;
|
|
37
|
+
export declare const DEFAULT_BACKGROUND_COLOR = "transparent";
|
|
38
|
+
export declare const defaultProps: {
|
|
39
|
+
containerWidth: number;
|
|
40
|
+
containerHeight: number;
|
|
41
|
+
margin: number;
|
|
42
|
+
zoom: number;
|
|
43
|
+
maxZoom: number;
|
|
44
|
+
originX: number;
|
|
45
|
+
originY: number;
|
|
46
|
+
useConstraints: boolean;
|
|
47
|
+
isCircular: boolean;
|
|
48
|
+
useCircularClipWithActions: boolean;
|
|
49
|
+
backgroundColor: string;
|
|
50
|
+
};
|
|
51
|
+
export interface ImagePlacerState {
|
|
52
|
+
imageWidth: number;
|
|
53
|
+
imageHeight: number;
|
|
54
|
+
originX: number;
|
|
55
|
+
originY: number;
|
|
56
|
+
zoom: number;
|
|
57
|
+
errorMessage?: string;
|
|
58
|
+
dragOrigin?: Vector2;
|
|
59
|
+
src?: string | File;
|
|
60
|
+
}
|
|
61
|
+
export declare class ImagePlacer extends React.Component<ImagePlacerProps, ImagePlacerState> {
|
|
62
|
+
imageSourceRect: Rectangle;
|
|
63
|
+
imageElement?: HTMLImageElement;
|
|
64
|
+
static defaultProps: {
|
|
65
|
+
containerWidth: number;
|
|
66
|
+
containerHeight: number;
|
|
67
|
+
margin: number;
|
|
68
|
+
zoom: number;
|
|
69
|
+
maxZoom: number;
|
|
70
|
+
originX: number;
|
|
71
|
+
originY: number;
|
|
72
|
+
useConstraints: boolean;
|
|
73
|
+
isCircular: boolean;
|
|
74
|
+
useCircularClipWithActions: boolean;
|
|
75
|
+
backgroundColor: string;
|
|
76
|
+
};
|
|
77
|
+
state: ImagePlacerState;
|
|
78
|
+
get containerRectWithMargins(): Rectangle;
|
|
79
|
+
get containerRect(): Rectangle;
|
|
80
|
+
get imageBounds(): Bounds;
|
|
81
|
+
private calcImageBounds;
|
|
82
|
+
get visibleBounds(): Bounds;
|
|
83
|
+
get sourceBounds(): Bounds;
|
|
84
|
+
UNSAFE_componentWillMount(): void;
|
|
85
|
+
private provideImageActions;
|
|
86
|
+
UNSAFE_componentWillReceiveProps(nextProps: ImagePlacerProps): Promise<void>;
|
|
87
|
+
preprocessFile(fileInfo: FileInfo): Promise<void>;
|
|
88
|
+
setSrc(fileInfo: FileInfo): void;
|
|
89
|
+
private updateZoomProp;
|
|
90
|
+
reset(): void;
|
|
91
|
+
update(): void;
|
|
92
|
+
zoomToFit(): void;
|
|
93
|
+
applyConstraints(): void;
|
|
94
|
+
setZoom(newZoom: number): void;
|
|
95
|
+
transformVisibleBoundsToImageCoords(visibleBoundsX: number, visibleBoundsY: number): Vector2;
|
|
96
|
+
toCanvas: () => HTMLCanvasElement;
|
|
97
|
+
toDataURL: () => string;
|
|
98
|
+
toFile: () => File;
|
|
99
|
+
onImageLoad: (imageElement: HTMLImageElement, width: number, height: number) => void;
|
|
100
|
+
onImageError: (errorMessage: string) => void;
|
|
101
|
+
onDragStart: () => void;
|
|
102
|
+
onDragMove: (delta: Vector2) => void;
|
|
103
|
+
onWheel: (delta: number) => void;
|
|
104
|
+
render(): jsx.JSX.Element;
|
|
105
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**@jsx jsx */
|
|
2
|
+
import { jsx } from '@emotion/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
export interface MarginProps {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
size: number;
|
|
8
|
+
circular: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface MarginState {
|
|
11
|
+
}
|
|
12
|
+
export declare class Margin extends React.Component<MarginProps, MarginState> {
|
|
13
|
+
render(): jsx.JSX.Element;
|
|
14
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ImgHTMLAttributes, HTMLAttributes } from 'react';
|
|
2
|
+
export declare const checkeredBg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAA6hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0xMC0zMFQxMjoxMDo5MjwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjcuNTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpDb21wcmVzc2lvbj4wPC90aWZmOkNvbXByZXNzaW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KX+XPjwAAACtJREFUGBljPHv27H8GNGBsbMyIJsTAhC6Aiz+ACjEcDXIjNg8OoBuJthoAzy0HeT3Qcc0AAAAASUVORK5CYII=";
|
|
3
|
+
export interface SizeProps {
|
|
4
|
+
width?: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ColorProps {
|
|
8
|
+
backgroundColor?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface BoundsProps {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
}
|
|
16
|
+
export interface MarginProps {
|
|
17
|
+
margin: number;
|
|
18
|
+
}
|
|
19
|
+
export interface TransformProps {
|
|
20
|
+
transform?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const imagePlacerWrapperStyles: (props: ColorProps) => import("@emotion/react").SerializedStyles;
|
|
23
|
+
export declare const imagePlacerErrorWrapperStyles: import("@emotion/react").SerializedStyles;
|
|
24
|
+
export type ContainerWrapperProps = MarginProps & SizeProps & ColorProps & HTMLAttributes<{}>;
|
|
25
|
+
export declare const containerWrapperStyles: ({ width, height, margin, }: ContainerWrapperProps) => import("@emotion/react").SerializedStyles;
|
|
26
|
+
export declare const EASING = 0.15;
|
|
27
|
+
export type ImageWrapperProps = ImgHTMLAttributes<{}> & TransformProps & BoundsProps;
|
|
28
|
+
export declare const imageWrapperStyles: ({ x, y, width, height, transform, }: ImageWrapperProps) => import("@emotion/react").SerializedStyles;
|
|
29
|
+
export interface MarginWrapperProps {
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
size: number;
|
|
33
|
+
}
|
|
34
|
+
export declare const marginWrapperSquareStyles: ({ width, height, size, }: MarginWrapperProps) => import("@emotion/react").SerializedStyles;
|
|
35
|
+
export declare const marginWrapperCircleStyles: ({ width, height, size, }: MarginWrapperProps) => import("@emotion/react").SerializedStyles;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as AvatarPickerDialog } from './avatar-picker-dialog/avatar-picker-dialog-loader';
|
|
2
|
+
export type { AsyncAvatarPickerDialogProps } from './avatar-picker-dialog/avatar-picker-dialog-loader';
|
|
3
|
+
export { default as ImageNavigator } from './image-navigator';
|
|
4
|
+
export type { Props as ImageNavigatorProps, OnLoadHandler, LoadParameters, } from './image-navigator';
|
|
5
|
+
export type { Avatar } from './avatar-list';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**@jsx jsx */
|
|
2
|
+
import { jsx } from '@emotion/react';
|
|
3
|
+
import { PureComponent } from 'react';
|
|
4
|
+
import { Avatar } from '../avatar-list';
|
|
5
|
+
export interface PredefinedAvatarListProps {
|
|
6
|
+
avatars: Array<Avatar>;
|
|
7
|
+
selectedAvatar?: Avatar;
|
|
8
|
+
onShowMore?: () => void;
|
|
9
|
+
onAvatarSelected: (avatar: Avatar) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare class PredefinedAvatarList extends PureComponent<PredefinedAvatarListProps, {}> {
|
|
12
|
+
static defaultProps: {
|
|
13
|
+
avatars: never[];
|
|
14
|
+
};
|
|
15
|
+
UNSAFE_componentWillMount(): void;
|
|
16
|
+
render(): jsx.JSX.Element;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const predefinedAvatarsWrapperStyles: import("@emotion/react").SerializedStyles;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**@jsx jsx */
|
|
2
|
+
import { jsx } from '@emotion/react';
|
|
3
|
+
import { PureComponent } from 'react';
|
|
4
|
+
import { Avatar } from '../avatar-list';
|
|
5
|
+
export interface BackBtnProps {
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
export interface PredefinedAvatarViewProps {
|
|
9
|
+
avatars: Array<Avatar>;
|
|
10
|
+
onGoBack?: () => void;
|
|
11
|
+
onAvatarSelected: (avatar: Avatar) => void;
|
|
12
|
+
selectedAvatar?: Avatar;
|
|
13
|
+
predefinedAvatarsText?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class PredefinedAvatarView extends PureComponent<PredefinedAvatarViewProps, {}> {
|
|
16
|
+
static defaultProps: PredefinedAvatarViewProps;
|
|
17
|
+
render(): jsx.JSX.Element;
|
|
18
|
+
createOnItemClickHandler(avatar: Avatar): () => void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const largeAvatarImageStyles: () => import("@emotion/react").SerializedStyles;
|
|
2
|
+
export declare const smallAvatarImageStyles: () => import("@emotion/react").SerializedStyles;
|
|
3
|
+
export declare const predefinedAvatarViewWrapperStyles: import("@emotion/react").SerializedStyles;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Rectangle, Bounds, Vector2 } from '@atlaskit/media-ui';
|
|
2
|
+
/**
|
|
3
|
+
* maximum amount to allow scaling up from "100%"
|
|
4
|
+
* - when the image is smaller than the view size, "100%" is the view size
|
|
5
|
+
* - when the image is larger than the view size, "100%" is the images natural size
|
|
6
|
+
*/
|
|
7
|
+
export declare const MAX_SCALE = 1.5;
|
|
8
|
+
export declare const DEFAULT_WIDTH = 100;
|
|
9
|
+
export declare const DEFAULT_HEIGHT = 100;
|
|
10
|
+
export declare const DEFAULT_MARGIN = 10;
|
|
11
|
+
export declare const DEFAULT_INNER_WIDTH: number;
|
|
12
|
+
export declare const DEFAULT_INNER_HEIGHT: number;
|
|
13
|
+
/**
|
|
14
|
+
* This class abstracts viewing an item within a container.
|
|
15
|
+
* This class is display agnostic, it only calculates the geometry.
|
|
16
|
+
* The container can have a uniform margin which allows for transparent clipping of the view area.
|
|
17
|
+
* This creates an inner bounds within the container, which is (container size - margin).
|
|
18
|
+
* When given an item, the viewport will scale up the item bounds to fit the inner bounds.
|
|
19
|
+
* The viewport can work with drag events, but will constrain the item bounds to never be smaller than the minimum container side length.
|
|
20
|
+
* The viewport can work with zoom events, but will constrain the item bounds to never be smaller than the minimum container side length.
|
|
21
|
+
* The viewport can map coordinates from the inner bounds, to the image local coordinates.
|
|
22
|
+
*
|
|
23
|
+
* use cases:
|
|
24
|
+
* - load image: this.setItemSize(w, h)
|
|
25
|
+
* - change scale: this.setScale(0 - 100);
|
|
26
|
+
* - pan image: this.startDrag().dragMove(deltaX, deltaY)
|
|
27
|
+
* - map view coord to image source: this.viewToLocalPoint(viewX, viewY)
|
|
28
|
+
*/
|
|
29
|
+
export declare class Viewport {
|
|
30
|
+
readonly width: number;
|
|
31
|
+
readonly height: number;
|
|
32
|
+
readonly margin: number;
|
|
33
|
+
private itemSourceRect;
|
|
34
|
+
private dragStartPos;
|
|
35
|
+
itemBounds: Bounds;
|
|
36
|
+
orientation: number;
|
|
37
|
+
item?: any;
|
|
38
|
+
constructor(width?: number, height?: number, margin?: number);
|
|
39
|
+
private zoomToFit;
|
|
40
|
+
private applyConstraints;
|
|
41
|
+
get innerBounds(): Bounds;
|
|
42
|
+
get outerBounds(): Bounds;
|
|
43
|
+
get visibleSourceBounds(): Bounds;
|
|
44
|
+
get itemSourceBounds(): Bounds;
|
|
45
|
+
get fittedItemBounds(): Bounds;
|
|
46
|
+
get isEmpty(): boolean;
|
|
47
|
+
get maxScale(): number;
|
|
48
|
+
get maxItemViewRect(): Rectangle;
|
|
49
|
+
clear(): void;
|
|
50
|
+
setItemSize(width: number, height: number): this;
|
|
51
|
+
setItem(item: any): this;
|
|
52
|
+
setScale(scale: number): this;
|
|
53
|
+
startDrag(): this;
|
|
54
|
+
dragBy(xDelta: number, yDelta: number): this;
|
|
55
|
+
dragMove(xDelta: number, yDelta: number): this;
|
|
56
|
+
viewToLocalPoint(viewX: number, viewY: number): Vector2;
|
|
57
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/media-avatar-picker",
|
|
3
|
-
"version": "24.3.
|
|
3
|
+
"version": "24.3.2",
|
|
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/"
|
|
@@ -12,6 +12,14 @@
|
|
|
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.5 <4.9": {
|
|
17
|
+
"*": [
|
|
18
|
+
"dist/types-ts4.5/*",
|
|
19
|
+
"dist/types-ts4.5/index.d.ts"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
15
23
|
"sideEffects": false,
|
|
16
24
|
"atlaskit:src": "src/index.ts",
|
|
17
25
|
"af:exports": {
|
|
@@ -28,12 +36,12 @@
|
|
|
28
36
|
"dependencies": {
|
|
29
37
|
"@atlaskit/button": "^16.7.0",
|
|
30
38
|
"@atlaskit/icon": "^21.12.0",
|
|
31
|
-
"@atlaskit/media-ui": "^
|
|
39
|
+
"@atlaskit/media-ui": "^23.0.0",
|
|
32
40
|
"@atlaskit/modal-dialog": "^12.5.0",
|
|
33
41
|
"@atlaskit/range": "^7.1.0",
|
|
34
42
|
"@atlaskit/spinner": "^15.5.0",
|
|
35
43
|
"@atlaskit/theme": "^12.5.0",
|
|
36
|
-
"@atlaskit/tokens": "^1.
|
|
44
|
+
"@atlaskit/tokens": "^1.4.0",
|
|
37
45
|
"@babel/runtime": "^7.0.0",
|
|
38
46
|
"exenv": "^1.2.2"
|
|
39
47
|
},
|
|
@@ -54,7 +62,7 @@
|
|
|
54
62
|
"react": "^16.8.0",
|
|
55
63
|
"react-dom": "^16.8.0",
|
|
56
64
|
"react-intl-next": "npm:react-intl@^5.18.1",
|
|
57
|
-
"typescript": "4.
|
|
65
|
+
"typescript": "~4.9.5"
|
|
58
66
|
},
|
|
59
67
|
"techstack": {
|
|
60
68
|
"@repo/internal": {
|