@brainfish-ai/components 0.33.1 → 0.34.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/conversation.d.ts +55 -12
- package/dist/esm/chunks/{ChatSearch.EPCaUj3O.js → ChatSearch.D5EABw51.js} +2 -2
- package/dist/esm/chunks/{ChatSearch.EPCaUj3O.js.map → ChatSearch.D5EABw51.js.map} +1 -1
- package/dist/esm/chunks/Conversation.Dq66Znf4.js +33 -0
- package/dist/esm/chunks/Conversation.Dq66Znf4.js.map +1 -0
- package/dist/esm/chunks/{FormattedMessage.D_knqVl-.js → FormattedMessage.Djy5cn5F.js} +2 -2
- package/dist/esm/chunks/{FormattedMessage.D_knqVl-.js.map → FormattedMessage.Djy5cn5F.js.map} +1 -1
- package/dist/esm/chunks/ai-badge.Be0978vU.js +5 -0
- package/dist/esm/chunks/ai-badge.Be0978vU.js.map +1 -0
- package/dist/esm/chunks/{button.D_2SonNs.js → button.Cs1X8upM.js} +2 -2
- package/dist/esm/chunks/{button.D_2SonNs.js.map → button.Cs1X8upM.js.map} +1 -1
- package/dist/esm/chunks/{combobox.MyoPH18G.js → combobox.CLT9CXUV.js} +2 -2
- package/dist/esm/chunks/{combobox.MyoPH18G.js.map → combobox.CLT9CXUV.js.map} +1 -1
- package/dist/esm/chunks/{date-picker.C2VT_rZ9.js → date-picker.D9CRxYJf.js} +2 -2
- package/dist/esm/chunks/{date-picker.C2VT_rZ9.js.map → date-picker.D9CRxYJf.js.map} +1 -1
- package/dist/esm/chunks/{feedback.CLMuSvsg.js → feedback.CGFAP0XS.js} +2 -2
- package/dist/esm/chunks/{feedback.CLMuSvsg.js.map → feedback.CGFAP0XS.js.map} +1 -1
- package/dist/esm/chunks/{file-upload-status.D8RhMcbO.js → file-upload-status.ClQeoQQB.js} +2 -2
- package/dist/esm/chunks/{file-upload-status.D8RhMcbO.js.map → file-upload-status.ClQeoQQB.js.map} +1 -1
- package/dist/esm/chunks/{filters.BHp3ukNW.js → filters.BRlRsGlZ.js} +2 -2
- package/dist/esm/chunks/{filters.BHp3ukNW.js.map → filters.BRlRsGlZ.js.map} +1 -1
- package/dist/esm/chunks/{font-picker.B9GPXyK4.js → font-picker.Dwwe5av-.js} +2 -2
- package/dist/esm/chunks/{font-picker.B9GPXyK4.js.map → font-picker.Dwwe5av-.js.map} +1 -1
- package/dist/esm/chunks/header-nav.CtUIc9pI.js +12 -0
- package/dist/esm/chunks/header-nav.CtUIc9pI.js.map +1 -0
- package/dist/esm/chunks/{header-pane.eU7f_pim.js → header-pane.BBWfo7uv.js} +5 -5
- package/dist/esm/chunks/header-pane.BBWfo7uv.js.map +1 -0
- package/dist/esm/chunks/index.Ca2JkOFO.js +2 -0
- package/dist/esm/chunks/index.Ca2JkOFO.js.map +1 -0
- package/dist/esm/chunks/{input-with-tags.DLv9e0XI.js → input-with-tags.pmOKv67d.js} +2 -2
- package/dist/esm/chunks/{input-with-tags.DLv9e0XI.js.map → input-with-tags.pmOKv67d.js.map} +1 -1
- package/dist/esm/chunks/{sidebar.CcFsNjrN.js → sidebar.BhcrMAU3.js} +8 -8
- package/dist/esm/chunks/{sidebar.CcFsNjrN.js.map → sidebar.BhcrMAU3.js.map} +1 -1
- package/dist/esm/chunks/{suggestion-card.D-AsG_yB.js → suggestion-card.TDn-dEc0.js} +2 -2
- package/dist/esm/chunks/{suggestion-card.D-AsG_yB.js.map → suggestion-card.TDn-dEc0.js.map} +1 -1
- package/dist/esm/chunks/{two-level-combobox.BVZfsNSN.js → two-level-combobox.SDv7qc_m.js} +2 -2
- package/dist/esm/chunks/{two-level-combobox.BVZfsNSN.js.map → two-level-combobox.SDv7qc_m.js.map} +1 -1
- package/dist/esm/components/article-suggestions-banner.js +1 -1
- package/dist/esm/components/articles-coverage.js +3 -3
- package/dist/esm/components/articles-updated.js +2 -2
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/conversation.js +1 -1
- package/dist/esm/components/convos.js +11 -11
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/feedback.js +1 -1
- package/dist/esm/components/file-upload.js +1 -1
- package/dist/esm/components/filter.js +1 -1
- package/dist/esm/components/font-picker.js +1 -1
- package/dist/esm/components/input-with-tags.js +1 -1
- package/dist/esm/components/markdown.js +1 -1
- package/dist/esm/components/two-level-combobox.js +1 -1
- package/dist/esm/components/ui/alert-dialog.js +1 -1
- package/dist/esm/components/ui/breadcrumb.js +1 -1
- package/dist/esm/components/ui/button-group.js +1 -1
- package/dist/esm/components/ui/button.js +1 -1
- package/dist/esm/components/ui/combobox.js +1 -1
- package/dist/esm/components/ui/div-button.js +1 -1
- package/dist/esm/components/ui/item.js +1 -1
- package/dist/esm/components/ui/sheet.js +1 -1
- package/dist/esm/components/ui/tooltip.js +3 -3
- package/dist/esm/components/ui/tooltip.js.map +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/layouts/full-layout.js +1 -1
- package/dist/esm/layouts/header-nav.js +1 -1
- package/dist/esm/layouts/sidebar.js +1 -1
- package/dist/esm/scenes/knowledge-review.js +1 -1
- package/dist/esm/tailwind.preset.js +1 -1
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/full-layout.d.ts +1 -0
- package/dist/header-nav.d.ts +1 -0
- package/dist/index.d.ts +56 -12
- package/dist/stats.html +1 -1
- package/package.json +7 -7
- package/tailwind.preset.ts +1 -1
- package/dist/esm/chunks/Conversation.C2TpUr4-.js +0 -29
- package/dist/esm/chunks/Conversation.C2TpUr4-.js.map +0 -1
- package/dist/esm/chunks/header-nav.DmlIUqml.js +0 -14
- package/dist/esm/chunks/header-nav.DmlIUqml.js.map +0 -1
- package/dist/esm/chunks/header-pane.eU7f_pim.js.map +0 -1
- package/dist/esm/chunks/index.uF4ME3WQ.js +0 -4
- package/dist/esm/chunks/index.uF4ME3WQ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggestion-card.D-AsG_yB.js","sources":["../../../src/scenes/knowledge-review/review-list/edit-count.tsx","../../../src/scenes/knowledge-review/status-source-summary.tsx","../../../src/scenes/knowledge-review/review-list/review-list-item.tsx","../../../src/scenes/knowledge-review/context.tsx","../../../src/scenes/knowledge-review/review-list/review-list.tsx","../../../src/scenes/knowledge-review/suggestion-card/suggestion-card.tsx"],"sourcesContent":["import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nexport function EditCount({ count }: { count: number }) {\n return (\n <span className=\"inline-flex items-center gap-1 p-1\">\n <Circle size={8} weight=\"fill\" aria-hidden=\"true\" className=\"text-blue\" />\n <span className=\"text-xs leading-4 text-subtle\">\n {count} {count === 1 ? 'edit' : 'edits'}\n </span>\n </span>\n );\n}\n","import * as React from 'react';\n\nimport { EditCount } from './review-list/edit-count';\n\nimport { StatusBadge } from '@/components/convos/status-badge';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\n\nexport interface StatusSourceSummaryProps {\n isNew?: boolean;\n isAccepted?: boolean;\n editCount?: number;\n sourceIcon?: React.ReactNode;\n sourceDescription?: string | null;\n onSourceLinkClick?: () => void;\n sourceLabel?: string;\n className?: string;\n}\n\nexport function StatusSourceSummary({\n isNew,\n isAccepted,\n editCount,\n sourceIcon,\n sourceDescription,\n onSourceLinkClick,\n sourceLabel = 'Open source',\n className,\n}: StatusSourceSummaryProps) {\n let status: React.ReactNode | undefined;\n if (isAccepted) {\n status = <StatusBadge variant=\"accepted\">Accepted</StatusBadge>;\n } else if (isNew) {\n status = (\n <StatusBadge variant=\"success\" surface=\"transparent\">\n New\n </StatusBadge>\n );\n } else if (editCount) {\n status = <EditCount count={editCount} />;\n }\n\n if (!status && !sourceIcon && !sourceDescription) {\n return null;\n }\n\n return (\n <span className={cn('flex items-center gap-1 leading-4 min-w-0', className)}>\n {status && <span className=\"shrink-0 flex items-center\">{status}</span>}\n {sourceDescription &&\n (onSourceLinkClick ? (\n <Button\n variant=\"link\"\n onClick={onSourceLinkClick}\n aria-label={sourceLabel}\n className=\"[&_svg]:size-4 h-auto p-0 text-xs font-normal text-subtle gap-1\"\n >\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n <span className=\"truncate\">{sourceDescription}</span>\n </Button>\n ) : (\n <span className=\"[&_svg]:size-4 flex items-center gap-1 text-xs text-subtle min-w-0\">\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n <span className=\"truncate\">{sourceDescription}</span>\n </span>\n ))}\n </span>\n );\n}\n","import * as React from 'react';\n\nimport { StatusSourceSummary } from '../status-source-summary';\n\nimport { cn } from '@/lib/utils';\nimport { formatDistance } from '@/lib/formatDate';\n\nexport interface ReviewListItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Unique identifier for the knowledge article */\n id: string;\n /** Primary text displayed in the first row */\n title: string;\n /** Content rendered in the top-right corner (e.g. relative timestamp) */\n timestamp: Date;\n /** Icon rendered at the start of the second row */\n icon?: React.ReactNode;\n /** Text or content next to the icon in the second row */\n description?: string | null;\n /** Whether this item is new */\n isNew?: boolean;\n /** Whether this item has been accepted (e.g. accepted as draft) */\n isAccepted?: boolean;\n /** Number of edits for this item */\n editCount?: number;\n /** Whether this item is currently selected */\n isSelected?: boolean;\n}\n\nexport const ReviewListItem = React.forwardRef<HTMLButtonElement, ReviewListItemProps>(function ReviewListItem(\n { title, timestamp, icon, description, isNew, isAccepted, editCount, isSelected = false, className, ...props },\n ref,\n) {\n return (\n <button\n {...props}\n ref={ref}\n type=\"button\"\n aria-pressed={isSelected}\n className={cn(\n 'relative flex w-full flex-col gap-1 bg-surface rounded p-4 cursor-pointer transition-colors text-left border border-transparent',\n isSelected\n ? [\n 'shadow-[0px_1px_3px_0px_rgba(95,95,95,0.26)]',\n 'after:content-[\"\"] after:block after:absolute after:right-[-2px] after:top-1/2 after:-translate-y-1/2 after:w-1 after:h-14 after:rounded-sm after:bg-primary',\n ]\n : 'hover:bg-dark-100 hover:border-dark-300',\n className,\n )}\n >\n {/* Row 1: Title + Timestamp */}\n <span className=\"flex items-center justify-between w-full gap-2\">\n <span className={cn('text-sm text-default truncate min-w-0 flex-1', isSelected ? 'font-bold' : 'font-normal')}>\n {title}\n </span>\n {timestamp && <span className=\"text-xs leading-4 text-subtlest shrink-0\">{formatDistance(timestamp)}</span>}\n </span>\n\n {/* Row 2: Status + Icon + Description */}\n <StatusSourceSummary\n isNew={isNew}\n isAccepted={isAccepted}\n editCount={editCount}\n sourceIcon={icon}\n sourceDescription={description}\n />\n </button>\n );\n});\n","import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport type { ReviewListItemProps } from './review-list/review-list-item';\n\n/** Passed to `onAcceptAndPublish` from the split Accept dropdown (public vs internal). */\nexport type AcceptAndPublishVisibility = 'public' | 'internal';\n\nexport type LoadedDiffDoc = {\n isNew: boolean;\n diffTitle: string;\n diffContent: React.ReactNode;\n};\n\ntype ReviewsSelectionValue = {\n selectedItem: ReviewListItemProps | null;\n setSelectedItem: (item: ReviewListItemProps | null) => void;\n loadedDiffDoc: LoadedDiffDoc | null;\n setLoadedDiffDoc: (doc: LoadedDiffDoc | null) => void;\n loadingDiff: boolean;\n setLoadingDiff: (loading: boolean) => void;\n onApproveAllSuggestions: () => void | Promise<void>;\n onRejectAllSuggestions: () => void | Promise<void>;\n onAcceptAndPublish?: (visibility: AcceptAndPublishVisibility) => void | Promise<void>;\n onApplyAllInEditor?: () => Promise<void> | void;\n onRejectAllInEditor?: () => Promise<void> | void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n suggestionReasonBody?: string;\n /** When true, omit the \"publish publicly\" item from the Accept & publish menu. */\n hideAcceptAndPublishPublic?: boolean;\n};\n\nconst ReviewsContext = createContext<ReviewsSelectionValue | null>(null);\n\nexport type ReviewsProviderProps = {\n children: React.ReactNode;\n /** Optional initial selection (e.g. from server or mock data) */\n defaultSelectedItem?: ReviewListItemProps | null;\n onApproveAllSuggestions: () => void | Promise<void>;\n onRejectAllSuggestions: () => void | Promise<void>;\n onAcceptAndPublish?: (visibility: AcceptAndPublishVisibility) => void | Promise<void>;\n onApplyAllInEditor?: () => Promise<void> | void;\n onRejectAllInEditor?: () => Promise<void> | void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n suggestionReasonBody?: string;\n hideAcceptAndPublishPublic?: boolean;\n};\n\nexport function ReviewsSelectionProvider({\n children,\n defaultSelectedItem = null,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onApplyAllInEditor,\n onRejectAllInEditor,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n hideAcceptAndPublishPublic = false,\n}: ReviewsProviderProps) {\n const [userSelectedItem, setUserSelectedItem] = useState<ReviewListItemProps | null>(null);\n const selectedItem = userSelectedItem ?? defaultSelectedItem;\n\n const [loadedDiffDoc, setLoadedDiffDoc] = useState<LoadedDiffDoc | null>(null);\n\n const [loadingDiff, setLoadingDiff] = useState(false);\n\n const handleSelect = useCallback((item: ReviewListItemProps | null) => setUserSelectedItem(item), []);\n const value = useMemo<ReviewsSelectionValue>(\n () => ({\n selectedItem,\n setSelectedItem: handleSelect,\n loadedDiffDoc,\n setLoadedDiffDoc,\n loadingDiff,\n setLoadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onApplyAllInEditor,\n onRejectAllInEditor,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n hideAcceptAndPublishPublic,\n }),\n [\n selectedItem,\n handleSelect,\n loadedDiffDoc,\n loadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onApplyAllInEditor,\n onRejectAllInEditor,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n hideAcceptAndPublishPublic,\n ],\n );\n\n return <ReviewsContext.Provider value={value}>{children}</ReviewsContext.Provider>;\n}\n\nexport function useReviewsSelection(): ReviewsSelectionValue {\n const ctx = useContext(ReviewsContext);\n if (!ctx) {\n throw new Error('useReviewsSelection must be used within ReviewsSelectionProvider');\n }\n\n return ctx;\n}\n","import React, { forwardRef } from 'react';\n\nimport { ReviewListItem, ReviewListItemProps } from './review-list-item';\nimport { useReviewsSelection } from '../context';\n\nimport { cn } from '@/lib/utils';\n\ninterface ReviewListProps {\n items: ReviewListItemProps[];\n className?: string;\n}\n\nexport const ReviewList = forwardRef<HTMLUListElement, ReviewListProps>(({ items, className, ...props }, ref) => {\n const { selectedItem, setSelectedItem } = useReviewsSelection();\n\n return (\n <ul\n ref={ref}\n className={cn(\n 'min-w-0 w-full overflow-hidden bg-muted border border-dark-300 rounded-lg p-2 space-y-2 list-none m-0',\n className,\n )}\n {...props}\n >\n {items.map((item) => (\n <li key={item.id}>\n <ReviewListItem {...item} isSelected={selectedItem?.id === item.id} onClick={() => setSelectedItem(item)} />\n </li>\n ))}\n </ul>\n );\n});\nReviewList.displayName = 'ReviewList';\n","import * as React from 'react';\nimport { CaretDown, CaretUp, CheckCircle, XCircle } from '@phosphor-icons/react';\n\nimport { Button } from '@/components/ui/button';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { brandShadowEffect } from '@/lib/styles';\nimport { cn } from '@/lib/utils';\n\nexport interface SuggestionCardSource {\n /** Eyebrow label, e.g. \"1 day ago from\" — rendered uppercase by the card. */\n label: string;\n /** Display name of the source, e.g. \"team-meetingFEB.mp4\". */\n name: string;\n /**\n * Optional icon next to the source name. Pass a `@phosphor-icons/react` icon.\n */\n icon?: React.ReactNode;\n}\n\n/**\n * Pagination state for the side paginator column. When omitted, the paginator\n * column (and its divider) is not rendered at all.\n */\nexport interface SuggestionCardPagination {\n /** 1-based index of this suggestion within the set. */\n currentIndex: number;\n /** Total number of suggestions in the set. */\n totalCount: number;\n /** Fires when the user navigates to the previous suggestion. Omit to hide the button. */\n onPrevious?: () => void;\n /** Fires when the user navigates to the next suggestion. Omit to hide the button. */\n onNext?: () => void;\n}\n\n/**\n * Visual diff shown between the source row and the reason. Renders as a\n * single bordered row with the old text struck-through in destructive color\n * and the new text in link color.\n *\n * - For replace ops, set both `oldText` and `newText`.\n * - For delete ops, set only `oldText`.\n * - For insert ops, set only `newText`.\n *\n * When both fields are empty/undefined the diff row is not rendered.\n */\nexport interface SuggestionCardDiff {\n /** Original text being removed. Destructive. */\n oldText?: string;\n /** Proposed replacement / insertion. Link color. */\n newText?: string;\n}\n\nexport interface SuggestionCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /**\n * Source metadata shown at the top of the card. Omit to skip the source\n * row entirely — useful when the host doesn't have source info to surface.\n */\n source?: SuggestionCardSource;\n /**\n * Old vs. new text for the suggestion. Renders the bordered diff row\n * between the source and the reason. Omit to skip the diff row entirely.\n */\n diff?: SuggestionCardDiff;\n /**\n * Host-provided explanation for why this suggestion was raised. Renders\n * as the body paragraph below the diff. Omit to skip the reason line.\n */\n reason?: string;\n\n /**\n * Fires when the user accepts this suggestion. When omitted, the accept\n * button is rendered disabled (so the affordance is visible but inert).\n */\n onAccept?: () => void;\n /**\n * Fires when the user rejects this suggestion. When omitted, the reject\n * button is rendered disabled.\n */\n onReject?: () => void;\n /** Disable the accept button while an accept is in-flight. */\n acceptDisabled?: boolean;\n /** Disable the reject button while a reject is in-flight. */\n rejectDisabled?: boolean;\n\n /**\n * Paginator state. When omitted, the whole paginator column (and its\n * dividing border) is not rendered.\n */\n pagination?: SuggestionCardPagination;\n readOnly?: boolean;\n}\n\n/**\n * Floating card that displays a single review suggestion with its source,\n * accept/reject actions, and an optional paginator for navigating within-article\n * suggestions. Purely presentational — the host wires callbacks to the\n * reviewSuggestions plugin / API layer.\n */\nexport const SuggestionCard = React.forwardRef<HTMLDivElement, SuggestionCardProps>(function SuggestionCard(\n {\n source,\n diff,\n reason,\n onAccept,\n onReject,\n acceptDisabled,\n rejectDisabled,\n pagination,\n className,\n readOnly,\n ...props\n },\n ref,\n) {\n const acceptIsDisabled = acceptDisabled || !onAccept;\n const rejectIsDisabled = rejectDisabled || !onReject;\n const hasDiff = Boolean(diff && diff.oldText && diff.newText);\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Review suggestion\"\n className={cn(\n // The card grows with short suggestions, then caps so long bodies scroll.\n '!grid max-h-[calc(var(--knowledge-review-scroll-height)-250px)] w-full grid-rows-[auto_minmax(0,1fr)_auto] items-stretch gap-4 rounded-lg bg-surface p-4 border shadow-md dark:shadow-brand-dark',\n className,\n )}\n {...props}\n >\n <div className=\"flex min-w-0 flex-col justify-start gap-1\">\n {source && (\n <>\n <span className=\"text-xs font-bold uppercase leading-4 text-default\">{source.label}</span>\n <div className=\"flex items-center gap-0.5 [&_svg]:size-4 [&_svg]:shrink-0\">\n <span className=\"flex items-center text-subtle\" aria-hidden=\"true\">\n {source.icon}\n </span>\n <span className=\"text-sm leading-4 text-subtle break-all\">{source.name}</span>\n </div>\n </>\n )}\n </div>\n\n <div className=\"flex min-w-0 min-h-0 items-stretch gap-2\">\n {/* min-h-0 lets this flex child shrink below its content size so the ScrollArea actually scrolls. */}\n <ScrollArea className=\"-mr-2 min-h-0 flex-1 pr-2\">\n <div className=\"flex w-full flex-col\">\n <span className=\"text-xs font-bold uppercase leading-4 text-default\">Why</span>\n {reason && <span className=\"text-sm leading-4 text-default\">{reason}</span>}\n\n {hasDiff && <SuggestionCardDiffRow oldText={diff?.oldText} newText={diff?.newText} />}\n </div>\n </ScrollArea>\n\n {pagination && pagination.totalCount > 1 && <SuggestionCardPaginator {...pagination} />}\n </div>\n\n <div className=\"flex min-w-0 items-end\">\n {!readOnly && (\n <div className=\"flex shrink-0 items-center gap-2\">\n {!acceptIsDisabled && (\n <Button\n type=\"button\"\n variant=\"default\"\n elevation=\"shadow\"\n size=\"icon\"\n onClick={onAccept}\n aria-label=\"Accept suggestion\"\n className={cn('rounded-md border-border bg-green-400 text-default', brandShadowEffect)}\n >\n <CheckCircle weight=\"regular\" aria-hidden=\"true\" />\n </Button>\n )}\n {!rejectIsDisabled && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n elevation=\"shadow\"\n size=\"icon\"\n onClick={onReject}\n aria-label=\"Reject suggestion\"\n className={cn('rounded-md border-border bg-red-400 text-default', brandShadowEffect)}\n >\n <XCircle weight=\"regular\" aria-hidden=\"true\" />\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n\n/**\n * Bordered old/new diff row. Old text is rendered first in destructive color,\n * new text follows in link color. Either side can be\n * omitted (delete-only or insert-only).\n */\nfunction SuggestionCardDiffRow({ oldText, newText }: SuggestionCardDiff) {\n return (\n <div className=\"flex flex-col items-baseline gap-2 border-t border-dark-300 py-4 text-sm leading-4 mt-4\">\n {oldText && (\n <div className=\"text-destructive\">\n <span className=\"font-bold\">Replace: </span>\n <span>{oldText}</span>\n </div>\n )}\n {newText && (\n <div className=\"text-blue\">\n <span className=\"font-bold\">With: </span>\n <span>{newText}</span>\n </div>\n )}\n </div>\n );\n}\n\nfunction SuggestionCardPaginator({ currentIndex, totalCount, onPrevious, onNext }: SuggestionCardPagination) {\n const hasPrevious = currentIndex > 1 && !!onPrevious;\n const hasNext = currentIndex < totalCount && !!onNext;\n\n return (\n <div className=\"flex w-10 shrink-0 flex-col items-center justify-center self-stretch py-2 pl-3\">\n <div className=\"flex flex-col items-center gap-0.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onPrevious}\n disabled={!hasPrevious}\n aria-label=\"Previous suggestion\"\n className=\"text-subtlest disabled:invisible\"\n >\n <CaretUp aria-hidden=\"true\" className=\"size-3.5\" />\n </Button>\n <span className=\"text-xs leading-4 text-subtlest tabular-nums\" aria-hidden=\"true\">\n {currentIndex}/{totalCount}\n </span>\n <span className=\"sr-only\" aria-live=\"polite\">\n Suggestion {currentIndex} of {totalCount}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onNext}\n disabled={!hasNext}\n aria-label=\"Next suggestion\"\n className=\"text-subtlest disabled:invisible\"\n >\n <CaretDown aria-hidden=\"true\" className=\"size-3.5\" />\n </Button>\n </div>\n </div>\n );\n}\n"],"names":["EditCount","count","React","createElement","className","Circle","size","weight","StatusSourceSummary","isNew","isAccepted","editCount","sourceIcon","sourceDescription","onSourceLinkClick","sourceLabel","status","StatusBadge","variant","surface","cn","Button","onClick","ReviewListItem","forwardRef","title","timestamp","icon","description","isSelected","props","ref","type","formatDistance","ReviewsContext","createContext","ReviewsSelectionProvider","children","defaultSelectedItem","onApproveAllSuggestions","onRejectAllSuggestions","onAcceptAndPublish","onApplyAllInEditor","onRejectAllInEditor","onOpenArticleLink","breadcrumb","suggestionReasonBody","hideAcceptAndPublishPublic","userSelectedItem","setUserSelectedItem","useState","selectedItem","loadedDiffDoc","setLoadedDiffDoc","loadingDiff","setLoadingDiff","handleSelect","useCallback","item","value","useMemo","setSelectedItem","Provider","useReviewsSelection","ctx","useContext","Error","ReviewList","items","map","key","id","displayName","SuggestionCard","source","diff","reason","onAccept","onReject","acceptDisabled","rejectDisabled","pagination","readOnly","acceptIsDisabled","rejectIsDisabled","hasDiff","Boolean","oldText","newText","role","Fragment","label","name","ScrollArea","SuggestionCardDiffRow","totalCount","SuggestionCardPaginator","elevation","brandShadowEffect","CheckCircle","XCircle","currentIndex","onPrevious","onNext","hasPrevious","hasNext","disabled","CaretUp","CaretDown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"suggestion-card.TDn-dEc0.js","sources":["../../../src/scenes/knowledge-review/review-list/edit-count.tsx","../../../src/scenes/knowledge-review/status-source-summary.tsx","../../../src/scenes/knowledge-review/review-list/review-list-item.tsx","../../../src/scenes/knowledge-review/context.tsx","../../../src/scenes/knowledge-review/review-list/review-list.tsx","../../../src/scenes/knowledge-review/suggestion-card/suggestion-card.tsx"],"sourcesContent":["import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nexport function EditCount({ count }: { count: number }) {\n return (\n <span className=\"inline-flex items-center gap-1 p-1\">\n <Circle size={8} weight=\"fill\" aria-hidden=\"true\" className=\"text-blue\" />\n <span className=\"text-xs leading-4 text-subtle\">\n {count} {count === 1 ? 'edit' : 'edits'}\n </span>\n </span>\n );\n}\n","import * as React from 'react';\n\nimport { EditCount } from './review-list/edit-count';\n\nimport { StatusBadge } from '@/components/convos/status-badge';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\n\nexport interface StatusSourceSummaryProps {\n isNew?: boolean;\n isAccepted?: boolean;\n editCount?: number;\n sourceIcon?: React.ReactNode;\n sourceDescription?: string | null;\n onSourceLinkClick?: () => void;\n sourceLabel?: string;\n className?: string;\n}\n\nexport function StatusSourceSummary({\n isNew,\n isAccepted,\n editCount,\n sourceIcon,\n sourceDescription,\n onSourceLinkClick,\n sourceLabel = 'Open source',\n className,\n}: StatusSourceSummaryProps) {\n let status: React.ReactNode | undefined;\n if (isAccepted) {\n status = <StatusBadge variant=\"accepted\">Accepted</StatusBadge>;\n } else if (isNew) {\n status = (\n <StatusBadge variant=\"success\" surface=\"transparent\">\n New\n </StatusBadge>\n );\n } else if (editCount) {\n status = <EditCount count={editCount} />;\n }\n\n if (!status && !sourceIcon && !sourceDescription) {\n return null;\n }\n\n return (\n <span className={cn('flex items-center gap-1 leading-4 min-w-0', className)}>\n {status && <span className=\"shrink-0 flex items-center\">{status}</span>}\n {sourceDescription &&\n (onSourceLinkClick ? (\n <Button\n variant=\"link\"\n onClick={onSourceLinkClick}\n aria-label={sourceLabel}\n className=\"[&_svg]:size-4 h-auto p-0 text-xs font-normal text-subtle gap-1\"\n >\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n <span className=\"truncate\">{sourceDescription}</span>\n </Button>\n ) : (\n <span className=\"[&_svg]:size-4 flex items-center gap-1 text-xs text-subtle min-w-0\">\n {sourceIcon && <span className=\"shrink-0 flex items-center\">{sourceIcon}</span>}\n <span className=\"truncate\">{sourceDescription}</span>\n </span>\n ))}\n </span>\n );\n}\n","import * as React from 'react';\n\nimport { StatusSourceSummary } from '../status-source-summary';\n\nimport { cn } from '@/lib/utils';\nimport { formatDistance } from '@/lib/formatDate';\n\nexport interface ReviewListItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Unique identifier for the knowledge article */\n id: string;\n /** Primary text displayed in the first row */\n title: string;\n /** Content rendered in the top-right corner (e.g. relative timestamp) */\n timestamp: Date;\n /** Icon rendered at the start of the second row */\n icon?: React.ReactNode;\n /** Text or content next to the icon in the second row */\n description?: string | null;\n /** Whether this item is new */\n isNew?: boolean;\n /** Whether this item has been accepted (e.g. accepted as draft) */\n isAccepted?: boolean;\n /** Number of edits for this item */\n editCount?: number;\n /** Whether this item is currently selected */\n isSelected?: boolean;\n}\n\nexport const ReviewListItem = React.forwardRef<HTMLButtonElement, ReviewListItemProps>(function ReviewListItem(\n { title, timestamp, icon, description, isNew, isAccepted, editCount, isSelected = false, className, ...props },\n ref,\n) {\n return (\n <button\n {...props}\n ref={ref}\n type=\"button\"\n aria-pressed={isSelected}\n className={cn(\n 'relative flex w-full flex-col gap-1 bg-surface rounded p-4 cursor-pointer transition-colors text-left border border-transparent',\n isSelected\n ? [\n 'shadow-[0px_1px_3px_0px_rgba(95,95,95,0.26)]',\n 'after:content-[\"\"] after:block after:absolute after:right-[-2px] after:top-1/2 after:-translate-y-1/2 after:w-1 after:h-14 after:rounded-sm after:bg-primary',\n ]\n : 'hover:bg-dark-100 hover:border-dark-300',\n className,\n )}\n >\n {/* Row 1: Title + Timestamp */}\n <span className=\"flex items-center justify-between w-full gap-2\">\n <span className={cn('text-sm text-default truncate min-w-0 flex-1', isSelected ? 'font-bold' : 'font-normal')}>\n {title}\n </span>\n {timestamp && <span className=\"text-xs leading-4 text-subtlest shrink-0\">{formatDistance(timestamp)}</span>}\n </span>\n\n {/* Row 2: Status + Icon + Description */}\n <StatusSourceSummary\n isNew={isNew}\n isAccepted={isAccepted}\n editCount={editCount}\n sourceIcon={icon}\n sourceDescription={description}\n />\n </button>\n );\n});\n","import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport type { ReviewListItemProps } from './review-list/review-list-item';\n\n/** Passed to `onAcceptAndPublish` from the split Accept dropdown (public vs internal). */\nexport type AcceptAndPublishVisibility = 'public' | 'internal';\n\nexport type LoadedDiffDoc = {\n isNew: boolean;\n diffTitle: string;\n diffContent: React.ReactNode;\n};\n\ntype ReviewsSelectionValue = {\n selectedItem: ReviewListItemProps | null;\n setSelectedItem: (item: ReviewListItemProps | null) => void;\n loadedDiffDoc: LoadedDiffDoc | null;\n setLoadedDiffDoc: (doc: LoadedDiffDoc | null) => void;\n loadingDiff: boolean;\n setLoadingDiff: (loading: boolean) => void;\n onApproveAllSuggestions: () => void | Promise<void>;\n onRejectAllSuggestions: () => void | Promise<void>;\n onAcceptAndPublish?: (visibility: AcceptAndPublishVisibility) => void | Promise<void>;\n onApplyAllInEditor?: () => Promise<void> | void;\n onRejectAllInEditor?: () => Promise<void> | void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n suggestionReasonBody?: string;\n /** When true, omit the \"publish publicly\" item from the Accept & publish menu. */\n hideAcceptAndPublishPublic?: boolean;\n};\n\nconst ReviewsContext = createContext<ReviewsSelectionValue | null>(null);\n\nexport type ReviewsProviderProps = {\n children: React.ReactNode;\n /** Optional initial selection (e.g. from server or mock data) */\n defaultSelectedItem?: ReviewListItemProps | null;\n onApproveAllSuggestions: () => void | Promise<void>;\n onRejectAllSuggestions: () => void | Promise<void>;\n onAcceptAndPublish?: (visibility: AcceptAndPublishVisibility) => void | Promise<void>;\n onApplyAllInEditor?: () => Promise<void> | void;\n onRejectAllInEditor?: () => Promise<void> | void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n suggestionReasonBody?: string;\n hideAcceptAndPublishPublic?: boolean;\n};\n\nexport function ReviewsSelectionProvider({\n children,\n defaultSelectedItem = null,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onApplyAllInEditor,\n onRejectAllInEditor,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n hideAcceptAndPublishPublic = false,\n}: ReviewsProviderProps) {\n const [userSelectedItem, setUserSelectedItem] = useState<ReviewListItemProps | null>(null);\n const selectedItem = userSelectedItem ?? defaultSelectedItem;\n\n const [loadedDiffDoc, setLoadedDiffDoc] = useState<LoadedDiffDoc | null>(null);\n\n const [loadingDiff, setLoadingDiff] = useState(false);\n\n const handleSelect = useCallback((item: ReviewListItemProps | null) => setUserSelectedItem(item), []);\n const value = useMemo<ReviewsSelectionValue>(\n () => ({\n selectedItem,\n setSelectedItem: handleSelect,\n loadedDiffDoc,\n setLoadedDiffDoc,\n loadingDiff,\n setLoadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onApplyAllInEditor,\n onRejectAllInEditor,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n hideAcceptAndPublishPublic,\n }),\n [\n selectedItem,\n handleSelect,\n loadedDiffDoc,\n loadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onAcceptAndPublish,\n onApplyAllInEditor,\n onRejectAllInEditor,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n suggestionReasonBody,\n hideAcceptAndPublishPublic,\n ],\n );\n\n return <ReviewsContext.Provider value={value}>{children}</ReviewsContext.Provider>;\n}\n\nexport function useReviewsSelection(): ReviewsSelectionValue {\n const ctx = useContext(ReviewsContext);\n if (!ctx) {\n throw new Error('useReviewsSelection must be used within ReviewsSelectionProvider');\n }\n\n return ctx;\n}\n","import React, { forwardRef } from 'react';\n\nimport { ReviewListItem, ReviewListItemProps } from './review-list-item';\nimport { useReviewsSelection } from '../context';\n\nimport { cn } from '@/lib/utils';\n\ninterface ReviewListProps {\n items: ReviewListItemProps[];\n className?: string;\n}\n\nexport const ReviewList = forwardRef<HTMLUListElement, ReviewListProps>(({ items, className, ...props }, ref) => {\n const { selectedItem, setSelectedItem } = useReviewsSelection();\n\n return (\n <ul\n ref={ref}\n className={cn(\n 'min-w-0 w-full overflow-hidden bg-muted border border-dark-300 rounded-lg p-2 space-y-2 list-none m-0',\n className,\n )}\n {...props}\n >\n {items.map((item) => (\n <li key={item.id}>\n <ReviewListItem {...item} isSelected={selectedItem?.id === item.id} onClick={() => setSelectedItem(item)} />\n </li>\n ))}\n </ul>\n );\n});\nReviewList.displayName = 'ReviewList';\n","import * as React from 'react';\nimport { CaretDown, CaretUp, CheckCircle, XCircle } from '@phosphor-icons/react';\n\nimport { Button } from '@/components/ui/button';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { brandShadowEffect } from '@/lib/styles';\nimport { cn } from '@/lib/utils';\n\nexport interface SuggestionCardSource {\n /** Eyebrow label, e.g. \"1 day ago from\" — rendered uppercase by the card. */\n label: string;\n /** Display name of the source, e.g. \"team-meetingFEB.mp4\". */\n name: string;\n /**\n * Optional icon next to the source name. Pass a `@phosphor-icons/react` icon.\n */\n icon?: React.ReactNode;\n}\n\n/**\n * Pagination state for the side paginator column. When omitted, the paginator\n * column (and its divider) is not rendered at all.\n */\nexport interface SuggestionCardPagination {\n /** 1-based index of this suggestion within the set. */\n currentIndex: number;\n /** Total number of suggestions in the set. */\n totalCount: number;\n /** Fires when the user navigates to the previous suggestion. Omit to hide the button. */\n onPrevious?: () => void;\n /** Fires when the user navigates to the next suggestion. Omit to hide the button. */\n onNext?: () => void;\n}\n\n/**\n * Visual diff shown between the source row and the reason. Renders as a\n * single bordered row with the old text struck-through in destructive color\n * and the new text in link color.\n *\n * - For replace ops, set both `oldText` and `newText`.\n * - For delete ops, set only `oldText`.\n * - For insert ops, set only `newText`.\n *\n * When both fields are empty/undefined the diff row is not rendered.\n */\nexport interface SuggestionCardDiff {\n /** Original text being removed. Destructive. */\n oldText?: string;\n /** Proposed replacement / insertion. Link color. */\n newText?: string;\n}\n\nexport interface SuggestionCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /**\n * Source metadata shown at the top of the card. Omit to skip the source\n * row entirely — useful when the host doesn't have source info to surface.\n */\n source?: SuggestionCardSource;\n /**\n * Old vs. new text for the suggestion. Renders the bordered diff row\n * between the source and the reason. Omit to skip the diff row entirely.\n */\n diff?: SuggestionCardDiff;\n /**\n * Host-provided explanation for why this suggestion was raised. Renders\n * as the body paragraph below the diff. Omit to skip the reason line.\n */\n reason?: string;\n\n /**\n * Fires when the user accepts this suggestion. When omitted, the accept\n * button is rendered disabled (so the affordance is visible but inert).\n */\n onAccept?: () => void;\n /**\n * Fires when the user rejects this suggestion. When omitted, the reject\n * button is rendered disabled.\n */\n onReject?: () => void;\n /** Disable the accept button while an accept is in-flight. */\n acceptDisabled?: boolean;\n /** Disable the reject button while a reject is in-flight. */\n rejectDisabled?: boolean;\n\n /**\n * Paginator state. When omitted, the whole paginator column (and its\n * dividing border) is not rendered.\n */\n pagination?: SuggestionCardPagination;\n readOnly?: boolean;\n}\n\n/**\n * Floating card that displays a single review suggestion with its source,\n * accept/reject actions, and an optional paginator for navigating within-article\n * suggestions. Purely presentational — the host wires callbacks to the\n * reviewSuggestions plugin / API layer.\n */\nexport const SuggestionCard = React.forwardRef<HTMLDivElement, SuggestionCardProps>(function SuggestionCard(\n {\n source,\n diff,\n reason,\n onAccept,\n onReject,\n acceptDisabled,\n rejectDisabled,\n pagination,\n className,\n readOnly,\n ...props\n },\n ref,\n) {\n const acceptIsDisabled = acceptDisabled || !onAccept;\n const rejectIsDisabled = rejectDisabled || !onReject;\n const hasDiff = Boolean(diff && diff.oldText && diff.newText);\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Review suggestion\"\n className={cn(\n // The card grows with short suggestions, then caps so long bodies scroll.\n '!grid max-h-[calc(var(--knowledge-review-scroll-height)-250px)] w-full grid-rows-[auto_minmax(0,1fr)_auto] items-stretch gap-4 rounded-lg bg-surface p-4 border shadow-md dark:shadow-brand-dark',\n className,\n )}\n {...props}\n >\n <div className=\"flex min-w-0 flex-col justify-start gap-1\">\n {source && (\n <>\n <span className=\"text-xs font-bold uppercase leading-4 text-default\">{source.label}</span>\n <div className=\"flex items-center gap-0.5 [&_svg]:size-4 [&_svg]:shrink-0\">\n <span className=\"flex items-center text-subtle\" aria-hidden=\"true\">\n {source.icon}\n </span>\n <span className=\"text-sm leading-4 text-subtle break-all\">{source.name}</span>\n </div>\n </>\n )}\n </div>\n\n <div className=\"flex min-w-0 min-h-0 items-stretch gap-2\">\n {/* min-h-0 lets this flex child shrink below its content size so the ScrollArea actually scrolls. */}\n <ScrollArea className=\"-mr-2 min-h-0 flex-1 pr-2\">\n <div className=\"flex w-full flex-col\">\n <span className=\"text-xs font-bold uppercase leading-4 text-default\">Why</span>\n {reason && <span className=\"text-sm leading-4 text-default\">{reason}</span>}\n\n {hasDiff && <SuggestionCardDiffRow oldText={diff?.oldText} newText={diff?.newText} />}\n </div>\n </ScrollArea>\n\n {pagination && pagination.totalCount > 1 && <SuggestionCardPaginator {...pagination} />}\n </div>\n\n <div className=\"flex min-w-0 items-end\">\n {!readOnly && (\n <div className=\"flex shrink-0 items-center gap-2\">\n {!acceptIsDisabled && (\n <Button\n type=\"button\"\n variant=\"default\"\n elevation=\"shadow\"\n size=\"icon\"\n onClick={onAccept}\n aria-label=\"Accept suggestion\"\n className={cn('rounded-md border-border bg-green-400 text-default', brandShadowEffect)}\n >\n <CheckCircle weight=\"regular\" aria-hidden=\"true\" />\n </Button>\n )}\n {!rejectIsDisabled && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n elevation=\"shadow\"\n size=\"icon\"\n onClick={onReject}\n aria-label=\"Reject suggestion\"\n className={cn('rounded-md border-border bg-red-400 text-default', brandShadowEffect)}\n >\n <XCircle weight=\"regular\" aria-hidden=\"true\" />\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n\n/**\n * Bordered old/new diff row. Old text is rendered first in destructive color,\n * new text follows in link color. Either side can be\n * omitted (delete-only or insert-only).\n */\nfunction SuggestionCardDiffRow({ oldText, newText }: SuggestionCardDiff) {\n return (\n <div className=\"flex flex-col items-baseline gap-2 border-t border-dark-300 py-4 text-sm leading-4 mt-4\">\n {oldText && (\n <div className=\"text-destructive\">\n <span className=\"font-bold\">Replace: </span>\n <span>{oldText}</span>\n </div>\n )}\n {newText && (\n <div className=\"text-blue\">\n <span className=\"font-bold\">With: </span>\n <span>{newText}</span>\n </div>\n )}\n </div>\n );\n}\n\nfunction SuggestionCardPaginator({ currentIndex, totalCount, onPrevious, onNext }: SuggestionCardPagination) {\n const hasPrevious = currentIndex > 1 && !!onPrevious;\n const hasNext = currentIndex < totalCount && !!onNext;\n\n return (\n <div className=\"flex w-10 shrink-0 flex-col items-center justify-center self-stretch py-2 pl-3\">\n <div className=\"flex flex-col items-center gap-0.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onPrevious}\n disabled={!hasPrevious}\n aria-label=\"Previous suggestion\"\n className=\"text-subtlest disabled:invisible\"\n >\n <CaretUp aria-hidden=\"true\" className=\"size-3.5\" />\n </Button>\n <span className=\"text-xs leading-4 text-subtlest tabular-nums\" aria-hidden=\"true\">\n {currentIndex}/{totalCount}\n </span>\n <span className=\"sr-only\" aria-live=\"polite\">\n Suggestion {currentIndex} of {totalCount}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onNext}\n disabled={!hasNext}\n aria-label=\"Next suggestion\"\n className=\"text-subtlest disabled:invisible\"\n >\n <CaretDown aria-hidden=\"true\" className=\"size-3.5\" />\n </Button>\n </div>\n </div>\n );\n}\n"],"names":["EditCount","count","React","createElement","className","Circle","size","weight","StatusSourceSummary","isNew","isAccepted","editCount","sourceIcon","sourceDescription","onSourceLinkClick","sourceLabel","status","StatusBadge","variant","surface","cn","Button","onClick","ReviewListItem","forwardRef","title","timestamp","icon","description","isSelected","props","ref","type","formatDistance","ReviewsContext","createContext","ReviewsSelectionProvider","children","defaultSelectedItem","onApproveAllSuggestions","onRejectAllSuggestions","onAcceptAndPublish","onApplyAllInEditor","onRejectAllInEditor","onOpenArticleLink","breadcrumb","suggestionReasonBody","hideAcceptAndPublishPublic","userSelectedItem","setUserSelectedItem","useState","selectedItem","loadedDiffDoc","setLoadedDiffDoc","loadingDiff","setLoadingDiff","handleSelect","useCallback","item","value","useMemo","setSelectedItem","Provider","useReviewsSelection","ctx","useContext","Error","ReviewList","items","map","key","id","displayName","SuggestionCard","source","diff","reason","onAccept","onReject","acceptDisabled","rejectDisabled","pagination","readOnly","acceptIsDisabled","rejectIsDisabled","hasDiff","Boolean","oldText","newText","role","Fragment","label","name","ScrollArea","SuggestionCardDiffRow","totalCount","SuggestionCardPaginator","elevation","brandShadowEffect","CheckCircle","XCircle","currentIndex","onPrevious","onNext","hasPrevious","hasNext","disabled","CaretUp","CaretDown"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import*as e from"react";import{X as t,CaretUpDown as a,ArrowLeft as l,Spinner as s,Check as n}from"@phosphor-icons/react";import{c as m}from"./utils.C6Qu-kwd.js";import{B as c}from"./button.
|
|
1
|
+
import*as e from"react";import{X as t,CaretUpDown as a,ArrowLeft as l,Spinner as s,Check as n}from"@phosphor-icons/react";import{c as m}from"./utils.C6Qu-kwd.js";import{B as c}from"./button.Cs1X8upM.js";import{Command as r,CommandInput as o,CommandList as i,CommandEmpty as u,CommandGroup as d,CommandItem as p}from"../components/ui/command.js";import{Popover as f,PopoverTrigger as E,PopoverContent as v}from"../components/ui/popover.js";import{DivButton as N}from"../components/ui/div-button.js";function b({firstLevelItems:b,fetchSecondLevelItems:g,onSelectionChange:x,firstLevelLabel:h="First Level",secondLevelLabel:y="Second Level",firstLevelPlaceholder:S="Select first level...",className:L,debugMode:w=!1,displayLabel:C=!0}){const[z,k]=e.useState(!1),[$,j]=e.useState("first"),[I,P]=e.useState(null),[V,B]=e.useState(null),[F,M]=e.useState([]),[O,T]=e.useState(!1),[q,A]=e.useState(""),D=e=>{e.stopPropagation(),P(null),B(null),M([]),j("first"),x?.(null,null)};/* @__PURE__ */
|
|
2
2
|
return e.createElement("div",{className:m("space-y-4",L)},/* @__PURE__ */e.createElement("div",{className:"space-y-2"},C&&/* @__PURE__ */e.createElement("label",{className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"},V?`${h} & ${y}`:I?`Select ${y}`:`Select ${h}`),/* @__PURE__ */e.createElement(f,{open:z,onOpenChange:e=>{k(e),e&&!I?j("first"):e&&I&&j("second")}},/* @__PURE__ */e.createElement(E,{asChild:!0},/* @__PURE__ */e.createElement(c,{variant:"outline",role:"combobox","aria-expanded":z,className:"w-full justify-between bg-transparent"},
|
|
3
3
|
/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2 flex-1 min-w-0"},V?/* @__PURE__ */e.createElement("div",{className:"truncate flex items-center gap-1"},I.label," → ",V.label):I?/* @__PURE__ */e.createElement("div",{className:"truncate flex items-center"},I.label):/* @__PURE__ */e.createElement("span",{className:"truncate"},S)),
|
|
4
4
|
/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-1 shrink-0"},(I||V)&&
|
|
5
5
|
/* @__PURE__ */e.createElement(N,{variant:"ghost",size:"sm",className:"size-6 p-0 hover:bg-muted rounded-sm",onClick:D,"aria-label":"Clear selection"},
|
|
6
6
|
/* @__PURE__ */e.createElement(t,{className:"size-3"})),/* @__PURE__ */e.createElement(a,{className:"size-4 shrink-0 opacity-50"})))),/* @__PURE__ */e.createElement(v,{className:"w-full p-0",align:"start"},/* @__PURE__ */e.createElement(r,null,"second"===$&&I&&/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2 p-2 border-b"},/* @__PURE__ */e.createElement(c,{variant:"ghost",size:"sm",onClick:()=>{j("first"),A("")},className:"h-8 w-8 p-0 shrink-0"},/* @__PURE__ */e.createElement(l,{className:"size-4"})),/* @__PURE__ */e.createElement("div",{className:"text-sm font-medium truncate flex-1 min-w-0 flex items-center"},I.label),/* @__PURE__ */e.createElement(N,{variant:"ghost",size:"sm",className:"size-6 p-0 ml-auto hover:bg-muted rounded-sm shrink-0",onClick:D,"aria-label":"Clear selection"},
|
|
7
7
|
/* @__PURE__ */e.createElement(t,{className:"size-3"})),O&&/* @__PURE__ */e.createElement(s,{className:"size-4 animate-spin text-muted-foreground shrink-0"})),/* @__PURE__ */e.createElement(o,{value:q,onValueChange:A,placeholder:"first"===$?`Search ${h.toLowerCase()}...`:`Search ${y.toLowerCase()}...`}),/* @__PURE__ */e.createElement(i,null,/* @__PURE__ */e.createElement(u,null,"first"===$?`No ${h.toLowerCase()} found.`:`No ${y.toLowerCase()} found.`),"first"===$&&/* @__PURE__ */e.createElement(d,null,b.map(t=>/* @__PURE__ */e.createElement(p,{key:t.value,value:t.label,onSelect:()=>(async e=>{P(e),B(null),T(!0),j("second"),A("");try{const t=await g(e.value);M(t)}catch(t){console.warn(t),M([])}finally{T(!1)}x?.(e,null)})(t)},/* @__PURE__ */e.createElement("span",{className:"flex items-center gap-2"},t.icon,t.label),/* @__PURE__ */e.createElement(n,{className:m("ml-2 size-4",I?.value===t.value?"opacity-100":"opacity-0")})))),"second"===$&&I&&/* @__PURE__ */e.createElement(d,null,O?/* @__PURE__ */e.createElement("div",{className:"flex items-center justify-center py-6"},/* @__PURE__ */e.createElement(s,{className:"size-4 animate-spin text-muted-foreground mr-2"}),/* @__PURE__ */e.createElement("span",{className:"text-sm text-muted-foreground"},"Loading ",y.toLowerCase(),"...")):F.map(t=>/* @__PURE__ */e.createElement(p,{key:t.value,value:t.label,onSelect:()=>(e=>{B(e),k(!1),x?.(I,e)})(t)},/* @__PURE__ */e.createElement("span",{className:"flex items-center gap-2"},t.icon,t.label),/* @__PURE__ */e.createElement(n,{className:m("ml-2 size-4",V?.value===t.value?"opacity-100":"opacity-0")}))))))))),(I||V)&&w&&/* @__PURE__ */e.createElement("div",{className:"mt-6 p-4 bg-muted/50 rounded-lg space-y-2"},/* @__PURE__ */e.createElement("h3",{className:"font-medium text-sm"},"Selected Values:"),I&&/* @__PURE__ */e.createElement("div",{className:"text-sm text-muted-foreground flex items-center gap-1"},/* @__PURE__ */e.createElement("span",{className:"font-medium"},h,":"),/* @__PURE__ */e.createElement("div",{className:"flex items-center"},I.label)),V&&/* @__PURE__ */e.createElement("div",{className:"text-sm text-muted-foreground flex items-center gap-1"},/* @__PURE__ */e.createElement("span",{className:"font-medium"},y,":"),/* @__PURE__ */e.createElement("div",{className:"flex items-center"},V.label))))}export{b as T};
|
|
8
|
-
//# sourceMappingURL=two-level-combobox.
|
|
8
|
+
//# sourceMappingURL=two-level-combobox.SDv7qc_m.js.map
|
package/dist/esm/chunks/{two-level-combobox.BVZfsNSN.js.map → two-level-combobox.SDv7qc_m.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-level-combobox.BVZfsNSN.js","sources":["../../../src/components/two-level-combobox/two-level-combobox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Check, CaretUpDown, Spinner, ArrowLeft, X } from '@phosphor-icons/react';\n\nimport { ComboboxItem } from '../combobox';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { DivButton } from '@/components/ui/div-button';\nexport interface TwoLevelComboboxProps {\n firstLevelItems: ComboboxItem[];\n fetchSecondLevelItems: (firstLevelId: string) => Promise<ComboboxItem[]>;\n onSelectionChange?: (firstLevel: ComboboxItem | null, secondLevel: ComboboxItem | null) => void;\n firstLevelLabel?: string;\n secondLevelLabel?: string;\n firstLevelPlaceholder?: string;\n secondLevelPlaceholder?: string;\n className?: string;\n debugMode?: boolean;\n displayLabel?: boolean;\n}\n\nexport function TwoLevelCombobox({\n firstLevelItems,\n fetchSecondLevelItems,\n onSelectionChange,\n firstLevelLabel = 'First Level',\n secondLevelLabel = 'Second Level',\n firstLevelPlaceholder = 'Select first level...',\n className,\n debugMode = false,\n displayLabel = true,\n}: TwoLevelComboboxProps) {\n const [open, setOpen] = React.useState(false);\n const [view, setView] = React.useState<'first' | 'second'>('first');\n const [selectedFirstLevel, setSelectedFirstLevel] = React.useState<ComboboxItem | null>(null);\n const [selectedSecondLevel, setSelectedSecondLevel] = React.useState<ComboboxItem | null>(null);\n const [secondLevelItems, setSecondLevelItems] = React.useState<ComboboxItem[]>([]);\n const [isLoadingSecondLevel, setIsLoadingSecondLevel] = React.useState(false);\n const [searchValue, setSearchValue] = React.useState('');\n\n const handleFirstLevelSelect = async (item: ComboboxItem) => {\n setSelectedFirstLevel(item);\n setSelectedSecondLevel(null); // Reset second level when first level changes\n setIsLoadingSecondLevel(true);\n setView('second');\n setSearchValue(''); // Clear search input when switching to second level\n\n try {\n const fetchedItems = await fetchSecondLevelItems(item.value);\n setSecondLevelItems(fetchedItems);\n } catch (error) {\n console.warn(error);\n setSecondLevelItems([]);\n } finally {\n setIsLoadingSecondLevel(false);\n }\n\n onSelectionChange?.(item, null);\n };\n\n const handleSecondLevelSelect = (item: ComboboxItem) => {\n setSelectedSecondLevel(item);\n setOpen(false);\n onSelectionChange?.(selectedFirstLevel, item);\n };\n\n const handleBackToFirstLevel = () => {\n setView('first');\n setSearchValue(''); // Clear search input when going back to first level\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n setOpen(isOpen);\n if (isOpen && !selectedFirstLevel) {\n setView('first');\n } else if (isOpen && selectedFirstLevel) {\n setView('second');\n }\n };\n\n const handleClearSelection = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent opening the popover\n setSelectedFirstLevel(null);\n setSelectedSecondLevel(null);\n setSecondLevelItems([]);\n setView('first');\n onSelectionChange?.(null, null);\n };\n\n const getLabel = () => {\n if (selectedSecondLevel) return `${firstLevelLabel} & ${secondLevelLabel}`;\n if (selectedFirstLevel) return `Select ${secondLevelLabel}`;\n\n return `Select ${firstLevelLabel}`;\n };\n\n return (\n <div className={cn('space-y-4', className)}>\n <div className=\"space-y-2\">\n {displayLabel && (\n <label className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {getLabel()}\n </label>\n )}\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"w-full justify-between bg-transparent\"\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {selectedSecondLevel ? (\n <div className=\"truncate flex items-center gap-1\">\n {selectedFirstLevel!.label} → {selectedSecondLevel.label}\n </div>\n ) : selectedFirstLevel ? (\n <div className=\"truncate flex items-center\">{selectedFirstLevel.label}</div>\n ) : (\n <span className=\"truncate\">{firstLevelPlaceholder}</span>\n )}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {(selectedFirstLevel || selectedSecondLevel) && (\n // Render button as div to prevent button within button error\n <DivButton\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-6 p-0 hover:bg-muted rounded-sm\"\n onClick={handleClearSelection}\n aria-label=\"Clear selection\"\n >\n <X className=\"size-3\" />\n </DivButton>\n )}\n <CaretUpDown className=\"size-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-full p-0\" align=\"start\">\n <Command>\n {view === 'second' && selectedFirstLevel && (\n <div className=\"flex items-center gap-2 p-2 border-b\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBackToFirstLevel} className=\"h-8 w-8 p-0 shrink-0\">\n <ArrowLeft className=\"size-4\" />\n </Button>\n <div className=\"text-sm font-medium truncate flex-1 min-w-0 flex items-center\">\n {selectedFirstLevel.label}\n </div>\n {/* Render button as div to prevent button within button error */}\n <DivButton\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-6 p-0 ml-auto hover:bg-muted rounded-sm shrink-0\"\n onClick={handleClearSelection}\n aria-label=\"Clear selection\"\n >\n <X className=\"size-3\" />\n </DivButton>\n {isLoadingSecondLevel && <Spinner className=\"size-4 animate-spin text-muted-foreground shrink-0\" />}\n </div>\n )}\n\n <CommandInput\n value={searchValue}\n onValueChange={setSearchValue}\n placeholder={\n view === 'first'\n ? `Search ${firstLevelLabel.toLowerCase()}...`\n : `Search ${secondLevelLabel.toLowerCase()}...`\n }\n />\n <CommandList>\n <CommandEmpty>\n {view === 'first'\n ? `No ${firstLevelLabel.toLowerCase()} found.`\n : `No ${secondLevelLabel.toLowerCase()} found.`}\n </CommandEmpty>\n\n {view === 'first' && (\n <CommandGroup>\n {firstLevelItems.map((item) => (\n <CommandItem key={item.value} value={item.label} onSelect={() => handleFirstLevelSelect(item)}>\n <span className=\"flex items-center gap-2\">\n {item.icon}\n {item.label}\n </span>\n <Check\n className={cn(\n 'ml-2 size-4',\n selectedFirstLevel?.value === item.value ? 'opacity-100' : 'opacity-0',\n )}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n\n {view === 'second' && selectedFirstLevel && (\n <CommandGroup>\n {isLoadingSecondLevel ? (\n <div className=\"flex items-center justify-center py-6\">\n <Spinner className=\"size-4 animate-spin text-muted-foreground mr-2\" />\n <span className=\"text-sm text-muted-foreground\">\n Loading {secondLevelLabel.toLowerCase()}...\n </span>\n </div>\n ) : (\n secondLevelItems.map((item) => (\n <CommandItem key={item.value} value={item.label} onSelect={() => handleSecondLevelSelect(item)}>\n <span className=\"flex items-center gap-2\">\n {item.icon}\n {item.label}\n </span>\n <Check\n className={cn(\n 'ml-2 size-4',\n selectedSecondLevel?.value === item.value ? 'opacity-100' : 'opacity-0',\n )}\n />\n </CommandItem>\n ))\n )}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n\n {(selectedFirstLevel || selectedSecondLevel) && debugMode && (\n <div className=\"mt-6 p-4 bg-muted/50 rounded-lg space-y-2\">\n <h3 className=\"font-medium text-sm\">Selected Values:</h3>\n {selectedFirstLevel && (\n <div className=\"text-sm text-muted-foreground flex items-center gap-1\">\n <span className=\"font-medium\">{firstLevelLabel}:</span>\n <div className=\"flex items-center\">{selectedFirstLevel.label}</div>\n </div>\n )}\n {selectedSecondLevel && (\n <div className=\"text-sm text-muted-foreground flex items-center gap-1\">\n <span className=\"font-medium\">{secondLevelLabel}:</span>\n <div className=\"flex items-center\">{selectedSecondLevel.label}</div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["TwoLevelCombobox","firstLevelItems","fetchSecondLevelItems","onSelectionChange","firstLevelLabel","secondLevelLabel","firstLevelPlaceholder","className","debugMode","displayLabel","open","setOpen","React","useState","view","setView","selectedFirstLevel","setSelectedFirstLevel","selectedSecondLevel","setSelectedSecondLevel","secondLevelItems","setSecondLevelItems","isLoadingSecondLevel","setIsLoadingSecondLevel","searchValue","setSearchValue","handleClearSelection","e","stopPropagation","createElement","cn","Popover","onOpenChange","isOpen","PopoverTrigger","asChild","Button","variant","role","label","DivButton","size","onClick","X","CaretUpDown","PopoverContent","align","Command","ArrowLeft","Spinner","CommandInput","value","onValueChange","placeholder","toLowerCase","CommandList","CommandEmpty","CommandGroup","map","item","CommandItem","key","onSelect","async","fetchedItems","error","console","warn","handleFirstLevelSelect","icon","Check","handleSecondLevelSelect"],"mappings":"kfAuBO,SAASA,GAAiBC,gBAC/BA,EAAAC,sBACAA,EAAAC,kBACAA,EAAAC,gBACAA,EAAkB,cAAAC,iBAClBA,EAAmB,eAAAC,sBACnBA,EAAwB,wBAAAC,UACxBA,EAAAC,UACAA,GAAY,EAAAC,aACZA,GAAe,IAEf,MAAOC,EAAMC,GAAWC,EAAMC,UAAS,IAChCC,EAAMC,GAAWH,EAAMC,SAA6B,UACpDG,EAAoBC,GAAyBL,EAAMC,SAA8B,OACjFK,EAAqBC,GAA0BP,EAAMC,SAA8B,OACnFO,EAAkBC,GAAuBT,EAAMC,SAAyB,KACxES,EAAsBC,GAA2BX,EAAMC,UAAS,IAChEW,EAAaC,GAAkBb,EAAMC,SAAS,IA0C/Ca,EAAwBC,IAC5BA,EAAEC,kBACFX,EAAsB,MACtBE,EAAuB,MACvBE,EAAoB,IACpBN,EAAQ,SACRZ,IAAoB,KAAM;AAU5B,OACES,EAAAiB,cAAC,MAAA,CAAItB,UAAWuB,EAAG,YAAavB,mBAC9BK,EAAAiB,cAAC,MAAA,CAAItB,UAAU,aACZE,kBACCG,EAAAiB,cAAC,QAAA,CAAMtB,UAAU,8FAVnBW,EAA4B,GAAGd,OAAqBC,IACpDW,EAA2B,UAAUX,IAElC,UAAUD,oBAWbQ,EAAAiB,cAACE,EAAA,CAAQrB,OAAYsB,aAjCDC,IACxBtB,EAAQsB,GACJA,IAAWjB,EACbD,EAAQ,SACCkB,GAAUjB,GACnBD,EAAQ,2BA6BJH,EAAAiB,cAACK,EAAA,CAAeC,SAAO,kBACrBvB,EAAAiB,cAACO,EAAA,CACCC,QAAQ,UACRC,KAAK,WACL,gBAAe5B,EACfH,UAAU;eAEVK,EAAAiB,cAAC,MAAA,CAAItB,UAAU,0CACZW,iBACCN,EAAAiB,cAAC,MAAA,CAAItB,UAAU,oCACZS,EAAoBuB,MAAM,MAAIrB,EAAoBqB,OAEnDvB,iBACFJ,EAAAiB,cAAC,MAAA,CAAItB,UAAU,8BAA8BS,EAAmBuB,sBAEhE3B,EAAAiB,cAAC,OAAA,CAAKtB,UAAU,YAAYD;eAGhCM,EAAAiB,cAAC,MAAA,CAAItB,UAAU,qCACXS,GAAsBE;eAEtBN,EAAAiB,cAACW,EAAA,CACCH,QAAQ,QACRI,KAAK,KACLlC,UAAU,uCACVmC,QAAShB,EACT,aAAW;eAEXd,EAAAiB,cAACc,EAAA,CAAEpC,UAAU,2BAGjBK,EAAAiB,cAACe,EAAA,CAAYrC,UAAU,iDAI7BK,EAAAiB,cAACgB,EAAA,CAAetC,UAAU,aAAauC,MAAM,wBAC3ClC,EAAAiB,cAACkB,EAAA,KACW,WAATjC,GAAqBE,kCACnB,MAAA,CAAIT,UAAU,uDACbK,EAAAiB,cAACO,EAAA,CAAOC,QAAQ,QAAQI,KAAK,KAAKC,QA9EnB,KAC7B3B,EAAQ,SACRU,EAAe,KA4EkElB,UAAU,uDAC1EyC,EAAA,CAAUzC,UAAU,2BAEvBK,EAAAiB,cAAC,MAAA,CAAItB,UAAU,iEACZS,EAAmBuB,sBAGtB3B,EAAAiB,cAACW,EAAA,CACCH,QAAQ,QACRI,KAAK,KACLlC,UAAU,wDACVmC,QAAShB,EACT,aAAW;eAEXd,EAAAiB,cAACc,EAAA,CAAEpC,UAAU,YAEde,kBAAwBV,EAAAiB,cAACoB,GAAQ1C,UAAU,uEAIhDK,EAAAiB,cAACqB,EAAA,CACCC,MAAO3B,EACP4B,cAAe3B,EACf4B,YACW,UAATvC,EACI,UAAUV,EAAgBkD,mBAC1B,UAAUjD,EAAiBiD,oDAGlCC,EAAA,oBACC3C,EAAAiB,cAAC2B,OACW,UAAT1C,EACG,MAAMV,EAAgBkD,uBACtB,MAAMjD,EAAiBiD,wBAGnB,UAATxC,kBACCF,EAAAiB,cAAC4B,EAAA,KACExD,EAAgByD,IAAKC,kCACnBC,EAAA,CAAYC,IAAKF,EAAKR,MAAOA,MAAOQ,EAAKpB,MAAOuB,SAAU,IA/IhDC,OAAOJ,IACpC1C,EAAsB0C,GACtBxC,EAAuB,MACvBI,GAAwB,GACxBR,EAAQ,UACRU,EAAe,IAEf,IACE,MAAMuC,QAAqB9D,EAAsByD,EAAKR,OACtD9B,EAAoB2C,EACtB,OAASC,GACPC,QAAQC,KAAKF,GACb5C,EAAoB,GACtB,CAAA,QACEE,GAAwB,EAC1B,CAEApB,IAAoBwD,EAAM,OA8HyDS,CAAuBT,mCACrF,OAAA,CAAKpD,UAAU,2BACboD,EAAKU,KACLV,EAAKpB,sBAER3B,EAAAiB,cAACyC,EAAA,CACC/D,UAAWuB,EACT,cACAd,GAAoBmC,QAAUQ,EAAKR,MAAQ,cAAgB,kBAQ7D,WAATrC,GAAqBE,kBACpBJ,EAAAiB,cAAC4B,EAAA,KACEnC,iBACCV,EAAAiB,cAAC,MAAA,CAAItB,UAAU,wDACbK,EAAAiB,cAACoB,EAAA,CAAQ1C,UAAU,kEACnBK,EAAAiB,cAAC,OAAA,CAAKtB,UAAU,iCAAgC,WACrCF,EAAiBiD,cAAc,QAI5ClC,EAAiBsC,IAAKC,kBACpB/C,EAAAiB,cAAC+B,EAAA,CAAYC,IAAKF,EAAKR,MAAOA,MAAOQ,EAAKpB,MAAOuB,SAAU,IAtJjD,CAACH,IAC/BxC,EAAuBwC,GACvBhD,GAAQ,GACRR,IAAoBa,EAAoB2C,IAmJ6CY,CAAwBZ,mBACvF/C,EAAAiB,cAAC,OAAA,CAAKtB,UAAU,2BACboD,EAAKU,KACLV,EAAKpB,sBAER3B,EAAAiB,cAACyC,EAAA,CACC/D,UAAWuB,EACT,cACAZ,GAAqBiC,QAAUQ,EAAKR,MAAQ,cAAgB,wBAclFnC,GAAsBE,IAAwBV,kBAC9CI,EAAAiB,cAAC,MAAA,CAAItB,UAAU,4DACbK,EAAAiB,cAAC,KAAA,CAAGtB,UAAU,uBAAsB,oBACnCS,kBACCJ,EAAAiB,cAAC,MAAA,CAAItB,UAAU,wEACbK,EAAAiB,cAAC,QAAKtB,UAAU,eAAeH,EAAgB,oBAC/CQ,EAAAiB,cAAC,MAAA,CAAItB,UAAU,qBAAqBS,EAAmBuB,QAG1DrB,kBACCN,EAAAiB,cAAC,MAAA,CAAItB,UAAU,wEACbK,EAAAiB,cAAC,OAAA,CAAKtB,UAAU,eAAeF,EAAiB,oBAChDO,EAAAiB,cAAC,MAAA,CAAItB,UAAU,qBAAqBW,EAAoBqB,SAOtE"}
|
|
1
|
+
{"version":3,"file":"two-level-combobox.SDv7qc_m.js","sources":["../../../src/components/two-level-combobox/two-level-combobox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Check, CaretUpDown, Spinner, ArrowLeft, X } from '@phosphor-icons/react';\n\nimport { ComboboxItem } from '../combobox';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { DivButton } from '@/components/ui/div-button';\nexport interface TwoLevelComboboxProps {\n firstLevelItems: ComboboxItem[];\n fetchSecondLevelItems: (firstLevelId: string) => Promise<ComboboxItem[]>;\n onSelectionChange?: (firstLevel: ComboboxItem | null, secondLevel: ComboboxItem | null) => void;\n firstLevelLabel?: string;\n secondLevelLabel?: string;\n firstLevelPlaceholder?: string;\n secondLevelPlaceholder?: string;\n className?: string;\n debugMode?: boolean;\n displayLabel?: boolean;\n}\n\nexport function TwoLevelCombobox({\n firstLevelItems,\n fetchSecondLevelItems,\n onSelectionChange,\n firstLevelLabel = 'First Level',\n secondLevelLabel = 'Second Level',\n firstLevelPlaceholder = 'Select first level...',\n className,\n debugMode = false,\n displayLabel = true,\n}: TwoLevelComboboxProps) {\n const [open, setOpen] = React.useState(false);\n const [view, setView] = React.useState<'first' | 'second'>('first');\n const [selectedFirstLevel, setSelectedFirstLevel] = React.useState<ComboboxItem | null>(null);\n const [selectedSecondLevel, setSelectedSecondLevel] = React.useState<ComboboxItem | null>(null);\n const [secondLevelItems, setSecondLevelItems] = React.useState<ComboboxItem[]>([]);\n const [isLoadingSecondLevel, setIsLoadingSecondLevel] = React.useState(false);\n const [searchValue, setSearchValue] = React.useState('');\n\n const handleFirstLevelSelect = async (item: ComboboxItem) => {\n setSelectedFirstLevel(item);\n setSelectedSecondLevel(null); // Reset second level when first level changes\n setIsLoadingSecondLevel(true);\n setView('second');\n setSearchValue(''); // Clear search input when switching to second level\n\n try {\n const fetchedItems = await fetchSecondLevelItems(item.value);\n setSecondLevelItems(fetchedItems);\n } catch (error) {\n console.warn(error);\n setSecondLevelItems([]);\n } finally {\n setIsLoadingSecondLevel(false);\n }\n\n onSelectionChange?.(item, null);\n };\n\n const handleSecondLevelSelect = (item: ComboboxItem) => {\n setSelectedSecondLevel(item);\n setOpen(false);\n onSelectionChange?.(selectedFirstLevel, item);\n };\n\n const handleBackToFirstLevel = () => {\n setView('first');\n setSearchValue(''); // Clear search input when going back to first level\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n setOpen(isOpen);\n if (isOpen && !selectedFirstLevel) {\n setView('first');\n } else if (isOpen && selectedFirstLevel) {\n setView('second');\n }\n };\n\n const handleClearSelection = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent opening the popover\n setSelectedFirstLevel(null);\n setSelectedSecondLevel(null);\n setSecondLevelItems([]);\n setView('first');\n onSelectionChange?.(null, null);\n };\n\n const getLabel = () => {\n if (selectedSecondLevel) return `${firstLevelLabel} & ${secondLevelLabel}`;\n if (selectedFirstLevel) return `Select ${secondLevelLabel}`;\n\n return `Select ${firstLevelLabel}`;\n };\n\n return (\n <div className={cn('space-y-4', className)}>\n <div className=\"space-y-2\">\n {displayLabel && (\n <label className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {getLabel()}\n </label>\n )}\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"w-full justify-between bg-transparent\"\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {selectedSecondLevel ? (\n <div className=\"truncate flex items-center gap-1\">\n {selectedFirstLevel!.label} → {selectedSecondLevel.label}\n </div>\n ) : selectedFirstLevel ? (\n <div className=\"truncate flex items-center\">{selectedFirstLevel.label}</div>\n ) : (\n <span className=\"truncate\">{firstLevelPlaceholder}</span>\n )}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {(selectedFirstLevel || selectedSecondLevel) && (\n // Render button as div to prevent button within button error\n <DivButton\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-6 p-0 hover:bg-muted rounded-sm\"\n onClick={handleClearSelection}\n aria-label=\"Clear selection\"\n >\n <X className=\"size-3\" />\n </DivButton>\n )}\n <CaretUpDown className=\"size-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-full p-0\" align=\"start\">\n <Command>\n {view === 'second' && selectedFirstLevel && (\n <div className=\"flex items-center gap-2 p-2 border-b\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBackToFirstLevel} className=\"h-8 w-8 p-0 shrink-0\">\n <ArrowLeft className=\"size-4\" />\n </Button>\n <div className=\"text-sm font-medium truncate flex-1 min-w-0 flex items-center\">\n {selectedFirstLevel.label}\n </div>\n {/* Render button as div to prevent button within button error */}\n <DivButton\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-6 p-0 ml-auto hover:bg-muted rounded-sm shrink-0\"\n onClick={handleClearSelection}\n aria-label=\"Clear selection\"\n >\n <X className=\"size-3\" />\n </DivButton>\n {isLoadingSecondLevel && <Spinner className=\"size-4 animate-spin text-muted-foreground shrink-0\" />}\n </div>\n )}\n\n <CommandInput\n value={searchValue}\n onValueChange={setSearchValue}\n placeholder={\n view === 'first'\n ? `Search ${firstLevelLabel.toLowerCase()}...`\n : `Search ${secondLevelLabel.toLowerCase()}...`\n }\n />\n <CommandList>\n <CommandEmpty>\n {view === 'first'\n ? `No ${firstLevelLabel.toLowerCase()} found.`\n : `No ${secondLevelLabel.toLowerCase()} found.`}\n </CommandEmpty>\n\n {view === 'first' && (\n <CommandGroup>\n {firstLevelItems.map((item) => (\n <CommandItem key={item.value} value={item.label} onSelect={() => handleFirstLevelSelect(item)}>\n <span className=\"flex items-center gap-2\">\n {item.icon}\n {item.label}\n </span>\n <Check\n className={cn(\n 'ml-2 size-4',\n selectedFirstLevel?.value === item.value ? 'opacity-100' : 'opacity-0',\n )}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n\n {view === 'second' && selectedFirstLevel && (\n <CommandGroup>\n {isLoadingSecondLevel ? (\n <div className=\"flex items-center justify-center py-6\">\n <Spinner className=\"size-4 animate-spin text-muted-foreground mr-2\" />\n <span className=\"text-sm text-muted-foreground\">\n Loading {secondLevelLabel.toLowerCase()}...\n </span>\n </div>\n ) : (\n secondLevelItems.map((item) => (\n <CommandItem key={item.value} value={item.label} onSelect={() => handleSecondLevelSelect(item)}>\n <span className=\"flex items-center gap-2\">\n {item.icon}\n {item.label}\n </span>\n <Check\n className={cn(\n 'ml-2 size-4',\n selectedSecondLevel?.value === item.value ? 'opacity-100' : 'opacity-0',\n )}\n />\n </CommandItem>\n ))\n )}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n\n {(selectedFirstLevel || selectedSecondLevel) && debugMode && (\n <div className=\"mt-6 p-4 bg-muted/50 rounded-lg space-y-2\">\n <h3 className=\"font-medium text-sm\">Selected Values:</h3>\n {selectedFirstLevel && (\n <div className=\"text-sm text-muted-foreground flex items-center gap-1\">\n <span className=\"font-medium\">{firstLevelLabel}:</span>\n <div className=\"flex items-center\">{selectedFirstLevel.label}</div>\n </div>\n )}\n {selectedSecondLevel && (\n <div className=\"text-sm text-muted-foreground flex items-center gap-1\">\n <span className=\"font-medium\">{secondLevelLabel}:</span>\n <div className=\"flex items-center\">{selectedSecondLevel.label}</div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["TwoLevelCombobox","firstLevelItems","fetchSecondLevelItems","onSelectionChange","firstLevelLabel","secondLevelLabel","firstLevelPlaceholder","className","debugMode","displayLabel","open","setOpen","React","useState","view","setView","selectedFirstLevel","setSelectedFirstLevel","selectedSecondLevel","setSelectedSecondLevel","secondLevelItems","setSecondLevelItems","isLoadingSecondLevel","setIsLoadingSecondLevel","searchValue","setSearchValue","handleClearSelection","e","stopPropagation","createElement","cn","Popover","onOpenChange","isOpen","PopoverTrigger","asChild","Button","variant","role","label","DivButton","size","onClick","X","CaretUpDown","PopoverContent","align","Command","ArrowLeft","Spinner","CommandInput","value","onValueChange","placeholder","toLowerCase","CommandList","CommandEmpty","CommandGroup","map","item","CommandItem","key","onSelect","async","fetchedItems","error","console","warn","handleFirstLevelSelect","icon","Check","handleSecondLevelSelect"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Sparkle as e,CaretDown as t,CaretUp as r}from"@phosphor-icons/react";import*as a from"react";import{B as l}from"../chunks/button.
|
|
1
|
+
import{Sparkle as e,CaretDown as t,CaretUp as r}from"@phosphor-icons/react";import*as a from"react";import{B as l}from"../chunks/button.Cs1X8upM.js";import{Tooltip as n,TooltipTrigger as o,TooltipContent as i}from"./ui/tooltip.js";import{ButtonGroup as c}from"./ui/button-group.js";import{c as s}from"../chunks/utils.C6Qu-kwd.js";const m=a.forwardRef(function({suggestionsCount:m,currentArticleIndex:u,totalArticles:d,onNextArticle:p,onPreviousArticle:b,onStartReviewSuggestions:f,onRejectAllSuggestions:g,onApproveAllSuggestions:E,className:v,...x},h){const k=u<d-1,N=u>0,A=u+1;/* @__PURE__ */
|
|
2
2
|
return a.createElement("div",{ref:h,className:s("flex bg-blue-200 rounded-md border border-blue-600",v),...x},/* @__PURE__ */a.createElement("div",{className:"flex-1 py-3 px-4 flex justify-between items-center"},/* @__PURE__ */a.createElement("div",{className:"flex items-center gap-2"},/* @__PURE__ */a.createElement(e,{size:32,weight:"fill",className:"text-blue-700"}),/* @__PURE__ */a.createElement("p",{className:"text-sm text-foreground"},function(e,t,r=`${t}s`){return`${e} ${1===e?t:r}`}(m,"way")," to level up this article.")),/* @__PURE__ */a.createElement(c,{orientation:"horizontal",rounded:!1,"aria-label":"Suggestion actions"},/* @__PURE__ */a.createElement(l,{variant:"link",onClick:f},"Start review"),/* @__PURE__ */a.createElement(l,{variant:"link",onClick:g},"Reject all"),/* @__PURE__ */a.createElement(l,{variant:"surface",elevation:"shadow",onClick:E},"Approve all"))),/* @__PURE__ */a.createElement("div",{className:"py-3 px-6 flex items-center bg-blue-300 border-l border-blue-700 gap-2 rounded-r-md"},/* @__PURE__ */a.createElement("p",{className:"text-sm text-foreground"},/* @__PURE__ */a.createElement("span",{"aria-hidden":"true"},A,"/",d),/* @__PURE__ */a.createElement("span",{className:"sr-only","aria-live":"polite"},"Article ",A," of ",d)),/* @__PURE__ */a.createElement(n,null,/* @__PURE__ */a.createElement(o,{asChild:!0},/* @__PURE__ */a.createElement(l,{variant:"link",size:"icon",disabled:!k,onClick:p,"aria-label":"Go to next article"},
|
|
3
3
|
/* @__PURE__ */a.createElement(t,{"aria-hidden":"true",weight:"bold"}))),/* @__PURE__ */a.createElement(i,{side:"bottom",bgColor:"--bfc-foreground",className:"text-background"},"Next Article")),/* @__PURE__ */a.createElement(n,null,/* @__PURE__ */a.createElement(o,{asChild:!0},/* @__PURE__ */a.createElement(l,{variant:"link",size:"icon",disabled:!N,onClick:b,"aria-label":"Go to previous article"},
|
|
4
4
|
/* @__PURE__ */a.createElement(r,{"aria-hidden":"true",weight:"bold"}))),/* @__PURE__ */a.createElement(i,{side:"top",bgColor:"--bfc-foreground",className:"text-background"},"Previous Article"))))});export{m as ArticleSuggestionsBanner};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import e from"react";import{LineChart as t,CartesianGrid as a,XAxis as r,Line as l,PieChart as n,Pie as o,Label as c}from"recharts";import{a as s}from"../chunks/trend-value.BPBDBsk2.js";import{Card as m,CardHeader as i,CardContent as d}from"./ui/card.js";import{C as u,a as f,b as v}from"../chunks/chart.BDL2tf-S.js";import{f as p}from"../chunks/formatNumber.DhVn228t.js";import{u as x}from"../chunks/useChartDateFormatters.Dx2h5AAm.js";import{c as k}from"../chunks/utils.C6Qu-kwd.js";const E={covered:{label:"Covered",color:"var(--bfc-v2-color-blue-600, #357DE8)"},uncovered:{label:"Uncovered",color:"var(--bfc-v2-color-mono-300, #E5E5E5)"}};function h({total:h,trend:y,trendValue:g,coveragePercentage:b,data:N,chartConfig:j,locale:w,className:A}){const{tickFormatter:
|
|
2
|
-
return e.createElement(m,{className:k("shadow-none border border-dark-300 rounded-lg",A)},/* @__PURE__ */e.createElement(i,{className:"p-0 space-y-0 border-b border-dark-300"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1 justify-center py-4 px-4"},/* @__PURE__ */e.createElement("p",{className:"uppercase heading-xxxs font-semibold text-dark tracking-normal"},"Articles Generated by Brainfish (coverage)"),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},/* @__PURE__ */e.createElement("span",{className:"font-mono text-3xl leading-10 text-dark"},p(h,{})),/* @__PURE__ */e.createElement(s,{trend:y,trendValue:g})))),/* @__PURE__ */e.createElement(d,{className:"flex gap-2 p-0"},/* @__PURE__ */e.createElement("div",{className:"flex-1 min-w-0 px-4 pt-4 pb-0"},/* @__PURE__ */e.createElement(u,{config:j,className:"h-48 w-full"},/* @__PURE__ */e.createElement(t,{data:N,margin:{top:8,left:20,right:20,bottom:0}},/* @__PURE__ */e.createElement(a,{horizontal:!0,vertical:!1,className:"stroke-dark-300"}),/* @__PURE__ */e.createElement(r,{dataKey:"date",tickLine:!1,axisLine:!1,tickMargin:8,padding:{left:15,right:15},minTickGap:32,interval:"preserveStartEnd",tickFormatter:
|
|
3
|
-
return e.createElement("text",{x:s,y:a,dy:12,textAnchor:c,className:"text-xs fill-dark-600"},
|
|
1
|
+
import e from"react";import{LineChart as t,CartesianGrid as a,XAxis as r,Line as l,PieChart as n,Pie as o,Label as c}from"recharts";import{a as s}from"../chunks/trend-value.BPBDBsk2.js";import{Card as m,CardHeader as i,CardContent as d}from"./ui/card.js";import{C as u,a as f,b as v}from"../chunks/chart.BDL2tf-S.js";import{f as p}from"../chunks/formatNumber.DhVn228t.js";import{u as x}from"../chunks/useChartDateFormatters.Dx2h5AAm.js";import{c as k}from"../chunks/utils.C6Qu-kwd.js";const E={covered:{label:"Covered",color:"var(--bfc-v2-color-blue-600, #357DE8)"},uncovered:{label:"Uncovered",color:"var(--bfc-v2-color-mono-300, #E5E5E5)"}};function h({total:h,trend:y,trendValue:g,coveragePercentage:b,data:N,chartConfig:j,locale:w,className:A}){const{tickFormatter:C,formatXLabel:K}=x(w),B=Object.keys(j),M=Math.round(Math.min(100,Math.max(0,b)));/* @__PURE__ */
|
|
2
|
+
return e.createElement(m,{className:k("shadow-none border border-dark-300 rounded-lg",A)},/* @__PURE__ */e.createElement(i,{className:"p-0 space-y-0 border-b border-dark-300"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1 justify-center py-4 px-4"},/* @__PURE__ */e.createElement("p",{className:"uppercase heading-xxxs font-semibold text-dark tracking-normal"},"Articles Generated by Brainfish (coverage)"),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},/* @__PURE__ */e.createElement("span",{className:"font-mono text-3xl leading-10 text-dark"},p(h,{})),/* @__PURE__ */e.createElement(s,{trend:y,trendValue:g})))),/* @__PURE__ */e.createElement(d,{className:"flex gap-2 p-0"},/* @__PURE__ */e.createElement("div",{className:"flex-1 min-w-0 px-4 pt-4 pb-0"},/* @__PURE__ */e.createElement(u,{config:j,className:"h-48 w-full"},/* @__PURE__ */e.createElement(t,{data:N,margin:{top:8,left:20,right:20,bottom:0}},/* @__PURE__ */e.createElement(a,{horizontal:!0,vertical:!1,className:"stroke-dark-300"}),/* @__PURE__ */e.createElement(r,{dataKey:"date",tickLine:!1,axisLine:!1,tickMargin:8,padding:{left:15,right:15},minTickGap:32,interval:"preserveStartEnd",tickFormatter:C,tick:({x:t,y:a,payload:r,index:l})=>{const n=0===l,o=l===N.length-1,c=n?"start":o?"end":"middle",s=n?t-15:o?t+15:t;/* @__PURE__ */
|
|
3
|
+
return e.createElement("text",{x:s,y:a,dy:12,textAnchor:c,className:"text-xs fill-dark-600"},C(r.value))}}),/* @__PURE__ */e.createElement(f,{cursor:!1,content:({active:t,payload:a,label:r})=>/* @__PURE__ */e.createElement(v,{active:t,payload:a,label:null!=r?K(r):""})}),B.map(t=>/* @__PURE__ */e.createElement(l,{key:t,dataKey:t,type:"monotone",stroke:`var(--color-${t})`,strokeWidth:2,dot:{r:4,fill:"white",strokeWidth:2,stroke:`var(--color-${t})`},activeDot:{r:5,fill:"white",strokeWidth:2,stroke:`var(--color-${t})`}}))))),/* @__PURE__ */e.createElement("div",{className:"w-80 shrink-0 flex items-center justify-center"},/* @__PURE__ */e.createElement(u,{config:E,className:"aspect-square w-full max-w-44"},/* @__PURE__ */e.createElement(n,null,/* @__PURE__ */e.createElement(o,{data:[{value:100,fill:"var(--color-uncovered)"}],dataKey:"value",innerRadius:"76%",outerRadius:"82%",stroke:"none",isAnimationActive:!1}),/* @__PURE__ */e.createElement(o,{data:[{name:"covered",value:M,fill:"var(--color-covered)"},{name:"uncovered",value:100-M,fill:"transparent"}],dataKey:"value",nameKey:"name",innerRadius:"68%",outerRadius:"90%",startAngle:90,endAngle:-270,stroke:"none"},
|
|
4
4
|
/* @__PURE__ */e.createElement(c,{content:({viewBox:t})=>t&&"cx"in t&&"cy"in t?/* @__PURE__ */e.createElement("text",{x:t.cx,y:t.cy,textAnchor:"middle",dominantBaseline:"central"},/* @__PURE__ */e.createElement("tspan",{className:"font-mono text-3xl fill-dark-600"},M,"%")):null})))))))}export{h as ArticlesCoverage};
|
|
5
5
|
//# sourceMappingURL=articles-coverage.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import e from"react";import{LineChart as t,CartesianGrid as a,XAxis as r,Line as c}from"recharts";import{a as s}from"../chunks/trend-value.BPBDBsk2.js";import{Card as l,CardHeader as n,CardContent as o}from"./ui/card.js";import{C as m,a as i,b as d,c as p,d as k}from"../chunks/chart.BDL2tf-S.js";import{f as u}from"../chunks/formatNumber.DhVn228t.js";import{u as f}from"../chunks/useChartDateFormatters.Dx2h5AAm.js";import{c as h}from"../chunks/utils.C6Qu-kwd.js";function x({total:x,trend:E,trendValue:y,data:g,chartConfig:b,dashedKeys:N=[],locale:v,className:j}){const{tickFormatter:w,formatXLabel:
|
|
1
|
+
import e from"react";import{LineChart as t,CartesianGrid as a,XAxis as r,Line as c}from"recharts";import{a as s}from"../chunks/trend-value.BPBDBsk2.js";import{Card as l,CardHeader as n,CardContent as o}from"./ui/card.js";import{C as m,a as i,b as d,c as p,d as k}from"../chunks/chart.BDL2tf-S.js";import{f as u}from"../chunks/formatNumber.DhVn228t.js";import{u as f}from"../chunks/useChartDateFormatters.Dx2h5AAm.js";import{c as h}from"../chunks/utils.C6Qu-kwd.js";function x({total:x,trend:E,trendValue:y,data:g,chartConfig:b,dashedKeys:N=[],locale:v,className:j}){const{tickFormatter:w,formatXLabel:C}=f(v),A=Object.keys(b);/* @__PURE__ */
|
|
2
2
|
return e.createElement(l,{className:h("shadow-none border border-dark-300 rounded-lg",j)},/* @__PURE__ */e.createElement(n,{className:"p-0 space-y-0 border-b border-dark-300"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1 justify-center py-4 px-4"},/* @__PURE__ */e.createElement("p",{className:"uppercase heading-xxxs font-semibold text-dark tracking-normal"},"Articles updated"),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},/* @__PURE__ */e.createElement("span",{className:"font-mono text-3xl leading-10 text-dark"},u(x,{})),/* @__PURE__ */e.createElement(s,{trend:E,trendValue:y})))),/* @__PURE__ */e.createElement(o,{className:"p-4"},/* @__PURE__ */e.createElement(m,{config:b,className:"h-48 w-full"},/* @__PURE__ */e.createElement(t,{data:g,margin:{top:8,left:20,right:20,bottom:0}},/* @__PURE__ */e.createElement(a,{horizontal:!0,vertical:!1,className:"stroke-dark-300"}),/* @__PURE__ */e.createElement(r,{dataKey:"date",tickLine:!1,axisLine:!1,tickMargin:8,padding:{left:15,right:15},minTickGap:32,interval:"preserveStartEnd",tickFormatter:w,tick:({x:t,y:a,payload:r,index:c})=>{const s=0===c,l=c===g.length-1,n=s?"start":l?"end":"middle",o=s?t-15:l?t+15:t;/* @__PURE__ */
|
|
3
|
-
return e.createElement("text",{x:o,y:a,dy:12,textAnchor:n,className:"text-xs fill-dark-600"},w(r.value))}}),/* @__PURE__ */e.createElement(i,{cursor:!1,content:({active:t,payload:a,label:r})=>/* @__PURE__ */e.createElement(d,{active:t,payload:a,label:
|
|
3
|
+
return e.createElement("text",{x:o,y:a,dy:12,textAnchor:n,className:"text-xs fill-dark-600"},w(r.value))}}),/* @__PURE__ */e.createElement(i,{cursor:!1,content:({active:t,payload:a,label:r})=>/* @__PURE__ */e.createElement(d,{active:t,payload:a,label:C(r),className:"min-w-52"})}),A.map(t=>{const a=N.includes(t);/* @__PURE__ */
|
|
4
4
|
return e.createElement(c,{key:t,dataKey:t,type:"monotone",stroke:`var(--color-${t})`,strokeWidth:2,strokeDasharray:a?"5 5":void 0,dot:({cx:t,cy:a,stroke:r})=>/* @__PURE__ */e.createElement("circle",{cx:t,cy:a,r:4,fill:"white",stroke:r,strokeWidth:2}),activeDot:{r:5,strokeWidth:0}})}),/* @__PURE__ */e.createElement(p,{content:/* @__PURE__ */e.createElement(k,null)})))))}export{x as ArticlesUpdated};
|
|
5
5
|
//# sourceMappingURL=articles-updated.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{C as ChatSearch,a as ChatSearchProvider,N as NextBestActionType,R as ResolvedConversationFooter,u as useChatSearch,b as useIsChatSearchDirty,v as validateUrlString}from"../chunks/ChatSearch.
|
|
1
|
+
export{C as ChatSearch,a as ChatSearchProvider,N as NextBestActionType,R as ResolvedConversationFooter,u as useChatSearch,b as useIsChatSearchDirty,v as validateUrlString}from"../chunks/ChatSearch.D5EABw51.js";
|
|
2
2
|
//# sourceMappingURL=chat-search.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{C as Combobox}from"../chunks/combobox.
|
|
1
|
+
export{C as Combobox}from"../chunks/combobox.CLT9CXUV.js";
|
|
2
2
|
//# sourceMappingURL=combobox.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{C as ContextPillBadge,a as Conversation,b as ConversationActions,c as ConversationInput,d as ConversationMessageAssistant,e as ConversationMessageUser,f as ConversationMessages,g as ConversationProvider,h as ConversationStatus,i as ConversationSuggestions,j as getConversationStatusLabel,u as useConversation}from"../chunks/Conversation.
|
|
1
|
+
export{C as ContextPillBadge,a as Conversation,b as ConversationActions,c as ConversationInput,d as ConversationMessageAssistant,e as ConversationMessageUser,f as ConversationMessages,g as ConversationProvider,h as ConversationStatus,i as ConversationSuggestions,j as getConversationStatusLabel,u as useConversation}from"../chunks/Conversation.Dq66Znf4.js";
|
|
2
2
|
//# sourceMappingURL=conversation.js.map
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import e,{useState as t,useEffect as a,useRef as s,useMemo as r}from"react";import{S as n}from"../chunks/status-badge.Cf3R4nVr.js";import{ArrowSquareOut as l,CheckCircle as c,XCircle as i,ListMagnifyingGlass as m,UserCircle as o,Eye as d,UserFocus as u,Circle as p}from"@phosphor-icons/react";import{F as f}from"../chunks/FormattedMessage.
|
|
2
|
-
return e.createElement("div",{className:z("space-y-4",d)},/* @__PURE__ */e.createElement("div",{className:"flex gap-2 px-4"},W&&/* @__PURE__ */e.createElement(
|
|
3
|
-
/* @__PURE__ */e.createElement(c,null)," ",!1===O?"Approved":"Approve")),/* @__PURE__ */e.createElement(_,null,/* @__PURE__ */e.createElement("span",null,"Approve the answer"))),B&&/* @__PURE__ */e.createElement(
|
|
1
|
+
import e,{useState as t,useEffect as a,useRef as s,useMemo as r}from"react";import{S as n}from"../chunks/status-badge.Cf3R4nVr.js";import{ArrowSquareOut as l,CheckCircle as c,XCircle as i,ListMagnifyingGlass as m,UserCircle as o,Eye as d,UserFocus as u,Circle as p}from"@phosphor-icons/react";import{F as f}from"../chunks/FormattedMessage.Djy5cn5F.js";import{Spinner as g}from"./ui/spinner.js";import{B as E}from"../chunks/button.Cs1X8upM.js";import{useForm as h,Controller as v}from"react-hook-form";import{Select as N,SelectTrigger as x,SelectValue as b,SelectContent as w,SelectItem as y}from"./ui/select.js";import{Label as k}from"./ui/label.js";import{Textarea as j}from"./ui/textarea.js";import{Tooltip as C,TooltipTrigger as A,TooltipContent as _}from"./ui/tooltip.js";import{c as z}from"../chunks/utils.C6Qu-kwd.js";import{DivButton as O}from"./ui/div-button.js";import{ScrollArea as S}from"./ui/scroll-area.js";import{Sheet as D,SheetTrigger as F,SheetContent as R,SheetHeader as M,SheetTitle as I,SheetDescription as q}from"./ui/sheet.js";import{Badge as P}from"./ui/badge.js";import{G as T}from"../chunks/generating-star.BN9p_FDu.js";import{Item as W,ItemHeader as B,ItemTitle as L,ItemContent as U,ItemDescription as G}from"./ui/item.js";import{Accordion as K,AccordionItem as H,AccordionTrigger as Z,AccordionContent as V}from"./ui/accordion.js";import{c as $,b as J}from"../chunks/formatDate.D2xEZm8f.js";import{createId as Q}from"@paralleldrive/cuid2";import{Table as X,TableHeader as Y,TableRow as ee,TableHead as te,TableBody as ae,TableCell as se}from"./ui/table.js";import '../global.css';import '../convos.css';/* empty css */import"@radix-ui/react-accordion";import"clsx";import"tailwind-merge";import"./ui/alert-dialog.js";import"./ui/alert.js";import"@radix-ui/react-avatar";import"./ui/button-group.js";import"./ui/calendar.js";import"./ui/card.js";import"@radix-ui/react-collapsible";import"./ui/command.js";import"./ui/dialog.js";import"./ui/dropdown-menu.js";import"./ui/icon.js";import"./ui/input.js";import"./ui/popover.js";import"./ui/progress.js";import"./ui/radio-group.js";import"./ui/separator.js";import"./ui/switch.js";import"../logos/microsoft-teams-logo.js";import"../logos/slack-logo.js";import"../logos/microsoft-logo.js";import{d as re}from"../chunks/dark.DuW7JuAk.js";function ne({messageId:s}){const{fetchAnswerDiagnostics:r}=Ae(),[n,c]=t(null),[i,m]=t(!0);return a(()=>{r(s).then(e=>c(e)).finally(()=>m(!1))},[r,s]),/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-4 px-4 flex-shrink-0 bg-surface","data-name":"discard-dialog-answer-diagnostic"},i?/* @__PURE__ */e.createElement("div",{className:"flex items-center justify-center h-full"},/* @__PURE__ */e.createElement(g,null)):/* @__PURE__ */e.createElement(e.Fragment,null,n&&/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement("dl",{className:"grid grid-cols-[1fr_2fr] grid-rows-2 gap-5"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Confidence"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},n.confidence_score)),n.answer_generation_type&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Answer Type"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},n.answer_generation_type)),n.query_context_relevance&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Relevance"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},n.query_context_relevance)),n.context_sufficiency&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1"},/* @__PURE__ */e.createElement("dt",{className:"heading-xs"},"Context"),/* @__PURE__ */e.createElement("dd",{className:"text-sm"},n.context_sufficiency))),n.confidence_justification&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2","data-name":"diagnostic-justification"},/* @__PURE__ */e.createElement("span",{className:"heading-xs"},"Justification"),/* @__PURE__ */e.createElement("p",{className:"text-sm my-0"},n.confidence_justification)),n.evidence_from_context&&n.evidence_from_context.length>0&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2","data-name":"diagnostic-evidence"},/* @__PURE__ */e.createElement("span",{className:"heading-xs"},"Evidence (from Knowledge Base)"),n.evidence_from_context.map((t,a)=>/* @__PURE__ */e.createElement("div",{key:a,className:"flex flex-col gap-1"},t.supporting_quote&&/* @__PURE__ */e.createElement("p",{className:"text-sm my-0"},t.supporting_quote),t.url&&/* @__PURE__ */e.createElement(E,{variant:"link",size:"sm",className:"flex gap-1 text-sm self-end items-center",asChild:!0},/* @__PURE__ */e.createElement("a",{href:t.url,target:"_blank",rel:"noopener noreferrer"},/* @__PURE__ */e.createElement("span",null,"Source"),/* @__PURE__ */e.createElement(l,{size:16})))))))))}var le=/* @__PURE__ */(e=>(e.INCORRECT_ANSWER="incorrect_answer",e.HALLUCINATED_ANSWER="hallucinated_answer",e.OVERSHARING="oversharing",e.WRONG_ARTICLE_SURFACED="wrong_article_surfaced",e.OTHER="other",e))(le||{});const ce={incorrect_answer:"Incorrect answer",hallucinated_answer:"Hallucinated answer",oversharing:"Oversharing",wrong_article_surfaced:"Wrong article surfaced",other:"Other"};function ie({discarded:r,discardedMeta:n,onSubmit:l,onApprove:m,selectOpenRef:o,className:d}){const[u,p]=t(r??!1),[f,g]=t(!1),[O,S]=t(r),D=s(null);a(()=>{S(r),r&&p(!0)},[r]);const F=e=>{g(e),o&&(o.current.isOpen=e)};a(()=>{o&&(o.current.close=()=>F(!1))},[o]);const{control:R,register:M,handleSubmit:I,reset:q,formState:{isSubmitting:P}}=h({defaultValues:{reason:n?.reason,preferredAnswer:n?.suggestedAnswer||""}});a(()=>{q({reason:n?.reason,preferredAnswer:n?.suggestedAnswer||""})},[n,q]),a(()=>{D.current&&(D.current.inert=!u)},[u]);const T=null!=O,W=!T||!1===O,B=!T||!0===O;/* @__PURE__ */
|
|
2
|
+
return e.createElement("div",{className:z("space-y-4",d)},/* @__PURE__ */e.createElement("div",{className:"flex gap-2 px-4"},W&&/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(A,{asChild:!0},/* @__PURE__ */e.createElement(E,{variant:"surface",elevation:"shadow",size:"sm",className:z("text-default !opacity-100",{"bg-green-600 text-dark-100":!1===O}),disabled:T,onClick:async()=>{try{await m(),S(!1),p(!1),F(!1)}catch(e){console.error("Failed to approve:",e)}}},
|
|
3
|
+
/* @__PURE__ */e.createElement(c,null)," ",!1===O?"Approved":"Approve")),/* @__PURE__ */e.createElement(_,null,/* @__PURE__ */e.createElement("span",null,"Approve the answer"))),B&&/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(A,{asChild:!0},/* @__PURE__ */e.createElement(E,{variant:"surface",elevation:"shadow",size:"sm",className:z("text-default !opacity-100",{"bg-red-600 text-dark-100":!0===O}),disabled:T,onClick:()=>p(!u)},
|
|
4
4
|
/* @__PURE__ */e.createElement(i,null),!0===O?"Discarded":"Discard")),/* @__PURE__ */e.createElement(_,null,/* @__PURE__ */e.createElement("span",null,"Discard the answer")))),/* @__PURE__ */e.createElement("div",{className:z("grid transition-[grid-template-rows] duration-300 ease-in-out",u?"grid-rows-[1fr]":"grid-rows-[0fr]")},O?/* @__PURE__ */e.createElement("div",{className:z("overflow-hidden min-h-0 px-4 bg-dark-200 space-y-4",u?"py-4 mb-4":"py-0"),"data-name":"discard-dialog-reason"},
|
|
5
5
|
/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(k,{htmlFor:"reason",className:"text-sm"},"Reason"),/* @__PURE__ */e.createElement("span",{className:"text-sm block"},n?.reason&&ce[n.reason])),
|
|
6
6
|
/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(k,{htmlFor:"preferredAnswer",className:"text-sm"},"Preferred answer"),/* @__PURE__ */e.createElement("span",{className:"text-sm block"},n?.suggestedAnswer))):/* @__PURE__ */e.createElement("form",{ref:D,onSubmit:I(async e=>{try{await l(e),S(!0),F(!1)}catch(t){console.error("Failed to discard:",t)}}),className:z("overflow-hidden min-h-0 px-4 bg-dark-200 transition-all duration-300 ease-in-out",u?"py-4 mb-4":"py-0")},
|
|
7
7
|
/* @__PURE__ */e.createElement("fieldset",{className:"space-y-4","data-name":"discard-dialog-reason"},/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(k,{htmlFor:"reason",className:"heading-xs"},"Reason"),/* @__PURE__ */e.createElement(v,{control:R,name:"reason",rules:{required:!0},render:({field:t})=>/* @__PURE__ */e.createElement(N,{value:t.value,onValueChange:t.onChange,open:f,onOpenChange:F,required:!0},
|
|
8
8
|
/* @__PURE__ */e.createElement(x,{className:"border-dark-300 bg-surface"},/* @__PURE__ */e.createElement(b,{placeholder:"Select a reason"})),
|
|
9
|
-
/* @__PURE__ */e.createElement(w,null,Object.values(le).map(t=>/* @__PURE__ */e.createElement(y,{key:t,value:t},ce[t]))))}),/* @__PURE__ */e.createElement("span",{className:"text-xs text-subtle ml-1 hidden"},"Give your ambient agent a descriptive name that reflects its purpose. This agent will learn from your content to provide personalized assistance.")),/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(k,{htmlFor:"preferredAnswer",className:"heading-xs"},"Preferred answer"),/* @__PURE__ */e.createElement(
|
|
9
|
+
/* @__PURE__ */e.createElement(w,null,Object.values(le).map(t=>/* @__PURE__ */e.createElement(y,{key:t,value:t},ce[t]))))}),/* @__PURE__ */e.createElement("span",{className:"text-xs text-subtle ml-1 hidden"},"Give your ambient agent a descriptive name that reflects its purpose. This agent will learn from your content to provide personalized assistance.")),/* @__PURE__ */e.createElement("div",{className:"space-y-1"},/* @__PURE__ */e.createElement(k,{htmlFor:"preferredAnswer",className:"heading-xs"},"Preferred answer"),/* @__PURE__ */e.createElement(j,{id:"preferredAnswer",required:!0,minLength:10,placeholder:"Explain what you'd like Brainfish to do next time in this case....",rows:4,className:"h-52 resize-none bg-surface",...M("preferredAnswer")}),/* @__PURE__ */e.createElement("span",{className:"text-xs text-subtle ml-1 hidden"},"Tell Brainfish why this is the incorrect answer.")),/* @__PURE__ */e.createElement("div",{className:"flex gap-2 !mb-1 justify-end mr-1"},/* @__PURE__ */e.createElement(E,{variant:"link",size:"sm",type:"button",onClick:()=>{p(!1),F(!1),q()}},"Cancel"),/* @__PURE__ */e.createElement(E,{type:"submit",variant:"default",elevation:"shadow",size:"sm",disabled:P},P?"Submitting...":"Submit"))))))}function me({id:a,discarded:r,discardedMeta:n,open:l,onOpenChange:c,...i}){const{onDiscard:o,onApprove:d}=Ae(),[u,p]=t(!1),f=s({isOpen:!1,close:()=>{}}),g=l??u,E=c??p;/* @__PURE__ */
|
|
10
10
|
return e.createElement(D,{modal:!1,open:g,onOpenChange:E,...i},/* @__PURE__ */e.createElement(F,{asChild:!0,onClick:e=>e.stopPropagation(),onKeyUp:e=>e.stopPropagation()},/* @__PURE__ */e.createElement(O,{variant:"shadowSurface",size:"sm","aria-label":"Inspect answer information"},/* @__PURE__ */e.createElement(m,{className:"text-dark-600"})," Inspect")),/* @__PURE__ */e.createElement(R,{className:"space-y-4 px-0",onEscapeKeyDown:e=>{f.current.isOpen&&(e.preventDefault(),f.current.close())},onInteractOutside:e=>{f.current.isOpen&&e.preventDefault()}},
|
|
11
11
|
/* @__PURE__ */e.createElement(M,{className:"px-4"},/* @__PURE__ */e.createElement(I,{className:"heading-sm m-0"},"Answer information"),/* @__PURE__ */e.createElement(q,{className:"sr-only"},"Shows answer diagnostics and allows you to provide feedback.")),
|
|
12
12
|
/* @__PURE__ */e.createElement(S,{className:"h-[calc(100vh-4rem)] pb-4"},/* @__PURE__ */e.createElement(ie,{discarded:r,discardedMeta:n,onSubmit:async e=>{await o(a,e.reason,e.preferredAnswer).then(()=>E(!1))},onApprove:async()=>{await d(a)},selectOpenRef:f}),/* @__PURE__ */e.createElement(ne,{messageId:a}))))}const oe=({score:t})=>{const a=`${t}%`;return!t||t>100?/* @__PURE__ */e.createElement(P,{variant:"disabled"},"N/A"):t>=80?/* @__PURE__ */e.createElement(P,{variant:"success"},a):t>=40&&t<80?/* @__PURE__ */e.createElement(P,{variant:"warning"},a):/* @__PURE__ */e.createElement(P,{variant:"disabled"},"N/A")},de=/(```[\s\S]*?```|`[^`\n]+`|<(?:[a-zA-Z][a-zA-Z0-9+.-]*:|www\.)[^\s>]+>)/g,ue=/^<(?:[a-zA-Z][a-zA-Z0-9+.-]*:|www\.)[^\s>]+>$/;function pe(e){return e.split(de).map(e=>function(e){return e.startsWith("```")||e.startsWith("`")&&e.endsWith("`")||ue.test(e)}(e)?e:e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")).join("")}var fe=/* @__PURE__ */(e=>(e.ACTION="action",e.FEEDBACK="feedback",e.QUESTION="question",e.ANSWER="answer",e))(fe||{}),ge=/* @__PURE__ */(e=>(e.Positive="positive",e.Negative="negative",e))(ge||{});const Ee=e=>"answer"===e.type,he=e=>"question"===e.type,ve=e=>"feedback"===e.type,Ne=e=>"action"===e.type;function xe({attachments:t}){/* @__PURE__ */
|
|
13
13
|
return e.createElement("div",{className:"flex gap-2 flex-wrap"},t.filter(e=>"image"===e.type).map((t,a)=>/* @__PURE__ */e.createElement("div",{key:a,className:"relative bg-dark-300 p-1 rounded shrink-0"},/* @__PURE__ */e.createElement("a",{href:t.url,target:"_blank",rel:"noopener noreferrer"},/* @__PURE__ */e.createElement("img",{src:t.url,alt:"",className:"size-14 object-cover rounded"})),/* @__PURE__ */e.createElement("div",{className:"absolute top-1.5 right-1.5 bg-dark-300 rounded-full p-0.5"},/* @__PURE__ */e.createElement(d,{size:8})))))}function be(t){const{id:a,content:s,timestamp:c,locale:i,isFeedbackDialogOpen:m,onFeedbackDialogChange:d}=t,u=r(()=>pe(s),[s]),{locale:p}=Ae(),g=$(c,i||p);if(Ee(t)){const{relatedArticles:s,discarded:r,discardedMeta:n,confidenceScore:c}=t;/* @__PURE__ */
|
|
14
14
|
return e.createElement("li",{className:"relative before-line after-line list-none [&_a]:break-all"},/* @__PURE__ */e.createElement(W,{className:"message-item"},/* @__PURE__ */e.createElement(B,{className:"justify-start gap-0"},/* @__PURE__ */e.createElement(T,{variant:"gradient",className:"relative -left-[6px]"}),/* @__PURE__ */e.createElement(L,{className:"text-xs font-bold"},"Generated answer "+(r?"(Discarded)":""))),/* @__PURE__ */e.createElement(U,{className:z("message-ai-content",{"py-6":!s?.length,"pt-6 pb-0":s?.length})},
|
|
15
|
-
/* @__PURE__ */e.createElement("div",{className:"message-content-wrapper"},/* @__PURE__ */e.createElement(f,{message:{content:u}}),/* @__PURE__ */e.createElement("div",{className:"flex gap-2 justify-between mt-2 items-center"},/* @__PURE__ */e.createElement("span",{className:"message-timestamp"},g),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},c&&/* @__PURE__ */e.createElement(
|
|
15
|
+
/* @__PURE__ */e.createElement("div",{className:"message-content-wrapper"},/* @__PURE__ */e.createElement(f,{message:{content:u}}),/* @__PURE__ */e.createElement("div",{className:"flex gap-2 justify-between mt-2 items-center"},/* @__PURE__ */e.createElement("span",{className:"message-timestamp"},g),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},c&&/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(A,{asChild:!0},/* @__PURE__ */e.createElement(O,{variant:"outline",size:"sm",className:"text-xs p-1 h-auto"},c)),/* @__PURE__ */e.createElement(_,null,/* @__PURE__ */e.createElement("p",null,"Answer score: ",c))),/* @__PURE__ */e.createElement(me,{id:a,discarded:r,discardedMeta:n,open:m,onOpenChange:d})))),!!s?.length&&/* @__PURE__ */e.createElement(K,{type:"single",collapsible:!0,className:"p-0 custom-dashed-border-t-dark-300 w-full"},/* @__PURE__ */e.createElement(H,{value:"related-articles"},/* @__PURE__ */e.createElement(Z,{className:"px-6"},"Related articles"),/* @__PURE__ */e.createElement(V,null,/* @__PURE__ */e.createElement("ul",{className:"message-article-list"},s.map(t=>/* @__PURE__ */e.createElement("li",{key:t.id,className:"grid gap-2 grid-cols-[auto_1fr] items-center justify-items-start"},
|
|
16
16
|
/* @__PURE__ */e.createElement(oe,{score:Math.round(100*t.score)}),
|
|
17
17
|
/* @__PURE__ */e.createElement(E,{variant:"link",size:"xs",asChild:!0,className:"flex items-center gap-2 min-w-0 !justify-start w-full"},
|
|
18
18
|
/* @__PURE__ */e.createElement("a",{href:t.url,target:"_blank",rel:"noopener noreferrer"},/* @__PURE__ */e.createElement("span",{className:"truncate"},t.title),/* @__PURE__ */e.createElement(l,{className:"size-4 flex-shrink-0",weight:"regular"}))))))))))))}const h=ve(t)?t.feedback:null;/* @__PURE__ */
|
|
19
|
-
return e.createElement("li",{className:"relative list-none before-line--user after-line--user"},/* @__PURE__ */e.createElement(W,{className:"message-item"},/* @__PURE__ */e.createElement(B,{className:"basis-0"},/* @__PURE__ */e.createElement(o,{weight:"fill",size:24})),/* @__PURE__ */e.createElement(U,{className:"message-user-content"},he(t)&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2"},t.attachments&&t.attachments.some(e=>"image"===e.type)&&/* @__PURE__ */e.createElement(xe,{attachments:t.attachments}),!t.onlyShowAttachments&&/* @__PURE__ */e.createElement(f,{message:{content:u}}),/* @__PURE__ */e.createElement("span",{className:"message-timestamp"},g)),ve(t)&&h&&/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement("div",{className:"message-header"},/* @__PURE__ */e.createElement("div",{className:"message-feedback-text"},"positive"===h?"Upvoted as helpful":"Downvoted as not helpful"),/* @__PURE__ */e.createElement("div",{className:"message-meta"},/* @__PURE__ */e.createElement(n,{variant:"positive"===h?"success":"destructive"},"positive"===h?"Answered":"Unable to help"))),s&&/* @__PURE__ */e.createElement("div",{className:"text-base mb-1"},s),/* @__PURE__ */e.createElement("span",{className:"message-timestamp-simple"},g)),Ne(t)&&/* @__PURE__ */e.createElement("div",{className:"message-header"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2"},/* @__PURE__ */e.createElement("span",{className:"text-subtle text-sm italic"},s),/* @__PURE__ */e.createElement("span",{className:"message-timestamp-simple"},g)),/* @__PURE__ */e.createElement("div",{className:"message-meta"},/* @__PURE__ */e.createElement(n,{variant:"warning"},"Action"))))))}function we({conversationId:s,open:r,onOpenChange:n,...l}){const[c,i]=t(),[m,o]=t(),{fetchAttributes:d}=Ae();return a(()=>{d(s).then(e=>{i(e),o(function(e){const t=["id","name","email","phone"];if(0===e.length)return[];const a=e=>{const a=t.indexOf(e);return-1===a?1/0:a};return Object.keys(e[0]).sort((e,t)=>a(e)-a(t))}(e))}).catch(()=>{})},[d,s]),c?.length?/* @__PURE__ */e.createElement(D,{modal:!1,open:r,onOpenChange:n,...l},/* @__PURE__ */e.createElement(
|
|
20
|
-
/* @__PURE__ */e.createElement(u,{size:24})))),/* @__PURE__ */e.createElement(_,null,"Customer attributes")),/* @__PURE__ */e.createElement(R,{className:"space-y-4"},/* @__PURE__ */e.createElement(M,null,/* @__PURE__ */e.createElement(I,{className:"heading-sm m-0"},"Custom attributes"),/* @__PURE__ */e.createElement(q,{className:"sr-only"},"Custom attributes are used to store additional information about the conversation.")),m&&/* @__PURE__ */e.createElement(S,{className:"h-[calc(100vh-8rem)]"}," ",/* @__PURE__ */e.createElement(X,{className:"bg-surface","data-test-id":"attributes-table"},/* @__PURE__ */e.createElement(Y,null,/* @__PURE__ */e.createElement(ee,null,m.map(t=>/* @__PURE__ */e.createElement(te,{key:t,className:"capitalize font-bold"},t)))),/* @__PURE__ */e.createElement(ae,null,c.map(t=>/* @__PURE__ */e.createElement(ee,{key:t?.id??Q(),className:"border-none"},m.map(a=>/* @__PURE__ */e.createElement(se,{key:a,"data-title":a},"boolean"==typeof t[a]?String(t[a]):t[a]))))))))):null}const ye=e.forwardRef(({className:t,streamName:a,dotColor:s="transparent",...r},n)=>/* @__PURE__ */e.createElement(
|
|
21
|
-
/* @__PURE__ */e.createElement(P,{...r,className:"bg-surface rounded-full border border-dark-300 text-subtle"},/* @__PURE__ */e.createElement("span",{className:"flex items-center gap-1"},/* @__PURE__ */e.createElement(p,{size:8,weight:"bold",className:"!size-2 rounded-full",style:{backgroundColor:s},color:"transparent"===s?re[300]:"transparent"}),/* @__PURE__ */e.createElement("span",{className:"max-w-32 truncate inline-block"},a))))),/* @__PURE__ */e.createElement(_,null,a)));ye.displayName="StreamBadge";const ke=({score:t,status:a,statusMessage:s})=>t?/* @__PURE__ */e.createElement(
|
|
19
|
+
return e.createElement("li",{className:"relative list-none before-line--user after-line--user"},/* @__PURE__ */e.createElement(W,{className:"message-item"},/* @__PURE__ */e.createElement(B,{className:"basis-0"},/* @__PURE__ */e.createElement(o,{weight:"fill",size:24})),/* @__PURE__ */e.createElement(U,{className:"message-user-content"},he(t)&&/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2"},t.attachments&&t.attachments.some(e=>"image"===e.type)&&/* @__PURE__ */e.createElement(xe,{attachments:t.attachments}),!t.onlyShowAttachments&&/* @__PURE__ */e.createElement(f,{message:{content:u}}),/* @__PURE__ */e.createElement("span",{className:"message-timestamp"},g)),ve(t)&&h&&/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement("div",{className:"message-header"},/* @__PURE__ */e.createElement("div",{className:"message-feedback-text"},"positive"===h?"Upvoted as helpful":"Downvoted as not helpful"),/* @__PURE__ */e.createElement("div",{className:"message-meta"},/* @__PURE__ */e.createElement(n,{variant:"positive"===h?"success":"destructive"},"positive"===h?"Answered":"Unable to help"))),s&&/* @__PURE__ */e.createElement("div",{className:"text-base mb-1"},s),/* @__PURE__ */e.createElement("span",{className:"message-timestamp-simple"},g)),Ne(t)&&/* @__PURE__ */e.createElement("div",{className:"message-header"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2"},/* @__PURE__ */e.createElement("span",{className:"text-subtle text-sm italic"},s),/* @__PURE__ */e.createElement("span",{className:"message-timestamp-simple"},g)),/* @__PURE__ */e.createElement("div",{className:"message-meta"},/* @__PURE__ */e.createElement(n,{variant:"warning"},"Action"))))))}function we({conversationId:s,open:r,onOpenChange:n,...l}){const[c,i]=t(),[m,o]=t(),{fetchAttributes:d}=Ae();return a(()=>{d(s).then(e=>{i(e),o(function(e){const t=["id","name","email","phone"];if(0===e.length)return[];const a=e=>{const a=t.indexOf(e);return-1===a?1/0:a};return Object.keys(e[0]).sort((e,t)=>a(e)-a(t))}(e))}).catch(()=>{})},[d,s]),c?.length?/* @__PURE__ */e.createElement(D,{modal:!1,open:r,onOpenChange:n,...l},/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(A,{asChild:!0},/* @__PURE__ */e.createElement(F,{asChild:!0,onClick:e=>e.stopPropagation(),onKeyUp:e=>e.stopPropagation()},/* @__PURE__ */e.createElement(O,{variant:"ghost",size:"icon",className:"size-7 [&_svg]:size-6 text-dark-900","aria-label":"Open Custom attributes dialog"},
|
|
20
|
+
/* @__PURE__ */e.createElement(u,{size:24})))),/* @__PURE__ */e.createElement(_,null,"Customer attributes")),/* @__PURE__ */e.createElement(R,{className:"space-y-4"},/* @__PURE__ */e.createElement(M,null,/* @__PURE__ */e.createElement(I,{className:"heading-sm m-0"},"Custom attributes"),/* @__PURE__ */e.createElement(q,{className:"sr-only"},"Custom attributes are used to store additional information about the conversation.")),m&&/* @__PURE__ */e.createElement(S,{className:"h-[calc(100vh-8rem)]"}," ",/* @__PURE__ */e.createElement(X,{className:"bg-surface","data-test-id":"attributes-table"},/* @__PURE__ */e.createElement(Y,null,/* @__PURE__ */e.createElement(ee,null,m.map(t=>/* @__PURE__ */e.createElement(te,{key:t,className:"capitalize font-bold"},t)))),/* @__PURE__ */e.createElement(ae,null,c.map(t=>/* @__PURE__ */e.createElement(ee,{key:t?.id??Q(),className:"border-none"},m.map(a=>/* @__PURE__ */e.createElement(se,{key:a,"data-title":a},"boolean"==typeof t[a]?String(t[a]):t[a]))))))))):null}const ye=e.forwardRef(({className:t,streamName:a,dotColor:s="transparent",...r},n)=>/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(A,{asChild:!0},/* @__PURE__ */e.createElement("div",{ref:n,role:"button",className:z("flex items-center gap-1 rounded-full p-0",t),tabIndex:0},
|
|
21
|
+
/* @__PURE__ */e.createElement(P,{...r,className:"bg-surface rounded-full border border-dark-300 text-subtle"},/* @__PURE__ */e.createElement("span",{className:"flex items-center gap-1"},/* @__PURE__ */e.createElement(p,{size:8,weight:"bold",className:"!size-2 rounded-full",style:{backgroundColor:s},color:"transparent"===s?re[300]:"transparent"}),/* @__PURE__ */e.createElement("span",{className:"max-w-32 truncate inline-block"},a))))),/* @__PURE__ */e.createElement(_,null,a)));ye.displayName="StreamBadge";const ke=({score:t,status:a,statusMessage:s})=>t?/* @__PURE__ */e.createElement(C,null,/* @__PURE__ */e.createElement(A,{asChild:!0},/* @__PURE__ */e.createElement(O,{variant:"ghost",size:"sm",className:"p-0 h-[26px]"},/* @__PURE__ */e.createElement(n,{variant:a,suffix:t},s))),/* @__PURE__ */e.createElement(_,null,/* @__PURE__ */e.createElement("p",null,"Conversation score: ",t))):/* @__PURE__ */e.createElement(n,{variant:a,suffix:t},s);function je({locale:a,value:s,question:r,timestamp:n,location:l,source:c,status:i,statusMessage:m,hasAttributes:o,onClick:d,className:u,score:p,...f}){const{getMessages:g,isLoading:E,locale:h}=Ae(),[v,N]=t(null),[x,b]=t(null),w=(e,t)=>a=>{a?(N(e),t&&b(t)):(N(null),b(null))},y=null!==v,k=a||h,j=g(s),C=E(s),A=[J(n,k),l].filter(Boolean).join(" • ");/* @__PURE__ */
|
|
22
22
|
return e.createElement(H,{value:s,className:z('border border-dark-200 hover:border-dark-300 rounded-lg bg-dark-100 [&[data-state="open"]]:bg-surface [&[data-state="open"]]:border-dark-100',{"shadow-md shadow-dark-300":y},u),...f},
|
|
23
23
|
/* @__PURE__ */e.createElement(Z,{className:"flex-row-reverse px-4 gap-1 items-center [&[data-state=open]]:px-6",onClick:e=>{if(e.target.closest('[role="dialog"]'))return e.preventDefault(),void e.stopPropagation();d?.()}},
|
|
24
24
|
/* @__PURE__ */e.createElement(W,{size:"sm",className:"flex-1 p-0 justify-between"},/* @__PURE__ */e.createElement(U,{className:"max-w-[400px]"},/* @__PURE__ */e.createElement(L,{className:"text-base text-default"},r),/* @__PURE__ */e.createElement(G,{className:"text-xs text-default flex items-center gap-1"},A,c&&/* @__PURE__ */e.createElement(ye,{streamName:c.name,dotColor:c.color}))),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-0"},o&&/* @__PURE__ */e.createElement(we,{conversationId:s,open:"attributes"===v,onOpenChange:w("attributes")}),i&&/* @__PURE__ */e.createElement(ke,{score:p,status:i,statusMessage:m})))),
|
|
25
|
-
/* @__PURE__ */e.createElement(V,{className:"flex flex-col gap-4 text-balance px-5"},
|
|
26
|
-
return e.createElement(
|
|
27
|
-
return e.createElement(_e,{value:g},/* @__PURE__ */e.createElement(K,{type:"single",collapsible:!0,className:"w-full space-y-2"},t.map(t=>/* @__PURE__ */e.createElement(
|
|
25
|
+
/* @__PURE__ */e.createElement(V,{className:"flex flex-col gap-4 text-balance px-5"},C?/* @__PURE__ */e.createElement("div",{className:"text-center text-subtle py-4"},"Loading messages..."):/* @__PURE__ */e.createElement("ul",{className:"list-none space-y-4"},j.map((t,a)=>{const s=he(t)?t:null,r=s?.attachments?.length?s.attachments:null;return 0===a?r?/* @__PURE__ */e.createElement(be,{key:t.id,...{...t,onlyShowAttachments:!0},isFeedbackDialogOpen:"feedback"===v&&x===t.id,onFeedbackDialogChange:w("feedback",t.id)}):null:/* @__PURE__ */e.createElement(be,{key:t.id,...t,isFeedbackDialogOpen:"feedback"===v&&x===t.id,onFeedbackDialogChange:w("feedback",t.id)})}))))}const Ce=e.createContext(void 0);function Ae(){const t=e.useContext(Ce);if(void 0===t)throw new Error("useConvosContext must be used within a ConvosProvider");return t}function _e({children:t,value:a}){/* @__PURE__ */
|
|
26
|
+
return e.createElement(Ce.Provider,{value:a},t)}function ze({convos:t,fetchMessages:a,fetchAttributes:s,fetchAnswerDiagnostics:r,onDiscard:n,onApprove:l}){const[c,i]=e.useState({}),[m,o]=e.useState({}),d=e.useRef(/* @__PURE__ */new Set),u=e.useRef({}),p=e.useCallback(e=>{d.current.has(e)||u.current[e]||(u.current[e]=!0,o(t=>({...t,[e]:!0})),a(e).then(t=>{i(a=>({...a,[e]:t})),d.current.add(e)}).catch(()=>{}).finally(()=>{delete u.current[e],o(t=>{const a={...t};return delete a[e],a})}))},[a]),f=t[0]?.locale,g=e.useMemo(()=>({fetchMessages:a,fetchAttributes:s,getMessages:e=>c[e]||[],isLoading:e=>m[e]||!1,handleFetchMessages:p,locale:f,fetchAnswerDiagnostics:e=>r(e),onDiscard:n,onApprove:l}),[a,s,c,m,p,f,r,n,l]);/* @__PURE__ */
|
|
27
|
+
return e.createElement(_e,{value:g},/* @__PURE__ */e.createElement(K,{type:"single",collapsible:!0,className:"w-full space-y-2"},t.map(t=>/* @__PURE__ */e.createElement(je,{...t,key:t.value,onClick:()=>p(t.value)}))))}const Oe=({children:t})=>/* @__PURE__ */e.createElement("div",{className:"flex flex-col items-center justify-center h-full w-full mt-40 gap-2"},/* @__PURE__ */e.createElement(T,{className:"size-8",variant:"disabled"}),/* @__PURE__ */e.createElement("div",{className:"text-subtlest text-sm w-96 text-center leading-5"},t));export{je as Convo,ze as Convos,_e as ConvosProvider,Oe as EmptyConvos,ge as Feedback,be as Message,xe as MessageAttachmentImageThumbnails,fe as MessageType,n as StatusBadge,Ee as isAIAnswer,Ne as isAction,ve as isFeedback,he as isUserQuestion,Ae as useConvosContext};
|
|
28
28
|
//# sourceMappingURL=convos.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{D as DatePicker}from"../chunks/date-picker.
|
|
1
|
+
export{D as DatePicker}from"../chunks/date-picker.D9CRxYJf.js";
|
|
2
2
|
//# sourceMappingURL=date-picker.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{F as Feedback}from"../chunks/feedback.
|
|
1
|
+
export{F as Feedback}from"../chunks/feedback.CGFAP0XS.js";
|
|
2
2
|
//# sourceMappingURL=feedback.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{F as FileUpload,a as FileUploadStatus,f as formatFileSize}from"../chunks/file-upload-status.
|
|
1
|
+
export{F as FileUpload,a as FileUploadStatus,f as formatFileSize}from"../chunks/file-upload-status.ClQeoQQB.js";
|
|
2
2
|
//# sourceMappingURL=file-upload.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{F as Filter,a as Filters,O as Operator}from"../chunks/filters.
|
|
1
|
+
export{F as Filter,a as Filters,O as Operator}from"../chunks/filters.BRlRsGlZ.js";
|
|
2
2
|
//# sourceMappingURL=filter.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{F as FontPicker,a as FontPickerItem,c as clearFontCache,g as getCachedFonts,l as loadFont,s as setCachedFonts,u as useFontOptions}from"../chunks/font-picker.
|
|
1
|
+
export{F as FontPicker,a as FontPickerItem,c as clearFontCache,g as getCachedFonts,l as loadFont,s as setCachedFonts,u as useFontOptions}from"../chunks/font-picker.Dwwe5av-.js";
|
|
2
2
|
//# sourceMappingURL=font-picker.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{I as InputWithTags}from"../chunks/input-with-tags.
|
|
1
|
+
export{I as InputWithTags}from"../chunks/input-with-tags.pmOKv67d.js";
|
|
2
2
|
//# sourceMappingURL=input-with-tags.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{C as CodeBlock,F as FormattedMessage,M as MemoizedReactMarkdown,Z as ZoomableImage}from"../chunks/FormattedMessage.
|
|
1
|
+
export{C as CodeBlock,F as FormattedMessage,M as MemoizedReactMarkdown,Z as ZoomableImage}from"../chunks/FormattedMessage.Djy5cn5F.js";export{MermaidDiagram}from"../chunks/MermaidDiagram.PRgXQ5Yh.js";
|
|
2
2
|
//# sourceMappingURL=markdown.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{T as TwoLevelCombobox}from"../chunks/two-level-combobox.
|
|
1
|
+
export{T as TwoLevelCombobox}from"../chunks/two-level-combobox.SDv7qc_m.js";
|
|
2
2
|
//# sourceMappingURL=two-level-combobox.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import*as e from"react";import*as a from"@radix-ui/react-alert-dialog";import{c as t}from"../../chunks/utils.C6Qu-kwd.js";import{b as s}from"../../chunks/button.
|
|
1
|
+
import*as e from"react";import*as a from"@radix-ui/react-alert-dialog";import{c as t}from"../../chunks/utils.C6Qu-kwd.js";import{b as s}from"../../chunks/button.Cs1X8upM.js";const l=e.createContext({}),o=e.forwardRef(({onOpenChange:t,...s},o)=>{const n=e.useCallback(()=>{t?.(!1)},[t]);/* @__PURE__ */
|
|
2
2
|
return e.createElement(l.Provider,{value:{onClose:n}},/* @__PURE__ */e.createElement(a.Root,{onOpenChange:t,...s}))});o.displayName=a.Root.displayName;const n=a.Trigger,r=a.Portal,d=e.forwardRef(({className:s,zIndex:l,...o},n)=>/* @__PURE__ */e.createElement(a.Overlay,{className:t("fixed inset-0 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",l||"z-50",s),...o,ref:n}));d.displayName=a.Overlay.displayName;const c=e.forwardRef(({className:s,zIndex:l,...o},n)=>/* @__PURE__ */e.createElement(r,null,/* @__PURE__ */e.createElement(d,{zIndex:l}),/* @__PURE__ */e.createElement(a.Content,{ref:n,className:t("fixed left-[50%] top-[50%] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] border border-border bg-background p-0 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-md",l||"z-50",s),...o})));c.displayName=a.Content.displayName;const i=({className:a,...s})=>/* @__PURE__ */e.createElement("div",{className:t("flex flex-col text-center sm:text-left",a),...s});i.displayName="AlertDialogHeader";const m=({className:a,...s})=>/* @__PURE__ */e.createElement("div",{className:t("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 pb-4 px-4",a),...s});m.displayName="AlertDialogFooter";const f=e.forwardRef(({className:s,...l},o)=>/* @__PURE__ */e.createElement(a.Title,{ref:o,className:t("text-lg font-medium px-4 my-0 h-12 flex items-center",s),...l}));f.displayName=a.Title.displayName;const p=e.forwardRef(({className:s,...l},o)=>/* @__PURE__ */e.createElement(a.Description,{ref:o,className:t("text-sm px-4 py-3 my-0",s),...l}));p.displayName=a.Description.displayName;const N=e.forwardRef(({className:o,variant:n,asChild:r,onClick:d,...c},i)=>{const{onClose:m}=e.useContext(l),f=e.useCallback(async e=>{if(!d)return;const a=d(e);if(null!=(t=a)&&"object"==typeof t&&"then"in t){e.preventDefault();try{await a,m?.()}catch(s){console.error("AlertDialogAction onClick failed:",s)}}var t},[d,m]);/* @__PURE__ */
|
|
3
3
|
return e.createElement(a.Action,{ref:i,className:t(s({variant:n}),o),onClick:f,...c})});N.displayName=a.Action.displayName;const u=e.forwardRef(({className:l,variant:o,...n},r)=>/* @__PURE__ */e.createElement(a.Cancel,{ref:r,className:t(s({variant:o||"link"}),"mt-2 sm:mt-0 text-foreground",l),...n}));u.displayName=a.Cancel.displayName;export{o as AlertDialog,N as AlertDialogAction,u as AlertDialogCancel,c as AlertDialogContent,p as AlertDialogDescription,m as AlertDialogFooter,i as AlertDialogHeader,d as AlertDialogOverlay,r as AlertDialogPortal,f as AlertDialogTitle,n as AlertDialogTrigger};
|
|
4
4
|
//# sourceMappingURL=alert-dialog.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import*as e from"react";import{S as a}from"../../chunks/index.
|
|
1
|
+
import*as e from"react";import{S as a}from"../../chunks/index.Ca2JkOFO.js";import{MoreHorizontal as r,ChevronRight as s}from"lucide-react";import{c as t}from"../../chunks/utils.C6Qu-kwd.js";const l=e.forwardRef(({...a},r)=>/* @__PURE__ */e.createElement("nav",{ref:r,"aria-label":"breadcrumb",...a}));l.displayName="Breadcrumb";const m=e.forwardRef(({className:a,...r},s)=>/* @__PURE__ */e.createElement("ol",{ref:s,className:t("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5 list-none",a),...r}));m.displayName="BreadcrumbList";const c=e.forwardRef(({className:a,...r},s)=>/* @__PURE__ */e.createElement("li",{ref:s,className:t("inline-flex items-center gap-1.5",a),...r}));c.displayName="BreadcrumbItem";const n=e.forwardRef(({asChild:r,className:s,...l},m)=>{const c=r?a:"a";/* @__PURE__ */
|
|
2
2
|
return e.createElement(c,{ref:m,className:t("transition-colors hover:text-foreground",s),...l})});n.displayName="BreadcrumbLink";const o=e.forwardRef(({className:a,...r},s)=>/* @__PURE__ */e.createElement("span",{ref:s,role:"link","aria-disabled":"true","aria-current":"page",className:t("font-normal text-foreground",a),...r}));o.displayName="BreadcrumbPage";const i=({children:a,className:r,...l})=>/* @__PURE__ */e.createElement("li",{role:"presentation","aria-hidden":"true",className:t("[&>svg]:w-3.5 [&>svg]:h-3.5",r),...l},a??/* @__PURE__ */e.createElement(s,null));i.displayName="BreadcrumbSeparator";const d=({className:a,...s})=>/* @__PURE__ */e.createElement("span",{role:"presentation","aria-hidden":"true",className:t("flex h-9 w-9 items-center justify-center",a),...s},
|
|
3
3
|
/* @__PURE__ */e.createElement(r,{className:"h-4 w-4"}),
|
|
4
4
|
/* @__PURE__ */e.createElement("span",{className:"sr-only"},"More"));d.displayName="BreadcrumbElipssis";export{l as Breadcrumb,d as BreadcrumbEllipsis,c as BreadcrumbItem,n as BreadcrumbLink,m as BreadcrumbList,o as BreadcrumbPage,i as BreadcrumbSeparator};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import t from"react";import{S as e}from"../../chunks/index.
|
|
1
|
+
import t from"react";import{S as e}from"../../chunks/index.Ca2JkOFO.js";import{cva as o}from"class-variance-authority";import{c as r}from"../../chunks/utils.C6Qu-kwd.js";import{Separator as a}from"./separator.js";const n=o("flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",{variants:{orientation:{horizontal:"",vertical:"flex-col"},rounded:{true:"",false:""}},compoundVariants:[{orientation:"horizontal",rounded:!0,className:"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none"},{orientation:"vertical",rounded:!0,className:"[&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none"}],defaultVariants:{orientation:"horizontal",rounded:!0}});function i({className:e,orientation:o,rounded:a,...i}){/* @__PURE__ */
|
|
2
2
|
return t.createElement("div",{role:"group","data-slot":"button-group","data-orientation":o,className:r(n({orientation:o,rounded:a}),e),...i})}function s({className:o,asChild:a=!1,...n}){const i=a?e:"div";/* @__PURE__ */
|
|
3
3
|
return t.createElement(i,{className:r("bg-muted shadow-xs flex items-center gap-2 rounded-md border px-4 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none",o),...n})}function l({className:e,orientation:o="vertical",...n}){/* @__PURE__ */
|
|
4
4
|
return t.createElement(a,{"data-slot":"button-group-separator",orientation:o,className:r("bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto",e),...n})}export{i as ButtonGroup,l as ButtonGroupSeparator,s as ButtonGroupText,n as buttonGroupVariants};
|