@tutti-os/commerce 0.0.254 → 0.0.255

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.
@@ -15,11 +15,12 @@ interface AgentConfigCommerceLabels {
15
15
  }
16
16
  interface AgentConfigCommerceContentProps {
17
17
  accountName: string | null;
18
+ showAccountIdentity?: boolean;
18
19
  state: CommerceMenuState;
19
20
  labels: AgentConfigCommerceLabels;
20
21
  onRefresh(): void;
21
22
  }
22
- declare function AgentConfigCommerceContent({ accountName, state, labels, onRefresh }: AgentConfigCommerceContentProps): React.JSX.Element;
23
+ declare function AgentConfigCommerceContent({ accountName, showAccountIdentity, state, labels, onRefresh }: AgentConfigCommerceContentProps): React.JSX.Element;
23
24
 
24
25
  interface CommerceMenuLabels {
25
26
  member: string;
@@ -46,11 +46,12 @@ function useCommerceOpenExternal(state) {
46
46
  }
47
47
 
48
48
  // src/react/AgentConfigCommerceContent.tsx
49
- import { jsx, jsxs } from "react/jsx-runtime";
49
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
50
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
51
  var menuItemClassName = `${menuItemBaseClassName} w-full px-2`;
52
52
  function AgentConfigCommerceContent({
53
53
  accountName,
54
+ showAccountIdentity = true,
54
55
  state,
55
56
  labels,
56
57
  onRefresh
@@ -65,14 +66,16 @@ function AgentConfigCommerceContent({
65
66
  className: "flex min-w-0 flex-col gap-1",
66
67
  "data-testid": "agent-config-commerce-content",
67
68
  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 })
69
+ showAccountIdentity ? /* @__PURE__ */ jsxs(Fragment, { children: [
70
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1 p-2", children: [
71
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
72
+ /* @__PURE__ */ jsx(UserLinedIcon, { "aria-hidden": "true", size: 16 }),
73
+ /* @__PURE__ */ jsx("span", { className: "truncate text-[13px] font-semibold leading-4", children: labels.account })
74
+ ] }),
75
+ /* @__PURE__ */ jsx("span", { className: "truncate pl-6 text-[13px] leading-5 text-[var(--text-secondary)]", children: accountNameLabel })
72
76
  ] }),
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)]" }) }),
77
+ /* @__PURE__ */ jsx("div", { className: "px-2", children: /* @__PURE__ */ jsx("span", { className: "block h-px bg-[var(--border-1)]" }) })
78
+ ] }) : null,
76
79
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center", children: [
77
80
  /* @__PURE__ */ jsxs(
78
81
  "button",
@@ -1 +1 @@
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 titiRunUrl from \"@tutti-os/commerce/assets/titi-run.png\";\nimport { CloseIcon } from \"@tutti-os/ui-system\";\nimport type { RegistrationCreditsToastState } from \"../index\";\n\nexport interface RegistrationCreditsToastLabels {\n title: string;\n creditsUnit: 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-[16px] p-2.5 pr-9 text-white [-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 <img\n alt=\"\"\n aria-hidden=\"true\"\n className=\"h-14 w-14 shrink-0 object-contain\"\n src={titiRunUrl}\n />\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>\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","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 showAccountIdentity?: boolean;\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 showAccountIdentity = true,\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 {showAccountIdentity ? (\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 </>\n ) : null}\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 titiRunUrl from \"@tutti-os/commerce/assets/titi-run.png\";\nimport { CloseIcon } from \"@tutti-os/ui-system\";\nimport type { RegistrationCreditsToastState } from \"../index\";\n\nexport interface RegistrationCreditsToastLabels {\n title: string;\n creditsUnit: 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-[16px] p-2.5 pr-9 text-white [-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 <img\n alt=\"\"\n aria-hidden=\"true\"\n className=\"h-14 w-14 shrink-0 object-contain\"\n src={titiRunUrl}\n />\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>\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","jsx","jsxs","RegistrationCreditsToast"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/commerce",
3
- "version": "0.0.254",
3
+ "version": "0.0.255",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -60,7 +60,7 @@
60
60
  "directory": "packages/commerce/web"
61
61
  },
62
62
  "dependencies": {
63
- "@tutti-os/ui-system": "0.0.254"
63
+ "@tutti-os/ui-system": "0.0.255"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@testing-library/jest-dom": "^6.9.1",