forked from baron/baron-sso
dev 병합 code-check 오류 수정
This commit is contained in:
@@ -561,10 +561,7 @@ function AppLayout() {
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
{isProfileOpen ? (
|
{isProfileOpen ? (
|
||||||
<div
|
<div role="menu" className={shellLayoutClasses.profileMenu}>
|
||||||
role="menu"
|
|
||||||
className={shellLayoutClasses.profileMenu}
|
|
||||||
>
|
|
||||||
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
||||||
{t("ui.dev.profile.menu_title", "Account")}
|
{t("ui.dev.profile.menu_title", "Account")}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -5,13 +5,17 @@ import {
|
|||||||
} from "../../../../common/ui/badge";
|
} from "../../../../common/ui/badge";
|
||||||
import { cn } from "../../lib/utils";
|
import { cn } from "../../lib/utils";
|
||||||
|
|
||||||
export interface BadgeProps
|
export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||||
extends React.HTMLAttributes<HTMLDivElement> {
|
|
||||||
variant?: CommonBadgeVariant;
|
variant?: CommonBadgeVariant;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||||
return <div className={cn(getCommonBadgeClasses({ variant }), className)} {...props} />;
|
return (
|
||||||
|
<div
|
||||||
|
className={cn(getCommonBadgeClasses({ variant }), className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Badge };
|
export { Badge };
|
||||||
|
|||||||
@@ -10,39 +10,28 @@ import {
|
|||||||
import { cn } from "../../lib/utils";
|
import { cn } from "../../lib/utils";
|
||||||
|
|
||||||
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardClass, className)} {...props} />;
|
||||||
<div
|
|
||||||
className={cn(commonCardClass, className)}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardHeader({
|
function CardHeader({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardHeaderClass, className)} {...props} />;
|
||||||
<div className={cn(commonCardHeaderClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardTitle({
|
function CardTitle({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
||||||
return (
|
return <h3 className={cn(commonCardTitleClass, className)} {...props} />;
|
||||||
<h3 className={cn(commonCardTitleClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardDescription({
|
function CardDescription({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
||||||
return (
|
return <p className={cn(commonCardDescriptionClass, className)} {...props} />;
|
||||||
<p className={cn(commonCardDescriptionClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardContent({
|
function CardContent({
|
||||||
@@ -56,9 +45,7 @@ function CardFooter({
|
|||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardFooterClass, className)} {...props} />;
|
||||||
<div className={cn(commonCardFooterClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
|||||||
@@ -10,10 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|||||||
return (
|
return (
|
||||||
<input
|
<input
|
||||||
type={type}
|
type={type}
|
||||||
className={cn(
|
className={cn(commonInputClass, className)}
|
||||||
commonInputClass,
|
|
||||||
className,
|
|
||||||
)}
|
|
||||||
ref={ref}
|
ref={ref}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -368,7 +368,10 @@ function TenantListPage() {
|
|||||||
const importParentOptionGroups =
|
const importParentOptionGroups =
|
||||||
buildTenantImportParentOptionGroups(allTenants);
|
buildTenantImportParentOptionGroups(allTenants);
|
||||||
const tenantSortResolvers = React.useMemo<
|
const tenantSortResolvers = React.useMemo<
|
||||||
SortResolverMap<TenantSummary & { recursiveMemberCount: number }, TenantSortKey>
|
SortResolverMap<
|
||||||
|
TenantSummary & { recursiveMemberCount: number },
|
||||||
|
TenantSortKey
|
||||||
|
>
|
||||||
>(
|
>(
|
||||||
() => ({
|
() => ({
|
||||||
recursiveMemberCount: (tenant) => tenant.recursiveMemberCount,
|
recursiveMemberCount: (tenant) => tenant.recursiveMemberCount,
|
||||||
|
|||||||
@@ -89,9 +89,8 @@ function UserListPage() {
|
|||||||
Record<string, boolean>
|
Record<string, boolean>
|
||||||
>({});
|
>({});
|
||||||
const [selectedUserIds, setSelectedUserIds] = React.useState<string[]>([]);
|
const [selectedUserIds, setSelectedUserIds] = React.useState<string[]>([]);
|
||||||
const [sortConfig, setSortConfig] = React.useState<SortConfig<UserSortKey> | null>(
|
const [sortConfig, setSortConfig] =
|
||||||
null,
|
React.useState<SortConfig<UserSortKey> | null>(null);
|
||||||
);
|
|
||||||
|
|
||||||
const limit = 1000;
|
const limit = 1000;
|
||||||
const offset = (page - 1) * limit;
|
const offset = (page - 1) * limit;
|
||||||
@@ -224,20 +223,22 @@ function UserListPage() {
|
|||||||
: null;
|
: null;
|
||||||
|
|
||||||
const rawItems = query.data?.items ?? [];
|
const rawItems = query.data?.items ?? [];
|
||||||
const userSortResolvers = React.useMemo<SortResolverMap<UserSummary, UserSortKey>>(
|
const userSortResolvers = React.useMemo<
|
||||||
|
SortResolverMap<UserSummary, UserSortKey>
|
||||||
|
>(
|
||||||
() =>
|
() =>
|
||||||
userSchema.reduce<SortResolverMap<UserSummary, UserSortKey>>(
|
userSchema.reduce<SortResolverMap<UserSummary, UserSortKey>>(
|
||||||
(accumulator, field) => ({
|
(accumulator, field) => {
|
||||||
...accumulator,
|
accumulator[field.key] = (user) => {
|
||||||
[field.key]: (user) => {
|
|
||||||
const value = user.metadata?.[field.key];
|
const value = user.metadata?.[field.key];
|
||||||
return typeof value === "string" ||
|
return typeof value === "string" ||
|
||||||
typeof value === "number" ||
|
typeof value === "number" ||
|
||||||
typeof value === "boolean"
|
typeof value === "boolean"
|
||||||
? value
|
? value
|
||||||
: null;
|
: null;
|
||||||
},
|
};
|
||||||
}),
|
return accumulator;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name_email: (user) =>
|
name_email: (user) =>
|
||||||
`${user.name ?? ""} ${user.email ?? ""} ${user.phone ?? ""}`,
|
`${user.name ?? ""} ${user.email ?? ""} ${user.phone ?? ""}`,
|
||||||
|
|||||||
@@ -26,8 +26,7 @@
|
|||||||
--input: 215 25% 24%;
|
--input: 215 25% 24%;
|
||||||
--ring: 209 79% 52%;
|
--ring: 209 79% 52%;
|
||||||
--radius: 0.75rem;
|
--radius: 0.75rem;
|
||||||
--app-background-image:
|
--app-background-image: radial-gradient(
|
||||||
radial-gradient(
|
|
||||||
circle at 10% 18%,
|
circle at 10% 18%,
|
||||||
rgba(54, 211, 153, 0.16),
|
rgba(54, 211, 153, 0.16),
|
||||||
transparent 28%
|
transparent 28%
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
import {
|
import { type RouteObject, createBrowserRouter } from "react-router-dom";
|
||||||
type RouteObject,
|
|
||||||
createBrowserRouter,
|
|
||||||
} from "react-router-dom";
|
|
||||||
import AppLayout from "../components/layout/AppLayout";
|
import AppLayout from "../components/layout/AppLayout";
|
||||||
import AuditLogsPage from "../features/audit/AuditLogsPage";
|
import AuditLogsPage from "../features/audit/AuditLogsPage";
|
||||||
import AuthCallbackPage from "../features/auth/AuthCallbackPage";
|
import AuthCallbackPage from "../features/auth/AuthCallbackPage";
|
||||||
|
|||||||
@@ -436,10 +436,7 @@ function AppLayout() {
|
|||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
{isProfileMenuOpen ? (
|
{isProfileMenuOpen ? (
|
||||||
<div
|
<div role="menu" className={shellLayoutClasses.profileMenu}>
|
||||||
role="menu"
|
|
||||||
className={shellLayoutClasses.profileMenu}
|
|
||||||
>
|
|
||||||
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
||||||
{t("ui.dev.profile.menu_title", "Account")}
|
{t("ui.dev.profile.menu_title", "Account")}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -5,13 +5,17 @@ import {
|
|||||||
} from "../../../../common/ui/badge";
|
} from "../../../../common/ui/badge";
|
||||||
import { cn } from "../../lib/utils";
|
import { cn } from "../../lib/utils";
|
||||||
|
|
||||||
export interface BadgeProps
|
export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||||
extends React.HTMLAttributes<HTMLDivElement> {
|
|
||||||
variant?: CommonBadgeVariant;
|
variant?: CommonBadgeVariant;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||||
return <div className={cn(getCommonBadgeClasses({ variant }), className)} {...props} />;
|
return (
|
||||||
|
<div
|
||||||
|
className={cn(getCommonBadgeClasses({ variant }), className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Badge };
|
export { Badge };
|
||||||
|
|||||||
@@ -10,39 +10,28 @@ import {
|
|||||||
import { cn } from "../../lib/utils";
|
import { cn } from "../../lib/utils";
|
||||||
|
|
||||||
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardClass, className)} {...props} />;
|
||||||
<div
|
|
||||||
className={cn(commonCardClass, className)}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardHeader({
|
function CardHeader({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardHeaderClass, className)} {...props} />;
|
||||||
<div className={cn(commonCardHeaderClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardTitle({
|
function CardTitle({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
||||||
return (
|
return <h3 className={cn(commonCardTitleClass, className)} {...props} />;
|
||||||
<h3 className={cn(commonCardTitleClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardDescription({
|
function CardDescription({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
||||||
return (
|
return <p className={cn(commonCardDescriptionClass, className)} {...props} />;
|
||||||
<p className={cn(commonCardDescriptionClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardContent({
|
function CardContent({
|
||||||
@@ -56,9 +45,7 @@ function CardFooter({
|
|||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardFooterClass, className)} {...props} />;
|
||||||
<div className={cn(commonCardFooterClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
|||||||
@@ -10,10 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|||||||
return (
|
return (
|
||||||
<input
|
<input
|
||||||
type={type}
|
type={type}
|
||||||
className={cn(
|
className={cn(commonInputClass, className)}
|
||||||
commonInputClass,
|
|
||||||
className,
|
|
||||||
)}
|
|
||||||
ref={ref}
|
ref={ref}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -129,7 +129,10 @@ function summarizeSeries(rows: RPUsageDailyMetric[]): SeriesSummary[] {
|
|||||||
} satisfies SeriesSummary);
|
} satisfies SeriesSummary);
|
||||||
current.loginRequests += row.loginRequests;
|
current.loginRequests += row.loginRequests;
|
||||||
current.otherRequests += row.otherRequests;
|
current.otherRequests += row.otherRequests;
|
||||||
current.uniqueSubjects = Math.max(current.uniqueSubjects, row.uniqueSubjects);
|
current.uniqueSubjects = Math.max(
|
||||||
|
current.uniqueSubjects,
|
||||||
|
row.uniqueSubjects,
|
||||||
|
);
|
||||||
bySeries.set(key, current);
|
bySeries.set(key, current);
|
||||||
}
|
}
|
||||||
return Array.from(bySeries.values())
|
return Array.from(bySeries.values())
|
||||||
@@ -153,12 +156,10 @@ function buildMultiLineSeries(rows: RPUsageDailyMetric[]): MultiLineSeries[] {
|
|||||||
>();
|
>();
|
||||||
|
|
||||||
for (const row of rows) {
|
for (const row of rows) {
|
||||||
const current =
|
const current = byClient.get(row.clientId) ?? {
|
||||||
byClient.get(row.clientId) ??
|
clientLabel: row.clientName || row.clientId,
|
||||||
{
|
byDate: new Map<string, DailyPoint>(),
|
||||||
clientLabel: row.clientName || row.clientId,
|
};
|
||||||
byDate: new Map<string, DailyPoint>(),
|
|
||||||
};
|
|
||||||
const point =
|
const point =
|
||||||
current.byDate.get(row.date) ??
|
current.byDate.get(row.date) ??
|
||||||
({
|
({
|
||||||
@@ -173,7 +174,9 @@ function buildMultiLineSeries(rows: RPUsageDailyMetric[]): MultiLineSeries[] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return Array.from(byClient.entries())
|
return Array.from(byClient.entries())
|
||||||
.sort((left, right) => left[1].clientLabel.localeCompare(right[1].clientLabel))
|
.sort((left, right) =>
|
||||||
|
left[1].clientLabel.localeCompare(right[1].clientLabel),
|
||||||
|
)
|
||||||
.map(([clientId, entry], index) => ({
|
.map(([clientId, entry], index) => ({
|
||||||
key: clientId,
|
key: clientId,
|
||||||
clientLabel: entry.clientLabel,
|
clientLabel: entry.clientLabel,
|
||||||
@@ -307,10 +310,7 @@ function RPUsageMixedChart({
|
|||||||
if (daily.length === 0) {
|
if (daily.length === 0) {
|
||||||
return (
|
return (
|
||||||
<div className="flex min-h-[210px] items-center justify-center text-sm text-muted-foreground">
|
<div className="flex min-h-[210px] items-center justify-center text-sm text-muted-foreground">
|
||||||
{t(
|
{t("msg.dev.dashboard.chart.empty", "표시할 RP 이용 집계가 없습니다.")}
|
||||||
"msg.dev.dashboard.chart.empty",
|
|
||||||
"표시할 RP 이용 집계가 없습니다.",
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -477,11 +477,15 @@ function RPUsageMixedChart({
|
|||||||
<div key={item.key} className="flex min-w-0 items-center gap-2">
|
<div key={item.key} className="flex min-w-0 items-center gap-2">
|
||||||
<span className="truncate font-medium">{item.clientLabel}</span>
|
<span className="truncate font-medium">{item.clientLabel}</span>
|
||||||
<span className="ml-auto whitespace-nowrap tabular-nums">
|
<span className="ml-auto whitespace-nowrap tabular-nums">
|
||||||
{t("ui.dev.dashboard.chart.series", "로그인 {{login}} / 기타 {{other}} / 사용자 {{subjects}}", {
|
{t(
|
||||||
login: item.loginRequests.toLocaleString(),
|
"ui.dev.dashboard.chart.series",
|
||||||
other: item.otherRequests.toLocaleString(),
|
"로그인 {{login}} / 기타 {{other}} / 사용자 {{subjects}}",
|
||||||
subjects: item.uniqueSubjects.toLocaleString(),
|
{
|
||||||
})}
|
login: item.loginRequests.toLocaleString(),
|
||||||
|
other: item.otherRequests.toLocaleString(),
|
||||||
|
subjects: item.uniqueSubjects.toLocaleString(),
|
||||||
|
},
|
||||||
|
)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
@@ -582,9 +586,11 @@ function DashboardPage() {
|
|||||||
"msg.dev.dashboard.chart.unavailable_with_reason",
|
"msg.dev.dashboard.chart.unavailable_with_reason",
|
||||||
"RP 이용 통계 API 응답을 확인할 수 없습니다. {{reason}}",
|
"RP 이용 통계 API 응답을 확인할 수 없습니다. {{reason}}",
|
||||||
{
|
{
|
||||||
reason: usageErrorMessage || t("err.common.unknown", "알 수 없는 오류"),
|
reason:
|
||||||
|
usageErrorMessage ||
|
||||||
|
t("err.common.unknown", "알 수 없는 오류"),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
const isAllClientsSelected = selectedClientIds.length === 0;
|
const isAllClientsSelected = selectedClientIds.length === 0;
|
||||||
|
|
||||||
const toggleClientSelection = (clientId: string) => {
|
const toggleClientSelection = (clientId: string) => {
|
||||||
@@ -712,9 +718,7 @@ function DashboardPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{usageQuery.isError ? (
|
{usageQuery.isError ? (
|
||||||
<div className="text-sm text-muted-foreground">
|
<div className="text-sm text-muted-foreground">{usageErrorText}</div>
|
||||||
{usageErrorText}
|
|
||||||
</div>
|
|
||||||
) : isAllClientsSelected ? (
|
) : isAllClientsSelected ? (
|
||||||
<RPUsageMixedChart rows={filteredUsageRows} period={period} />
|
<RPUsageMixedChart rows={filteredUsageRows} period={period} />
|
||||||
) : (
|
) : (
|
||||||
@@ -762,10 +766,7 @@ function DashboardPage() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="rounded-xl border border-border/60 bg-secondary/30 p-4">
|
<div className="rounded-xl border border-border/60 bg-secondary/30 p-4">
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
{t(
|
{t("ui.dev.dashboard.distribution.headless", "Headless Login")}
|
||||||
"ui.dev.dashboard.distribution.headless",
|
|
||||||
"Headless Login",
|
|
||||||
)}
|
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-2 text-2xl font-semibold tabular-nums">
|
<p className="mt-2 text-2xl font-semibold tabular-nums">
|
||||||
{distribution.headlessClients.toLocaleString()}
|
{distribution.headlessClients.toLocaleString()}
|
||||||
@@ -817,10 +818,7 @@ function DashboardPage() {
|
|||||||
"Server side App (Headless Login)",
|
"Server side App (Headless Login)",
|
||||||
)
|
)
|
||||||
: client.type === "private"
|
: client.type === "private"
|
||||||
? t(
|
? t("ui.dev.clients.type.private", "Server side App")
|
||||||
"ui.dev.clients.type.private",
|
|
||||||
"Server side App",
|
|
||||||
)
|
|
||||||
: t("ui.dev.clients.type.pkce", "PKCE")}
|
: t("ui.dev.clients.type.pkce", "PKCE")}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
@@ -26,8 +26,7 @@
|
|||||||
--input: 215 25% 24%;
|
--input: 215 25% 24%;
|
||||||
--ring: 209 79% 52%;
|
--ring: 209 79% 52%;
|
||||||
--radius: 0.75rem;
|
--radius: 0.75rem;
|
||||||
--app-background-image:
|
--app-background-image: radial-gradient(
|
||||||
radial-gradient(
|
|
||||||
circle at 10% 18%,
|
circle at 10% 18%,
|
||||||
rgba(54, 211, 153, 0.16),
|
rgba(54, 211, 153, 0.16),
|
||||||
transparent 28%
|
transparent 28%
|
||||||
|
|||||||
@@ -421,10 +421,7 @@ function AppLayout() {
|
|||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
{isProfileMenuOpen ? (
|
{isProfileMenuOpen ? (
|
||||||
<div
|
<div role="menu" className={shellLayoutClasses.profileMenu}>
|
||||||
role="menu"
|
|
||||||
className={shellLayoutClasses.profileMenu}
|
|
||||||
>
|
|
||||||
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
||||||
{t("ui.dev.profile.menu_title", "Account")}
|
{t("ui.dev.profile.menu_title", "Account")}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -5,13 +5,17 @@ import {
|
|||||||
} from "../../../../common/ui/badge";
|
} from "../../../../common/ui/badge";
|
||||||
import { cn } from "../../lib/utils";
|
import { cn } from "../../lib/utils";
|
||||||
|
|
||||||
export interface BadgeProps
|
export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||||
extends React.HTMLAttributes<HTMLDivElement> {
|
|
||||||
variant?: CommonBadgeVariant;
|
variant?: CommonBadgeVariant;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||||
return <div className={cn(getCommonBadgeClasses({ variant }), className)} {...props} />;
|
return (
|
||||||
|
<div
|
||||||
|
className={cn(getCommonBadgeClasses({ variant }), className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Badge };
|
export { Badge };
|
||||||
|
|||||||
@@ -10,39 +10,28 @@ import {
|
|||||||
import { cn } from "../../lib/utils";
|
import { cn } from "../../lib/utils";
|
||||||
|
|
||||||
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardClass, className)} {...props} />;
|
||||||
<div
|
|
||||||
className={cn(commonCardClass, className)}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardHeader({
|
function CardHeader({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardHeaderClass, className)} {...props} />;
|
||||||
<div className={cn(commonCardHeaderClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardTitle({
|
function CardTitle({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
||||||
return (
|
return <h3 className={cn(commonCardTitleClass, className)} {...props} />;
|
||||||
<h3 className={cn(commonCardTitleClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardDescription({
|
function CardDescription({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
||||||
return (
|
return <p className={cn(commonCardDescriptionClass, className)} {...props} />;
|
||||||
<p className={cn(commonCardDescriptionClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function CardContent({
|
function CardContent({
|
||||||
@@ -56,9 +45,7 @@ function CardFooter({
|
|||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return <div className={cn(commonCardFooterClass, className)} {...props} />;
|
||||||
<div className={cn(commonCardFooterClass, className)} {...props} />
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
|||||||
@@ -10,10 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|||||||
return (
|
return (
|
||||||
<input
|
<input
|
||||||
type={type}
|
type={type}
|
||||||
className={cn(
|
className={cn(commonInputClass, className)}
|
||||||
commonInputClass,
|
|
||||||
className,
|
|
||||||
)}
|
|
||||||
ref={ref}
|
ref={ref}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user