/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ 'use client' import { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react' import { type ComponentProps, createContext, useCallback, useContext, useEffect, useState, } from 'react' import { useTranslation } from 'react-i18next' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Carousel, type CarouselApi, CarouselContent, CarouselItem, } from '@/components/ui/carousel' import { HoverCard, HoverCardContent, HoverCardTrigger, } from '@/components/ui/hover-card' import { cn } from '@/lib/utils' export type InlineCitationProps = ComponentProps<'span'> export const InlineCitation = ({ className, ...props }: InlineCitationProps) => ( ) export type InlineCitationTextProps = ComponentProps<'span'> export const InlineCitationText = ({ className, ...props }: InlineCitationTextProps) => ( ) export type InlineCitationCardProps = ComponentProps export const InlineCitationCard = (props: InlineCitationCardProps) => ( ) export type InlineCitationCardTriggerProps = ComponentProps & { sources: string[] } export const InlineCitationCardTrigger = ({ sources, className, ...props }: InlineCitationCardTriggerProps) => ( {sources[0] ? ( <> {new URL(sources[0]).hostname}{' '} {sources.length > 1 && `+${sources.length - 1}`} ) : ( 'unknown' )} } /> ) export type InlineCitationCardBodyProps = ComponentProps<'div'> export const InlineCitationCardBody = ({ className, ...props }: InlineCitationCardBodyProps) => ( ) const CarouselApiContext = createContext(undefined) const useCarouselApi = () => { const context = useContext(CarouselApiContext) return context } export type InlineCitationCarouselProps = ComponentProps export const InlineCitationCarousel = ({ className, children, ...props }: InlineCitationCarouselProps) => { const [api, setApi] = useState() return ( {children} ) } export type InlineCitationCarouselContentProps = ComponentProps<'div'> export const InlineCitationCarouselContent = ( props: InlineCitationCarouselContentProps ) => export type InlineCitationCarouselItemProps = ComponentProps<'div'> export const InlineCitationCarouselItem = ({ className, ...props }: InlineCitationCarouselItemProps) => ( ) export type InlineCitationCarouselHeaderProps = ComponentProps<'div'> export const InlineCitationCarouselHeader = ({ className, ...props }: InlineCitationCarouselHeaderProps) => (
) export type InlineCitationCarouselIndexProps = ComponentProps<'div'> export const InlineCitationCarouselIndex = ({ children, className, ...props }: InlineCitationCarouselIndexProps) => { const api = useCarouselApi() const [current, setCurrent] = useState(0) const [count, setCount] = useState(0) useEffect(() => { if (!api) { return } // eslint-disable-next-line react-hooks/set-state-in-effect setCount(api.scrollSnapList().length) setCurrent(api.selectedScrollSnap() + 1) api.on('select', () => { setCurrent(api.selectedScrollSnap() + 1) }) }, [api]) return (
{children ?? `${current}/${count}`}
) } export type InlineCitationCarouselPrevProps = ComponentProps<'button'> export const InlineCitationCarouselPrev = ({ className, ...props }: InlineCitationCarouselPrevProps) => { const { t } = useTranslation() const api = useCarouselApi() const handleClick = useCallback(() => { if (api) { api.scrollPrev() } }, [api]) return ( ) } export type InlineCitationCarouselNextProps = ComponentProps<'button'> export const InlineCitationCarouselNext = ({ className, ...props }: InlineCitationCarouselNextProps) => { const { t } = useTranslation() const api = useCarouselApi() const handleClick = useCallback(() => { if (api) { api.scrollNext() } }, [api]) return ( ) } export type InlineCitationSourceProps = ComponentProps<'div'> & { title?: string url?: string description?: string } export const InlineCitationSource = ({ title, url, description, className, children, ...props }: InlineCitationSourceProps) => (
{title && (

{title}

)} {url && (

{url}

)} {description && (

{description}

)} {children}
) export type InlineCitationQuoteProps = ComponentProps<'blockquote'> export const InlineCitationQuote = ({ children, className, ...props }: InlineCitationQuoteProps) => (
{children}
)