- {t('monthlyPackage')}
+ return (
+
+ {/* Calculator panel container */}
+
+ {/* Left: row headers (Monthly Plan / Yearly Plan) */}
+
+
+
+ {t('monthlyPackage')}
+
+
+ {t('annualPackage')}
+
-
- {t('annualPackage')}
+
+ {/* Middle: First-time top-up users (double rounded corners + three rows) */}
+
+
+
+
+
+
+
+ {t('firstTimeTopUpUser')}
+
+
+
+
+
+
+ 50%
+
+
+ up to{' '}
+
+
+
+
+
+
+
+
+
+ 30%
+
+
+ up to{' '}
+
+
+
+
+
+
+
+
+ {/* Blue shadow block */}
+
+
+
+ {/* Right: Repeat top-up users (gray card + three rows) */}
+
+
+ {t('repeatTopUpUser')}
+
+
+
+
+ 20%
+
+
+ up to{' '}
+
+
+ {' '}
+ {t('perMonth')}
+
+
+
+
+
+ 20%
+
+
+ up to{' '}
+
+
+ {' '}
+ {t('perYear')}
+
+
-
- {/* Middle: First-time top-up users (double rounded corners + three rows) */}
-
-
-
-
-
-
-
- {t('firstTimeTopUpUser')}
-
-
-
-
-
-
- 50%
-
-
- up to{' '}
-
-
-
-
-
-
-
-
-
- 30%
-
-
- up to{' '}
-
-
-
-
-
-
-
-
- {/* Blue shadow block */}
-
-
-
- {/* Right: Repeat top-up users (gray card + three rows) */}
-
-
- {t('repeatTopUpUser')}
-
-
-
-
- 20%
-
-
- up to{' '}
-
-
- {' '}
- {t('perMonth')}
-
-
-
-
-
- 20%
-
-
- up to{' '}
-
-
- {' '}
- {t('perYear')}
-
+ {/* User count adjustment */}
+
+
+
+ setCount(clamp(Number(e.target.value) || 0))}
+ className='h-6 border-0 p-0 text-center text-sm focus-visible:ring-0 sm:h-8'
+ style={{ width: `${Math.max(3, String(count).length + 1)}ch` }}
+ />
+ users
+
- {/* User count adjustment */}
-
-
-
- setCount(clamp(Number(e.target.value) || 0))}
- className='h-6 border-0 p-0 text-center text-sm focus-visible:ring-0 sm:h-8'
- style={{ width: `${Math.max(3, String(count).length + 1)}ch` }}
- />
- users
-
-
-
-
- );
- })()}
+ );
+ })()}
+
diff --git a/apps/user/components/empty.tsx b/apps/user/components/empty.tsx
index 08f3a19..a7c395f 100644
--- a/apps/user/components/empty.tsx
+++ b/apps/user/components/empty.tsx
@@ -4,7 +4,7 @@ import { default as _Empty } from '@workspace/airo-ui/custom-components/empty';
import { useTranslations } from 'next-intl';
import { useEffect, useState } from 'react';
-export function Empty() {
+export function Empty({ className }: { className?: string }) {
const t = useTranslations('common');
const [description, setDescription] = useState('');
@@ -14,5 +14,5 @@ export function Empty() {
setDescription(t(`empty.${random}`));
}, [t]);
- return <_Empty description={description} />;
+ return <_Empty description={description} className={className} />;
}
diff --git a/apps/user/locales/en-US/affiliate.json b/apps/user/locales/en-US/affiliate.json
index 8144cb8..faea8d0 100644
--- a/apps/user/locales/en-US/affiliate.json
+++ b/apps/user/locales/en-US/affiliate.json
@@ -8,11 +8,12 @@
"copyInviteLink": "Copy Invite Link",
"copySuccess": "Copied Successfully",
"firstTimeTopUpUser": "First-time Top-up User",
- "historicalRecommendedUsers": "Historical Recommended Users: 7",
+ "historicalRecommendedUsers": "Historical Recommended Users: ",
"inviteCode": "Invite Code",
"inviteRecords": "Invite Records",
"monthlyPackage": "Monthly Package",
"more": "More",
+ "noInvitationRecords": "No Invitation Records",
"perMonth": "/ Month",
"perYear": "/ Year",
"registrationTime": "Registration Time",
diff --git a/apps/user/locales/zh-CN/affiliate.json b/apps/user/locales/zh-CN/affiliate.json
index 719331e..0691a68 100644
--- a/apps/user/locales/zh-CN/affiliate.json
+++ b/apps/user/locales/zh-CN/affiliate.json
@@ -8,11 +8,12 @@
"copyInviteLink": "复制邀请链接",
"copySuccess": "复制成功",
"firstTimeTopUpUser": "首充用户",
- "historicalRecommendedUsers": "历史推荐用户:7",
+ "historicalRecommendedUsers": "历史推荐用户:",
"inviteCode": "邀请码",
"inviteRecords": "邀请记录",
"monthlyPackage": "月付套餐",
"more": "更多",
+ "noInvitationRecords": "暂无邀请记录",
"perMonth": "/ 月",
"perYear": "/ 年",
"registrationTime": "注册时间",
diff --git a/packages/airo-ui/src/custom-components/empty.tsx b/packages/airo-ui/src/custom-components/empty.tsx
index 83c9700..17eabb7 100644
--- a/packages/airo-ui/src/custom-components/empty.tsx
+++ b/packages/airo-ui/src/custom-components/empty.tsx
@@ -1,6 +1,14 @@
-export default function Empty({ description }: { description?: React.ReactNode }) {
+import { cn } from '@workspace/airo-ui/lib/utils';
+
+export default function Empty({
+ className,
+ description,
+}: {
+ description?: React.ReactNode;
+ className?: string;
+}) {
return (
-