@jobber/components 6.71.2 → 6.72.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.
@@ -1,32 +1,10 @@
1
- import React, { ReactNode } from "react";
2
- import { IconNames } from "@jobber/design";
3
- import { BannerType } from "./Banner.types";
4
- import { ButtonProps } from "../Button";
5
- interface BannerProps {
6
- readonly children: ReactNode;
7
- /**
8
- * Sets the status-based theme of the Banner
9
- */
10
- readonly type: BannerType;
11
- /**
12
- * Accepts props for Button. Default action uses a 'subtle' Button
13
- */
14
- readonly primaryAction?: ButtonProps;
15
- /**
16
- * Set to false to hide the dismiss button
17
- * @default true
18
- */
19
- readonly dismissible?: boolean;
20
- /**
21
- * Use to override the default status Icon
22
- */
23
- readonly icon?: IconNames;
24
- onDismiss?(): void;
25
- /**
26
- * When provided, Banner's visibility is controlled by this value
27
- * @default undefined
28
- */
29
- readonly controlledVisiblity?: boolean;
1
+ import React from "react";
2
+ import type { BannerActionProps, BannerContentProps, BannerDismissButtonProps, BannerIconProps, BannerProps, BannerProviderProps } from "./Banner.types";
3
+ export declare function Banner({ children, type, primaryAction, dismissible, icon, onDismiss, controlledVisiblity, }: BannerProps): React.JSX.Element;
4
+ export declare namespace Banner {
5
+ var Provider: ({ children, visible, type, onDismiss, icon, dismissButton, UNSAFE_className, UNSAFE_style, }: BannerProviderProps) => React.JSX.Element;
6
+ var Icon: ({ backgroundColor, UNSAFE_className, UNSAFE_style, ...iconProps }: BannerIconProps) => React.JSX.Element | null;
7
+ var Content: (props: BannerContentProps) => React.JSX.Element;
8
+ var DismissButton: (props: BannerDismissButtonProps) => React.JSX.Element;
9
+ var Action: ({ UNSAFE_className, UNSAFE_style, ...buttonProps }: BannerActionProps) => React.JSX.Element;
30
10
  }
31
- export declare function Banner({ children, type, primaryAction, dismissible, icon, onDismiss, controlledVisiblity, }: BannerProps): React.JSX.Element | null;
32
- export {};
@@ -1 +1,165 @@
1
+ import { type CSSProperties, type PropsWithChildren, type ReactNode } from "react";
2
+ import { type IconNames, tokens } from "@jobber/design";
3
+ import { type ButtonProps } from "../Button";
4
+ import { type ButtonDismissProps } from "../ButtonDismiss";
5
+ import { IconProps } from "../Icon";
1
6
  export type BannerType = "notice" | "success" | "warning" | "error";
7
+ type TokensType = keyof typeof tokens;
8
+ type Prefixes = TokensType extends `${infer Prefix}-${string}` ? Prefix : never;
9
+ type ExtractTokens<T extends string> = Extract<TokensType, `${T}-${string}`>;
10
+ type Tokenize<T extends Prefixes> = ExtractTokens<T> extends `${T}-${infer Value}` ? Value : never;
11
+ type Colors = Tokenize<"color">;
12
+ export interface BannerProps {
13
+ readonly children: ReactNode;
14
+ /**
15
+ * Sets the status-based theme of the Banner
16
+ */
17
+ readonly type: BannerType;
18
+ /**
19
+ * Accepts props for Button. Default action uses a 'subtle' Button
20
+ */
21
+ readonly primaryAction?: ButtonProps;
22
+ /**
23
+ * Set to false to hide the dismiss button
24
+ * @default true
25
+ */
26
+ readonly dismissible?: boolean;
27
+ /**
28
+ * Use to override the default status Icon
29
+ */
30
+ readonly icon?: IconNames;
31
+ /**
32
+ * Callback to be called when the Banner is dismissed.
33
+ */
34
+ onDismiss?(): void;
35
+ /**
36
+ * When provided, Banner's visibility is controlled by this value
37
+ * @default undefined
38
+ */
39
+ readonly controlledVisiblity?: boolean;
40
+ }
41
+ export interface BannerProviderProps extends PropsWithChildren {
42
+ /**
43
+ * Sets the status-based theme of the Banner.
44
+ */
45
+ readonly type: BannerType;
46
+ /**
47
+ * When provided, Banner's visibility is controlled by this value.
48
+ */
49
+ readonly visible?: boolean;
50
+ /**
51
+ * Callback to be called when the Banner is dismissed.
52
+ */
53
+ readonly onDismiss?: () => void;
54
+ /**
55
+ * Icon to be used for the Banner.
56
+ * If you want to remove the icon, set to false.
57
+ * @default <Banner.Icon/>
58
+ */
59
+ readonly icon?: React.ReactNode;
60
+ /**
61
+ * Dismiss button to be used for the Banner.
62
+ * If you want to remove the dismiss button, set to false.
63
+ * @default <Banner.DismissButton/>
64
+ */
65
+ readonly dismissButton?: React.ReactNode;
66
+ /**
67
+ * **Use at your own risk:** Custom class names for specific elements. This should only be used as a
68
+ * **last resort**. Using this may result in unexpected side effects.
69
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
70
+ */
71
+ readonly UNSAFE_className?: {
72
+ readonly container?: string;
73
+ };
74
+ /**
75
+ * **Use at your own risk:** Custom style for specific elements. This should only be used as a
76
+ * **last resort**. Using this may result in unexpected side effects.
77
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
78
+ */
79
+ readonly UNSAFE_style?: {
80
+ readonly container?: CSSProperties;
81
+ };
82
+ }
83
+ export interface BannerContentProps extends PropsWithChildren {
84
+ /**
85
+ * **Use at your own risk:** Custom class names for specific elements. This should only be used as a
86
+ * **last resort**. Using this may result in unexpected side effects.
87
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
88
+ */
89
+ readonly UNSAFE_className?: {
90
+ readonly container?: string;
91
+ };
92
+ /**
93
+ * **Use at your own risk:** Custom style for specific elements. This should only be used as a
94
+ * **last resort**. Using this may result in unexpected side effects.
95
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
96
+ */
97
+ readonly UNSAFE_style?: {
98
+ readonly container?: CSSProperties;
99
+ };
100
+ }
101
+ export interface BannerDismissButtonProps {
102
+ readonly onClick?: ButtonDismissProps["onClick"];
103
+ readonly ariaLabel?: ButtonDismissProps["ariaLabel"];
104
+ /**
105
+ * **Use at your own risk:** Custom class names for specific elements. This should only be used as a
106
+ * **last resort**. Using this may result in unexpected side effects.
107
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
108
+ */
109
+ readonly UNSAFE_className?: {
110
+ readonly container?: string;
111
+ };
112
+ /**
113
+ * **Use at your own risk:** Custom style for specific elements. This should only be used as a
114
+ * **last resort**. Using this may result in unexpected side effects.
115
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
116
+ */
117
+ readonly UNSAFE_style?: {
118
+ readonly container?: CSSProperties;
119
+ };
120
+ }
121
+ export interface BannerIconProps extends Partial<Omit<IconProps, "UNSAFE_className" | "UNSAFE_style">> {
122
+ /**
123
+ * Sets the background color of the icon.
124
+ */
125
+ readonly backgroundColor?: Colors;
126
+ /**
127
+ * **Use at your own risk:** Custom class names for specific elements. This should only be used as a
128
+ * **last resort**. Using this may result in unexpected side effects.
129
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
130
+ */
131
+ readonly UNSAFE_className?: {
132
+ readonly container?: string;
133
+ readonly icon?: IconProps["UNSAFE_className"];
134
+ };
135
+ /**
136
+ * **Use at your own risk:** Custom style for specific elements. This should only be used as a
137
+ * **last resort**. Using this may result in unexpected side effects.
138
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
139
+ */
140
+ readonly UNSAFE_style?: {
141
+ readonly container?: CSSProperties;
142
+ readonly icon?: IconProps["UNSAFE_style"];
143
+ };
144
+ }
145
+ export interface BannerActionProps extends Omit<ButtonProps, "UNSAFE_className" | "UNSAFE_style"> {
146
+ /**
147
+ * **Use at your own risk:** Custom class names for specific elements. This should only be used as a
148
+ * **last resort**. Using this may result in unexpected side effects.
149
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
150
+ */
151
+ readonly UNSAFE_className?: {
152
+ readonly container?: string;
153
+ readonly button?: ButtonProps["UNSAFE_className"];
154
+ };
155
+ /**
156
+ * **Use at your own risk:** Custom style for specific elements. This should only be used as a
157
+ * **last resort**. Using this may result in unexpected side effects.
158
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
159
+ */
160
+ readonly UNSAFE_style?: {
161
+ readonly container?: CSSProperties;
162
+ readonly button?: ButtonProps["UNSAFE_style"];
163
+ };
164
+ }
165
+ export {};
@@ -0,0 +1,18 @@
1
+ import { BannerType } from "./Banner.types";
2
+ interface BannerContextValue {
3
+ /**
4
+ * The status-based theme of the Banner.
5
+ */
6
+ readonly type: BannerType;
7
+ /**
8
+ * Whether the Banner is currently visible.
9
+ */
10
+ readonly isVisible: boolean;
11
+ /**
12
+ * Sets the visibility of the Banner.
13
+ */
14
+ readonly setIsVisible: (visible: boolean) => void;
15
+ }
16
+ export declare const BannerContextProvider: import("react").Provider<BannerContextValue>;
17
+ export declare function useBanner(): BannerContextValue;
18
+ export {};
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var Banner = require('../Banner-cjs.js');
4
+ require('../tslib.es6-cjs.js');
4
5
  require('react');
5
6
  require('classnames');
6
7
  require('../useResizeObserver-cjs.js');
@@ -9,15 +10,13 @@ require('../throttle-cjs.js');
9
10
  require('../debounce-cjs.js');
10
11
  require('../isObjectLike-cjs.js');
11
12
  require('../isSymbol-cjs.js');
12
- require('../BannerIcon-cjs.js');
13
13
  require('../Icon-cjs.js');
14
14
  require('@jobber/design');
15
- require('../Text-cjs.js');
16
- require('../Typography-cjs.js');
15
+ require('../ButtonDismiss-cjs.js');
17
16
  require('../Button-cjs.js');
18
17
  require('react-router-dom');
19
- require('../tslib.es6-cjs.js');
20
- require('../ButtonDismiss-cjs.js');
18
+ require('../Typography-cjs.js');
19
+ require('../Text-cjs.js');
21
20
 
22
21
 
23
22
 
@@ -1,2 +1,2 @@
1
1
  export { Banner } from "./Banner";
2
- export { BannerType } from "./Banner.types";
2
+ export type { BannerType, BannerDismissButtonProps, BannerProviderProps, BannerContentProps, BannerIconProps, } from "./Banner.types";
@@ -1,4 +1,5 @@
1
1
  export { B as Banner } from '../Banner-es.js';
2
+ import '../tslib.es6-es.js';
2
3
  import 'react';
3
4
  import 'classnames';
4
5
  import '../useResizeObserver-es.js';
@@ -7,12 +8,10 @@ import '../throttle-es.js';
7
8
  import '../debounce-es.js';
8
9
  import '../isObjectLike-es.js';
9
10
  import '../isSymbol-es.js';
10
- import '../BannerIcon-es.js';
11
11
  import '../Icon-es.js';
12
12
  import '@jobber/design';
13
- import '../Text-es.js';
14
- import '../Typography-es.js';
13
+ import '../ButtonDismiss-es.js';
15
14
  import '../Button-es.js';
16
15
  import 'react-router-dom';
17
- import '../tslib.es6-es.js';
18
- import '../ButtonDismiss-es.js';
16
+ import '../Typography-es.js';
17
+ import '../Text-es.js';
@@ -1,25 +1,29 @@
1
1
  'use strict';
2
2
 
3
+ var tslib_es6 = require('./tslib.es6-cjs.js');
3
4
  var React = require('react');
4
5
  var classnames = require('classnames');
5
6
  var useResizeObserver = require('./useResizeObserver-cjs.js');
6
- var BannerIcon = require('./BannerIcon-cjs.js');
7
- var Text = require('./Text-cjs.js');
8
- var Button = require('./Button-cjs.js');
7
+ var Icon = require('./Icon-cjs.js');
9
8
  var ButtonDismiss = require('./ButtonDismiss-cjs.js');
9
+ var Button = require('./Button-cjs.js');
10
+ var Text = require('./Text-cjs.js');
11
+
12
+ var styles = {"banner":"ucGelS5nNm0-","notice":"_5VzH3Cz9ps8-","error":"_16jyB9OYJIs-","warning":"_4h-6cc8lZo8-","success":"k7T2IV0R8Q0-","bannerChildren":"dG2vHE6g8f0-","bannerContent":"j9IeihCCYxI-","medium":"D5X29shmSr0-","bannerAction":"W0pSTO-oRmk-","closeButton":"-IYYDBmq2Q0-","iconWrapper":"BQhacg0OlMs-","successIcon":"wc5os7zGk30-","errorIcon":"R0t3TbhBBqo-","warningIcon":"i5fVmbzbYVM-","noticeIcon":"onwyp3UI3so-","spinning":"fZdByimVT5Q-"};
13
+
14
+ const BannerContext = React.createContext({
15
+ type: "success",
16
+ isVisible: true,
17
+ setIsVisible: () => {
18
+ // noop
19
+ },
20
+ });
21
+ const BannerContextProvider = BannerContext.Provider;
22
+ function useBanner() {
23
+ return React.useContext(BannerContext);
24
+ }
10
25
 
11
26
  function Banner({ children, type, primaryAction, dismissible = true, icon, onDismiss, controlledVisiblity, }) {
12
- const [showBanner, setShowBanner] = React.useState(true);
13
- const bannerIcon = icon || getBannerIcon(type);
14
- const controlledVisible = controlledVisiblity !== null && controlledVisiblity !== void 0 ? controlledVisiblity : true;
15
- const visible = controlledVisible && showBanner;
16
- const bannerWidths = {
17
- small: 320,
18
- medium: 480,
19
- };
20
- const [bannerRef, { width: bannerWidth = bannerWidths.small }] = useResizeObserver.useResizeObserver.useResizeObserver({
21
- widths: bannerWidths,
22
- });
23
27
  if (primaryAction != undefined) {
24
28
  primaryAction = Object.assign({
25
29
  size: "small",
@@ -27,27 +31,85 @@ function Banner({ children, type, primaryAction, dismissible = true, icon, onDis
27
31
  variation: "subtle",
28
32
  }, primaryAction);
29
33
  }
30
- const bannerClassNames = classnames(BannerIcon.styles.banner, [BannerIcon.styles[type]], {
31
- [BannerIcon.styles.medium]: bannerWidth >= bannerWidths.medium,
32
- });
33
- if (!visible)
34
- return null;
35
- return (React.createElement("div", { className: bannerClassNames, ref: bannerRef, role: type === "error" ? "alert" : "status" },
36
- React.createElement("div", { className: BannerIcon.styles.bannerContent },
37
- bannerIcon && React.createElement(BannerIcon.BannerIcon, { icon: bannerIcon, type: type }),
38
- React.createElement("div", { className: BannerIcon.styles.bannerChildren },
39
- React.createElement(BannerChildren, null, children)),
40
- primaryAction && (React.createElement("div", { className: BannerIcon.styles.bannerAction },
41
- React.createElement(Button.Button, Object.assign({}, primaryAction))))),
42
- dismissible && (React.createElement("div", { className: BannerIcon.styles.closeButton },
43
- React.createElement(ButtonDismiss.ButtonDismiss, { ariaLabel: "Dismiss notification", onClick: handleClose })))));
44
- function handleClose() {
45
- if (typeof controlledVisiblity === "undefined") {
46
- setShowBanner(!showBanner);
34
+ return (React.createElement(Banner.Provider, { type: type, visible: controlledVisiblity, onDismiss: onDismiss, icon: React.createElement(Banner.Icon, { name: icon }), dismissButton: dismissible && React.createElement(Banner.DismissButton, null) },
35
+ React.createElement(Banner.Content, null, children),
36
+ primaryAction && React.createElement(Banner.Action, Object.assign({}, primaryAction))));
37
+ }
38
+ Banner.Provider = function BannerProvider({ children, visible, type, onDismiss, icon, dismissButton, UNSAFE_className, UNSAFE_style, }) {
39
+ const [isVisible, _setIsVisible] = React.useState(true);
40
+ const showBanner = visible !== null && visible !== void 0 ? visible : isVisible;
41
+ const setIsVisible = (newValue) => {
42
+ // Only update internal visibility if it's not controlled by the parent.
43
+ if (typeof visible === "undefined") {
44
+ _setIsVisible(newValue);
47
45
  }
48
46
  onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
49
- }
47
+ };
48
+ return (React.createElement(BannerContextProvider, { value: {
49
+ type,
50
+ isVisible: showBanner,
51
+ setIsVisible,
52
+ } },
53
+ React.createElement(InternalWrapper, { icon: icon, dismissButton: dismissButton, UNSAFE_className: UNSAFE_className, UNSAFE_style: UNSAFE_style }, children)));
54
+ };
55
+ function InternalWrapper({ children, icon, dismissButton, UNSAFE_className, UNSAFE_style, }) {
56
+ const { isVisible, type } = useBanner();
57
+ const bannerWidths = {
58
+ small: 320,
59
+ medium: 480,
60
+ };
61
+ const [bannerRef, { width: bannerWidth = bannerWidths.small }] = useResizeObserver.useResizeObserver.useResizeObserver({
62
+ widths: bannerWidths,
63
+ });
64
+ const bannerClassNames = classnames(styles.banner, [styles[type]], {
65
+ [styles.medium]: bannerWidth >= bannerWidths.medium,
66
+ }, UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.container);
67
+ if (!isVisible)
68
+ return null;
69
+ return (React.createElement("div", { ref: bannerRef, className: bannerClassNames, style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.container, role: type === "error" ? "alert" : "status" },
70
+ React.createElement("div", { className: styles.bannerContent }, icon !== null && icon !== void 0 ? icon : React.createElement(Banner.Icon, null),
71
+ children), dismissButton !== null && dismissButton !== void 0 ? dismissButton : React.createElement(Banner.DismissButton, null)));
50
72
  }
73
+ Banner.Icon = function BannerIcon(_a) {
74
+ var { backgroundColor, UNSAFE_className, UNSAFE_style } = _a, iconProps = tslib_es6.__rest(_a, ["backgroundColor", "UNSAFE_className", "UNSAFE_style"]);
75
+ const { type } = useBanner();
76
+ const name = iconProps.name || getBannerIcon(type);
77
+ const color = iconProps.customColor ? undefined : "surface";
78
+ const size = "small";
79
+ if (!name)
80
+ return null;
81
+ const overrideStyles = {};
82
+ if (backgroundColor) {
83
+ overrideStyles.backgroundColor = `var(--color-${backgroundColor})`;
84
+ }
85
+ const classNames = classnames(styles.iconWrapper, styles[`${type}Icon`], UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.container);
86
+ return (React.createElement("span", { className: classNames, style: Object.assign(Object.assign({}, overrideStyles), UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.container) },
87
+ React.createElement(Icon.Icon, Object.assign({ color: color, size: size, UNSAFE_className: UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.icon, UNSAFE_style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.icon }, iconProps, { name: name }))));
88
+ };
89
+ Banner.Content = function BannerContent(props) {
90
+ var _a, _b;
91
+ let children = props.children;
92
+ if (children && typeof children === "string") {
93
+ children = React.createElement(Text.Text, null, children);
94
+ }
95
+ return (React.createElement("div", { className: classnames(styles.bannerChildren, (_a = props.UNSAFE_className) === null || _a === void 0 ? void 0 : _a.container), style: (_b = props.UNSAFE_style) === null || _b === void 0 ? void 0 : _b.container }, children));
96
+ };
97
+ Banner.DismissButton = function DismissButton(props) {
98
+ var _a, _b, _c, _d;
99
+ const { setIsVisible } = useBanner();
100
+ const ariaLabel = (_a = props.ariaLabel) !== null && _a !== void 0 ? _a : "Dismiss notification";
101
+ const onClick = (_b = props.onClick) !== null && _b !== void 0 ? _b : (() => {
102
+ setIsVisible(false);
103
+ });
104
+ return (React.createElement("div", { className: classnames(styles.closeButton, (_c = props.UNSAFE_className) === null || _c === void 0 ? void 0 : _c.container), style: (_d = props.UNSAFE_style) === null || _d === void 0 ? void 0 : _d.container },
105
+ React.createElement(ButtonDismiss.ButtonDismiss, { onClick: onClick, ariaLabel: ariaLabel })));
106
+ };
107
+ Banner.Action = function Action(_a) {
108
+ var { UNSAFE_className, UNSAFE_style } = _a, buttonProps = tslib_es6.__rest(_a, ["UNSAFE_className", "UNSAFE_style"]);
109
+ const classNames = classnames(styles.bannerAction, UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.container);
110
+ return (React.createElement("div", { className: classNames, style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.container },
111
+ React.createElement(Button.Button, Object.assign({ size: "small", type: "primary", variation: "subtle", UNSAFE_className: UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.button, UNSAFE_style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.button }, buttonProps))));
112
+ };
51
113
  function getBannerIcon(type) {
52
114
  switch (type) {
53
115
  case "notice":
@@ -60,13 +122,5 @@ function getBannerIcon(type) {
60
122
  return "alert";
61
123
  }
62
124
  }
63
- function BannerChildren({ children, }) {
64
- if (!children)
65
- return React.createElement(React.Fragment, null);
66
- if (children && typeof children === "string") {
67
- return React.createElement(Text.Text, null, children);
68
- }
69
- return React.createElement(React.Fragment, null, children);
70
- }
71
125
 
72
126
  exports.Banner = Banner;
package/dist/Banner-es.js CHANGED
@@ -1,23 +1,27 @@
1
- import React__default, { useState } from 'react';
1
+ import { _ as __rest } from './tslib.es6-es.js';
2
+ import React__default, { createContext, useContext, useState } from 'react';
2
3
  import classnames from 'classnames';
3
4
  import { u as useResizeObserver } from './useResizeObserver-es.js';
4
- import { s as styles, B as BannerIcon } from './BannerIcon-es.js';
5
- import { T as Text } from './Text-es.js';
6
- import { B as Button } from './Button-es.js';
5
+ import { I as Icon } from './Icon-es.js';
7
6
  import { B as ButtonDismiss } from './ButtonDismiss-es.js';
7
+ import { B as Button } from './Button-es.js';
8
+ import { T as Text } from './Text-es.js';
9
+
10
+ var styles = {"banner":"ucGelS5nNm0-","notice":"_5VzH3Cz9ps8-","error":"_16jyB9OYJIs-","warning":"_4h-6cc8lZo8-","success":"k7T2IV0R8Q0-","bannerChildren":"dG2vHE6g8f0-","bannerContent":"j9IeihCCYxI-","medium":"D5X29shmSr0-","bannerAction":"W0pSTO-oRmk-","closeButton":"-IYYDBmq2Q0-","iconWrapper":"BQhacg0OlMs-","successIcon":"wc5os7zGk30-","errorIcon":"R0t3TbhBBqo-","warningIcon":"i5fVmbzbYVM-","noticeIcon":"onwyp3UI3so-","spinning":"fZdByimVT5Q-"};
11
+
12
+ const BannerContext = createContext({
13
+ type: "success",
14
+ isVisible: true,
15
+ setIsVisible: () => {
16
+ // noop
17
+ },
18
+ });
19
+ const BannerContextProvider = BannerContext.Provider;
20
+ function useBanner() {
21
+ return useContext(BannerContext);
22
+ }
8
23
 
9
24
  function Banner({ children, type, primaryAction, dismissible = true, icon, onDismiss, controlledVisiblity, }) {
10
- const [showBanner, setShowBanner] = useState(true);
11
- const bannerIcon = icon || getBannerIcon(type);
12
- const controlledVisible = controlledVisiblity !== null && controlledVisiblity !== void 0 ? controlledVisiblity : true;
13
- const visible = controlledVisible && showBanner;
14
- const bannerWidths = {
15
- small: 320,
16
- medium: 480,
17
- };
18
- const [bannerRef, { width: bannerWidth = bannerWidths.small }] = useResizeObserver.useResizeObserver({
19
- widths: bannerWidths,
20
- });
21
25
  if (primaryAction != undefined) {
22
26
  primaryAction = Object.assign({
23
27
  size: "small",
@@ -25,27 +29,85 @@ function Banner({ children, type, primaryAction, dismissible = true, icon, onDis
25
29
  variation: "subtle",
26
30
  }, primaryAction);
27
31
  }
32
+ return (React__default.createElement(Banner.Provider, { type: type, visible: controlledVisiblity, onDismiss: onDismiss, icon: React__default.createElement(Banner.Icon, { name: icon }), dismissButton: dismissible && React__default.createElement(Banner.DismissButton, null) },
33
+ React__default.createElement(Banner.Content, null, children),
34
+ primaryAction && React__default.createElement(Banner.Action, Object.assign({}, primaryAction))));
35
+ }
36
+ Banner.Provider = function BannerProvider({ children, visible, type, onDismiss, icon, dismissButton, UNSAFE_className, UNSAFE_style, }) {
37
+ const [isVisible, _setIsVisible] = useState(true);
38
+ const showBanner = visible !== null && visible !== void 0 ? visible : isVisible;
39
+ const setIsVisible = (newValue) => {
40
+ // Only update internal visibility if it's not controlled by the parent.
41
+ if (typeof visible === "undefined") {
42
+ _setIsVisible(newValue);
43
+ }
44
+ onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
45
+ };
46
+ return (React__default.createElement(BannerContextProvider, { value: {
47
+ type,
48
+ isVisible: showBanner,
49
+ setIsVisible,
50
+ } },
51
+ React__default.createElement(InternalWrapper, { icon: icon, dismissButton: dismissButton, UNSAFE_className: UNSAFE_className, UNSAFE_style: UNSAFE_style }, children)));
52
+ };
53
+ function InternalWrapper({ children, icon, dismissButton, UNSAFE_className, UNSAFE_style, }) {
54
+ const { isVisible, type } = useBanner();
55
+ const bannerWidths = {
56
+ small: 320,
57
+ medium: 480,
58
+ };
59
+ const [bannerRef, { width: bannerWidth = bannerWidths.small }] = useResizeObserver.useResizeObserver({
60
+ widths: bannerWidths,
61
+ });
28
62
  const bannerClassNames = classnames(styles.banner, [styles[type]], {
29
63
  [styles.medium]: bannerWidth >= bannerWidths.medium,
30
- });
31
- if (!visible)
64
+ }, UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.container);
65
+ if (!isVisible)
32
66
  return null;
33
- return (React__default.createElement("div", { className: bannerClassNames, ref: bannerRef, role: type === "error" ? "alert" : "status" },
34
- React__default.createElement("div", { className: styles.bannerContent },
35
- bannerIcon && React__default.createElement(BannerIcon, { icon: bannerIcon, type: type }),
36
- React__default.createElement("div", { className: styles.bannerChildren },
37
- React__default.createElement(BannerChildren, null, children)),
38
- primaryAction && (React__default.createElement("div", { className: styles.bannerAction },
39
- React__default.createElement(Button, Object.assign({}, primaryAction))))),
40
- dismissible && (React__default.createElement("div", { className: styles.closeButton },
41
- React__default.createElement(ButtonDismiss, { ariaLabel: "Dismiss notification", onClick: handleClose })))));
42
- function handleClose() {
43
- if (typeof controlledVisiblity === "undefined") {
44
- setShowBanner(!showBanner);
45
- }
46
- onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
47
- }
67
+ return (React__default.createElement("div", { ref: bannerRef, className: bannerClassNames, style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.container, role: type === "error" ? "alert" : "status" },
68
+ React__default.createElement("div", { className: styles.bannerContent }, icon !== null && icon !== void 0 ? icon : React__default.createElement(Banner.Icon, null),
69
+ children), dismissButton !== null && dismissButton !== void 0 ? dismissButton : React__default.createElement(Banner.DismissButton, null)));
48
70
  }
71
+ Banner.Icon = function BannerIcon(_a) {
72
+ var { backgroundColor, UNSAFE_className, UNSAFE_style } = _a, iconProps = __rest(_a, ["backgroundColor", "UNSAFE_className", "UNSAFE_style"]);
73
+ const { type } = useBanner();
74
+ const name = iconProps.name || getBannerIcon(type);
75
+ const color = iconProps.customColor ? undefined : "surface";
76
+ const size = "small";
77
+ if (!name)
78
+ return null;
79
+ const overrideStyles = {};
80
+ if (backgroundColor) {
81
+ overrideStyles.backgroundColor = `var(--color-${backgroundColor})`;
82
+ }
83
+ const classNames = classnames(styles.iconWrapper, styles[`${type}Icon`], UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.container);
84
+ return (React__default.createElement("span", { className: classNames, style: Object.assign(Object.assign({}, overrideStyles), UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.container) },
85
+ React__default.createElement(Icon, Object.assign({ color: color, size: size, UNSAFE_className: UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.icon, UNSAFE_style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.icon }, iconProps, { name: name }))));
86
+ };
87
+ Banner.Content = function BannerContent(props) {
88
+ var _a, _b;
89
+ let children = props.children;
90
+ if (children && typeof children === "string") {
91
+ children = React__default.createElement(Text, null, children);
92
+ }
93
+ return (React__default.createElement("div", { className: classnames(styles.bannerChildren, (_a = props.UNSAFE_className) === null || _a === void 0 ? void 0 : _a.container), style: (_b = props.UNSAFE_style) === null || _b === void 0 ? void 0 : _b.container }, children));
94
+ };
95
+ Banner.DismissButton = function DismissButton(props) {
96
+ var _a, _b, _c, _d;
97
+ const { setIsVisible } = useBanner();
98
+ const ariaLabel = (_a = props.ariaLabel) !== null && _a !== void 0 ? _a : "Dismiss notification";
99
+ const onClick = (_b = props.onClick) !== null && _b !== void 0 ? _b : (() => {
100
+ setIsVisible(false);
101
+ });
102
+ return (React__default.createElement("div", { className: classnames(styles.closeButton, (_c = props.UNSAFE_className) === null || _c === void 0 ? void 0 : _c.container), style: (_d = props.UNSAFE_style) === null || _d === void 0 ? void 0 : _d.container },
103
+ React__default.createElement(ButtonDismiss, { onClick: onClick, ariaLabel: ariaLabel })));
104
+ };
105
+ Banner.Action = function Action(_a) {
106
+ var { UNSAFE_className, UNSAFE_style } = _a, buttonProps = __rest(_a, ["UNSAFE_className", "UNSAFE_style"]);
107
+ const classNames = classnames(styles.bannerAction, UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.container);
108
+ return (React__default.createElement("div", { className: classNames, style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.container },
109
+ React__default.createElement(Button, Object.assign({ size: "small", type: "primary", variation: "subtle", UNSAFE_className: UNSAFE_className === null || UNSAFE_className === void 0 ? void 0 : UNSAFE_className.button, UNSAFE_style: UNSAFE_style === null || UNSAFE_style === void 0 ? void 0 : UNSAFE_style.button }, buttonProps))));
110
+ };
49
111
  function getBannerIcon(type) {
50
112
  switch (type) {
51
113
  case "notice":
@@ -58,13 +120,5 @@ function getBannerIcon(type) {
58
120
  return "alert";
59
121
  }
60
122
  }
61
- function BannerChildren({ children, }) {
62
- if (!children)
63
- return React__default.createElement(React__default.Fragment, null);
64
- if (children && typeof children === "string") {
65
- return React__default.createElement(Text, null, children);
66
- }
67
- return React__default.createElement(React__default.Fragment, null, children);
68
- }
69
123
 
70
124
  export { Banner as B };
@@ -1,2 +1,2 @@
1
1
  export * from "./DataList";
2
- export { DataListItemType, DataListObject, DataListSorting, DataListSortable, DataListSelectedType, DataListSelectedAllType, DataListProps, DataListEmptyStateProps, DataListLayoutProps, DataListActionProps, DataListItemActionsProps, DataListBulkActionProps, DataListSearchProps, } from "./DataList.types";
2
+ export { DataListHeader, DataListItemType, DataListObject, DataListSorting, DataListSortable, DataListSelectedType, DataListSelectedAllType, DataListProps, DataListEmptyStateProps, DataListLayoutProps, DataListActionProps, DataListItemActionsProps, DataListBulkActionProps, DataListSearchProps, } from "./DataList.types";
package/dist/index.cjs CHANGED
@@ -117,7 +117,6 @@ require('./useDebounce-cjs.js');
117
117
  require('./debounce-cjs.js');
118
118
  require('./isSymbol-cjs.js');
119
119
  require('color');
120
- require('./BannerIcon-cjs.js');
121
120
  require('react-router-dom');
122
121
  require('./getMappedAtlantisSpaceToken-cjs.js');
123
122
  require('react-hook-form');
package/dist/index.mjs CHANGED
@@ -115,7 +115,6 @@ import './useDebounce-es.js';
115
115
  import './debounce-es.js';
116
116
  import './isSymbol-es.js';
117
117
  import 'color';
118
- import './BannerIcon-es.js';
119
118
  import 'react-router-dom';
120
119
  import './getMappedAtlantisSpaceToken-es.js';
121
120
  import 'react-hook-form';
package/dist/styles.css CHANGED
@@ -1840,22 +1840,22 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
1840
1840
  align-self: center;
1841
1841
  }
1842
1842
 
1843
- .RRQ5CQj05jU- {
1843
+ .wc5os7zGk30- {
1844
1844
  background-color: hsl(107, 58%, 33%);
1845
1845
  background-color: var(--color-success);
1846
1846
  }
1847
1847
 
1848
- .rLsOR1QiHC8- {
1848
+ .R0t3TbhBBqo- {
1849
1849
  background-color: hsl(6, 64%, 51%);
1850
1850
  background-color: var(--color-destructive);
1851
1851
  }
1852
1852
 
1853
- .KqPf0zuN2fg- {
1853
+ .i5fVmbzbYVM- {
1854
1854
  background-color: hsl(51, 64%, 49%);
1855
1855
  background-color: var(--color-warning);
1856
1856
  }
1857
1857
 
1858
- .M3q29PUUYRM- {
1858
+ .onwyp3UI3so- {
1859
1859
  background-color: hsl(207, 79%, 57%);
1860
1860
  background-color: var(--color-informative);
1861
1861
  }
@@ -11,6 +11,11 @@
11
11
  "Autocomplete",
12
12
  "Avatar",
13
13
  "Banner",
14
+ "Banner.Action",
15
+ "Banner.Content",
16
+ "Banner.DismissButton",
17
+ "Banner.Icon",
18
+ "Banner.Provider",
14
19
  "Body",
15
20
  "Box",
16
21
  "Button",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "6.71.2",
3
+ "version": "6.72.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -542,5 +542,5 @@
542
542
  "> 1%",
543
543
  "IE 10"
544
544
  ],
545
- "gitHead": "6aa8ab69238ec2575e71437953092a63ddf99d59"
545
+ "gitHead": "2f1e354aaf4dd7a15dad518b598887366f55fa8d"
546
546
  }
@@ -1,8 +0,0 @@
1
- import React from "react";
2
- import { IconNames } from "@jobber/design";
3
- import { BannerType } from "../../Banner.types";
4
- export interface BannerIconProps {
5
- readonly icon: IconNames;
6
- readonly type: BannerType;
7
- }
8
- export declare function BannerIcon({ icon, type }: BannerIconProps): React.JSX.Element;
@@ -1,11 +0,0 @@
1
- 'use strict';
2
-
3
- var BannerIcon = require('../../../BannerIcon-cjs.js');
4
- require('react');
5
- require('classnames');
6
- require('../../../Icon-cjs.js');
7
- require('@jobber/design');
8
-
9
-
10
-
11
- exports.BannerIcon = BannerIcon.BannerIcon;
@@ -1 +0,0 @@
1
- export * from "./BannerIcon";
@@ -1,5 +0,0 @@
1
- export { B as BannerIcon } from '../../../BannerIcon-es.js';
2
- import 'react';
3
- import 'classnames';
4
- import '../../../Icon-es.js';
5
- import '@jobber/design';
@@ -1,17 +0,0 @@
1
- 'use strict';
2
-
3
- var React = require('react');
4
- var classnames = require('classnames');
5
- var Icon = require('./Icon-cjs.js');
6
-
7
- var styles = {"banner":"ucGelS5nNm0-","notice":"_5VzH3Cz9ps8-","error":"_16jyB9OYJIs-","warning":"_4h-6cc8lZo8-","success":"k7T2IV0R8Q0-","bannerChildren":"dG2vHE6g8f0-","bannerContent":"j9IeihCCYxI-","medium":"D5X29shmSr0-","bannerAction":"W0pSTO-oRmk-","closeButton":"-IYYDBmq2Q0-","iconWrapper":"BQhacg0OlMs-","spinning":"fZdByimVT5Q-"};
8
-
9
- var iconStyles = {"success":"RRQ5CQj05jU-","error":"rLsOR1QiHC8-","warning":"KqPf0zuN2fg-","notice":"M3q29PUUYRM-","spinning":"ad7f3jNTQXM-"};
10
-
11
- function BannerIcon({ icon, type }) {
12
- return (React.createElement("span", { className: classnames(styles.iconWrapper, iconStyles[type]) },
13
- React.createElement(Icon.Icon, { name: icon, color: "surface", size: "small" })));
14
- }
15
-
16
- exports.BannerIcon = BannerIcon;
17
- exports.styles = styles;
@@ -1,14 +0,0 @@
1
- import React__default from 'react';
2
- import classnames from 'classnames';
3
- import { I as Icon } from './Icon-es.js';
4
-
5
- var styles = {"banner":"ucGelS5nNm0-","notice":"_5VzH3Cz9ps8-","error":"_16jyB9OYJIs-","warning":"_4h-6cc8lZo8-","success":"k7T2IV0R8Q0-","bannerChildren":"dG2vHE6g8f0-","bannerContent":"j9IeihCCYxI-","medium":"D5X29shmSr0-","bannerAction":"W0pSTO-oRmk-","closeButton":"-IYYDBmq2Q0-","iconWrapper":"BQhacg0OlMs-","spinning":"fZdByimVT5Q-"};
6
-
7
- var iconStyles = {"success":"RRQ5CQj05jU-","error":"rLsOR1QiHC8-","warning":"KqPf0zuN2fg-","notice":"M3q29PUUYRM-","spinning":"ad7f3jNTQXM-"};
8
-
9
- function BannerIcon({ icon, type }) {
10
- return (React__default.createElement("span", { className: classnames(styles.iconWrapper, iconStyles[type]) },
11
- React__default.createElement(Icon, { name: icon, color: "surface", size: "small" })));
12
- }
13
-
14
- export { BannerIcon as B, styles as s };