@instockng/storefront-ui 1.0.107 → 1.0.108
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/components/AssistantDrawer.d.ts +1 -3
- package/dist/components/AssistantDrawer.d.ts.map +1 -1
- package/dist/contexts/AssistantContext.d.ts +19 -0
- package/dist/contexts/AssistantContext.d.ts.map +1 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +56 -56
- package/dist/index10.mjs +103 -73
- package/dist/index100.mjs +52 -7
- package/dist/index101.mjs +5 -74
- package/dist/index102.mjs +4 -3
- package/dist/index103.mjs +179 -2
- package/dist/index104.mjs +49 -79
- package/dist/index105.mjs +68 -53
- package/dist/index106.mjs +2 -6
- package/dist/index107.mjs +5 -4
- package/dist/index108.mjs +1123 -168
- package/dist/index109.mjs +20 -53
- package/dist/index11.mjs +73 -189
- package/dist/index110.mjs +55 -69
- package/dist/index111.mjs +33 -2
- package/dist/index112.mjs +2 -37
- package/dist/index113.mjs +2 -43
- package/dist/index115.mjs +1 -1
- package/dist/index116.mjs +1 -1
- package/dist/index117.mjs +8 -8
- package/dist/index118.mjs +6 -6
- package/dist/index119.mjs +3 -3
- package/dist/index12.mjs +171 -106
- package/dist/index120.mjs +1 -1
- package/dist/index121.mjs +1 -1
- package/dist/index122.mjs +1 -1
- package/dist/index123.mjs +2 -2
- package/dist/index124.mjs +2 -2
- package/dist/index125.mjs +3 -3
- package/dist/index126.mjs +1 -1
- package/dist/index127.mjs +3 -3
- package/dist/index128.mjs +2 -2
- package/dist/index129.mjs +2 -2
- package/dist/index13.mjs +127 -98
- package/dist/index130.mjs +1 -1
- package/dist/index131.mjs +3 -3
- package/dist/index132.mjs +1 -1
- package/dist/index133.mjs +1 -1
- package/dist/index134.mjs +3 -3
- package/dist/index135.mjs +2 -2
- package/dist/index136.mjs +4 -4
- package/dist/index137.mjs +1 -1
- package/dist/index138.mjs +3 -3
- package/dist/index139.mjs +4 -4
- package/dist/index14.mjs +94 -90
- package/dist/index140.mjs +1 -1
- package/dist/index141.mjs +1 -1
- package/dist/index142.mjs +1 -1
- package/dist/index143.mjs +1 -1
- package/dist/index144.mjs +1 -1
- package/dist/index145.mjs +1 -1
- package/dist/index146.mjs +1 -1
- package/dist/index147.mjs +2 -2
- package/dist/index148.mjs +3 -3
- package/dist/index15.mjs +84 -149
- package/dist/index151.mjs +1 -1
- package/dist/index153.mjs +2 -2
- package/dist/index154.mjs +1 -1
- package/dist/index155.mjs +6 -6
- package/dist/index156.mjs +2 -2
- package/dist/index157.mjs +2 -2
- package/dist/index159.mjs +2 -2
- package/dist/index16.mjs +157 -203
- package/dist/index160.mjs +2 -2
- package/dist/index161.mjs +1 -1
- package/dist/index163.mjs +8 -8
- package/dist/index164.mjs +8 -8
- package/dist/index165.mjs +2 -2
- package/dist/index167.mjs +2 -2
- package/dist/index168.mjs +2 -18
- package/dist/index169.mjs +11 -25
- package/dist/index17.mjs +197 -106
- package/dist/index170.mjs +26 -32
- package/dist/index171.mjs +32 -12
- package/dist/index172.mjs +9 -9
- package/dist/index173.mjs +18 -2
- package/dist/index174.mjs +2 -20
- package/dist/index175.mjs +13 -39
- package/dist/index176.mjs +46 -2
- package/dist/index177.mjs +2 -30
- package/dist/index178.mjs +24 -12
- package/dist/index179.mjs +18 -2
- package/dist/index18.mjs +96 -129
- package/dist/index180.mjs +2 -2
- package/dist/index181.mjs +2 -2
- package/dist/index182.mjs +2 -2
- package/dist/index183.mjs +2 -72
- package/dist/index184.mjs +72 -2
- package/dist/index185.mjs +2 -53
- package/dist/index186.mjs +53 -2
- package/dist/index187.mjs +2 -36
- package/dist/index188.mjs +30 -146
- package/dist/index189.mjs +152 -2
- package/dist/index19.mjs +140 -87
- package/dist/index190.mjs +2 -2
- package/dist/index191.mjs +2 -19
- package/dist/index192.mjs +19 -2
- package/dist/index193.mjs +2 -2
- package/dist/index194.mjs +2 -26
- package/dist/index195.mjs +26 -2
- package/dist/index196.mjs +2 -2
- package/dist/index197.mjs +2 -24
- package/dist/index198.mjs +17 -16
- package/dist/index199.mjs +23 -2
- package/dist/index2.mjs +29 -15
- package/dist/index20.mjs +82 -708
- package/dist/index201.mjs +2 -2
- package/dist/index202.mjs +2 -23
- package/dist/index203.mjs +23 -2
- package/dist/index204.mjs +2 -23
- package/dist/index205.mjs +23 -2
- package/dist/index206.mjs +2 -2
- package/dist/index208.mjs +2 -23
- package/dist/index209.mjs +23 -2
- package/dist/index21.mjs +688 -229
- package/dist/index210.mjs +2 -23
- package/dist/index211.mjs +23 -2
- package/dist/index212.mjs +2 -2
- package/dist/index213.mjs +2 -2
- package/dist/index215.mjs +2 -2
- package/dist/index216.mjs +2 -2
- package/dist/index217.mjs +2 -2
- package/dist/index218.mjs +2 -2
- package/dist/index219.mjs +2 -127
- package/dist/index22.mjs +260 -42
- package/dist/index220.mjs +127 -2
- package/dist/index221.mjs +2 -74
- package/dist/index222.mjs +59 -59
- package/dist/index223.mjs +74 -2
- package/dist/index224.mjs +30 -12
- package/dist/index225.mjs +11 -7
- package/dist/index226.mjs +3 -11
- package/dist/index227.mjs +3 -4
- package/dist/index228.mjs +13 -33
- package/dist/index229.mjs +7 -31
- package/dist/index23.mjs +42 -21
- package/dist/index230.mjs +11 -27
- package/dist/index231.mjs +5 -61
- package/dist/index232.mjs +33 -31
- package/dist/index233.mjs +31 -11
- package/dist/index234.mjs +28 -4
- package/dist/index235.mjs +61 -4
- package/dist/index236.mjs +2 -2
- package/dist/index237.mjs +108 -2
- package/dist/index238.mjs +2 -2
- package/dist/index239.mjs +2 -2
- package/dist/index240.mjs +2 -2
- package/dist/index241.mjs +2 -2
- package/dist/index242.mjs +2 -2
- package/dist/index243.mjs +2 -2
- package/dist/index244.mjs +2 -108
- package/dist/index245.mjs +2 -2
- package/dist/index247.mjs +3 -3
- package/dist/index250.mjs +1 -1
- package/dist/index252.mjs +2 -2
- package/dist/index253.mjs +1 -1
- package/dist/index254.mjs +2 -2
- package/dist/index262.mjs +2 -2
- package/dist/index263.mjs +2 -4
- package/dist/index264.mjs +4 -2
- package/dist/index265.mjs +2 -2
- package/dist/index266.mjs +2 -2
- package/dist/index267.mjs +3 -2
- package/dist/index268.mjs +2 -2
- package/dist/index269.mjs +2 -18
- package/dist/index270.mjs +16 -46
- package/dist/index271.mjs +13 -2
- package/dist/index272.mjs +6 -2
- package/dist/index273.mjs +30 -2
- package/dist/index275.mjs +2 -91
- package/dist/index276.mjs +18 -2
- package/dist/index277.mjs +47 -3
- package/dist/index278.mjs +2 -2
- package/dist/index279.mjs +2 -2
- package/dist/index280.mjs +2 -17
- package/dist/index281.mjs +2 -13
- package/dist/index282.mjs +91 -6
- package/dist/index283.mjs +2 -30
- package/dist/index3.mjs +3 -3
- package/dist/index4.mjs +34 -101
- package/dist/index43.mjs +1 -1
- package/dist/index44.mjs +1 -1
- package/dist/index45.mjs +1 -1
- package/dist/index46.mjs +1 -1
- package/dist/index47.mjs +1 -1
- package/dist/index48.mjs +2 -2
- package/dist/index5.mjs +92 -102
- package/dist/index50.mjs +2 -2
- package/dist/index54.mjs +3 -3
- package/dist/index58.mjs +1 -1
- package/dist/index6.mjs +111 -15
- package/dist/index63.mjs +17 -17
- package/dist/index64.mjs +2 -2
- package/dist/index65.mjs +1 -1
- package/dist/index66.mjs +1 -1
- package/dist/index67.mjs +1 -1
- package/dist/index68.mjs +1 -1
- package/dist/index69.mjs +1 -1
- package/dist/index7.mjs +15 -195
- package/dist/index70.mjs +1 -1
- package/dist/index71.mjs +1 -1
- package/dist/index72.mjs +1 -1
- package/dist/index73.mjs +1 -1
- package/dist/index74.mjs +1 -1
- package/dist/index75.mjs +1 -1
- package/dist/index76.mjs +1 -1
- package/dist/index77.mjs +1 -1
- package/dist/index78.mjs +1 -1
- package/dist/index79.mjs +4 -23
- package/dist/index8.mjs +135 -189
- package/dist/index80.mjs +24 -2
- package/dist/index81.mjs +2 -153
- package/dist/index82.mjs +149 -19
- package/dist/index83.mjs +21 -73
- package/dist/index84.mjs +74 -14
- package/dist/index85.mjs +14 -62
- package/dist/index86.mjs +62 -4
- package/dist/index87.mjs +37 -2
- package/dist/index88.mjs +42 -5
- package/dist/index89.mjs +230 -1129
- package/dist/index9.mjs +240 -99
- package/dist/index90.mjs +5 -19
- package/dist/index91.mjs +127 -48
- package/dist/index92.mjs +67 -32
- package/dist/index93.mjs +87 -2
- package/dist/index94.mjs +23 -229
- package/dist/index95.mjs +8 -5
- package/dist/index96.mjs +66 -125
- package/dist/index97.mjs +3 -67
- package/dist/index98.mjs +2 -87
- package/dist/index99.mjs +78 -24
- package/dist/providers/StorefrontProvider.d.ts +3 -1
- package/dist/providers/StorefrontProvider.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/src/components/AssistantDrawer.stories.tsx +0 -50
- package/src/components/AssistantDrawer.tsx +4 -8
- package/src/contexts/AssistantContext.tsx +62 -0
- package/src/index.ts +3 -2
- package/src/providers/StorefrontProvider.tsx +17 -2
- package/dist/components/SearchAssistantTrigger.d.ts +0 -12
- package/dist/components/SearchAssistantTrigger.d.ts.map +0 -1
- package/src/components/SearchAssistantTrigger.stories.tsx +0 -35
- package/src/components/SearchAssistantTrigger.tsx +0 -41
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext, useState, useCallback, type ReactNode } from 'react';
|
|
4
|
+
import { AssistantDrawer } from '../components/AssistantDrawer';
|
|
5
|
+
|
|
6
|
+
type AssistantContextType = {
|
|
7
|
+
/** Open the assistant drawer with a question. Pass productSlug if on a product page. */
|
|
8
|
+
ask: (question: string, productSlug?: string) => void;
|
|
9
|
+
/** Close the assistant drawer */
|
|
10
|
+
close: () => void;
|
|
11
|
+
/** Whether the drawer is currently open */
|
|
12
|
+
isOpen: boolean;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const AssistantContext = createContext<AssistantContextType | null>(null);
|
|
16
|
+
|
|
17
|
+
export function useAssistant() {
|
|
18
|
+
const ctx = useContext(AssistantContext);
|
|
19
|
+
if (!ctx) throw new Error('useAssistant must be used within StorefrontProvider');
|
|
20
|
+
return ctx;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface AssistantProviderProps {
|
|
24
|
+
children: ReactNode;
|
|
25
|
+
apiUrl: string;
|
|
26
|
+
brandSlug: string;
|
|
27
|
+
assistantName?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function AssistantProvider({
|
|
31
|
+
children,
|
|
32
|
+
apiUrl,
|
|
33
|
+
brandSlug,
|
|
34
|
+
assistantName,
|
|
35
|
+
}: AssistantProviderProps) {
|
|
36
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
37
|
+
const [question, setQuestion] = useState('');
|
|
38
|
+
const [productSlug, setProductSlug] = useState<string | undefined>();
|
|
39
|
+
|
|
40
|
+
const ask = useCallback((q: string, slug?: string) => {
|
|
41
|
+
setQuestion(q);
|
|
42
|
+
setProductSlug(slug);
|
|
43
|
+
setIsOpen(true);
|
|
44
|
+
}, []);
|
|
45
|
+
|
|
46
|
+
const close = useCallback(() => setIsOpen(false), []);
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<AssistantContext.Provider value={{ ask, close, isOpen }}>
|
|
50
|
+
{children}
|
|
51
|
+
<AssistantDrawer
|
|
52
|
+
isOpen={isOpen}
|
|
53
|
+
onClose={close}
|
|
54
|
+
apiUrl={apiUrl}
|
|
55
|
+
brandSlug={brandSlug}
|
|
56
|
+
productSlug={productSlug}
|
|
57
|
+
initialQuestion={question}
|
|
58
|
+
assistantName={assistantName}
|
|
59
|
+
/>
|
|
60
|
+
</AssistantContext.Provider>
|
|
61
|
+
);
|
|
62
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,9 @@ export type { StorefrontProviderProps } from './providers/StorefrontProvider';
|
|
|
11
11
|
// Export cart context (use this instead of prop drilling)
|
|
12
12
|
export { CartProvider, useCart } from './contexts/CartContext';
|
|
13
13
|
|
|
14
|
+
// Export AI assistant context
|
|
15
|
+
export { useAssistant } from './contexts/AssistantContext';
|
|
16
|
+
|
|
14
17
|
// Export Meta Pixel tracking
|
|
15
18
|
export { useMetaPixel, MetaPixelProvider } from './providers/MetaPixelProvider';
|
|
16
19
|
export type { MetaPixelProviderProps, PurchaseItem } from './providers/MetaPixelProvider';
|
|
@@ -71,8 +74,6 @@ export type { AssistantDrawerProps } from './components/AssistantDrawer';
|
|
|
71
74
|
export { ProductAssistantChips } from './components/ProductAssistantChips';
|
|
72
75
|
export type { ProductAssistantChipsProps } from './components/ProductAssistantChips';
|
|
73
76
|
|
|
74
|
-
export { SearchAssistantTrigger } from './components/SearchAssistantTrigger';
|
|
75
|
-
export type { SearchAssistantTriggerProps } from './components/SearchAssistantTrigger';
|
|
76
77
|
|
|
77
78
|
// Export UI primitives (for customization)
|
|
78
79
|
export { Button } from './components/ui/button';
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
import { ReactNode } from 'react';
|
|
29
29
|
import { ApiClientProvider, useGetBrand } from '@instockng/api-client';
|
|
30
30
|
import { CartProvider, CartProviderProps } from '../contexts/CartContext';
|
|
31
|
+
import { AssistantProvider } from '../contexts/AssistantContext';
|
|
31
32
|
import { MetaPixelProvider } from './MetaPixelProvider';
|
|
32
33
|
import { TikTokPixelProvider } from './TikTokPixelProvider';
|
|
33
34
|
|
|
@@ -41,6 +42,8 @@ export interface StorefrontProviderProps {
|
|
|
41
42
|
initialCartId?: string;
|
|
42
43
|
/** Optional: Props to pass to the ShoppingCart component */
|
|
43
44
|
shoppingCartProps?: CartProviderProps['shoppingCartProps'];
|
|
45
|
+
/** Optional: AI assistant display name */
|
|
46
|
+
assistantName?: string;
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
/**
|
|
@@ -51,7 +54,9 @@ function StorefrontProviderInner({
|
|
|
51
54
|
brandSlug,
|
|
52
55
|
initialCartId,
|
|
53
56
|
shoppingCartProps,
|
|
54
|
-
|
|
57
|
+
assistantName,
|
|
58
|
+
apiUrl,
|
|
59
|
+
}: Omit<StorefrontProviderProps, 'apiUrl'> & { apiUrl: string }) {
|
|
55
60
|
const { data: brand } = useGetBrand(brandSlug);
|
|
56
61
|
|
|
57
62
|
return (
|
|
@@ -62,7 +67,13 @@ function StorefrontProviderInner({
|
|
|
62
67
|
initialCartId={initialCartId}
|
|
63
68
|
shoppingCartProps={shoppingCartProps}
|
|
64
69
|
>
|
|
65
|
-
|
|
70
|
+
<AssistantProvider
|
|
71
|
+
apiUrl={apiUrl}
|
|
72
|
+
brandSlug={brandSlug}
|
|
73
|
+
assistantName={assistantName}
|
|
74
|
+
>
|
|
75
|
+
{children}
|
|
76
|
+
</AssistantProvider>
|
|
66
77
|
</CartProvider>
|
|
67
78
|
</TikTokPixelProvider>
|
|
68
79
|
</MetaPixelProvider>
|
|
@@ -83,9 +94,11 @@ export function StorefrontProvider({
|
|
|
83
94
|
apiUrl,
|
|
84
95
|
initialCartId,
|
|
85
96
|
shoppingCartProps,
|
|
97
|
+
assistantName,
|
|
86
98
|
}: StorefrontProviderProps) {
|
|
87
99
|
// Storefront-ui doesn't use authenticated endpoints, so provide a no-op getAuthToken
|
|
88
100
|
const getAuthToken = async () => '';
|
|
101
|
+
const resolvedApiUrl = apiUrl || 'https://oms-api.instock.ng';
|
|
89
102
|
|
|
90
103
|
return (
|
|
91
104
|
<ApiClientProvider getAuthToken={getAuthToken} {...(apiUrl && { baseURL: apiUrl })}>
|
|
@@ -93,6 +106,8 @@ export function StorefrontProvider({
|
|
|
93
106
|
brandSlug={brandSlug}
|
|
94
107
|
initialCartId={initialCartId}
|
|
95
108
|
shoppingCartProps={shoppingCartProps}
|
|
109
|
+
assistantName={assistantName}
|
|
110
|
+
apiUrl={resolvedApiUrl}
|
|
96
111
|
>
|
|
97
112
|
{children}
|
|
98
113
|
</StorefrontProviderInner>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export interface SearchAssistantTriggerProps {
|
|
2
|
-
/** The search query to pre-fill */
|
|
3
|
-
searchQuery?: string;
|
|
4
|
-
/** Callback to open the drawer with a question */
|
|
5
|
-
onAsk: (question: string) => void;
|
|
6
|
-
/** Custom class name */
|
|
7
|
-
className?: string;
|
|
8
|
-
/** Custom label */
|
|
9
|
-
label?: string;
|
|
10
|
-
}
|
|
11
|
-
export declare function SearchAssistantTrigger({ searchQuery, onAsk, className, label, }: SearchAssistantTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
-
//# sourceMappingURL=SearchAssistantTrigger.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchAssistantTrigger.d.ts","sourceRoot":"","sources":["../../src/components/SearchAssistantTrigger.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,2BAA2B;IAC1C,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAgB,EAChB,KAAK,EACL,SAAS,EACT,KAAgB,GACjB,EAAE,2BAA2B,2CAW7B"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { SearchAssistantTrigger } from './SearchAssistantTrigger';
|
|
3
|
-
|
|
4
|
-
const meta = {
|
|
5
|
-
title: 'Components/SearchAssistantTrigger',
|
|
6
|
-
component: SearchAssistantTrigger,
|
|
7
|
-
parameters: {
|
|
8
|
-
layout: 'centered',
|
|
9
|
-
},
|
|
10
|
-
tags: ['autodocs'],
|
|
11
|
-
} satisfies Meta<typeof SearchAssistantTrigger>;
|
|
12
|
-
|
|
13
|
-
export default meta;
|
|
14
|
-
type Story = StoryObj<typeof meta>;
|
|
15
|
-
|
|
16
|
-
export const Default: Story = {
|
|
17
|
-
args: {
|
|
18
|
-
searchQuery: 'toys for babies',
|
|
19
|
-
onAsk: (question) => console.log('Asked:', question),
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const CustomLabel: Story = {
|
|
24
|
-
args: {
|
|
25
|
-
searchQuery: 'maternity leggings',
|
|
26
|
-
onAsk: (question) => console.log('Asked:', question),
|
|
27
|
-
label: 'Ask AI about "maternity leggings"',
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const EmptyQuery: Story = {
|
|
32
|
-
args: {
|
|
33
|
-
onAsk: (question) => console.log('Asked:', question),
|
|
34
|
-
},
|
|
35
|
-
};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* SearchAssistantTrigger Component
|
|
5
|
-
*
|
|
6
|
-
* "Ask AI" button shown in search results (e.g., when search returns no results).
|
|
7
|
-
* Clicking opens the AssistantDrawer with the search query as the question.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { Sparkles } from 'lucide-react';
|
|
11
|
-
import { Button } from './ui/button';
|
|
12
|
-
import { cn } from '../lib/utils';
|
|
13
|
-
|
|
14
|
-
export interface SearchAssistantTriggerProps {
|
|
15
|
-
/** The search query to pre-fill */
|
|
16
|
-
searchQuery?: string;
|
|
17
|
-
/** Callback to open the drawer with a question */
|
|
18
|
-
onAsk: (question: string) => void;
|
|
19
|
-
/** Custom class name */
|
|
20
|
-
className?: string;
|
|
21
|
-
/** Custom label */
|
|
22
|
-
label?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function SearchAssistantTrigger({
|
|
26
|
-
searchQuery = '',
|
|
27
|
-
onAsk,
|
|
28
|
-
className,
|
|
29
|
-
label = 'Ask AI',
|
|
30
|
-
}: SearchAssistantTriggerProps) {
|
|
31
|
-
return (
|
|
32
|
-
<Button
|
|
33
|
-
variant="outline"
|
|
34
|
-
onClick={() => onAsk(searchQuery)}
|
|
35
|
-
className={cn('gap-2', className)}
|
|
36
|
-
>
|
|
37
|
-
<Sparkles className="h-4 w-4 text-orange-500" />
|
|
38
|
-
{label}
|
|
39
|
-
</Button>
|
|
40
|
-
);
|
|
41
|
-
}
|