@brainfish-ai/components 0.16.10 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/convos.d.ts +62 -7
- package/dist/esm/components/convos.js +269 -29
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/ui/dialog.js +4 -3
- package/dist/esm/components/ui/dialog.js.map +1 -1
- package/dist/esm/convos.css +1 -1
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.js +110 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.ts +28 -0
- package/dist/stats.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convos.js","sources":["../../../src/components/convos/status-badge.tsx","../../../src/lib/formatDate.ts","../../../src/components/convos/message.tsx","../../../src/components/convos/convo.tsx","../../../src/components/convos/convos.tsx"],"sourcesContent":["import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nimport { Badge } from '@/components/ui/badge';\n\ntype Props = React.ComponentPropsWithRef<typeof Badge>;\n\nexport function StatusBadge({ ...props }: Props) {\n return (\n <Badge {...props}>\n <div className=\"flex items-center gap-1\">\n <Circle weight=\"fill\" size={8} className=\"size-2\" />\n {props.children}\n </div>\n </Badge>\n );\n}\n","export function formatDate(date: Date, locale?: string) {\n const defaultLocale = 'en-US';\n if (!locale) {\n if (typeof navigator !== 'undefined') {\n locale = navigator.language;\n } else {\n locale = defaultLocale;\n }\n }\n\n return date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n","import React from 'react';\nimport { ArrowSquareOut, UserCircle } from '@phosphor-icons/react';\n\nimport { StatusBadge } from './status-badge';\nimport { FormattedMessage } from '../markdown';\n\nimport { GeneratingStar } from '@/components/generating-star';\nimport { Item, ItemHeader, ItemContent, ItemTitle } from '@/components/ui/item';\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { cn } from '@/lib/utils';\nimport { Badge } from '@/components/ui/badge';\nimport { formatDate } from '@/lib/formatDate';\n\nimport './message.css';\n\nexport interface RelatedArticle {\n id: string;\n title: string;\n url: string;\n score: number;\n}\n\nexport enum MessageType {\n ACTION = 'action', // user action like 'Next Best Action clicks'\n FEEDBACK = 'feedback', // feedback for up/down vote\n QUESTION = 'question', // user question\n ANSWER = 'answer', // ai generated answer\n}\n\nexport enum Feedback {\n Positive = 'positive',\n Negative = 'negative',\n}\n\nexport interface MessageProps {\n id: string;\n role: 'user' | 'ai';\n content: string; // can be empty string for feedback messages\n timestamp: Date;\n relatedArticles?: Array<RelatedArticle>;\n feedback?: Feedback; // keep feedback for up/down vote\n type?: MessageType;\n locale?: string; // only if not using en-US. For formatting dates\n}\n\nfunction Message({ type, role, content, relatedArticles, feedback, timestamp, locale }: MessageProps) {\n const formattedDate = formatDate(timestamp, locale);\n\n if (role === 'ai') {\n return (\n <li className=\"relative before-line after-line\">\n <Item className=\"message-item\">\n <ItemHeader className=\"justify-start gap-0\">\n <GeneratingStar variant=\"gradient\" className=\"relative -left-[6px]\" />\n <ItemTitle className=\"text-xs font-bold\">Generated answer</ItemTitle>\n </ItemHeader>\n <ItemContent\n className={cn('message-ai-content', {\n 'py-6': !relatedArticles?.length,\n 'pt-6 pb-0': relatedArticles?.length,\n })}\n >\n <div className=\"message-content-wrapper\">\n <FormattedMessage message={{ content }} />\n <span className=\"message-timestamp float-right mt-2\">{formattedDate}</span>\n </div>\n {!!relatedArticles?.length && (\n <Accordion type=\"single\" collapsible className=\"p-0 custom-dashed-border-t-dark-300\">\n <AccordionItem value=\"related-articles\">\n <AccordionTrigger className=\"px-6\">Related articles</AccordionTrigger>\n <AccordionContent>\n <ul className=\"message-article-list\">\n {relatedArticles.map((article) => (\n <li key={article.id} className=\"message-meta\">\n <Badge variant=\"warning\">{Math.round(article.score * 100)}%</Badge>\n <a\n href={article.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"message-article-link group\"\n >\n <span className=\"message-article-title group-hover:underline group-focus-visible:underline\">\n {article.title}\n </span>\n <ArrowSquareOut className=\"size-4 flex-shrink-0\" weight=\"regular\" />\n </a>\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n }\n\n return (\n <li>\n <Item className=\"message-item\">\n <ItemHeader className=\"basis-0\">\n <UserCircle weight=\"fill\" size={24} />\n </ItemHeader>\n <ItemContent className=\"message-user-content\">\n {type === MessageType.QUESTION && (\n <div className=\"message-header\">\n <FormattedMessage message={{ content }} />\n <span className=\"message-timestamp\">{formattedDate}</span>\n </div>\n )}\n {type === MessageType.FEEDBACK && (\n <>\n <div className=\"message-header\">\n <div className=\"message-feedback-text\">\n {feedback === Feedback.Positive ? 'Upvoted as helpful' : 'Downvoted as not helpful'}\n </div>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant={feedback === Feedback.Positive ? 'success' : 'destructive'}>\n {feedback === Feedback.Positive ? 'Answered' : 'Unable to help'}\n </StatusBadge>\n </div>\n </div>\n {content && <div className=\"text-base\">{content}</div>}\n </>\n )}\n {type === MessageType.ACTION && (\n <div className=\"message-header\">\n <span className=\"text-subtle text-sm italic\">{content}</span>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant=\"warning\">Action</StatusBadge>\n </div>\n </div>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n}\n\nexport { Message };\n","import React from 'react';\nimport { UserFocus } from '@phosphor-icons/react';\n\nimport { StatusBadge } from './status-badge';\nimport { Message, MessageProps } from './message';\n\nimport { AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { Item, ItemContent, ItemDescription, ItemTitle } from '@/components/ui/item';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/lib/formatDate';\n\ninterface Props {\n locale?: string; // only if not using en-US. For formatting dates\n question: string; // the initial query\n timestamp: Date; // created_at date of the conversation thread\n location?: string; // location of the user\n source?: string; // source of the conversation\n status?: React.ComponentProps<typeof StatusBadge>['variant'];\n statusMessage?: string; // status of the conversation - Answered | Article not found | Partial | Unanswered, etc\n hasAttributes?: boolean; // whether the conversation has attributes\n attributes?: Record<string, any>; // attributes of the conversation\n messages?: MessageProps[]; // messages in the conversation thread\n isLoading?: boolean; // whether messages are currently being loaded\n onClick?: () => void; // handler to fetch messages when accordion is clicked\n}\n\nexport type ConvoProps = React.ComponentPropsWithRef<typeof AccordionItem> & Props;\n\n/**\n * Convo component - A single conversation item in an accordion.\n * Displays conversation metadata and messages, with support for lazy loading.\n *\n * This is a presentational component - it receives messages and loading state as props\n * rather than managing fetching logic itself.\n */\nexport function Convo({\n locale,\n value: queryId,\n question,\n timestamp,\n location,\n source,\n status,\n statusMessage,\n hasAttributes,\n attributes,\n messages = [],\n isLoading = false,\n onClick,\n className,\n ...props\n}: ConvoProps) {\n // Format date\n const formattedDate = formatDate(timestamp, locale);\n\n // Create description string: \"Nov 1, 2025, 11:00 AM • United States • Live Widget\"\n // Filters out undefined/null values and joins with bullet separator\n const description = [formattedDate, location, source].filter(Boolean).join(' • ');\n\n return (\n <AccordionItem value={queryId} className={cn('border-none rounded-lg bg-surface', className)} {...props}>\n <AccordionTrigger className=\"flex-row-reverse px-4 gap-1 items-center\" onClick={onClick}>\n <Item size=\"sm\" className=\"flex-1 p-0\">\n <ItemContent>\n <ItemTitle className=\"text-base text-default\">{question}</ItemTitle>\n <ItemDescription className=\"text-xs text-default\">{description}</ItemDescription>\n </ItemContent>\n <StatusBadge variant={status}>{statusMessage}</StatusBadge>\n {hasAttributes && (\n <UserFocus\n size={16}\n onClick={(e) => {\n e.stopPropagation();\n console.log('display custom attributes', attributes);\n }}\n onKeyUp={(e) => {\n e.stopPropagation();\n console.log('display custom attributes', attributes);\n }}\n tabIndex={0}\n />\n )}\n </Item>\n </AccordionTrigger>\n <AccordionContent className=\"flex flex-col gap-4 text-balance px-3\">\n {isLoading ? (\n <div className=\"text-center text-subtle py-4\">Loading messages...</div>\n ) : (\n <ul className=\"list-none space-y-4\">\n {messages.slice(1).map((message) => (\n <Message key={message.id} {...message} />\n ))}\n </ul>\n )}\n </AccordionContent>\n </AccordionItem>\n );\n}\n","import React from 'react';\n\nimport { Convo } from './convo';\nimport { StatusBadge } from './status-badge';\nimport { MessageProps } from './message';\n\nimport { Accordion } from '@/components/ui/accordion';\n\ninterface ConvoInput {\n value: string;\n question: string;\n timestamp: Date;\n location?: string;\n source?: string;\n status?: React.ComponentProps<typeof StatusBadge>['variant'];\n statusMessage?: string;\n hasAttributes?: boolean;\n attributes?: Record<string, any>;\n locale?: string;\n}\n\ninterface ConvosProps {\n convos: ConvoInput[];\n fetchMessages: (conversationId: string) => Promise<MessageProps[]>; // required fetch function for lazy loading\n}\n\n/**\n * Convos component - Displays a list of conversations in an accordion.\n * Messages are always lazy loaded when accordion items are opened.\n *\n * @param convos - Array of conversation data\n * @param fetchMessages - Async function to fetch messages for a conversation\n */\nexport function Convos({ convos, fetchMessages }: ConvosProps) {\n // Maps conversation IDs to their fetched messages\n const [messagesMap, setMessagesMap] = React.useState<Record<string, MessageProps[]>>({});\n\n // Tracks which conversations are currently loading messages\n const [loadingMap, setLoadingMap] = React.useState<Record<string, boolean>>({});\n\n // Refs used to check fetch status without causing re-renders\n // These are updated synchronously and don't trigger React re-renders\n const fetchedSetRef = React.useRef<Set<string>>(new Set());\n const loadingMapRef = React.useRef<Record<string, boolean>>({});\n\n /**\n * Handles fetching messages when an accordion item is clicked.\n * Prevents duplicate fetches by checking refs before making the request.\n * Updates both refs (for synchronous checks) and state (for UI updates).\n */\n const handleFetchMessages = React.useCallback(\n (conversationId: string) => {\n // Skip if already fetched or currently loading\n if (fetchedSetRef.current.has(conversationId) || loadingMapRef.current[conversationId]) {\n return;\n }\n\n // Set loading state in both ref (for quick checks) and state (for UI)\n loadingMapRef.current[conversationId] = true;\n setLoadingMap((prev) => ({ ...prev, [conversationId]: true }));\n\n fetchMessages(conversationId)\n .then((fetchedMessages) => {\n // Store fetched messages and mark as fetched\n setMessagesMap((prev) => ({ ...prev, [conversationId]: fetchedMessages }));\n fetchedSetRef.current.add(conversationId);\n })\n .catch(() => {\n // Error handling - could be extended with error reporting\n })\n .finally(() => {\n // Clear loading state from both ref and state\n delete loadingMapRef.current[conversationId];\n setLoadingMap((prev) => {\n const newMap = { ...prev };\n delete newMap[conversationId];\n\n return newMap;\n });\n });\n },\n [fetchMessages],\n );\n\n return (\n <Accordion type=\"single\" collapsible className=\"w-full space-y-2\">\n {convos.map((convo) => (\n <Convo\n key={convo.value}\n value={convo.value}\n question={convo.question}\n timestamp={convo.timestamp}\n location={convo.location}\n source={convo.source}\n status={convo.status}\n statusMessage={convo.statusMessage}\n hasAttributes={convo.hasAttributes}\n attributes={convo.attributes}\n locale={convo.locale}\n // Pass messages from map (empty array if not loaded yet)\n messages={messagesMap[convo.value] || []}\n // Pass loading state for this specific conversation\n isLoading={loadingMap[convo.value] || false}\n // Trigger fetch when accordion trigger is clicked\n onClick={() => handleFetchMessages(convo.value)}\n />\n ))}\n </Accordion>\n );\n}\n"],"names":["React","MessageType","Feedback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convos.js","sources":["../../../src/components/convos/status-badge.tsx","../../../src/components/convos/answer-diagnostics.tsx","../../../src/components/convos/discard-dialog.tsx","../../../src/lib/formatDate.ts","../../../src/components/convos/message.tsx","../../../src/lib/groupAttributesByKey.ts","../../../src/components/convos/attributes-dialog.tsx","../../../src/components/convos/convo.tsx","../../../src/components/convos/convos.tsx"],"sourcesContent":["import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nimport { Badge } from '@/components/ui/badge';\n\ntype Props = React.ComponentPropsWithRef<typeof Badge>;\n\nexport function StatusBadge({ ...props }: Props) {\n return (\n <Badge {...props}>\n <div className=\"flex items-center gap-1\">\n <Circle weight=\"fill\" size={8} className=\"size-2\" />\n {props.children}\n </div>\n </Badge>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { ArrowSquareOut } from '@phosphor-icons/react';\n\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Spinner } from '../ui/spinner';\nimport { AnswerDiagnostics } from './discard-dialog';\nimport { useConvosContext } from './convos';\n\ninterface AnswerDiagnosticsProps {\n messageId: string;\n}\n\nexport function AnswerDiagnosticsSection({ messageId }: AnswerDiagnosticsProps) {\n const { fetchAnswerDiagnostics } = useConvosContext();\n const [answerDiagnostics, setAnswerDiagnostics] = useState<AnswerDiagnostics | null>(null);\n const [isLoading, setIsLoading] = useState(true); // start loading when it mounts. It will start to fetch answer diagnostics on mount\n\n useEffect(() => {\n void fetchAnswerDiagnostics(messageId)\n .then((diagnostics) => setAnswerDiagnostics(diagnostics))\n .finally(() => setIsLoading(false));\n }, [fetchAnswerDiagnostics, messageId]);\n\n return (\n <ScrollArea\n type=\"always\"\n className=\"h-[440px] border border-dark-300 rounded-lg\"\n data-name=\"discard-dialog-answer-diagnostic\"\n >\n <div className=\"flex flex-col gap-4 p-4 flex-shrink-0 bg-surface\">\n <h3 className=\"text-lg font-medium my-0\">Answer diagnostic</h3>\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <Spinner />\n </div>\n ) : (\n <>\n {answerDiagnostics && (\n <>\n <dl className=\"grid grid-cols-[1fr_2fr] grid-rows-2 gap-5\">\n <div className=\"flex flex-col gap-1\">\n <dt className=\"font-medium\">Confidence</dt>\n <dd className=\"text-xs\">{answerDiagnostics.confidence_score}</dd>\n </div>\n {answerDiagnostics.answer_generation_type && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"font-medium\">Answer Type</dt>\n <dd className=\"text-xs\">{answerDiagnostics.answer_generation_type}</dd>\n </div>\n )}\n {answerDiagnostics.query_context_relevance && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"font-medium\">Relevance</dt>\n <dd className=\"text-xs\">{answerDiagnostics.query_context_relevance}</dd>\n </div>\n )}\n {answerDiagnostics.context_sufficiency && (\n <div className=\"flex flex-col gap-1\">\n <dt className=\"font-medium\">Context</dt>\n <dd className=\"text-xs\">{answerDiagnostics.context_sufficiency}</dd>\n </div>\n )}\n </dl>\n {answerDiagnostics.confidence_justification && (\n <div className=\"flex flex-col gap-2\" data-name=\"diagnostic-justification\">\n <span className=\"font-medium\">Justification</span>\n <p className=\"text-sm my-0\">{answerDiagnostics.confidence_justification}</p>\n </div>\n )}\n {answerDiagnostics.evidence_from_context && answerDiagnostics.evidence_from_context.length > 0 && (\n <div className=\"flex flex-col gap-2\" data-name=\"diagnostic-evidence\">\n <span className=\"font-medium\">Evidence (from Knowledge Base)</span>\n {answerDiagnostics.evidence_from_context.map((evidence, index) => (\n <div key={index} className=\"flex flex-col gap-1\">\n {evidence.supporting_quote && <p className=\"text-sm my-0\">{evidence.supporting_quote}</p>}\n {evidence.url && (\n <a\n href={evidence.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex gap-1 text-sm self-end items-center\"\n >\n <span>Source</span>\n <ArrowSquareOut size={16} />\n </a>\n )}\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </>\n )}\n </div>\n </ScrollArea>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { useForm, Controller } from 'react-hook-form';\nimport { DialogProps } from '@radix-ui/react-dialog';\nimport { ThumbsDown, ThumbsUp } from '@phosphor-icons/react';\n\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '../ui/dialog';\nimport { Button } from '../ui/button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select';\nimport { Label } from '../ui/label';\nimport { ButtonGroup } from '../ui/button-group';\nimport { Textarea } from '../ui/textarea';\nimport { AnswerDiagnosticsSection } from './answer-diagnostics';\nimport { useConvosContext } from './convos';\n\nimport { cn } from '@/lib/utils';\n\nexport enum DiscardReason {\n INCORRECT_ANSWER = 'incorrect_answer',\n HALLUCINATED_ANSWER = 'hallucinated_answer',\n OVERSHARING = 'oversharing',\n WRONG_ARTICLE_SURFACED = 'wrong_article_surfaced',\n OTHER = 'other',\n}\n\ntype ContextSufficiency = 'Sufficient' | 'Partially Sufficient' | 'Insufficient';\ntype AnswerGenerationType = 'Direct Extraction' | 'Summarization' | 'Inference' | 'Combination' | 'Cannot Answer';\ntype QueryContextRelevance = 'High' | 'Medium' | 'Low';\ninterface EvidenceFromContext {\n supporting_quote?: string;\n url?: string;\n}\n\nexport type AnswerDiagnostics = {\n confidence_score: string;\n answer_generation_type?: AnswerGenerationType;\n query_context_relevance?: QueryContextRelevance;\n context_sufficiency?: ContextSufficiency;\n confidence_justification?: string;\n evidence_from_context?: EvidenceFromContext[];\n};\n\ninterface DiscardDialogProps extends DialogProps {\n id: string;\n discarded?: boolean;\n discardedMeta?: { reason: DiscardReason; suggestedAnswer?: string };\n className?: string;\n}\n\ninterface DiscardFormData {\n reason: DiscardReason;\n preferredAnswer?: string;\n}\n\nexport function DiscardDialog({\n id,\n discarded,\n discardedMeta,\n className,\n open: externalOpen,\n onOpenChange: externalOnOpenChange,\n ...args\n}: DiscardDialogProps): React.ReactNode {\n const { onDiscard, onApprove } = useConvosContext();\n const [isSelectOpen, setIsSelectOpen] = useState(false);\n const [internalOpen, setInternalOpen] = useState(false);\n\n // Use external state if provided, otherwise use internal state\n const isOpen = externalOpen ?? internalOpen;\n const setIsOpen = externalOnOpenChange ?? setInternalOpen;\n\n const {\n control,\n register,\n handleSubmit,\n reset,\n formState: { isSubmitting },\n } = useForm<DiscardFormData>({\n defaultValues: {\n reason: discardedMeta?.reason,\n preferredAnswer: discardedMeta?.suggestedAnswer || '',\n },\n });\n\n useEffect(() => {\n reset({\n reason: discardedMeta?.reason,\n preferredAnswer: discardedMeta?.suggestedAnswer || '',\n });\n }, [discardedMeta, reset]);\n\n const onSubmitForm = async (data: DiscardFormData) => {\n await onDiscard(id, data.reason, data.preferredAnswer).then(() => setIsOpen(false));\n };\n\n return (\n <ButtonGroup className={className}>\n <Dialog {...args} open={isOpen} onOpenChange={setIsOpen}>\n <DialogTrigger asChild>\n <Button\n variant=\"shadow\"\n className={cn(\n 'size-7',\n discarded ? 'bg-destructive text-destructive !opacity-100' : 'bg-surface text-dark-800',\n )}\n size=\"icon\"\n >\n <ThumbsDown weight={discarded ? 'fill' : 'regular'} />\n </Button>\n </DialogTrigger>\n <DialogContent\n className=\"min-w-[826px] bg-dark-100 pt-0 pb-4\"\n onEscapeKeyDown={(e) => {\n if (isSelectOpen) {\n e.preventDefault();\n setIsSelectOpen(false);\n }\n }}\n >\n <DialogHeader className=\"py-6\">\n <DialogTitle className=\"heading-xxl !text-2xl\">Answer feedback</DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit(onSubmitForm)}>\n <div className=\"grid grid-cols-[1fr_2fr] gap-6 pb-4\">\n <div className=\"w-[340px] p-4\" data-name=\"discard-dialog-reason\">\n <fieldset className=\"space-y-4\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"reason\" className=\"text-sm\">\n Reason\n </Label>\n <Controller\n control={control}\n name=\"reason\"\n rules={{ required: true }}\n render={({ field }) => (\n <Select\n value={field.value}\n onValueChange={field.onChange}\n open={isSelectOpen}\n onOpenChange={setIsSelectOpen}\n required\n >\n <SelectTrigger className=\"border-dark-300 bg-surface\">\n <SelectValue placeholder=\"Select a reason\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={DiscardReason.INCORRECT_ANSWER}>Incorrect answer</SelectItem>\n <SelectItem value={DiscardReason.HALLUCINATED_ANSWER}>Hallucinated answer</SelectItem>\n <SelectItem value={DiscardReason.OVERSHARING}>Oversharing</SelectItem>\n <SelectItem value={DiscardReason.WRONG_ARTICLE_SURFACED}>Wrong article surfaced</SelectItem>\n <SelectItem value={DiscardReason.OTHER}>Other</SelectItem>\n </SelectContent>\n </Select>\n )}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"preferredAnswer\" className=\"text-base font-normal\">\n Preferred answer\n </Label>\n <Textarea\n id=\"preferredAnswer\"\n required\n minLength={10}\n placeholder=\"Explain what you'd like Brainfish to do next time in this case....\"\n rows={4}\n className=\"h-52 resize-none bg-surface\"\n {...register('preferredAnswer')}\n />\n <span className=\"text-xs text-dark-1000 hidden ml-1\">\n Tell Brainfish why this is the incorrect answer. You can use "@" to reference the right\n Knowledge Article.\n </span>\n </div>\n </fieldset>\n </div>\n <AnswerDiagnosticsSection messageId={id} />\n </div>\n <DialogFooter className=\"py-6\">\n <DialogClose asChild>\n <Button variant=\"link\" size=\"sm\" type=\"button\">\n Cancel\n </Button>\n </DialogClose>\n <Button type=\"submit\" variant=\"shadow\" size=\"sm\" disabled={isSubmitting}>\n {isSubmitting ? 'Submitting...' : 'Submit'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n <Button\n variant=\"shadow\"\n className={cn('bg-surface size-7 text-dark-800', { '!opacity-100 bg-dark-300': discarded })}\n size=\"icon\"\n disabled={discarded}\n onClick={() => onApprove(id)}\n >\n <ThumbsUp />\n </Button>\n </ButtonGroup>\n );\n}\n","export function formatDate(date: Date, locale?: string) {\n const defaultLocale = 'en-US';\n if (!locale) {\n if (typeof navigator !== 'undefined') {\n locale = navigator.language;\n } else {\n locale = defaultLocale;\n }\n }\n\n return date.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n","import React from 'react';\nimport { ArrowSquareOut, UserCircle } from '@phosphor-icons/react';\n\nimport { StatusBadge } from './status-badge';\nimport { FormattedMessage } from '../markdown';\nimport { useConvosContext } from './convos';\nimport { DiscardDialog, DiscardReason } from './discard-dialog';\n\nimport { GeneratingStar } from '@/components/generating-star';\nimport { Item, ItemHeader, ItemContent, ItemTitle } from '@/components/ui/item';\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { cn } from '@/lib/utils';\nimport { Badge } from '@/components/ui/badge';\nimport { formatDate } from '@/lib/formatDate';\n\nimport './message.css';\n\nexport interface RelatedArticle {\n id: string;\n title: string;\n url: string;\n score: number;\n}\n\nexport enum MessageType {\n ACTION = 'action', // user action like 'Next Best Action clicks'\n FEEDBACK = 'feedback', // feedback for up/down vote\n QUESTION = 'question', // user question\n ANSWER = 'answer', // ai generated answer\n}\n\nexport enum Feedback {\n Positive = 'positive',\n Negative = 'negative',\n}\n\nexport interface MessageProps {\n id: string; // message id\n role: 'user' | 'ai';\n content: string; // can be empty string for feedback messages\n timestamp: Date;\n relatedArticles?: Array<RelatedArticle>;\n feedback?: Feedback; // keep feedback for up/down vote\n type?: MessageType;\n locale?: string; // only if not using en-US. For formatting dates (overrides context locale)\n discarded?: boolean;\n discardedMeta?: {\n reason: DiscardReason;\n suggestedAnswer?: string;\n };\n}\n\nfunction Message({\n id,\n type,\n role,\n content,\n relatedArticles,\n feedback,\n timestamp,\n locale: localeOverride,\n discarded,\n discardedMeta,\n}: MessageProps) {\n // Get locale from context, with override if provided\n const { locale: contextLocale } = useConvosContext();\n const locale = localeOverride || contextLocale;\n\n const formattedDate = formatDate(timestamp, locale);\n\n if (role === 'ai') {\n return (\n <li className=\"relative before-line after-line\">\n <Item className=\"message-item\">\n <ItemHeader className=\"justify-start gap-0\">\n <GeneratingStar variant=\"gradient\" className=\"relative -left-[6px]\" />\n <ItemTitle className=\"text-xs font-bold\">Generated answer</ItemTitle>\n </ItemHeader>\n <ItemContent\n className={cn('message-ai-content', {\n 'py-6': !relatedArticles?.length,\n 'pt-6 pb-0': relatedArticles?.length,\n })}\n >\n <DiscardDialog\n id={id}\n discarded={discarded}\n discardedMeta={discardedMeta}\n className=\"absolute -top-4 right-5\"\n />\n <div className=\"message-content-wrapper\">\n <FormattedMessage message={{ content }} />\n <span className=\"message-timestamp float-right mt-2\">{formattedDate}</span>\n </div>\n {!!relatedArticles?.length && (\n <Accordion type=\"single\" collapsible className=\"p-0 custom-dashed-border-t-dark-300\">\n <AccordionItem value=\"related-articles\">\n <AccordionTrigger className=\"px-6\">Related articles</AccordionTrigger>\n <AccordionContent>\n <ul className=\"message-article-list\">\n {relatedArticles.map((article) => (\n <li key={article.id} className=\"message-meta\">\n <Badge variant=\"warning\">{Math.round(article.score * 100)}%</Badge>\n <a\n href={article.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"message-article-link group\"\n >\n <span className=\"message-article-title group-hover:underline group-focus-visible:underline\">\n {article.title}\n </span>\n <ArrowSquareOut className=\"size-4 flex-shrink-0\" weight=\"regular\" />\n </a>\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n }\n\n return (\n <li>\n <Item className=\"message-item\">\n <ItemHeader className=\"basis-0\">\n <UserCircle weight=\"fill\" size={24} />\n </ItemHeader>\n <ItemContent className=\"message-user-content\">\n {type === MessageType.QUESTION && (\n <div className=\"message-header\">\n <FormattedMessage message={{ content }} />\n <span className=\"message-timestamp\">{formattedDate}</span>\n </div>\n )}\n {type === MessageType.FEEDBACK && (\n <>\n <div className=\"message-header\">\n <div className=\"message-feedback-text\">\n {feedback === Feedback.Positive ? 'Upvoted as helpful' : 'Downvoted as not helpful'}\n </div>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant={feedback === Feedback.Positive ? 'success' : 'destructive'}>\n {feedback === Feedback.Positive ? 'Answered' : 'Unable to help'}\n </StatusBadge>\n </div>\n </div>\n {content && <div className=\"text-base\">{content}</div>}\n </>\n )}\n {type === MessageType.ACTION && (\n <div className=\"message-header\">\n <span className=\"text-subtle text-sm italic\">{content}</span>\n <div className=\"message-meta\">\n <span className=\"message-timestamp-simple\">{formattedDate}</span>\n <StatusBadge variant=\"warning\">Action</StatusBadge>\n </div>\n </div>\n )}\n </ItemContent>\n </Item>\n </li>\n );\n}\n\nexport { Message };\n","// format the attributes so that it's in tabular format\n// first column is the Key of each array element\n// subsequent columns are Value of each array element of the key. eg\n// | Email | theo@bf.com | john@bf.com |\n// | Phone | 12312312312 | 22222222222 |\nexport function groupAttributesByKey(attributes: Record<string, any>[]): Record<string, any[]> {\n return attributes.reduce(\n (acc, attr) => {\n Object.entries(attr).forEach(([key, value]) => {\n if (!acc[key]) {\n acc[key] = [];\n }\n acc[key].push(value);\n });\n\n return acc;\n },\n {} as Record<string, any[]>,\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { UserFocus } from '@phosphor-icons/react';\nimport { DialogProps } from '@radix-ui/react-dialog';\n\nimport { useConvosContext } from './convos';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '../ui/dialog';\nimport { Button } from '../ui/button';\nimport { Table, TableBody, TableCell, TableRow } from '../ui/table';\n\nimport { cn } from '@/lib/utils';\nimport { groupAttributesByKey } from '@/lib/groupAttributesByKey';\n\ninterface Props extends DialogProps {\n conversationId: string;\n}\n\nexport function AttributesDialog({ conversationId, ...args }: Props) {\n const [attributes, setAttributes] = useState<Record<string, any>[]>();\n\n const { fetchAttributes } = useConvosContext();\n\n useEffect(() => {\n void fetchAttributes(conversationId)\n .then((attrs) => setAttributes(attrs))\n .catch(() => {\n // Error handling - could be extended with error reporting\n });\n }, [fetchAttributes, conversationId]);\n\n if (!attributes?.length) {\n return null;\n }\n\n const groupedAttributes = groupAttributesByKey(attributes);\n\n return (\n <Dialog {...args}>\n <DialogTrigger asChild>\n <Button\n variant=\"ghost\"\n className={cn('size-7')}\n size=\"icon\"\n onClick={(e) => {\n e.stopPropagation();\n }}\n onKeyUp={(e) => {\n e.stopPropagation();\n }}\n >\n <UserFocus size={16} />\n </Button>\n </DialogTrigger>\n <DialogContent className=\"min-w-[826px] bg-dark-100 pt-0 pb-4\">\n <DialogHeader className=\"py-6\">\n <DialogTitle className=\"heading-xxl !text-2xl\">Custom attributes</DialogTitle>\n </DialogHeader>\n <div className=\"pb-4\">\n <Table className=\"bg-surface\">\n <TableBody className=\"space-y-1\">\n {Object.entries(groupedAttributes).map(([key, values]) => (\n <TableRow key={key} className=\"border-none\">\n <TableCell className=\"capitalize font-bold\">{key}</TableCell>\n {values.map((value, index) => (\n <TableCell key={`${key}-${index}`}>{value}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import React from 'react';\n\nimport { StatusBadge } from './status-badge';\nimport { Message } from './message';\nimport { useConvosContext } from './convos';\nimport { AttributesDialog } from './attributes-dialog';\n\nimport { AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';\nimport { Item, ItemContent, ItemDescription, ItemTitle } from '@/components/ui/item';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/lib/formatDate';\n\ninterface Props {\n locale?: string; // only if not using en-US. For formatting dates (overrides context locale)\n question: string; // the initial query\n timestamp: Date; // created_at date of the conversation thread\n location?: string; // location of the user\n source?: string; // source of the conversation\n status?: React.ComponentProps<typeof StatusBadge>['variant'];\n statusMessage?: string; // status of the conversation - Answered | Article not found | Partial | Unanswered, etc\n hasAttributes?: boolean; // whether the conversation has attributes\n onClick?: () => void; // handler to fetch messages when accordion is clicked\n}\n\nexport type ConvoProps = React.ComponentPropsWithRef<typeof AccordionItem> & Props;\n\n/**\n * Convo component - A single conversation item in an accordion.\n * Displays conversation metadata and messages, with support for lazy loading.\n *\n * This is a presentational component - it receives messages and loading state as props\n * rather than managing fetching logic itself.\n */\nexport function Convo({\n locale: localeOverride,\n value: queryId,\n question,\n timestamp,\n location,\n source,\n status,\n statusMessage,\n hasAttributes,\n onClick,\n className,\n ...props\n}: ConvoProps) {\n const { getMessages, isLoading: isLoadingFromContext, locale: contextLocale } = useConvosContext();\n\n // Use locale override if provided, otherwise use context locale\n const locale = localeOverride || contextLocale;\n\n // Get messages and loading state from context\n const messages = getMessages(queryId);\n const isLoading = isLoadingFromContext(queryId);\n\n // Format date\n const formattedDate = formatDate(timestamp, locale);\n\n // Create description string: \"Nov 1, 2025, 11:00 AM • United States • Live Widget\"\n // Filters out undefined/null values and joins with bullet separator\n const description = [formattedDate, location, source].filter(Boolean).join(' • ');\n\n const handleAccordionClick = (e: React.MouseEvent) => {\n // Prevent accordion from toggling if click originated from within a dialog\n if ((e.target as HTMLElement).closest('[role=\"dialog\"]')) {\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n onClick?.();\n };\n\n return (\n <AccordionItem value={queryId} className={cn('border-none rounded-lg bg-surface', className)} {...props}>\n <AccordionTrigger className=\"flex-row-reverse px-4 gap-1 items-center\" onClick={handleAccordionClick}>\n <Item size=\"sm\" className=\"flex-1 p-0\">\n <ItemContent>\n <ItemTitle className=\"text-base text-default\">{question}</ItemTitle>\n <ItemDescription className=\"text-xs text-default\">{description}</ItemDescription>\n </ItemContent>\n <StatusBadge variant={status}>{statusMessage}</StatusBadge>\n {hasAttributes && <AttributesDialog conversationId={queryId} />}\n </Item>\n </AccordionTrigger>\n <AccordionContent className=\"flex flex-col gap-4 text-balance px-3\">\n {isLoading ? (\n <div className=\"text-center text-subtle py-4\">Loading messages...</div>\n ) : (\n <ul className=\"list-none space-y-4\">\n {messages.slice(1).map((message) => (\n <Message key={message.id} {...message} />\n ))}\n </ul>\n )}\n </AccordionContent>\n </AccordionItem>\n );\n}\n","import React from 'react';\n\nimport { Convo } from './convo';\nimport { StatusBadge } from './status-badge';\nimport { MessageProps } from './message';\nimport { AnswerDiagnostics, DiscardReason } from './discard-dialog';\n\nimport { Accordion } from '@/components/ui/accordion';\n\n// Context types and implementation\ninterface ConvosContextValue {\n // Fetch functions\n fetchMessages: (conversationId: string) => Promise<MessageProps[]>;\n fetchAttributes: (conversationId: string) => Promise<Record<string, any>[]>;\n\n // Messages and loading state\n getMessages: (conversationId: string) => MessageProps[];\n isLoading: (conversationId: string) => boolean;\n handleFetchMessages: (conversationId: string) => void;\n\n // Locale for date formatting\n locale?: string;\n\n // Discard dialog functions\n fetchAnswerDiagnostics: (messageId: string) => Promise<AnswerDiagnostics>;\n onDiscard: (id: string, reason: DiscardReason, suggestedAnswer?: string) => Promise<void>;\n onApprove: (id: string) => Promise<void>;\n}\n\nconst ConvosContext = React.createContext<ConvosContextValue | undefined>(undefined);\n\nexport function useConvosContext() {\n const context = React.useContext(ConvosContext);\n if (context === undefined) {\n throw new Error('useConvosContext must be used within a ConvosProvider');\n }\n\n return context;\n}\n\ninterface ConvosProviderProps {\n children: React.ReactNode;\n value: ConvosContextValue;\n}\n\nexport function ConvosProvider({ children, value }: ConvosProviderProps) {\n return <ConvosContext.Provider value={value}>{children}</ConvosContext.Provider>;\n}\n\ninterface ConvoInput {\n value: string;\n question: string;\n timestamp: Date;\n location?: string;\n source?: string;\n status?: React.ComponentProps<typeof StatusBadge>['variant'];\n statusMessage?: string;\n hasAttributes?: boolean;\n attributes?: Record<string, any>[];\n locale?: string;\n}\n\ninterface ConvosProps {\n convos: ConvoInput[];\n fetchMessages: (conversationId: string) => Promise<MessageProps[]>; // required fetch function for lazy loading\n fetchAttributes: (conversationId: string) => Promise<Record<string, any>[]>; // required fetch function for lazy loading\n fetchAnswerDiagnostics: (messageId: string) => Promise<AnswerDiagnostics>;\n onDiscard: (id: string, reason: DiscardReason, suggestedAnswer?: string) => Promise<void>;\n onApprove: (id: string) => Promise<void>;\n}\n\n/**\n * Convos component - Displays a list of conversations in an accordion.\n * Messages are always lazy loaded when accordion items are opened.\n *\n * @param convos - Array of conversation data\n * @param fetchMessages - Async function to fetch messages for a conversation\n */\nexport function Convos({\n convos,\n fetchMessages,\n fetchAttributes,\n fetchAnswerDiagnostics,\n onDiscard,\n onApprove,\n}: ConvosProps) {\n // Maps conversation IDs to their fetched messages\n const [messagesMap, setMessagesMap] = React.useState<Record<string, MessageProps[]>>({});\n\n // Tracks which conversations are currently loading messages\n const [loadingMap, setLoadingMap] = React.useState<Record<string, boolean>>({});\n\n // Refs used to check fetch status without causing re-renders\n // These are updated synchronously and don't trigger React re-renders\n const fetchedSetRef = React.useRef<Set<string>>(new Set());\n const loadingMapRef = React.useRef<Record<string, boolean>>({});\n\n /**\n * Handles fetching messages when an accordion item is clicked.\n * Prevents duplicate fetches by checking refs before making the request.\n * Updates both refs (for synchronous checks) and state (for UI updates).\n */\n const handleFetchMessages = React.useCallback(\n (conversationId: string) => {\n // Skip if already fetched or currently loading\n if (fetchedSetRef.current.has(conversationId) || loadingMapRef.current[conversationId]) {\n return;\n }\n\n // Set loading state in both ref (for quick checks) and state (for UI)\n loadingMapRef.current[conversationId] = true;\n setLoadingMap((prev) => ({ ...prev, [conversationId]: true }));\n\n fetchMessages(conversationId)\n .then((fetchedMessages) => {\n // Store fetched messages and mark as fetched\n setMessagesMap((prev) => ({ ...prev, [conversationId]: fetchedMessages }));\n fetchedSetRef.current.add(conversationId);\n })\n .catch(() => {\n // Error handling - could be extended with error reporting\n })\n .finally(() => {\n // Clear loading state from both ref and state\n delete loadingMapRef.current[conversationId];\n setLoadingMap((prev) => {\n const newMap = { ...prev };\n delete newMap[conversationId];\n\n return newMap;\n });\n });\n },\n [fetchMessages],\n );\n\n // Create context value - use the first convo's locale as default, or allow override\n const defaultLocale = convos[0]?.locale;\n\n const contextValue = React.useMemo(\n () => ({\n fetchMessages,\n fetchAttributes,\n getMessages: (conversationId: string) => messagesMap[conversationId] || [],\n isLoading: (conversationId: string) => loadingMap[conversationId] || false,\n handleFetchMessages,\n locale: defaultLocale,\n fetchAnswerDiagnostics: (messageId: string) => fetchAnswerDiagnostics(messageId),\n onDiscard,\n onApprove,\n }),\n [\n fetchMessages,\n fetchAttributes,\n messagesMap,\n loadingMap,\n handleFetchMessages,\n defaultLocale,\n fetchAnswerDiagnostics,\n onDiscard,\n onApprove,\n ],\n );\n\n return (\n <ConvosProvider value={contextValue}>\n <Accordion type=\"single\" collapsible className=\"w-full space-y-2\">\n {convos.map((convo) => (\n <Convo\n key={convo.value}\n value={convo.value}\n question={convo.question}\n timestamp={convo.timestamp}\n location={convo.location}\n source={convo.source}\n status={convo.status}\n statusMessage={convo.statusMessage}\n hasAttributes={convo.hasAttributes}\n locale={convo.locale}\n // Trigger fetch when accordion trigger is clicked\n onClick={() => handleFetchMessages(convo.value)}\n />\n ))}\n </Accordion>\n </ConvosProvider>\n );\n}\n"],"names":["React","MessageType","Feedback"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
3
3
|
import { c as cn } from '../../chunks/utils.Cwtlq8dh.js';
|
|
4
|
-
import {
|
|
4
|
+
import { X } from '@phosphor-icons/react';
|
|
5
5
|
|
|
6
6
|
const Dialog = DialogPrimitive.Root;
|
|
7
7
|
const DialogTrigger = DialogPrimitive.Trigger;
|
|
@@ -24,13 +24,14 @@ const DialogContent = React.forwardRef(({ className, children, ...props }, ref)
|
|
|
24
24
|
{
|
|
25
25
|
ref,
|
|
26
26
|
className: cn(
|
|
27
|
-
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-
|
|
27
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-surface p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
28
|
+
"border-border shadow-[2px_2px_0_0_#0A0A0D] !transition-shadow duration-300 ease-in-out dark:shadow-[2px_2px_0_0_#FFF] dark:active:shadow-[inset_2px_2px_0_0_#FFF]",
|
|
28
29
|
className
|
|
29
30
|
),
|
|
30
31
|
...props
|
|
31
32
|
},
|
|
32
33
|
children,
|
|
33
|
-
/* @__PURE__ */ React.createElement(DialogPrimitive.Close, { className: "absolute right-4 top-4
|
|
34
|
+
/* @__PURE__ */ React.createElement(DialogPrimitive.Close, { className: "absolute right-4 top-4 opacity-70 ring-offset-background hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\n bg-surface text-dark-900 rounded border border-border shadow-[2px_2px_0_0_#0A0A0D] hover:shadow-none !transition-shadow duration-300 ease-in-out active:shadow-[inset_2px_2px_0_0_#262626] dark:shadow-[2px_2px_0_0_#FFF] dark:hover:shadow-none dark:active:shadow-[inset_2px_2px_0_0_#FFF] p-[6px]\n " }, /* @__PURE__ */ React.createElement(X, { size: 20, weight: "bold" }), /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Close"))
|
|
34
35
|
)));
|
|
35
36
|
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
36
37
|
const DialogHeader = ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","sources":["../../../../src/components/ui/dialog.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { cn } from \"@/lib/utils\"\nimport { Cross2Icon } from \"@
|
|
1
|
+
{"version":3,"file":"dialog.js","sources":["../../../../src/components/ui/dialog.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { cn } from \"@/lib/utils\"\nimport { X as Cross2Icon } from \"@phosphor-icons/react\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-surface p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n \"border-border shadow-[2px_2px_0_0_#0A0A0D] !transition-shadow duration-300 ease-in-out dark:shadow-[2px_2px_0_0_#FFF] dark:active:shadow-[inset_2px_2px_0_0_#FFF]\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 opacity-70 ring-offset-background hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\n bg-surface text-dark-900 rounded border border-border shadow-[2px_2px_0_0_#0A0A0D] hover:shadow-none !transition-shadow duration-300 ease-in-out active:shadow-[inset_2px_2px_0_0_#262626] dark:shadow-[2px_2px_0_0_#FFF] dark:hover:shadow-none dark:active:shadow-[inset_2px_2px_0_0_#FFF] p-[6px]\n \">\n <Cross2Icon size={20} weight=\"bold\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n"],"names":["Cross2Icon"],"mappings":"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"}
|
package/dist/esm/convos.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.before-line:before{position:absolute;top:-1rem;left:11px;display:block;height:1rem;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:after{position:absolute;left:11px;bottom:-1rem;top:2.5rem;display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:last-of-type:after{content:var(--tw-content);bottom:0}.message-item{position:relative;display:flex;flex-direction:row;gap:.5rem;padding:0}.message-header{display:flex;justify-content:space-between}.message-meta{display:flex;align-items:center;gap:.5rem}.message-timestamp{font-size:.75rem;line-height:1.5rem;color:var(--bfc-text-subtlest)}.message-timestamp-simple{font-size:.75rem;line-height:1rem;color:var(--bfc-text-subtlest)}.message-content-wrapper{padding-left:1.5rem;padding-right:1.5rem;font-size:1rem;line-height:1.5rem}.message-ai-content{margin-left:1.75rem;gap:1.5rem;border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-white);padding-left:0;padding-right:0}.message-user-content{border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-v2-color-mono-100, #FAFAFA);padding:1rem;font-size:1rem;line-height:1.5rem}.message-article-link{display:flex;align-items:center;gap:.5rem}.message-article-link:focus-visible{outline:2px solid transparent;outline-offset:2px}.message-article-title{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem}.message-article-list{list-style-type:none}.message-article-list>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.message-article-list{padding-left:1.5rem;padding-right:1.5rem}.message-feedback-text{font-size:.875rem;line-height:1.25rem;font-style:italic}
|
|
1
|
+
.before-line:before{position:absolute;top:-1rem;left:11px;display:block;height:1rem;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:after{position:absolute;left:11px;bottom:-1rem;top:2.5rem;display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:last-of-type:after{content:var(--tw-content);bottom:0}.message-item{position:relative;display:flex;flex-direction:row;gap:.5rem;padding:0}.message-header{display:flex;justify-content:space-between}.message-meta{display:flex;align-items:center;gap:.5rem}.message-timestamp{font-size:.75rem;line-height:1.5rem;color:var(--bfc-text-subtlest)}.message-timestamp-simple{font-size:.75rem;line-height:1rem;color:var(--bfc-text-subtlest)}.message-content-wrapper{padding-left:1.5rem;padding-right:1.5rem;font-size:1rem;line-height:1.5rem}.message-ai-content{position:relative;margin-left:1.75rem;gap:1.5rem;border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-white);padding-left:0;padding-right:0}.message-user-content{border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-v2-color-mono-100, #FAFAFA);padding:1rem;font-size:1rem;line-height:1.5rem}.message-article-link{display:flex;align-items:center;gap:.5rem}.message-article-link:focus-visible{outline:2px solid transparent;outline-offset:2px}.message-article-title{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem}.message-article-list{list-style-type:none}.message-article-list>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.message-article-list{padding-left:1.5rem;padding-right:1.5rem}.message-feedback-text{font-size:.875rem;line-height:1.25rem;font-style:italic}
|