asma-ui-core 3.81.5 → 3.82.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,103 +1,106 @@
1
1
  import { cn as m } from "../../../../helpers/cn.js";
2
- import { HamburgerIcon as le } from "../../../icons/hamburger-icon/HamburgerIcon.js";
2
+ import { StyledBadge as le } from "../../../data-display/badge/StyledBadge.js";
3
+ import { HamburgerIcon as oe } from "../../../icons/hamburger-icon/HamburgerIcon.js";
3
4
  import { ArrowLeftIcon as ie } from "../../../icons/arrow-left-icon/ArrowLeftIcon.js";
4
- import { StyledButton as E } from "../../../inputs/button/StyledButton.js";
5
- import { useElementWidthPx as oe } from "../../../../hooks/useElementWidthPx.js";
5
+ import { StyledButton as _ } from "../../../inputs/button/StyledButton.js";
6
+ import { useElementWidthPx as se } from "../../../../hooks/useElementWidthPx.js";
6
7
  import { useWidthRegistry as re } from "../../../../hooks/useWidthRegistry.js";
7
- import { planToolbarActions as se } from "../../module/header-layout/planToolbarActions.js";
8
- import { ToolbarActionButton as ce, ToolbarActionGroup as de } from "../../module/header-layout/ToolbarActionGroup.js";
9
- import { useToolbarTranslations as me } from "../../module/header-layout/useTranslations.js";
10
- import { KEY_MORE_BUTTON as ue, ToolbarMeasurementStrip as he, actionKey as z } from "../../module/header-layout/ToolbarMeasurement.js";
11
- import { useIsTitleClamped as fe, useSearchFocus as pe, useStickyScrollPadding as xe, useStuckOnScroll as be } from "./PageHeader.hooks.js";
12
- import { useMemo as G, useRef as I } from "react";
13
- import { Fragment as ge, jsx as e, jsxs as l } from "react/jsx-runtime";
14
- import { useMergeRefs as ve } from "@floating-ui/react";
15
- var we = 744, Ne = 8, Te = 32, Ae = 120, Le = (t) => {
16
- const { badgeCount: s, ...i } = t, a = {
17
- ...i,
18
- canHideLabel: i.icon != null && i.canHideLabel !== !1
8
+ import { planToolbarActions as ce } from "../../module/header-layout/planToolbarActions.js";
9
+ import { ToolbarActionButton as de, ToolbarActionGroup as me } from "../../module/header-layout/ToolbarActionGroup.js";
10
+ import { useToolbarTranslations as ue } from "../../module/header-layout/useTranslations.js";
11
+ import { KEY_MORE_BUTTON as he, ToolbarMeasurementStrip as fe, actionKey as z } from "../../module/header-layout/ToolbarMeasurement.js";
12
+ import { useIsTitleClamped as pe, useSearchFocus as xe, useStickyScrollPadding as ge, useStuckOnScroll as be } from "./PageHeader.hooks.js";
13
+ import { useMemo as G, useRef as E } from "react";
14
+ import { Fragment as ve, jsx as e, jsxs as s } from "react/jsx-runtime";
15
+ import { useMergeRefs as we } from "@floating-ui/react";
16
+ var Ne = 744, Te = 8, Ae = 32, Le = 120, Me = (t) => {
17
+ const { badgeCount: r, ...o } = t, a = {
18
+ ...o,
19
+ canHideLabel: o.icon != null && o.canHideLabel !== !1
19
20
  };
20
- if (s == null || a.render) return a;
21
- const o = `${a.label} (${s})`;
21
+ if (r == null || a.render) return a;
22
+ const l = `${a.label} (${r})`;
22
23
  return {
23
24
  ...a,
24
- label: o,
25
- ariaLabel: o,
26
- render: ({ showLabel: u }) => /* @__PURE__ */ l("span", {
27
- className: "relative inline-flex",
28
- children: [/* @__PURE__ */ e(ce, {
25
+ label: l,
26
+ ariaLabel: l,
27
+ render: ({ showLabel: u }) => /* @__PURE__ */ e(le, {
28
+ dataTest: `${a.dataTest ?? `page-header-action-${a.id}`}-badge`,
29
+ badgeContent: r,
30
+ statusMessage: l,
31
+ slotProps: { badge: { style: {
32
+ right: -8,
33
+ top: -4,
34
+ transform: "none"
35
+ } } },
36
+ children: /* @__PURE__ */ e(de, {
29
37
  action: {
30
38
  ...a,
31
- ariaLabel: o
39
+ ariaLabel: l
32
40
  },
33
41
  showLabel: u
34
- }), /* @__PURE__ */ e("span", {
35
- "aria-hidden": !0,
36
- className: "absolute -right-2 -top-1 flex h-5 min-w-[20px] items-center justify-center rounded-full border border-solid border-lime-500 bg-lime-300 px-1.5 text-sm font-semibold leading-5 text-gama-800",
37
- "data-testid": `${a.dataTest ?? `page-header-action-${a.id}`}-badge`,
38
- children: s
39
- })]
42
+ })
40
43
  })
41
44
  };
42
45
  };
43
- function Me({ compact: t }) {
44
- return /* @__PURE__ */ l("div", {
46
+ function Pe({ compact: t }) {
47
+ return /* @__PURE__ */ s("div", {
45
48
  className: "flex w-full min-w-0 items-center justify-between gap-2",
46
49
  "aria-hidden": !0,
47
50
  children: [/* @__PURE__ */ e("div", { className: m("animate-pulse rounded bg-delta-100", t ? "h-6 w-3/5" : "h-8 w-2/5 max-w-[500px]") }), /* @__PURE__ */ e("div", { className: "h-10 w-14 shrink-0 animate-pulse rounded bg-delta-100" })]
48
51
  });
49
52
  }
50
- function Ge({ title: t, titleAs: s = "h1", titleDataTest: i, titleRef: a, subtitle: o, status: u, leading: h, onLeadingClick: P, leadingLabel: X, leadingSlot: W, actions: k = [], search: w, searchOpen: y = !1, onSearchClose: Y, searchCloseLabel: F, loading: f = !1, sticky: p = !1, locale: D = "en", className: U, dataTest: x = "page-header" }) {
51
- const c = me(D), { ref: S, widthPx: N } = oe(), { register: b, widths: r } = re(), T = I(null), C = I(null), $ = I(null), n = N > 0 && N < we, V = ve([T, a]), A = y && w != null, g = f || A;
52
- pe(w != null, y, $, T);
53
+ function Ye({ title: t, titleAs: r = "h1", titleDataTest: o, titleRef: a, subtitle: l, status: u, leading: h, onLeadingClick: I, leadingLabel: X, leadingSlot: W, actions: k = [], search: w, searchOpen: y = !1, onSearchClose: Y, searchCloseLabel: F, loading: f = !1, sticky: p = !1, locale: D = "en", className: U, dataTest: x = "page-header" }) {
54
+ const c = ue(D), { ref: S, widthPx: N } = se(), { register: g, widths: i } = re(), T = E(null), C = E(null), B = E(null), n = N > 0 && N < Ne, V = we([T, a]), A = y && w != null, b = f || A;
55
+ xe(w != null, y, B, T);
53
56
  const v = be(p, C);
54
- xe(p, S);
55
- const Z = fe(T, t, !g), L = G(() => k.filter((d) => !d.hidden).map(Le), [k]), B = Math.max(0, N - Te), H = h != null || W != null, M = u != null, q = H ? r["slot:leading"] ?? 0 : 0, J = M ? r["slot:status"] ?? 0 : 0, Q = r.title ?? 0, ee = Math.max(Ae, Math.min(Q, Math.floor(B * 0.5))), te = 1 + (H ? 1 : 0) + (M ? 1 : 0), K = Math.max(0, B - q - J - ee - Ne * te), ae = G(() => se({
57
+ ge(p, S);
58
+ const Z = pe(T, t, !b), L = G(() => k.filter((d) => !d.hidden).map(Me), [k]), $ = Math.max(0, N - Ae), H = h != null || W != null, M = u != null, q = H ? i["slot:leading"] ?? 0 : 0, J = M ? i["slot:status"] ?? 0 : 0, Q = i.title ?? 0, ee = Math.max(Le, Math.min(Q, Math.floor($ * 0.5))), te = 1 + (H ? 1 : 0) + (M ? 1 : 0), K = Math.max(0, $ - q - J - ee - Te * te), ae = G(() => ce({
56
59
  actions: L,
57
60
  availableWidth: K,
58
61
  collapseLabels: !0,
59
- resolveActionWidth: (d, _) => r[z(d.id, _)],
60
- moreButtonWidthPx: r[ue]
62
+ resolveActionWidth: (d, R) => i[z(d.id, R)],
63
+ moreButtonWidthPx: i[he]
61
64
  }), [
62
65
  L,
63
66
  K,
64
- r
65
- ]), R = X ?? (h === "menu" ? c.menu : c.back), O = W ?? (h === "menu" ? /* @__PURE__ */ e(E, {
67
+ i
68
+ ]), P = X ?? (h === "menu" ? c.menu : c.back), O = W ?? (h === "menu" ? /* @__PURE__ */ e(_, {
66
69
  dataTest: `${x}-menu`,
67
70
  variant: "text",
68
71
  size: "large",
69
- onClick: P,
70
- "aria-label": R,
71
- startIcon: /* @__PURE__ */ e(le, {
72
+ onClick: I,
73
+ "aria-label": P,
74
+ startIcon: /* @__PURE__ */ e(oe, {
72
75
  width: 24,
73
76
  height: 24
74
77
  })
75
- }) : h === "back" ? /* @__PURE__ */ e(E, {
78
+ }) : h === "back" ? /* @__PURE__ */ e(_, {
76
79
  dataTest: `${x}-back`,
77
80
  variant: n ? "text" : "outlined",
78
81
  size: "large",
79
- onClick: P,
80
- "aria-label": n ? R : void 0,
82
+ onClick: I,
83
+ "aria-label": n ? P : void 0,
81
84
  startIcon: /* @__PURE__ */ e(ie, {
82
85
  width: n ? 24 : 20,
83
86
  height: n ? 24 : 20
84
87
  }),
85
- children: n ? void 0 : R
86
- }) : null), j = n || v, ne = t === "" ? null : /* @__PURE__ */ e(s, {
88
+ children: n ? void 0 : P
89
+ }) : null), j = n || v, ne = t === "" ? null : /* @__PURE__ */ e(r, {
87
90
  ref: V,
88
91
  tabIndex: -1,
89
- "data-test": i,
90
- "data-testid": i,
92
+ "data-test": o,
93
+ "data-testid": o,
91
94
  title: Z ? t : void 0,
92
95
  className: m("m-0 line-clamp-2 min-w-0 break-words font-semibold text-delta-800 outline-none", j ? "text-xl leading-7" : "text-2xl leading-8"),
93
96
  children: t
94
97
  });
95
- return /* @__PURE__ */ l(ge, { children: [p && /* @__PURE__ */ e("div", {
98
+ return /* @__PURE__ */ s(ve, { children: [p && /* @__PURE__ */ e("div", {
96
99
  ref: C,
97
100
  "aria-hidden": !0,
98
101
  className: "h-px w-full",
99
102
  style: { marginBottom: -1 }
100
- }), /* @__PURE__ */ l("div", {
103
+ }), /* @__PURE__ */ s("div", {
101
104
  ref: S,
102
105
  "data-testid": x,
103
106
  "data-compact": n ? "true" : "false",
@@ -105,40 +108,40 @@ function Ge({ title: t, titleAs: s = "h1", titleDataTest: i, titleRef: a, subtit
105
108
  "aria-busy": f || void 0,
106
109
  className: m("flex w-full items-center gap-2 px-4", v ? "min-h-[56px] py-2 shadow-sm" : "min-h-[64px] py-3", p && "sticky top-0 z-30 bg-delta-50", U),
107
110
  children: [
108
- /* @__PURE__ */ e(he, {
111
+ /* @__PURE__ */ e(fe, {
109
112
  actions: L,
110
- register: b,
113
+ register: g,
111
114
  overflowMenuLabel: c.more,
112
115
  title: t,
113
116
  titleClassName: m("font-semibold", j ? "text-xl leading-7" : "text-2xl leading-8")
114
117
  }),
115
118
  O != null && /* @__PURE__ */ e("span", {
116
- ref: b("slot:leading"),
119
+ ref: g("slot:leading"),
117
120
  className: "inline-flex shrink-0",
118
121
  children: O
119
122
  }),
120
- /* @__PURE__ */ l("div", {
121
- className: m(g ? "sr-only" : "flex min-w-0 flex-1 flex-col justify-center"),
122
- children: [/* @__PURE__ */ l("div", {
123
+ /* @__PURE__ */ s("div", {
124
+ className: m(b ? "sr-only" : "flex min-w-0 flex-1 flex-col justify-center"),
125
+ children: [/* @__PURE__ */ s("div", {
123
126
  className: "flex min-w-0 items-center gap-2",
124
- children: [ne, M && !g && /* @__PURE__ */ e("span", {
125
- ref: b("slot:status"),
127
+ children: [ne, M && !b && /* @__PURE__ */ e("span", {
128
+ ref: g("slot:status"),
126
129
  className: "inline-flex shrink-0 items-center",
127
130
  children: u
128
131
  })]
129
- }), !g && o != null && !v && /* @__PURE__ */ e("div", {
132
+ }), !b && l != null && !v && /* @__PURE__ */ e("div", {
130
133
  className: "mt-0.5 min-w-0 text-sm text-delta-700",
131
- children: o
134
+ children: l
132
135
  })]
133
136
  }),
134
- f && /* @__PURE__ */ e(Me, { compact: n }),
135
- A && /* @__PURE__ */ l("div", {
136
- ref: $,
137
+ f && /* @__PURE__ */ e(Pe, { compact: n }),
138
+ A && /* @__PURE__ */ s("div", {
139
+ ref: B,
137
140
  className: "flex w-full min-w-0 items-center gap-2",
138
141
  children: [/* @__PURE__ */ e("div", {
139
142
  className: "min-w-0 flex-1",
140
143
  children: w
141
- }), /* @__PURE__ */ e(E, {
144
+ }), /* @__PURE__ */ e(_, {
142
145
  dataTest: `${x}-search-close`,
143
146
  variant: "text",
144
147
  size: "large",
@@ -146,14 +149,14 @@ function Ge({ title: t, titleAs: s = "h1", titleDataTest: i, titleRef: a, subtit
146
149
  children: F ?? c.close
147
150
  })]
148
151
  }),
149
- !f && !A && /* @__PURE__ */ e(de, {
152
+ !f && !A && /* @__PURE__ */ e(me, {
150
153
  plan: ae,
151
154
  overflowMenuLabel: c.more,
152
- registerActionWidth: (d, _) => b(z(d, _))
155
+ registerActionWidth: (d, R) => g(z(d, R))
153
156
  })
154
157
  ]
155
158
  })] });
156
159
  }
157
160
  export {
158
- Ge as PageHeader
161
+ Ye as PageHeader
159
162
  };
@@ -1,10 +1,11 @@
1
- import { resolveSx as n } from "../../../helpers/sx.js";
2
- import C from "clsx";
3
- import { jsx as O, jsxs as A } from "react/jsx-runtime";
4
- var c = {
1
+ import { resolveSx as p } from "../../../helpers/sx.js";
2
+ import E from "clsx";
3
+ import { useEffect as L, useRef as u } from "react";
4
+ import { jsx as m, jsxs as D } from "react/jsx-runtime";
5
+ var b = {
5
6
  primary: {
6
- backgroundColor: "var(--colors-gama-500)",
7
- color: "#fff"
7
+ backgroundColor: "var(--colors-badge-background)",
8
+ color: "var(--colors-badge-label)"
8
9
  },
9
10
  default: {
10
11
  backgroundColor: "var(--colors-delta-200)",
@@ -30,29 +31,49 @@ var c = {
30
31
  backgroundColor: "var(--colors-warning-700)",
31
32
  color: "#fff"
32
33
  }
33
- }, L = {
34
+ }, $ = {
34
35
  "top-right": "top-0 right-0 translate-x-1/2 -translate-y-1/2 origin-[100%_0%]",
35
36
  "top-left": "top-0 left-0 -translate-x-1/2 -translate-y-1/2 origin-[0%_0%]",
36
37
  "bottom-right": "bottom-0 right-0 translate-x-1/2 translate-y-1/2 origin-[100%_100%]",
37
38
  "bottom-left": "bottom-0 left-0 -translate-x-1/2 translate-y-1/2 origin-[0%_100%]"
38
- }, i = "& .MuiBadge-badge", T = ({ color: f = "primary", dataTest: d, size: p = "medium", badgeContent: o, max: e = 99, showZero: m = !1, variant: x = "standard", invisible: u, anchorOrigin: l, children: g, className: b, sx: r, overlap: N, classes: $, slots: z, slotProps: a, component: B, ...v }) => {
39
- const s = r && typeof r == "object" && !Array.isArray(r) ? r : {}, y = n(s[i]), h = n(Object.fromEntries(Object.entries(s).filter(([j]) => j !== i))), t = x === "dot", _ = !!u || !t && (o === 0 || o === void 0 || o === null) && !m, w = t ? null : typeof o == "number" && o > e ? `${e}+` : o, S = l?.vertical ?? "top", k = l?.horizontal ?? "right";
40
- return /* @__PURE__ */ A("span", {
39
+ }, x = "& .MuiBadge-badge", J = ({ color: l = "primary", dataTest: v, size: s = "medium", badgeContent: r, max: z, showZero: I, variant: y = "standard", statusMessage: n, invisible: g, anchorOrigin: c, children: h, className: _, sx: t, overlap: T, classes: Z, slots: G, slotProps: i, component: H, tabIndex: W, ...S }) => {
40
+ const a = u(null), e = typeof r == "number" ? r : void 0, d = u(e);
41
+ L(() => {
42
+ e !== d.current && (d.current = e, a.current && (a.current.textContent = n ?? ""));
43
+ }, [e, n]);
44
+ const f = t && typeof t == "object" && !Array.isArray(t) ? t : {}, w = p(f[x]), k = p(Object.fromEntries(Object.entries(f).filter(([B]) => B !== x))), o = y === "dot", j = !!g || !o && (r === 0 || r === void 0 || r === null), O = o ? null : typeof r == "number" && r > 99 ? "99+" : r, A = typeof r == "number" && r > 0 && r < 10, C = c?.vertical ?? "top", N = c?.horizontal ?? "right", R = l === "primary" ? {
45
+ borderColor: o ? "var(--colors-badge-border-dot)" : "var(--colors-badge-border-count)",
46
+ borderStyle: "solid",
47
+ borderWidth: o ? "var(--border-badge-dot)" : "var(--border-badge-count)"
48
+ } : {};
49
+ return /* @__PURE__ */ D("span", {
41
50
  className: "relative inline-flex shrink-0 align-middle",
42
- "data-testid": d,
43
- style: h,
44
- ...v,
45
- children: [g, !_ && /* @__PURE__ */ O("span", {
46
- className: C("absolute z-[1] box-border flex flex-row flex-wrap content-center items-center justify-center whitespace-nowrap font-roboto font-semibold leading-none", L[`${S}-${k}`], t ? "h-[8px] w-[8px] min-w-[8px] rounded-full p-0" : p === "small" ? "h-[16px] w-max min-w-[16px] rounded-[20px] px-[4px] text-[0.75rem]" : "h-[20px] min-w-[20px] rounded-[20px] px-[6px] text-sm", b, a?.badge?.className),
47
- style: {
48
- ...c[f] ?? c.default,
49
- ...y,
50
- ...a?.badge?.style
51
- },
52
- children: w
53
- })]
51
+ "data-testid": v,
52
+ style: k,
53
+ ...S,
54
+ children: [
55
+ h,
56
+ !j && /* @__PURE__ */ m("span", {
57
+ "aria-hidden": "true",
58
+ className: E("absolute z-[1] box-border flex items-center justify-center whitespace-nowrap font-roboto font-semibold", $[`${C}-${N}`], o ? "h-[12px] w-[12px] min-w-[12px] rounded-full p-0" : s === "small" ? "h-[16px] w-max min-w-[16px] rounded-[20px] px-[4px] text-[0.75rem]" : "h-[20px] min-w-[20px] rounded-[20px] px-[6px] text-sm leading-5", !o && s === "medium" && A && "w-[20px]", _, i?.badge?.className),
59
+ style: {
60
+ ...b[l] ?? b.default,
61
+ ...R,
62
+ ...w,
63
+ ...i?.badge?.style
64
+ },
65
+ children: O
66
+ }),
67
+ /* @__PURE__ */ m("span", {
68
+ ref: a,
69
+ "aria-atomic": "true",
70
+ "aria-live": "polite",
71
+ className: "sr-only",
72
+ role: "status"
73
+ })
74
+ ]
54
75
  });
55
76
  };
56
77
  export {
57
- T as StyledBadge
78
+ J as StyledBadge
58
79
  };
@@ -2,19 +2,23 @@ import { CSSProperties, ElementType, HTMLAttributes, ReactNode } from 'react';
2
2
  type StyledBadgeSize = 'medium' | 'small';
3
3
  /**
4
4
  * @figmaNode wXrXt5uKNNzV2DnQCgyYZH#15181-43817
5
- * Figma "Badge". Number badge = solid gama-500 pill, white Helper-Semibold 14px (h20/px6/r20);
6
- * `dot` variant = 8px dot (Unread/Filters). `color` selects the badge palette (primary→teal number
7
- * badge, error→soft error-100/error-600); other colors are app extensions with no Figma type.
5
+ * Figma "Badge". Notification count = 20px lime pill with a 1px border and Helper-Semibold 14/20;
6
+ * `dot` = 12px lime circle with a stronger 2px border. Other colors and `small` are legacy app
7
+ * extensions with no matching Figma notification variant.
8
8
  */
9
9
  interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'> {
10
10
  /** @figmaProp Badge content (the number/label) */
11
11
  badgeContent?: ReactNode;
12
- /** @figmaProp Type/colour = primary→number badge (gama-500) | error→error-100/600 | others = app */
12
+ /** @figmaProp Type/colour = primary→notification badge | others = legacy app extensions */
13
13
  color?: string;
14
+ /** @deprecated Notification badges always cap at 99. */
14
15
  max?: number;
16
+ /** @deprecated A zero notification count is always omitted. */
15
17
  showZero?: boolean;
16
- /** @figmaProp Type = dot→"Unread/Filters" (8px) | standard→number badge */
18
+ /** @figmaProp Size = dot→"Dot" (12px) | standard→"Default" count badge */
17
19
  variant?: 'standard' | 'dot';
20
+ /** Polite live-update text. Keep this contextual and include the real, uncapped count. */
21
+ statusMessage?: string;
18
22
  invisible?: boolean;
19
23
  anchorOrigin?: {
20
24
  vertical: 'top' | 'bottom';
@@ -42,5 +46,5 @@ type StyledBadgeProps = BadgeProps & {
42
46
  * The established styling API `sx={{ '& .MuiBadge-badge': {...} }}` is preserved by extracting that
43
47
  * slot and applying `resolveSx` to the badge span (DEC-007 slot-sx). Signature unchanged (DEC-003).
44
48
  */
45
- export declare const StyledBadge: ({ color, dataTest, size, badgeContent, max, showZero, variant, invisible, anchorOrigin, children, className, sx, overlap: _overlap, classes: _classes, slots: _slots, slotProps, component: _component, ...props }: StyledBadgeProps) => JSX.Element;
49
+ export declare const StyledBadge: ({ color, dataTest, size, badgeContent, max: _max, showZero: _showZero, variant, statusMessage, invisible, anchorOrigin, children, className, sx, overlap: _overlap, classes: _classes, slots: _slots, slotProps, component: _component, tabIndex: _tabIndex, ...props }: StyledBadgeProps) => JSX.Element;
46
50
  export {};
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "3.81.5",
6
+ "version": "3.82.0",
7
7
  "type": "module",
8
8
  "sideEffects": [
9
9
  "**/*.css",
@@ -85,6 +85,14 @@
85
85
  --colors-lime-500: #beda2f;
86
86
  --colors-lime-700: #8ba01d;
87
87
 
88
+ /* Figma Badge semantic tokens are shared by all three ASMA themes. */
89
+ --colors-badge-background: #d9f256;
90
+ --colors-badge-label: #404d00;
91
+ --colors-badge-border-count: #a2c200;
92
+ --colors-badge-border-dot: #778f00;
93
+ --border-badge-count: 1px;
94
+ --border-badge-dot: 2px;
95
+
88
96
  --colors-success-50: #e9fbf0;
89
97
  --colors-success-100: #d3f8e1;
90
98
  --colors-success-300: #a1ebbd;