Skip to content

Commit fefe44d

Browse files
committed
feat: component for prompt patterns formatting
1 parent 14e9208 commit fefe44d

7 files changed

+406
-0
lines changed

components/PromptPatterns.tsx

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import {
2+
Accordion,
3+
AccordionContent,
4+
AccordionItem,
5+
AccordionTrigger,
6+
} from "@/components/ui/accordion";
7+
import { PromptPattern, promptPatterns } from "@/data/prompt-patterns";
8+
import { Heading3, Heading4 } from "./Headings";
9+
10+
const patterns = promptPatterns.sort((a, b) => a.name.localeCompare(b.name));
11+
12+
export function PromptPatternsList({ children, ...props }: { children: React.ReactNode }) {
13+
return (
14+
<ul className="mb-2 list-disc pl-4" {...props}>
15+
{children}
16+
</ul>
17+
);
18+
}
19+
export function PromptPatterns() {
20+
return (
21+
<Accordion type="multiple">
22+
{patterns.map(
23+
({
24+
name,
25+
category,
26+
intent,
27+
motivation,
28+
structure,
29+
examples,
30+
consequences,
31+
}: PromptPattern) => (
32+
<AccordionItem value={name} key={name}>
33+
<AccordionTrigger>{name}</AccordionTrigger>
34+
<AccordionContent>
35+
<div className="p-4 rounded-md bg-purple-100">
36+
<Heading3 className="mb-4">{name}</Heading3>
37+
38+
<Heading4 className="mb-2">Example</Heading4>
39+
40+
<PromptPatternsList>
41+
{examples.map((example, index) => (
42+
<li key={index}>
43+
<pre className="text-wrap">
44+
<blockquote>{example}</blockquote>
45+
</pre>
46+
</li>
47+
))}
48+
</PromptPatternsList>
49+
50+
<Heading4 className="mb-2">Intent</Heading4>
51+
52+
<PromptPatternsList>
53+
{intent.map((item, index) => (
54+
<li key={index}>{item}</li>
55+
))}
56+
</PromptPatternsList>
57+
58+
<Heading4 className="mb-2">Motivation</Heading4>
59+
60+
<PromptPatternsList>
61+
{motivation.map((item, index) => (
62+
<li key={index}>{item}</li>
63+
))}
64+
</PromptPatternsList>
65+
66+
<Heading4 className="mb-2">Structure</Heading4>
67+
68+
<PromptPatternsList>
69+
{structure.map((item, index) => (
70+
<li key={index}>{item}</li>
71+
))}
72+
</PromptPatternsList>
73+
74+
<Heading4 className="mb-2">Consequences</Heading4>
75+
76+
<PromptPatternsList>
77+
{consequences.map((item, index) => (
78+
<li key={index}>{item}</li>
79+
))}
80+
</PromptPatternsList>
81+
</div>
82+
</AccordionContent>
83+
</AccordionItem>
84+
)
85+
)}
86+
</Accordion>
87+
);
88+
}

components/ui/accordion.tsx

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"use client"
2+
3+
import * as React from "react"
4+
import * as AccordionPrimitive from "@radix-ui/react-accordion"
5+
import { ChevronDown } from "lucide-react"
6+
7+
import { cn } from "@/lib/utils"
8+
9+
const Accordion = AccordionPrimitive.Root
10+
11+
const AccordionItem = React.forwardRef<
12+
React.ElementRef<typeof AccordionPrimitive.Item>,
13+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
14+
>(({ className, ...props }, ref) => (
15+
<AccordionPrimitive.Item
16+
ref={ref}
17+
className={cn("border-b", className)}
18+
{...props}
19+
/>
20+
))
21+
AccordionItem.displayName = "AccordionItem"
22+
23+
const AccordionTrigger = React.forwardRef<
24+
React.ElementRef<typeof AccordionPrimitive.Trigger>,
25+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
26+
>(({ className, children, ...props }, ref) => (
27+
<AccordionPrimitive.Header className="flex">
28+
<AccordionPrimitive.Trigger
29+
ref={ref}
30+
className={cn(
31+
"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
32+
className
33+
)}
34+
{...props}
35+
>
36+
{children}
37+
<ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" />
38+
</AccordionPrimitive.Trigger>
39+
</AccordionPrimitive.Header>
40+
))
41+
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
42+
43+
const AccordionContent = React.forwardRef<
44+
React.ElementRef<typeof AccordionPrimitive.Content>,
45+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
46+
>(({ className, children, ...props }, ref) => (
47+
<AccordionPrimitive.Content
48+
ref={ref}
49+
className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
50+
{...props}
51+
>
52+
<div className={cn("pb-4 pt-0", className)}>{children}</div>
53+
</AccordionPrimitive.Content>
54+
))
55+
56+
AccordionContent.displayName = AccordionPrimitive.Content.displayName
57+
58+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }

data/posts/openai-prompt-patterns.mdx

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ date: "2024-07-01"
66

77
While going through a course on prompt engineering, I came across a great research paper called "A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT." The paper contains a lot of good prompt engineering techniques, so I wanted to summarize them here as a cheat sheet.
88

9+
<PromptPatterns />

mdx-components.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
AINewsletterCard,
1515
} from "./components/ui/card";
1616
import { TwitterLink } from "./components/Link";
17+
import { PromptPatterns } from "./components/PromptPatterns";
1718

1819
export const mdxComponents = {
1920
...rendererMapLowercase,
@@ -27,6 +28,7 @@ export const mdxComponents = {
2728
CardFooter,
2829
CardTitle,
2930
CardDescription,
31+
PromptPatterns,
3032
AINewsletterCard,
3133
TwitterLink,
3234
};

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"@mdx-js/react": "^3.0.1",
1919
"@next/mdx": "^14.2.3",
2020
"@next/third-parties": "^14.2.3",
21+
"@radix-ui/react-accordion": "^1.2.0",
2122
"@radix-ui/react-dialog": "^1.0.5",
2223
"@radix-ui/react-dropdown-menu": "^2.0.6",
2324
"@radix-ui/react-navigation-menu": "^1.1.4",

0 commit comments

Comments
 (0)