@transferwise/components 0.0.0-experimental-bf3b43b → 0.0.0-experimental-cbc00a7

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 (73) hide show
  1. package/build/Snackbar/Snackbar.js +107 -105
  2. package/build/Snackbar/Snackbar.js.map +1 -1
  3. package/build/Snackbar/Snackbar.mjs +109 -104
  4. package/build/Snackbar/Snackbar.mjs.map +1 -1
  5. package/build/Snackbar/SnackbarContext.js.map +1 -1
  6. package/build/Snackbar/SnackbarContext.mjs.map +1 -1
  7. package/build/Snackbar/SnackbarPortal.js +12 -0
  8. package/build/Snackbar/SnackbarPortal.js.map +1 -0
  9. package/build/Snackbar/SnackbarPortal.mjs +8 -0
  10. package/build/Snackbar/SnackbarPortal.mjs.map +1 -0
  11. package/build/Snackbar/SnackbarProvider.js +23 -27
  12. package/build/Snackbar/SnackbarProvider.js.map +1 -1
  13. package/build/Snackbar/SnackbarProvider.mjs +24 -28
  14. package/build/Snackbar/SnackbarProvider.mjs.map +1 -1
  15. package/build/Snackbar/constants.js +8 -0
  16. package/build/Snackbar/constants.js.map +1 -0
  17. package/build/Snackbar/constants.mjs +5 -0
  18. package/build/Snackbar/constants.mjs.map +1 -0
  19. package/build/Snackbar/useSnackbarManager.js +119 -0
  20. package/build/Snackbar/useSnackbarManager.js.map +1 -0
  21. package/build/Snackbar/useSnackbarManager.mjs +115 -0
  22. package/build/Snackbar/useSnackbarManager.mjs.map +1 -0
  23. package/build/i18n/th.json +1 -1
  24. package/build/i18n/th.json.js +1 -1
  25. package/build/i18n/th.json.mjs +1 -1
  26. package/build/i18n/zh-CN.json +0 -1
  27. package/build/i18n/zh-CN.json.js +0 -1
  28. package/build/i18n/zh-CN.json.js.map +1 -1
  29. package/build/i18n/zh-CN.json.mjs +0 -1
  30. package/build/i18n/zh-CN.json.mjs.map +1 -1
  31. package/build/main.css +113 -61
  32. package/build/styles/Snackbar/Snackbar.css +116 -64
  33. package/build/styles/main.css +113 -61
  34. package/build/types/Body/Body.d.ts +2 -2
  35. package/build/types/IconButton/IconButton.d.ts +1 -1
  36. package/build/types/MoneyInput/MoneyInput.d.ts +1 -1
  37. package/build/types/MoneyInput/MoneyInput.d.ts.map +1 -1
  38. package/build/types/Snackbar/Snackbar.d.ts +10 -8
  39. package/build/types/Snackbar/Snackbar.d.ts.map +1 -1
  40. package/build/types/Snackbar/Snackbar.types.d.ts +19 -0
  41. package/build/types/Snackbar/Snackbar.types.d.ts.map +1 -0
  42. package/build/types/Snackbar/SnackbarContext.d.ts +2 -2
  43. package/build/types/Snackbar/SnackbarContext.d.ts.map +1 -1
  44. package/build/types/Snackbar/SnackbarPortal.d.ts +4 -0
  45. package/build/types/Snackbar/SnackbarPortal.d.ts.map +1 -0
  46. package/build/types/Snackbar/SnackbarProvider.d.ts.map +1 -1
  47. package/build/types/Snackbar/constants.d.ts +3 -0
  48. package/build/types/Snackbar/constants.d.ts.map +1 -0
  49. package/build/types/Snackbar/useSnackbar.d.ts +1 -1
  50. package/build/types/Snackbar/useSnackbar.d.ts.map +1 -1
  51. package/build/types/Snackbar/useSnackbarManager.d.ts +16 -0
  52. package/build/types/Snackbar/useSnackbarManager.d.ts.map +1 -0
  53. package/build/types/Title/Title.d.ts +2 -2
  54. package/build/types/Upload/Steps/UploadImageStep/UploadImageStep.d.ts +1 -1
  55. package/build/types/UploadInput/UploadItem/UploadItemLink.d.ts +1 -1
  56. package/package.json +3 -3
  57. package/src/Snackbar/Snackbar.css +116 -64
  58. package/src/Snackbar/Snackbar.less +121 -60
  59. package/src/Snackbar/Snackbar.test.tsx +122 -133
  60. package/src/Snackbar/Snackbar.tsx +95 -96
  61. package/src/Snackbar/Snackbar.types.ts +21 -0
  62. package/src/Snackbar/SnackbarContext.ts +2 -2
  63. package/src/Snackbar/SnackbarPortal.tsx +8 -0
  64. package/src/Snackbar/SnackbarProvider.test.tsx +289 -0
  65. package/src/Snackbar/SnackbarProvider.tsx +19 -18
  66. package/src/Snackbar/_stories/Snackbar.rtl.test.story.tsx +16 -6
  67. package/src/Snackbar/_stories/Snackbar.story.tsx +62 -1
  68. package/src/Snackbar/_stories/Snackbar.test.story.tsx +26 -5
  69. package/src/Snackbar/constants.ts +2 -0
  70. package/src/Snackbar/useSnackbarManager.ts +122 -0
  71. package/src/i18n/th.json +1 -1
  72. package/src/i18n/zh-CN.json +0 -1
  73. package/src/main.css +113 -61
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/Snackbar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAKvD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;KACtD,CAAC;IACF,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,eAAO,MAAM,QAAQ,GAAI,OAAO,aAAa,gCAoG5C,CAAC;;AAEF,wBAAwC"}
1
+ {"version":3,"file":"Snackbar.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/Snackbar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,8FAA8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,GAAI,oGAUtB,qBAAqB,gCAuFvB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ButtonProps, ButtonReferenceType } from '../Button/Button.types';
2
+ import type { SnackbarProps } from './Snackbar';
3
+ /** One optional action. Supports callbacks and navigation through the Button API. */
4
+ export type SnackbarAction = Pick<ButtonProps, 'href' | 'target'> & {
5
+ label: ButtonProps['children'];
6
+ onClick?: React.MouseEventHandler<ButtonReferenceType>;
7
+ };
8
+ /** Props accepted by `createSnackbar` from `useSnackbar()`. */
9
+ export type SnackbarCreationProps = Omit<SnackbarProps, 'timeout'>;
10
+ /** Props the provider passes to control a Snackbar. Internal. */
11
+ export interface SnackbarInternalProps extends Omit<SnackbarProps, 'timeout' | 'timestamp'> {
12
+ /** Changes for each new Snackbar so LiveRegion re-announces it. */
13
+ announcementKey: number;
14
+ onDismissRequest: () => void;
15
+ onExited: () => void;
16
+ timeout: number;
17
+ visible: boolean;
18
+ }
19
+ //# sourceMappingURL=Snackbar.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Snackbar.types.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/Snackbar.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qFAAqF;AACrF,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG;IAClE,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;CACxD,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAEnE,iEAAiE;AACjE,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,WAAW,CAAC;IACzF,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -1,6 +1,6 @@
1
- import { SnackbarProps } from './Snackbar';
1
+ import type { SnackbarCreationProps } from './Snackbar.types';
2
2
  export type SnackbarContextType = {
3
- createSnackbar: (props: Omit<SnackbarProps, 'timeout' | 'timestamp'>) => void;
3
+ createSnackbar: (props: SnackbarCreationProps) => void;
4
4
  };
5
5
  export declare const SnackbarContext: import("react").Context<SnackbarContextType>;
6
6
  export declare const SnackbarConsumer: import("react").Consumer<SnackbarContextType>;
@@ -1 +1 @@
1
- {"version":3,"file":"SnackbarContext.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/SnackbarContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,CAAC;CAC/E,CAAC;AAEF,eAAO,MAAM,eAAe,8CAAmE,CAAC;AAEhG,eAAO,MAAM,gBAAgB,+CAA2B,CAAC"}
1
+ {"version":3,"file":"SnackbarContext.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/SnackbarContext.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACxD,CAAC;AAEF,eAAO,MAAM,eAAe,8CAAmE,CAAC;AAEhG,eAAO,MAAM,gBAAgB,+CAA2B,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Renders the Snackbar into `document.body` after mount, so it's safe for SSR. */
2
+ declare const SnackbarPortal: (props: import("./Snackbar.types").SnackbarInternalProps) => import("react").ReactPortal | null;
3
+ export default SnackbarPortal;
4
+ //# sourceMappingURL=SnackbarPortal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnackbarPortal.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/SnackbarPortal.tsx"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,QAAA,MAAM,cAAc,iGAA2B,CAAC;AAEhD,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SnackbarProvider.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/SnackbarProvider.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,OAAc,EAAE,QAAQ,EAAE,EAAE,qBAAqB,+BAsB3F"}
1
+ {"version":3,"file":"SnackbarProvider.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/SnackbarProvider.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,OAAc,EAAE,QAAQ,EAAE,EAAE,qBAAqB,+BAsB3F"}
@@ -0,0 +1,3 @@
1
+ export declare const SNACKBAR_ENTER_DURATION = 300;
2
+ export declare const SNACKBAR_EXIT_DURATION = 150;
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,sBAAsB,MAAM,CAAC"}
@@ -1,3 +1,3 @@
1
- declare function useSnackbar(): (props: Omit<import("./Snackbar").SnackbarProps, "timeout" | "timestamp">) => void;
1
+ declare function useSnackbar(): (props: import("./Snackbar.types").SnackbarCreationProps) => void;
2
2
  export default useSnackbar;
3
3
  //# sourceMappingURL=useSnackbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSnackbar.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/useSnackbar.ts"],"names":[],"mappings":"AAIA,iBAAS,WAAW,uFAInB;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"useSnackbar.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/useSnackbar.ts"],"names":[],"mappings":"AAIA,iBAAS,WAAW,sEAInB;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { SnackbarCreationProps } from './Snackbar.types';
2
+ type SnackbarInstance = {
3
+ id: number;
4
+ props: SnackbarCreationProps;
5
+ };
6
+ /** Owns one active Snackbar and its latest replacement, waiting for exit before the next enters. */
7
+ declare const useSnackbarManager: () => {
8
+ active: SnackbarInstance | null;
9
+ announcementKey: number;
10
+ dismissSnackbar: () => void;
11
+ handleExited: () => void;
12
+ showSnackbar: (props: SnackbarCreationProps) => void;
13
+ visible: boolean;
14
+ };
15
+ export default useSnackbarManager;
16
+ //# sourceMappingURL=useSnackbarManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarManager.d.ts","sourceRoot":"","sources":["../../../src/Snackbar/useSnackbarManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,KAAK,gBAAgB,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,qBAAqB,CAAC;CAC9B,CAAC;AA+EF,oGAAoG;AACpG,QAAA,MAAM,kBAAkB;;;;;0BAImB,qBAAqB;;CA4B/D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -10,7 +10,7 @@ export type TitleProps = LabelHTMLAttributes<HTMLHeadingElement | HTMLSpanElemen
10
10
  */
11
11
  type?: TitleTypes;
12
12
  };
13
- declare const Title: React.ForwardRefExoticComponent<React.LabelHTMLAttributes<HTMLSpanElement | HTMLHeadingElement | HTMLLabelElement> & React.LiHTMLAttributes<HTMLLIElement> & {
13
+ declare const Title: React.ForwardRefExoticComponent<React.LabelHTMLAttributes<HTMLHeadingElement | HTMLLabelElement | HTMLSpanElement> & React.LiHTMLAttributes<HTMLLIElement> & {
14
14
  /**
15
15
  * Default value will based one `type` prop
16
16
  */
@@ -19,6 +19,6 @@ declare const Title: React.ForwardRefExoticComponent<React.LabelHTMLAttributes<H
19
19
  * Default value: {@link DEFAULT_TYPE}
20
20
  */
21
21
  type?: TitleTypes;
22
- } & React.RefAttributes<HTMLSpanElement | HTMLHeadingElement | HTMLLabelElement | HTMLLegendElement | HTMLLIElement>>;
22
+ } & React.RefAttributes<HTMLHeadingElement | HTMLLabelElement | HTMLLegendElement | HTMLLIElement | HTMLSpanElement>>;
23
23
  export default Title;
24
24
  //# sourceMappingURL=Title.d.ts.map
@@ -15,7 +15,7 @@ export default class UploadImageStep extends PureComponent<UploadImageStepProps>
15
15
  uploadInputRef: import("react").RefObject<HTMLInputElement>;
16
16
  onManualUpload: () => void;
17
17
  onKeyDown: (event: React.KeyboardEvent<HTMLLabelElement>) => void;
18
- getImage: () => number | true | import("react").JSX.Element | Iterable<import("react").ReactNode>;
18
+ getImage: () => number | true | Iterable<import("react").ReactNode> | import("react").JSX.Element;
19
19
  render(): import("react").JSX.Element;
20
20
  }
21
21
  //# sourceMappingURL=UploadImageStep.d.ts.map
@@ -5,5 +5,5 @@ export declare const UploadItemLink: import("react").ForwardRefExoticComponent<{
5
5
  singleFileUpload: boolean;
6
6
  } & {
7
7
  children?: import("react").ReactNode | undefined;
8
- } & import("react").RefAttributes<HTMLDivElement | HTMLAnchorElement>>;
8
+ } & import("react").RefAttributes<HTMLAnchorElement | HTMLDivElement>>;
9
9
  //# sourceMappingURL=UploadItemLink.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-bf3b43b",
3
+ "version": "0.0.0-experimental-cbc00a7",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -59,7 +59,7 @@
59
59
  "@testing-library/jest-dom": "^6.9.1",
60
60
  "@testing-library/react": "^16.3.3",
61
61
  "@testing-library/user-event": "^14.6.7",
62
- "@transferwise/icons": "^4.6.0",
62
+ "@transferwise/icons": "^4.5.0",
63
63
  "@transferwise/less-config": "3.2.0",
64
64
  "@tsconfig/recommended": "^1.0.13",
65
65
  "@types/babel__core": "^7.20.5",
@@ -72,7 +72,7 @@
72
72
  "@types/react-dom": "^18.3.7",
73
73
  "@types/react-transition-group": "4.4.12",
74
74
  "@monaco-editor/react": "^4.7.0",
75
- "monaco-editor": "^0.57.0",
75
+ "monaco-editor": "^0.56.0",
76
76
  "monaco-editor-webpack-plugin": "^7.1.1",
77
77
  "@wise/art": "^2.32.0",
78
78
  "@wise/components-theming": "1.10.3",
@@ -1,79 +1,131 @@
1
- .snackbar {
2
- text-align: center;
1
+ .wds-Snackbar {
2
+ display: flex;
3
+ justify-content: center;
4
+ box-sizing: border-box;
5
+ padding-inline: 16px;
6
+ padding-inline: var(--size-16);
7
+ padding-block-end: calc(16px + env(safe-area-inset-bottom));
8
+ padding-block-end: calc(var(--size-16) + env(safe-area-inset-bottom));
3
9
  position: fixed;
4
10
  inset-block-end: 0;
5
- inset-inline-start: 0;
6
- inset-inline-end: 0;
11
+ inset-inline: 0;
7
12
  z-index: 1060;
8
13
  }
9
- .snackbar__text {
10
- background: #37517e;
11
- color: #ffffff;
12
- display: inline-flex;
13
- border-radius: 2px;
14
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
15
- align-items: center;
16
- justify-content: space-between;
14
+ @media (min-width: 600px) {
15
+ .wds-Snackbar {
16
+ padding-block-end: 24px;
17
+ padding-block-end: var(--size-24);
18
+ }
19
+ }
20
+ .wds-Snackbar-container {
21
+ --Prompt-border-radius: var(--radius-medium);
22
+ --Prompt-gap: var(--size-8);
23
+ --Prompt-padding-x: var(--size-12);
24
+ --Prompt-padding-y: var(--size-12);
25
+ box-sizing: border-box;
26
+ max-inline-size: 480px;
17
27
  text-align: start;
18
- font-size: 0.875rem;
19
- font-size: var(--font-size-14);
20
- margin-block: 0;
21
- margin-inline: 16px;
22
- margin-inline: var(--size-16);
23
- padding-block: 8px;
24
- padding-block: var(--size-8);
25
- padding-inline: 16px;
26
- padding-inline: var(--size-16);
27
- inline-size: calc(100% - 32px);
28
- inline-size: calc(100% - var(--size-32));
29
- transition: 400ms cubic-bezier(0.215, 0.61, 0.355, 1);
30
- }
31
- .np-theme-personal .snackbar__text {
32
- box-shadow: 0 2px 4px 0 rgba(69, 71, 69, 0.35);
33
- position: relative;
34
- background: var(--color-contrast-theme);
35
- border-radius: 10px;
36
- border-radius: var(--radius-small);
37
- color: var(--color-contrast-overlay);
38
- }
39
- .np-theme-personal .snackbar__text::after {
40
- display: block;
41
- border-radius: inherit;
42
- block-size: 100%;
43
- inline-size: 100%;
44
- content: "";
45
- position: absolute;
46
- inset-inline-start: 0;
47
- inset-block-start: 0;
48
- z-index: -1;
49
- background-color: rgba(134,167,189,0.10196);
50
- background-color: var(--color-background-neutral);
51
- }
52
- .np-theme-personal--dark .snackbar__text,
53
- .np-theme-personal--forest-green .snackbar__text {
54
- box-shadow: none;
28
+ }
29
+ .wds-Snackbar-container .wds-prompt__content-wrapper--with-dismiss {
30
+ grid-template-columns: auto minmax(0, 1fr);
55
31
  }
56
32
  @media (min-width: 600px) {
57
- .snackbar__text {
58
- inline-size: auto;
59
- max-inline-size: 600px;
33
+ .wds-Snackbar-container .wds-prompt__content-wrapper--with-dismiss {
34
+ grid-template-columns: auto minmax(0, 1fr) auto;
60
35
  }
61
36
  }
62
- .snackbar__text__action {
63
- flex-shrink: 0;
64
- margin-inline-start: 16px;
65
- margin-inline-start: var(--size-16);
37
+ .wds-Snackbar-container .wds-prompt__media-wrapper {
38
+ display: flex;
39
+ align-items: center;
40
+ min-block-size: max(32px, 1lh);
41
+ min-block-size: max(var(--size-32), 1lh);
42
+ padding-block-start: 0;
43
+ color: var(--color-sentiment-content-primary);
44
+ }
45
+ .wds-Snackbar-container .wds-prompt__media-wrapper:has(+ .wds-Snackbar__content .wds-Snackbar__action) {
46
+ min-block-size: max(32px, calc(1lh + 5px * 2));
47
+ min-block-size: max(var(--size-32), calc(1lh + var(--size-5) * 2));
48
+ }
49
+ .wds-Snackbar__media-asset {
50
+ display: flex;
66
51
  }
67
- .snackbar__text-container-enter,
68
- .snackbar__text-container-exit {
69
- transform: translateY(calc(100% + 10px));
52
+ .wds-Snackbar__media-asset svg {
53
+ inline-size: 24px;
54
+ inline-size: var(--size-24);
55
+ block-size: 24px;
56
+ block-size: var(--size-24);
70
57
  }
71
- .snackbar__text-container-enter-active {
72
- transform: translateY(-16px);
73
- transform: translateY(calc(-16px - env(safe-area-inset-bottom)));
58
+ .wds-Snackbar-container .wds-prompt__dismiss {
59
+ display: none;
60
+ align-self: flex-start;
61
+ margin-block-start: calc(4px - 1px);
62
+ margin-block-start: calc(var(--size-4) - 1px);
74
63
  }
75
64
  @media (min-width: 600px) {
76
- .snackbar__text-container-enter-active {
77
- transform: translateY(-24px);
65
+ .wds-Snackbar-container .wds-prompt__dismiss {
66
+ display: flex;
67
+ }
68
+ }
69
+ .wds-Snackbar__action {
70
+ flex-shrink: 0;
71
+ }
72
+ .wds-Snackbar__content {
73
+ display: flex;
74
+ align-items: flex-start;
75
+ gap: 8px;
76
+ gap: var(--size-8);
77
+ flex: 1 0 0;
78
+ min-block-size: 32px;
79
+ min-block-size: var(--size-32);
80
+ min-inline-size: 0;
81
+ }
82
+ .wds-Snackbar__message {
83
+ display: flex;
84
+ flex-direction: column;
85
+ justify-content: center;
86
+ inline-size: auto;
87
+ flex: 1 0 0;
88
+ min-inline-size: 0;
89
+ align-self: stretch;
90
+ }
91
+ .wds-Snackbar__body {
92
+ display: block;
93
+ font-weight: 500;
94
+ font-weight: var(--font-weight-medium);
95
+ }
96
+ .wds-Snackbar-container-appear,
97
+ .wds-Snackbar-container-enter {
98
+ opacity: 0;
99
+ transform: translateY(80px) scale(0.5);
100
+ }
101
+ .wds-Snackbar-container-appear-active,
102
+ .wds-Snackbar-container-enter-active {
103
+ opacity: 1;
104
+ transform: translateY(0) scale(1);
105
+ transition: opacity 150ms linear, transform var(--Snackbar-enter-duration) cubic-bezier(0, 0, 0, 1);
106
+ }
107
+ .wds-Snackbar-container-exit {
108
+ opacity: 1;
109
+ transform: translateY(0) scale(1);
110
+ }
111
+ .wds-Snackbar-container-exit-active {
112
+ opacity: 0;
113
+ transform: translateY(80px) scale(0.5);
114
+ transition: opacity 50ms linear 50ms, transform var(--Snackbar-exit-duration) cubic-bezier(1, 0, 1, 1);
115
+ }
116
+ @media (prefers-reduced-motion: reduce) {
117
+ .wds-Snackbar-container-appear,
118
+ .wds-Snackbar-container-appear-active,
119
+ .wds-Snackbar-container-enter,
120
+ .wds-Snackbar-container-enter-active,
121
+ .wds-Snackbar-container-exit {
122
+ opacity: 1;
123
+ transform: none;
124
+ transition: none;
125
+ }
126
+ .wds-Snackbar-container-exit-active {
127
+ opacity: 0;
128
+ transform: none;
129
+ transition: none;
78
130
  }
79
131
  }
@@ -1,80 +1,141 @@
1
1
  @import (reference) "./../styles/variables/zindex.less";
2
- @import (reference) "./../styles/variables/neptune-tokens.less";
3
2
 
4
- .snackbar {
5
- text-align: center;
3
+ .wds-Snackbar {
4
+ display: flex;
5
+ justify-content: center;
6
+ box-sizing: border-box;
7
+ padding-inline: var(--size-16);
8
+ padding-bottom: calc(var(--size-16) + env(safe-area-inset-bottom));
6
9
  position: fixed;
7
10
  bottom: 0;
8
- left: 0;
11
+ inset-inline: 0;
12
+ z-index: @zindex-mobile-nav;
9
13
 
10
- right: 0;
14
+ @media (--screen-sm) {
15
+ padding-bottom: var(--size-24);
16
+ }
11
17
 
12
- z-index: @zindex-mobile-nav;
18
+ &-container {
19
+ --Prompt-border-radius: var(--radius-medium);
20
+ --Prompt-gap: var(--size-8);
21
+ --Prompt-padding-x: var(--size-12);
22
+ --Prompt-padding-y: var(--size-12);
23
+ box-sizing: border-box;
24
+ max-width: 480px;
25
+ text-align: start;
26
+ }
27
+
28
+ &-container .wds-prompt__content-wrapper--with-dismiss {
29
+ grid-template-columns: auto minmax(0, 1fr);
30
+
31
+ @media (--screen-sm) {
32
+ grid-template-columns: auto minmax(0, 1fr) auto;
33
+ }
34
+ }
13
35
 
14
- &__text {
15
- background: @color-navy-background-elevated;
16
- color: @color-navy-content-primary;
17
- display: inline-flex;
18
- border-radius: 2px;
19
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
36
+ &-container .wds-prompt__media-wrapper {
37
+ display: flex;
20
38
  align-items: center;
21
- justify-content: space-between;
22
- text-align: left;
23
-
24
- font-size: var(--font-size-14);
25
- margin: 0 var(--size-16);
26
- padding: var(--size-8) var(--size-16);
27
- width: calc(100% - var(--size-32));
28
- transition: 400ms cubic-bezier(0.215, 0.61, 0.355, 1);
29
-
30
- .np-theme-personal & {
31
- box-shadow: 0 2px 4px 0 rgba(69, 71, 69, 0.35);
32
- position: relative;
33
- background: var(--color-contrast-theme);
34
- border-radius: var(--radius-small);
35
- color: var(--color-contrast-overlay);
36
-
37
- &::after {
38
- display: block;
39
- border-radius: inherit;
40
- height: 100%;
41
- width: 100%;
42
- content: "";
43
- position: absolute;
44
- left: 0;
45
- top: 0;
46
- z-index: -1;
47
- background-color: var(--color-background-neutral);
48
- }
39
+ min-height: max(var(--size-32), 1lh);
40
+ padding-top: 0;
41
+ color: var(--color-sentiment-content-primary);
42
+
43
+ // At 400% reflow spacing shrinks, but the text's line height does not.
44
+ &:has(+ .wds-Snackbar__content .wds-Snackbar__action) {
45
+ min-height: max(var(--size-32), calc(1lh + var(--size-5) * 2));
49
46
  }
47
+ }
50
48
 
51
- .np-theme-personal--dark &,
52
- .np-theme-personal--forest-green & {
53
- box-shadow: none;
49
+ &__media-asset {
50
+ display: flex;
51
+
52
+ svg {
53
+ width: var(--size-24);
54
+ height: var(--size-24);
54
55
  }
56
+ }
57
+
58
+ &-container .wds-prompt__dismiss {
59
+ display: none;
60
+ align-self: flex-start;
61
+ margin-top: calc(var(--size-4) - 1px);
55
62
 
56
63
  @media (--screen-sm) {
57
- width: auto;
58
- max-width: 600px;
64
+ display: flex;
59
65
  }
66
+ }
60
67
 
61
- &__action {
62
- flex-shrink: 0;
63
- margin-left: var(--size-16);
64
- }
68
+ &__action {
69
+ flex-shrink: 0;
70
+ }
65
71
 
66
- &-container-enter,
67
- &-container-exit {
68
- transform: translateY(calc(100% + 10px));
69
- }
72
+ &__content {
73
+ display: flex;
74
+ align-items: flex-start;
75
+ gap: var(--size-8);
76
+ flex: 1 0 0;
77
+ min-height: var(--size-32);
78
+ min-width: 0;
79
+ }
70
80
 
71
- &-container-enter-active {
72
- transform: translateY(-16px);
73
- transform: translateY(calc(-16px - env(safe-area-inset-bottom)));
81
+ &__message {
82
+ display: flex;
83
+ flex-direction: column;
84
+ justify-content: center;
85
+ width: auto;
86
+ flex: 1 0 0;
87
+ min-width: 0;
88
+ align-self: stretch;
89
+ }
74
90
 
75
- @media (--screen-sm) {
76
- transform: translateY(-24px);
77
- }
78
- }
91
+ &__body {
92
+ display: block;
93
+ font-weight: var(--font-weight-medium);
94
+ }
95
+ }
96
+
97
+ .wds-Snackbar-container-appear,
98
+ .wds-Snackbar-container-enter {
99
+ opacity: 0;
100
+ transform: translateY(80px) scale(0.5);
101
+ }
102
+
103
+ .wds-Snackbar-container-appear-active,
104
+ .wds-Snackbar-container-enter-active {
105
+ opacity: 1;
106
+ transform: translateY(0) scale(1);
107
+ transition:
108
+ opacity 150ms linear,
109
+ transform var(--Snackbar-enter-duration) cubic-bezier(0, 0, 0, 1);
110
+ }
111
+
112
+ .wds-Snackbar-container-exit {
113
+ opacity: 1;
114
+ transform: translateY(0) scale(1);
115
+ }
116
+
117
+ .wds-Snackbar-container-exit-active {
118
+ opacity: 0;
119
+ transform: translateY(80px) scale(0.5);
120
+ transition:
121
+ opacity 50ms linear 50ms,
122
+ transform var(--Snackbar-exit-duration) cubic-bezier(1, 0, 1, 1);
123
+ }
124
+
125
+ @media (prefers-reduced-motion: reduce) {
126
+ .wds-Snackbar-container-appear,
127
+ .wds-Snackbar-container-appear-active,
128
+ .wds-Snackbar-container-enter,
129
+ .wds-Snackbar-container-enter-active,
130
+ .wds-Snackbar-container-exit {
131
+ opacity: 1;
132
+ transform: none;
133
+ transition: none;
134
+ }
135
+
136
+ .wds-Snackbar-container-exit-active {
137
+ opacity: 0;
138
+ transform: none;
139
+ transition: none;
79
140
  }
80
141
  }