@brainfish-ai/components 0.24.4 → 0.24.7
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/esm/chunks/{ChatSearch.DvpPvB5F.js → ChatSearch.s2AQdrx5.js} +7 -7
- package/dist/esm/chunks/{ChatSearch.DvpPvB5F.js.map → ChatSearch.s2AQdrx5.js.map} +1 -1
- package/dist/esm/chunks/{FormattedMessage.Br7XTLD2.js → FormattedMessage.CRbM-hF6.js} +2 -2
- package/dist/esm/chunks/{FormattedMessage.Br7XTLD2.js.map → FormattedMessage.CRbM-hF6.js.map} +1 -1
- package/dist/esm/chunks/button.DQL6gCAt.js +48 -0
- package/dist/esm/chunks/button.DQL6gCAt.js.map +1 -0
- package/dist/esm/chunks/{combobox.DNYCWyub.js → combobox.BpGnNZ6a.js} +2 -2
- package/dist/esm/chunks/{combobox.DNYCWyub.js.map → combobox.BpGnNZ6a.js.map} +1 -1
- package/dist/esm/chunks/{date-picker.sQXSlqNZ.js → date-picker._cBTpdEK.js} +2 -2
- package/dist/esm/chunks/{date-picker.sQXSlqNZ.js.map → date-picker._cBTpdEK.js.map} +1 -1
- package/dist/esm/chunks/{feedback.D139-1Wr.js → feedback.W2OzN-5r.js} +2 -2
- package/dist/esm/chunks/{feedback.D139-1Wr.js.map → feedback.W2OzN-5r.js.map} +1 -1
- package/dist/esm/chunks/{file-upload-status.Vw0Zxmir.js → file-upload-status.DP2iuttI.js} +2 -2
- package/dist/esm/chunks/{file-upload-status.Vw0Zxmir.js.map → file-upload-status.DP2iuttI.js.map} +1 -1
- package/dist/esm/chunks/{filters.Be4KPvMA.js → filters.LuyM6z8R.js} +2 -2
- package/dist/esm/chunks/{filters.Be4KPvMA.js.map → filters.LuyM6z8R.js.map} +1 -1
- package/dist/esm/chunks/{font-picker.DX1mER3H.js → font-picker.CtGg-OWt.js} +2 -2
- package/dist/esm/chunks/{font-picker.DX1mER3H.js.map → font-picker.CtGg-OWt.js.map} +1 -1
- package/dist/esm/chunks/{header-nav.BxK3FN1j.js → header-nav.D8xGU5LA.js} +10 -3
- package/dist/esm/chunks/header-nav.D8xGU5LA.js.map +1 -0
- package/dist/esm/chunks/{layout.Dx6MGe6T.js → layout.CYR502iz.js} +4 -4
- package/dist/esm/chunks/{layout.Dx6MGe6T.js.map → layout.CYR502iz.js.map} +1 -1
- package/dist/esm/chunks/{sidebar.zsMK3xuM.js → sidebar.CYhTQT2L.js} +2 -2
- package/dist/esm/chunks/{sidebar.zsMK3xuM.js.map → sidebar.CYhTQT2L.js.map} +1 -1
- package/dist/esm/chunks/{two-level-combobox.DsWPDcI6.js → two-level-combobox.BXs2z9u5.js} +2 -2
- package/dist/esm/chunks/{two-level-combobox.DsWPDcI6.js.map → two-level-combobox.BXs2z9u5.js.map} +1 -1
- package/dist/esm/components/article-suggestions-banner.js +1 -1
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/convos.js +2 -2
- 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/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/button.js +5 -45
- package/dist/esm/components/ui/button.js.map +1 -1
- package/dist/esm/components/ui/select.js +3 -17
- package/dist/esm/components/ui/select.js.map +1 -1
- package/dist/esm/components/ui/sheet.js +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +14 -14
- package/dist/esm/layouts/full-layout.js +2 -2
- package/dist/esm/layouts/header-nav.js +1 -1
- package/dist/esm/layouts/sidebar.js +1 -1
- package/dist/esm/scenes/knowledge-review.js +24 -36
- package/dist/esm/scenes/knowledge-review.js.map +1 -1
- package/dist/esm/tailwind.preset.js +9 -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 +1 -0
- package/dist/stats.html +1 -1
- package/package.json +1 -1
- package/tailwind.preset.ts +8 -0
- package/dist/esm/chunks/header-nav.BxK3FN1j.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { S as Slot } from './index.BqibIWDw.js';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
5
|
+
|
|
6
|
+
const brandShadowEffect = "shadow-brand hover:shadow-none !transition-shadow duration-300 ease-in-out active:shadow-brand-active dark:shadow-brand-dark dark:hover:shadow-none dark:active:shadow-brand-dark-active";
|
|
7
|
+
|
|
8
|
+
const buttonVariants = cva(
|
|
9
|
+
"inline-flex items-center text-dark-900 justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-5 [&_svg]:shrink-0",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
default: "bg-primary text-primary border border-primary shadow hover:bg-primary/90",
|
|
14
|
+
destructive: "bg-destructive text-destructive border border-destructive shadow-sm hover:bg-destructive/90",
|
|
15
|
+
success: "bg-success text-success border border-success shadow-sm hover:bg-success/90",
|
|
16
|
+
outline: "border border-input border-border shadow-sm hover:bg-accent hover:text-accent-foreground",
|
|
17
|
+
secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
|
|
18
|
+
suggestion: "bg-blue-600 text-white rounded-full",
|
|
19
|
+
ghost: "hover:bg-dark-200 active:bg-dark-400",
|
|
20
|
+
link: "text-foreground underline-offset-4 hover:underline",
|
|
21
|
+
shadow: `bg-primary text-primary rounded border border-border ${brandShadowEffect}`,
|
|
22
|
+
shadowSurface: `bg-surface text-dark-900 rounded border border-border ${brandShadowEffect}`,
|
|
23
|
+
dark: "bg-dark-700 text-white dark:text-primary shadow hover:bg-dark-800 dark:bg-primary dark:hover:bg-primary/80 focus-visible:bg-dark-800 dark:focus-visible:bg-primary/80"
|
|
24
|
+
},
|
|
25
|
+
size: {
|
|
26
|
+
default: "h-9 p-2",
|
|
27
|
+
xs: "h-8 rounded-md px-2 text-sm gap-1.5",
|
|
28
|
+
sm: "h-8 rounded-md px-3 text-sm",
|
|
29
|
+
lg: "h-10 rounded-md px-8",
|
|
30
|
+
icon: "h-9 w-9 [&_svg]:size-5"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
defaultVariants: {
|
|
34
|
+
variant: "default",
|
|
35
|
+
size: "default"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
const Button = React.forwardRef(
|
|
40
|
+
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
41
|
+
const Comp = asChild ? Slot : "button";
|
|
42
|
+
return /* @__PURE__ */ React.createElement(Comp, { className: cn(buttonVariants({ variant, size, className })), ref, ...props });
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
Button.displayName = "Button";
|
|
46
|
+
|
|
47
|
+
export { Button as B, brandShadowEffect as a, buttonVariants as b };
|
|
48
|
+
//# sourceMappingURL=button.DQL6gCAt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.DQL6gCAt.js","sources":["../../../src/lib/styles.ts","../../../src/components/ui/button.tsx"],"sourcesContent":["export const brandShadowEffect =\n 'shadow-brand hover:shadow-none !transition-shadow duration-300 ease-in-out active:shadow-brand-active dark:shadow-brand-dark dark:hover:shadow-none dark:active:shadow-brand-dark-active';\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\nimport { brandShadowEffect } from '@/lib/styles';\n\nconst buttonVariants = cva(\n 'inline-flex items-center text-dark-900 justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-5 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary border border-primary shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive border border-destructive shadow-sm hover:bg-destructive/90',\n success: 'bg-success text-success border border-success shadow-sm hover:bg-success/90',\n outline: 'border border-input border-border shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n suggestion: 'bg-blue-600 text-white rounded-full',\n ghost: 'hover:bg-dark-200 active:bg-dark-400',\n link: 'text-foreground underline-offset-4 hover:underline',\n shadow: `bg-primary text-primary rounded border border-border ${brandShadowEffect}`,\n shadowSurface: `bg-surface text-dark-900 rounded border border-border ${brandShadowEffect}`,\n dark: 'bg-dark-700 text-white dark:text-primary shadow hover:bg-dark-800 dark:bg-primary dark:hover:bg-primary/80 focus-visible:bg-dark-800 dark:focus-visible:bg-primary/80',\n },\n size: {\n default: 'h-9 p-2',\n xs: 'h-8 rounded-md px-2 text-sm gap-1.5',\n sm: 'h-8 rounded-md px-3 text-sm',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9 [&_svg]:size-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\n },\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n"],"names":[],"mappings":";;;;;AAAO,MAAM,iBAAA,GACX;;ACMF,MAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,qTAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,0EAAA;AAAA,QACT,WAAA,EAAa,6FAAA;AAAA,QACb,OAAA,EAAS,6EAAA;AAAA,QACT,OAAA,EAAS,0FAAA;AAAA,QACT,SAAA,EAAW,wEAAA;AAAA,QACX,UAAA,EAAY,qCAAA;AAAA,QACZ,KAAA,EAAO,sCAAA;AAAA,QACP,IAAA,EAAM,oDAAA;AAAA,QACN,MAAA,EAAQ,wDAAwD,iBAAiB,CAAA,CAAA;AAAA,QACjF,aAAA,EAAe,yDAAyD,iBAAiB,CAAA,CAAA;AAAA,QACzF,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,SAAA;AAAA,QACT,EAAA,EAAI,qCAAA;AAAA,QACJ,EAAA,EAAI,6BAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAOA,MAAM,SAAS,KAAA,CAAM,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAChE,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAE9B,IAAA,uBAAO,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,eAAe,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA,EAAG,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,EACjG;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { CaretUpDown, Check } from '@phosphor-icons/react';
|
|
3
3
|
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
4
|
-
import { Button } from '
|
|
4
|
+
import { B as Button } from './button.DQL6gCAt.js';
|
|
5
5
|
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../components/ui/command.js';
|
|
6
6
|
import { Popover, PopoverTrigger, PopoverContent } from '../components/ui/popover.js';
|
|
7
7
|
|
|
@@ -90,4 +90,4 @@ function Combobox({
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
export { Combobox as C };
|
|
93
|
-
//# sourceMappingURL=combobox.
|
|
93
|
+
//# sourceMappingURL=combobox.BpGnNZ6a.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.
|
|
1
|
+
{"version":3,"file":"combobox.BpGnNZ6a.js","sources":["../../../src/components/combobox/combobox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Check, CaretUpDown } from '@phosphor-icons/react';\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';\n\nexport interface ComboboxItem {\n value: string;\n label: string;\n icon?: React.ReactNode;\n /** Additional data that can be passed to custom renderers */\n\n data?: any;\n}\n\nexport interface ComboboxRenderItemProps<T extends ComboboxItem = ComboboxItem> {\n item: T;\n isSelected: boolean;\n onSelect: () => void;\n}\n\nexport interface ComboboxProps<T extends ComboboxItem = ComboboxItem> {\n options: T[];\n defaultValueLabel: string;\n placeholder: string;\n noResultsLabel: string;\n className?: string;\n dropdownWidth?: number;\n value?: string;\n /** Whether the combobox is disabled */\n disabled?: boolean;\n /** Callback on open state change */\n onOpenChange?: (open: boolean) => void;\n /** Callback on value change */\n onChange?: (value: string) => void;\n /** Custom render function for each item in the dropdown */\n renderItem?: (props: ComboboxRenderItemProps<T>) => React.ReactNode;\n /** Custom render function for the selected value in the trigger button */\n renderValue?: (item: T) => React.ReactNode;\n /** Custom render function for the entire trigger button content */\n renderTrigger?: (props: { selectedItem: T | undefined; isOpen: boolean }) => React.ReactNode;\n}\n\nexport function Combobox<T extends ComboboxItem = ComboboxItem>({\n options,\n defaultValueLabel,\n placeholder,\n noResultsLabel,\n className,\n onOpenChange,\n onChange,\n dropdownWidth,\n value: controlledValue,\n disabled = false,\n renderItem,\n renderValue,\n renderTrigger,\n}: ComboboxProps<T>) {\n const [open, setOpen] = React.useState(false);\n const [internalValue, setInternalValue] = React.useState('');\n\n // Use controlled value if provided, otherwise use internal state\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const [triggerWidth, setTriggerWidth] = React.useState<number | null>(null);\n\n const selectedItem = options.find((option) => option.value === value);\n\n // Update width when popover opens\n const handleOpenChange = (isOpen: boolean) => {\n if (isOpen && triggerRef.current) {\n setTriggerWidth(dropdownWidth ? dropdownWidth : triggerRef.current.offsetWidth);\n }\n setOpen(isOpen);\n onOpenChange?.(isOpen);\n };\n\n const handleSelect = (selectedValue: string) => {\n const newValue = selectedValue === value ? '' : selectedValue;\n\n // Update internal state only if not controlled\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n }\n\n setOpen(false);\n onChange?.(newValue);\n };\n\n // Default trigger content\n const defaultTriggerContent = selectedItem\n ? renderValue\n ? renderValue(selectedItem)\n : selectedItem.label\n : defaultValueLabel;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n ref={triggerRef}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn('w-full justify-between', className)}\n >\n {renderTrigger ? renderTrigger({ selectedItem, isOpen: open }) : defaultTriggerContent}\n <CaretUpDown className=\"opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"p-0\"\n style={{\n width: triggerWidth ? `${triggerWidth}px` : 'auto',\n }}\n align=\"start\"\n >\n <Command>\n <CommandInput placeholder={placeholder} />\n <CommandList>\n <CommandEmpty>{noResultsLabel}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => {\n const isSelected = value === option.value;\n\n if (renderItem) {\n return (\n <React.Fragment key={option.value}>\n {renderItem({\n item: option,\n isSelected,\n onSelect: () => handleSelect(option.value),\n })}\n </React.Fragment>\n );\n }\n\n return (\n <CommandItem\n key={option.value}\n value={option.label}\n onSelect={(currentLabel) => {\n const selectedOption = options.find((opt) => opt.label === currentLabel);\n\n handleSelect(selectedOption?.value || '');\n }}\n >\n {option.label}\n <Check className={cn('ml-auto', isSelected ? 'opacity-100' : 'opacity-0')} />\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { format } from 'date-fns';
|
|
3
3
|
import { CalendarBlank } from '@phosphor-icons/react';
|
|
4
4
|
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
5
|
-
import { Button } from '
|
|
5
|
+
import { B as Button } from './button.DQL6gCAt.js';
|
|
6
6
|
import { Calendar } from '../components/ui/calendar.js';
|
|
7
7
|
import { Popover, PopoverTrigger, PopoverContent } from '../components/ui/popover.js';
|
|
8
8
|
|
|
@@ -23,4 +23,4 @@ import '../date-picker.css';function DatePicker({ date, setDate, className, plac
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export { DatePicker as D };
|
|
26
|
-
//# sourceMappingURL=date-picker.
|
|
26
|
+
//# sourceMappingURL=date-picker._cBTpdEK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.
|
|
1
|
+
{"version":3,"file":"date-picker._cBTpdEK.js","sources":["../../../src/components/date-picker/date-picker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { format } from 'date-fns';\nimport { CalendarBlank as CalendarIcon } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport '../ui/calendar.css';\n\ninterface DatePickerProps {\n date: Date | undefined;\n setDate: (date: Date | undefined) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport function DatePicker({ date, setDate, className, placeholder = 'Select date' }: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n 'w-full justify-start text-left font-normal text-base',\n !date && 'text-muted-foreground',\n className,\n )}\n >\n <CalendarIcon className=\"mr-2 !w-5 !h-5\" />\n {date ? format(date, 'PPP') : placeholder}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0 z-[9999]\">\n <Calendar mode=\"single\" selected={date} onSelect={setDate} className=\"single-date-picker-calendar\" />\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["CalendarIcon"],"mappings":";;;;;;;;AAiBO,SAAS,WAAW,EAAE,IAAA,EAAM,SAAS,SAAA,EAAW,WAAA,GAAc,eAAc,EAAoB;AACrG,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,OAAA,EAAA,IAAA,kBACC,KAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EAAA,kBACrB,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,EAAA;AAAA,QACT,sDAAA;AAAA,QACA,CAAC,IAAA,IAAQ,uBAAA;AAAA,QACT;AAAA;AACF,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAACA,aAAA,EAAA,EAAa,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,IACxC,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,GAAI;AAAA,GAElC,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,yCACxB,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,QAAA,EAAS,UAAU,IAAA,EAAM,QAAA,EAAU,SAAS,SAAA,EAAU,6BAAA,EAA8B,CACrG,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -3,7 +3,7 @@ import { PaperPlaneRight, X, Heart, ThumbsUp, ThumbsDown } from '@phosphor-icons
|
|
|
3
3
|
import { AnimatePresence, motion } from 'framer-motion';
|
|
4
4
|
import { Card, CardContent, CardFooter } from '../components/ui/card.js';
|
|
5
5
|
import { Textarea } from '../components/ui/textarea.js';
|
|
6
|
-
import { Button } from '
|
|
6
|
+
import { B as Button } from './button.DQL6gCAt.js';
|
|
7
7
|
import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '../components/ui/tooltip.js';
|
|
8
8
|
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
9
9
|
|
|
@@ -211,4 +211,4 @@ function Feedback({
|
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
export { Feedback as F };
|
|
214
|
-
//# sourceMappingURL=feedback.
|
|
214
|
+
//# sourceMappingURL=feedback.W2OzN-5r.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.D139-1Wr.js","sources":["../../../src/components/feedback/feedback-reason.tsx","../../../src/components/love/love.tsx","../../../src/components/feedback/feedback.tsx"],"sourcesContent":["import React, { useRef, useEffect, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { PaperPlaneRight, X } from '@phosphor-icons/react';\n\nimport { Card, CardContent, CardFooter } from '@/components/ui/card';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Button } from '@/components/ui/button';\n\ninterface FeedbackReasonProps {\n open: boolean;\n onSubmit?: (reason: string) => void;\n thankYouText?: string;\n placeholder?: string;\n maxLength?: number;\n}\n\nexport function FeedbackReason({\n open,\n onSubmit,\n thankYouText = 'Thank you for your feedback!',\n placeholder = 'What could we have done better? Your feedback is valuable to us...',\n maxLength = 500,\n}: FeedbackReasonProps) {\n const [reason, setReason] = useState('');\n const [submitted, setSubmitted] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (open) {\n setReason('');\n setSubmitted(false);\n setTimeout(() => textareaRef.current?.focus(), 0);\n }\n }, [open]);\n\n const handleSubmit = () => {\n if (reason.trim()) {\n onSubmit?.(reason);\n setSubmitted(true);\n }\n };\n\n return (\n <AnimatePresence>\n {open && !submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <Textarea\n ref={textareaRef}\n placeholder={placeholder}\n className=\"w-full border-none shadow-none focus-visible:ring-0 p-0\"\n maxLength={maxLength}\n value={reason}\n rows={4}\n onChange={(e) => setReason(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n }}\n />\n <div className=\"flex justify-end mt-1\">\n <span className=\"text-xs text-muted-foreground select-none\">\n {maxLength - reason.length} characters remaining\n </span>\n </div>\n </CardContent>\n <CardFooter className=\"p-0 gap-2 flex-row-reverse\">\n <Button size=\"icon\" onClick={handleSubmit} disabled={!reason.length} aria-label=\"Submit feedback\">\n <PaperPlaneRight aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => {\n setReason('');\n textareaRef.current?.focus();\n }}\n aria-label=\"Cancel feedback\"\n >\n <X aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n </CardFooter>\n </Card>\n </motion.div>\n )}\n {open && submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <p>{thankYouText}</p>\n </CardContent>\n </Card>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { Heart } from '@phosphor-icons/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React from 'react';\n\nimport { cn } from '@/lib/utils';\n\ninterface LoveProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n doAnimation?: boolean;\n}\n\nexport function Love({ className, children, doAnimation = false, ...props }: LoveProps) {\n return (\n <div className={cn('relative', className)} {...props}>\n <AnimatePresence>\n {doAnimation && (\n <>\n {Array.from({ length: 8 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"absolute top-1/2 left-1/2 origin-center pointer-events-none\"\n initial={{ opacity: 0, scale: 0.3, x: 0, y: 0 }}\n animate={{\n opacity: [0, 1, 1, 0],\n scale: [0.3, 1, 1, 0],\n x: [0, Math.cos(i * (Math.PI / 4)) * 30],\n y: [0, Math.sin(i * (Math.PI / 4)) * 30],\n rotate: [0, i % 2 ? 45 : -45],\n }}\n transition={{\n duration: 1.2,\n ease: [0.4, 0, 0.2, 1],\n times: [0, 0.3, 0.7, 1],\n delay: i * 0.1,\n }}\n >\n <Heart\n className=\"size-4 text-rose-500\"\n style={{\n filter: 'drop-shadow(0 0 3px rgba(255, 75, 110, 0.8))',\n strokeWidth: 2.5,\n }}\n />\n </motion.div>\n ))}\n <motion.div\n className=\"absolute inset-0 rounded-full bg-primary pointer-events-none\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{\n opacity: [0, 0.15, 0.15, 0],\n scale: [0.8, 1.8, 1.8, 2],\n }}\n transition={{\n duration: 1.2,\n ease: 'easeOut',\n times: [0, 0.3, 0.7, 1],\n }}\n />\n </>\n )}\n </AnimatePresence>\n {children}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ThumbsUp, ThumbsDown } from '@phosphor-icons/react';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { FeedbackReason } from './feedback-reason';\nimport { Love } from '../love';\n\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nexport type FeedbackResponse = 'accept' | 'reject';\n\ninterface FeedbackProps {\n feedback?: FeedbackResponse;\n onFeedback?: (response: FeedbackResponse) => void;\n textConfig?: {\n positiveAnswerText?: string;\n negativeAnswerText?: string;\n };\n disabled?: boolean;\n feedbackReasonLength?: number;\n feedbackReasonPlaceholder?: string;\n onFeedbackReasonSubmit?: (reason: string) => void;\n feedbackReasonThankYouText?: string;\n}\n\nexport function Feedback({\n feedback,\n onFeedback,\n textConfig = {},\n disabled = false,\n feedbackReasonLength = 500,\n feedbackReasonPlaceholder = 'What could we have done better? Your feedback is valuable to us...',\n onFeedbackReasonSubmit,\n feedbackReasonThankYouText = 'Thank you for your feedback!',\n}: FeedbackProps) {\n const [showHearts, setShowHearts] = useState(false);\n const [showFeedbackReason, setShowFeedbackReason] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (showFeedbackReason && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [showFeedbackReason]);\n\n const handleFeedback = (response: FeedbackResponse) => {\n if (onFeedback) {\n if (response === 'accept') {\n setShowHearts(true);\n setTimeout(() => setShowHearts(false), 2000);\n }\n onFeedback(response);\n if (response === 'reject') {\n setShowFeedbackReason(true);\n }\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-end gap-2\" data-name=\"Feedback\">\n <TooltipProvider>\n <Love doAnimation={showHearts}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'accept' ? 'bg-green-100 text-green-600 hover:bg-green-200' : 'text-dark-500'\n }`}\n onClick={() => {\n handleFeedback('accept');\n setShowFeedbackReason(false);\n }}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'accept' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsUp weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.positiveAnswerText || 'Helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </Love>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'reject' ? 'bg-red-100 text-red-600 hover:bg-red-200' : 'text-dark-500'\n }`}\n onClick={() => handleFeedback('reject')}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'reject' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsDown weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.negativeAnswerText || 'Not helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <AnimatePresence>\n {showFeedbackReason && (\n <FeedbackReason\n open={showFeedbackReason}\n onSubmit={onFeedbackReasonSubmit}\n thankYouText={feedbackReasonThankYouText}\n placeholder={feedbackReasonPlaceholder}\n maxLength={feedbackReasonLength}\n />\n )}\n </AnimatePresence>\n </div>\n );\n}\n"],"names":["React"],"mappings":";;;;;;;;;AAgBO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,GAAe,8BAAA;AAAA,EACf,WAAA,GAAc,oEAAA;AAAA,EACd,SAAA,GAAY;AACd,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,OAA4B,IAAI,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,CAAW,MAAM,WAAA,CAAY,OAAA,EAAS,KAAA,IAAS,CAAC,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AACjB,MAAA,QAAA,GAAW,MAAM,CAAA;AACjB,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEA,cAAA,CAAA,aAAA,CAAC,eAAA,EAAA,IAAA,EACE,IAAA,IAAQ,CAAC,SAAA,oBACRA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC1B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAE,KAAA;AAAA,iDAEpD,IAAA,EAAA,EAAK,SAAA,EAAU,+BACdA,cAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAY,WAAU,MAAA,EAAA,kBACrBA,cAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,WAAA;AAAA,QACA,SAAA,EAAU,yDAAA;AAAA,QACV,SAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,CAAA;AAAA,QACN,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACzC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,YAAA,EAAa;AAAA,UACf;AAAA,QACF;AAAA;AAAA,uBAEFA,cAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,+CACZ,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAAA,EACb,SAAA,GAAY,OAAO,MAAA,EAAO,uBAC7B,CACF,CACF,CAAA,+CACC,UAAA,EAAA,EAAW,SAAA,EAAU,4BAAA,EAAA,kBACpBA,cAAA,CAAA,aAAA,CAAC,UAAO,IAAA,EAAK,MAAA,EAAO,SAAS,YAAA,EAAc,QAAA,EAAU,CAAC,MAAA,CAAO,MAAA,EAAQ,YAAA,EAAW,iBAAA,EAAA,+CAC7E,eAAA,EAAA,EAAgB,aAAA,EAAY,QAAO,MAAA,EAAO,MAAA,EAAO,CACpD,CAAA,kBACAA,cAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,OAAA;AAAA,QACR,SAAS,MAAM;AACb,UAAA,SAAA,CAAU,EAAE,CAAA;AACZ,UAAA,WAAA,CAAY,SAAS,KAAA,EAAM;AAAA,QAC7B,CAAA;AAAA,QACA,YAAA,EAAW;AAAA,OAAA;AAAA,sBAEXA,cAAA,CAAA,aAAA,CAAC,CAAA,EAAA,EAAE,aAAA,EAAY,MAAA,EAAO,QAAO,MAAA,EAAO;AAAA,KAExC,CACF;AAAA,GACF,EAED,QAAQ,SAAA,oBACPA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC1B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAE,KAAA;AAAA,oBAErDA,cAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAA,kBACdA,cAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,MAAA,EAAA,kBACrBA,cAAA,CAAA,aAAA,CAAC,GAAA,EAAA,IAAA,EAAG,YAAa,CACnB,CACF;AAAA,GAGN,CAAA;AAEJ;;AClGO,SAAS,IAAA,CAAK,EAAE,SAAA,EAAW,QAAA,EAAU,cAAc,KAAA,EAAO,GAAG,OAAM,EAAc;AACtF,EAAA,uBACEA,cAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,YAAY,SAAS,CAAA,EAAI,GAAG,KAAA,EAAA,kBAC7CA,cAAA,CAAA,aAAA,CAAC,eAAA,EAAA,IAAA,EACE,+BACCA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EACG,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACjCA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,GAAA,EAAK,CAAA;AAAA,MACL,SAAA,EAAU,6DAAA;AAAA,MACV,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAAA,MAC9C,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,QACpB,KAAA,EAAO,CAAC,GAAA,EAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,QACpB,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA;AAAA,QACvC,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA;AAAA,QACvC,QAAQ,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,KAAK,GAAG;AAAA,OAC9B;AAAA,MACA,UAAA,EAAY;AAAA,QACV,QAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,CAAA,EAAG,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,QACtB,OAAO,CAAA,GAAI;AAAA;AACb,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,8CAAA;AAAA,UACR,WAAA,EAAa;AAAA;AACf;AAAA;AACF,GAEH,CAAA,kBACDA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAA,EAAU,8DAAA;AAAA,MACV,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,MAClC,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,CAAC,CAAA,EAAG,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,CAAC;AAAA,OAC1B;AAAA,MACA,UAAA,EAAY;AAAA,QACV,QAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,CAAC,CAAA,EAAG,GAAA,EAAK,KAAK,CAAC;AAAA;AACxB;AAAA,GAEJ,CAEJ,CAAA,EACC,QACH,CAAA;AAEJ;;ACtCO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,QAAA,GAAW,KAAA;AAAA,EACX,oBAAA,GAAuB,GAAA;AAAA,EACvB,yBAAA,GAA4B,oEAAA;AAAA,EAC5B,sBAAA;AAAA,EACA,0BAAA,GAA6B;AAC/B,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,SAAS,KAAK,CAAA;AAClE,EAAA,MAAM,WAAA,GAAc,OAA4B,IAAI,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,kBAAA,IAAsB,YAAY,OAAA,EAAS;AAC7C,MAAA,WAAA,CAAY,QAAQ,KAAA,EAAM;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,MAAM,cAAA,GAAiB,CAAC,QAAA,KAA+B;AACrD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,UAAA,CAAW,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,MAC7C;AACA,MAAA,UAAA,CAAW,QAAQ,CAAA;AACnB,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEA,cAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAA,+CACZ,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAyB,WAAA,EAAU,UAAA,EAAA,+CAC/C,eAAA,EAAA,IAAA,kBACCA,cAAA,CAAA,aAAA,CAAC,QAAK,WAAA,EAAa,UAAA,EAAA,+CAChB,OAAA,EAAA,IAAA,kBACCA,cAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAA,kBACrBA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAW,CAAA,yHAAA,EACT,QAAA,KAAa,QAAA,GAAW,mDAAmD,eAC7E,CAAA,CAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC7B,CAAA;AAAA,MACA;AAAA,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,QACpB,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,KAAa,QAAA,GAAW,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA,GAAI,CAAA,EAAE;AAAA,QAC1D,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI,OAAA;AAAA,sBAE5BA,cAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAO,MAAA,EAAO;AAAA;AAC1B,GAEJ,mBACAA,cAAA,CAAA,aAAA,CAAC,cAAA,EAAA,IAAA,+CACE,GAAA,EAAA,IAAA,EAAG,UAAA,CAAW,sBAAsB,SAAU,CACjD,CACF,CACF,CACF,mBACAA,cAAA,CAAA,aAAA,CAAC,eAAA,EAAA,IAAA,+CACE,OAAA,EAAA,IAAA,kBACCA,cAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAA,kBACrBA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAW,CAAA,yHAAA,EACT,QAAA,KAAa,QAAA,GAAW,6CAA6C,eACvE,CAAA,CAAA;AAAA,MACA,OAAA,EAAS,MAAM,cAAA,CAAe,QAAQ,CAAA;AAAA,MACtC;AAAA,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,QACpB,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,KAAa,QAAA,GAAW,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA,GAAI,CAAA,EAAE;AAAA,QAC1D,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI,OAAA;AAAA,sBAE5BA,cAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAO,MAAA,EAAO;AAAA;AAC5B,GAEJ,CAAA,kBACAA,cAAA,CAAA,aAAA,CAAC,cAAA,EAAA,IAAA,kBACCA,cAAA,CAAA,aAAA,CAAC,WAAG,UAAA,CAAW,kBAAA,IAAsB,aAAc,CACrD,CACF,CACF,CACF,CAAA,kBACAA,cAAA,CAAA,aAAA,CAAC,uBACE,kBAAA,oBACCA,cAAA,CAAA,aAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,kBAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,YAAA,EAAc,0BAAA;AAAA,MACd,WAAA,EAAa,yBAAA;AAAA,MACb,SAAA,EAAW;AAAA;AAAA,GAGjB,CACF,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"feedback.W2OzN-5r.js","sources":["../../../src/components/feedback/feedback-reason.tsx","../../../src/components/love/love.tsx","../../../src/components/feedback/feedback.tsx"],"sourcesContent":["import React, { useRef, useEffect, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { PaperPlaneRight, X } from '@phosphor-icons/react';\n\nimport { Card, CardContent, CardFooter } from '@/components/ui/card';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Button } from '@/components/ui/button';\n\ninterface FeedbackReasonProps {\n open: boolean;\n onSubmit?: (reason: string) => void;\n thankYouText?: string;\n placeholder?: string;\n maxLength?: number;\n}\n\nexport function FeedbackReason({\n open,\n onSubmit,\n thankYouText = 'Thank you for your feedback!',\n placeholder = 'What could we have done better? Your feedback is valuable to us...',\n maxLength = 500,\n}: FeedbackReasonProps) {\n const [reason, setReason] = useState('');\n const [submitted, setSubmitted] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (open) {\n setReason('');\n setSubmitted(false);\n setTimeout(() => textareaRef.current?.focus(), 0);\n }\n }, [open]);\n\n const handleSubmit = () => {\n if (reason.trim()) {\n onSubmit?.(reason);\n setSubmitted(true);\n }\n };\n\n return (\n <AnimatePresence>\n {open && !submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <Textarea\n ref={textareaRef}\n placeholder={placeholder}\n className=\"w-full border-none shadow-none focus-visible:ring-0 p-0\"\n maxLength={maxLength}\n value={reason}\n rows={4}\n onChange={(e) => setReason(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n }}\n />\n <div className=\"flex justify-end mt-1\">\n <span className=\"text-xs text-muted-foreground select-none\">\n {maxLength - reason.length} characters remaining\n </span>\n </div>\n </CardContent>\n <CardFooter className=\"p-0 gap-2 flex-row-reverse\">\n <Button size=\"icon\" onClick={handleSubmit} disabled={!reason.length} aria-label=\"Submit feedback\">\n <PaperPlaneRight aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => {\n setReason('');\n textareaRef.current?.focus();\n }}\n aria-label=\"Cancel feedback\"\n >\n <X aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n </CardFooter>\n </Card>\n </motion.div>\n )}\n {open && submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <p>{thankYouText}</p>\n </CardContent>\n </Card>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { Heart } from '@phosphor-icons/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React from 'react';\n\nimport { cn } from '@/lib/utils';\n\ninterface LoveProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n doAnimation?: boolean;\n}\n\nexport function Love({ className, children, doAnimation = false, ...props }: LoveProps) {\n return (\n <div className={cn('relative', className)} {...props}>\n <AnimatePresence>\n {doAnimation && (\n <>\n {Array.from({ length: 8 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"absolute top-1/2 left-1/2 origin-center pointer-events-none\"\n initial={{ opacity: 0, scale: 0.3, x: 0, y: 0 }}\n animate={{\n opacity: [0, 1, 1, 0],\n scale: [0.3, 1, 1, 0],\n x: [0, Math.cos(i * (Math.PI / 4)) * 30],\n y: [0, Math.sin(i * (Math.PI / 4)) * 30],\n rotate: [0, i % 2 ? 45 : -45],\n }}\n transition={{\n duration: 1.2,\n ease: [0.4, 0, 0.2, 1],\n times: [0, 0.3, 0.7, 1],\n delay: i * 0.1,\n }}\n >\n <Heart\n className=\"size-4 text-rose-500\"\n style={{\n filter: 'drop-shadow(0 0 3px rgba(255, 75, 110, 0.8))',\n strokeWidth: 2.5,\n }}\n />\n </motion.div>\n ))}\n <motion.div\n className=\"absolute inset-0 rounded-full bg-primary pointer-events-none\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{\n opacity: [0, 0.15, 0.15, 0],\n scale: [0.8, 1.8, 1.8, 2],\n }}\n transition={{\n duration: 1.2,\n ease: 'easeOut',\n times: [0, 0.3, 0.7, 1],\n }}\n />\n </>\n )}\n </AnimatePresence>\n {children}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ThumbsUp, ThumbsDown } from '@phosphor-icons/react';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { FeedbackReason } from './feedback-reason';\nimport { Love } from '../love';\n\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nexport type FeedbackResponse = 'accept' | 'reject';\n\ninterface FeedbackProps {\n feedback?: FeedbackResponse;\n onFeedback?: (response: FeedbackResponse) => void;\n textConfig?: {\n positiveAnswerText?: string;\n negativeAnswerText?: string;\n };\n disabled?: boolean;\n feedbackReasonLength?: number;\n feedbackReasonPlaceholder?: string;\n onFeedbackReasonSubmit?: (reason: string) => void;\n feedbackReasonThankYouText?: string;\n}\n\nexport function Feedback({\n feedback,\n onFeedback,\n textConfig = {},\n disabled = false,\n feedbackReasonLength = 500,\n feedbackReasonPlaceholder = 'What could we have done better? Your feedback is valuable to us...',\n onFeedbackReasonSubmit,\n feedbackReasonThankYouText = 'Thank you for your feedback!',\n}: FeedbackProps) {\n const [showHearts, setShowHearts] = useState(false);\n const [showFeedbackReason, setShowFeedbackReason] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (showFeedbackReason && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [showFeedbackReason]);\n\n const handleFeedback = (response: FeedbackResponse) => {\n if (onFeedback) {\n if (response === 'accept') {\n setShowHearts(true);\n setTimeout(() => setShowHearts(false), 2000);\n }\n onFeedback(response);\n if (response === 'reject') {\n setShowFeedbackReason(true);\n }\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-end gap-2\" data-name=\"Feedback\">\n <TooltipProvider>\n <Love doAnimation={showHearts}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'accept' ? 'bg-green-100 text-green-600 hover:bg-green-200' : 'text-dark-500'\n }`}\n onClick={() => {\n handleFeedback('accept');\n setShowFeedbackReason(false);\n }}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'accept' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsUp weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.positiveAnswerText || 'Helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </Love>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'reject' ? 'bg-red-100 text-red-600 hover:bg-red-200' : 'text-dark-500'\n }`}\n onClick={() => handleFeedback('reject')}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'reject' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsDown weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.negativeAnswerText || 'Not helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <AnimatePresence>\n {showFeedbackReason && (\n <FeedbackReason\n open={showFeedbackReason}\n onSubmit={onFeedbackReasonSubmit}\n thankYouText={feedbackReasonThankYouText}\n placeholder={feedbackReasonPlaceholder}\n maxLength={feedbackReasonLength}\n />\n )}\n </AnimatePresence>\n </div>\n );\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { CloudArrowUp, CaretDown, CaretUp, FileVideo, Circle, CheckCircle } from
|
|
|
4
4
|
import { Card, CardContent } from '../components/ui/card.js';
|
|
5
5
|
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
6
6
|
import { createPortal } from 'react-dom';
|
|
7
|
-
import { Button } from '
|
|
7
|
+
import { B as Button } from './button.DQL6gCAt.js';
|
|
8
8
|
import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '../components/ui/collapsible.js';
|
|
9
9
|
|
|
10
10
|
const formatFileSize = (bytes) => {
|
|
@@ -138,4 +138,4 @@ const FileUploadStatus = ({
|
|
|
138
138
|
};
|
|
139
139
|
|
|
140
140
|
export { FileUpload as F, FileUploadStatus as a, formatFileSize as f };
|
|
141
|
-
//# sourceMappingURL=file-upload-status.
|
|
141
|
+
//# sourceMappingURL=file-upload-status.DP2iuttI.js.map
|
package/dist/esm/chunks/{file-upload-status.Vw0Zxmir.js.map → file-upload-status.DP2iuttI.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload-status.Vw0Zxmir.js","sources":["../../../src/components/file-upload/utils.tsx","../../../src/components/file-upload/file-upload.tsx","../../../src/components/file-upload/file-upload-status.tsx"],"sourcesContent":["export const formatFileSize = (bytes: number) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n};\n","import React from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { CloudArrowUp } from '@phosphor-icons/react';\n\nimport type { FileUploadProps } from './types';\nimport { formatFileSize } from './utils';\n\nimport { Card } from '@/components/ui/card';\nimport { cn } from '@/lib/utils';\n\nexport function FileUpload({\n onDropAccepted,\n onDropRejected,\n accept = {\n 'image/*': ['.png', '.jpg', '.jpeg', '.gif', '.mp4'],\n 'application/pdf': ['.pdf'],\n 'text/*': ['.txt', '.csv'],\n },\n maxSize = 5 * 1024 * 1024, // 5MB\n maxFiles = 5,\n multiple = true,\n className,\n disabled = false,\n title = 'Drag & drop files here, or click to select',\n description = '',\n supportsMessage = '',\n children,\n}: FileUploadProps) {\n const { getRootProps, getInputProps, isDragActive, isDragReject } = useDropzone({\n onDropAccepted,\n onDropRejected,\n accept,\n maxSize,\n multiple,\n disabled,\n maxFiles,\n });\n\n return (\n <div data-testid=\"file-upload\" className=\"w-full space-y-4\">\n <div className={cn('group', className, 'focus-visible:outline-none')} {...getRootProps()}>\n <Card\n className={cn(\n 'custom-dashed-border shadow-none p-8 text-center cursor-pointer',\n 'group-focus:custom-dashed-border-hover',\n 'group-hover:custom-dashed-border-hover',\n isDragActive && !isDragReject && 'border-primary bg-primary/5',\n isDragReject && 'border-destructive bg-destructive/5',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n <input {...getInputProps()} />\n <div className=\"flex flex-col items-center gap-4\">\n <CloudArrowUp\n className={cn(\n 'size-12',\n isDragActive && !isDragReject && 'text-primary',\n isDragReject && 'text-destructive',\n )}\n />\n <div className=\"space-y-2\">\n <p className=\"text-lg font-medium\">\n {isDragActive ? (isDragReject ? 'Some files will be rejected' : 'Drop files here') : title}\n </p>\n {description && <p className=\"text-sm\">{description}</p>}\n {supportsMessage ? (\n <p className=\"text-sm\">{supportsMessage}</p>\n ) : (\n <p className=\"text-sm\">\n {`Supports: ${Object.values(accept).flat().join(', ')} • Max size: ${formatFileSize(maxSize)}${\n maxFiles > 1 ? ` • Max files: ${maxFiles}` : ''\n }`}\n </p>\n )}\n </div>\n </div>\n </Card>\n </div>\n {children}\n </div>\n );\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CaretUp, CaretDown, FileVideo, CheckCircle, Circle } from '@phosphor-icons/react';\n\nimport type { UploadState } from './types';\nimport { formatFileSize } from './utils';\n\nimport { Card, CardContent } from '@/components/ui/card';\nimport { Button } from '@/components/ui/button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface ProcessingStep {\n id: string;\n label: string;\n status: 'completed' | 'current' | 'pending' | 'error';\n}\n\ninterface FileUploadStatusProps {\n uploads: UploadState[];\n className?: string;\n timeRemaining?: string;\n onCancelUpload?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n steps?: ProcessingStep[];\n title?: string;\n}\n\nconst CheckCircleIcon = React.memo<{ className?: string }>(({ className }) => {\n return (\n <div className={cn('relative', className)}>\n <CheckCircle className=\"absolute size-6 text-green-400\" weight=\"fill\" />\n <CheckCircle className=\"absolute size-6 text-black\" weight=\"regular\" />\n </div>\n );\n});\n\nCheckCircleIcon.displayName = 'CheckCircleIcon';\n\nexport const FileUploadStatus: React.FC<FileUploadStatusProps> = ({\n uploads,\n className,\n onCancelUpload,\n steps = [\n { id: 'upload', label: 'Uploading video', status: 'current' },\n { id: 'analyze', label: 'Analyzing content', status: 'pending' },\n { id: 'create', label: 'Creating help articles', status: 'pending' },\n ],\n timeRemaining,\n title = 'Video Processing',\n}) => {\n const [mounted, setMounted] = useState(false);\n const [isOpen, setIsOpen] = useState(true);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const cancelButtonLabel = useCallback((uploadState: UploadState) => {\n if (uploadState.status === 'success') return 'Uploaded';\n if (uploadState.status === 'error') return 'Retry upload';\n\n return 'Cancel upload';\n }, []);\n\n if (!mounted || uploads.length === 0) return null;\n\n // Ensure we're in a browser environment\n if (typeof document === 'undefined') return null;\n\n const statusCard = (\n <Collapsible\n open={isOpen}\n onOpenChange={setIsOpen}\n className={cn(\n 'fixed bottom-3 right-3 w-96 shadow-lg border z-50 transition-all duration-200 h-auto p-0 gap-4 bg-dark-100 rounded-lg overflow-hidden',\n className,\n )}\n >\n <CollapsibleTrigger asChild>\n <div className=\"flex items-center justify-between py-4 px-6 bg-foreground text-background cursor-pointer\">\n <div className=\"flex flex-col gap-0\">\n <span className=\"font-semibold\">{title}</span>\n {timeRemaining && <span className=\"text-sm text-muted-foreground\">{timeRemaining}</span>}\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"size-6 p-0\">\n {isOpen ? <CaretDown className=\"size-4\" /> : <CaretUp className=\"size-4\" />}\n </Button>\n </div>\n </CollapsibleTrigger>\n <CollapsibleContent>\n {uploads.map((upload) => (\n <Card key={upload.id} className={cn('rounded-none p-0')}>\n <CardContent className=\"p-0\">\n {/* File Info */}\n <div className=\"px-6 py-4 border-b\">\n <div className=\"flex items-center gap-4\">\n <div className=\"size-12 bg-yellow-400 border border-dark rounded-lg flex items-center justify-center text-dark shrink-0\">\n <FileVideo className=\"size-6\" />\n </div>\n <div className=\"flex-1 flex flex-col gap-0\">\n <h3 className=\"text-base font-medium flex items-center gap-1 whitespace-nowrap\">\n <span className=\"truncate max-w-56\">{upload.file.name}</span>\n <span className=\"shrink-0\"> • {formatFileSize(upload.file.size)}</span>\n </h3>\n <Button\n variant=\"dark\"\n size=\"sm\"\n className=\"self-start h-6 text-xs bg-foreground text-background\"\n onClick={onCancelUpload}\n data-id={upload.id}\n disabled={upload.status === 'success' || upload.progress === 100}\n data-status={upload.status}\n >\n {cancelButtonLabel(upload)}\n </Button>\n </div>\n </div>\n </div>\n\n {/* Steps */}\n <ol className=\"py-2\">\n {steps.map((step) => (\n <li\n key={step.id}\n className={cn(\n 'flex items-center gap-4 px-6 py-3 relative',\n 'after:absolute after:w-[1px] after:bg-foreground after:top-[38px] after:-bottom-[10px] after:left-[35px]',\n 'last-of-type:after:hidden',\n )}\n >\n {step.status === 'completed' ? (\n <CheckCircleIcon className=\"size-6\" />\n ) : (\n <Circle className=\"size-6\" />\n )}\n <span className=\"flex items-center gap-1\">\n {`${step.label} ${step.id === 'upload' ? `— ${Math.round(upload.progress)}%` : ''}`}\n </span>\n </li>\n ))}\n </ol>\n </CardContent>\n </Card>\n ))}\n </CollapsibleContent>\n </Collapsible>\n );\n\n return createPortal(statusCard, document.body);\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-upload-status.DP2iuttI.js","sources":["../../../src/components/file-upload/utils.tsx","../../../src/components/file-upload/file-upload.tsx","../../../src/components/file-upload/file-upload-status.tsx"],"sourcesContent":["export const formatFileSize = (bytes: number) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n};\n","import React from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { CloudArrowUp } from '@phosphor-icons/react';\n\nimport type { FileUploadProps } from './types';\nimport { formatFileSize } from './utils';\n\nimport { Card } from '@/components/ui/card';\nimport { cn } from '@/lib/utils';\n\nexport function FileUpload({\n onDropAccepted,\n onDropRejected,\n accept = {\n 'image/*': ['.png', '.jpg', '.jpeg', '.gif', '.mp4'],\n 'application/pdf': ['.pdf'],\n 'text/*': ['.txt', '.csv'],\n },\n maxSize = 5 * 1024 * 1024, // 5MB\n maxFiles = 5,\n multiple = true,\n className,\n disabled = false,\n title = 'Drag & drop files here, or click to select',\n description = '',\n supportsMessage = '',\n children,\n}: FileUploadProps) {\n const { getRootProps, getInputProps, isDragActive, isDragReject } = useDropzone({\n onDropAccepted,\n onDropRejected,\n accept,\n maxSize,\n multiple,\n disabled,\n maxFiles,\n });\n\n return (\n <div data-testid=\"file-upload\" className=\"w-full space-y-4\">\n <div className={cn('group', className, 'focus-visible:outline-none')} {...getRootProps()}>\n <Card\n className={cn(\n 'custom-dashed-border shadow-none p-8 text-center cursor-pointer',\n 'group-focus:custom-dashed-border-hover',\n 'group-hover:custom-dashed-border-hover',\n isDragActive && !isDragReject && 'border-primary bg-primary/5',\n isDragReject && 'border-destructive bg-destructive/5',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n <input {...getInputProps()} />\n <div className=\"flex flex-col items-center gap-4\">\n <CloudArrowUp\n className={cn(\n 'size-12',\n isDragActive && !isDragReject && 'text-primary',\n isDragReject && 'text-destructive',\n )}\n />\n <div className=\"space-y-2\">\n <p className=\"text-lg font-medium\">\n {isDragActive ? (isDragReject ? 'Some files will be rejected' : 'Drop files here') : title}\n </p>\n {description && <p className=\"text-sm\">{description}</p>}\n {supportsMessage ? (\n <p className=\"text-sm\">{supportsMessage}</p>\n ) : (\n <p className=\"text-sm\">\n {`Supports: ${Object.values(accept).flat().join(', ')} • Max size: ${formatFileSize(maxSize)}${\n maxFiles > 1 ? ` • Max files: ${maxFiles}` : ''\n }`}\n </p>\n )}\n </div>\n </div>\n </Card>\n </div>\n {children}\n </div>\n );\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CaretUp, CaretDown, FileVideo, CheckCircle, Circle } from '@phosphor-icons/react';\n\nimport type { UploadState } from './types';\nimport { formatFileSize } from './utils';\n\nimport { Card, CardContent } from '@/components/ui/card';\nimport { Button } from '@/components/ui/button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface ProcessingStep {\n id: string;\n label: string;\n status: 'completed' | 'current' | 'pending' | 'error';\n}\n\ninterface FileUploadStatusProps {\n uploads: UploadState[];\n className?: string;\n timeRemaining?: string;\n onCancelUpload?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n steps?: ProcessingStep[];\n title?: string;\n}\n\nconst CheckCircleIcon = React.memo<{ className?: string }>(({ className }) => {\n return (\n <div className={cn('relative', className)}>\n <CheckCircle className=\"absolute size-6 text-green-400\" weight=\"fill\" />\n <CheckCircle className=\"absolute size-6 text-black\" weight=\"regular\" />\n </div>\n );\n});\n\nCheckCircleIcon.displayName = 'CheckCircleIcon';\n\nexport const FileUploadStatus: React.FC<FileUploadStatusProps> = ({\n uploads,\n className,\n onCancelUpload,\n steps = [\n { id: 'upload', label: 'Uploading video', status: 'current' },\n { id: 'analyze', label: 'Analyzing content', status: 'pending' },\n { id: 'create', label: 'Creating help articles', status: 'pending' },\n ],\n timeRemaining,\n title = 'Video Processing',\n}) => {\n const [mounted, setMounted] = useState(false);\n const [isOpen, setIsOpen] = useState(true);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const cancelButtonLabel = useCallback((uploadState: UploadState) => {\n if (uploadState.status === 'success') return 'Uploaded';\n if (uploadState.status === 'error') return 'Retry upload';\n\n return 'Cancel upload';\n }, []);\n\n if (!mounted || uploads.length === 0) return null;\n\n // Ensure we're in a browser environment\n if (typeof document === 'undefined') return null;\n\n const statusCard = (\n <Collapsible\n open={isOpen}\n onOpenChange={setIsOpen}\n className={cn(\n 'fixed bottom-3 right-3 w-96 shadow-lg border z-50 transition-all duration-200 h-auto p-0 gap-4 bg-dark-100 rounded-lg overflow-hidden',\n className,\n )}\n >\n <CollapsibleTrigger asChild>\n <div className=\"flex items-center justify-between py-4 px-6 bg-foreground text-background cursor-pointer\">\n <div className=\"flex flex-col gap-0\">\n <span className=\"font-semibold\">{title}</span>\n {timeRemaining && <span className=\"text-sm text-muted-foreground\">{timeRemaining}</span>}\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"size-6 p-0\">\n {isOpen ? <CaretDown className=\"size-4\" /> : <CaretUp className=\"size-4\" />}\n </Button>\n </div>\n </CollapsibleTrigger>\n <CollapsibleContent>\n {uploads.map((upload) => (\n <Card key={upload.id} className={cn('rounded-none p-0')}>\n <CardContent className=\"p-0\">\n {/* File Info */}\n <div className=\"px-6 py-4 border-b\">\n <div className=\"flex items-center gap-4\">\n <div className=\"size-12 bg-yellow-400 border border-dark rounded-lg flex items-center justify-center text-dark shrink-0\">\n <FileVideo className=\"size-6\" />\n </div>\n <div className=\"flex-1 flex flex-col gap-0\">\n <h3 className=\"text-base font-medium flex items-center gap-1 whitespace-nowrap\">\n <span className=\"truncate max-w-56\">{upload.file.name}</span>\n <span className=\"shrink-0\"> • {formatFileSize(upload.file.size)}</span>\n </h3>\n <Button\n variant=\"dark\"\n size=\"sm\"\n className=\"self-start h-6 text-xs bg-foreground text-background\"\n onClick={onCancelUpload}\n data-id={upload.id}\n disabled={upload.status === 'success' || upload.progress === 100}\n data-status={upload.status}\n >\n {cancelButtonLabel(upload)}\n </Button>\n </div>\n </div>\n </div>\n\n {/* Steps */}\n <ol className=\"py-2\">\n {steps.map((step) => (\n <li\n key={step.id}\n className={cn(\n 'flex items-center gap-4 px-6 py-3 relative',\n 'after:absolute after:w-[1px] after:bg-foreground after:top-[38px] after:-bottom-[10px] after:left-[35px]',\n 'last-of-type:after:hidden',\n )}\n >\n {step.status === 'completed' ? (\n <CheckCircleIcon className=\"size-6\" />\n ) : (\n <Circle className=\"size-6\" />\n )}\n <span className=\"flex items-center gap-1\">\n {`${step.label} ${step.id === 'upload' ? `— ${Math.round(upload.progress)}%` : ''}`}\n </span>\n </li>\n ))}\n </ol>\n </CardContent>\n </Card>\n ))}\n </CollapsibleContent>\n </Collapsible>\n );\n\n return createPortal(statusCard, document.body);\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React__default, { useRef, useState, forwardRef, useImperativeHandle, useEffect } from 'react';
|
|
2
2
|
import { Check, XCircle, Plus } from '@phosphor-icons/react';
|
|
3
3
|
import { createId } from '@paralleldrive/cuid2';
|
|
4
|
-
import { Button } from '
|
|
4
|
+
import { B as Button } from './button.DQL6gCAt.js';
|
|
5
5
|
import { Input } from '../components/ui/input.js';
|
|
6
6
|
import { ButtonGroup } from '../components/ui/button-group.js';
|
|
7
7
|
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '../components/ui/dropdown-menu.js';
|
|
@@ -562,4 +562,4 @@ const Filters = ({
|
|
|
562
562
|
};
|
|
563
563
|
|
|
564
564
|
export { Filter as F, Operator as O, Filters as a };
|
|
565
|
-
//# sourceMappingURL=filters.
|
|
565
|
+
//# sourceMappingURL=filters.LuyM6z8R.js.map
|