@tutti-os/commerce 0.0.233 → 0.0.235

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/README.md CHANGED
@@ -9,7 +9,11 @@ provide normalized data, labels, links, and callbacks.
9
9
 
10
10
  The Account shell (avatar, popover, sign-in/out, settings, and UID copy)
11
11
  belongs to each Host. `CommerceMenuContent` renders only membership, credits,
12
- and account-center rows.
12
+ and account-center rows. `AgentConfigCommerceContent` is the compact account,
13
+ clickable credits balance with inline refresh, membership, and account-center
14
+ presentation for an Agent config menu. Clicking Credits opens the Host-provided
15
+ `usageUrl`. The Host still supplies the account name, state, labels, refresh
16
+ command, and navigation.
13
17
 
14
18
  Host actions may be asynchronous. `CommerceMenuContent` catches rejected
15
19
  external-link actions and forwards them to the optional `onActionError`
@@ -21,6 +25,7 @@ import {
21
25
  resolveMembershipAction
22
26
  } from "@tutti-os/commerce";
23
27
  import {
28
+ AgentConfigCommerceContent,
24
29
  CommerceMenuContent,
25
30
  MembershipTierIcon
26
31
  } from "@tutti-os/commerce/react";
@@ -1,6 +1,26 @@
1
1
  import { a as CommerceMenuState, R as RegistrationCreditsToastState } from '../contracts-I0M2ZTJA.js';
2
2
  import * as react from 'react';
3
3
 
4
+ interface AgentConfigCommerceLabels {
5
+ account: string;
6
+ membership: string;
7
+ creditsBalance: string;
8
+ refresh: string;
9
+ refreshing: string;
10
+ freeMembership: string;
11
+ accountCenter: string;
12
+ loading: string;
13
+ unavailable: string;
14
+ dataUnavailable: string;
15
+ }
16
+ interface AgentConfigCommerceContentProps {
17
+ accountName: string | null;
18
+ state: CommerceMenuState;
19
+ labels: AgentConfigCommerceLabels;
20
+ onRefresh(): void;
21
+ }
22
+ declare function AgentConfigCommerceContent({ accountName, state, labels, onRefresh }: AgentConfigCommerceContentProps): React.JSX.Element;
23
+
4
24
  interface CommerceMenuLabels {
5
25
  member: string;
6
26
  upgradeMembership: string;
@@ -43,4 +63,4 @@ interface RegistrationCreditsToastProps {
43
63
  }
44
64
  declare const RegistrationCreditsToast: react.NamedExoticComponent<RegistrationCreditsToastProps>;
45
65
 
46
- export { CommerceMenuContent, type CommerceMenuContentProps, type CommerceMenuLabels, MembershipBadge, type MembershipBadgeProps, MembershipTierIcon, type MembershipTierIconProps, RegistrationCreditsToast, type RegistrationCreditsToastLabels, type RegistrationCreditsToastProps };
66
+ export { AgentConfigCommerceContent, type AgentConfigCommerceContentProps, type AgentConfigCommerceLabels, CommerceMenuContent, type CommerceMenuContentProps, type CommerceMenuLabels, MembershipBadge, type MembershipBadgeProps, MembershipTierIcon, type MembershipTierIconProps, RegistrationCreditsToast, type RegistrationCreditsToastLabels, type RegistrationCreditsToastProps };
@@ -3,21 +3,29 @@ import {
3
3
  resolveMembershipTierVisual
4
4
  } from "../chunk-L6YQE3QG.js";
5
5
 
6
- // src/react/CommerceMenuContent.tsx
7
- import { useCallback } from "react";
6
+ // src/react/AgentConfigCommerceContent.tsx
8
7
  import {
9
8
  BillingIcon,
10
9
  CreditsIcon,
11
10
  LaunchIcon,
11
+ RefreshIcon,
12
12
  UserLinedIcon
13
13
  } from "@tutti-os/ui-system";
14
- import { jsx, jsxs } from "react/jsx-runtime";
15
- function CommerceMenuContent({
16
- state,
17
- labels
18
- }) {
19
- const creditsLabel = state.loading && !state.creditsLabel ? labels.loading : state.creditsLabel ?? labels.unavailable;
20
- const openExternal = useCallback(
14
+
15
+ // src/react/commerceMenuPresentation.ts
16
+ import { useCallback } from "react";
17
+ function resolveCommerceMembershipActionLabel(state, labels) {
18
+ switch (resolveMembershipAction(state.membershipAccess)) {
19
+ case "upgrade-membership":
20
+ return labels.upgradeMembership;
21
+ case "recharge-credits":
22
+ return labels.rechargeCredits;
23
+ case "view-credit-plans":
24
+ return labels.viewCreditPlans;
25
+ }
26
+ }
27
+ function useCommerceOpenExternal(state) {
28
+ return useCallback(
21
29
  (url) => {
22
30
  if (!url.trim()) {
23
31
  return;
@@ -35,9 +43,160 @@ function CommerceMenuContent({
35
43
  },
36
44
  [state]
37
45
  );
38
- const membershipActionLabel = resolveMembershipActionLabel(state, labels);
39
- return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col", "data-testid": "commerce-menu-content", children: [
40
- /* @__PURE__ */ jsxs(
46
+ }
47
+
48
+ // src/react/AgentConfigCommerceContent.tsx
49
+ import { jsx, jsxs } from "react/jsx-runtime";
50
+ var menuItemBaseClassName = "nodrag flex h-7 items-center gap-2 rounded-[6px] text-[13px] text-[var(--text-primary)] transition-colors hover:bg-[var(--transparency-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)] disabled:cursor-not-allowed disabled:text-[var(--text-disabled)] disabled:hover:bg-transparent [-webkit-app-region:no-drag]";
51
+ var menuItemClassName = `${menuItemBaseClassName} w-full px-2`;
52
+ function AgentConfigCommerceContent({
53
+ accountName,
54
+ state,
55
+ labels,
56
+ onRefresh
57
+ }) {
58
+ const openExternal = useCommerceOpenExternal(state);
59
+ const accountNameLabel = accountName?.trim() || (state.loading ? labels.loading : labels.unavailable);
60
+ const creditsLabel = state.loading && !state.creditsLabel ? labels.loading : state.creditsLabel ?? labels.unavailable;
61
+ const membershipLabel = state.membershipLabel.trim() || (state.membershipAccess === "free" ? labels.freeMembership : state.loading ? labels.loading : labels.unavailable);
62
+ return /* @__PURE__ */ jsxs(
63
+ "div",
64
+ {
65
+ className: "flex min-w-0 flex-col gap-1",
66
+ "data-testid": "agent-config-commerce-content",
67
+ children: [
68
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1 p-2", children: [
69
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
70
+ /* @__PURE__ */ jsx(UserLinedIcon, { "aria-hidden": "true", size: 16 }),
71
+ /* @__PURE__ */ jsx("span", { className: "truncate text-[13px] font-semibold leading-4", children: labels.account })
72
+ ] }),
73
+ /* @__PURE__ */ jsx("span", { className: "truncate pl-6 text-[13px] leading-5 text-[var(--text-secondary)]", children: accountNameLabel })
74
+ ] }),
75
+ /* @__PURE__ */ jsx("div", { className: "px-2", children: /* @__PURE__ */ jsx("span", { className: "block h-px bg-[var(--border-1)]" }) }),
76
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center", children: [
77
+ /* @__PURE__ */ jsxs(
78
+ "button",
79
+ {
80
+ type: "button",
81
+ className: `${menuItemBaseClassName} min-w-0 flex-1 px-2`,
82
+ disabled: !state.links.usageUrl.trim(),
83
+ "aria-label": `${labels.creditsBalance} ${creditsLabel}`,
84
+ onClick: () => openExternal(state.links.usageUrl),
85
+ children: [
86
+ /* @__PURE__ */ jsx(CreditsIcon, { "aria-hidden": "true", size: 16 }),
87
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.creditsBalance }),
88
+ /* @__PURE__ */ jsx(
89
+ "span",
90
+ {
91
+ className: "max-w-[120px] truncate text-[var(--text-secondary)] tabular-nums",
92
+ "data-testid": "agent-config-commerce-credits",
93
+ "aria-live": "polite",
94
+ children: creditsLabel
95
+ }
96
+ )
97
+ ]
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsxs(
101
+ "button",
102
+ {
103
+ type: "button",
104
+ className: `${menuItemBaseClassName} shrink-0 px-2`,
105
+ "data-testid": "agent-config-commerce-refresh",
106
+ disabled: state.loading,
107
+ "aria-label": state.loading ? labels.refreshing : labels.refresh,
108
+ onClick: onRefresh,
109
+ children: [
110
+ /* @__PURE__ */ jsx(
111
+ RefreshIcon,
112
+ {
113
+ "aria-hidden": "true",
114
+ className: state.loading ? "motion-safe:animate-spin" : void 0,
115
+ size: 14
116
+ }
117
+ ),
118
+ /* @__PURE__ */ jsx("span", { children: state.loading ? labels.refreshing : labels.refresh })
119
+ ]
120
+ }
121
+ )
122
+ ] }),
123
+ /* @__PURE__ */ jsxs(
124
+ "button",
125
+ {
126
+ type: "button",
127
+ className: menuItemClassName,
128
+ disabled: !state.links.planUrl.trim(),
129
+ "aria-label": `${labels.membership} ${membershipLabel}`,
130
+ onClick: () => openExternal(state.links.planUrl),
131
+ children: [
132
+ /* @__PURE__ */ jsx(BillingIcon, { "aria-hidden": "true", size: 16 }),
133
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.membership }),
134
+ /* @__PURE__ */ jsx("span", { className: "max-w-[72px] truncate text-[var(--text-secondary)]", children: membershipLabel }),
135
+ /* @__PURE__ */ jsx(
136
+ LaunchIcon,
137
+ {
138
+ "aria-hidden": "true",
139
+ className: "text-[var(--text-secondary)]",
140
+ size: 14
141
+ }
142
+ )
143
+ ]
144
+ }
145
+ ),
146
+ /* @__PURE__ */ jsxs(
147
+ "button",
148
+ {
149
+ type: "button",
150
+ className: menuItemClassName,
151
+ disabled: !state.links.settingsUrl.trim(),
152
+ onClick: () => openExternal(state.links.settingsUrl),
153
+ children: [
154
+ /* @__PURE__ */ jsx(UserLinedIcon, { "aria-hidden": "true", size: 16 }),
155
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.accountCenter }),
156
+ /* @__PURE__ */ jsx(
157
+ LaunchIcon,
158
+ {
159
+ "aria-hidden": "true",
160
+ className: "text-[var(--text-secondary)]",
161
+ size: 14
162
+ }
163
+ )
164
+ ]
165
+ }
166
+ ),
167
+ state.dataUnavailable ? /* @__PURE__ */ jsx(
168
+ "span",
169
+ {
170
+ className: "px-2 py-1 text-[11px] leading-4 text-[var(--state-danger)]",
171
+ role: "status",
172
+ children: labels.dataUnavailable
173
+ }
174
+ ) : null
175
+ ]
176
+ }
177
+ );
178
+ }
179
+
180
+ // src/react/CommerceMenuContent.tsx
181
+ import {
182
+ BillingIcon as BillingIcon2,
183
+ CreditsIcon as CreditsIcon2,
184
+ LaunchIcon as LaunchIcon2,
185
+ UserLinedIcon as UserLinedIcon2
186
+ } from "@tutti-os/ui-system";
187
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
188
+ function CommerceMenuContent({
189
+ state,
190
+ labels
191
+ }) {
192
+ const creditsLabel = state.loading && !state.creditsLabel ? labels.loading : state.creditsLabel ?? labels.unavailable;
193
+ const openExternal = useCommerceOpenExternal(state);
194
+ const membershipActionLabel = resolveCommerceMembershipActionLabel(
195
+ state,
196
+ labels
197
+ );
198
+ return /* @__PURE__ */ jsxs2("div", { className: "flex min-w-0 flex-col", "data-testid": "commerce-menu-content", children: [
199
+ /* @__PURE__ */ jsxs2(
41
200
  "button",
42
201
  {
43
202
  type: "button",
@@ -45,13 +204,13 @@ function CommerceMenuContent({
45
204
  disabled: !state.links.planUrl.trim(),
46
205
  onClick: () => openExternal(state.links.planUrl),
47
206
  children: [
48
- /* @__PURE__ */ jsx(BillingIcon, { "aria-hidden": "true", size: 15 }),
49
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.member }),
50
- /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[12px] text-[var(--tutti-purple)]", children: membershipActionLabel })
207
+ /* @__PURE__ */ jsx2(BillingIcon2, { "aria-hidden": "true", size: 15 }),
208
+ /* @__PURE__ */ jsx2("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.member }),
209
+ /* @__PURE__ */ jsx2("span", { className: "shrink-0 text-[12px] text-[var(--tutti-purple)]", children: membershipActionLabel })
51
210
  ]
52
211
  }
53
212
  ),
54
- /* @__PURE__ */ jsxs(
213
+ /* @__PURE__ */ jsxs2(
55
214
  "button",
56
215
  {
57
216
  type: "button",
@@ -59,13 +218,13 @@ function CommerceMenuContent({
59
218
  disabled: !state.links.usageUrl.trim(),
60
219
  onClick: () => openExternal(state.links.usageUrl),
61
220
  children: [
62
- /* @__PURE__ */ jsx(CreditsIcon, { "aria-hidden": "true", size: 15 }),
63
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.creditsBalance }),
64
- /* @__PURE__ */ jsx("span", { className: "truncate text-[var(--text-secondary)]", children: creditsLabel })
221
+ /* @__PURE__ */ jsx2(CreditsIcon2, { "aria-hidden": "true", size: 15 }),
222
+ /* @__PURE__ */ jsx2("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.creditsBalance }),
223
+ /* @__PURE__ */ jsx2("span", { className: "truncate text-[var(--text-secondary)]", children: creditsLabel })
65
224
  ]
66
225
  }
67
226
  ),
68
- /* @__PURE__ */ jsxs(
227
+ /* @__PURE__ */ jsxs2(
69
228
  "button",
70
229
  {
71
230
  type: "button",
@@ -73,10 +232,10 @@ function CommerceMenuContent({
73
232
  disabled: !state.links.settingsUrl.trim(),
74
233
  onClick: () => openExternal(state.links.settingsUrl),
75
234
  children: [
76
- /* @__PURE__ */ jsx(UserLinedIcon, { "aria-hidden": "true", size: 15 }),
77
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.accountCenter }),
78
- /* @__PURE__ */ jsx(
79
- LaunchIcon,
235
+ /* @__PURE__ */ jsx2(UserLinedIcon2, { "aria-hidden": "true", size: 15 }),
236
+ /* @__PURE__ */ jsx2("span", { className: "min-w-0 flex-1 truncate text-left", children: labels.accountCenter }),
237
+ /* @__PURE__ */ jsx2(
238
+ LaunchIcon2,
80
239
  {
81
240
  "aria-hidden": "true",
82
241
  className: "text-[var(--text-secondary)]",
@@ -86,29 +245,19 @@ function CommerceMenuContent({
86
245
  ]
87
246
  }
88
247
  ),
89
- state.dataUnavailable ? /* @__PURE__ */ jsx("span", { className: "px-2 py-1 text-[11px] leading-4 text-[var(--text-danger)]", children: labels.dataUnavailable }) : null
248
+ state.dataUnavailable ? /* @__PURE__ */ jsx2("span", { className: "px-2 py-1 text-[11px] leading-4 text-[var(--text-danger)]", children: labels.dataUnavailable }) : null
90
249
  ] });
91
250
  }
92
- function resolveMembershipActionLabel(state, labels) {
93
- switch (resolveMembershipAction(state.membershipAccess)) {
94
- case "upgrade-membership":
95
- return labels.upgradeMembership;
96
- case "recharge-credits":
97
- return labels.rechargeCredits;
98
- case "view-credit-plans":
99
- return labels.viewCreditPlans;
100
- }
101
- }
102
251
 
103
252
  // src/react/MembershipBadge.tsx
104
- import { BillingIcon as BillingIcon2 } from "@tutti-os/ui-system";
253
+ import { BillingIcon as BillingIcon3 } from "@tutti-os/ui-system";
105
254
 
106
255
  // src/react/MembershipTierIcon.tsx
107
256
  import freeIconUrl from "@tutti-os/commerce/assets/star-free.png";
108
257
  import liteIconUrl from "@tutti-os/commerce/assets/star-lite.png";
109
258
  import proIconUrl from "@tutti-os/commerce/assets/star-pro.png";
110
259
  import ultraIconUrl from "@tutti-os/commerce/assets/star-ultra.png";
111
- import { jsx as jsx2 } from "react/jsx-runtime";
260
+ import { jsx as jsx3 } from "react/jsx-runtime";
112
261
  var ICON_URLS = {
113
262
  free: freeIconUrl,
114
263
  lite: liteIconUrl,
@@ -123,7 +272,7 @@ function MembershipTierIcon({
123
272
  if (!visual) {
124
273
  return null;
125
274
  }
126
- return /* @__PURE__ */ jsx2(
275
+ return /* @__PURE__ */ jsx3(
127
276
  "img",
128
277
  {
129
278
  alt: "",
@@ -137,26 +286,26 @@ function MembershipTierIcon({
137
286
  }
138
287
 
139
288
  // src/react/MembershipBadge.tsx
140
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
289
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
141
290
  function MembershipBadge({
142
291
  label,
143
292
  tierKey = null,
144
293
  className = ""
145
294
  }) {
146
- return /* @__PURE__ */ jsxs2(
295
+ return /* @__PURE__ */ jsxs3(
147
296
  "span",
148
297
  {
149
298
  className: `inline-flex max-w-full items-center gap-1 rounded-[5px] py-0.5 text-[11px] font-normal leading-3 text-[var(--text-secondary)] ${className}`,
150
299
  "data-commerce-membership-badge": "true",
151
300
  children: [
152
- tierKey ? /* @__PURE__ */ jsx3(
301
+ tierKey ? /* @__PURE__ */ jsx4(
153
302
  MembershipTierIcon,
154
303
  {
155
304
  className: "size-3.5 shrink-0 object-contain",
156
305
  tierKey
157
306
  }
158
- ) : /* @__PURE__ */ jsx3(BillingIcon2, { "aria-hidden": "true", size: 11 }),
159
- /* @__PURE__ */ jsx3("span", { className: "min-w-0 truncate", children: label })
307
+ ) : /* @__PURE__ */ jsx4(BillingIcon3, { "aria-hidden": "true", size: 11 }),
308
+ /* @__PURE__ */ jsx4("span", { className: "min-w-0 truncate", children: label })
160
309
  ]
161
310
  }
162
311
  );
@@ -165,8 +314,8 @@ function MembershipBadge({
165
314
  // src/react/RegistrationCreditsToast.tsx
166
315
  import { memo, useEffect } from "react";
167
316
  import registrationCreditsBackgroundUrl from "@tutti-os/commerce/assets/registration-credits-bg.png";
168
- import { CloseIcon, CreditsIcon as CreditsIcon2 } from "@tutti-os/ui-system";
169
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
317
+ import { CloseIcon, CreditsIcon as CreditsIcon3 } from "@tutti-os/ui-system";
318
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
170
319
  var defaultAutoDismissMs = 12e4;
171
320
  var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
172
321
  toast,
@@ -186,7 +335,7 @@ var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
186
335
  if (!toast.visible) {
187
336
  return null;
188
337
  }
189
- return /* @__PURE__ */ jsxs3(
338
+ return /* @__PURE__ */ jsxs4(
190
339
  "div",
191
340
  {
192
341
  className: "nodrag relative mx-3 mb-1 w-[calc(100%-24px)] max-w-[calc(100%-24px)] overflow-hidden rounded-[14px] border border-[rgba(218,233,255,0.62)] p-2.5 pr-9 text-white shadow-[0_14px_28px_rgba(0,0,0,0.2),inset_0_0_0_1px_rgba(255,255,255,0.24)] [-webkit-app-region:no-drag]",
@@ -201,28 +350,28 @@ var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
201
350
  backgroundSize: "cover"
202
351
  },
203
352
  children: [
204
- /* @__PURE__ */ jsx4("div", { className: "pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-white/90 to-transparent" }),
205
- /* @__PURE__ */ jsxs3("div", { className: "relative flex min-w-0 items-center gap-2.5", children: [
206
- /* @__PURE__ */ jsx4("span", { className: "grid h-10 w-10 shrink-0 place-items-center rounded-[12px] bg-[rgba(250,255,236,0.78)] text-emerald-400 shadow-[0_9px_18px_rgba(20,184,166,0.18),0_0_0_1px_rgba(255,255,255,0.5)_inset]", children: /* @__PURE__ */ jsx4(CreditsIcon2, { "aria-hidden": "true", size: 23 }) }),
207
- /* @__PURE__ */ jsxs3("span", { className: "min-w-0 flex-1", children: [
208
- /* @__PURE__ */ jsx4("span", { className: "block truncate text-[12px] font-semibold leading-4 text-white", children: labels.title }),
209
- /* @__PURE__ */ jsxs3("span", { className: "block truncate text-[20px] font-semibold leading-6 text-white", children: [
353
+ /* @__PURE__ */ jsx5("div", { className: "pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-white/90 to-transparent" }),
354
+ /* @__PURE__ */ jsxs4("div", { className: "relative flex min-w-0 items-center gap-2.5", children: [
355
+ /* @__PURE__ */ jsx5("span", { className: "grid h-10 w-10 shrink-0 place-items-center rounded-[12px] bg-[rgba(250,255,236,0.78)] text-emerald-400 shadow-[0_9px_18px_rgba(20,184,166,0.18),0_0_0_1px_rgba(255,255,255,0.5)_inset]", children: /* @__PURE__ */ jsx5(CreditsIcon3, { "aria-hidden": "true", size: 23 }) }),
356
+ /* @__PURE__ */ jsxs4("span", { className: "min-w-0 flex-1", children: [
357
+ /* @__PURE__ */ jsx5("span", { className: "block truncate text-[12px] font-semibold leading-4 text-white", children: labels.title }),
358
+ /* @__PURE__ */ jsxs4("span", { className: "block truncate text-[20px] font-semibold leading-6 text-white", children: [
210
359
  "+",
211
360
  toast.creditsLabel,
212
361
  " ",
213
362
  labels.creditsUnit
214
363
  ] }),
215
- /* @__PURE__ */ jsx4("span", { className: "block truncate text-[11px] font-medium leading-4 text-white/88", children: labels.description })
364
+ /* @__PURE__ */ jsx5("span", { className: "block truncate text-[11px] font-medium leading-4 text-white/88", children: labels.description })
216
365
  ] })
217
366
  ] }),
218
- /* @__PURE__ */ jsx4(
367
+ /* @__PURE__ */ jsx5(
219
368
  "button",
220
369
  {
221
370
  type: "button",
222
371
  "aria-label": labels.close,
223
372
  className: "nodrag absolute right-2.5 top-2.5 grid h-6 w-6 place-items-center rounded-[7px] text-white/85 hover:bg-white/18 hover:text-white [-webkit-app-region:no-drag]",
224
373
  onClick: toast.onDismiss,
225
- children: /* @__PURE__ */ jsx4(CloseIcon, { "aria-hidden": "true", size: 16 })
374
+ children: /* @__PURE__ */ jsx5(CloseIcon, { "aria-hidden": "true", size: 16 })
226
375
  }
227
376
  )
228
377
  ]
@@ -230,6 +379,7 @@ var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
230
379
  );
231
380
  });
232
381
  export {
382
+ AgentConfigCommerceContent,
233
383
  CommerceMenuContent,
234
384
  MembershipBadge,
235
385
  MembershipTierIcon,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/CommerceMenuContent.tsx","../../src/react/MembershipBadge.tsx","../../src/react/MembershipTierIcon.tsx","../../src/react/RegistrationCreditsToast.tsx"],"sourcesContent":["import { useCallback } from \"react\";\nimport {\n BillingIcon,\n CreditsIcon,\n LaunchIcon,\n UserLinedIcon\n} from \"@tutti-os/ui-system\";\nimport { resolveMembershipAction, type CommerceMenuState } from \"../index\";\n\nexport interface CommerceMenuLabels {\n member: string;\n upgradeMembership: string;\n rechargeCredits: string;\n viewCreditPlans: string;\n creditsBalance: string;\n accountCenter: string;\n loading: string;\n unavailable: string;\n dataUnavailable: string;\n}\n\nexport interface CommerceMenuContentProps {\n state: CommerceMenuState;\n labels: CommerceMenuLabels;\n}\n\nexport function CommerceMenuContent({\n state,\n labels\n}: CommerceMenuContentProps): React.JSX.Element {\n const creditsLabel =\n state.loading && !state.creditsLabel\n ? labels.loading\n : (state.creditsLabel ?? labels.unavailable);\n const openExternal = useCallback(\n (url: string) => {\n if (!url.trim()) {\n return;\n }\n try {\n const result = state.onOpenExternal(url);\n if (result) {\n void result.catch((error: unknown) => {\n state.onActionError?.(error);\n });\n }\n } catch (error) {\n state.onActionError?.(error);\n }\n },\n [state]\n );\n const membershipActionLabel = resolveMembershipActionLabel(state, labels);\n\n return (\n <div className=\"flex min-w-0 flex-col\" data-testid=\"commerce-menu-content\">\n <button\n type=\"button\"\n className=\"nodrag flex h-8 items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] disabled:cursor-not-allowed disabled:opacity-50 [-webkit-app-region:no-drag]\"\n disabled={!state.links.planUrl.trim()}\n onClick={() => openExternal(state.links.planUrl)}\n >\n <BillingIcon aria-hidden=\"true\" size={15} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.member}\n </span>\n <span className=\"shrink-0 text-[12px] text-[var(--tutti-purple)]\">\n {membershipActionLabel}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"nodrag flex h-8 items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] disabled:cursor-not-allowed disabled:opacity-50 [-webkit-app-region:no-drag]\"\n disabled={!state.links.usageUrl.trim()}\n onClick={() => openExternal(state.links.usageUrl)}\n >\n <CreditsIcon aria-hidden=\"true\" size={15} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.creditsBalance}\n </span>\n <span className=\"truncate text-[var(--text-secondary)]\">\n {creditsLabel}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"nodrag flex h-8 items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] disabled:cursor-not-allowed disabled:opacity-50 [-webkit-app-region:no-drag]\"\n disabled={!state.links.settingsUrl.trim()}\n onClick={() => openExternal(state.links.settingsUrl)}\n >\n <UserLinedIcon aria-hidden=\"true\" size={15} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.accountCenter}\n </span>\n <LaunchIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-secondary)]\"\n size={14}\n />\n </button>\n {state.dataUnavailable ? (\n <span className=\"px-2 py-1 text-[11px] leading-4 text-[var(--text-danger)]\">\n {labels.dataUnavailable}\n </span>\n ) : null}\n </div>\n );\n}\n\nfunction resolveMembershipActionLabel(\n state: CommerceMenuState,\n labels: Pick<\n CommerceMenuLabels,\n \"upgradeMembership\" | \"rechargeCredits\" | \"viewCreditPlans\"\n >\n): string {\n switch (resolveMembershipAction(state.membershipAccess)) {\n case \"upgrade-membership\":\n return labels.upgradeMembership;\n case \"recharge-credits\":\n return labels.rechargeCredits;\n case \"view-credit-plans\":\n return labels.viewCreditPlans;\n }\n}\n","import { BillingIcon } from \"@tutti-os/ui-system\";\nimport { MembershipTierIcon } from \"./MembershipTierIcon\";\n\nexport interface MembershipBadgeProps {\n label: string;\n tierKey?: string | null;\n className?: string;\n}\n\nexport function MembershipBadge({\n label,\n tierKey = null,\n className = \"\"\n}: MembershipBadgeProps): React.JSX.Element {\n return (\n <span\n className={`inline-flex max-w-full items-center gap-1 rounded-[5px] py-0.5 text-[11px] font-normal leading-3 text-[var(--text-secondary)] ${className}`}\n data-commerce-membership-badge=\"true\"\n >\n {tierKey ? (\n <MembershipTierIcon\n className=\"size-3.5 shrink-0 object-contain\"\n tierKey={tierKey}\n />\n ) : (\n <BillingIcon aria-hidden=\"true\" size={11} />\n )}\n <span className=\"min-w-0 truncate\">{label}</span>\n </span>\n );\n}\n","import freeIconUrl from \"@tutti-os/commerce/assets/star-free.png\";\nimport liteIconUrl from \"@tutti-os/commerce/assets/star-lite.png\";\nimport proIconUrl from \"@tutti-os/commerce/assets/star-pro.png\";\nimport ultraIconUrl from \"@tutti-os/commerce/assets/star-ultra.png\";\nimport {\n resolveMembershipTierVisual,\n type MembershipTierVisual\n} from \"../index\";\n\nconst ICON_URLS: Readonly<Record<MembershipTierVisual, string>> = {\n free: freeIconUrl,\n lite: liteIconUrl,\n pro: proIconUrl,\n ultra: ultraIconUrl\n};\n\nexport interface MembershipTierIconProps {\n tierKey: string | null | undefined;\n className?: string;\n}\n\nexport function MembershipTierIcon({\n tierKey,\n className = \"\"\n}: MembershipTierIconProps): React.JSX.Element | null {\n const visual = resolveMembershipTierVisual(tierKey);\n if (!visual) {\n return null;\n }\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n draggable={false}\n src={ICON_URLS[visual]}\n className={className}\n data-membership-tier-visual={visual}\n />\n );\n}\n","import { memo, useEffect } from \"react\";\nimport registrationCreditsBackgroundUrl from \"@tutti-os/commerce/assets/registration-credits-bg.png\";\nimport { CloseIcon, CreditsIcon } from \"@tutti-os/ui-system\";\nimport type { RegistrationCreditsToastState } from \"../index\";\n\nexport interface RegistrationCreditsToastLabels {\n title: string;\n creditsUnit: string;\n description: string;\n close: string;\n}\n\nexport interface RegistrationCreditsToastProps {\n toast: RegistrationCreditsToastState;\n labels: RegistrationCreditsToastLabels;\n}\n\nconst defaultAutoDismissMs = 120_000;\n\nexport const RegistrationCreditsToast = memo(function RegistrationCreditsToast({\n toast,\n labels\n}: RegistrationCreditsToastProps): React.JSX.Element | null {\n \"use memo\";\n useEffect(() => {\n if (!toast.visible) {\n return;\n }\n const timeout = window.setTimeout(\n toast.onDismiss,\n toast.autoDismissMs ?? defaultAutoDismissMs\n );\n return () => window.clearTimeout(timeout);\n }, [toast.autoDismissMs, toast.onDismiss, toast.visible]);\n\n if (!toast.visible) {\n return null;\n }\n\n return (\n <div\n className=\"nodrag relative mx-3 mb-1 w-[calc(100%-24px)] max-w-[calc(100%-24px)] overflow-hidden rounded-[14px] border border-[rgba(218,233,255,0.62)] p-2.5 pr-9 text-white shadow-[0_14px_28px_rgba(0,0,0,0.2),inset_0_0_0_1px_rgba(255,255,255,0.24)] [-webkit-app-region:no-drag]\"\n data-testid=\"commerce-registration-credits-toast\"\n role=\"status\"\n style={{\n backgroundImage: `linear-gradient(90deg, rgba(18, 60, 142, 0.08), rgba(20, 66, 160, 0.2) 58%, rgba(12, 32, 92, 0.34)), url(${JSON.stringify(\n registrationCreditsBackgroundUrl\n )})`,\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"cover\"\n }}\n >\n <div className=\"pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-white/90 to-transparent\" />\n <div className=\"relative flex min-w-0 items-center gap-2.5\">\n <span className=\"grid h-10 w-10 shrink-0 place-items-center rounded-[12px] bg-[rgba(250,255,236,0.78)] text-emerald-400 shadow-[0_9px_18px_rgba(20,184,166,0.18),0_0_0_1px_rgba(255,255,255,0.5)_inset]\">\n <CreditsIcon aria-hidden=\"true\" size={23} />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[12px] font-semibold leading-4 text-white\">\n {labels.title}\n </span>\n <span className=\"block truncate text-[20px] font-semibold leading-6 text-white\">\n +{toast.creditsLabel} {labels.creditsUnit}\n </span>\n <span className=\"block truncate text-[11px] font-medium leading-4 text-white/88\">\n {labels.description}\n </span>\n </span>\n </div>\n <button\n type=\"button\"\n aria-label={labels.close}\n className=\"nodrag absolute right-2.5 top-2.5 grid h-6 w-6 place-items-center rounded-[7px] text-white/85 hover:bg-white/18 hover:text-white [-webkit-app-region:no-drag]\"\n onClick={toast.onDismiss}\n >\n <CloseIcon aria-hidden=\"true\" size={16} />\n </button>\n </div>\n );\n});\n"],"mappings":"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","names":["BillingIcon","jsx","jsx","jsxs","BillingIcon","CreditsIcon","jsx","jsxs","RegistrationCreditsToast"]}
1
+ {"version":3,"sources":["../../src/react/AgentConfigCommerceContent.tsx","../../src/react/commerceMenuPresentation.ts","../../src/react/CommerceMenuContent.tsx","../../src/react/MembershipBadge.tsx","../../src/react/MembershipTierIcon.tsx","../../src/react/RegistrationCreditsToast.tsx"],"sourcesContent":["import {\n BillingIcon,\n CreditsIcon,\n LaunchIcon,\n RefreshIcon,\n UserLinedIcon\n} from \"@tutti-os/ui-system\";\nimport type { CommerceMenuState } from \"../index\";\nimport { useCommerceOpenExternal } from \"./commerceMenuPresentation\";\n\nexport interface AgentConfigCommerceLabels {\n account: string;\n membership: string;\n creditsBalance: string;\n refresh: string;\n refreshing: string;\n freeMembership: string;\n accountCenter: string;\n loading: string;\n unavailable: string;\n dataUnavailable: string;\n}\n\nexport interface AgentConfigCommerceContentProps {\n accountName: string | null;\n state: CommerceMenuState;\n labels: AgentConfigCommerceLabels;\n onRefresh(): void;\n}\n\nconst menuItemBaseClassName =\n \"nodrag flex h-7 items-center gap-2 rounded-[6px] text-[13px] text-[var(--text-primary)] transition-colors hover:bg-[var(--transparency-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)] disabled:cursor-not-allowed disabled:text-[var(--text-disabled)] disabled:hover:bg-transparent [-webkit-app-region:no-drag]\";\nconst menuItemClassName = `${menuItemBaseClassName} w-full px-2`;\n\nexport function AgentConfigCommerceContent({\n accountName,\n state,\n labels,\n onRefresh\n}: AgentConfigCommerceContentProps): React.JSX.Element {\n const openExternal = useCommerceOpenExternal(state);\n const accountNameLabel =\n accountName?.trim() ||\n (state.loading ? labels.loading : labels.unavailable);\n const creditsLabel =\n state.loading && !state.creditsLabel\n ? labels.loading\n : (state.creditsLabel ?? labels.unavailable);\n const membershipLabel =\n state.membershipLabel.trim() ||\n (state.membershipAccess === \"free\"\n ? labels.freeMembership\n : state.loading\n ? labels.loading\n : labels.unavailable);\n return (\n <div\n className=\"flex min-w-0 flex-col gap-1\"\n data-testid=\"agent-config-commerce-content\"\n >\n <div className=\"flex min-w-0 flex-col gap-1 p-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <UserLinedIcon aria-hidden=\"true\" size={16} />\n <span className=\"truncate text-[13px] font-semibold leading-4\">\n {labels.account}\n </span>\n </div>\n <span className=\"truncate pl-6 text-[13px] leading-5 text-[var(--text-secondary)]\">\n {accountNameLabel}\n </span>\n </div>\n <div className=\"px-2\">\n <span className=\"block h-px bg-[var(--border-1)]\" />\n </div>\n <div className=\"flex min-w-0 items-center\">\n <button\n type=\"button\"\n className={`${menuItemBaseClassName} min-w-0 flex-1 px-2`}\n disabled={!state.links.usageUrl.trim()}\n aria-label={`${labels.creditsBalance} ${creditsLabel}`}\n onClick={() => openExternal(state.links.usageUrl)}\n >\n <CreditsIcon aria-hidden=\"true\" size={16} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.creditsBalance}\n </span>\n <span\n className=\"max-w-[120px] truncate text-[var(--text-secondary)] tabular-nums\"\n data-testid=\"agent-config-commerce-credits\"\n aria-live=\"polite\"\n >\n {creditsLabel}\n </span>\n </button>\n <button\n type=\"button\"\n className={`${menuItemBaseClassName} shrink-0 px-2`}\n data-testid=\"agent-config-commerce-refresh\"\n disabled={state.loading}\n aria-label={state.loading ? labels.refreshing : labels.refresh}\n onClick={onRefresh}\n >\n <RefreshIcon\n aria-hidden=\"true\"\n className={state.loading ? \"motion-safe:animate-spin\" : undefined}\n size={14}\n />\n <span>{state.loading ? labels.refreshing : labels.refresh}</span>\n </button>\n </div>\n <button\n type=\"button\"\n className={menuItemClassName}\n disabled={!state.links.planUrl.trim()}\n aria-label={`${labels.membership} ${membershipLabel}`}\n onClick={() => openExternal(state.links.planUrl)}\n >\n <BillingIcon aria-hidden=\"true\" size={16} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.membership}\n </span>\n <span className=\"max-w-[72px] truncate text-[var(--text-secondary)]\">\n {membershipLabel}\n </span>\n <LaunchIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-secondary)]\"\n size={14}\n />\n </button>\n <button\n type=\"button\"\n className={menuItemClassName}\n disabled={!state.links.settingsUrl.trim()}\n onClick={() => openExternal(state.links.settingsUrl)}\n >\n <UserLinedIcon aria-hidden=\"true\" size={16} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.accountCenter}\n </span>\n <LaunchIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-secondary)]\"\n size={14}\n />\n </button>\n {state.dataUnavailable ? (\n <span\n className=\"px-2 py-1 text-[11px] leading-4 text-[var(--state-danger)]\"\n role=\"status\"\n >\n {labels.dataUnavailable}\n </span>\n ) : null}\n </div>\n );\n}\n","import { useCallback } from \"react\";\nimport { resolveMembershipAction, type CommerceMenuState } from \"../index\";\n\nexport interface CommerceMembershipActionLabels {\n upgradeMembership: string;\n rechargeCredits: string;\n viewCreditPlans: string;\n}\n\nexport function resolveCommerceMembershipActionLabel(\n state: CommerceMenuState,\n labels: CommerceMembershipActionLabels\n): string {\n switch (resolveMembershipAction(state.membershipAccess)) {\n case \"upgrade-membership\":\n return labels.upgradeMembership;\n case \"recharge-credits\":\n return labels.rechargeCredits;\n case \"view-credit-plans\":\n return labels.viewCreditPlans;\n }\n}\n\nexport function useCommerceOpenExternal(\n state: CommerceMenuState\n): (url: string) => void {\n return useCallback(\n (url: string) => {\n if (!url.trim()) {\n return;\n }\n try {\n const result = state.onOpenExternal(url);\n if (result) {\n void result.catch((error: unknown) => {\n state.onActionError?.(error);\n });\n }\n } catch (error) {\n state.onActionError?.(error);\n }\n },\n [state]\n );\n}\n","import {\n BillingIcon,\n CreditsIcon,\n LaunchIcon,\n UserLinedIcon\n} from \"@tutti-os/ui-system\";\nimport type { CommerceMenuState } from \"../index\";\nimport {\n resolveCommerceMembershipActionLabel,\n useCommerceOpenExternal\n} from \"./commerceMenuPresentation\";\n\nexport interface CommerceMenuLabels {\n member: string;\n upgradeMembership: string;\n rechargeCredits: string;\n viewCreditPlans: string;\n creditsBalance: string;\n accountCenter: string;\n loading: string;\n unavailable: string;\n dataUnavailable: string;\n}\n\nexport interface CommerceMenuContentProps {\n state: CommerceMenuState;\n labels: CommerceMenuLabels;\n}\n\nexport function CommerceMenuContent({\n state,\n labels\n}: CommerceMenuContentProps): React.JSX.Element {\n const creditsLabel =\n state.loading && !state.creditsLabel\n ? labels.loading\n : (state.creditsLabel ?? labels.unavailable);\n const openExternal = useCommerceOpenExternal(state);\n const membershipActionLabel = resolveCommerceMembershipActionLabel(\n state,\n labels\n );\n\n return (\n <div className=\"flex min-w-0 flex-col\" data-testid=\"commerce-menu-content\">\n <button\n type=\"button\"\n className=\"nodrag flex h-8 items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] disabled:cursor-not-allowed disabled:opacity-50 [-webkit-app-region:no-drag]\"\n disabled={!state.links.planUrl.trim()}\n onClick={() => openExternal(state.links.planUrl)}\n >\n <BillingIcon aria-hidden=\"true\" size={15} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.member}\n </span>\n <span className=\"shrink-0 text-[12px] text-[var(--tutti-purple)]\">\n {membershipActionLabel}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"nodrag flex h-8 items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] disabled:cursor-not-allowed disabled:opacity-50 [-webkit-app-region:no-drag]\"\n disabled={!state.links.usageUrl.trim()}\n onClick={() => openExternal(state.links.usageUrl)}\n >\n <CreditsIcon aria-hidden=\"true\" size={15} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.creditsBalance}\n </span>\n <span className=\"truncate text-[var(--text-secondary)]\">\n {creditsLabel}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"nodrag flex h-8 items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] disabled:cursor-not-allowed disabled:opacity-50 [-webkit-app-region:no-drag]\"\n disabled={!state.links.settingsUrl.trim()}\n onClick={() => openExternal(state.links.settingsUrl)}\n >\n <UserLinedIcon aria-hidden=\"true\" size={15} />\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {labels.accountCenter}\n </span>\n <LaunchIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-secondary)]\"\n size={14}\n />\n </button>\n {state.dataUnavailable ? (\n <span className=\"px-2 py-1 text-[11px] leading-4 text-[var(--text-danger)]\">\n {labels.dataUnavailable}\n </span>\n ) : null}\n </div>\n );\n}\n","import { BillingIcon } from \"@tutti-os/ui-system\";\nimport { MembershipTierIcon } from \"./MembershipTierIcon\";\n\nexport interface MembershipBadgeProps {\n label: string;\n tierKey?: string | null;\n className?: string;\n}\n\nexport function MembershipBadge({\n label,\n tierKey = null,\n className = \"\"\n}: MembershipBadgeProps): React.JSX.Element {\n return (\n <span\n className={`inline-flex max-w-full items-center gap-1 rounded-[5px] py-0.5 text-[11px] font-normal leading-3 text-[var(--text-secondary)] ${className}`}\n data-commerce-membership-badge=\"true\"\n >\n {tierKey ? (\n <MembershipTierIcon\n className=\"size-3.5 shrink-0 object-contain\"\n tierKey={tierKey}\n />\n ) : (\n <BillingIcon aria-hidden=\"true\" size={11} />\n )}\n <span className=\"min-w-0 truncate\">{label}</span>\n </span>\n );\n}\n","import freeIconUrl from \"@tutti-os/commerce/assets/star-free.png\";\nimport liteIconUrl from \"@tutti-os/commerce/assets/star-lite.png\";\nimport proIconUrl from \"@tutti-os/commerce/assets/star-pro.png\";\nimport ultraIconUrl from \"@tutti-os/commerce/assets/star-ultra.png\";\nimport {\n resolveMembershipTierVisual,\n type MembershipTierVisual\n} from \"../index\";\n\nconst ICON_URLS: Readonly<Record<MembershipTierVisual, string>> = {\n free: freeIconUrl,\n lite: liteIconUrl,\n pro: proIconUrl,\n ultra: ultraIconUrl\n};\n\nexport interface MembershipTierIconProps {\n tierKey: string | null | undefined;\n className?: string;\n}\n\nexport function MembershipTierIcon({\n tierKey,\n className = \"\"\n}: MembershipTierIconProps): React.JSX.Element | null {\n const visual = resolveMembershipTierVisual(tierKey);\n if (!visual) {\n return null;\n }\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n draggable={false}\n src={ICON_URLS[visual]}\n className={className}\n data-membership-tier-visual={visual}\n />\n );\n}\n","import { memo, useEffect } from \"react\";\nimport registrationCreditsBackgroundUrl from \"@tutti-os/commerce/assets/registration-credits-bg.png\";\nimport { CloseIcon, CreditsIcon } from \"@tutti-os/ui-system\";\nimport type { RegistrationCreditsToastState } from \"../index\";\n\nexport interface RegistrationCreditsToastLabels {\n title: string;\n creditsUnit: string;\n description: string;\n close: string;\n}\n\nexport interface RegistrationCreditsToastProps {\n toast: RegistrationCreditsToastState;\n labels: RegistrationCreditsToastLabels;\n}\n\nconst defaultAutoDismissMs = 120_000;\n\nexport const RegistrationCreditsToast = memo(function RegistrationCreditsToast({\n toast,\n labels\n}: RegistrationCreditsToastProps): React.JSX.Element | null {\n \"use memo\";\n useEffect(() => {\n if (!toast.visible) {\n return;\n }\n const timeout = window.setTimeout(\n toast.onDismiss,\n toast.autoDismissMs ?? defaultAutoDismissMs\n );\n return () => window.clearTimeout(timeout);\n }, [toast.autoDismissMs, toast.onDismiss, toast.visible]);\n\n if (!toast.visible) {\n return null;\n }\n\n return (\n <div\n className=\"nodrag relative mx-3 mb-1 w-[calc(100%-24px)] max-w-[calc(100%-24px)] overflow-hidden rounded-[14px] border border-[rgba(218,233,255,0.62)] p-2.5 pr-9 text-white shadow-[0_14px_28px_rgba(0,0,0,0.2),inset_0_0_0_1px_rgba(255,255,255,0.24)] [-webkit-app-region:no-drag]\"\n data-testid=\"commerce-registration-credits-toast\"\n role=\"status\"\n style={{\n backgroundImage: `linear-gradient(90deg, rgba(18, 60, 142, 0.08), rgba(20, 66, 160, 0.2) 58%, rgba(12, 32, 92, 0.34)), url(${JSON.stringify(\n registrationCreditsBackgroundUrl\n )})`,\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"cover\"\n }}\n >\n <div className=\"pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-white/90 to-transparent\" />\n <div className=\"relative flex min-w-0 items-center gap-2.5\">\n <span className=\"grid h-10 w-10 shrink-0 place-items-center rounded-[12px] bg-[rgba(250,255,236,0.78)] text-emerald-400 shadow-[0_9px_18px_rgba(20,184,166,0.18),0_0_0_1px_rgba(255,255,255,0.5)_inset]\">\n <CreditsIcon aria-hidden=\"true\" size={23} />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[12px] font-semibold leading-4 text-white\">\n {labels.title}\n </span>\n <span className=\"block truncate text-[20px] font-semibold leading-6 text-white\">\n +{toast.creditsLabel} {labels.creditsUnit}\n </span>\n <span className=\"block truncate text-[11px] font-medium leading-4 text-white/88\">\n {labels.description}\n </span>\n </span>\n </div>\n <button\n type=\"button\"\n aria-label={labels.close}\n className=\"nodrag absolute right-2.5 top-2.5 grid h-6 w-6 place-items-center rounded-[7px] text-white/85 hover:bg-white/18 hover:text-white [-webkit-app-region:no-drag]\"\n onClick={toast.onDismiss}\n >\n <CloseIcon aria-hidden=\"true\" size={16} />\n </button>\n </div>\n );\n});\n"],"mappings":"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","names":["BillingIcon","CreditsIcon","LaunchIcon","UserLinedIcon","jsx","jsxs","BillingIcon","CreditsIcon","UserLinedIcon","LaunchIcon","BillingIcon","jsx","jsx","jsxs","BillingIcon","CreditsIcon","jsx","jsxs","RegistrationCreditsToast"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/commerce",
3
- "version": "0.0.233",
3
+ "version": "0.0.235",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -54,7 +54,7 @@
54
54
  "directory": "packages/commerce/web"
55
55
  },
56
56
  "dependencies": {
57
- "@tutti-os/ui-system": "0.0.233"
57
+ "@tutti-os/ui-system": "0.0.235"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@testing-library/jest-dom": "^6.9.1",