@tutti-os/commerce 0.0.252 → 0.0.254
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/titi-run.png +0 -0
- package/dist/assets/titi-run.png.d.ts +2 -0
- package/dist/react/index.d.ts +0 -1
- package/dist/react/index.js +13 -5
- package/dist/react/index.js.map +1 -1
- package/dist/runtime-assets/titi-run-url.d.ts +3 -0
- package/dist/runtime-assets/titi-run-url.js +6 -0
- package/dist/runtime-assets/titi-run-url.js.map +1 -0
- package/package.json +8 -2
|
Binary file
|
package/dist/react/index.d.ts
CHANGED
package/dist/react/index.js
CHANGED
|
@@ -314,7 +314,8 @@ function MembershipBadge({
|
|
|
314
314
|
// src/react/RegistrationCreditsToast.tsx
|
|
315
315
|
import { memo, useEffect } from "react";
|
|
316
316
|
import registrationCreditsBackgroundUrl from "@tutti-os/commerce/assets/registration-credits-bg.png";
|
|
317
|
-
import
|
|
317
|
+
import titiRunUrl from "@tutti-os/commerce/assets/titi-run.png";
|
|
318
|
+
import { CloseIcon } from "@tutti-os/ui-system";
|
|
318
319
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
319
320
|
var defaultAutoDismissMs = 12e4;
|
|
320
321
|
var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
|
|
@@ -338,7 +339,7 @@ var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
|
|
|
338
339
|
return /* @__PURE__ */ jsxs4(
|
|
339
340
|
"div",
|
|
340
341
|
{
|
|
341
|
-
className: "nodrag relative mx-3 mb-1 w-[calc(100%-24px)] max-w-[calc(100%-24px)] overflow-hidden rounded-[
|
|
342
|
+
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]",
|
|
342
343
|
"data-testid": "commerce-registration-credits-toast",
|
|
343
344
|
role: "status",
|
|
344
345
|
style: {
|
|
@@ -352,7 +353,15 @@ var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
|
|
|
352
353
|
children: [
|
|
353
354
|
/* @__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
355
|
/* @__PURE__ */ jsxs4("div", { className: "relative flex min-w-0 items-center gap-2.5", children: [
|
|
355
|
-
/* @__PURE__ */ jsx5(
|
|
356
|
+
/* @__PURE__ */ jsx5(
|
|
357
|
+
"img",
|
|
358
|
+
{
|
|
359
|
+
alt: "",
|
|
360
|
+
"aria-hidden": "true",
|
|
361
|
+
className: "h-14 w-14 shrink-0 object-contain",
|
|
362
|
+
src: titiRunUrl
|
|
363
|
+
}
|
|
364
|
+
),
|
|
356
365
|
/* @__PURE__ */ jsxs4("span", { className: "min-w-0 flex-1", children: [
|
|
357
366
|
/* @__PURE__ */ jsx5("span", { className: "block truncate text-[12px] font-semibold leading-4 text-white", children: labels.title }),
|
|
358
367
|
/* @__PURE__ */ jsxs4("span", { className: "block truncate text-[20px] font-semibold leading-6 text-white", children: [
|
|
@@ -360,8 +369,7 @@ var RegistrationCreditsToast = memo(function RegistrationCreditsToast2({
|
|
|
360
369
|
toast.creditsLabel,
|
|
361
370
|
" ",
|
|
362
371
|
labels.creditsUnit
|
|
363
|
-
] })
|
|
364
|
-
/* @__PURE__ */ jsx5("span", { className: "block truncate text-[11px] font-medium leading-4 text-white/88", children: labels.description })
|
|
372
|
+
] })
|
|
365
373
|
] })
|
|
366
374
|
] }),
|
|
367
375
|
/* @__PURE__ */ jsx5(
|
package/dist/react/index.js.map
CHANGED
|
@@ -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 { 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"]}
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime-assets/titi-run-url.ts"],"sourcesContent":["export default new URL(\"../assets/titi-run.png\", import.meta.url).href;\n"],"mappings":";AAAA,IAAO,uBAAQ,IAAI,IAAI,0BAA0B,YAAY,GAAG,EAAE;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/commerce",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.254",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -42,6 +42,12 @@
|
|
|
42
42
|
"browser": "./dist/assets/registration-credits-bg.png",
|
|
43
43
|
"node": "./dist/runtime-assets/registration-credits-bg-url.js",
|
|
44
44
|
"default": "./dist/assets/registration-credits-bg.png"
|
|
45
|
+
},
|
|
46
|
+
"./assets/titi-run.png": {
|
|
47
|
+
"types": "./dist/assets/titi-run.png.d.ts",
|
|
48
|
+
"browser": "./dist/assets/titi-run.png",
|
|
49
|
+
"node": "./dist/runtime-assets/titi-run-url.js",
|
|
50
|
+
"default": "./dist/assets/titi-run.png"
|
|
45
51
|
}
|
|
46
52
|
},
|
|
47
53
|
"files": [
|
|
@@ -54,7 +60,7 @@
|
|
|
54
60
|
"directory": "packages/commerce/web"
|
|
55
61
|
},
|
|
56
62
|
"dependencies": {
|
|
57
|
-
"@tutti-os/ui-system": "0.0.
|
|
63
|
+
"@tutti-os/ui-system": "0.0.254"
|
|
58
64
|
},
|
|
59
65
|
"devDependencies": {
|
|
60
66
|
"@testing-library/jest-dom": "^6.9.1",
|