Skip to content

Commit 18e1dce

Browse files
ericyangpanclaude
andcommitted
feat(components): add special 2-column layout for Agent Protocols
Implement dynamic grid layout for specifications section where Agent Protocols card spans full height in a 2x2 grid configuration. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 4748ba8 commit 18e1dce

File tree

1 file changed

+42
-25
lines changed

1 file changed

+42
-25
lines changed

src/components/product/CollectionSection.tsx

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ interface CollectionSectionProps {
99
* Renders a collection section with its title, description, and subsections
1010
*/
1111
export default function CollectionSection({ id, section }: CollectionSectionProps) {
12+
// For specifications section, use special 2-column layout where Agent Protocols spans full height
13+
const isSpecifications = id === 'specifications'
14+
const hasAgentProtocols =
15+
isSpecifications && section.sections.some(s => s.title.includes('Agent Protocols'))
16+
1217
return (
1318
<section id={id} className="mb-[var(--spacing-xl)] scroll-mt-[100px]">
1419
<div className="mb-[var(--spacing-lg)] border-l-2 border-[var(--color-border-strong)] pl-[var(--spacing-md)]">
@@ -20,31 +25,43 @@ export default function CollectionSection({ id, section }: CollectionSectionProp
2025
</p>
2126
</div>
2227

23-
<div className="grid grid-cols-1 lg:grid-cols-2 gap-[var(--spacing-md)]">
24-
{section.sections.map(subSection => (
25-
<div
26-
key={subSection.title}
27-
className="border border-[var(--color-border)] p-[var(--spacing-md)]"
28-
>
29-
<h3 className="text-lg font-semibold tracking-tight mb-[var(--spacing-md)]">
30-
{subSection.title}
31-
</h3>
32-
<ul className="space-y-[var(--spacing-md)]">
33-
{subSection.items.map(item => (
34-
<li key={item.url}>
35-
<a href={item.url} target="_blank" rel="noopener" className="group block">
36-
<div className="text-base font-medium text-[var(--color-text)] group-hover:underline">
37-
{item.name}
38-
</div>
39-
<p className="text-sm text-[var(--color-text-secondary)] font-light mt-[var(--spacing-xs)]">
40-
{item.description}
41-
</p>
42-
</a>
43-
</li>
44-
))}
45-
</ul>
46-
</div>
47-
))}
28+
<div
29+
className={
30+
hasAgentProtocols
31+
? 'grid grid-cols-1 lg:grid-cols-2 grid-rows-2 gap-[var(--spacing-md)]'
32+
: 'grid grid-cols-1 lg:grid-cols-2 gap-[var(--spacing-md)]'
33+
}
34+
>
35+
{section.sections.map((subSection, _index) => {
36+
const isAgentProtocols = subSection.title.includes('Agent Protocols')
37+
const colSpanClass =
38+
hasAgentProtocols && isAgentProtocols ? 'lg:col-span-1 lg:row-span-2' : ''
39+
40+
return (
41+
<div
42+
key={subSection.title}
43+
className={`border border-[var(--color-border)] p-[var(--spacing-md)] ${colSpanClass}`}
44+
>
45+
<h3 className="text-lg font-semibold tracking-tight mb-[var(--spacing-md)]">
46+
{subSection.title}
47+
</h3>
48+
<ul className="space-y-[var(--spacing-md)]">
49+
{subSection.items.map(item => (
50+
<li key={item.url}>
51+
<a href={item.url} target="_blank" rel="noopener" className="group block">
52+
<div className="text-base font-medium text-[var(--color-text)] group-hover:underline">
53+
{item.name}
54+
</div>
55+
<p className="text-sm text-[var(--color-text-secondary)] font-light mt-[var(--spacing-xs)]">
56+
{item.description}
57+
</p>
58+
</a>
59+
</li>
60+
))}
61+
</ul>
62+
</div>
63+
)
64+
})}
4865
</div>
4966
</section>
5067
)

0 commit comments

Comments
 (0)