← back to kdsplus__test002

Function bodies 63 total

All specs Real LLM only Function bodies
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]/ta
TabsContent 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