@atlaskit/flag 14.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +1244 -0
  2. package/LICENSE +13 -0
  3. package/README.md +13 -0
  4. package/__perf__/autodismiss.tsx +18 -0
  5. package/__perf__/default.tsx +18 -0
  6. package/__perf__/withFlagGroup.tsx +20 -0
  7. package/auto-dismiss-flag/package.json +7 -0
  8. package/constants/package.json +7 -0
  9. package/dist/cjs/auto-dismiss-flag.js +89 -0
  10. package/dist/cjs/constants.js +8 -0
  11. package/dist/cjs/expander.js +41 -0
  12. package/dist/cjs/flag-actions.js +64 -0
  13. package/dist/cjs/flag-group.js +107 -0
  14. package/dist/cjs/flag-provider.js +119 -0
  15. package/dist/cjs/flag.js +219 -0
  16. package/dist/cjs/index.js +51 -0
  17. package/dist/cjs/theme.js +160 -0
  18. package/dist/cjs/types.js +10 -0
  19. package/dist/cjs/version.json +5 -0
  20. package/dist/es2019/auto-dismiss-flag.js +67 -0
  21. package/dist/es2019/constants.js +1 -0
  22. package/dist/es2019/expander.js +33 -0
  23. package/dist/es2019/flag-actions.js +73 -0
  24. package/dist/es2019/flag-group.js +130 -0
  25. package/dist/es2019/flag-provider.js +68 -0
  26. package/dist/es2019/flag.js +245 -0
  27. package/dist/es2019/index.js +4 -0
  28. package/dist/es2019/theme.js +119 -0
  29. package/dist/es2019/types.js +2 -0
  30. package/dist/es2019/version.json +5 -0
  31. package/dist/esm/auto-dismiss-flag.js +67 -0
  32. package/dist/esm/constants.js +1 -0
  33. package/dist/esm/expander.js +29 -0
  34. package/dist/esm/flag-actions.js +50 -0
  35. package/dist/esm/flag-group.js +85 -0
  36. package/dist/esm/flag-provider.js +92 -0
  37. package/dist/esm/flag.js +195 -0
  38. package/dist/esm/index.js +4 -0
  39. package/dist/esm/theme.js +129 -0
  40. package/dist/esm/types.js +2 -0
  41. package/dist/esm/version.json +5 -0
  42. package/dist/types/auto-dismiss-flag.d.ts +4 -0
  43. package/dist/types/constants.d.ts +2 -0
  44. package/dist/types/expander.d.ts +9 -0
  45. package/dist/types/flag-actions.d.ts +14 -0
  46. package/dist/types/flag-group.d.ts +27 -0
  47. package/dist/types/flag-provider.d.ts +26 -0
  48. package/dist/types/flag.d.ts +3 -0
  49. package/dist/types/index.d.ts +6 -0
  50. package/dist/types/theme.d.ts +9 -0
  51. package/dist/types/types.d.ts +79 -0
  52. package/expander/package.json +7 -0
  53. package/extract-react-types/show-flag-args.tsx +5 -0
  54. package/flag/package.json +7 -0
  55. package/flag-actions/package.json +7 -0
  56. package/flag-group/package.json +7 -0
  57. package/flag-provider/package.json +7 -0
  58. package/package.json +80 -0
  59. package/theme/package.json +7 -0
  60. package/types/package.json +7 -0
@@ -0,0 +1,195 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
3
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+
6
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
7
+
8
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
9
+
10
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
11
+
12
+ /** @jsx jsx */
13
+ import { useCallback, useEffect, useState } from 'react';
14
+ import { css, jsx } from '@emotion/core';
15
+ import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
16
+ import ChevronUpIcon from '@atlaskit/icon/glyph/chevron-up';
17
+ import CrossIcon from '@atlaskit/icon/glyph/cross';
18
+ import GlobalTheme from '@atlaskit/theme/components';
19
+ import { borderRadius, gridSize as getGridSize, layers } from '@atlaskit/theme/constants';
20
+ import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler';
21
+ import { DEFAULT_APPEARANCE } from './constants';
22
+ import { flagBorderColor, flagShadowColor, getFlagBackgroundColor, getFlagFocusRingColor, getFlagTextColor } from './theme';
23
+ import Expander from './expander';
24
+ import Actions from './flag-actions';
25
+ import { useFlagGroup } from './flag-group';
26
+
27
+ function noop() {}
28
+
29
+ var analyticsAttributes = {
30
+ componentName: 'flag',
31
+ packageName: "@atlaskit/flag",
32
+ packageVersion: "14.4.1"
33
+ };
34
+ var gridSize = getGridSize();
35
+ var doubleGridSize = gridSize * 2;
36
+ var headerHeight = gridSize * 4;
37
+
38
+ var Flag = function Flag(props) {
39
+ var _props$actions = props.actions,
40
+ actions = _props$actions === void 0 ? [] : _props$actions,
41
+ _props$appearance = props.appearance,
42
+ appearance = _props$appearance === void 0 ? DEFAULT_APPEARANCE : _props$appearance,
43
+ icon = props.icon,
44
+ title = props.title,
45
+ description = props.description,
46
+ linkComponent = props.linkComponent,
47
+ onMouseOver = props.onMouseOver,
48
+ _props$onFocus = props.onFocus,
49
+ onFocus = _props$onFocus === void 0 ? noop : _props$onFocus,
50
+ onMouseOut = props.onMouseOut,
51
+ _props$onBlur = props.onBlur,
52
+ onBlur = _props$onBlur === void 0 ? noop : _props$onBlur,
53
+ _props$onDismissed = props.onDismissed,
54
+ onDismissedProp = _props$onDismissed === void 0 ? noop : _props$onDismissed,
55
+ testId = props.testId,
56
+ id = props.id,
57
+ analyticsContext = props.analyticsContext;
58
+
59
+ var _useFlagGroup = useFlagGroup(),
60
+ onDismissedFromFlagGroup = _useFlagGroup.onDismissed,
61
+ isDismissAllowed = _useFlagGroup.isDismissAllowed;
62
+
63
+ var onDismissed = useCallback(function (id, analyticsEvent) {
64
+ onDismissedProp(id, analyticsEvent);
65
+ onDismissedFromFlagGroup(id, analyticsEvent);
66
+ }, [onDismissedProp, onDismissedFromFlagGroup]);
67
+
68
+ var _useState = useState(false),
69
+ _useState2 = _slicedToArray(_useState, 2),
70
+ isExpanded = _useState2[0],
71
+ setIsExpanded = _useState2[1];
72
+
73
+ var onDismissedAnalytics = usePlatformLeafEventHandler(_objectSpread({
74
+ fn: onDismissed,
75
+ action: 'dismissed',
76
+ analyticsData: analyticsContext
77
+ }, analyticsAttributes));
78
+ var isBold = appearance !== DEFAULT_APPEARANCE;
79
+ var renderToggleOrDismissButton = useCallback(function (_ref) {
80
+ var mode = _ref.mode;
81
+
82
+ // If it is normal appearance a toggle button cannot be rendered
83
+ // Ensure onDismissed is defined and isDismissAllowed is true to render
84
+ // the dismiss button
85
+ if (!isBold && !isDismissAllowed) {
86
+ return null;
87
+ } // If it is bold then ensure there is a description or actions to render
88
+ // the toggle button
89
+
90
+
91
+ if (isBold && !description && !actions.length) {
92
+ return null;
93
+ }
94
+
95
+ var ButtonIcon = CrossIcon;
96
+ var buttonLabel = 'Dismiss';
97
+
98
+ var buttonAction = function buttonAction() {
99
+ if (isDismissAllowed) {
100
+ onDismissedAnalytics(id);
101
+ }
102
+ };
103
+
104
+ var size = 'small';
105
+ var buttonTestId = testId && "".concat(testId, "-dismiss");
106
+ var a11yProps = {};
107
+
108
+ if (isBold) {
109
+ ButtonIcon = isExpanded ? ChevronUpIcon : ChevronDownIcon;
110
+ buttonLabel = isExpanded ? 'Collapse' : 'Expand';
111
+
112
+ buttonAction = function buttonAction() {
113
+ return setIsExpanded(!isExpanded);
114
+ };
115
+
116
+ size = 'large';
117
+ buttonTestId = testId && "".concat(testId, "-toggle");
118
+ a11yProps = {
119
+ 'aria-expanded': isExpanded
120
+ };
121
+ }
122
+
123
+ return jsx("button", _extends({
124
+ css: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n appearance: none;\n background: none;\n border: none;\n border-radius: ", "px;\n color: ", ";\n cursor: pointer;\n flex: 0 0 auto;\n line-height: 1;\n margin-left: ", "px;\n padding: 0;\n white-space: nowrap;\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px ", ";\n }\n "])), borderRadius(), getFlagTextColor(appearance, mode), gridSize, getFlagFocusRingColor(appearance, mode)),
125
+ onClick: buttonAction,
126
+ "data-testid": buttonTestId,
127
+ type: "button"
128
+ }, a11yProps), jsx(ButtonIcon, {
129
+ label: buttonLabel,
130
+ size: size
131
+ }));
132
+ }, [actions.length, appearance, description, id, isBold, isDismissAllowed, isExpanded, onDismissedAnalytics, testId]);
133
+ useEffect(function () {
134
+ // If buttons are removed as a prop, update isExpanded to be false
135
+ if (isBold && isExpanded && !description && !actions.length) {
136
+ setIsExpanded(false);
137
+ }
138
+ }, [actions.length, description, isBold, isExpanded]);
139
+ var onFocusAnalytics = usePlatformLeafEventHandler(_objectSpread({
140
+ fn: onFocus,
141
+ action: 'focused',
142
+ analyticsData: analyticsContext
143
+ }, analyticsAttributes));
144
+ var onBlurAnalytics = usePlatformLeafEventHandler(_objectSpread({
145
+ fn: onBlur,
146
+ action: 'blurred',
147
+ analyticsData: analyticsContext
148
+ }, analyticsAttributes));
149
+ var autoDismissProps = {
150
+ onMouseOver: onMouseOver,
151
+ onFocus: onFocusAnalytics,
152
+ onMouseOut: onMouseOut,
153
+ onBlur: onBlurAnalytics
154
+ };
155
+ var OptionalDismissButton = renderToggleOrDismissButton;
156
+ var boxShadow = "0 20px 32px -8px ".concat(flagShadowColor);
157
+
158
+ if (!isBold) {
159
+ boxShadow = "0 0 1px ".concat(flagBorderColor, ", ").concat(boxShadow);
160
+ }
161
+
162
+ return jsx(GlobalTheme.Consumer, null, function (tokens) {
163
+ var mode = tokens.mode;
164
+ var textColour = getFlagTextColor(appearance, mode);
165
+ return jsx("div", _extends({
166
+ css: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n background-color: ", ";\n border-radius: ", "px;\n box-shadow: ", ";\n color: ", ";\n transition: background-color 200ms;\n width: 100%;\n z-index: ", ";\n "])), getFlagBackgroundColor(appearance, mode), borderRadius(), boxShadow, textColour, layers.flag()),
167
+ role: "alert",
168
+ "data-testid": testId
169
+ }, autoDismissProps), jsx("div", {
170
+ css: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n width: 100%;\n padding: ", "px;\n box-sizing: border-box;\n border-radius: ", "px;\n\n &:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px\n ", ";\n }\n\n @supports not selector(*:focus-visible) {\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px\n ", ";\n }\n }\n\n @media screen and (forced-colors: active),\n screen and (-ms-high-contrast: active) {\n &:focus-visible {\n outline: 1px solid;\n }\n }\n "])), doubleGridSize, borderRadius(), getFlagFocusRingColor(appearance, mode), getFlagFocusRingColor(appearance, mode)) // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
171
+ ,
172
+ tabIndex: 0
173
+ }, jsx("div", {
174
+ css: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n height: ", "px;\n "])), headerHeight)
175
+ }, icon, jsx("span", {
176
+ css: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n color: ", ";\n font-weight: 600;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding: 0 0 0 ", "px;\n "])), textColour, doubleGridSize)
177
+ }, title), jsx(OptionalDismissButton, {
178
+ mode: mode
179
+ })), jsx(Expander, {
180
+ isExpanded: !isBold || isExpanded,
181
+ testId: testId
182
+ }, description && jsx("div", {
183
+ css: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n color: ", ";\n word-wrap: break-word;\n overflow: auto;\n max-height: 100px; /* height is defined as 5 lines maximum by design */\n "])), textColour),
184
+ "data-testid": testId && "".concat(testId, "-description")
185
+ }, description), jsx(Actions, {
186
+ actions: actions,
187
+ appearance: appearance,
188
+ linkComponent: linkComponent,
189
+ testId: testId,
190
+ mode: mode
191
+ }))));
192
+ });
193
+ };
194
+
195
+ export default Flag;
@@ -0,0 +1,4 @@
1
+ export { default } from './flag';
2
+ export { default as AutoDismissFlag } from './auto-dismiss-flag';
3
+ export { default as FlagGroup } from './flag-group';
4
+ export { useFlags, withFlagsProvider, FlagsProvider } from './flag-provider';
@@ -0,0 +1,129 @@
1
+ import * as colors from '@atlaskit/theme/colors';
2
+ var flagBackgroundColor = {
3
+ error: {
4
+ light: colors.R400,
5
+ dark: colors.R300
6
+ },
7
+ info: {
8
+ light: colors.N500,
9
+ dark: colors.N500
10
+ },
11
+ normal: {
12
+ light: colors.N0,
13
+ dark: colors.DN50
14
+ },
15
+ success: {
16
+ light: colors.G400,
17
+ dark: colors.G300
18
+ },
19
+ warning: {
20
+ light: colors.Y200,
21
+ dark: colors.Y300
22
+ }
23
+ };
24
+ export var getFlagBackgroundColor = function getFlagBackgroundColor(appearance, mode) {
25
+ return flagBackgroundColor[appearance][mode];
26
+ };
27
+ export var flagBorderColor = colors.N60A;
28
+ var flagTextColor = {
29
+ error: {
30
+ light: colors.N0,
31
+ dark: colors.DN40
32
+ },
33
+ info: {
34
+ light: colors.N0,
35
+ dark: colors.DN600
36
+ },
37
+ normal: {
38
+ light: colors.N500,
39
+ dark: colors.DN600
40
+ },
41
+ success: {
42
+ light: colors.N0,
43
+ dark: colors.DN40
44
+ },
45
+ warning: {
46
+ light: colors.N700,
47
+ dark: colors.DN40
48
+ }
49
+ };
50
+ export var getFlagTextColor = function getFlagTextColor(appearance, mode) {
51
+ return flagTextColor[appearance][mode];
52
+ };
53
+ export var flagShadowColor = colors.N50A;
54
+ var flagFocusRingColor = {
55
+ error: {
56
+ light: colors.N40,
57
+ dark: colors.N40
58
+ },
59
+ info: {
60
+ light: colors.N40,
61
+ dark: colors.N40
62
+ },
63
+ normal: {
64
+ light: colors.B100,
65
+ dark: colors.B100
66
+ },
67
+ success: {
68
+ light: colors.N40,
69
+ dark: colors.N40
70
+ },
71
+ warning: {
72
+ light: colors.N200,
73
+ dark: colors.N200
74
+ }
75
+ };
76
+ export var getFlagFocusRingColor = function getFlagFocusRingColor(appearance, mode) {
77
+ return flagFocusRingColor[appearance][mode];
78
+ };
79
+ var lightButtonBackground = 'rgba(255, 255, 255, 0.08)';
80
+ var actionBackground = {
81
+ success: {
82
+ light: lightButtonBackground,
83
+ dark: colors.N30A
84
+ },
85
+ info: {
86
+ light: lightButtonBackground,
87
+ dark: lightButtonBackground
88
+ },
89
+ error: {
90
+ light: lightButtonBackground,
91
+ dark: colors.N30A
92
+ },
93
+ warning: {
94
+ light: colors.N30A,
95
+ dark: colors.N30A
96
+ },
97
+ normal: {
98
+ light: 'none',
99
+ dark: 'none'
100
+ }
101
+ };
102
+ var actionColor = {
103
+ success: {
104
+ light: colors.N0,
105
+ dark: colors.DN40
106
+ },
107
+ info: {
108
+ light: colors.N0,
109
+ dark: colors.DN600
110
+ },
111
+ error: {
112
+ light: colors.N0,
113
+ dark: colors.DN600
114
+ },
115
+ warning: {
116
+ light: colors.N700,
117
+ dark: colors.DN40
118
+ },
119
+ normal: {
120
+ light: colors.B400,
121
+ dark: colors.B100
122
+ }
123
+ };
124
+ export var getActionBackground = function getActionBackground(appearance, mode) {
125
+ return actionBackground[appearance][mode];
126
+ };
127
+ export var getActionColor = function getActionColor(appearance, mode) {
128
+ return actionColor[appearance][mode];
129
+ };
@@ -0,0 +1,2 @@
1
+ // exported for testing - keep in sync from `type AppearanceTypes`
2
+ export var AppearanceArray = ['error', 'info', 'normal', 'success', 'warning']; // CreateFlagsArg makes id optional so define this prop separately
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "@atlaskit/flag",
3
+ "version": "14.4.1",
4
+ "sideEffects": false
5
+ }
@@ -0,0 +1,4 @@
1
+ import { AutoDismissFlagProps } from './types';
2
+ export declare const AUTO_DISMISS_SECONDS = 8;
3
+ declare const AutoDismissFlag: (props: AutoDismissFlagProps) => JSX.Element;
4
+ export default AutoDismissFlag;
@@ -0,0 +1,2 @@
1
+ import { AppearanceTypes } from './types';
2
+ export declare const DEFAULT_APPEARANCE: AppearanceTypes;
@@ -0,0 +1,9 @@
1
+ /** @jsx jsx */
2
+ import { ReactNode } from 'react';
3
+ declare type Props = {
4
+ children: ReactNode;
5
+ isExpanded: boolean;
6
+ testId?: string;
7
+ };
8
+ declare const Expander: ({ children, isExpanded, testId }: Props) => JSX.Element;
9
+ export default Expander;
@@ -0,0 +1,14 @@
1
+ /** @jsx jsx */
2
+ import { ComponentType } from 'react';
3
+ import { CustomThemeButtonProps } from '@atlaskit/button/types';
4
+ import { ThemeModes } from '@atlaskit/theme/types';
5
+ import { ActionsType, AppearanceTypes } from './types';
6
+ declare type Props = {
7
+ appearance: AppearanceTypes;
8
+ actions: ActionsType;
9
+ linkComponent?: ComponentType<CustomThemeButtonProps>;
10
+ mode: ThemeModes;
11
+ testId?: string;
12
+ };
13
+ declare const FlagActions: (props: Props) => JSX.Element | null;
14
+ export default FlagActions;
@@ -0,0 +1,27 @@
1
+ /** @jsx jsx */
2
+ import { ReactElement } from 'react';
3
+ import type { UIAnalyticsEvent } from '@atlaskit/analytics-next';
4
+ declare type Props = {
5
+ /** ID attribute used for DOM selection. */
6
+ id?: string;
7
+ /** Describes the specific role of this FlagGroup for users viewing the page with a screen reader (defaults to `Flag notifications`). */
8
+ label?: string;
9
+ /** Describes the specific tag on which the screen reader text will be rendered (defaults to `h2`). */
10
+ labelTag?: React.ElementType;
11
+ /** Flag elements to be displayed. */
12
+ children?: Array<ReactElement> | ReactElement | null | boolean;
13
+ /** Handler which will be called when a Flag's dismiss button is clicked.
14
+ * Receives the id of the dismissed Flag as a parameter.
15
+ */
16
+ onDismissed?: (id: number | string, analyticsEvent: UIAnalyticsEvent) => void;
17
+ };
18
+ export declare const flagWidth: number;
19
+ export declare const flagAnimationTime = 400;
20
+ declare type FlagGroupAPI = {
21
+ onDismissed: (id: number | string, analyticsEvent: UIAnalyticsEvent) => void;
22
+ isDismissAllowed: boolean;
23
+ };
24
+ export declare const FlagGroupContext: import("react").Context<FlagGroupAPI>;
25
+ export declare function useFlagGroup(): FlagGroupAPI;
26
+ declare const FlagGroup: (props: Props) => JSX.Element;
27
+ export default FlagGroup;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { FlagPropsWithoutId } from './types';
3
+ declare type FlagId = string | number;
4
+ export declare type Combine<First, Second> = Omit<First, keyof Second> & Second;
5
+ export interface CreateFlagArgs extends FlagPropsWithoutId {
6
+ /** A unique identifier used for rendering and onDismissed callbacks.
7
+ * This will be autogenerated if you don’t supply one.
8
+ * If you don’t want the same flag showing multiple times, provide a unique id.
9
+ */
10
+ id?: FlagId;
11
+ /** Marks whether the flag should render as an AutoDismissFlag */
12
+ isAutoDismiss?: boolean;
13
+ }
14
+ export declare type FlagArgs = Combine<CreateFlagArgs, {
15
+ id: FlagId;
16
+ }>;
17
+ export declare type DismissFn = () => void;
18
+ export declare type FlagAPI = {
19
+ showFlag: (args: CreateFlagArgs) => DismissFn;
20
+ };
21
+ export declare function useFlags(): FlagAPI;
22
+ export declare function FlagsProvider({ children }: {
23
+ children: React.ReactNode;
24
+ }): JSX.Element;
25
+ export declare const withFlagsProvider: (fn: () => React.ReactNode) => React.ReactNode;
26
+ export {};
@@ -0,0 +1,3 @@
1
+ import { FlagProps } from './types';
2
+ declare const Flag: (props: FlagProps) => JSX.Element;
3
+ export default Flag;
@@ -0,0 +1,6 @@
1
+ export { default } from './flag';
2
+ export { default as AutoDismissFlag } from './auto-dismiss-flag';
3
+ export { default as FlagGroup } from './flag-group';
4
+ export { useFlags, withFlagsProvider, FlagsProvider } from './flag-provider';
5
+ export type { CreateFlagArgs, DismissFn, FlagAPI, FlagArgs, } from './flag-provider';
6
+ export type { FlagProps, ActionsType, AppearanceTypes } from './types';