acai-ui-library 0.1.15 → 0.1.16

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.
@@ -20,36 +20,82 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/components/sonner.tsx
21
21
  var sonner_exports = {};
22
22
  __export(sonner_exports, {
23
+ ERROR_TOAST_MS: () => ERROR_TOAST_MS,
24
+ TOAST_BOTTOM_OFFSET: () => TOAST_BOTTOM_OFFSET,
25
+ TOAST_DURATION_MS: () => TOAST_DURATION_MS,
23
26
  Toaster: () => Toaster,
24
- toast: () => import_sonner.toast
27
+ toast: () => toast
25
28
  });
26
29
  module.exports = __toCommonJS(sonner_exports);
27
30
  var import_next_themes = require("next-themes");
28
31
  var import_sonner = require("sonner");
29
32
  var import_jsx_runtime = require("react/jsx-runtime");
30
- var Toaster = ({ ...props }) => {
31
- const { theme = "system" } = (0, import_next_themes.useTheme)();
33
+ var TOAST_DURATION_MS = 4e3;
34
+ var ERROR_TOAST_MS = 7e3;
35
+ var TOKENS = {
36
+ "--normal-bg": "var(--hc-color-popover, #fff)",
37
+ "--normal-border": "var(--hc-color-border, rgba(0,0,0,0.12))",
38
+ "--normal-text": "var(--hc-color-popover-fg, #1a1a1e)",
39
+ fontFamily: "inherit"
40
+ };
41
+ var ACCENT = "!border-l-4";
42
+ var CLASS_NAMES = {
43
+ toast: "toast !font-[inherit] !rounded-lg !shadow-lg",
44
+ title: "!font-medium",
45
+ description: "!text-[var(--hc-color-muted-fg,#595961)]",
46
+ actionButton: "!bg-[var(--hc-color-primary,#5542ca)] !text-[var(--hc-color-primary-fg,#fff)]",
47
+ cancelButton: "!bg-[var(--hc-color-muted,#f1f1f1)] !text-[var(--hc-color-popover-fg,#1a1a1e)]",
48
+ closeButton: "!bg-[var(--hc-color-popover,#fff)] !text-[var(--hc-color-muted-fg,#595961)] !border-[var(--hc-color-border,rgba(0,0,0,0.12))]",
49
+ success: `${ACCENT} !border-l-[var(--hc-color-success,#16a34a)] [&_[data-icon]]:!text-[var(--hc-color-success,#16a34a)]`,
50
+ error: `${ACCENT} !border-l-[var(--hc-color-destructive,#dc2626)] [&_[data-icon]]:!text-[var(--hc-color-destructive,#dc2626)]`,
51
+ warning: `${ACCENT} !border-l-[var(--hc-color-warning,#d97706)] [&_[data-icon]]:!text-[var(--hc-color-warning,#d97706)]`,
52
+ info: `${ACCENT} !border-l-[var(--hc-color-primary,#5542ca)] [&_[data-icon]]:!text-[var(--hc-color-primary,#5542ca)]`,
53
+ loading: `${ACCENT} !border-l-[var(--hc-color-muted-fg,#595961)] [&_[data-icon]]:!text-[var(--hc-color-muted-fg,#595961)]`
54
+ };
55
+ var TOAST_BOTTOM_OFFSET = "calc(16px + env(safe-area-inset-bottom, 0px))";
56
+ var Toaster = ({ style, toastOptions, ...props }) => {
57
+ const { resolvedTheme, forcedTheme } = (0, import_next_themes.useTheme)();
32
58
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
33
59
  import_sonner.Toaster,
34
60
  {
35
- theme,
61
+ theme: (forcedTheme ?? resolvedTheme) === "dark" ? "dark" : "light",
36
62
  className: "toaster group",
37
- toastOptions: {
38
- classNames: {
39
- toast: "group toast group-[.toaster]:!bg-white group-[.toaster]:!rounded-[6px] group-[.toaster]:!shadow-lg group-[.toaster]:!border group-[.toaster]:!border-[rgba(0,0,0,0.08)] group-[.toaster]:!p-4 group-[.toaster]:!font-[Inter]",
40
- title: "group-[.toast]:!text-sm group-[.toast]:!leading-[24px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-grey-600)]",
41
- description: "group-[.toast]:!text-xs group-[.toast]:!leading-[18px] group-[.toast]:!text-[var(--hc-grey-600)] group-[.toast]:!font-normal",
42
- actionButton: "group-[.toast]:!text-sm group-[.toast]:!leading-[18px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-primary-600)] group-[.toast]:!bg-transparent group-[.toast]:!p-0",
43
- cancelButton: "group-[.toast]:!bg-transparent group-[.toast]:!text-foreground group-[.toast]:!text-sm group-[.toast]:!font-medium group-[.toast]:!p-0",
44
- closeButton: "group-[.toast]:!text-[var(--hc-grey-300)]"
45
- }
46
- },
63
+ position: "bottom-center",
64
+ offset: { bottom: TOAST_BOTTOM_OFFSET },
65
+ mobileOffset: { bottom: TOAST_BOTTOM_OFFSET },
66
+ visibleToasts: 3,
67
+ duration: TOAST_DURATION_MS,
68
+ closeButton: true,
69
+ style: { ...TOKENS, ...style },
70
+ toastOptions: { ...toastOptions, classNames: { ...CLASS_NAMES, ...toastOptions?.classNames } },
47
71
  ...props
48
72
  }
49
73
  );
50
74
  };
75
+ function withDefaults(kind, message, data) {
76
+ return {
77
+ ...typeof message === "string" && data?.id === void 0 ? { id: `${kind}:${message}` } : {},
78
+ ...kind === "error" && data?.duration === void 0 ? { duration: ERROR_TOAST_MS } : {},
79
+ ...data
80
+ };
81
+ }
82
+ var typed = (kind) => (message, data) => import_sonner.toast[kind](message, withDefaults(kind, message, data));
83
+ var toast = Object.assign(
84
+ (message, data) => (0, import_sonner.toast)(message, data),
85
+ import_sonner.toast,
86
+ {
87
+ success: typed("success"),
88
+ info: typed("info"),
89
+ warning: typed("warning"),
90
+ error: typed("error"),
91
+ message: typed("message")
92
+ }
93
+ );
51
94
  // Annotate the CommonJS export names for ESM import in node:
52
95
  0 && (module.exports = {
96
+ ERROR_TOAST_MS,
97
+ TOAST_BOTTOM_OFFSET,
98
+ TOAST_DURATION_MS,
53
99
  Toaster,
54
100
  toast
55
101
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/sonner.tsx"],"sourcesContent":["import { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, toast } from \"sonner\"\nimport { cn } from \"../lib/utils\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:!bg-white group-[.toaster]:!rounded-[6px] group-[.toaster]:!shadow-lg group-[.toaster]:!border group-[.toaster]:!border-[rgba(0,0,0,0.08)] group-[.toaster]:!p-4 group-[.toaster]:!font-[Inter]\",\n title:\n \"group-[.toast]:!text-sm group-[.toast]:!leading-[24px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-grey-600)]\",\n description:\n \"group-[.toast]:!text-xs group-[.toast]:!leading-[18px] group-[.toast]:!text-[var(--hc-grey-600)] group-[.toast]:!font-normal\",\n actionButton:\n \"group-[.toast]:!text-sm group-[.toast]:!leading-[18px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-primary-600)] group-[.toast]:!bg-transparent group-[.toast]:!p-0\",\n cancelButton:\n \"group-[.toast]:!bg-transparent group-[.toast]:!text-foreground group-[.toast]:!text-sm group-[.toast]:!font-medium group-[.toast]:!p-0\",\n closeButton:\n \"group-[.toast]:!text-[var(--hc-grey-300)]\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster, toast }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAyB;AACzB,oBAAyC;AASrC;AAJJ,IAAM,UAAU,CAAC,EAAE,GAAG,MAAM,MAAoB;AAC9C,QAAM,EAAE,QAAQ,SAAS,QAAI,6BAAS;AAEtC,SACE;AAAA,IAAC,cAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,cAAc;AAAA,QACZ,YAAY;AAAA,UACV,OACE;AAAA,UACF,OACE;AAAA,UACF,aACE;AAAA,UACF,cACE;AAAA,UACF,cACE;AAAA,UACF,aACE;AAAA,QACJ;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":["Sonner"]}
1
+ {"version":3,"sources":["../../src/components/sonner.tsx"],"sourcesContent":["import type { CSSProperties } from \"react\"\nimport { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, toast as sonnerToast, type ExternalToast } from \"sonner\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\n\nexport const TOAST_DURATION_MS = 4000\n/** Errors stay up longer: they usually need reading, and often a retry. */\nexport const ERROR_TOAST_MS = 7000\n\n/*\n * Colours come from the app's --hc-color-* tokens (acai-ui-library/styles), set as\n * sonner's own CSS variables, so light and dark follow the theme. Fallbacks keep it\n * readable if an app has not loaded the tokens.\n */\nconst TOKENS = {\n \"--normal-bg\": \"var(--hc-color-popover, #fff)\",\n \"--normal-border\": \"var(--hc-color-border, rgba(0,0,0,0.12))\",\n \"--normal-text\": \"var(--hc-color-popover-fg, #1a1a1e)\",\n fontFamily: \"inherit\",\n} as CSSProperties\n\nconst ACCENT = \"!border-l-4\"\n\n/** Per type: a coloured left accent and icon colour; the text stays popover-fg on popover. */\nconst CLASS_NAMES: NonNullable<NonNullable<ToasterProps[\"toastOptions\"]>[\"classNames\"]> = {\n toast: \"toast !font-[inherit] !rounded-lg !shadow-lg\",\n title: \"!font-medium\",\n description: \"!text-[var(--hc-color-muted-fg,#595961)]\",\n actionButton: \"!bg-[var(--hc-color-primary,#5542ca)] !text-[var(--hc-color-primary-fg,#fff)]\",\n cancelButton: \"!bg-[var(--hc-color-muted,#f1f1f1)] !text-[var(--hc-color-popover-fg,#1a1a1e)]\",\n closeButton:\n \"!bg-[var(--hc-color-popover,#fff)] !text-[var(--hc-color-muted-fg,#595961)] !border-[var(--hc-color-border,rgba(0,0,0,0.12))]\",\n success: `${ACCENT} !border-l-[var(--hc-color-success,#16a34a)] [&_[data-icon]]:!text-[var(--hc-color-success,#16a34a)]`,\n error: `${ACCENT} !border-l-[var(--hc-color-destructive,#dc2626)] [&_[data-icon]]:!text-[var(--hc-color-destructive,#dc2626)]`,\n warning: `${ACCENT} !border-l-[var(--hc-color-warning,#d97706)] [&_[data-icon]]:!text-[var(--hc-color-warning,#d97706)]`,\n info: `${ACCENT} !border-l-[var(--hc-color-primary,#5542ca)] [&_[data-icon]]:!text-[var(--hc-color-primary,#5542ca)]`,\n loading: `${ACCENT} !border-l-[var(--hc-color-muted-fg,#595961)] [&_[data-icon]]:!text-[var(--hc-color-muted-fg,#595961)]`,\n}\n\n/** 16px above the bottom edge plus the safe area, clear of mobile bottom tab bars. */\nexport const TOAST_BOTTOM_OFFSET = \"calc(16px + env(safe-area-inset-bottom, 0px))\"\n\n/**\n * The one Toaster for an app: render it once in the root layout, with no props.\n * Bottom-center, three visible, 4 s (errors 7 s), close button, theme-following colours,\n * the app's own font.\n */\nconst Toaster = ({ style, toastOptions, ...props }: ToasterProps) => {\n const { resolvedTheme, forcedTheme } = useTheme()\n\n return (\n <Sonner\n theme={(forcedTheme ?? resolvedTheme) === \"dark\" ? \"dark\" : \"light\"}\n className=\"toaster group\"\n position=\"bottom-center\"\n offset={{ bottom: TOAST_BOTTOM_OFFSET }}\n mobileOffset={{ bottom: TOAST_BOTTOM_OFFSET }}\n visibleToasts={3}\n duration={TOAST_DURATION_MS}\n closeButton\n style={{ ...TOKENS, ...style }}\n toastOptions={{ ...toastOptions, classNames: { ...CLASS_NAMES, ...toastOptions?.classNames } }}\n {...props}\n />\n )\n}\n\ntype Typed = \"success\" | \"info\" | \"warning\" | \"error\" | \"message\"\n\n/*\n * Errors default to 7 s. A string message gets its own text as the toast id unless the\n * caller passes one, so the same message fired twice (a double click, a retried mutation)\n * updates the toast already showing instead of stacking a copy.\n */\nfunction withDefaults(kind: Typed, message: unknown, data?: ExternalToast): ExternalToast {\n return {\n ...(typeof message === \"string\" && data?.id === undefined ? { id: `${kind}:${message}` } : {}),\n ...(kind === \"error\" && data?.duration === undefined ? { duration: ERROR_TOAST_MS } : {}),\n ...data,\n }\n}\n\nconst typed =\n (kind: Typed): (typeof sonnerToast)[Typed] =>\n (message, data) =>\n sonnerToast[kind](message, withDefaults(kind, message, data))\n\n/** sonner's `toast`, same API (promise, loading, custom, dismiss, action), with the defaults above. */\nconst toast: typeof sonnerToast = Object.assign(\n (message: Parameters<typeof sonnerToast>[0], data?: ExternalToast) => sonnerToast(message, data),\n sonnerToast,\n {\n success: typed(\"success\"),\n info: typed(\"info\"),\n warning: typed(\"warning\"),\n error: typed(\"error\"),\n message: typed(\"message\"),\n },\n)\n\nexport { Toaster, toast }\nexport type { ToasterProps, ExternalToast }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yBAAyB;AACzB,oBAA4E;AAkDxE;AA9CG,IAAM,oBAAoB;AAE1B,IAAM,iBAAiB;AAO9B,IAAM,SAAS;AAAA,EACb,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,YAAY;AACd;AAEA,IAAM,SAAS;AAGf,IAAM,cAAoF;AAAA,EACxF,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aACE;AAAA,EACF,SAAS,GAAG,MAAM;AAAA,EAClB,OAAO,GAAG,MAAM;AAAA,EAChB,SAAS,GAAG,MAAM;AAAA,EAClB,MAAM,GAAG,MAAM;AAAA,EACf,SAAS,GAAG,MAAM;AACpB;AAGO,IAAM,sBAAsB;AAOnC,IAAM,UAAU,CAAC,EAAE,OAAO,cAAc,GAAG,MAAM,MAAoB;AACnE,QAAM,EAAE,eAAe,YAAY,QAAI,6BAAS;AAEhD,SACE;AAAA,IAAC,cAAAA;AAAA,IAAA;AAAA,MACC,QAAQ,eAAe,mBAAmB,SAAS,SAAS;AAAA,MAC5D,WAAU;AAAA,MACV,UAAS;AAAA,MACT,QAAQ,EAAE,QAAQ,oBAAoB;AAAA,MACtC,cAAc,EAAE,QAAQ,oBAAoB;AAAA,MAC5C,eAAe;AAAA,MACf,UAAU;AAAA,MACV,aAAW;AAAA,MACX,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM;AAAA,MAC7B,cAAc,EAAE,GAAG,cAAc,YAAY,EAAE,GAAG,aAAa,GAAG,cAAc,WAAW,EAAE;AAAA,MAC5F,GAAG;AAAA;AAAA,EACN;AAEJ;AASA,SAAS,aAAa,MAAa,SAAkB,MAAqC;AACxF,SAAO;AAAA,IACL,GAAI,OAAO,YAAY,YAAY,MAAM,OAAO,SAAY,EAAE,IAAI,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC;AAAA,IAC5F,GAAI,SAAS,WAAW,MAAM,aAAa,SAAY,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,IACvF,GAAG;AAAA,EACL;AACF;AAEA,IAAM,QACJ,CAAC,SACD,CAAC,SAAS,SACR,cAAAC,MAAY,IAAI,EAAE,SAAS,aAAa,MAAM,SAAS,IAAI,CAAC;AAGhE,IAAM,QAA4B,OAAO;AAAA,EACvC,CAAC,SAA4C,aAAyB,cAAAA,OAAY,SAAS,IAAI;AAAA,EAC/F,cAAAA;AAAA,EACA;AAAA,IACE,SAAS,MAAM,SAAS;AAAA,IACxB,MAAM,MAAM,MAAM;AAAA,IAClB,SAAS,MAAM,SAAS;AAAA,IACxB,OAAO,MAAM,OAAO;AAAA,IACpB,SAAS,MAAM,SAAS;AAAA,EAC1B;AACF;","names":["Sonner","sonnerToast"]}
@@ -1,8 +1,20 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { Toaster as Toaster$1 } from 'sonner';
3
- export { toast } from 'sonner';
2
+ import { Toaster as Toaster$1, toast as toast$1 } from 'sonner';
3
+ export { ExternalToast } from 'sonner';
4
4
 
5
5
  type ToasterProps = React.ComponentProps<typeof Toaster$1>;
6
- declare const Toaster: ({ ...props }: ToasterProps) => react_jsx_runtime.JSX.Element;
6
+ declare const TOAST_DURATION_MS = 4000;
7
+ /** Errors stay up longer: they usually need reading, and often a retry. */
8
+ declare const ERROR_TOAST_MS = 7000;
9
+ /** 16px above the bottom edge plus the safe area, clear of mobile bottom tab bars. */
10
+ declare const TOAST_BOTTOM_OFFSET = "calc(16px + env(safe-area-inset-bottom, 0px))";
11
+ /**
12
+ * The one Toaster for an app: render it once in the root layout, with no props.
13
+ * Bottom-center, three visible, 4 s (errors 7 s), close button, theme-following colours,
14
+ * the app's own font.
15
+ */
16
+ declare const Toaster: ({ style, toastOptions, ...props }: ToasterProps) => react_jsx_runtime.JSX.Element;
17
+ /** sonner's `toast`, same API (promise, loading, custom, dismiss, action), with the defaults above. */
18
+ declare const toast: typeof toast$1;
7
19
 
8
- export { Toaster };
20
+ export { ERROR_TOAST_MS, TOAST_BOTTOM_OFFSET, TOAST_DURATION_MS, Toaster, type ToasterProps, toast };
@@ -1,8 +1,20 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { Toaster as Toaster$1 } from 'sonner';
3
- export { toast } from 'sonner';
2
+ import { Toaster as Toaster$1, toast as toast$1 } from 'sonner';
3
+ export { ExternalToast } from 'sonner';
4
4
 
5
5
  type ToasterProps = React.ComponentProps<typeof Toaster$1>;
6
- declare const Toaster: ({ ...props }: ToasterProps) => react_jsx_runtime.JSX.Element;
6
+ declare const TOAST_DURATION_MS = 4000;
7
+ /** Errors stay up longer: they usually need reading, and often a retry. */
8
+ declare const ERROR_TOAST_MS = 7000;
9
+ /** 16px above the bottom edge plus the safe area, clear of mobile bottom tab bars. */
10
+ declare const TOAST_BOTTOM_OFFSET = "calc(16px + env(safe-area-inset-bottom, 0px))";
11
+ /**
12
+ * The one Toaster for an app: render it once in the root layout, with no props.
13
+ * Bottom-center, three visible, 4 s (errors 7 s), close button, theme-following colours,
14
+ * the app's own font.
15
+ */
16
+ declare const Toaster: ({ style, toastOptions, ...props }: ToasterProps) => react_jsx_runtime.JSX.Element;
17
+ /** sonner's `toast`, same API (promise, loading, custom, dismiss, action), with the defaults above. */
18
+ declare const toast: typeof toast$1;
7
19
 
8
- export { Toaster };
20
+ export { ERROR_TOAST_MS, TOAST_BOTTOM_OFFSET, TOAST_DURATION_MS, Toaster, type ToasterProps, toast };
@@ -1,29 +1,72 @@
1
1
  // src/components/sonner.tsx
2
2
  import { useTheme } from "next-themes";
3
- import { Toaster as Sonner, toast } from "sonner";
3
+ import { Toaster as Sonner, toast as sonnerToast } from "sonner";
4
4
  import { jsx } from "react/jsx-runtime";
5
- var Toaster = ({ ...props }) => {
6
- const { theme = "system" } = useTheme();
5
+ var TOAST_DURATION_MS = 4e3;
6
+ var ERROR_TOAST_MS = 7e3;
7
+ var TOKENS = {
8
+ "--normal-bg": "var(--hc-color-popover, #fff)",
9
+ "--normal-border": "var(--hc-color-border, rgba(0,0,0,0.12))",
10
+ "--normal-text": "var(--hc-color-popover-fg, #1a1a1e)",
11
+ fontFamily: "inherit"
12
+ };
13
+ var ACCENT = "!border-l-4";
14
+ var CLASS_NAMES = {
15
+ toast: "toast !font-[inherit] !rounded-lg !shadow-lg",
16
+ title: "!font-medium",
17
+ description: "!text-[var(--hc-color-muted-fg,#595961)]",
18
+ actionButton: "!bg-[var(--hc-color-primary,#5542ca)] !text-[var(--hc-color-primary-fg,#fff)]",
19
+ cancelButton: "!bg-[var(--hc-color-muted,#f1f1f1)] !text-[var(--hc-color-popover-fg,#1a1a1e)]",
20
+ closeButton: "!bg-[var(--hc-color-popover,#fff)] !text-[var(--hc-color-muted-fg,#595961)] !border-[var(--hc-color-border,rgba(0,0,0,0.12))]",
21
+ success: `${ACCENT} !border-l-[var(--hc-color-success,#16a34a)] [&_[data-icon]]:!text-[var(--hc-color-success,#16a34a)]`,
22
+ error: `${ACCENT} !border-l-[var(--hc-color-destructive,#dc2626)] [&_[data-icon]]:!text-[var(--hc-color-destructive,#dc2626)]`,
23
+ warning: `${ACCENT} !border-l-[var(--hc-color-warning,#d97706)] [&_[data-icon]]:!text-[var(--hc-color-warning,#d97706)]`,
24
+ info: `${ACCENT} !border-l-[var(--hc-color-primary,#5542ca)] [&_[data-icon]]:!text-[var(--hc-color-primary,#5542ca)]`,
25
+ loading: `${ACCENT} !border-l-[var(--hc-color-muted-fg,#595961)] [&_[data-icon]]:!text-[var(--hc-color-muted-fg,#595961)]`
26
+ };
27
+ var TOAST_BOTTOM_OFFSET = "calc(16px + env(safe-area-inset-bottom, 0px))";
28
+ var Toaster = ({ style, toastOptions, ...props }) => {
29
+ const { resolvedTheme, forcedTheme } = useTheme();
7
30
  return /* @__PURE__ */ jsx(
8
31
  Sonner,
9
32
  {
10
- theme,
33
+ theme: (forcedTheme ?? resolvedTheme) === "dark" ? "dark" : "light",
11
34
  className: "toaster group",
12
- toastOptions: {
13
- classNames: {
14
- toast: "group toast group-[.toaster]:!bg-white group-[.toaster]:!rounded-[6px] group-[.toaster]:!shadow-lg group-[.toaster]:!border group-[.toaster]:!border-[rgba(0,0,0,0.08)] group-[.toaster]:!p-4 group-[.toaster]:!font-[Inter]",
15
- title: "group-[.toast]:!text-sm group-[.toast]:!leading-[24px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-grey-600)]",
16
- description: "group-[.toast]:!text-xs group-[.toast]:!leading-[18px] group-[.toast]:!text-[var(--hc-grey-600)] group-[.toast]:!font-normal",
17
- actionButton: "group-[.toast]:!text-sm group-[.toast]:!leading-[18px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-primary-600)] group-[.toast]:!bg-transparent group-[.toast]:!p-0",
18
- cancelButton: "group-[.toast]:!bg-transparent group-[.toast]:!text-foreground group-[.toast]:!text-sm group-[.toast]:!font-medium group-[.toast]:!p-0",
19
- closeButton: "group-[.toast]:!text-[var(--hc-grey-300)]"
20
- }
21
- },
35
+ position: "bottom-center",
36
+ offset: { bottom: TOAST_BOTTOM_OFFSET },
37
+ mobileOffset: { bottom: TOAST_BOTTOM_OFFSET },
38
+ visibleToasts: 3,
39
+ duration: TOAST_DURATION_MS,
40
+ closeButton: true,
41
+ style: { ...TOKENS, ...style },
42
+ toastOptions: { ...toastOptions, classNames: { ...CLASS_NAMES, ...toastOptions?.classNames } },
22
43
  ...props
23
44
  }
24
45
  );
25
46
  };
47
+ function withDefaults(kind, message, data) {
48
+ return {
49
+ ...typeof message === "string" && data?.id === void 0 ? { id: `${kind}:${message}` } : {},
50
+ ...kind === "error" && data?.duration === void 0 ? { duration: ERROR_TOAST_MS } : {},
51
+ ...data
52
+ };
53
+ }
54
+ var typed = (kind) => (message, data) => sonnerToast[kind](message, withDefaults(kind, message, data));
55
+ var toast = Object.assign(
56
+ (message, data) => sonnerToast(message, data),
57
+ sonnerToast,
58
+ {
59
+ success: typed("success"),
60
+ info: typed("info"),
61
+ warning: typed("warning"),
62
+ error: typed("error"),
63
+ message: typed("message")
64
+ }
65
+ );
26
66
  export {
67
+ ERROR_TOAST_MS,
68
+ TOAST_BOTTOM_OFFSET,
69
+ TOAST_DURATION_MS,
27
70
  Toaster,
28
71
  toast
29
72
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/sonner.tsx"],"sourcesContent":["import { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, toast } from \"sonner\"\nimport { cn } from \"../lib/utils\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:!bg-white group-[.toaster]:!rounded-[6px] group-[.toaster]:!shadow-lg group-[.toaster]:!border group-[.toaster]:!border-[rgba(0,0,0,0.08)] group-[.toaster]:!p-4 group-[.toaster]:!font-[Inter]\",\n title:\n \"group-[.toast]:!text-sm group-[.toast]:!leading-[24px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-grey-600)]\",\n description:\n \"group-[.toast]:!text-xs group-[.toast]:!leading-[18px] group-[.toast]:!text-[var(--hc-grey-600)] group-[.toast]:!font-normal\",\n actionButton:\n \"group-[.toast]:!text-sm group-[.toast]:!leading-[18px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-primary-600)] group-[.toast]:!bg-transparent group-[.toast]:!p-0\",\n cancelButton:\n \"group-[.toast]:!bg-transparent group-[.toast]:!text-foreground group-[.toast]:!text-sm group-[.toast]:!font-medium group-[.toast]:!p-0\",\n closeButton:\n \"group-[.toast]:!text-[var(--hc-grey-300)]\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster, toast }\n"],"mappings":";AAAA,SAAS,gBAAgB;AACzB,SAAS,WAAW,QAAQ,aAAa;AASrC;AAJJ,IAAM,UAAU,CAAC,EAAE,GAAG,MAAM,MAAoB;AAC9C,QAAM,EAAE,QAAQ,SAAS,IAAI,SAAS;AAEtC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,cAAc;AAAA,QACZ,YAAY;AAAA,UACV,OACE;AAAA,UACF,OACE;AAAA,UACF,aACE;AAAA,UACF,cACE;AAAA,UACF,cACE;AAAA,UACF,aACE;AAAA,QACJ;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/sonner.tsx"],"sourcesContent":["import type { CSSProperties } from \"react\"\nimport { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, toast as sonnerToast, type ExternalToast } from \"sonner\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\n\nexport const TOAST_DURATION_MS = 4000\n/** Errors stay up longer: they usually need reading, and often a retry. */\nexport const ERROR_TOAST_MS = 7000\n\n/*\n * Colours come from the app's --hc-color-* tokens (acai-ui-library/styles), set as\n * sonner's own CSS variables, so light and dark follow the theme. Fallbacks keep it\n * readable if an app has not loaded the tokens.\n */\nconst TOKENS = {\n \"--normal-bg\": \"var(--hc-color-popover, #fff)\",\n \"--normal-border\": \"var(--hc-color-border, rgba(0,0,0,0.12))\",\n \"--normal-text\": \"var(--hc-color-popover-fg, #1a1a1e)\",\n fontFamily: \"inherit\",\n} as CSSProperties\n\nconst ACCENT = \"!border-l-4\"\n\n/** Per type: a coloured left accent and icon colour; the text stays popover-fg on popover. */\nconst CLASS_NAMES: NonNullable<NonNullable<ToasterProps[\"toastOptions\"]>[\"classNames\"]> = {\n toast: \"toast !font-[inherit] !rounded-lg !shadow-lg\",\n title: \"!font-medium\",\n description: \"!text-[var(--hc-color-muted-fg,#595961)]\",\n actionButton: \"!bg-[var(--hc-color-primary,#5542ca)] !text-[var(--hc-color-primary-fg,#fff)]\",\n cancelButton: \"!bg-[var(--hc-color-muted,#f1f1f1)] !text-[var(--hc-color-popover-fg,#1a1a1e)]\",\n closeButton:\n \"!bg-[var(--hc-color-popover,#fff)] !text-[var(--hc-color-muted-fg,#595961)] !border-[var(--hc-color-border,rgba(0,0,0,0.12))]\",\n success: `${ACCENT} !border-l-[var(--hc-color-success,#16a34a)] [&_[data-icon]]:!text-[var(--hc-color-success,#16a34a)]`,\n error: `${ACCENT} !border-l-[var(--hc-color-destructive,#dc2626)] [&_[data-icon]]:!text-[var(--hc-color-destructive,#dc2626)]`,\n warning: `${ACCENT} !border-l-[var(--hc-color-warning,#d97706)] [&_[data-icon]]:!text-[var(--hc-color-warning,#d97706)]`,\n info: `${ACCENT} !border-l-[var(--hc-color-primary,#5542ca)] [&_[data-icon]]:!text-[var(--hc-color-primary,#5542ca)]`,\n loading: `${ACCENT} !border-l-[var(--hc-color-muted-fg,#595961)] [&_[data-icon]]:!text-[var(--hc-color-muted-fg,#595961)]`,\n}\n\n/** 16px above the bottom edge plus the safe area, clear of mobile bottom tab bars. */\nexport const TOAST_BOTTOM_OFFSET = \"calc(16px + env(safe-area-inset-bottom, 0px))\"\n\n/**\n * The one Toaster for an app: render it once in the root layout, with no props.\n * Bottom-center, three visible, 4 s (errors 7 s), close button, theme-following colours,\n * the app's own font.\n */\nconst Toaster = ({ style, toastOptions, ...props }: ToasterProps) => {\n const { resolvedTheme, forcedTheme } = useTheme()\n\n return (\n <Sonner\n theme={(forcedTheme ?? resolvedTheme) === \"dark\" ? \"dark\" : \"light\"}\n className=\"toaster group\"\n position=\"bottom-center\"\n offset={{ bottom: TOAST_BOTTOM_OFFSET }}\n mobileOffset={{ bottom: TOAST_BOTTOM_OFFSET }}\n visibleToasts={3}\n duration={TOAST_DURATION_MS}\n closeButton\n style={{ ...TOKENS, ...style }}\n toastOptions={{ ...toastOptions, classNames: { ...CLASS_NAMES, ...toastOptions?.classNames } }}\n {...props}\n />\n )\n}\n\ntype Typed = \"success\" | \"info\" | \"warning\" | \"error\" | \"message\"\n\n/*\n * Errors default to 7 s. A string message gets its own text as the toast id unless the\n * caller passes one, so the same message fired twice (a double click, a retried mutation)\n * updates the toast already showing instead of stacking a copy.\n */\nfunction withDefaults(kind: Typed, message: unknown, data?: ExternalToast): ExternalToast {\n return {\n ...(typeof message === \"string\" && data?.id === undefined ? { id: `${kind}:${message}` } : {}),\n ...(kind === \"error\" && data?.duration === undefined ? { duration: ERROR_TOAST_MS } : {}),\n ...data,\n }\n}\n\nconst typed =\n (kind: Typed): (typeof sonnerToast)[Typed] =>\n (message, data) =>\n sonnerToast[kind](message, withDefaults(kind, message, data))\n\n/** sonner's `toast`, same API (promise, loading, custom, dismiss, action), with the defaults above. */\nconst toast: typeof sonnerToast = Object.assign(\n (message: Parameters<typeof sonnerToast>[0], data?: ExternalToast) => sonnerToast(message, data),\n sonnerToast,\n {\n success: typed(\"success\"),\n info: typed(\"info\"),\n warning: typed(\"warning\"),\n error: typed(\"error\"),\n message: typed(\"message\"),\n },\n)\n\nexport { Toaster, toast }\nexport type { ToasterProps, ExternalToast }\n"],"mappings":";AACA,SAAS,gBAAgB;AACzB,SAAS,WAAW,QAAQ,SAAS,mBAAuC;AAkDxE;AA9CG,IAAM,oBAAoB;AAE1B,IAAM,iBAAiB;AAO9B,IAAM,SAAS;AAAA,EACb,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,YAAY;AACd;AAEA,IAAM,SAAS;AAGf,IAAM,cAAoF;AAAA,EACxF,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aACE;AAAA,EACF,SAAS,GAAG,MAAM;AAAA,EAClB,OAAO,GAAG,MAAM;AAAA,EAChB,SAAS,GAAG,MAAM;AAAA,EAClB,MAAM,GAAG,MAAM;AAAA,EACf,SAAS,GAAG,MAAM;AACpB;AAGO,IAAM,sBAAsB;AAOnC,IAAM,UAAU,CAAC,EAAE,OAAO,cAAc,GAAG,MAAM,MAAoB;AACnE,QAAM,EAAE,eAAe,YAAY,IAAI,SAAS;AAEhD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,eAAe,mBAAmB,SAAS,SAAS;AAAA,MAC5D,WAAU;AAAA,MACV,UAAS;AAAA,MACT,QAAQ,EAAE,QAAQ,oBAAoB;AAAA,MACtC,cAAc,EAAE,QAAQ,oBAAoB;AAAA,MAC5C,eAAe;AAAA,MACf,UAAU;AAAA,MACV,aAAW;AAAA,MACX,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM;AAAA,MAC7B,cAAc,EAAE,GAAG,cAAc,YAAY,EAAE,GAAG,aAAa,GAAG,cAAc,WAAW,EAAE;AAAA,MAC5F,GAAG;AAAA;AAAA,EACN;AAEJ;AASA,SAAS,aAAa,MAAa,SAAkB,MAAqC;AACxF,SAAO;AAAA,IACL,GAAI,OAAO,YAAY,YAAY,MAAM,OAAO,SAAY,EAAE,IAAI,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC;AAAA,IAC5F,GAAI,SAAS,WAAW,MAAM,aAAa,SAAY,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,IACvF,GAAG;AAAA,EACL;AACF;AAEA,IAAM,QACJ,CAAC,SACD,CAAC,SAAS,SACR,YAAY,IAAI,EAAE,SAAS,aAAa,MAAM,SAAS,IAAI,CAAC;AAGhE,IAAM,QAA4B,OAAO;AAAA,EACvC,CAAC,SAA4C,SAAyB,YAAY,SAAS,IAAI;AAAA,EAC/F;AAAA,EACA;AAAA,IACE,SAAS,MAAM,SAAS;AAAA,IACxB,MAAM,MAAM,MAAM;AAAA,IAClB,SAAS,MAAM,SAAS;AAAA,IACxB,OAAO,MAAM,OAAO;AAAA,IACpB,SAAS,MAAM,SAAS;AAAA,EAC1B;AACF;","names":[]}
package/dist/index.cjs CHANGED
@@ -156,6 +156,7 @@ __export(src_exports, {
156
156
  DropdownMenuSubContent: () => DropdownMenuSubContent,
157
157
  DropdownMenuSubTrigger: () => DropdownMenuSubTrigger,
158
158
  DropdownMenuTrigger: () => DropdownMenuTrigger,
159
+ ERROR_TOAST_MS: () => ERROR_TOAST_MS,
159
160
  EmptyState: () => EmptyState,
160
161
  EmptyStateActions: () => EmptyStateActions,
161
162
  FileInput: () => FileInput,
@@ -281,6 +282,8 @@ __export(src_exports, {
281
282
  StepperItem: () => StepperItem,
282
283
  SuccessIcon: () => SuccessIcon,
283
284
  Switch: () => Switch,
285
+ TOAST_BOTTOM_OFFSET: () => TOAST_BOTTOM_OFFSET,
286
+ TOAST_DURATION_MS: () => TOAST_DURATION_MS,
284
287
  Table: () => Table,
285
288
  TableBody: () => TableBody,
286
289
  TableCaption: () => TableCaption,
@@ -318,7 +321,7 @@ __export(src_exports, {
318
321
  readImpersonation: () => readImpersonation,
319
322
  spinnerVariants: () => spinnerVariants,
320
323
  switchVariants: () => switchVariants,
321
- toast: () => import_sonner.toast,
324
+ toast: () => toast,
322
325
  toggleVariants: () => toggleVariants,
323
326
  useFormField: () => useFormField,
324
327
  useImpersonation: () => useImpersonation,
@@ -4629,27 +4632,67 @@ function IconInfoLineIcon({ size = 16, width, height, fill, title, ...props }) {
4629
4632
  var import_next_themes = require("next-themes");
4630
4633
  var import_sonner = require("sonner");
4631
4634
  var import_jsx_runtime57 = require("react/jsx-runtime");
4632
- var Toaster = ({ ...props }) => {
4633
- const { theme = "system" } = (0, import_next_themes.useTheme)();
4635
+ var TOAST_DURATION_MS = 4e3;
4636
+ var ERROR_TOAST_MS = 7e3;
4637
+ var TOKENS = {
4638
+ "--normal-bg": "var(--hc-color-popover, #fff)",
4639
+ "--normal-border": "var(--hc-color-border, rgba(0,0,0,0.12))",
4640
+ "--normal-text": "var(--hc-color-popover-fg, #1a1a1e)",
4641
+ fontFamily: "inherit"
4642
+ };
4643
+ var ACCENT = "!border-l-4";
4644
+ var CLASS_NAMES = {
4645
+ toast: "toast !font-[inherit] !rounded-lg !shadow-lg",
4646
+ title: "!font-medium",
4647
+ description: "!text-[var(--hc-color-muted-fg,#595961)]",
4648
+ actionButton: "!bg-[var(--hc-color-primary,#5542ca)] !text-[var(--hc-color-primary-fg,#fff)]",
4649
+ cancelButton: "!bg-[var(--hc-color-muted,#f1f1f1)] !text-[var(--hc-color-popover-fg,#1a1a1e)]",
4650
+ closeButton: "!bg-[var(--hc-color-popover,#fff)] !text-[var(--hc-color-muted-fg,#595961)] !border-[var(--hc-color-border,rgba(0,0,0,0.12))]",
4651
+ success: `${ACCENT} !border-l-[var(--hc-color-success,#16a34a)] [&_[data-icon]]:!text-[var(--hc-color-success,#16a34a)]`,
4652
+ error: `${ACCENT} !border-l-[var(--hc-color-destructive,#dc2626)] [&_[data-icon]]:!text-[var(--hc-color-destructive,#dc2626)]`,
4653
+ warning: `${ACCENT} !border-l-[var(--hc-color-warning,#d97706)] [&_[data-icon]]:!text-[var(--hc-color-warning,#d97706)]`,
4654
+ info: `${ACCENT} !border-l-[var(--hc-color-primary,#5542ca)] [&_[data-icon]]:!text-[var(--hc-color-primary,#5542ca)]`,
4655
+ loading: `${ACCENT} !border-l-[var(--hc-color-muted-fg,#595961)] [&_[data-icon]]:!text-[var(--hc-color-muted-fg,#595961)]`
4656
+ };
4657
+ var TOAST_BOTTOM_OFFSET = "calc(16px + env(safe-area-inset-bottom, 0px))";
4658
+ var Toaster = ({ style, toastOptions, ...props }) => {
4659
+ const { resolvedTheme, forcedTheme } = (0, import_next_themes.useTheme)();
4634
4660
  return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
4635
4661
  import_sonner.Toaster,
4636
4662
  {
4637
- theme,
4663
+ theme: (forcedTheme ?? resolvedTheme) === "dark" ? "dark" : "light",
4638
4664
  className: "toaster group",
4639
- toastOptions: {
4640
- classNames: {
4641
- toast: "group toast group-[.toaster]:!bg-white group-[.toaster]:!rounded-[6px] group-[.toaster]:!shadow-lg group-[.toaster]:!border group-[.toaster]:!border-[rgba(0,0,0,0.08)] group-[.toaster]:!p-4 group-[.toaster]:!font-[Inter]",
4642
- title: "group-[.toast]:!text-sm group-[.toast]:!leading-[24px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-grey-600)]",
4643
- description: "group-[.toast]:!text-xs group-[.toast]:!leading-[18px] group-[.toast]:!text-[var(--hc-grey-600)] group-[.toast]:!font-normal",
4644
- actionButton: "group-[.toast]:!text-sm group-[.toast]:!leading-[18px] group-[.toast]:!font-medium group-[.toast]:!text-[var(--hc-primary-600)] group-[.toast]:!bg-transparent group-[.toast]:!p-0",
4645
- cancelButton: "group-[.toast]:!bg-transparent group-[.toast]:!text-foreground group-[.toast]:!text-sm group-[.toast]:!font-medium group-[.toast]:!p-0",
4646
- closeButton: "group-[.toast]:!text-[var(--hc-grey-300)]"
4647
- }
4648
- },
4665
+ position: "bottom-center",
4666
+ offset: { bottom: TOAST_BOTTOM_OFFSET },
4667
+ mobileOffset: { bottom: TOAST_BOTTOM_OFFSET },
4668
+ visibleToasts: 3,
4669
+ duration: TOAST_DURATION_MS,
4670
+ closeButton: true,
4671
+ style: { ...TOKENS, ...style },
4672
+ toastOptions: { ...toastOptions, classNames: { ...CLASS_NAMES, ...toastOptions?.classNames } },
4649
4673
  ...props
4650
4674
  }
4651
4675
  );
4652
4676
  };
4677
+ function withDefaults(kind, message, data) {
4678
+ return {
4679
+ ...typeof message === "string" && data?.id === void 0 ? { id: `${kind}:${message}` } : {},
4680
+ ...kind === "error" && data?.duration === void 0 ? { duration: ERROR_TOAST_MS } : {},
4681
+ ...data
4682
+ };
4683
+ }
4684
+ var typed = (kind) => (message, data) => import_sonner.toast[kind](message, withDefaults(kind, message, data));
4685
+ var toast = Object.assign(
4686
+ (message, data) => (0, import_sonner.toast)(message, data),
4687
+ import_sonner.toast,
4688
+ {
4689
+ success: typed("success"),
4690
+ info: typed("info"),
4691
+ warning: typed("warning"),
4692
+ error: typed("error"),
4693
+ message: typed("message")
4694
+ }
4695
+ );
4653
4696
 
4654
4697
  // src/components/typography.tsx
4655
4698
  var React50 = __toESM(require("react"), 1);
@@ -5097,6 +5140,7 @@ function useImpersonation(token) {
5097
5140
  DropdownMenuSubContent,
5098
5141
  DropdownMenuSubTrigger,
5099
5142
  DropdownMenuTrigger,
5143
+ ERROR_TOAST_MS,
5100
5144
  EmptyState,
5101
5145
  EmptyStateActions,
5102
5146
  FileInput,
@@ -5222,6 +5266,8 @@ function useImpersonation(token) {
5222
5266
  StepperItem,
5223
5267
  SuccessIcon,
5224
5268
  Switch,
5269
+ TOAST_BOTTOM_OFFSET,
5270
+ TOAST_DURATION_MS,
5225
5271
  Table,
5226
5272
  TableBody,
5227
5273
  TableCaption,