@atlaskit/teams-avatar 1.0.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ # @atlaskit/teams-avatar
package/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2023 Atlassian Pty Ltd
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # TeamsAvatar
2
+
3
+ A team avatar is a visual representation of a team.
4
+
5
+ ## Usage
6
+
7
+ `import TeamsAvatar from '@atlaskit/teams-avatar';`
8
+
9
+ Detailed docs and example usage can be found [here](https://atlaskit.atlassian.com/packages/people-and-teams/teams-avatar).
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "default", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _teamsAvatar.default;
11
+ }
12
+ });
13
+ var _teamsAvatar = _interopRequireDefault(require("./ui/teams-avatar"));
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ICON_COLOR = exports.ICON_BACKGROUND = void 0;
8
+ exports.default = TeamAvatar;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
+ var _react = _interopRequireDefault(require("react"));
12
+ var _avatar = _interopRequireDefault(require("@atlaskit/avatar"));
13
+ var _colors = require("@atlaskit/theme/colors");
14
+ var _teamsAvatarImage = require("./teams-avatar-image");
15
+ var _excluded = ["testId", "src", "size"];
16
+ var ICON_BACKGROUND = exports.ICON_BACKGROUND = "var(--ds-icon-inverse, ".concat(_colors.N0, ")");
17
+ var ICON_COLOR = exports.ICON_COLOR = "var(--ds-icon-subtle, ".concat(_colors.N90, ")");
18
+ function TeamAvatar(_ref) {
19
+ var testId = _ref.testId,
20
+ src = _ref.src,
21
+ _ref$size = _ref.size,
22
+ size = _ref$size === void 0 ? 'medium' : _ref$size,
23
+ props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
24
+ return /*#__PURE__*/_react.default.createElement(_avatar.default, (0, _extends2.default)({
25
+ appearance: "circle"
26
+ }, props, {
27
+ size: size,
28
+ src: src,
29
+ testId: "".concat(testId, "-team-avatar")
30
+ }), function (innerProps) {
31
+ return /*#__PURE__*/_react.default.createElement(_teamsAvatarImage.TeamAvatarImage, (0, _extends2.default)({
32
+ src: src,
33
+ size: size,
34
+ testId: testId
35
+ }, innerProps));
36
+ });
37
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.TeamAvatarImage = void 0;
8
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _react = require("react");
12
+ var _react2 = require("@emotion/react");
13
+ var _avatar = require("@atlaskit/avatar");
14
+ var _people = _interopRequireDefault(require("@atlaskit/icon/glyph/people"));
15
+ var _colors = require("@atlaskit/theme/colors");
16
+ var _excluded = ["alt", "src", "size", "testId"];
17
+ 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; }
18
+ 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; } /** @jsx jsx */
19
+ var ICON_BACKGROUND = "var(--ds-icon-inverse, ".concat(_colors.N0, ")");
20
+ var ICON_COLOR = "var(--ds-icon-subtle, ".concat(_colors.N90, ")");
21
+ // used in a size calculation so can't be a token. Without this the avatar looks very squished
22
+ var ICON_PADDING = 4;
23
+ var avatarDefaultIconStyles = (0, _react2.css)({
24
+ display: 'flex',
25
+ backgroundColor: ICON_COLOR,
26
+ borderRadius: '50%',
27
+ width: '100%',
28
+ height: '100%',
29
+ justifyContent: 'center',
30
+ alignItems: 'center'
31
+ });
32
+ var nestedAvatarStyles = Object.entries(_avatar.AVATAR_SIZES).reduce(function (styles, _ref) {
33
+ var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
34
+ key = _ref2[0],
35
+ size = _ref2[1];
36
+ return _objectSpread(_objectSpread({}, styles), {}, (0, _defineProperty2.default)({}, key, (0, _react2.css)({
37
+ width: "".concat(size, "px"),
38
+ height: "".concat(size, "px"),
39
+ // eslint-disable-next-line @atlaskit/design-system/no-nested-styles
40
+ '& svg': {
41
+ width: "".concat(size - ICON_PADDING, "px"),
42
+ height: "".concat(size - ICON_PADDING, "px")
43
+ }
44
+ })));
45
+ }, {});
46
+ var avatarImageStyles = (0, _react2.css)({
47
+ display: 'flex',
48
+ flex: '1 1 100%',
49
+ width: '100%',
50
+ height: '100%'
51
+ });
52
+
53
+ /**
54
+ * __Avatar image__
55
+ *
56
+ * An avatar image is an internal component used to control the rendering phases of an image.
57
+ */
58
+ var TeamAvatarImage = exports.TeamAvatarImage = function TeamAvatarImage(_ref3) {
59
+ var _ref3$alt = _ref3.alt,
60
+ alt = _ref3$alt === void 0 ? '' : _ref3$alt,
61
+ src = _ref3.src,
62
+ size = _ref3.size,
63
+ testId = _ref3.testId,
64
+ rest = (0, _objectWithoutProperties2.default)(_ref3, _excluded);
65
+ var _useState = (0, _react.useState)(false),
66
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
67
+ hasImageErrored = _useState2[0],
68
+ setHasImageErrored = _useState2[1];
69
+
70
+ // If src changes, reset state
71
+ (0, _react.useEffect)(function () {
72
+ setHasImageErrored(false);
73
+ }, [src]);
74
+ if (!src || hasImageErrored) {
75
+ return (0, _react2.jsx)("span", {
76
+ css: [avatarDefaultIconStyles, nestedAvatarStyles[size]]
77
+ }, (0, _react2.jsx)(_people.default, {
78
+ label: alt,
79
+ primaryColor: ICON_BACKGROUND,
80
+ secondaryColor: ICON_COLOR,
81
+ testId: testId && "".concat(testId, "--team")
82
+ }));
83
+ }
84
+ return (0, _react2.jsx)("span", rest, (0, _react2.jsx)("img", {
85
+ src: src,
86
+ alt: alt,
87
+ "data-testid": testId && "".concat(testId, "--image"),
88
+ css: avatarImageStyles,
89
+ onError: function onError() {
90
+ return setHasImageErrored(true);
91
+ }
92
+ }));
93
+ };
@@ -0,0 +1 @@
1
+ export { default } from './ui/teams-avatar';
@@ -0,0 +1,25 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React from 'react';
3
+ import Avatar from '@atlaskit/avatar';
4
+ import { N0, N90 } from '@atlaskit/theme/colors';
5
+ import { TeamAvatarImage } from './teams-avatar-image';
6
+ export const ICON_BACKGROUND = `var(--ds-icon-inverse, ${N0})`;
7
+ export const ICON_COLOR = `var(--ds-icon-subtle, ${N90})`;
8
+ export default function TeamAvatar({
9
+ testId,
10
+ src,
11
+ size = 'medium',
12
+ ...props
13
+ }) {
14
+ return /*#__PURE__*/React.createElement(Avatar, _extends({
15
+ appearance: "circle"
16
+ }, props, {
17
+ size: size,
18
+ src: src,
19
+ testId: `${testId}-team-avatar`
20
+ }), innerProps => /*#__PURE__*/React.createElement(TeamAvatarImage, _extends({
21
+ src: src,
22
+ size: size,
23
+ testId: testId
24
+ }, innerProps)));
25
+ }
@@ -0,0 +1,76 @@
1
+ /** @jsx jsx */
2
+ import { useEffect, useState } from 'react';
3
+ import { css, jsx } from '@emotion/react';
4
+ import { AVATAR_SIZES } from '@atlaskit/avatar';
5
+ import TeamIcon from '@atlaskit/icon/glyph/people';
6
+ import { N0, N90 } from '@atlaskit/theme/colors';
7
+ const ICON_BACKGROUND = `var(--ds-icon-inverse, ${N0})`;
8
+ const ICON_COLOR = `var(--ds-icon-subtle, ${N90})`;
9
+ // used in a size calculation so can't be a token. Without this the avatar looks very squished
10
+ const ICON_PADDING = 4;
11
+ const avatarDefaultIconStyles = css({
12
+ display: 'flex',
13
+ backgroundColor: ICON_COLOR,
14
+ borderRadius: '50%',
15
+ width: '100%',
16
+ height: '100%',
17
+ justifyContent: 'center',
18
+ alignItems: 'center'
19
+ });
20
+ const nestedAvatarStyles = Object.entries(AVATAR_SIZES).reduce((styles, [key, size]) => {
21
+ return {
22
+ ...styles,
23
+ [key]: css({
24
+ width: `${size}px`,
25
+ height: `${size}px`,
26
+ // eslint-disable-next-line @atlaskit/design-system/no-nested-styles
27
+ '& svg': {
28
+ width: `${size - ICON_PADDING}px`,
29
+ height: `${size - ICON_PADDING}px`
30
+ }
31
+ })
32
+ };
33
+ }, {});
34
+ const avatarImageStyles = css({
35
+ display: 'flex',
36
+ flex: '1 1 100%',
37
+ width: '100%',
38
+ height: '100%'
39
+ });
40
+
41
+ /**
42
+ * __Avatar image__
43
+ *
44
+ * An avatar image is an internal component used to control the rendering phases of an image.
45
+ */
46
+ export const TeamAvatarImage = ({
47
+ alt = '',
48
+ src,
49
+ size,
50
+ testId,
51
+ ...rest
52
+ }) => {
53
+ const [hasImageErrored, setHasImageErrored] = useState(false);
54
+
55
+ // If src changes, reset state
56
+ useEffect(() => {
57
+ setHasImageErrored(false);
58
+ }, [src]);
59
+ if (!src || hasImageErrored) {
60
+ return jsx("span", {
61
+ css: [avatarDefaultIconStyles, nestedAvatarStyles[size]]
62
+ }, jsx(TeamIcon, {
63
+ label: alt,
64
+ primaryColor: ICON_BACKGROUND,
65
+ secondaryColor: ICON_COLOR,
66
+ testId: testId && `${testId}--team`
67
+ }));
68
+ }
69
+ return jsx("span", rest, jsx("img", {
70
+ src: src,
71
+ alt: alt,
72
+ "data-testid": testId && `${testId}--image`,
73
+ css: avatarImageStyles,
74
+ onError: () => setHasImageErrored(true)
75
+ }));
76
+ };
@@ -0,0 +1 @@
1
+ export { default } from './ui/teams-avatar';
@@ -0,0 +1,29 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ var _excluded = ["testId", "src", "size"];
4
+ import React from 'react';
5
+ import Avatar from '@atlaskit/avatar';
6
+ import { N0, N90 } from '@atlaskit/theme/colors';
7
+ import { TeamAvatarImage } from './teams-avatar-image';
8
+ export var ICON_BACKGROUND = "var(--ds-icon-inverse, ".concat(N0, ")");
9
+ export var ICON_COLOR = "var(--ds-icon-subtle, ".concat(N90, ")");
10
+ export default function TeamAvatar(_ref) {
11
+ var testId = _ref.testId,
12
+ src = _ref.src,
13
+ _ref$size = _ref.size,
14
+ size = _ref$size === void 0 ? 'medium' : _ref$size,
15
+ props = _objectWithoutProperties(_ref, _excluded);
16
+ return /*#__PURE__*/React.createElement(Avatar, _extends({
17
+ appearance: "circle"
18
+ }, props, {
19
+ size: size,
20
+ src: src,
21
+ testId: "".concat(testId, "-team-avatar")
22
+ }), function (innerProps) {
23
+ return /*#__PURE__*/React.createElement(TeamAvatarImage, _extends({
24
+ src: src,
25
+ size: size,
26
+ testId: testId
27
+ }, innerProps));
28
+ });
29
+ }
@@ -0,0 +1,87 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ var _excluded = ["alt", "src", "size", "testId"];
5
+ 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; }
6
+ 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; }
7
+ /** @jsx jsx */
8
+ import { useEffect, useState } from 'react';
9
+ import { css, jsx } from '@emotion/react';
10
+ import { AVATAR_SIZES } from '@atlaskit/avatar';
11
+ import TeamIcon from '@atlaskit/icon/glyph/people';
12
+ import { N0, N90 } from '@atlaskit/theme/colors';
13
+ var ICON_BACKGROUND = "var(--ds-icon-inverse, ".concat(N0, ")");
14
+ var ICON_COLOR = "var(--ds-icon-subtle, ".concat(N90, ")");
15
+ // used in a size calculation so can't be a token. Without this the avatar looks very squished
16
+ var ICON_PADDING = 4;
17
+ var avatarDefaultIconStyles = css({
18
+ display: 'flex',
19
+ backgroundColor: ICON_COLOR,
20
+ borderRadius: '50%',
21
+ width: '100%',
22
+ height: '100%',
23
+ justifyContent: 'center',
24
+ alignItems: 'center'
25
+ });
26
+ var nestedAvatarStyles = Object.entries(AVATAR_SIZES).reduce(function (styles, _ref) {
27
+ var _ref2 = _slicedToArray(_ref, 2),
28
+ key = _ref2[0],
29
+ size = _ref2[1];
30
+ return _objectSpread(_objectSpread({}, styles), {}, _defineProperty({}, key, css({
31
+ width: "".concat(size, "px"),
32
+ height: "".concat(size, "px"),
33
+ // eslint-disable-next-line @atlaskit/design-system/no-nested-styles
34
+ '& svg': {
35
+ width: "".concat(size - ICON_PADDING, "px"),
36
+ height: "".concat(size - ICON_PADDING, "px")
37
+ }
38
+ })));
39
+ }, {});
40
+ var avatarImageStyles = css({
41
+ display: 'flex',
42
+ flex: '1 1 100%',
43
+ width: '100%',
44
+ height: '100%'
45
+ });
46
+
47
+ /**
48
+ * __Avatar image__
49
+ *
50
+ * An avatar image is an internal component used to control the rendering phases of an image.
51
+ */
52
+ export var TeamAvatarImage = function TeamAvatarImage(_ref3) {
53
+ var _ref3$alt = _ref3.alt,
54
+ alt = _ref3$alt === void 0 ? '' : _ref3$alt,
55
+ src = _ref3.src,
56
+ size = _ref3.size,
57
+ testId = _ref3.testId,
58
+ rest = _objectWithoutProperties(_ref3, _excluded);
59
+ var _useState = useState(false),
60
+ _useState2 = _slicedToArray(_useState, 2),
61
+ hasImageErrored = _useState2[0],
62
+ setHasImageErrored = _useState2[1];
63
+
64
+ // If src changes, reset state
65
+ useEffect(function () {
66
+ setHasImageErrored(false);
67
+ }, [src]);
68
+ if (!src || hasImageErrored) {
69
+ return jsx("span", {
70
+ css: [avatarDefaultIconStyles, nestedAvatarStyles[size]]
71
+ }, jsx(TeamIcon, {
72
+ label: alt,
73
+ primaryColor: ICON_BACKGROUND,
74
+ secondaryColor: ICON_COLOR,
75
+ testId: testId && "".concat(testId, "--team")
76
+ }));
77
+ }
78
+ return jsx("span", rest, jsx("img", {
79
+ src: src,
80
+ alt: alt,
81
+ "data-testid": testId && "".concat(testId, "--image"),
82
+ css: avatarImageStyles,
83
+ onError: function onError() {
84
+ return setHasImageErrored(true);
85
+ }
86
+ }));
87
+ };
@@ -0,0 +1 @@
1
+ export { default, type TeamAvatarProps } from './ui/teams-avatar';
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { type AvatarPropTypes } from '@atlaskit/avatar';
3
+ export type TeamAvatarProps = Omit<AvatarPropTypes, 'appearance'>;
4
+ export declare const ICON_BACKGROUND: "var(--ds-icon-inverse)";
5
+ export declare const ICON_COLOR: "var(--ds-icon-subtle)";
6
+ export default function TeamAvatar({ testId, src, size, ...props }: TeamAvatarProps): JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx } from '@emotion/react';
2
+ import { CustomAvatarProps, SizeType } from '@atlaskit/avatar';
3
+ type AvatarImageProps = {
4
+ size: SizeType;
5
+ alt?: string;
6
+ src?: string;
7
+ testId?: string;
8
+ } & CustomAvatarProps;
9
+ /**
10
+ * __Avatar image__
11
+ *
12
+ * An avatar image is an internal component used to control the rendering phases of an image.
13
+ */
14
+ export declare const TeamAvatarImage: ({ alt, src, size, testId, ...rest }: AvatarImageProps) => jsx.JSX.Element;
15
+ export {};
@@ -0,0 +1 @@
1
+ export { default, type TeamAvatarProps } from './ui/teams-avatar';
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { type AvatarPropTypes } from '@atlaskit/avatar';
3
+ export type TeamAvatarProps = Omit<AvatarPropTypes, 'appearance'>;
4
+ export declare const ICON_BACKGROUND: "var(--ds-icon-inverse)";
5
+ export declare const ICON_COLOR: "var(--ds-icon-subtle)";
6
+ export default function TeamAvatar({ testId, src, size, ...props }: TeamAvatarProps): JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx } from '@emotion/react';
2
+ import { CustomAvatarProps, SizeType } from '@atlaskit/avatar';
3
+ type AvatarImageProps = {
4
+ size: SizeType;
5
+ alt?: string;
6
+ src?: string;
7
+ testId?: string;
8
+ } & CustomAvatarProps;
9
+ /**
10
+ * __Avatar image__
11
+ *
12
+ * An avatar image is an internal component used to control the rendering phases of an image.
13
+ */
14
+ export declare const TeamAvatarImage: ({ alt, src, size, testId, ...rest }: AvatarImageProps) => jsx.JSX.Element;
15
+ export {};
package/package.json ADDED
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "@atlaskit/teams-avatar",
3
+ "version": "1.0.0",
4
+ "description": "A team avatar is a visual representation of a team.",
5
+ "author": "Atlassian Pty Ltd",
6
+ "license": "Apache-2.0",
7
+ "publishConfig": {
8
+ "registry": "https://registry.npmjs.org/"
9
+ },
10
+ "atlassian": {
11
+ "team": "People and Teams Collective",
12
+ "inPublicMirror": false,
13
+ "releaseModel": "continuous",
14
+ "website": {
15
+ "name": "TeamsAvatar",
16
+ "category": "Components"
17
+ }
18
+ },
19
+ "repository": "https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo",
20
+ "main": "dist/cjs/index.js",
21
+ "module": "dist/esm/index.js",
22
+ "module:es2019": "dist/es2019/index.js",
23
+ "types": "dist/types/index.d.ts",
24
+ "typesVersions": {
25
+ ">=4.5 <4.9": {
26
+ "*": [
27
+ "dist/types-ts4.5/*",
28
+ "dist/types-ts4.5/index.d.ts"
29
+ ]
30
+ }
31
+ },
32
+ "sideEffects": [
33
+ "*.compiled.css"
34
+ ],
35
+ "atlaskit:src": "src/index.ts",
36
+ "af:exports": {
37
+ ".": "./src/index.ts"
38
+ },
39
+ "dependencies": {
40
+ "@atlaskit/avatar": "^21.5.0",
41
+ "@atlaskit/icon": "^22.0.0",
42
+ "@atlaskit/theme": "^12.6.0",
43
+ "@atlaskit/tokens": "^1.35.0",
44
+ "@babel/runtime": "^7.0.0",
45
+ "@emotion/react": "^11.7.1"
46
+ },
47
+ "peerDependencies": {
48
+ "react": "^16.8.0"
49
+ },
50
+ "devDependencies": {
51
+ "@af/integration-testing": "*",
52
+ "@af/visual-regression": "*",
53
+ "@atlaskit/ssr": "*",
54
+ "@atlaskit/visual-regression": "*",
55
+ "@atlassian/atlassian-frontend-prettier-config-1.0.0": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.0",
56
+ "@testing-library/react": "^12.1.5",
57
+ "react-dom": "^16.8.0",
58
+ "typescript": "~4.9.5",
59
+ "wait-for-expect": "^1.2.0"
60
+ },
61
+ "techstack": {
62
+ "@atlassian/frontend": {
63
+ "code-structure": [
64
+ "tangerine-next"
65
+ ],
66
+ "import-structure": [
67
+ "atlassian-conventions"
68
+ ],
69
+ "circular-dependencies": [
70
+ "file-and-folder-level"
71
+ ]
72
+ },
73
+ "@repo/internal": {
74
+ "dom-events": "use-bind-event-listener",
75
+ "analytics": [
76
+ "analytics-next"
77
+ ],
78
+ "design-tokens": [
79
+ "color"
80
+ ],
81
+ "theming": [
82
+ "react-context"
83
+ ],
84
+ "ui-components": [
85
+ "lite-mode"
86
+ ],
87
+ "deprecation": [
88
+ "no-deprecated-imports"
89
+ ],
90
+ "styling": [
91
+ "static",
92
+ "compiled"
93
+ ],
94
+ "imports": [
95
+ "import-no-extraneous-disable-for-examples-and-docs"
96
+ ]
97
+ }
98
+ },
99
+ "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.0"
100
+ }