@equinor/cpl-error-snackbar-react 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode } from 'react';
3
+ import { ReactNode, SetStateAction } from 'react';
4
4
 
5
5
  interface CopyToClipboardButtonProps {
6
6
  value: string;
@@ -147,4 +147,36 @@ declare function ErrorSnackbarListContainer({ disablePositionFixed, }: ErrorSnac
147
147
 
148
148
  declare function parseUnknownError(unknownError: unknown): Error;
149
149
 
150
- export { type AccessRequirement, CopyToClipboardButton, ERROR_SNACKBARS_FIXED_LIST_TESTID, type Error, ErrorSnackbar, ErrorSnackbarContext, ErrorSnackbarContextProvider, ErrorSnackbarFixedList, ErrorSnackbarListContainer, type ErrorSnackbarObject, type InnerError, parseUnknownError, useErrorSnackbarContext };
150
+ type ToastType = 'info' | 'success' | 'warning' | 'danger';
151
+ type ToastTimeout = number | 'persistent';
152
+ interface Toast {
153
+ id: string;
154
+ type: ToastType;
155
+ title: string;
156
+ timeout: ToastTimeout;
157
+ }
158
+
159
+ interface BuildToasterOptions {
160
+ timeoutOverrides?: Partial<Record<ToastType, ToastTimeout>>;
161
+ }
162
+ declare function buildToaster(options?: BuildToasterOptions): {
163
+ useState: () => readonly [Toast[], (data: SetStateAction<Toast[]>) => void];
164
+ create: (toast: Omit<Toast, "id" | "timeout">) => `${string}-${string}-${string}-${string}-${string}`;
165
+ update: (id: string, toast: Partial<Omit<Toast, "id" | "timeout">>) => void;
166
+ delete: (id: string) => void;
167
+ deleteAll: () => void;
168
+ };
169
+ declare const DEFAULT_TIMEOUT_MS_BY_TYPE: {
170
+ readonly info: 3000;
171
+ readonly success: 3000;
172
+ readonly warning: 3000;
173
+ readonly danger: "persistent";
174
+ };
175
+ type Toaster = ReturnType<typeof buildToaster>;
176
+
177
+ interface ToastContainerProps {
178
+ toaster: Toaster;
179
+ }
180
+ declare function ToastContainer({ toaster }: ToastContainerProps): react_jsx_runtime.JSX.Element;
181
+
182
+ export { type AccessRequirement, type BuildToasterOptions, CopyToClipboardButton, DEFAULT_TIMEOUT_MS_BY_TYPE, ERROR_SNACKBARS_FIXED_LIST_TESTID, type Error, ErrorSnackbar, ErrorSnackbarContext, ErrorSnackbarContextProvider, ErrorSnackbarFixedList, ErrorSnackbarListContainer, type ErrorSnackbarObject, type InnerError, type Toast, ToastContainer, type ToastContainerProps, type ToastTimeout, type ToastType, type Toaster, buildToaster, parseUnknownError, useErrorSnackbarContext };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode } from 'react';
3
+ import { ReactNode, SetStateAction } from 'react';
4
4
 
5
5
  interface CopyToClipboardButtonProps {
6
6
  value: string;
@@ -147,4 +147,36 @@ declare function ErrorSnackbarListContainer({ disablePositionFixed, }: ErrorSnac
147
147
 
148
148
  declare function parseUnknownError(unknownError: unknown): Error;
149
149
 
150
- export { type AccessRequirement, CopyToClipboardButton, ERROR_SNACKBARS_FIXED_LIST_TESTID, type Error, ErrorSnackbar, ErrorSnackbarContext, ErrorSnackbarContextProvider, ErrorSnackbarFixedList, ErrorSnackbarListContainer, type ErrorSnackbarObject, type InnerError, parseUnknownError, useErrorSnackbarContext };
150
+ type ToastType = 'info' | 'success' | 'warning' | 'danger';
151
+ type ToastTimeout = number | 'persistent';
152
+ interface Toast {
153
+ id: string;
154
+ type: ToastType;
155
+ title: string;
156
+ timeout: ToastTimeout;
157
+ }
158
+
159
+ interface BuildToasterOptions {
160
+ timeoutOverrides?: Partial<Record<ToastType, ToastTimeout>>;
161
+ }
162
+ declare function buildToaster(options?: BuildToasterOptions): {
163
+ useState: () => readonly [Toast[], (data: SetStateAction<Toast[]>) => void];
164
+ create: (toast: Omit<Toast, "id" | "timeout">) => `${string}-${string}-${string}-${string}-${string}`;
165
+ update: (id: string, toast: Partial<Omit<Toast, "id" | "timeout">>) => void;
166
+ delete: (id: string) => void;
167
+ deleteAll: () => void;
168
+ };
169
+ declare const DEFAULT_TIMEOUT_MS_BY_TYPE: {
170
+ readonly info: 3000;
171
+ readonly success: 3000;
172
+ readonly warning: 3000;
173
+ readonly danger: "persistent";
174
+ };
175
+ type Toaster = ReturnType<typeof buildToaster>;
176
+
177
+ interface ToastContainerProps {
178
+ toaster: Toaster;
179
+ }
180
+ declare function ToastContainer({ toaster }: ToastContainerProps): react_jsx_runtime.JSX.Element;
181
+
182
+ export { type AccessRequirement, type BuildToasterOptions, CopyToClipboardButton, DEFAULT_TIMEOUT_MS_BY_TYPE, ERROR_SNACKBARS_FIXED_LIST_TESTID, type Error, ErrorSnackbar, ErrorSnackbarContext, ErrorSnackbarContextProvider, ErrorSnackbarFixedList, ErrorSnackbarListContainer, type ErrorSnackbarObject, type InnerError, type Toast, ToastContainer, type ToastContainerProps, type ToastTimeout, type ToastType, type Toaster, buildToaster, parseUnknownError, useErrorSnackbarContext };
package/dist/index.js CHANGED
@@ -1,10 +1,27 @@
1
1
  "use strict";
2
2
  var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
4
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
9
  var __getProtoOf = Object.getPrototypeOf;
7
10
  var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
8
25
  var __export = (target, all) => {
9
26
  for (var name in all)
10
27
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -51,12 +68,15 @@ var __async = (__this, __arguments, generator) => {
51
68
  var index_exports = {};
52
69
  __export(index_exports, {
53
70
  CopyToClipboardButton: () => CopyToClipboardButton,
71
+ DEFAULT_TIMEOUT_MS_BY_TYPE: () => DEFAULT_TIMEOUT_MS_BY_TYPE,
54
72
  ERROR_SNACKBARS_FIXED_LIST_TESTID: () => ERROR_SNACKBARS_FIXED_LIST_TESTID,
55
73
  ErrorSnackbar: () => ErrorSnackbar,
56
74
  ErrorSnackbarContext: () => ErrorSnackbarContext,
57
75
  ErrorSnackbarContextProvider: () => ErrorSnackbarContextProvider,
58
76
  ErrorSnackbarFixedList: () => ErrorSnackbarFixedList,
59
77
  ErrorSnackbarListContainer: () => ErrorSnackbarListContainer,
78
+ ToastContainer: () => ToastContainer,
79
+ buildToaster: () => buildToaster,
60
80
  parseUnknownError: () => parseUnknownError,
61
81
  useErrorSnackbarContext: () => useErrorSnackbarContext
62
82
  });
@@ -405,15 +425,281 @@ function getTypedPropertyIfExists(object, key, ...acceptedTypes) {
405
425
  function itemIsDefined(e) {
406
426
  return Boolean(e);
407
427
  }
428
+
429
+ // src/toast/createToaster.ts
430
+ var import_react3 = require("react");
431
+ function buildToaster(options = {}) {
432
+ const { timeoutOverrides = {} } = options;
433
+ const KEY = "toasts";
434
+ const state = { [KEY]: [] };
435
+ const listeners = [];
436
+ function subscribe(callback) {
437
+ const index = listeners.push(callback);
438
+ function unsubscribe() {
439
+ listeners.splice(index, 1);
440
+ }
441
+ return { unsubscribe };
442
+ }
443
+ function setState(data) {
444
+ data = typeof data === "function" ? data(state[KEY]) : data;
445
+ state[KEY] = data;
446
+ listeners.forEach((callback) => callback(data));
447
+ }
448
+ function useState4() {
449
+ const [values, setValues] = (0, import_react3.useState)(state[KEY]);
450
+ (0, import_react3.useEffect)(() => {
451
+ const subscriber = subscribe((data) => {
452
+ setValues(data);
453
+ });
454
+ return () => {
455
+ subscriber.unsubscribe();
456
+ };
457
+ }, [setValues]);
458
+ return [values, setState];
459
+ }
460
+ return {
461
+ useState: useState4,
462
+ create: (toast) => {
463
+ const id = crypto.randomUUID();
464
+ setState((old) => {
465
+ var _a;
466
+ return [
467
+ __spreadProps(__spreadValues({
468
+ id
469
+ }, toast), {
470
+ timeout: (_a = timeoutOverrides[toast.type]) != null ? _a : DEFAULT_TIMEOUT_MS_BY_TYPE[toast.type]
471
+ }),
472
+ ...old
473
+ ];
474
+ });
475
+ return id;
476
+ },
477
+ update: (id, toast) => {
478
+ setState((old) => {
479
+ return old.map((item) => item.id === id ? __spreadValues(__spreadValues({}, item), toast) : item);
480
+ });
481
+ },
482
+ delete: (id) => {
483
+ setState((old) => old.filter((item) => item.id !== id));
484
+ },
485
+ deleteAll: () => {
486
+ setState([]);
487
+ }
488
+ };
489
+ }
490
+ var DEFAULT_TIMEOUT_MS_BY_TYPE = {
491
+ info: 3e3,
492
+ // 3 seconds
493
+ success: 3e3,
494
+ // 3 seconds
495
+ warning: 3e3,
496
+ // 3 seconds
497
+ danger: "persistent"
498
+ };
499
+
500
+ // src/toast/ToastContainerInner.tsx
501
+ var import_styled_components5 = __toESM(require("styled-components"));
502
+
503
+ // src/toast/ToastItem.tsx
504
+ var import_eds_core_react3 = require("@equinor/eds-core-react");
505
+ var import_eds_icons3 = require("@equinor/eds-icons");
506
+ var import_eds_tokens2 = require("@equinor/eds-tokens");
507
+ var import_react4 = require("react");
508
+ var import_styled_components4 = __toESM(require("styled-components"));
509
+ var import_jsx_runtime6 = require("react/jsx-runtime");
510
+ function ToastItem({ toast, onDelete }) {
511
+ const [isHovered, setIsHovered] = (0, import_react4.useState)(false);
512
+ (0, import_react4.useEffect)(() => {
513
+ if (isHovered || toast.timeout === "persistent") {
514
+ return;
515
+ }
516
+ const timeout = setTimeout(() => {
517
+ onDelete(toast.id);
518
+ }, toast.timeout);
519
+ return () => {
520
+ clearTimeout(timeout);
521
+ };
522
+ }, [isHovered, onDelete, toast.id, toast.timeout]);
523
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
524
+ StyledPaper,
525
+ {
526
+ elevation: "raised",
527
+ $toastType: toast.type,
528
+ onMouseOver: () => setIsHovered(true),
529
+ onMouseOut: () => setIsHovered(false),
530
+ children: [
531
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_eds_core_react3.Icon, { data: getIconByType(toast.type), color: "primary", size: 24, style: { marginRight: 8 } }),
532
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_eds_core_react3.Typography, { children: toast.title }),
533
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
534
+ import_eds_core_react3.Button,
535
+ {
536
+ variant: "ghost_icon",
537
+ onClick: () => onDelete(toast.id),
538
+ style: { marginLeft: "auto" },
539
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_eds_core_react3.Icon, { data: import_eds_icons3.clear, title: "clear", color: "primary", size: 24 })
540
+ }
541
+ )
542
+ ]
543
+ }
544
+ );
545
+ }
546
+ function getIconByType(toastType) {
547
+ switch (toastType) {
548
+ case "success":
549
+ return import_eds_icons3.check;
550
+ case "danger":
551
+ return import_eds_icons3.error_filled;
552
+ case "warning":
553
+ return import_eds_icons3.warning_filled;
554
+ default:
555
+ return import_eds_icons3.info_circle;
556
+ }
557
+ }
558
+ var fill = false;
559
+ var StyledPaper = (0, import_styled_components4.default)(import_eds_core_react3.Paper)`
560
+ & > p {
561
+ color: inherit;
562
+ }
563
+
564
+ border: 0;
565
+
566
+ transition: 50ms ease-out;
567
+
568
+ border-radius: 4px;
569
+
570
+ padding: 4px 8px 4px 16px;
571
+ display: flex;
572
+ align-items: center;
573
+ justify-content: stretch;
574
+
575
+ border: 2px solid var(--eds_ui_background__medium, rgba(220, 220, 220, 1));
576
+
577
+ @keyframes toast-in-right {
578
+ from {
579
+ opacity: 0;
580
+ transform: translateX(20%);
581
+ }
582
+ to {
583
+ opacity: 1;
584
+ transform: translateX(0);
585
+ }
586
+ }
587
+
588
+ @keyframes toast-out-collapse {
589
+ from {
590
+ height: auto;
591
+ }
592
+ to {
593
+ max-height: 0;
594
+ }
595
+ }
596
+
597
+ animation: toast-in-right 150ms ease-out;
598
+
599
+ ${({ $toastType }) => {
600
+ switch ($toastType) {
601
+ case "info":
602
+ return fill ? import_styled_components4.css`
603
+ background-color: ${import_eds_tokens2.tokens.colors.ui.background__default.rgba};
604
+ ` : import_styled_components4.css``;
605
+ case "success":
606
+ return fill ? import_styled_components4.css`
607
+ color: ${import_eds_tokens2.tokens.colors.text.static_icons__primary_white.rgba};
608
+ border-color: ${import_eds_tokens2.tokens.colors.interactive.success__resting.rgba};
609
+ background-color: ${import_eds_tokens2.tokens.colors.interactive.success__resting.rgba};
610
+ ` : import_styled_components4.css`
611
+ border-color: ${import_eds_tokens2.tokens.colors.interactive.success__resting.rgba};
612
+
613
+ & > svg:first-of-type {
614
+ fill: ${import_eds_tokens2.tokens.colors.interactive.success__text.rgba};
615
+ }
616
+ `;
617
+ case "warning":
618
+ return fill ? import_styled_components4.css`
619
+ border-color: ${import_eds_tokens2.tokens.colors.interactive.warning__resting.rgba};
620
+ background-color: ${import_eds_tokens2.tokens.colors.interactive.warning__resting.rgba};
621
+ ` : import_styled_components4.css`
622
+ border-color: ${import_eds_tokens2.tokens.colors.interactive.warning__resting.rgba};
623
+
624
+ & > svg:first-of-type {
625
+ fill: ${import_eds_tokens2.tokens.colors.interactive.warning__text.rgba};
626
+ }
627
+ `;
628
+ case "danger":
629
+ return fill ? import_styled_components4.css`
630
+ border-color: ${import_eds_tokens2.tokens.colors.interactive.danger__resting.rgba};
631
+ background-color: ${import_eds_tokens2.tokens.colors.interactive.danger__resting.rgba};
632
+ ` : import_styled_components4.css`
633
+ border-color: ${import_eds_tokens2.tokens.colors.interactive.danger__resting.rgba};
634
+ & > svg:first-of-type {
635
+ fill: ${import_eds_tokens2.tokens.colors.interactive.danger__text.rgba};
636
+ }
637
+ `;
638
+ }
639
+ }};
640
+ `;
641
+
642
+ // src/toast/ToastContainerInner.tsx
643
+ var import_jsx_runtime7 = require("react/jsx-runtime");
644
+ function ToastContainerInner({
645
+ deleteToastById,
646
+ toasts,
647
+ placement = "top-right",
648
+ toastContainerClassName = ""
649
+ }) {
650
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Container, { $placement: placement, className: toastContainerClassName, children: toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastItem, { toast, onDelete: deleteToastById }, toast.id)) });
651
+ }
652
+ var Container = import_styled_components5.default.div`
653
+ position: fixed;
654
+
655
+ padding: 16px;
656
+ margin: -16px;
657
+
658
+ display: flex;
659
+ flex-direction: column;
660
+ gap: 8px;
661
+
662
+ max-height: min(600px, 70dvh);
663
+ width: 24rem;
664
+
665
+ overflow-y: auto;
666
+ overflow-x: hidden;
667
+
668
+ /* Hide when no toasts */
669
+ &:empty {
670
+ display: none;
671
+ }
672
+
673
+ ${({ $placement }) => {
674
+ switch ($placement) {
675
+ case "top-right": {
676
+ return import_styled_components5.css`
677
+ top: 16px;
678
+ right: 16px;
679
+ `;
680
+ }
681
+ }
682
+ }}
683
+ `;
684
+
685
+ // src/toast/ToastContainer.tsx
686
+ var import_jsx_runtime8 = require("react/jsx-runtime");
687
+ function ToastContainer({ toaster }) {
688
+ const [toasts] = toaster.useState();
689
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ToastContainerInner, { toasts, deleteToastById: toaster.delete });
690
+ }
408
691
  // Annotate the CommonJS export names for ESM import in node:
409
692
  0 && (module.exports = {
410
693
  CopyToClipboardButton,
694
+ DEFAULT_TIMEOUT_MS_BY_TYPE,
411
695
  ERROR_SNACKBARS_FIXED_LIST_TESTID,
412
696
  ErrorSnackbar,
413
697
  ErrorSnackbarContext,
414
698
  ErrorSnackbarContextProvider,
415
699
  ErrorSnackbarFixedList,
416
700
  ErrorSnackbarListContainer,
701
+ ToastContainer,
702
+ buildToaster,
417
703
  parseUnknownError,
418
704
  useErrorSnackbarContext
419
705
  });
package/dist/index.mjs CHANGED
@@ -1,3 +1,22 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1
20
  var __async = (__this, __arguments, generator) => {
2
21
  return new Promise((resolve, reject) => {
3
22
  var fulfilled = (value) => {
@@ -362,14 +381,280 @@ function getTypedPropertyIfExists(object, key, ...acceptedTypes) {
362
381
  function itemIsDefined(e) {
363
382
  return Boolean(e);
364
383
  }
384
+
385
+ // src/toast/createToaster.ts
386
+ import { useEffect as useEffect2, useState as useReactState } from "react";
387
+ function buildToaster(options = {}) {
388
+ const { timeoutOverrides = {} } = options;
389
+ const KEY = "toasts";
390
+ const state = { [KEY]: [] };
391
+ const listeners = [];
392
+ function subscribe(callback) {
393
+ const index = listeners.push(callback);
394
+ function unsubscribe() {
395
+ listeners.splice(index, 1);
396
+ }
397
+ return { unsubscribe };
398
+ }
399
+ function setState(data) {
400
+ data = typeof data === "function" ? data(state[KEY]) : data;
401
+ state[KEY] = data;
402
+ listeners.forEach((callback) => callback(data));
403
+ }
404
+ function useState4() {
405
+ const [values, setValues] = useReactState(state[KEY]);
406
+ useEffect2(() => {
407
+ const subscriber = subscribe((data) => {
408
+ setValues(data);
409
+ });
410
+ return () => {
411
+ subscriber.unsubscribe();
412
+ };
413
+ }, [setValues]);
414
+ return [values, setState];
415
+ }
416
+ return {
417
+ useState: useState4,
418
+ create: (toast) => {
419
+ const id = crypto.randomUUID();
420
+ setState((old) => {
421
+ var _a;
422
+ return [
423
+ __spreadProps(__spreadValues({
424
+ id
425
+ }, toast), {
426
+ timeout: (_a = timeoutOverrides[toast.type]) != null ? _a : DEFAULT_TIMEOUT_MS_BY_TYPE[toast.type]
427
+ }),
428
+ ...old
429
+ ];
430
+ });
431
+ return id;
432
+ },
433
+ update: (id, toast) => {
434
+ setState((old) => {
435
+ return old.map((item) => item.id === id ? __spreadValues(__spreadValues({}, item), toast) : item);
436
+ });
437
+ },
438
+ delete: (id) => {
439
+ setState((old) => old.filter((item) => item.id !== id));
440
+ },
441
+ deleteAll: () => {
442
+ setState([]);
443
+ }
444
+ };
445
+ }
446
+ var DEFAULT_TIMEOUT_MS_BY_TYPE = {
447
+ info: 3e3,
448
+ // 3 seconds
449
+ success: 3e3,
450
+ // 3 seconds
451
+ warning: 3e3,
452
+ // 3 seconds
453
+ danger: "persistent"
454
+ };
455
+
456
+ // src/toast/ToastContainerInner.tsx
457
+ import styled5, { css as css2 } from "styled-components";
458
+
459
+ // src/toast/ToastItem.tsx
460
+ import { Button as Button3, Icon as Icon3, Paper, Typography as Typography2 } from "@equinor/eds-core-react";
461
+ import { check as check2, clear, error_filled as error_filled2, info_circle, warning_filled } from "@equinor/eds-icons";
462
+ import { tokens as tokens2 } from "@equinor/eds-tokens";
463
+ import { useEffect as useEffect3, useState as useState3 } from "react";
464
+ import styled4, { css } from "styled-components";
465
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
466
+ function ToastItem({ toast, onDelete }) {
467
+ const [isHovered, setIsHovered] = useState3(false);
468
+ useEffect3(() => {
469
+ if (isHovered || toast.timeout === "persistent") {
470
+ return;
471
+ }
472
+ const timeout = setTimeout(() => {
473
+ onDelete(toast.id);
474
+ }, toast.timeout);
475
+ return () => {
476
+ clearTimeout(timeout);
477
+ };
478
+ }, [isHovered, onDelete, toast.id, toast.timeout]);
479
+ return /* @__PURE__ */ jsxs3(
480
+ StyledPaper,
481
+ {
482
+ elevation: "raised",
483
+ $toastType: toast.type,
484
+ onMouseOver: () => setIsHovered(true),
485
+ onMouseOut: () => setIsHovered(false),
486
+ children: [
487
+ /* @__PURE__ */ jsx6(Icon3, { data: getIconByType(toast.type), color: "primary", size: 24, style: { marginRight: 8 } }),
488
+ /* @__PURE__ */ jsx6(Typography2, { children: toast.title }),
489
+ /* @__PURE__ */ jsx6(
490
+ Button3,
491
+ {
492
+ variant: "ghost_icon",
493
+ onClick: () => onDelete(toast.id),
494
+ style: { marginLeft: "auto" },
495
+ children: /* @__PURE__ */ jsx6(Icon3, { data: clear, title: "clear", color: "primary", size: 24 })
496
+ }
497
+ )
498
+ ]
499
+ }
500
+ );
501
+ }
502
+ function getIconByType(toastType) {
503
+ switch (toastType) {
504
+ case "success":
505
+ return check2;
506
+ case "danger":
507
+ return error_filled2;
508
+ case "warning":
509
+ return warning_filled;
510
+ default:
511
+ return info_circle;
512
+ }
513
+ }
514
+ var fill = false;
515
+ var StyledPaper = styled4(Paper)`
516
+ & > p {
517
+ color: inherit;
518
+ }
519
+
520
+ border: 0;
521
+
522
+ transition: 50ms ease-out;
523
+
524
+ border-radius: 4px;
525
+
526
+ padding: 4px 8px 4px 16px;
527
+ display: flex;
528
+ align-items: center;
529
+ justify-content: stretch;
530
+
531
+ border: 2px solid var(--eds_ui_background__medium, rgba(220, 220, 220, 1));
532
+
533
+ @keyframes toast-in-right {
534
+ from {
535
+ opacity: 0;
536
+ transform: translateX(20%);
537
+ }
538
+ to {
539
+ opacity: 1;
540
+ transform: translateX(0);
541
+ }
542
+ }
543
+
544
+ @keyframes toast-out-collapse {
545
+ from {
546
+ height: auto;
547
+ }
548
+ to {
549
+ max-height: 0;
550
+ }
551
+ }
552
+
553
+ animation: toast-in-right 150ms ease-out;
554
+
555
+ ${({ $toastType }) => {
556
+ switch ($toastType) {
557
+ case "info":
558
+ return fill ? css`
559
+ background-color: ${tokens2.colors.ui.background__default.rgba};
560
+ ` : css``;
561
+ case "success":
562
+ return fill ? css`
563
+ color: ${tokens2.colors.text.static_icons__primary_white.rgba};
564
+ border-color: ${tokens2.colors.interactive.success__resting.rgba};
565
+ background-color: ${tokens2.colors.interactive.success__resting.rgba};
566
+ ` : css`
567
+ border-color: ${tokens2.colors.interactive.success__resting.rgba};
568
+
569
+ & > svg:first-of-type {
570
+ fill: ${tokens2.colors.interactive.success__text.rgba};
571
+ }
572
+ `;
573
+ case "warning":
574
+ return fill ? css`
575
+ border-color: ${tokens2.colors.interactive.warning__resting.rgba};
576
+ background-color: ${tokens2.colors.interactive.warning__resting.rgba};
577
+ ` : css`
578
+ border-color: ${tokens2.colors.interactive.warning__resting.rgba};
579
+
580
+ & > svg:first-of-type {
581
+ fill: ${tokens2.colors.interactive.warning__text.rgba};
582
+ }
583
+ `;
584
+ case "danger":
585
+ return fill ? css`
586
+ border-color: ${tokens2.colors.interactive.danger__resting.rgba};
587
+ background-color: ${tokens2.colors.interactive.danger__resting.rgba};
588
+ ` : css`
589
+ border-color: ${tokens2.colors.interactive.danger__resting.rgba};
590
+ & > svg:first-of-type {
591
+ fill: ${tokens2.colors.interactive.danger__text.rgba};
592
+ }
593
+ `;
594
+ }
595
+ }};
596
+ `;
597
+
598
+ // src/toast/ToastContainerInner.tsx
599
+ import { jsx as jsx7 } from "react/jsx-runtime";
600
+ function ToastContainerInner({
601
+ deleteToastById,
602
+ toasts,
603
+ placement = "top-right",
604
+ toastContainerClassName = ""
605
+ }) {
606
+ return /* @__PURE__ */ jsx7(Container, { $placement: placement, className: toastContainerClassName, children: toasts.map((toast) => /* @__PURE__ */ jsx7(ToastItem, { toast, onDelete: deleteToastById }, toast.id)) });
607
+ }
608
+ var Container = styled5.div`
609
+ position: fixed;
610
+
611
+ padding: 16px;
612
+ margin: -16px;
613
+
614
+ display: flex;
615
+ flex-direction: column;
616
+ gap: 8px;
617
+
618
+ max-height: min(600px, 70dvh);
619
+ width: 24rem;
620
+
621
+ overflow-y: auto;
622
+ overflow-x: hidden;
623
+
624
+ /* Hide when no toasts */
625
+ &:empty {
626
+ display: none;
627
+ }
628
+
629
+ ${({ $placement }) => {
630
+ switch ($placement) {
631
+ case "top-right": {
632
+ return css2`
633
+ top: 16px;
634
+ right: 16px;
635
+ `;
636
+ }
637
+ }
638
+ }}
639
+ `;
640
+
641
+ // src/toast/ToastContainer.tsx
642
+ import { jsx as jsx8 } from "react/jsx-runtime";
643
+ function ToastContainer({ toaster }) {
644
+ const [toasts] = toaster.useState();
645
+ return /* @__PURE__ */ jsx8(ToastContainerInner, { toasts, deleteToastById: toaster.delete });
646
+ }
365
647
  export {
366
648
  CopyToClipboardButton,
649
+ DEFAULT_TIMEOUT_MS_BY_TYPE,
367
650
  ERROR_SNACKBARS_FIXED_LIST_TESTID,
368
651
  ErrorSnackbar,
369
652
  ErrorSnackbarContext,
370
653
  ErrorSnackbarContextProvider,
371
654
  ErrorSnackbarFixedList,
372
655
  ErrorSnackbarListContainer,
656
+ ToastContainer,
657
+ buildToaster,
373
658
  parseUnknownError,
374
659
  useErrorSnackbarContext
375
660
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@equinor/cpl-error-snackbar-react",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "license": "MIT",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -14,8 +14,7 @@
14
14
  },
15
15
  "devDependencies": {
16
16
  "@equinor/eds-core-react": "^0.42.5",
17
- "@storybook/react": "^8.6.14",
18
- "@storybook/test": "^8.6.14",
17
+ "@storybook/react": "^9.0.12",
19
18
  "@types/react": "^18.3.18",
20
19
  "@types/react-dom": "^18.3.5",
21
20
  "@types/styled-components": "^5.1.34",