Skip to content

Commit a3f05d9

Browse files
committed
fix layout
1 parent aa2b83d commit a3f05d9

1 file changed

Lines changed: 79 additions & 11 deletions

File tree

src/components/ui/Card.tsx

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,88 @@
11
import classNames from "classnames";
2-
import { ReactElement, ReactNode } from "react";
2+
import React, { ReactElement, ReactNode } from "react";
33
import { useAnchoredElement } from "../../hooks/useAnchoredElement";
44
import { CardActionsMenu, CardAction } from "./CardActionsMenu";
55
import { CardAnchorLink } from "./CardAnchorLink";
66

77
export type { CardAction };
88

9+
function groupFieldsByColumn(
10+
fields: ReactNode[],
11+
columnCount: number,
12+
): ReactNode[][] {
13+
const columns: ReactNode[][] = Array.from({ length: columnCount }, () => []);
14+
const fieldsPerColumn = Math.ceil(fields.length / columnCount);
15+
fields.forEach((field, index) => {
16+
columns[Math.floor(index / fieldsPerColumn)].push(field);
17+
});
18+
return columns;
19+
}
20+
21+
function FieldsColumnGroup({
22+
fields,
23+
columnCount,
24+
className,
25+
}: {
26+
fields: ReactNode[];
27+
columnCount: number;
28+
className?: string;
29+
}): ReactElement {
30+
const columns = groupFieldsByColumn(fields, columnCount);
31+
32+
return (
33+
<div
34+
className={classNames(
35+
"grid w-full items-start divide-x divide-border",
36+
columnCount === 2 && "grid-cols-2",
37+
columnCount === 3 && "grid-cols-3",
38+
className,
39+
)}
40+
>
41+
{columns.map((columnFields, index) => (
42+
<dl
43+
key={index}
44+
className={classNames(
45+
"grid min-w-0 grid-cols-[auto_1fr] content-start gap-x-3 gap-y-0.5 self-start",
46+
index === 0
47+
? "pr-4"
48+
: index === columns.length - 1
49+
? "pl-4"
50+
: "px-4",
51+
)}
52+
>
53+
{columnFields}
54+
</dl>
55+
))}
56+
</div>
57+
);
58+
}
59+
60+
function ResponsiveFieldsBody({
61+
children,
62+
}: {
63+
children: ReactNode;
64+
}): ReactElement {
65+
const fields = React.Children.toArray(children);
66+
67+
return (
68+
<>
69+
<dl className="grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-base md:hidden">
70+
{fields}
71+
</dl>
72+
<FieldsColumnGroup
73+
fields={fields}
74+
columnCount={2}
75+
className="hidden text-base md:grid xl:hidden"
76+
/>
77+
<FieldsColumnGroup
78+
fields={fields}
79+
columnCount={3}
80+
className="hidden text-base xl:grid"
81+
/>
82+
</>
83+
);
84+
}
85+
986
export function Card({
1087
title,
1188
children,
@@ -64,16 +141,7 @@ export function Card({
64141
{children}
65142
</dl>
66143
) : variant === "responsive-fields" ? (
67-
<dl
68-
className={classNames(
69-
"grid gap-x-3 gap-y-0.5 text-base",
70-
"grid-cols-[auto_1fr]",
71-
"md:grid-cols-[auto_1fr_auto_1fr]",
72-
"xl:grid-cols-[auto_1fr_auto_1fr_auto_1fr]",
73-
)}
74-
>
75-
{children}
76-
</dl>
144+
<ResponsiveFieldsBody>{children}</ResponsiveFieldsBody>
77145
) : (
78146
children
79147
)}

0 commit comments

Comments
 (0)