+
{props.children}
);
@@ -366,18 +480,18 @@ function Trend(
const Icon = useMemo(() => {
switch (props.trend) {
case 'up':
- return
;
+ return
;
case 'down':
- return
;
+ return
;
case 'stale':
- return
;
+ return
;
}
}, [props.trend]);
return (
-
+
{Icon}
{props.children}
@@ -385,3 +499,395 @@ function Trend(
);
}
+
+export function VisitorsChart() {
+ const chartData = useMemo(() => [
+ { date: '2024-04-01', desktop: 222, mobile: 150 },
+ { date: '2024-04-02', desktop: 97, mobile: 180 },
+ { date: '2024-04-03', desktop: 167, mobile: 120 },
+ { date: '2024-04-04', desktop: 242, mobile: 260 },
+ { date: '2024-04-05', desktop: 373, mobile: 290 },
+ { date: '2024-04-06', desktop: 301, mobile: 340 },
+ { date: '2024-04-07', desktop: 245, mobile: 180 },
+ { date: '2024-04-08', desktop: 409, mobile: 320 },
+ { date: '2024-04-09', desktop: 59, mobile: 110 },
+ { date: '2024-04-10', desktop: 261, mobile: 190 },
+ { date: '2024-04-11', desktop: 327, mobile: 350 },
+ { date: '2024-04-12', desktop: 292, mobile: 210 },
+ { date: '2024-04-13', desktop: 342, mobile: 380 },
+ { date: '2024-04-14', desktop: 137, mobile: 220 },
+ { date: '2024-04-15', desktop: 120, mobile: 170 },
+ { date: '2024-04-16', desktop: 138, mobile: 190 },
+ { date: '2024-04-17', desktop: 446, mobile: 360 },
+ { date: '2024-04-18', desktop: 364, mobile: 410 },
+ { date: '2024-04-19', desktop: 243, mobile: 180 },
+ { date: '2024-04-20', desktop: 89, mobile: 150 },
+ { date: '2024-04-21', desktop: 137, mobile: 200 },
+ { date: '2024-04-22', desktop: 224, mobile: 170 },
+ { date: '2024-04-23', desktop: 138, mobile: 230 },
+ { date: '2024-04-24', desktop: 387, mobile: 290 },
+ { date: '2024-04-25', desktop: 215, mobile: 250 },
+ { date: '2024-04-26', desktop: 75, mobile: 130 },
+ { date: '2024-04-27', desktop: 383, mobile: 420 },
+ { date: '2024-04-28', desktop: 122, mobile: 180 },
+ { date: '2024-04-29', desktop: 315, mobile: 240 },
+ { date: '2024-04-30', desktop: 454, mobile: 380 },
+ { date: '2024-05-01', desktop: 165, mobile: 220 },
+ { date: '2024-05-02', desktop: 293, mobile: 310 },
+ { date: '2024-05-03', desktop: 247, mobile: 190 },
+ { date: '2024-05-04', desktop: 385, mobile: 420 },
+ { date: '2024-05-05', desktop: 481, mobile: 390 },
+ { date: '2024-05-06', desktop: 498, mobile: 520 },
+ { date: '2024-05-07', desktop: 388, mobile: 300 },
+ { date: '2024-05-08', desktop: 149, mobile: 210 },
+ { date: '2024-05-09', desktop: 227, mobile: 180 },
+ { date: '2024-05-10', desktop: 293, mobile: 330 },
+ { date: '2024-05-11', desktop: 335, mobile: 270 },
+ { date: '2024-05-12', desktop: 197, mobile: 240 },
+ { date: '2024-05-13', desktop: 197, mobile: 160 },
+ { date: '2024-05-14', desktop: 448, mobile: 490 },
+ { date: '2024-05-15', desktop: 473, mobile: 380 },
+ { date: '2024-05-16', desktop: 338, mobile: 400 },
+ { date: '2024-05-17', desktop: 499, mobile: 420 },
+ { date: '2024-05-18', desktop: 315, mobile: 350 },
+ { date: '2024-05-19', desktop: 235, mobile: 180 },
+ { date: '2024-05-20', desktop: 177, mobile: 230 },
+ { date: '2024-05-21', desktop: 82, mobile: 140 },
+ { date: '2024-05-22', desktop: 81, mobile: 120 },
+ { date: '2024-05-23', desktop: 252, mobile: 290 },
+ { date: '2024-05-24', desktop: 294, mobile: 220 },
+ { date: '2024-05-25', desktop: 201, mobile: 250 },
+ { date: '2024-05-26', desktop: 213, mobile: 170 },
+ { date: '2024-05-27', desktop: 420, mobile: 460 },
+ { date: '2024-05-28', desktop: 233, mobile: 190 },
+ { date: '2024-05-29', desktop: 78, mobile: 130 },
+ { date: '2024-05-30', desktop: 340, mobile: 280 },
+ { date: '2024-05-31', desktop: 178, mobile: 230 },
+ { date: '2024-06-01', desktop: 178, mobile: 200 },
+ { date: '2024-06-02', desktop: 470, mobile: 410 },
+ { date: '2024-06-03', desktop: 103, mobile: 160 },
+ { date: '2024-06-04', desktop: 439, mobile: 380 },
+ { date: '2024-06-05', desktop: 88, mobile: 140 },
+ { date: '2024-06-06', desktop: 294, mobile: 250 },
+ { date: '2024-06-07', desktop: 323, mobile: 370 },
+ { date: '2024-06-08', desktop: 385, mobile: 320 },
+ { date: '2024-06-09', desktop: 438, mobile: 480 },
+ { date: '2024-06-10', desktop: 155, mobile: 200 },
+ { date: '2024-06-11', desktop: 92, mobile: 150 },
+ { date: '2024-06-12', desktop: 492, mobile: 420 },
+ { date: '2024-06-13', desktop: 81, mobile: 130 },
+ { date: '2024-06-14', desktop: 426, mobile: 380 },
+ { date: '2024-06-15', desktop: 307, mobile: 350 },
+ { date: '2024-06-16', desktop: 371, mobile: 310 },
+ { date: '2024-06-17', desktop: 475, mobile: 520 },
+ { date: '2024-06-18', desktop: 107, mobile: 170 },
+ { date: '2024-06-19', desktop: 341, mobile: 290 },
+ { date: '2024-06-20', desktop: 408, mobile: 450 },
+ { date: '2024-06-21', desktop: 169, mobile: 210 },
+ { date: '2024-06-22', desktop: 317, mobile: 270 },
+ { date: '2024-06-23', desktop: 480, mobile: 530 },
+ { date: '2024-06-24', desktop: 132, mobile: 180 },
+ { date: '2024-06-25', desktop: 141, mobile: 190 },
+ { date: '2024-06-26', desktop: 434, mobile: 380 },
+ { date: '2024-06-27', desktop: 448, mobile: 490 },
+ { date: '2024-06-28', desktop: 149, mobile: 200 },
+ { date: '2024-06-29', desktop: 103, mobile: 160 },
+ { date: '2024-06-30', desktop: 446, mobile: 400 },
+ ], []);
+
+ const chartConfig = {
+ visitors: {
+ label: 'Visitors',
+ },
+ desktop: {
+ label: 'Desktop',
+ color: 'hsl(var(--chart-1))',
+ },
+ mobile: {
+ label: 'Mobile',
+ color: 'hsl(var(--chart-2))',
+ },
+ } satisfies ChartConfig;
+
+ return (
+
+
+ Visitors
+
+ Showing total visitors for the last 6 months
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ value.slice(0, 3)}
+ />
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+ Trending up by 5.2% this month
+
+
+ January - June 2024
+
+
+
+
+
+ );
+}
+
+export function PageViewsChart() {
+ const [activeChart, setActiveChart] =
+ useState
('desktop');
+
+ const chartData = [
+ { date: '2024-04-01', desktop: 222, mobile: 150 },
+ { date: '2024-04-02', desktop: 97, mobile: 180 },
+ { date: '2024-04-03', desktop: 167, mobile: 120 },
+ { date: '2024-04-04', desktop: 242, mobile: 260 },
+ { date: '2024-04-05', desktop: 373, mobile: 290 },
+ { date: '2024-04-06', desktop: 301, mobile: 340 },
+ { date: '2024-04-07', desktop: 245, mobile: 180 },
+ { date: '2024-04-08', desktop: 409, mobile: 320 },
+ { date: '2024-04-09', desktop: 59, mobile: 110 },
+ { date: '2024-04-10', desktop: 261, mobile: 190 },
+ { date: '2024-04-11', desktop: 327, mobile: 350 },
+ { date: '2024-04-12', desktop: 292, mobile: 210 },
+ { date: '2024-04-13', desktop: 342, mobile: 380 },
+ { date: '2024-04-14', desktop: 137, mobile: 220 },
+ { date: '2024-04-15', desktop: 120, mobile: 170 },
+ { date: '2024-04-16', desktop: 138, mobile: 190 },
+ { date: '2024-04-17', desktop: 446, mobile: 360 },
+ { date: '2024-04-18', desktop: 364, mobile: 410 },
+ { date: '2024-04-19', desktop: 243, mobile: 180 },
+ { date: '2024-04-20', desktop: 89, mobile: 150 },
+ { date: '2024-04-21', desktop: 137, mobile: 200 },
+ { date: '2024-04-22', desktop: 224, mobile: 170 },
+ { date: '2024-04-23', desktop: 138, mobile: 230 },
+ { date: '2024-04-24', desktop: 387, mobile: 290 },
+ { date: '2024-04-25', desktop: 215, mobile: 250 },
+ { date: '2024-04-26', desktop: 75, mobile: 130 },
+ { date: '2024-04-27', desktop: 383, mobile: 420 },
+ { date: '2024-04-28', desktop: 122, mobile: 180 },
+ { date: '2024-04-29', desktop: 315, mobile: 240 },
+ { date: '2024-04-30', desktop: 454, mobile: 380 },
+ { date: '2024-05-01', desktop: 165, mobile: 220 },
+ { date: '2024-05-02', desktop: 293, mobile: 310 },
+ { date: '2024-05-03', desktop: 247, mobile: 190 },
+ { date: '2024-05-04', desktop: 385, mobile: 420 },
+ { date: '2024-05-05', desktop: 481, mobile: 390 },
+ { date: '2024-05-06', desktop: 498, mobile: 520 },
+ { date: '2024-05-07', desktop: 388, mobile: 300 },
+ { date: '2024-05-08', desktop: 149, mobile: 210 },
+ { date: '2024-05-09', desktop: 227, mobile: 180 },
+ { date: '2024-05-10', desktop: 293, mobile: 330 },
+ { date: '2024-05-11', desktop: 335, mobile: 270 },
+ { date: '2024-05-12', desktop: 197, mobile: 240 },
+ { date: '2024-05-13', desktop: 197, mobile: 160 },
+ { date: '2024-05-14', desktop: 448, mobile: 490 },
+ { date: '2024-05-15', desktop: 473, mobile: 380 },
+ { date: '2024-05-16', desktop: 338, mobile: 400 },
+ { date: '2024-05-17', desktop: 499, mobile: 420 },
+ { date: '2024-05-18', desktop: 315, mobile: 350 },
+ { date: '2024-05-19', desktop: 235, mobile: 180 },
+ { date: '2024-05-20', desktop: 177, mobile: 230 },
+ { date: '2024-05-21', desktop: 82, mobile: 140 },
+ { date: '2024-05-22', desktop: 81, mobile: 120 },
+ { date: '2024-05-23', desktop: 252, mobile: 290 },
+ { date: '2024-05-24', desktop: 294, mobile: 220 },
+ { date: '2024-05-25', desktop: 201, mobile: 250 },
+ { date: '2024-05-26', desktop: 213, mobile: 170 },
+ { date: '2024-05-27', desktop: 420, mobile: 460 },
+ { date: '2024-05-28', desktop: 233, mobile: 190 },
+ { date: '2024-05-29', desktop: 78, mobile: 130 },
+ { date: '2024-05-30', desktop: 340, mobile: 280 },
+ { date: '2024-05-31', desktop: 178, mobile: 230 },
+ { date: '2024-06-01', desktop: 178, mobile: 200 },
+ { date: '2024-06-02', desktop: 470, mobile: 410 },
+ { date: '2024-06-03', desktop: 103, mobile: 160 },
+ { date: '2024-06-04', desktop: 439, mobile: 380 },
+ { date: '2024-06-05', desktop: 88, mobile: 140 },
+ { date: '2024-06-06', desktop: 294, mobile: 250 },
+ { date: '2024-06-07', desktop: 323, mobile: 370 },
+ { date: '2024-06-08', desktop: 385, mobile: 320 },
+ { date: '2024-06-09', desktop: 438, mobile: 480 },
+ { date: '2024-06-10', desktop: 155, mobile: 200 },
+ { date: '2024-06-11', desktop: 92, mobile: 150 },
+ { date: '2024-06-12', desktop: 492, mobile: 420 },
+ { date: '2024-06-13', desktop: 81, mobile: 130 },
+ { date: '2024-06-14', desktop: 426, mobile: 380 },
+ { date: '2024-06-15', desktop: 307, mobile: 350 },
+ { date: '2024-06-16', desktop: 371, mobile: 310 },
+ { date: '2024-06-17', desktop: 475, mobile: 520 },
+ { date: '2024-06-18', desktop: 107, mobile: 170 },
+ { date: '2024-06-19', desktop: 341, mobile: 290 },
+ { date: '2024-06-20', desktop: 408, mobile: 450 },
+ { date: '2024-06-21', desktop: 169, mobile: 210 },
+ { date: '2024-06-22', desktop: 317, mobile: 270 },
+ { date: '2024-06-23', desktop: 480, mobile: 530 },
+ { date: '2024-06-24', desktop: 132, mobile: 180 },
+ { date: '2024-06-25', desktop: 141, mobile: 190 },
+ { date: '2024-06-26', desktop: 434, mobile: 380 },
+ { date: '2024-06-27', desktop: 448, mobile: 490 },
+ { date: '2024-06-28', desktop: 149, mobile: 200 },
+ { date: '2024-06-29', desktop: 103, mobile: 160 },
+ { date: '2024-06-30', desktop: 446, mobile: 400 },
+ ];
+
+ const chartConfig = {
+ views: {
+ label: 'Page Views',
+ },
+ desktop: {
+ label: 'Desktop',
+ color: 'hsl(var(--chart-1))',
+ },
+ mobile: {
+ label: 'Mobile',
+ color: 'hsl(var(--chart-2))',
+ },
+ } satisfies ChartConfig;
+
+ const total = useMemo(
+ () => ({
+ desktop: chartData.reduce((acc, curr) => acc + curr.desktop, 0),
+ mobile: chartData.reduce((acc, curr) => acc + curr.mobile, 0),
+ }),
+ [],
+ );
+
+ return (
+
+
+
+ Page Views
+
+
+ Showing total visitors for the last 3 months
+
+
+
+
+ {['desktop', 'mobile'].map((key) => {
+ const chart = key as keyof typeof chartConfig;
+ return (
+
+ );
+ })}
+
+
+
+
+
+
+
+ {
+ const date = new Date(value);
+ return date.toLocaleDateString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ });
+ }}
+ />
+ {
+ return new Date(value).toLocaleDateString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ });
+ }}
+ />
+ }
+ />
+
+
+
+
+
+ );
+}
diff --git a/apps/web/app/home/[account]/billing/error.tsx b/apps/web/app/home/[account]/billing/error.tsx
index 5eb160524..ef97b93c9 100644
--- a/apps/web/app/home/[account]/billing/error.tsx
+++ b/apps/web/app/home/[account]/billing/error.tsx
@@ -4,6 +4,7 @@ import { ExclamationTriangleIcon } from '@radix-ui/react-icons';
import { useCaptureException } from '@kit/monitoring/hooks';
import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert';
+import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs';
import { Button } from '@kit/ui/button';
import { PageBody, PageHeader } from '@kit/ui/page';
import { Trans } from '@kit/ui/trans';
@@ -20,8 +21,8 @@ export default function BillingErrorPage({
return (
<>
}
- description={}
+ title={}
+ description={}
/>
diff --git a/apps/web/app/home/[account]/billing/page.tsx b/apps/web/app/home/[account]/billing/page.tsx
index 0351b8d15..d727f276d 100644
--- a/apps/web/app/home/[account]/billing/page.tsx
+++ b/apps/web/app/home/[account]/billing/page.tsx
@@ -6,11 +6,13 @@ import {
CurrentSubscriptionCard,
} from '@kit/billing-gateway/components';
import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert';
+
import { If } from '@kit/ui/if';
import { PageBody } from '@kit/ui/page';
import { Trans } from '@kit/ui/trans';
import { cn } from '@kit/ui/utils';
+import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs';
import billingConfig from '~/config/billing.config';
import { createI18nServerInstance } from '~/lib/i18n/i18n.server';
import { withI18n } from '~/lib/i18n/with-i18n';
@@ -75,8 +77,8 @@ async function TeamAccountBillingPage({ params }: Params) {
<>
}
- description={}
+ title={}
+ description={}
/>
diff --git a/apps/web/app/home/[account]/members/page.tsx b/apps/web/app/home/[account]/members/page.tsx
index ef4391e10..03c68bece 100644
--- a/apps/web/app/home/[account]/members/page.tsx
+++ b/apps/web/app/home/[account]/members/page.tsx
@@ -18,6 +18,7 @@ import { If } from '@kit/ui/if';
import { PageBody } from '@kit/ui/page';
import { Trans } from '@kit/ui/trans';
+import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs';
import { createI18nServerInstance } from '~/lib/i18n/i18n.server';
import { withI18n } from '~/lib/i18n/with-i18n';
@@ -55,18 +56,18 @@ async function TeamAccountMembersPage({ params }: Params) {
return (
<>
}
- description={}
+ title={}
+ description={}
account={account.slug}
/>
-
+
-
+
diff --git a/apps/web/app/home/[account]/page.tsx b/apps/web/app/home/[account]/page.tsx
index 943efb768..6329981a1 100644
--- a/apps/web/app/home/[account]/page.tsx
+++ b/apps/web/app/home/[account]/page.tsx
@@ -1,10 +1,8 @@
import loadDynamic from 'next/dynamic';
-import { PlusCircle } from 'lucide-react';
-
-import { Button } from '@kit/ui/button';
+import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs';
+import { LoadingOverlay } from '@kit/ui/loading-overlay';
import { PageBody } from '@kit/ui/page';
-import { Spinner } from '@kit/ui/spinner';
import { Trans } from '@kit/ui/trans';
import { createI18nServerInstance } from '~/lib/i18n/i18n.server';
@@ -21,18 +19,11 @@ const DashboardDemo = loadDynamic(
{
ssr: false,
loading: () => (
-
+
+
),
},
);
@@ -51,14 +42,9 @@ function TeamAccountHomePage({ params }: { params: Params }) {
<>
}
- description={}
- >
-
-
+ title={}
+ description={}
+ />
diff --git a/apps/web/app/home/[account]/settings/page.tsx b/apps/web/app/home/[account]/settings/page.tsx
index f81a7de7d..321609d76 100644
--- a/apps/web/app/home/[account]/settings/page.tsx
+++ b/apps/web/app/home/[account]/settings/page.tsx
@@ -4,6 +4,7 @@ import { TeamAccountSettingsContainer } from '@kit/team-accounts/components';
import { PageBody } from '@kit/ui/page';
import { Trans } from '@kit/ui/trans';
+import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs';
import featuresFlagConfig from '~/config/feature-flags.config';
import pathsConfig from '~/config/paths.config';
import { createI18nServerInstance } from '~/lib/i18n/i18n.server';
@@ -51,7 +52,7 @@ async function TeamAccountSettingsPage(props: Props) {
}
- description={}
+ description={}
/>
diff --git a/apps/web/config/billing.sample.config.ts b/apps/web/config/billing.sample.config.ts
index 23bac72b0..c97d705dd 100644
--- a/apps/web/config/billing.sample.config.ts
+++ b/apps/web/config/billing.sample.config.ts
@@ -128,7 +128,7 @@ export default createBillingSchema({
{
id: 'price_enterprise_yearly',
name: 'Base',
- cost: 299.99,
+ cost: 299.90,
type: 'flat',
},
],
diff --git a/apps/web/config/personal-account-navigation.config.tsx b/apps/web/config/personal-account-navigation.config.tsx
index f9a253429..05da6f358 100644
--- a/apps/web/config/personal-account-navigation.config.tsx
+++ b/apps/web/config/personal-account-navigation.config.tsx
@@ -9,13 +9,13 @@ const iconClasses = 'w-4';
const routes = [
{
- label: 'common:homeTabLabel',
+ label: 'common:routes.home',
path: pathsConfig.app.home,
Icon: ,
end: true,
},
{
- label: 'account:accountTabLabel',
+ label: 'common:routes.account',
path: pathsConfig.app.personalAccountSettings,
Icon: ,
},
@@ -23,7 +23,7 @@ const routes = [
if (featureFlagsConfig.enablePersonalAccountBilling) {
routes.push({
- label: 'common:billingTabLabel',
+ label: 'common:routes.billing',
path: pathsConfig.app.personalAccountBilling,
Icon: ,
});
diff --git a/apps/web/config/team-account-navigation.config.tsx b/apps/web/config/team-account-navigation.config.tsx
index 139cd08f2..214b0fff4 100644
--- a/apps/web/config/team-account-navigation.config.tsx
+++ b/apps/web/config/team-account-navigation.config.tsx
@@ -9,28 +9,28 @@ const iconClasses = 'w-4';
const getRoutes = (account: string) => [
{
- label: 'common:dashboardTabLabel',
+ label: 'common:routes.dashboard',
path: pathsConfig.app.accountHome.replace('[account]', account),
Icon: ,
end: true,
},
{
- label: 'common:settingsTabLabel',
+ label: 'common:routes.settings',
collapsible: false,
children: [
{
- label: 'common:settingsTabLabel',
+ label: 'common:routes.settings',
path: createPath(pathsConfig.app.accountSettings, account),
Icon: ,
},
{
- label: 'common:accountMembers',
+ label: 'common:routes.members',
path: createPath(pathsConfig.app.accountMembers, account),
Icon: ,
},
featureFlagsConfig.enableTeamAccountBilling
? {
- label: 'common:billingTabLabel',
+ label: 'common:routes.billing',
path: createPath(pathsConfig.app.accountBilling, account),
Icon: ,
}
diff --git a/apps/web/content/posts/must-have-features.mdoc b/apps/web/content/posts/must-have-features.mdoc
index 0636c05fd..eb66b3983 100644
--- a/apps/web/content/posts/must-have-features.mdoc
+++ b/apps/web/content/posts/must-have-features.mdoc
@@ -8,8 +8,6 @@ publishedAt: 2024-04-12
status: "published"
---
-# Brainstorming Ideas for Your Next Micro SaaS
-
## Niche Service Solutions
Consider identifying a specific niche or industry with underserved needs. Whether it's project management tools tailored for creative freelancers or appointment scheduling software for niche healthcare practitioners, targeting a specific market can lead to a loyal customer base hungry for tailored solutions.
diff --git a/apps/web/public/locales/en/billing.json b/apps/web/public/locales/en/billing.json
index 6cba529dd..bd10fb6b9 100644
--- a/apps/web/public/locales/en/billing.json
+++ b/apps/web/public/locales/en/billing.json
@@ -26,6 +26,7 @@
"month": "Billed monthly",
"year": "Billed yearly"
},
+ "perMonth": "per month",
"custom": "Custom Plan",
"lifetime": "Lifetime",
"trialPeriod": "{{period}} day trial",
diff --git a/apps/web/public/locales/en/common.json b/apps/web/public/locales/en/common.json
index 16632219e..b06cb9073 100644
--- a/apps/web/public/locales/en/common.json
+++ b/apps/web/public/locales/en/common.json
@@ -1,7 +1,7 @@
{
"homeTabLabel": "Home",
"homeTabDescription": "Welcome to your home page",
- "accountMembers": "Members",
+ "accountMembers": "Team Members",
"membersTabDescription": "Here you can manage the members of your team.",
"billingTabLabel": "Billing",
"billingTabDescription": "Manage your billing and subscription",
@@ -55,6 +55,15 @@
"newVersionAvailableDescription": "A new version of the app is available. It is recommended to refresh the page to get the latest updates and avoid any issues.",
"newVersionSubmitButton": "Reload and Update",
"back": "Back",
+ "routes": {
+ "home": "Home",
+ "account": "Account",
+ "members": "Members",
+ "billing": "Billing",
+ "dashboard": "Dashboard",
+ "settings": "Settings",
+ "profile": "Profile"
+ },
"roles": {
"owner": {
"label": "Owner"
diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css
index b60f344de..4d1a906c9 100644
--- a/apps/web/styles/globals.css
+++ b/apps/web/styles/globals.css
@@ -4,69 +4,58 @@
@layer base {
:root {
- --background: 0deg 0% 100%;
- --foreground: 222.2deg 47.4% 11.2%;
-
- --muted: 210deg 40% 96.1%;
- --muted-foreground: 215.4deg 16.3% 46.9%;
-
- --popover: 0deg 0% 100%;
- --popover-foreground: 222.2deg 47.4% 11.2%;
-
- --border: 214.3deg 31.8% 94.4%;
- --input: 214.3deg 31.8% 91.4%;
-
- --card: 0deg 0% 100%;
- --card-foreground: 222.2deg 47.4% 11.2%;
-
- --primary: 222.2deg 47.4% 11.2%;
- --primary-foreground: 210deg 40% 98%;
-
- --secondary: 210deg 40% 96.1%;
- --secondary-foreground: 222.2deg 47.4% 11.2%;
-
- --accent: 210deg 40% 96.1%;
- --accent-foreground: 222.2deg 47.4% 11.2%;
-
- --destructive: 0deg 100% 50%;
- --destructive-foreground: 210deg 40% 98%;
-
- --ring: 215deg 20.2% 65.1%;
-
+ --background: 0 0% 100%;
+ --foreground: 224 71.4% 4.1%;
+ --card: 0 0% 100%;
+ --card-foreground: 224 71.4% 4.1%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 224 71.4% 4.1%;
+ --primary: 220.9 39.3% 11%;
+ --primary-foreground: 210 20% 98%;
+ --secondary: 220 14.3% 95.9%;
+ --secondary-foreground: 220.9 39.3% 11%;
+ --muted: 220 14.3% 95.9%;
+ --muted-foreground: 220 8.9% 46.1%;
+ --accent: 220 14.3% 95.9%;
+ --accent-foreground: 220.9 39.3% 11%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 20% 98%;
+ --border: 214.3 31.8% 94.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 224 71.4% 4.1%;
--radius: 0.5rem;
+ --chart-1: 12 76% 61%;
+ --chart-2: 173 58% 39%;
+ --chart-3: 197 37% 24%;
+ --chart-4: 43 74% 66%;
+ --chart-5: 27 87% 67%;
}
.dark {
- --background: 224 71% 4%;
- --foreground: 213 31% 91%;
-
- --muted: 223 47% 11%;
- --muted-foreground: 215.4 16.3% 56.9%;
-
- --accent: 216 34% 10%;
- --accent-foreground: 210 40% 98%;
-
- --popover: 224 71% 4%;
- --popover-foreground: 215 20.2% 65.1%;
-
- --border: 216 34% 17%;
- --input: 216 34% 17%;
-
- --card: 224 71% 4%;
- --card-foreground: 213 31% 91%;
-
- --primary: 210 40% 98%;
- --primary-foreground: 222.2 47.4% 1.2%;
-
- --secondary: 216 34% 10%;
- --secondary-foreground: 210 40% 98%;
-
- --destructive: 0 63% 31%;
- --destructive-foreground: 210 40% 98%;
-
- --ring: 216 34% 17%;
-
- --radius: 0.5rem;
+ --background: 224 71.4% 4.1%;
+ --foreground: 210 20% 98%;
+ --card: 224 71.4% 4.1%;
+ --card-foreground: 210 20% 98%;
+ --popover: 224 71.4% 4.1%;
+ --popover-foreground: 210 20% 98%;
+ --primary: 210 20% 98%;
+ --primary-foreground: 220.9 39.3% 11%;
+ --secondary: 215 27.9% 13%;
+ --secondary-foreground: 210 20% 98%;
+ --muted: 215 27.9% 13%;
+ --muted-foreground: 217.9 10.6% 64.9%;
+ --accent: 215 27.9% 13%;
+ --accent-foreground: 210 20% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 20% 98%;
+ --border: 215 27.9% 13%;
+ --input: 215 27.9% 13%;
+ --ring: 216 12.2% 83.9%;
+ --chart-1: 220 70% 50%;
+ --chart-2: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-5: 340 75% 55%;
}
}
diff --git a/apps/web/supabase/config.toml b/apps/web/supabase/config.toml
index 4c75726ea..594d5a496 100644
--- a/apps/web/supabase/config.toml
+++ b/apps/web/supabase/config.toml
@@ -89,4 +89,7 @@ content_path = "./supabase/templates/change-email-address.html"
[auth.email.template.magic_link]
subject = "Sign in to Makerkit"
-content_path = "./supabase/templates/magic-link.html"
\ No newline at end of file
+content_path = "./supabase/templates/magic-link.html"
+
+[analytics]
+enabled = false
\ No newline at end of file
diff --git a/packages/billing/gateway/src/components/line-item-details.tsx b/packages/billing/gateway/src/components/line-item-details.tsx
index 9337958b3..7a26745e3 100644
--- a/packages/billing/gateway/src/components/line-item-details.tsx
+++ b/packages/billing/gateway/src/components/line-item-details.tsx
@@ -1,4 +1,7 @@
+'use client';
+
import { PlusSquare } from 'lucide-react';
+import { useTranslation } from 'react-i18next';
import { z } from 'zod';
import type { LineItemSchema } from '@kit/billing';
@@ -16,6 +19,9 @@ export function LineItemDetails(
selectedInterval?: string | undefined;
}>,
) {
+ const locale = useTranslation().i18n.language;
+ const currencyCode = props?.currency.toLowerCase();
+
return (
{props.lineItems.map((item, index) => {
@@ -48,10 +54,11 @@ export function LineItemDetails(
@@ -89,7 +96,11 @@ export function LineItemDetails(
-
- {formatCurrency(props?.currency.toLowerCase(), item.cost)}
+ {formatCurrency({
+ currencyCode,
+ value: item.cost,
+ locale,
+ })}
@@ -129,7 +140,11 @@ export function LineItemDetails(
- {formatCurrency(props.currency.toLowerCase(), item.cost)}
+ {formatCurrency({
+ currencyCode,
+ value: item.cost,
+ locale,
+ })}
@@ -165,7 +180,11 @@ export function LineItemDetails(
{/* If there are no tiers, there is a flat cost for usage */}
- {formatCurrency(props?.currency.toLowerCase(), item.cost)}
+ {formatCurrency({
+ currencyCode,
+ value: item.cost,
+ locale,
+ })}
@@ -203,6 +222,7 @@ function Tiers({
item: z.infer
;
}) {
const unit = item.unit;
+ const locale = useTranslation().i18n.language;
const tiers = item.tiers?.map((tier, index) => {
const tiersLength = item.tiers?.length ?? 0;
@@ -228,7 +248,11 @@ function Tiers({
- {formatCurrency(currency.toLowerCase(), tier.cost)}
+ {formatCurrency({
+ currencyCode: currency.toLowerCase(),
+ value: tier.cost,
+ locale,
+ })}
1}>
@@ -264,7 +288,11 @@ function Tiers({
- {formatCurrency(currency.toLowerCase(), tier.cost)}
+ {formatCurrency({
+ currencyCode: currency.toLowerCase(),
+ value: tier.cost,
+ locale,
+ })}
diff --git a/packages/billing/gateway/src/components/plan-picker.tsx b/packages/billing/gateway/src/components/plan-picker.tsx
index 8ecfc2cbe..d34bb47b9 100644
--- a/packages/billing/gateway/src/components/plan-picker.tsx
+++ b/packages/billing/gateway/src/components/plan-picker.tsx
@@ -26,7 +26,6 @@ import {
FormLabel,
FormMessage,
} from '@kit/ui/form';
-import { Heading } from '@kit/ui/heading';
import { If } from '@kit/ui/if';
import { Label } from '@kit/ui/label';
import {
@@ -106,6 +105,8 @@ export function PlanPicker(
const isRecurringPlan =
selectedPlan?.paymentType === 'recurring' || !selectedPlan;
+ const locale = useTranslation().i18n.language;
+
return (