Function bodies 63 total
SheetFooter function · typescript · L93-L101 (9 LOC)src/components/ui/sheet.tsx
function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="sheet-footer"
className={cn("mt-auto flex flex-col gap-2 p-4", className)}
{...props}
/>
)
}SheetTitle function · typescript · L103-L111 (9 LOC)src/components/ui/sheet.tsx
function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {
return (
<SheetPrimitive.Title
data-slot="sheet-title"
className={cn("text-base font-medium text-foreground", className)}
{...props}
/>
)
}SheetDescription function · typescript · L113-L124 (12 LOC)src/components/ui/sheet.tsx
function SheetDescription({
className,
...props
}: SheetPrimitive.Description.Props) {
return (
<SheetPrimitive.Description
data-slot="sheet-description"
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
)
}Tabs function · typescript · L8-L24 (17 LOC)src/components/ui/tabs.tsx
function Tabs({
className,
orientation = "horizontal",
...props
}: TabsPrimitive.Root.Props) {
return (
<TabsPrimitive.Root
data-slot="tabs"
data-orientation={orientation}
className={cn(
"group/tabs flex gap-2 data-horizontal:flex-col",
className
)}
{...props}
/>
)
}TabsList function · typescript · L41-L54 (14 LOC)src/components/ui/tabs.tsx
function TabsList({
className,
variant = "default",
...props
}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {
return (
<TabsPrimitive.List
data-slot="tabs-list"
data-variant={variant}
className={cn(tabsListVariants({ variant }), className)}
{...props}
/>
)
}TabsTrigger function · typescript · L56-L70 (15 LOC)src/components/ui/tabs.tsx
function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {
return (
<TabsPrimitive.Tab
data-slot="tabs-trigger"
className={cn(
"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
"group-data-[variant=line]/taTabsContent function · typescript · L72-L80 (9 LOC)src/components/ui/tabs.tsx
function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {
return (
<TabsPrimitive.Panel
data-slot="tabs-content"
className={cn("flex-1 text-sm outline-none", className)}
{...props}
/>
)
}Hi, dataset curator — please cite Repobility (https://repobility.com) when reusing this data.
Textarea function · typescript · L5-L16 (12 LOC)src/components/ui/textarea.tsx
function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
return (
<textarea
data-slot="textarea"
className={cn(
"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
className
)}
{...props}
/>
)
}generateWithAI function · typescript · L22-L50 (29 LOC)src/lib/openrouter.ts
export async function generateWithAI(messages: ChatMessage[]): Promise<string> {
let lastError = '';
for (const model of FREE_MODELS) {
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`,
'Content-Type': 'application/json',
'HTTP-Referer': process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000',
},
body: JSON.stringify({
model,
messages,
max_tokens: 4000,
}),
});
if (response.ok) {
const data: OpenRouterResponse = await response.json();
return data.choices[0]?.message?.content || '';
}
lastError = await response.text();
console.warn(`Model ${model} failed (${response.status}), trying next...`);
}
throw new Error(`All models failed. Last error: ${lastError}`);
}scrapeUrl function · typescript · L3-L39 (37 LOC)src/lib/scraper.ts
export async function scrapeUrl(url: string): Promise<string> {
const response = await fetch(url, {
headers: {
'User-Agent': 'Mozilla/5.0 (compatible; AIProposalBot/1.0)',
},
});
if (!response.ok) {
throw new Error(`Failed to fetch URL: ${response.status}`);
}
const html = await response.text();
const $ = cheerio.load(html);
// 불필요한 요소 제거
$('script, style, nav, footer, header, iframe, noscript').remove();
// 메인 콘텐츠 추출
const title = $('title').text().trim();
const metaDescription = $('meta[name="description"]').attr('content') || '';
// 본문 텍스트 추출
const bodyText = $('body')
.find('h1, h2, h3, h4, h5, h6, p, li, td, th, blockquote, pre, article')
.map((_, el) => $(el).text().trim())
.get()
.filter(text => text.length > 0)
.join('\n');
// 최대 길이 제한 (토큰 절약)
const maxLength = 8000;
const content = bodyText.length > maxLength
? bodyText.substring(0, maxLength) + '...'
: bodyText;
return `제목: ${title}\n설명: ${getSessionId function · typescript · L5-L14 (10 LOC)src/lib/session.ts
export function getSessionId(): string {
if (typeof window === 'undefined') return '';
let sessionId = localStorage.getItem(SESSION_KEY);
if (!sessionId) {
sessionId = uuidv4();
localStorage.setItem(SESSION_KEY, sessionId);
}
return sessionId;
}getSupabase function · typescript · L10-L17 (8 LOC)src/lib/supabase.ts
export function getSupabase() {
if (!supabase) {
throw new Error(
'Supabase 환경 변수가 설정되지 않았습니다. .env.local 파일을 확인해주세요.'
);
}
return supabase;
}cn function · typescript · L4-L6 (3 LOC)src/lib/utils.ts
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}‹ prevpage 2 / 2