@aifeatures/admin-react 0.1.0 → 0.1.2
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/index.cjs +38 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +38 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -870,7 +870,7 @@ function getPreviewText(data) {
|
|
|
870
870
|
const text = String(value);
|
|
871
871
|
return text.length > 50 ? text.slice(0, 50) + "..." : text;
|
|
872
872
|
}
|
|
873
|
-
function FormSubmissions({ formId, className }) {
|
|
873
|
+
function FormSubmissions({ formId, className, defaultSubmissionId }) {
|
|
874
874
|
const {
|
|
875
875
|
submissions,
|
|
876
876
|
total,
|
|
@@ -885,6 +885,15 @@ function FormSubmissions({ formId, className }) {
|
|
|
885
885
|
} = useSubmissions({ formId });
|
|
886
886
|
const [view, setView] = React9.useState("list");
|
|
887
887
|
const [selectedSubmission, setSelectedSubmission] = React9.useState(null);
|
|
888
|
+
React9.useEffect(() => {
|
|
889
|
+
if (defaultSubmissionId && submissions.length > 0) {
|
|
890
|
+
const submission = submissions.find((s) => s.id === defaultSubmissionId);
|
|
891
|
+
if (submission) {
|
|
892
|
+
setSelectedSubmission(submission);
|
|
893
|
+
setView("detail");
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
}, [defaultSubmissionId, submissions]);
|
|
888
897
|
const handleViewSubmission = (submission) => {
|
|
889
898
|
setSelectedSubmission(submission);
|
|
890
899
|
setView("detail");
|
|
@@ -1259,24 +1268,50 @@ function FormSettings({ form, onSaved, className }) {
|
|
|
1259
1268
|
|
|
1260
1269
|
// src/components/FormsDashboard.tsx
|
|
1261
1270
|
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
1262
|
-
function FormsDashboard({ className }) {
|
|
1271
|
+
function FormsDashboard({ className, submissionId }) {
|
|
1272
|
+
const { api } = useAifeaturesContext();
|
|
1263
1273
|
const [view, setView] = React13.useState("list");
|
|
1264
1274
|
const [selectedForm, setSelectedForm] = React13.useState(null);
|
|
1265
1275
|
const [activeTab, setActiveTab] = React13.useState(
|
|
1266
1276
|
"submissions"
|
|
1267
1277
|
);
|
|
1278
|
+
const [deepLinkSubmissionId, setDeepLinkSubmissionId] = React13.useState(submissionId);
|
|
1279
|
+
const [isLoadingDeepLink, setIsLoadingDeepLink] = React13.useState(!!submissionId);
|
|
1280
|
+
React13.useEffect(() => {
|
|
1281
|
+
if (!submissionId) return;
|
|
1282
|
+
async function loadSubmission() {
|
|
1283
|
+
try {
|
|
1284
|
+
const submission = await api.getSubmission(submissionId);
|
|
1285
|
+
const form = await api.getForm(submission.form_id);
|
|
1286
|
+
setSelectedForm(form);
|
|
1287
|
+
setView("detail");
|
|
1288
|
+
setActiveTab("submissions");
|
|
1289
|
+
setDeepLinkSubmissionId(submissionId);
|
|
1290
|
+
} catch (error) {
|
|
1291
|
+
console.error("Failed to load submission for deep link:", error);
|
|
1292
|
+
} finally {
|
|
1293
|
+
setIsLoadingDeepLink(false);
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
loadSubmission();
|
|
1297
|
+
}, [submissionId, api]);
|
|
1268
1298
|
const handleSelectForm = (form, tab) => {
|
|
1269
1299
|
setSelectedForm(form);
|
|
1270
1300
|
setView("detail");
|
|
1271
1301
|
setActiveTab(tab);
|
|
1302
|
+
setDeepLinkSubmissionId(void 0);
|
|
1272
1303
|
};
|
|
1273
1304
|
const handleBack = () => {
|
|
1274
1305
|
setView("list");
|
|
1275
1306
|
setSelectedForm(null);
|
|
1307
|
+
setDeepLinkSubmissionId(void 0);
|
|
1276
1308
|
};
|
|
1277
1309
|
const handleFormSaved = (updatedForm) => {
|
|
1278
1310
|
setSelectedForm(updatedForm);
|
|
1279
1311
|
};
|
|
1312
|
+
if (isLoadingDeepLink) {
|
|
1313
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: `af-flex af-items-center af-justify-center af-py-8 ${className || ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "af-text-muted-foreground", children: "Loading..." }) });
|
|
1314
|
+
}
|
|
1280
1315
|
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className, children: [
|
|
1281
1316
|
view === "list" && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { children: [
|
|
1282
1317
|
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "af-mb-6", children: [
|
|
@@ -1319,7 +1354,7 @@ function FormsDashboard({ className }) {
|
|
|
1319
1354
|
"Settings"
|
|
1320
1355
|
] })
|
|
1321
1356
|
] }),
|
|
1322
|
-
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsContent, { value: "submissions", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(FormSubmissions, { formId: selectedForm.id }) }),
|
|
1357
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsContent, { value: "submissions", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(FormSubmissions, { formId: selectedForm.id, defaultSubmissionId: deepLinkSubmissionId }) }),
|
|
1323
1358
|
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsContent, { value: "settings", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(FormSettings, { form: selectedForm, onSaved: handleFormSaved }) })
|
|
1324
1359
|
]
|
|
1325
1360
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider/AifeaturesProvider.tsx","../src/lib/api.ts","../src/components/FormsDashboard.tsx","../src/ui/tabs.tsx","../src/lib/cn.ts","../src/ui/button.tsx","../src/components/FormsList.tsx","../src/ui/table.tsx","../src/hooks/useForms.ts","../src/components/FormSubmissions.tsx","../src/ui/select.tsx","../src/hooks/useSubmissions.ts","../src/components/SubmissionDetail.tsx","../src/components/FormSettings.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/badge.tsx"],"sourcesContent":["// Provider\nexport {\n AifeaturesProvider,\n useAifeaturesContext,\n type AifeaturesProviderProps,\n type AifeaturesContextValue,\n} from './provider/AifeaturesProvider'\n\n// Components\nexport {\n FormsDashboard,\n FormsList,\n FormSubmissions,\n FormSettings,\n SubmissionDetail,\n type FormsDashboardProps,\n type FormsListProps,\n type FormSubmissionsProps,\n type FormSettingsProps,\n type SubmissionDetailProps,\n} from './components'\n\n// Hooks\nexport {\n useAifeatures,\n useForms,\n useSubmissions,\n type UseFormsReturn,\n type UseSubmissionsReturn,\n type UseSubmissionsOptions,\n} from './hooks'\n\n// Types\nexport type {\n Form,\n Submission,\n Attachment,\n SubmissionMetadata,\n PaginatedSubmissions,\n FormsListResponse,\n CreateFormInput,\n UpdateFormInput,\n GetSubmissionsOptions,\n ApiError,\n} from './types'\n\n// API Client (for advanced use cases)\nexport {\n createApiClient,\n AifeaturesApiError,\n type AifeaturesApiClient,\n} from './lib/api'\n","import * as React from 'react'\nimport { createApiClient, type AifeaturesApiClient } from '../lib/api'\n\nexport interface AifeaturesContextValue {\n siteToken: string\n apiUrl: string\n api: AifeaturesApiClient\n}\n\nconst AifeaturesContext = React.createContext<AifeaturesContextValue | null>(\n null\n)\n\nexport interface AifeaturesProviderProps {\n /** Site-scoped API token from aifeatures */\n siteToken: string\n /** API URL (defaults to https://aifeatures.dev) */\n apiUrl?: string\n /** Optional dark mode */\n dark?: boolean\n /** Optional className for the wrapper */\n className?: string\n children: React.ReactNode\n}\n\n/**\n * Validates the token and returns an error message if invalid\n */\nfunction validateToken(token: string): string | null {\n if (!token) {\n return 'No siteToken provided to AifeaturesProvider'\n }\n\n if (token.startsWith('sk_')) {\n return 'Invalid token type: You passed an organization API key (sk_xxx) but AifeaturesProvider requires a site token (st_xxx). Site tokens are returned when you create a site via the API.'\n }\n\n if (!token.startsWith('st_')) {\n return `Invalid token format: Expected a site token starting with \"st_\" but got \"${token.slice(0, 10)}...\". Site tokens are returned when you create a site via the API.`\n }\n\n return null\n}\n\nexport function AifeaturesProvider({\n siteToken,\n apiUrl = 'https://aifeatures.dev',\n dark = false,\n className,\n children,\n}: AifeaturesProviderProps) {\n // Validate token on mount and when it changes\n const tokenError = React.useMemo(() => validateToken(siteToken), [siteToken])\n\n const api = React.useMemo(\n () => createApiClient(siteToken, apiUrl),\n [siteToken, apiUrl]\n )\n\n const value = React.useMemo(\n () => ({\n siteToken,\n apiUrl,\n api,\n }),\n [siteToken, apiUrl, api]\n )\n\n // Show error UI if token is invalid\n if (tokenError) {\n return (\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n <div className=\"af-rounded-md af-border af-border-destructive af-bg-destructive/10 af-p-4\">\n <h3 className=\"af-text-sm af-font-semibold af-text-destructive af-mb-2\">\n AifeaturesProvider Configuration Error\n </h3>\n <p className=\"af-text-sm af-text-destructive\">\n {tokenError}\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <AifeaturesContext.Provider value={value}>\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n {children}\n </div>\n </AifeaturesContext.Provider>\n )\n}\n\nexport function useAifeaturesContext(): AifeaturesContextValue {\n const context = React.useContext(AifeaturesContext)\n if (!context) {\n throw new Error(\n 'useAifeaturesContext must be used within an AifeaturesProvider'\n )\n }\n return context\n}\n\nexport { AifeaturesContext }\n","import type {\n Form,\n Submission,\n FormsListResponse,\n PaginatedSubmissions,\n CreateFormInput,\n UpdateFormInput,\n GetSubmissionsOptions,\n ApiError,\n} from '../types'\n\nexport class AifeaturesApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public details?: ApiError\n ) {\n super(message)\n this.name = 'AifeaturesApiError'\n }\n}\n\nexport interface AifeaturesApiClient {\n // Forms\n getForms(): Promise<Form[]>\n getForm(formId: string): Promise<Form>\n createForm(input: CreateFormInput): Promise<Form>\n updateForm(formId: string, input: UpdateFormInput): Promise<Form>\n deleteForm(formId: string): Promise<void>\n\n // Submissions\n getSubmissions(\n formId: string,\n options?: GetSubmissionsOptions\n ): Promise<PaginatedSubmissions>\n getSubmission(submissionId: string): Promise<Submission>\n deleteSubmission(submissionId: string): Promise<void>\n\n // Attachments\n downloadAttachment(submissionId: string, filename: string): Promise<void>\n}\n\nexport function createApiClient(\n siteToken: string,\n apiUrl: string = 'https://aifeatures.dev'\n): AifeaturesApiClient {\n async function request<T>(\n path: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${apiUrl}${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Request failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T\n }\n\n return response.json()\n }\n\n return {\n // Forms\n async getForms(): Promise<Form[]> {\n const data = await request<FormsListResponse>('/api/v1/forms')\n return data.forms\n },\n\n async getForm(formId: string): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`)\n },\n\n async createForm(input: CreateFormInput): Promise<Form> {\n return request<Form>('/api/v1/forms', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n },\n\n async updateForm(formId: string, input: UpdateFormInput): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n })\n },\n\n async deleteForm(formId: string): Promise<void> {\n await request<void>(`/api/v1/forms/${formId}`, {\n method: 'DELETE',\n })\n },\n\n // Submissions\n async getSubmissions(\n formId: string,\n options: GetSubmissionsOptions = {}\n ): Promise<PaginatedSubmissions> {\n const params = new URLSearchParams()\n if (options.limit !== undefined) {\n params.set('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.set('offset', String(options.offset))\n }\n const query = params.toString()\n const path = `/api/v1/forms/${formId}/submissions${query ? `?${query}` : ''}`\n return request<PaginatedSubmissions>(path)\n },\n\n async getSubmission(submissionId: string): Promise<Submission> {\n return request<Submission>(`/api/v1/submissions/${submissionId}`)\n },\n\n async deleteSubmission(submissionId: string): Promise<void> {\n await request<void>(`/api/v1/submissions/${submissionId}`, {\n method: 'DELETE',\n })\n },\n\n // Attachments\n async downloadAttachment(submissionId: string, filename: string): Promise<void> {\n const url = `${apiUrl}/api/v1/submissions/${submissionId}/attachments/${encodeURIComponent(filename)}`\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Download failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Create blob and trigger download\n const blob = await response.blob()\n const blobUrl = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(blobUrl)\n },\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Settings, Inbox } from 'lucide-react'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'\nimport { Button } from '../ui/button'\nimport { FormsList } from './FormsList'\nimport { FormSubmissions } from './FormSubmissions'\nimport { FormSettings } from './FormSettings'\nimport type { Form } from '../types'\n\nexport interface FormsDashboardProps {\n /** Optional className */\n className?: string\n}\n\ntype View = 'list' | 'detail'\n\nexport function FormsDashboard({ className }: FormsDashboardProps) {\n const [view, setView] = React.useState<View>('list')\n const [selectedForm, setSelectedForm] = React.useState<Form | null>(null)\n const [activeTab, setActiveTab] = React.useState<'submissions' | 'settings'>(\n 'submissions'\n )\n\n const handleSelectForm = (form: Form, tab: 'submissions' | 'settings') => {\n setSelectedForm(form)\n setView('detail')\n setActiveTab(tab)\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedForm(null)\n }\n\n const handleFormSaved = (updatedForm: Form) => {\n setSelectedForm(updatedForm)\n }\n\n return (\n <div className={className}>\n {view === 'list' && (\n <div>\n <div className=\"af-mb-6\">\n <h2 className=\"af-text-lg af-font-semibold\">Forms</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Manage your contact forms and view submissions.\n </p>\n </div>\n <FormsList onSelectForm={handleSelectForm} />\n </div>\n )}\n\n {view === 'detail' && selectedForm && (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Forms\n </Button>\n <h2 className=\"af-text-lg af-font-semibold\">{selectedForm.name}</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {selectedForm.endpoint_url}\n </code>\n </p>\n </div>\n\n {/* Tabs for submissions and settings */}\n <Tabs\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as 'submissions' | 'settings')}\n >\n <TabsList className=\"af-mb-4\">\n <TabsTrigger value=\"submissions\" className=\"af-gap-2\">\n <Inbox className=\"af-h-4 af-w-4\" />\n Submissions\n </TabsTrigger>\n <TabsTrigger value=\"settings\" className=\"af-gap-2\">\n <Settings className=\"af-h-4 af-w-4\" />\n Settings\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"submissions\">\n <FormSubmissions formId={selectedForm.id} />\n </TabsContent>\n\n <TabsContent value=\"settings\">\n <FormSettings form={selectedForm} onSaved={handleFormSaved} />\n </TabsContent>\n </Tabs>\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/cn'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'af-inline-flex af-h-9 af-items-center af-justify-center af-rounded-lg af-bg-muted af-p-1 af-text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-inline-flex af-items-center af-justify-center af-whitespace-nowrap af-rounded-md af-px-3 af-py-1 af-text-sm af-font-medium af-ring-offset-background af-transition-all focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2 disabled:af-pointer-events-none disabled:af-opacity-50 data-[state=active]:af-bg-background data-[state=active]:af-text-foreground data-[state=active]:af-shadow',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'af-mt-2 af-ring-offset-background focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst buttonVariants = cva(\n 'af-inline-flex af-items-center af-justify-center af-gap-2 af-whitespace-nowrap af-rounded-md af-text-sm af-font-medium af-transition-colors focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-pointer-events-none disabled:af-opacity-50 [&_svg]:af-pointer-events-none [&_svg]:af-size-4 [&_svg]:af-shrink-0',\n {\n variants: {\n variant: {\n default:\n 'af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/90',\n destructive:\n 'af-bg-destructive af-text-destructive-foreground af-shadow-sm hover:af-bg-destructive/90',\n outline:\n 'af-border af-border-input af-bg-background af-shadow-sm hover:af-bg-accent hover:af-text-accent-foreground',\n secondary:\n 'af-bg-secondary af-text-secondary-foreground af-shadow-sm hover:af-bg-secondary/80',\n ghost: 'hover:af-bg-accent hover:af-text-accent-foreground',\n link: 'af-text-primary af-underline-offset-4 hover:af-underline',\n },\n size: {\n default: 'af-h-9 af-px-4 af-py-2',\n sm: 'af-h-8 af-rounded-md af-px-3 af-text-xs',\n lg: 'af-h-10 af-rounded-md af-px-8',\n icon: 'af-h-9 af-w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n 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 return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\nimport { Inbox, Settings } from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport { useForms } from '../hooks/useForms'\nimport type { Form } from '../types'\n\nexport interface FormsListProps {\n /** Called when a form is selected */\n onSelectForm?: (form: Form, tab: 'submissions' | 'settings') => void\n /** Optional className */\n className?: string\n}\n\nexport function FormsList({ onSelectForm, className }: FormsListProps) {\n const { forms, isLoading, error } = useForms()\n\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading forms...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (forms.length === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No forms yet.\n <br />\n Forms will appear here when the AI creates contact forms on your website.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Endpoint</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {forms.map((form) => (\n <TableRow key={form.id}>\n <TableCell className=\"af-font-medium\">{form.name}</TableCell>\n <TableCell>\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {form.endpoint_url.replace('https://aifeatures.dev', '')}\n </code>\n </TableCell>\n <TableCell className=\"af-text-right\">\n <div className=\"af-flex af-items-center af-justify-end af-gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'submissions')}\n >\n <Inbox className=\"af-h-4 af-w-4 af-mr-1\" />\n Submissions\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'settings')}\n >\n <Settings className=\"af-h-4 af-w-4 af-mr-1\" />\n Settings\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"af-relative af-w-full af-overflow-auto\">\n <table\n ref={ref}\n className={cn('af-w-full af-caption-bottom af-text-sm', className)}\n {...props}\n />\n </div>\n))\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:af-border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn('[&_tr:last-child]:af-border-0', className)}\n {...props}\n />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'af-border-t af-bg-muted/50 af-font-medium [&>tr]:last:af-border-b-0',\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'af-border-b af-transition-colors hover:af-bg-muted/50 data-[state=selected]:af-bg-muted',\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'af-h-10 af-px-2 af-text-left af-align-middle af-font-medium af-text-muted-foreground [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'af-p-2 af-align-middle [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn('af-mt-4 af-text-sm af-text-muted-foreground', className)}\n {...props}\n />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Form, CreateFormInput, UpdateFormInput } from '../types'\n\nexport interface UseFormsReturn {\n forms: Form[]\n isLoading: boolean\n error: Error | null\n refetch: () => Promise<void>\n createForm: (input: CreateFormInput) => Promise<Form>\n updateForm: (formId: string, input: UpdateFormInput) => Promise<Form>\n deleteForm: (formId: string) => Promise<void>\n}\n\nexport function useForms(): UseFormsReturn {\n const { api } = useAifeaturesContext()\n const [forms, setForms] = React.useState<Form[]>([])\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n\n const fetchForms = React.useCallback(async () => {\n try {\n setIsLoading(true)\n setError(null)\n const data = await api.getForms()\n setForms(data)\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch forms'))\n } finally {\n setIsLoading(false)\n }\n }, [api])\n\n React.useEffect(() => {\n fetchForms()\n }, [fetchForms])\n\n const createForm = React.useCallback(\n async (input: CreateFormInput): Promise<Form> => {\n const form = await api.createForm(input)\n setForms((prev) => [...prev, form])\n return form\n },\n [api]\n )\n\n const updateForm = React.useCallback(\n async (formId: string, input: UpdateFormInput): Promise<Form> => {\n const form = await api.updateForm(formId, input)\n setForms((prev) => prev.map((f) => (f.id === formId ? form : f)))\n return form\n },\n [api]\n )\n\n const deleteForm = React.useCallback(\n async (formId: string): Promise<void> => {\n await api.deleteForm(formId)\n setForms((prev) => prev.filter((f) => f.id !== formId))\n },\n [api]\n )\n\n return {\n forms,\n isLoading,\n error,\n refetch: fetchForms,\n createForm,\n updateForm,\n deleteForm,\n }\n}\n","import * as React from 'react'\nimport {\n ChevronLeft,\n ChevronRight,\n Eye,\n Inbox,\n Paperclip,\n} from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { useSubmissions } from '../hooks/useSubmissions'\nimport { SubmissionDetail } from './SubmissionDetail'\nimport type { Submission } from '../types'\n\nexport interface FormSubmissionsProps {\n /** The form ID to show submissions for */\n formId: string\n /** Optional className */\n className?: string\n}\n\ntype View = 'list' | 'detail'\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction getEmailFromData(data: Record<string, unknown>): string | null {\n // Try common email field names\n const emailFields = ['email', 'Email', 'EMAIL', 'e-mail', 'mail']\n for (const field of emailFields) {\n if (typeof data[field] === 'string') {\n return data[field] as string\n }\n }\n return null\n}\n\nfunction getPreviewText(data: Record<string, unknown>): string {\n // Get first non-email, non-internal field as preview\n const entries = Object.entries(data).filter(\n ([key]) => !key.startsWith('_') && !key.toLowerCase().includes('email')\n )\n if (entries.length === 0) return ''\n\n const [, value] = entries[0]\n const text = String(value)\n return text.length > 50 ? text.slice(0, 50) + '...' : text\n}\n\nexport function FormSubmissions({ formId, className }: FormSubmissionsProps) {\n const {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage,\n hasPreviousPage,\n setPage,\n setPageSize,\n } = useSubmissions({ formId })\n\n const [view, setView] = React.useState<View>('list')\n const [selectedSubmission, setSelectedSubmission] =\n React.useState<Submission | null>(null)\n\n const handleViewSubmission = (submission: Submission) => {\n setSelectedSubmission(submission)\n setView('detail')\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedSubmission(null)\n }\n\n // Show detail view\n if (view === 'detail' && selectedSubmission) {\n return (\n <div className={className}>\n <SubmissionDetail\n submission={selectedSubmission}\n onBack={handleBack}\n />\n </div>\n )\n }\n\n // Show list view\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading submissions...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (submissions.length === 0 && page === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No submissions yet.\n <br />\n Submissions will appear here when visitors use your form.\n </p>\n </div>\n )\n }\n\n const startIndex = page * pageSize + 1\n const endIndex = Math.min((page + 1) * pageSize, total)\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Email</TableHead>\n <TableHead>Preview</TableHead>\n <TableHead>Date</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {submissions.map((submission) => {\n const email = getEmailFromData(submission.data)\n const preview = getPreviewText(submission.data)\n\n return (\n <TableRow key={submission.id}>\n <TableCell className=\"af-font-medium\">\n <div className=\"af-flex af-items-center af-gap-2\">\n {email || (\n <span className=\"af-text-muted-foreground af-italic\">No email</span>\n )}\n {submission.attachments.length > 0 && (\n <span className=\"af-flex af-items-center af-gap-1 af-text-muted-foreground\" title={`${submission.attachments.length} attachment(s)`}>\n <Paperclip className=\"af-h-3 af-w-3\" />\n <span className=\"af-text-xs\">{submission.attachments.length}</span>\n </span>\n )}\n </div>\n </TableCell>\n <TableCell className=\"af-text-muted-foreground af-max-w-[200px] af-truncate\">\n {preview || (\n <span className=\"af-italic\">No preview available</span>\n )}\n </TableCell>\n <TableCell className=\"af-text-muted-foreground\">\n {formatDate(submission.metadata.submitted_at)}\n </TableCell>\n <TableCell className=\"af-text-right\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleViewSubmission(submission)}\n title=\"View details\"\n >\n <Eye className=\"af-h-4 af-w-4\" />\n </Button>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n\n {/* Pagination */}\n <div className=\"af-flex af-items-center af-justify-between af-px-2 af-py-4\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-sm af-text-muted-foreground\">\n <span>\n Showing {startIndex}-{endIndex} of {total}\n </span>\n <Select\n value={String(pageSize)}\n onValueChange={(value) => setPageSize(Number(value))}\n >\n <SelectTrigger className=\"af-w-[70px] af-h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"10\">10</SelectItem>\n <SelectItem value=\"25\">25</SelectItem>\n <SelectItem value=\"50\">50</SelectItem>\n <SelectItem value=\"100\">100</SelectItem>\n </SelectContent>\n </Select>\n <span>per page</span>\n </div>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page - 1)}\n disabled={!hasPreviousPage}\n >\n <ChevronLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page + 1)}\n disabled={!hasNextPage}\n >\n Next\n <ChevronRight className=\"af-h-4 af-w-4 af-ml-1\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-flex af-h-9 af-w-full af-items-center af-justify-between af-whitespace-nowrap af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-2 af-text-sm af-shadow-sm af-ring-offset-background placeholder:af-text-muted-foreground focus:af-outline-none focus:af-ring-1 focus:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50 [&>span]:af-line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"af-h-4 af-w-4 af-opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronUp className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronDown className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'af-relative af-z-50 af-max-h-96 af-min-w-[8rem] af-overflow-hidden af-rounded-md af-border af-bg-popover af-text-popover-foreground af-shadow-md data-[state=open]:af-animate-in data-[state=closed]:af-animate-out data-[state=closed]:af-fade-out-0 data-[state=open]:af-fade-in-0 data-[state=closed]:af-zoom-out-95 data-[state=open]:af-zoom-in-95 data-[side=bottom]:af-slide-in-from-top-2 data-[side=left]:af-slide-in-from-right-2 data-[side=right]:af-slide-in-from-left-2 data-[side=top]:af-slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:af-translate-y-1 data-[side=left]:af--translate-x-1 data-[side=right]:af-translate-x-1 data-[side=top]:af--translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'af-p-1',\n position === 'popper' &&\n 'af-h-[var(--radix-select-trigger-height)] af-w-full af-min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('af-px-2 af-py-1.5 af-text-sm af-font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'af-relative af-flex af-w-full af-cursor-default af-select-none af-items-center af-rounded-sm af-py-1.5 af-pl-2 af-pr-8 af-text-sm af-outline-none focus:af-bg-accent focus:af-text-accent-foreground data-[disabled]:af-pointer-events-none data-[disabled]:af-opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"af-absolute af-right-2 af-flex af-h-3.5 af-w-3.5 af-items-center af-justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('af--mx-1 af-my-1 af-h-px af-bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type {\n Submission,\n PaginatedSubmissions,\n GetSubmissionsOptions,\n} from '../types'\n\nexport interface UseSubmissionsReturn {\n submissions: Submission[]\n total: number\n isLoading: boolean\n error: Error | null\n page: number\n pageSize: number\n hasNextPage: boolean\n hasPreviousPage: boolean\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n refetch: () => Promise<void>\n deleteSubmission: (submissionId: string) => Promise<void>\n}\n\nexport interface UseSubmissionsOptions {\n formId: string\n initialPageSize?: number\n}\n\nexport function useSubmissions({\n formId,\n initialPageSize = 25,\n}: UseSubmissionsOptions): UseSubmissionsReturn {\n const { api } = useAifeaturesContext()\n const [submissions, setSubmissions] = React.useState<Submission[]>([])\n const [total, setTotal] = React.useState(0)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n const [page, setPage] = React.useState(0)\n const [pageSize, setPageSize] = React.useState(initialPageSize)\n\n const fetchSubmissions = React.useCallback(async () => {\n if (!formId) return\n\n try {\n setIsLoading(true)\n setError(null)\n const options: GetSubmissionsOptions = {\n limit: pageSize,\n offset: page * pageSize,\n }\n const data: PaginatedSubmissions = await api.getSubmissions(\n formId,\n options\n )\n setSubmissions(data.submissions)\n setTotal(data.total)\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error('Failed to fetch submissions')\n )\n } finally {\n setIsLoading(false)\n }\n }, [api, formId, page, pageSize])\n\n React.useEffect(() => {\n fetchSubmissions()\n }, [fetchSubmissions])\n\n const deleteSubmission = React.useCallback(\n async (submissionId: string): Promise<void> => {\n await api.deleteSubmission(submissionId)\n setSubmissions((prev) => prev.filter((s) => s.id !== submissionId))\n setTotal((prev) => prev - 1)\n },\n [api]\n )\n\n const totalPages = Math.ceil(total / pageSize)\n\n return {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage: page < totalPages - 1,\n hasPreviousPage: page > 0,\n setPage,\n setPageSize: (size: number) => {\n setPageSize(size)\n setPage(0) // Reset to first page when page size changes\n },\n refetch: fetchSubmissions,\n deleteSubmission,\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Download, Globe, Clock, FileText, Loader2, Monitor, Mail } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Submission } from '../types'\n\nexport interface SubmissionDetailProps {\n submission: Submission\n onBack: () => void\n}\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`\n}\n\nexport function SubmissionDetail({\n submission,\n onBack,\n}: SubmissionDetailProps) {\n const { api } = useAifeaturesContext()\n const [downloadingFile, setDownloadingFile] = React.useState<string | null>(null)\n\n const handleDownload = async (filename: string) => {\n setDownloadingFile(filename)\n try {\n await api.downloadAttachment(submission.id, filename)\n } catch (error) {\n console.error('Download failed:', error)\n } finally {\n setDownloadingFile(null)\n }\n }\n\n const dataEntries = Object.entries(submission.data).filter(\n ([key]) => !key.startsWith('_')\n )\n\n return (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Submissions\n </Button>\n <h3 className=\"af-text-lg af-font-semibold\">Submission Details</h3>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Submitted {formatDate(submission.metadata.submitted_at)}\n </p>\n </div>\n\n <div className=\"af-space-y-6\">\n {/* Form Data */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Form Data</h4>\n <div className=\"af-space-y-3\">\n {dataEntries.map(([key, value]) => (\n <div key={key} className=\"af-grid af-grid-cols-3 af-gap-2\">\n <div className=\"af-text-sm af-text-muted-foreground af-capitalize\">\n {key.replace(/_/g, ' ')}\n </div>\n <div className=\"af-col-span-2 af-text-sm af-break-words\">\n {typeof value === 'string' && value.includes('\\n') ? (\n <pre className=\"af-whitespace-pre-wrap af-font-sans af-bg-muted af-p-2 af-rounded af-text-xs\">\n {value}\n </pre>\n ) : (\n String(value)\n )}\n </div>\n </div>\n ))}\n {dataEntries.length === 0 && (\n <p className=\"af-text-sm af-text-muted-foreground\">No data submitted</p>\n )}\n </div>\n </div>\n\n {/* Attachments */}\n {submission.attachments.length > 0 && (\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Attachments</h4>\n <div className=\"af-space-y-2\">\n {submission.attachments.map((attachment, index) => (\n <div\n key={index}\n className=\"af-flex af-items-center af-justify-between af-p-2 af-bg-muted af-rounded\"\n >\n <div className=\"af-flex af-items-center af-gap-2\">\n <FileText className=\"af-h-4 af-w-4 af-text-muted-foreground\" />\n <span className=\"af-text-sm\">{attachment.name}</span>\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({formatBytes(attachment.size)})\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleDownload(attachment.name)}\n disabled={downloadingFile === attachment.name}\n >\n {downloadingFile === attachment.name ? (\n <Loader2 className=\"af-h-4 af-w-4 af-mr-1 af-animate-spin\" />\n ) : (\n <Download className=\"af-h-4 af-w-4 af-mr-1\" />\n )}\n {downloadingFile === attachment.name ? 'Downloading...' : 'Download'}\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Metadata */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Metadata</h4>\n <div className=\"af-space-y-2 af-text-sm\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Clock className=\"af-h-4 af-w-4\" />\n <span>{formatDate(submission.metadata.submitted_at)}</span>\n </div>\n {submission.metadata.ip_address && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Globe className=\"af-h-4 af-w-4\" />\n <span>IP: {submission.metadata.ip_address}</span>\n </div>\n )}\n {submission.metadata.user_agent && (\n <div className=\"af-flex af-items-start af-gap-2 af-text-muted-foreground\">\n <Monitor className=\"af-h-4 af-w-4 af-mt-0.5\" />\n <span className=\"af-text-xs af-break-all\">\n {submission.metadata.user_agent}\n </span>\n </div>\n )}\n {submission.resend_id && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Mail className=\"af-h-4 af-w-4\" />\n <span>Email ID: {submission.resend_id}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Plus, X, Loader2, Check } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport { Badge } from '../ui/badge'\nimport { useForms } from '../hooks/useForms'\nimport type { Form, UpdateFormInput } from '../types'\n\nexport interface FormSettingsProps {\n /** The form to edit */\n form: Form\n /** Called when settings are saved */\n onSaved?: (form: Form) => void\n /** Optional className */\n className?: string\n}\n\nexport function FormSettings({ form, onSaved, className }: FormSettingsProps) {\n const { updateForm } = useForms()\n const [isSaving, setIsSaving] = React.useState(false)\n const [lastSaved, setLastSaved] = React.useState<Date | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n\n // Local form state\n const [name, setName] = React.useState(form.name)\n const [redirectUrl, setRedirectUrl] = React.useState(form.redirect_url || '')\n const [emailRecipients, setEmailRecipients] = React.useState<string[]>(\n form.email_recipients\n )\n const [newEmail, setNewEmail] = React.useState('')\n\n // Reset state when form changes\n React.useEffect(() => {\n setName(form.name)\n setRedirectUrl(form.redirect_url || '')\n setEmailRecipients(form.email_recipients)\n setError(null)\n }, [form])\n\n // Auto-save function\n const save = React.useCallback(\n async (updates: UpdateFormInput) => {\n try {\n setIsSaving(true)\n setError(null)\n const updatedForm = await updateForm(form.id, updates)\n setLastSaved(new Date())\n onSaved?.(updatedForm)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save')\n } finally {\n setIsSaving(false)\n }\n },\n [form.id, updateForm, onSaved]\n )\n\n // Clear \"saved\" indicator after 2 seconds\n React.useEffect(() => {\n if (lastSaved) {\n const timer = setTimeout(() => setLastSaved(null), 2000)\n return () => clearTimeout(timer)\n }\n }, [lastSaved])\n\n const handleAddEmail = async () => {\n const email = newEmail.trim().toLowerCase()\n if (!email) return\n if (!email.includes('@')) {\n setError('Please enter a valid email address')\n return\n }\n if (emailRecipients.includes(email)) {\n setError('This email is already added')\n return\n }\n const newRecipients = [...emailRecipients, email]\n setEmailRecipients(newRecipients)\n setNewEmail('')\n setError(null)\n await save({ email_recipients: newRecipients })\n }\n\n const handleRemoveEmail = async (email: string) => {\n const newRecipients = emailRecipients.filter((e) => e !== email)\n setEmailRecipients(newRecipients)\n await save({ email_recipients: newRecipients })\n }\n\n // Save text fields on blur\n const handleNameBlur = async () => {\n if (name !== form.name) {\n await save({ name })\n }\n }\n\n const handleRedirectBlur = async () => {\n const newValue = redirectUrl || null\n if (newValue !== form.redirect_url) {\n await save({ redirect_url: newValue })\n }\n }\n\n return (\n <div className={`af-space-y-6 af-relative ${className || ''}`}>\n {/* Toast notification */}\n {(isSaving || lastSaved) && (\n <div className=\"aifeatures-admin af-fixed af-bottom-4 af-right-4 af-z-50\">\n {isSaving ? (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-background af-border af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Loader2 className=\"af-h-4 af-w-4 af-animate-spin af-text-muted-foreground\" />\n <span className=\"af-text-sm\">Saving...</span>\n </div>\n ) : (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-green-50 af-border af-border-green-200 af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Check className=\"af-h-4 af-w-4 af-text-green-600\" />\n <span className=\"af-text-sm af-text-green-800\">Changes saved</span>\n </div>\n )}\n </div>\n )}\n\n {/* Form Name */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"form-name\">Form Name</Label>\n <Input\n id=\"form-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={handleNameBlur}\n placeholder=\"Contact Form\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n A name to identify this form in your dashboard.\n </p>\n </div>\n\n {/* Email Recipients */}\n <div className=\"af-space-y-2\">\n <Label>Email Recipients</Label>\n <p className=\"af-text-xs af-text-muted-foreground af-mb-2\">\n Form submissions will be sent to these email addresses.\n </p>\n <div className=\"af-flex af-flex-wrap af-gap-2 af-mb-2\">\n {emailRecipients.map((email) => (\n <Badge key={email} variant=\"secondary\" className=\"af-gap-1\">\n {email}\n <button\n type=\"button\"\n onClick={() => handleRemoveEmail(email)}\n className=\"af-ml-1 hover:af-text-destructive\"\n disabled={isSaving}\n >\n <X className=\"af-h-3 af-w-3\" />\n </button>\n </Badge>\n ))}\n {emailRecipients.length === 0 && (\n <span className=\"af-text-sm af-text-muted-foreground af-italic\">\n No recipients configured\n </span>\n )}\n </div>\n <div className=\"af-flex af-gap-2\">\n <Input\n type=\"email\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder=\"Add email address\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleAddEmail()\n }\n }}\n disabled={isSaving}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddEmail}\n disabled={!newEmail.trim() || isSaving}\n >\n <Plus className=\"af-h-4 af-w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Redirect URL */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"redirect-url\">Redirect URL</Label>\n <Input\n id=\"redirect-url\"\n value={redirectUrl}\n onChange={(e) => setRedirectUrl(e.target.value)}\n onBlur={handleRedirectBlur}\n placeholder=\"/thank-you\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n URL to redirect visitors to after successful submission. Leave empty\n for a default success page.\n </p>\n </div>\n\n {/* Form Endpoint (read-only) */}\n <div className=\"af-space-y-2\">\n <Label>Form Endpoint</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <code className=\"af-flex-1 af-text-xs af-bg-muted af-px-3 af-py-2 af-rounded af-border\">\n {form.endpoint_url}\n </code>\n </div>\n <p className=\"af-text-xs af-text-muted-foreground\">\n Use this URL as the form action attribute.\n </p>\n </div>\n\n {/* Captcha Status (read-only for now) */}\n <div className=\"af-space-y-2\">\n <Label>Captcha Protection</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Badge variant={form.captcha.enabled ? 'success' : 'secondary'}>\n {form.captcha.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n {form.captcha.enabled && form.captcha.provider && (\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({form.captcha.provider})\n </span>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"af-text-sm af-text-destructive af-bg-destructive/10 af-px-3 af-py-2 af-rounded\">\n {error}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'af-flex af-h-9 af-w-full af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-1 af-text-sm af-shadow-sm af-transition-colors file:af-border-0 file:af-bg-transparent file:af-text-sm file:af-font-medium file:af-text-foreground placeholder:af-text-muted-foreground focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst labelVariants = cva(\n 'af-text-sm af-font-medium af-leading-none peer-disabled:af-cursor-not-allowed peer-disabled:af-opacity-70'\n)\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label ref={ref} className={cn(labelVariants(), className)} {...props} />\n )\n)\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst badgeVariants = cva(\n 'af-inline-flex af-items-center af-rounded-md af-border af-px-2.5 af-py-0.5 af-text-xs af-font-semibold af-transition-colors focus:af-outline-none focus:af-ring-2 focus:af-ring-ring focus:af-ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'af-border-transparent af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/80',\n secondary:\n 'af-border-transparent af-bg-secondary af-text-secondary-foreground hover:af-bg-secondary/80',\n destructive:\n 'af-border-transparent af-bg-destructive af-text-destructive-foreground af-shadow hover:af-bg-destructive/80',\n outline: 'af-text-foreground',\n success:\n 'af-border-transparent af-bg-green-100 af-text-green-800',\n warning:\n 'af-border-transparent af-bg-yellow-100 af-text-yellow-800',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,YAAuB;;;ACWhB,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YACE,SACO,QACA,SACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAsBO,SAAS,gBACd,WACA,SAAiB,0BACI;AACrB,iBAAe,QACb,MACA,UAAuB,CAAC,GACZ;AACZ,UAAM,MAAM,GAAG,MAAM,GAAG,IAAI;AAC5B,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,GAAG;AAAA,MACH,SAAS;AAAA,QACP,iBAAiB,UAAU,SAAS;AAAA,QACpC,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI;AACJ,UAAI;AACF,kBAAU,MAAM,SAAS,KAAK;AAAA,MAChC,QAAQ;AAAA,MAER;AACA,YAAM,IAAI;AAAA,QACR,SAAS,SAAS,8BAA8B,SAAS,MAAM;AAAA,QAC/D,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAEA,SAAO;AAAA;AAAA,IAEL,MAAM,WAA4B;AAChC,YAAM,OAAO,MAAM,QAA2B,eAAe;AAC7D,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,MAAM,QAAQ,QAA+B;AAC3C,aAAO,QAAc,iBAAiB,MAAM,EAAE;AAAA,IAChD;AAAA,IAEA,MAAM,WAAW,OAAuC;AACtD,aAAO,QAAc,iBAAiB;AAAA,QACpC,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,WAAW,QAAgB,OAAuC;AACtE,aAAO,QAAc,iBAAiB,MAAM,IAAI;AAAA,QAC9C,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,WAAW,QAA+B;AAC9C,YAAM,QAAc,iBAAiB,MAAM,IAAI;AAAA,QAC7C,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,eACJ,QACA,UAAiC,CAAC,GACH;AAC/B,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,QAAQ,UAAU,QAAW;AAC/B,eAAO,IAAI,SAAS,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC3C;AACA,UAAI,QAAQ,WAAW,QAAW;AAChC,eAAO,IAAI,UAAU,OAAO,QAAQ,MAAM,CAAC;AAAA,MAC7C;AACA,YAAM,QAAQ,OAAO,SAAS;AAC9B,YAAM,OAAO,iBAAiB,MAAM,eAAe,QAAQ,IAAI,KAAK,KAAK,EAAE;AAC3E,aAAO,QAA8B,IAAI;AAAA,IAC3C;AAAA,IAEA,MAAM,cAAc,cAA2C;AAC7D,aAAO,QAAoB,uBAAuB,YAAY,EAAE;AAAA,IAClE;AAAA,IAEA,MAAM,iBAAiB,cAAqC;AAC1D,YAAM,QAAc,uBAAuB,YAAY,IAAI;AAAA,QACzD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,mBAAmB,cAAsB,UAAiC;AAC9E,YAAM,MAAM,GAAG,MAAM,uBAAuB,YAAY,gBAAgB,mBAAmB,QAAQ,CAAC;AACpG,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,SAAS;AAAA,UACP,iBAAiB,UAAU,SAAS;AAAA,QACtC;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,SAAS,KAAK;AAAA,QAChC,QAAQ;AAAA,QAER;AACA,cAAM,IAAI;AAAA,UACR,SAAS,SAAS,+BAA+B,SAAS,MAAM;AAAA,UAChE,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAGA,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,UAAU,IAAI,gBAAgB,IAAI;AACxC,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,OAAO;AACZ,WAAK,WAAW;AAChB,eAAS,KAAK,YAAY,IAAI;AAC9B,WAAK,MAAM;AACX,eAAS,KAAK,YAAY,IAAI;AAC9B,UAAI,gBAAgB,OAAO;AAAA,IAC7B;AAAA,EACF;AACF;;;ADvGQ;AA/DR,IAAM,oBAA0B;AAAA,EAC9B;AACF;AAiBA,SAAS,cAAc,OAA8B;AACnD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,WAAW,KAAK,GAAG;AAC5B,WAAO,4EAA4E,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA,EACvG;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,SAAS;AAAA,EACT,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAA4B;AAE1B,QAAM,aAAmB,cAAQ,MAAM,cAAc,SAAS,GAAG,CAAC,SAAS,CAAC;AAE5E,QAAM,MAAY;AAAA,IAChB,MAAM,gBAAgB,WAAW,MAAM;AAAA,IACvC,CAAC,WAAW,MAAM;AAAA,EACpB;AAEA,QAAM,QAAc;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,WAAW,QAAQ,GAAG;AAAA,EACzB;AAGA,MAAI,YAAY;AACd,WACE,4CAAC,SAAI,WAAW,oBAAoB,OAAO,SAAS,EAAE,IAAI,aAAa,EAAE,IACvE,uDAAC,SAAI,WAAU,6EACb;AAAA,kDAAC,QAAG,WAAU,2DAA0D,oDAExE;AAAA,MACA,4CAAC,OAAE,WAAU,kCACV,sBACH;AAAA,OACF,GACF;AAAA,EAEJ;AAEA,SACE,4CAAC,kBAAkB,UAAlB,EAA2B,OAC1B,sDAAC,SAAI,WAAW,oBAAoB,OAAO,SAAS,EAAE,IAAI,aAAa,EAAE,IACtE,UACH,GACF;AAEJ;AAEO,SAAS,uBAA+C;AAC7D,QAAM,UAAgB,iBAAW,iBAAiB;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AErGA,IAAAA,UAAuB;AACvB,IAAAC,uBAA2C;;;ACD3C,IAAAC,SAAuB;AACvB,oBAA+B;;;ACD/B,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADKE,IAAAC,sBAAA;AANF,IAAM,OAAqB;AAE3B,IAAM,WAAiB,kBAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAe;AAAA,EAAd;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,SAAS,cAA4B,mBAAK;AAE1C,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAe;AAAA,EAAd;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA4B,sBAAQ;AAEhD,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAe;AAAA,EAAd;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA4B,sBAAQ;;;AEjDhD,IAAAC,SAAuB;AACvB,wBAAqB;AACrB,sCAAuC;AA2CjC,IAAAC,sBAAA;AAxCN,IAAM,qBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AAChE,UAAM,OAAO,UAAU,yBAAO;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;ACpDrB,0BAAgC;;;ACDhC,IAAAC,SAAuB;AAQnB,IAAAC,sBAAA;AALJ,IAAM,QAAc,kBAGlB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,6CAAC,SAAI,WAAU,0CACb;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,IAChE,GAAG;AAAA;AACN,GACF,CACD;AACD,MAAM,cAAc;AAEpB,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,6CAAC,WAAM,KAAU,WAAW,GAAG,sBAAsB,SAAS,GAAI,GAAG,OAAO,CAC7E;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,kBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,WAAiB,kBAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,SAAS,cAAc;AAEvB,IAAM,YAAkB,kBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,YAAkB,kBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,eAAqB,kBAGzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,+CAA+C,SAAS;AAAA,IACrE,GAAG;AAAA;AACN,CACD;AACD,aAAa,cAAc;;;AC3G3B,IAAAC,SAAuB;AAchB,SAAS,WAA2B;AACzC,QAAM,EAAE,IAAI,IAAI,qBAAqB;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAiB,CAAC,CAAC;AACnD,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAuB,IAAI;AAE3D,QAAM,aAAmB,mBAAY,YAAY;AAC/C,QAAI;AACF,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,YAAM,OAAO,MAAM,IAAI,SAAS;AAChC,eAAS,IAAI;AAAA,IACf,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,uBAAuB,CAAC;AAAA,IAC1E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,EAAM,iBAAU,MAAM;AACpB,eAAW;AAAA,EACb,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,aAAmB;AAAA,IACvB,OAAO,UAA0C;AAC/C,YAAM,OAAO,MAAM,IAAI,WAAW,KAAK;AACvC,eAAS,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAClC,aAAO;AAAA,IACT;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,aAAmB;AAAA,IACvB,OAAO,QAAgB,UAA0C;AAC/D,YAAM,OAAO,MAAM,IAAI,WAAW,QAAQ,KAAK;AAC/C,eAAS,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,SAAS,OAAO,CAAE,CAAC;AAChE,aAAO;AAAA,IACT;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,aAAmB;AAAA,IACvB,OAAO,WAAkC;AACvC,YAAM,IAAI,WAAW,MAAM;AAC3B,eAAS,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,IACxD;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AF7CQ,IAAAC,sBAAA;AAND,SAAS,UAAU,EAAE,cAAc,UAAU,GAAmB;AACrE,QAAM,EAAE,OAAO,WAAW,MAAM,IAAI,SAAS;AAE7C,MAAI,WAAW;AACb,WACE,6CAAC,SAAI,WAAW,qDAAqD,aAAa,EAAE,IAClF,uDAAC,SAAI,WAAU,4BAA2B,8BAAgB,GAC5D;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,6CAAC,SAAI,WAAW,qDAAqD,aAAa,EAAE,IAClF,wDAAC,SAAI,WAAU,uBAAsB;AAAA;AAAA,MAAQ,MAAM;AAAA,OAAQ,GAC7D;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,8CAAC,SAAI,WAAW,kEAAkE,aAAa,EAAE,IAC/F;AAAA,mDAAC,6BAAM,WAAU,oDAAmD;AAAA,MACpE,8CAAC,OAAE,WAAU,2CAA0C;AAAA;AAAA,QAErD,6CAAC,QAAG;AAAA,QAAE;AAAA,SAER;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,6CAAC,SAAI,WACH,wDAAC,SACC;AAAA,iDAAC,eACC,wDAAC,YACC;AAAA,mDAAC,aAAU,kBAAI;AAAA,MACf,6CAAC,aAAU,sBAAQ;AAAA,MACnB,6CAAC,aAAU,WAAU,iBAAgB,qBAAO;AAAA,OAC9C,GACF;AAAA,IACA,6CAAC,aACE,gBAAM,IAAI,CAAC,SACV,8CAAC,YACC;AAAA,mDAAC,aAAU,WAAU,kBAAkB,eAAK,MAAK;AAAA,MACjD,6CAAC,aACC,uDAAC,UAAK,WAAU,yDACb,eAAK,aAAa,QAAQ,0BAA0B,EAAE,GACzD,GACF;AAAA,MACA,6CAAC,aAAU,WAAU,iBACnB,wDAAC,SAAI,WAAU,mDACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,eAAe,MAAM,aAAa;AAAA,YAEjD;AAAA,2DAAC,6BAAM,WAAU,yBAAwB;AAAA,cAAE;AAAA;AAAA;AAAA,QAE7C;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,eAAe,MAAM,UAAU;AAAA,YAE9C;AAAA,2DAAC,gCAAS,WAAU,yBAAwB;AAAA,cAAE;AAAA;AAAA;AAAA,QAEhD;AAAA,SACF,GACF;AAAA,SA1Ba,KAAK,EA2BpB,CACD,GACH;AAAA,KACF,GACF;AAEJ;;;AGlGA,IAAAC,SAAuB;AACvB,IAAAC,uBAMO;;;ACPP,IAAAC,SAAuB;AACvB,sBAAiC;AACjC,IAAAC,uBAA8C;AAa5C,IAAAC,sBAAA;AAVF,IAAM,SAAyB;AAI/B,IAAM,cAA8B;AAEpC,IAAM,gBAAsB,kBAG1B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEH;AAAA;AAAA,MACD,6CAAiB,sBAAhB,EAAqB,SAAO,MAC3B,uDAAC,oCAAY,WAAU,+BAA8B,GACvD;AAAA;AAAA;AACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,uBAA6B,kBAGjC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,uDAAC,kCAAU,WAAU,iBAAgB;AAAA;AACvC,CACD;AACD,qBAAqB,cAA8B,+BAAe;AAElE,IAAM,yBAA+B,kBAGnC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,uDAAC,oCAAY,WAAU,iBAAgB;AAAA;AACzC,CACD;AACD,uBAAuB,cACL,iCAAiB;AAEnC,IAAM,gBAAsB,kBAG1B,CAAC,EAAE,WAAW,UAAU,WAAW,UAAU,GAAG,MAAM,GAAG,QACzD,6CAAiB,wBAAhB,EACC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,aAAa,YACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,mDAAC,wBAAqB;AAAA,MACtB;AAAA,QAAiB;AAAA,QAAhB;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,aAAa,YACX;AAAA,UACJ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MACA,6CAAC,0BAAuB;AAAA;AAAA;AAC1B,GACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iDAAiD,SAAS;AAAA,IACvE,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,aAAmB,kBAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,mDAAC,UAAK,WAAU,sFACd,uDAAiB,+BAAhB,EACC,uDAAC,8BAAM,WAAU,iBAAgB,GACnC,GACF;AAAA,MACA,6CAAiB,0BAAhB,EAA0B,UAAS;AAAA;AAAA;AACtC,CACD;AACD,WAAW,cAA8B,qBAAK;AAE9C,IAAM,kBAAwB,kBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,wCAAwC,SAAS;AAAA,IAC9D,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAA8B,0BAAU;;;AC9IxD,IAAAC,SAAuB;AA4BhB,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,kBAAkB;AACpB,GAAgD;AAC9C,QAAM,EAAE,IAAI,IAAI,qBAAqB;AACrC,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAuB,CAAC,CAAC;AACrE,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,CAAC;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAuB,IAAI;AAC3D,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,CAAC;AACxC,QAAM,CAAC,UAAU,WAAW,IAAU,gBAAS,eAAe;AAE9D,QAAM,mBAAyB,mBAAY,YAAY;AACrD,QAAI,CAAC,OAAQ;AAEb,QAAI;AACF,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,YAAM,UAAiC;AAAA,QACrC,OAAO;AAAA,QACP,QAAQ,OAAO;AAAA,MACjB;AACA,YAAM,OAA6B,MAAM,IAAI;AAAA,QAC3C;AAAA,QACA;AAAA,MACF;AACA,qBAAe,KAAK,WAAW;AAC/B,eAAS,KAAK,KAAK;AAAA,IACrB,SAAS,KAAK;AACZ;AAAA,QACE,eAAe,QAAQ,MAAM,IAAI,MAAM,6BAA6B;AAAA,MACtE;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,KAAK,QAAQ,MAAM,QAAQ,CAAC;AAEhC,EAAM,iBAAU,MAAM;AACpB,qBAAiB;AAAA,EACnB,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,mBAAyB;AAAA,IAC7B,OAAO,iBAAwC;AAC7C,YAAM,IAAI,iBAAiB,YAAY;AACvC,qBAAe,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,CAAC;AAClE,eAAS,CAAC,SAAS,OAAO,CAAC;AAAA,IAC7B;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,aAAa,KAAK,KAAK,QAAQ,QAAQ;AAE7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,OAAO,aAAa;AAAA,IACjC,iBAAiB,OAAO;AAAA,IACxB;AAAA,IACA,aAAa,CAAC,SAAiB;AAC7B,kBAAY,IAAI;AAChB,cAAQ,CAAC;AAAA,IACX;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AACF;;;ACjGA,IAAAC,SAAuB;AACvB,IAAAC,uBAAoF;AAsD5E,IAAAC,sBAAA;AA5CR,SAAS,WAAW,YAA4B;AAC9C,SAAO,IAAI,KAAK,UAAU,EAAE,eAAe,QAAW;AAAA,IACpD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,GAAG,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACvE;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,EAAE,IAAI,IAAI,qBAAqB;AACrC,QAAM,CAAC,iBAAiB,kBAAkB,IAAU,gBAAwB,IAAI;AAEhF,QAAM,iBAAiB,OAAO,aAAqB;AACjD,uBAAmB,QAAQ;AAC3B,QAAI;AACF,YAAM,IAAI,mBAAmB,WAAW,IAAI,QAAQ;AAAA,IACtD,SAAS,OAAO;AACd,cAAQ,MAAM,oBAAoB,KAAK;AAAA,IACzC,UAAE;AACA,yBAAmB,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,QAAQ,WAAW,IAAI,EAAE;AAAA,IAClD,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,GAAG;AAAA,EAChC;AAEA,SACE,8CAAC,SAEC;AAAA,kDAAC,SAAI,WAAU,WACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAEV;AAAA,yDAAC,kCAAU,WAAU,yBAAwB;AAAA,YAAE;AAAA;AAAA;AAAA,MAEjD;AAAA,MACA,6CAAC,QAAG,WAAU,+BAA8B,gCAAkB;AAAA,MAC9D,8CAAC,OAAE,WAAU,uCAAsC;AAAA;AAAA,QACtC,WAAW,WAAW,SAAS,YAAY;AAAA,SACxD;AAAA,OACF;AAAA,IAEA,8CAAC,SAAI,WAAU,gBAEb;AAAA,oDAAC,SACC;AAAA,qDAAC,QAAG,WAAU,qCAAoC,uBAAS;AAAA,QAC3D,8CAAC,SAAI,WAAU,gBACZ;AAAA,sBAAY,IAAI,CAAC,CAAC,KAAK,KAAK,MAC3B,8CAAC,SAAc,WAAU,mCACvB;AAAA,yDAAC,SAAI,WAAU,qDACZ,cAAI,QAAQ,MAAM,GAAG,GACxB;AAAA,YACA,6CAAC,SAAI,WAAU,2CACZ,iBAAO,UAAU,YAAY,MAAM,SAAS,IAAI,IAC/C,6CAAC,SAAI,WAAU,gFACZ,iBACH,IAEA,OAAO,KAAK,GAEhB;AAAA,eAZQ,GAaV,CACD;AAAA,UACA,YAAY,WAAW,KACtB,6CAAC,OAAE,WAAU,uCAAsC,+BAAiB;AAAA,WAExE;AAAA,SACF;AAAA,MAGC,WAAW,YAAY,SAAS,KAC/B,8CAAC,SACC;AAAA,qDAAC,QAAG,WAAU,qCAAoC,yBAAW;AAAA,QAC7D,6CAAC,SAAI,WAAU,gBACZ,qBAAW,YAAY,IAAI,CAAC,YAAY,UACvC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA,4DAAC,SAAI,WAAU,oCACb;AAAA,6DAAC,iCAAS,WAAU,0CAAyC;AAAA,gBAC7D,6CAAC,UAAK,WAAU,cAAc,qBAAW,MAAK;AAAA,gBAC9C,8CAAC,UAAK,WAAU,uCAAsC;AAAA;AAAA,kBAClD,YAAY,WAAW,IAAI;AAAA,kBAAE;AAAA,mBACjC;AAAA,iBACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,eAAe,WAAW,IAAI;AAAA,kBAC7C,UAAU,oBAAoB,WAAW;AAAA,kBAExC;AAAA,wCAAoB,WAAW,OAC9B,6CAAC,gCAAQ,WAAU,yCAAwC,IAE3D,6CAAC,iCAAS,WAAU,yBAAwB;AAAA,oBAE7C,oBAAoB,WAAW,OAAO,mBAAmB;AAAA;AAAA;AAAA,cAC5D;AAAA;AAAA;AAAA,UAtBK;AAAA,QAuBP,CACD,GACH;AAAA,SACF;AAAA,MAIF,8CAAC,SACC;AAAA,qDAAC,QAAG,WAAU,qCAAoC,sBAAQ;AAAA,QAC1D,8CAAC,SAAI,WAAU,2BACb;AAAA,wDAAC,SAAI,WAAU,6DACb;AAAA,yDAAC,8BAAM,WAAU,iBAAgB;AAAA,YACjC,6CAAC,UAAM,qBAAW,WAAW,SAAS,YAAY,GAAE;AAAA,aACtD;AAAA,UACC,WAAW,SAAS,cACnB,8CAAC,SAAI,WAAU,6DACb;AAAA,yDAAC,8BAAM,WAAU,iBAAgB;AAAA,YACjC,8CAAC,UAAK;AAAA;AAAA,cAAK,WAAW,SAAS;AAAA,eAAW;AAAA,aAC5C;AAAA,UAED,WAAW,SAAS,cACnB,8CAAC,SAAI,WAAU,4DACb;AAAA,yDAAC,gCAAQ,WAAU,2BAA0B;AAAA,YAC7C,6CAAC,UAAK,WAAU,2BACb,qBAAW,SAAS,YACvB;AAAA,aACF;AAAA,UAED,WAAW,aACV,8CAAC,SAAI,WAAU,6DACb;AAAA,yDAAC,6BAAK,WAAU,iBAAgB;AAAA,YAChC,8CAAC,UAAK;AAAA;AAAA,cAAW,WAAW;AAAA,eAAU;AAAA,aACxC;AAAA,WAEJ;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;;;AHjEQ,IAAAC,sBAAA;AAhER,SAASC,YAAW,YAA4B;AAC9C,SAAO,IAAI,KAAK,UAAU,EAAE,eAAe,QAAW;AAAA,IACpD,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,iBAAiB,MAA8C;AAEtE,QAAM,cAAc,CAAC,SAAS,SAAS,SAAS,UAAU,MAAM;AAChE,aAAW,SAAS,aAAa;AAC/B,QAAI,OAAO,KAAK,KAAK,MAAM,UAAU;AACnC,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAuC;AAE7D,QAAM,UAAU,OAAO,QAAQ,IAAI,EAAE;AAAA,IACnC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,YAAY,EAAE,SAAS,OAAO;AAAA,EACxE;AACA,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,CAAC,EAAE,KAAK,IAAI,QAAQ,CAAC;AAC3B,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQ;AACxD;AAEO,SAAS,gBAAgB,EAAE,QAAQ,UAAU,GAAyB;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe,EAAE,OAAO,CAAC;AAE7B,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAe,MAAM;AACnD,QAAM,CAAC,oBAAoB,qBAAqB,IACxC,gBAA4B,IAAI;AAExC,QAAM,uBAAuB,CAAC,eAA2B;AACvD,0BAAsB,UAAU;AAChC,YAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,aAAa,MAAM;AACvB,YAAQ,MAAM;AACd,0BAAsB,IAAI;AAAA,EAC5B;AAGA,MAAI,SAAS,YAAY,oBAAoB;AAC3C,WACE,6CAAC,SAAI,WACH;AAAA,MAAC;AAAA;AAAA,QACC,YAAY;AAAA,QACZ,QAAQ;AAAA;AAAA,IACV,GACF;AAAA,EAEJ;AAGA,MAAI,WAAW;AACb,WACE,6CAAC,SAAI,WAAW,qDAAqD,aAAa,EAAE,IAClF,uDAAC,SAAI,WAAU,4BAA2B,oCAAsB,GAClE;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,6CAAC,SAAI,WAAW,qDAAqD,aAAa,EAAE,IAClF,wDAAC,SAAI,WAAU,uBAAsB;AAAA;AAAA,MAAQ,MAAM;AAAA,OAAQ,GAC7D;AAAA,EAEJ;AAEA,MAAI,YAAY,WAAW,KAAK,SAAS,GAAG;AAC1C,WACE,8CAAC,SAAI,WAAW,kEAAkE,aAAa,EAAE,IAC/F;AAAA,mDAAC,8BAAM,WAAU,oDAAmD;AAAA,MACpE,8CAAC,OAAE,WAAU,2CAA0C;AAAA;AAAA,QAErD,6CAAC,QAAG;AAAA,QAAE;AAAA,SAER;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,aAAa,OAAO,WAAW;AACrC,QAAM,WAAW,KAAK,KAAK,OAAO,KAAK,UAAU,KAAK;AAEtD,SACE,8CAAC,SAAI,WACH;AAAA,kDAAC,SACC;AAAA,mDAAC,eACC,wDAAC,YACC;AAAA,qDAAC,aAAU,mBAAK;AAAA,QAChB,6CAAC,aAAU,qBAAO;AAAA,QAClB,6CAAC,aAAU,kBAAI;AAAA,QACf,6CAAC,aAAU,WAAU,iBAAgB,qBAAO;AAAA,SAC9C,GACF;AAAA,MACA,6CAAC,aACE,sBAAY,IAAI,CAAC,eAAe;AAC/B,cAAM,QAAQ,iBAAiB,WAAW,IAAI;AAC9C,cAAM,UAAU,eAAe,WAAW,IAAI;AAE9C,eACE,8CAAC,YACC;AAAA,uDAAC,aAAU,WAAU,kBACnB,wDAAC,SAAI,WAAU,oCACZ;AAAA,qBACC,6CAAC,UAAK,WAAU,sCAAqC,sBAAQ;AAAA,YAE9D,WAAW,YAAY,SAAS,KAC/B,8CAAC,UAAK,WAAU,6DAA4D,OAAO,GAAG,WAAW,YAAY,MAAM,kBACjH;AAAA,2DAAC,kCAAU,WAAU,iBAAgB;AAAA,cACrC,6CAAC,UAAK,WAAU,cAAc,qBAAW,YAAY,QAAO;AAAA,eAC9D;AAAA,aAEJ,GACF;AAAA,UACA,6CAAC,aAAU,WAAU,yDAClB,qBACC,6CAAC,UAAK,WAAU,aAAY,kCAAoB,GAEpD;AAAA,UACA,6CAAC,aAAU,WAAU,4BAClB,UAAAA,YAAW,WAAW,SAAS,YAAY,GAC9C;AAAA,UACA,6CAAC,aAAU,WAAU,iBACnB;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,qBAAqB,UAAU;AAAA,cAC9C,OAAM;AAAA,cAEN,uDAAC,4BAAI,WAAU,iBAAgB;AAAA;AAAA,UACjC,GACF;AAAA,aA/Ba,WAAW,EAgC1B;AAAA,MAEJ,CAAC,GACH;AAAA,OACF;AAAA,IAGA,8CAAC,SAAI,WAAU,8DACb;AAAA,oDAAC,SAAI,WAAU,wEACb;AAAA,sDAAC,UAAK;AAAA;AAAA,UACK;AAAA,UAAW;AAAA,UAAE;AAAA,UAAS;AAAA,UAAK;AAAA,WACtC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO,QAAQ;AAAA,YACtB,eAAe,CAAC,UAAU,YAAY,OAAO,KAAK,CAAC;AAAA,YAEnD;AAAA,2DAAC,iBAAc,WAAU,sBACvB,uDAAC,eAAY,GACf;AAAA,cACA,8CAAC,iBACC;AAAA,6DAAC,cAAW,OAAM,MAAK,gBAAE;AAAA,gBACzB,6CAAC,cAAW,OAAM,MAAK,gBAAE;AAAA,gBACzB,6CAAC,cAAW,OAAM,MAAK,gBAAE;AAAA,gBACzB,6CAAC,cAAW,OAAM,OAAM,iBAAG;AAAA,iBAC7B;AAAA;AAAA;AAAA,QACF;AAAA,QACA,6CAAC,UAAK,sBAAQ;AAAA,SAChB;AAAA,MACA,8CAAC,SAAI,WAAU,oCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,QAAQ,OAAO,CAAC;AAAA,YAC/B,UAAU,CAAC;AAAA,YAEX;AAAA,2DAAC,oCAAY,WAAU,yBAAwB;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,QAAQ,OAAO,CAAC;AAAA,YAC/B,UAAU,CAAC;AAAA,YACZ;AAAA;AAAA,cAEC,6CAAC,qCAAa,WAAU,yBAAwB;AAAA;AAAA;AAAA,QAClD;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;;;AIlPA,IAAAC,UAAuB;AACvB,IAAAC,uBAAwC;;;ACDxC,IAAAC,UAAuB;AASjB,IAAAC,sBAAA;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACtC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;;;ACrBpB,IAAAC,UAAuB;AACvB,IAAAC,mCAAuC;AAanC,IAAAC,uBAAA;AAVJ,IAAM,oBAAgB;AAAA,EACpB;AACF;AAMA,IAAMC,SAAc;AAAA,EAClB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,WAAM,KAAU,WAAW,GAAG,cAAc,GAAG,SAAS,GAAI,GAAG,OAAO;AAE3E;AACAA,OAAM,cAAc;;;AChBpB,IAAAC,mCAAuC;AAiCnC,IAAAC,uBAAA;AA9BJ,IAAM,oBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,SAAS;AAAA,QACT,SACE;AAAA,QACF,SACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAMA,SAAS,MAAM,EAAE,WAAW,SAAS,GAAG,MAAM,GAAe;AAC3D,SACE,8CAAC,SAAI,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAI,GAAG,OAAO;AAE1E;;;AH0EY,IAAAC,uBAAA;AA5FL,SAAS,aAAa,EAAE,MAAM,SAAS,UAAU,GAAsB;AAC5E,QAAM,EAAE,WAAW,IAAI,SAAS;AAChC,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,KAAK;AACpD,QAAM,CAAC,WAAW,YAAY,IAAU,iBAAsB,IAAI;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAwB,IAAI;AAG5D,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK,IAAI;AAChD,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAS,KAAK,gBAAgB,EAAE;AAC5E,QAAM,CAAC,iBAAiB,kBAAkB,IAAU;AAAA,IAClD,KAAK;AAAA,EACP;AACA,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,EAAE;AAGjD,EAAM,kBAAU,MAAM;AACpB,YAAQ,KAAK,IAAI;AACjB,mBAAe,KAAK,gBAAgB,EAAE;AACtC,uBAAmB,KAAK,gBAAgB;AACxC,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,IAAI,CAAC;AAGT,QAAM,OAAa;AAAA,IACjB,OAAO,YAA6B;AAClC,UAAI;AACF,oBAAY,IAAI;AAChB,iBAAS,IAAI;AACb,cAAM,cAAc,MAAM,WAAW,KAAK,IAAI,OAAO;AACrD,qBAAa,oBAAI,KAAK,CAAC;AACvB,kBAAU,WAAW;AAAA,MACvB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB;AAAA,MAChE,UAAE;AACA,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,IACA,CAAC,KAAK,IAAI,YAAY,OAAO;AAAA,EAC/B;AAGA,EAAM,kBAAU,MAAM;AACpB,QAAI,WAAW;AACb,YAAM,QAAQ,WAAW,MAAM,aAAa,IAAI,GAAG,GAAI;AACvD,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,iBAAiB,YAAY;AACjC,UAAM,QAAQ,SAAS,KAAK,EAAE,YAAY;AAC1C,QAAI,CAAC,MAAO;AACZ,QAAI,CAAC,MAAM,SAAS,GAAG,GAAG;AACxB,eAAS,oCAAoC;AAC7C;AAAA,IACF;AACA,QAAI,gBAAgB,SAAS,KAAK,GAAG;AACnC,eAAS,6BAA6B;AACtC;AAAA,IACF;AACA,UAAM,gBAAgB,CAAC,GAAG,iBAAiB,KAAK;AAChD,uBAAmB,aAAa;AAChC,gBAAY,EAAE;AACd,aAAS,IAAI;AACb,UAAM,KAAK,EAAE,kBAAkB,cAAc,CAAC;AAAA,EAChD;AAEA,QAAM,oBAAoB,OAAO,UAAkB;AACjD,UAAM,gBAAgB,gBAAgB,OAAO,CAAC,MAAM,MAAM,KAAK;AAC/D,uBAAmB,aAAa;AAChC,UAAM,KAAK,EAAE,kBAAkB,cAAc,CAAC;AAAA,EAChD;AAGA,QAAM,iBAAiB,YAAY;AACjC,QAAI,SAAS,KAAK,MAAM;AACtB,YAAM,KAAK,EAAE,KAAK,CAAC;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,qBAAqB,YAAY;AACrC,UAAM,WAAW,eAAe;AAChC,QAAI,aAAa,KAAK,cAAc;AAClC,YAAM,KAAK,EAAE,cAAc,SAAS,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,SACE,+CAAC,SAAI,WAAW,4BAA4B,aAAa,EAAE,IAEvD;AAAA,iBAAY,cACZ,8CAAC,SAAI,WAAU,4DACZ,qBACC,+CAAC,SAAI,WAAU,0GACb;AAAA,oDAAC,gCAAQ,WAAU,0DAAyD;AAAA,MAC5E,8CAAC,UAAK,WAAU,cAAa,uBAAS;AAAA,OACxC,IAEA,+CAAC,SAAI,WAAU,4HACb;AAAA,oDAAC,8BAAM,WAAU,mCAAkC;AAAA,MACnD,8CAAC,UAAK,WAAU,gCAA+B,2BAAa;AAAA,OAC9D,GAEJ;AAAA,IAIF,+CAAC,SAAI,WAAU,gBACb;AAAA,oDAACC,QAAA,EAAM,SAAQ,aAAY,uBAAS;AAAA,MACpC;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,UACvC,QAAQ;AAAA,UACR,aAAY;AAAA;AAAA,MACd;AAAA,MACA,8CAAC,OAAE,WAAU,uCAAsC,6DAEnD;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAU,gBACb;AAAA,oDAACA,QAAA,EAAM,8BAAgB;AAAA,MACvB,8CAAC,OAAE,WAAU,+CAA8C,qEAE3D;AAAA,MACA,+CAAC,SAAI,WAAU,yCACZ;AAAA,wBAAgB,IAAI,CAAC,UACpB,+CAAC,SAAkB,SAAQ,aAAY,WAAU,YAC9C;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,kBAAkB,KAAK;AAAA,cACtC,WAAU;AAAA,cACV,UAAU;AAAA,cAEV,wDAAC,0BAAE,WAAU,iBAAgB;AAAA;AAAA,UAC/B;AAAA,aATU,KAUZ,CACD;AAAA,QACA,gBAAgB,WAAW,KAC1B,8CAAC,UAAK,WAAU,iDAAgD,sCAEhE;AAAA,SAEJ;AAAA,MACA,+CAAC,SAAI,WAAU,oBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,YAC3C,aAAY;AAAA,YACZ,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,SAAS;AACrB,kBAAE,eAAe;AACjB,+BAAe;AAAA,cACjB;AAAA,YACF;AAAA,YACA,UAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS;AAAA,YACT,UAAU,CAAC,SAAS,KAAK,KAAK;AAAA,YAE9B,wDAAC,6BAAK,WAAU,iBAAgB;AAAA;AAAA,QAClC;AAAA,SACF;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAU,gBACb;AAAA,oDAACA,QAAA,EAAM,SAAQ,gBAAe,0BAAY;AAAA,MAC1C;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,QAAQ;AAAA,UACR,aAAY;AAAA;AAAA,MACd;AAAA,MACA,8CAAC,OAAE,WAAU,uCAAsC,8GAGnD;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAU,gBACb;AAAA,oDAACA,QAAA,EAAM,2BAAa;AAAA,MACpB,8CAAC,SAAI,WAAU,oCACb,wDAAC,UAAK,WAAU,yEACb,eAAK,cACR,GACF;AAAA,MACA,8CAAC,OAAE,WAAU,uCAAsC,wDAEnD;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAU,gBACb;AAAA,oDAACA,QAAA,EAAM,gCAAkB;AAAA,MACzB,+CAAC,SAAI,WAAU,oCACb;AAAA,sDAAC,SAAM,SAAS,KAAK,QAAQ,UAAU,YAAY,aAChD,eAAK,QAAQ,UAAU,YAAY,YACtC;AAAA,QACC,KAAK,QAAQ,WAAW,KAAK,QAAQ,YACpC,+CAAC,UAAK,WAAU,uCAAsC;AAAA;AAAA,UAClD,KAAK,QAAQ;AAAA,UAAS;AAAA,WAC1B;AAAA,SAEJ;AAAA,OACF;AAAA,IAGC,SACC,8CAAC,SAAI,WAAU,kFACZ,iBACH;AAAA,KAEJ;AAEJ;;;AXvMU,IAAAC,uBAAA;AA1BH,SAAS,eAAe,EAAE,UAAU,GAAwB;AACjE,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAe,MAAM;AACnD,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAsB,IAAI;AACxE,QAAM,CAAC,WAAW,YAAY,IAAU;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,MAAY,QAAoC;AACxE,oBAAgB,IAAI;AACpB,YAAQ,QAAQ;AAChB,iBAAa,GAAG;AAAA,EAClB;AAEA,QAAM,aAAa,MAAM;AACvB,YAAQ,MAAM;AACd,oBAAgB,IAAI;AAAA,EACtB;AAEA,QAAM,kBAAkB,CAAC,gBAAsB;AAC7C,oBAAgB,WAAW;AAAA,EAC7B;AAEA,SACE,+CAAC,SAAI,WACF;AAAA,aAAS,UACR,+CAAC,SACC;AAAA,qDAAC,SAAI,WAAU,WACb;AAAA,sDAAC,QAAG,WAAU,+BAA8B,mBAAK;AAAA,QACjD,8CAAC,OAAE,WAAU,uCAAsC,6DAEnD;AAAA,SACF;AAAA,MACA,8CAAC,aAAU,cAAc,kBAAkB;AAAA,OAC7C;AAAA,IAGD,SAAS,YAAY,gBACpB,+CAAC,SAEC;AAAA,qDAAC,SAAI,WAAU,WACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YAEV;AAAA,4DAAC,kCAAU,WAAU,yBAAwB;AAAA,cAAE;AAAA;AAAA;AAAA,QAEjD;AAAA,QACA,8CAAC,QAAG,WAAU,+BAA+B,uBAAa,MAAK;AAAA,QAC/D,8CAAC,OAAE,WAAU,uCACX,wDAAC,UAAK,WAAU,yDACb,uBAAa,cAChB,GACF;AAAA,SACF;AAAA,MAGA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,MAAM,aAAa,CAA+B;AAAA,UAElE;AAAA,2DAAC,YAAS,WAAU,WAClB;AAAA,6DAAC,eAAY,OAAM,eAAc,WAAU,YACzC;AAAA,8DAAC,8BAAM,WAAU,iBAAgB;AAAA,gBAAE;AAAA,iBAErC;AAAA,cACA,+CAAC,eAAY,OAAM,YAAW,WAAU,YACtC;AAAA,8DAAC,iCAAS,WAAU,iBAAgB;AAAA,gBAAE;AAAA,iBAExC;AAAA,eACF;AAAA,YAEA,8CAAC,eAAY,OAAM,eACjB,wDAAC,mBAAgB,QAAQ,aAAa,IAAI,GAC5C;AAAA,YAEA,8CAAC,eAAY,OAAM,YACjB,wDAAC,gBAAa,MAAM,cAAc,SAAS,iBAAiB,GAC9D;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":["React","import_lucide_react","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","React","import_lucide_react","import_jsx_runtime","React","React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","formatDate","React","import_lucide_react","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","Label","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","Label","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider/AifeaturesProvider.tsx","../src/lib/api.ts","../src/components/FormsDashboard.tsx","../src/ui/tabs.tsx","../src/lib/cn.ts","../src/ui/button.tsx","../src/components/FormsList.tsx","../src/ui/table.tsx","../src/hooks/useForms.ts","../src/components/FormSubmissions.tsx","../src/ui/select.tsx","../src/hooks/useSubmissions.ts","../src/components/SubmissionDetail.tsx","../src/components/FormSettings.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/badge.tsx"],"sourcesContent":["// Provider\nexport {\n AifeaturesProvider,\n useAifeaturesContext,\n type AifeaturesProviderProps,\n type AifeaturesContextValue,\n} from './provider/AifeaturesProvider'\n\n// Components\nexport {\n FormsDashboard,\n FormsList,\n FormSubmissions,\n FormSettings,\n SubmissionDetail,\n type FormsDashboardProps,\n type FormsListProps,\n type FormSubmissionsProps,\n type FormSettingsProps,\n type SubmissionDetailProps,\n} from './components'\n\n// Hooks\nexport {\n useAifeatures,\n useForms,\n useSubmissions,\n type UseFormsReturn,\n type UseSubmissionsReturn,\n type UseSubmissionsOptions,\n} from './hooks'\n\n// Types\nexport type {\n Form,\n Submission,\n Attachment,\n SubmissionMetadata,\n PaginatedSubmissions,\n FormsListResponse,\n CreateFormInput,\n UpdateFormInput,\n GetSubmissionsOptions,\n ApiError,\n} from './types'\n\n// API Client (for advanced use cases)\nexport {\n createApiClient,\n AifeaturesApiError,\n type AifeaturesApiClient,\n} from './lib/api'\n","import * as React from 'react'\nimport { createApiClient, type AifeaturesApiClient } from '../lib/api'\n\nexport interface AifeaturesContextValue {\n siteToken: string\n apiUrl: string\n api: AifeaturesApiClient\n}\n\nconst AifeaturesContext = React.createContext<AifeaturesContextValue | null>(\n null\n)\n\nexport interface AifeaturesProviderProps {\n /** Site-scoped API token from aifeatures */\n siteToken: string\n /** API URL (defaults to https://aifeatures.dev) */\n apiUrl?: string\n /** Optional dark mode */\n dark?: boolean\n /** Optional className for the wrapper */\n className?: string\n children: React.ReactNode\n}\n\n/**\n * Validates the token and returns an error message if invalid\n */\nfunction validateToken(token: string): string | null {\n if (!token) {\n return 'No siteToken provided to AifeaturesProvider'\n }\n\n if (token.startsWith('sk_')) {\n return 'Invalid token type: You passed an organization API key (sk_xxx) but AifeaturesProvider requires a site token (st_xxx). Site tokens are returned when you create a site via the API.'\n }\n\n if (!token.startsWith('st_')) {\n return `Invalid token format: Expected a site token starting with \"st_\" but got \"${token.slice(0, 10)}...\". Site tokens are returned when you create a site via the API.`\n }\n\n return null\n}\n\nexport function AifeaturesProvider({\n siteToken,\n apiUrl = 'https://aifeatures.dev',\n dark = false,\n className,\n children,\n}: AifeaturesProviderProps) {\n // Validate token on mount and when it changes\n const tokenError = React.useMemo(() => validateToken(siteToken), [siteToken])\n\n const api = React.useMemo(\n () => createApiClient(siteToken, apiUrl),\n [siteToken, apiUrl]\n )\n\n const value = React.useMemo(\n () => ({\n siteToken,\n apiUrl,\n api,\n }),\n [siteToken, apiUrl, api]\n )\n\n // Show error UI if token is invalid\n if (tokenError) {\n return (\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n <div className=\"af-rounded-md af-border af-border-destructive af-bg-destructive/10 af-p-4\">\n <h3 className=\"af-text-sm af-font-semibold af-text-destructive af-mb-2\">\n AifeaturesProvider Configuration Error\n </h3>\n <p className=\"af-text-sm af-text-destructive\">\n {tokenError}\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <AifeaturesContext.Provider value={value}>\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n {children}\n </div>\n </AifeaturesContext.Provider>\n )\n}\n\nexport function useAifeaturesContext(): AifeaturesContextValue {\n const context = React.useContext(AifeaturesContext)\n if (!context) {\n throw new Error(\n 'useAifeaturesContext must be used within an AifeaturesProvider'\n )\n }\n return context\n}\n\nexport { AifeaturesContext }\n","import type {\n Form,\n Submission,\n FormsListResponse,\n PaginatedSubmissions,\n CreateFormInput,\n UpdateFormInput,\n GetSubmissionsOptions,\n ApiError,\n} from '../types'\n\nexport class AifeaturesApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public details?: ApiError\n ) {\n super(message)\n this.name = 'AifeaturesApiError'\n }\n}\n\nexport interface AifeaturesApiClient {\n // Forms\n getForms(): Promise<Form[]>\n getForm(formId: string): Promise<Form>\n createForm(input: CreateFormInput): Promise<Form>\n updateForm(formId: string, input: UpdateFormInput): Promise<Form>\n deleteForm(formId: string): Promise<void>\n\n // Submissions\n getSubmissions(\n formId: string,\n options?: GetSubmissionsOptions\n ): Promise<PaginatedSubmissions>\n getSubmission(submissionId: string): Promise<Submission>\n deleteSubmission(submissionId: string): Promise<void>\n\n // Attachments\n downloadAttachment(submissionId: string, filename: string): Promise<void>\n}\n\nexport function createApiClient(\n siteToken: string,\n apiUrl: string = 'https://aifeatures.dev'\n): AifeaturesApiClient {\n async function request<T>(\n path: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${apiUrl}${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Request failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T\n }\n\n return response.json()\n }\n\n return {\n // Forms\n async getForms(): Promise<Form[]> {\n const data = await request<FormsListResponse>('/api/v1/forms')\n return data.forms\n },\n\n async getForm(formId: string): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`)\n },\n\n async createForm(input: CreateFormInput): Promise<Form> {\n return request<Form>('/api/v1/forms', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n },\n\n async updateForm(formId: string, input: UpdateFormInput): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n })\n },\n\n async deleteForm(formId: string): Promise<void> {\n await request<void>(`/api/v1/forms/${formId}`, {\n method: 'DELETE',\n })\n },\n\n // Submissions\n async getSubmissions(\n formId: string,\n options: GetSubmissionsOptions = {}\n ): Promise<PaginatedSubmissions> {\n const params = new URLSearchParams()\n if (options.limit !== undefined) {\n params.set('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.set('offset', String(options.offset))\n }\n const query = params.toString()\n const path = `/api/v1/forms/${formId}/submissions${query ? `?${query}` : ''}`\n return request<PaginatedSubmissions>(path)\n },\n\n async getSubmission(submissionId: string): Promise<Submission> {\n return request<Submission>(`/api/v1/submissions/${submissionId}`)\n },\n\n async deleteSubmission(submissionId: string): Promise<void> {\n await request<void>(`/api/v1/submissions/${submissionId}`, {\n method: 'DELETE',\n })\n },\n\n // Attachments\n async downloadAttachment(submissionId: string, filename: string): Promise<void> {\n const url = `${apiUrl}/api/v1/submissions/${submissionId}/attachments/${encodeURIComponent(filename)}`\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Download failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Create blob and trigger download\n const blob = await response.blob()\n const blobUrl = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(blobUrl)\n },\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Settings, Inbox } from 'lucide-react'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'\nimport { Button } from '../ui/button'\nimport { FormsList } from './FormsList'\nimport { FormSubmissions } from './FormSubmissions'\nimport { FormSettings } from './FormSettings'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Form } from '../types'\n\nexport interface FormsDashboardProps {\n /** Optional className */\n className?: string\n /** Submission ID to deep link to (opens form and shows submission detail) */\n submissionId?: string\n}\n\ntype View = 'list' | 'detail'\n\nexport function FormsDashboard({ className, submissionId }: FormsDashboardProps) {\n const { api } = useAifeaturesContext()\n const [view, setView] = React.useState<View>('list')\n const [selectedForm, setSelectedForm] = React.useState<Form | null>(null)\n const [activeTab, setActiveTab] = React.useState<'submissions' | 'settings'>(\n 'submissions'\n )\n const [deepLinkSubmissionId, setDeepLinkSubmissionId] = React.useState<string | undefined>(submissionId)\n const [isLoadingDeepLink, setIsLoadingDeepLink] = React.useState(!!submissionId)\n\n // Handle deep linking to a submission\n React.useEffect(() => {\n if (!submissionId) return\n\n async function loadSubmission() {\n try {\n // Fetch the submission to get its form_id\n const submission = await api.getSubmission(submissionId!)\n // Fetch the form\n const form = await api.getForm(submission.form_id)\n // Navigate to the form with the submission selected\n setSelectedForm(form)\n setView('detail')\n setActiveTab('submissions')\n setDeepLinkSubmissionId(submissionId)\n } catch (error) {\n console.error('Failed to load submission for deep link:', error)\n } finally {\n setIsLoadingDeepLink(false)\n }\n }\n\n loadSubmission()\n }, [submissionId, api])\n\n const handleSelectForm = (form: Form, tab: 'submissions' | 'settings') => {\n setSelectedForm(form)\n setView('detail')\n setActiveTab(tab)\n setDeepLinkSubmissionId(undefined) // Clear deep link when manually selecting\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedForm(null)\n setDeepLinkSubmissionId(undefined)\n }\n\n const handleFormSaved = (updatedForm: Form) => {\n setSelectedForm(updatedForm)\n }\n\n if (isLoadingDeepLink) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading...</div>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {view === 'list' && (\n <div>\n <div className=\"af-mb-6\">\n <h2 className=\"af-text-lg af-font-semibold\">Forms</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Manage your contact forms and view submissions.\n </p>\n </div>\n <FormsList onSelectForm={handleSelectForm} />\n </div>\n )}\n\n {view === 'detail' && selectedForm && (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Forms\n </Button>\n <h2 className=\"af-text-lg af-font-semibold\">{selectedForm.name}</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {selectedForm.endpoint_url}\n </code>\n </p>\n </div>\n\n {/* Tabs for submissions and settings */}\n <Tabs\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as 'submissions' | 'settings')}\n >\n <TabsList className=\"af-mb-4\">\n <TabsTrigger value=\"submissions\" className=\"af-gap-2\">\n <Inbox className=\"af-h-4 af-w-4\" />\n Submissions\n </TabsTrigger>\n <TabsTrigger value=\"settings\" className=\"af-gap-2\">\n <Settings className=\"af-h-4 af-w-4\" />\n Settings\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"submissions\">\n <FormSubmissions formId={selectedForm.id} defaultSubmissionId={deepLinkSubmissionId} />\n </TabsContent>\n\n <TabsContent value=\"settings\">\n <FormSettings form={selectedForm} onSaved={handleFormSaved} />\n </TabsContent>\n </Tabs>\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/cn'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'af-inline-flex af-h-9 af-items-center af-justify-center af-rounded-lg af-bg-muted af-p-1 af-text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-inline-flex af-items-center af-justify-center af-whitespace-nowrap af-rounded-md af-px-3 af-py-1 af-text-sm af-font-medium af-ring-offset-background af-transition-all focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2 disabled:af-pointer-events-none disabled:af-opacity-50 data-[state=active]:af-bg-background data-[state=active]:af-text-foreground data-[state=active]:af-shadow',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'af-mt-2 af-ring-offset-background focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst buttonVariants = cva(\n 'af-inline-flex af-items-center af-justify-center af-gap-2 af-whitespace-nowrap af-rounded-md af-text-sm af-font-medium af-transition-colors focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-pointer-events-none disabled:af-opacity-50 [&_svg]:af-pointer-events-none [&_svg]:af-size-4 [&_svg]:af-shrink-0',\n {\n variants: {\n variant: {\n default:\n 'af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/90',\n destructive:\n 'af-bg-destructive af-text-destructive-foreground af-shadow-sm hover:af-bg-destructive/90',\n outline:\n 'af-border af-border-input af-bg-background af-shadow-sm hover:af-bg-accent hover:af-text-accent-foreground',\n secondary:\n 'af-bg-secondary af-text-secondary-foreground af-shadow-sm hover:af-bg-secondary/80',\n ghost: 'hover:af-bg-accent hover:af-text-accent-foreground',\n link: 'af-text-primary af-underline-offset-4 hover:af-underline',\n },\n size: {\n default: 'af-h-9 af-px-4 af-py-2',\n sm: 'af-h-8 af-rounded-md af-px-3 af-text-xs',\n lg: 'af-h-10 af-rounded-md af-px-8',\n icon: 'af-h-9 af-w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n 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 return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\nimport { Inbox, Settings } from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport { useForms } from '../hooks/useForms'\nimport type { Form } from '../types'\n\nexport interface FormsListProps {\n /** Called when a form is selected */\n onSelectForm?: (form: Form, tab: 'submissions' | 'settings') => void\n /** Optional className */\n className?: string\n}\n\nexport function FormsList({ onSelectForm, className }: FormsListProps) {\n const { forms, isLoading, error } = useForms()\n\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading forms...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (forms.length === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No forms yet.\n <br />\n Forms will appear here when the AI creates contact forms on your website.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Endpoint</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {forms.map((form) => (\n <TableRow key={form.id}>\n <TableCell className=\"af-font-medium\">{form.name}</TableCell>\n <TableCell>\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {form.endpoint_url.replace('https://aifeatures.dev', '')}\n </code>\n </TableCell>\n <TableCell className=\"af-text-right\">\n <div className=\"af-flex af-items-center af-justify-end af-gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'submissions')}\n >\n <Inbox className=\"af-h-4 af-w-4 af-mr-1\" />\n Submissions\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'settings')}\n >\n <Settings className=\"af-h-4 af-w-4 af-mr-1\" />\n Settings\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"af-relative af-w-full af-overflow-auto\">\n <table\n ref={ref}\n className={cn('af-w-full af-caption-bottom af-text-sm', className)}\n {...props}\n />\n </div>\n))\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:af-border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn('[&_tr:last-child]:af-border-0', className)}\n {...props}\n />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'af-border-t af-bg-muted/50 af-font-medium [&>tr]:last:af-border-b-0',\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'af-border-b af-transition-colors hover:af-bg-muted/50 data-[state=selected]:af-bg-muted',\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'af-h-10 af-px-2 af-text-left af-align-middle af-font-medium af-text-muted-foreground [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'af-p-2 af-align-middle [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn('af-mt-4 af-text-sm af-text-muted-foreground', className)}\n {...props}\n />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Form, CreateFormInput, UpdateFormInput } from '../types'\n\nexport interface UseFormsReturn {\n forms: Form[]\n isLoading: boolean\n error: Error | null\n refetch: () => Promise<void>\n createForm: (input: CreateFormInput) => Promise<Form>\n updateForm: (formId: string, input: UpdateFormInput) => Promise<Form>\n deleteForm: (formId: string) => Promise<void>\n}\n\nexport function useForms(): UseFormsReturn {\n const { api } = useAifeaturesContext()\n const [forms, setForms] = React.useState<Form[]>([])\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n\n const fetchForms = React.useCallback(async () => {\n try {\n setIsLoading(true)\n setError(null)\n const data = await api.getForms()\n setForms(data)\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch forms'))\n } finally {\n setIsLoading(false)\n }\n }, [api])\n\n React.useEffect(() => {\n fetchForms()\n }, [fetchForms])\n\n const createForm = React.useCallback(\n async (input: CreateFormInput): Promise<Form> => {\n const form = await api.createForm(input)\n setForms((prev) => [...prev, form])\n return form\n },\n [api]\n )\n\n const updateForm = React.useCallback(\n async (formId: string, input: UpdateFormInput): Promise<Form> => {\n const form = await api.updateForm(formId, input)\n setForms((prev) => prev.map((f) => (f.id === formId ? form : f)))\n return form\n },\n [api]\n )\n\n const deleteForm = React.useCallback(\n async (formId: string): Promise<void> => {\n await api.deleteForm(formId)\n setForms((prev) => prev.filter((f) => f.id !== formId))\n },\n [api]\n )\n\n return {\n forms,\n isLoading,\n error,\n refetch: fetchForms,\n createForm,\n updateForm,\n deleteForm,\n }\n}\n","import * as React from 'react'\nimport {\n ChevronLeft,\n ChevronRight,\n Eye,\n Inbox,\n Paperclip,\n} from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { useSubmissions } from '../hooks/useSubmissions'\nimport { SubmissionDetail } from './SubmissionDetail'\nimport type { Submission } from '../types'\n\nexport interface FormSubmissionsProps {\n /** The form ID to show submissions for */\n formId: string\n /** Optional className */\n className?: string\n /** Submission ID to auto-open in detail view */\n defaultSubmissionId?: string\n}\n\ntype View = 'list' | 'detail'\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction getEmailFromData(data: Record<string, unknown>): string | null {\n // Try common email field names\n const emailFields = ['email', 'Email', 'EMAIL', 'e-mail', 'mail']\n for (const field of emailFields) {\n if (typeof data[field] === 'string') {\n return data[field] as string\n }\n }\n return null\n}\n\nfunction getPreviewText(data: Record<string, unknown>): string {\n // Get first non-email, non-internal field as preview\n const entries = Object.entries(data).filter(\n ([key]) => !key.startsWith('_') && !key.toLowerCase().includes('email')\n )\n if (entries.length === 0) return ''\n\n const [, value] = entries[0]\n const text = String(value)\n return text.length > 50 ? text.slice(0, 50) + '...' : text\n}\n\nexport function FormSubmissions({ formId, className, defaultSubmissionId }: FormSubmissionsProps) {\n const {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage,\n hasPreviousPage,\n setPage,\n setPageSize,\n } = useSubmissions({ formId })\n\n const [view, setView] = React.useState<View>('list')\n const [selectedSubmission, setSelectedSubmission] =\n React.useState<Submission | null>(null)\n\n // Auto-open submission detail if defaultSubmissionId is provided\n React.useEffect(() => {\n if (defaultSubmissionId && submissions.length > 0) {\n const submission = submissions.find(s => s.id === defaultSubmissionId)\n if (submission) {\n setSelectedSubmission(submission)\n setView('detail')\n }\n }\n }, [defaultSubmissionId, submissions])\n\n const handleViewSubmission = (submission: Submission) => {\n setSelectedSubmission(submission)\n setView('detail')\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedSubmission(null)\n }\n\n // Show detail view\n if (view === 'detail' && selectedSubmission) {\n return (\n <div className={className}>\n <SubmissionDetail\n submission={selectedSubmission}\n onBack={handleBack}\n />\n </div>\n )\n }\n\n // Show list view\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading submissions...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (submissions.length === 0 && page === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No submissions yet.\n <br />\n Submissions will appear here when visitors use your form.\n </p>\n </div>\n )\n }\n\n const startIndex = page * pageSize + 1\n const endIndex = Math.min((page + 1) * pageSize, total)\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Email</TableHead>\n <TableHead>Preview</TableHead>\n <TableHead>Date</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {submissions.map((submission) => {\n const email = getEmailFromData(submission.data)\n const preview = getPreviewText(submission.data)\n\n return (\n <TableRow key={submission.id}>\n <TableCell className=\"af-font-medium\">\n <div className=\"af-flex af-items-center af-gap-2\">\n {email || (\n <span className=\"af-text-muted-foreground af-italic\">No email</span>\n )}\n {submission.attachments.length > 0 && (\n <span className=\"af-flex af-items-center af-gap-1 af-text-muted-foreground\" title={`${submission.attachments.length} attachment(s)`}>\n <Paperclip className=\"af-h-3 af-w-3\" />\n <span className=\"af-text-xs\">{submission.attachments.length}</span>\n </span>\n )}\n </div>\n </TableCell>\n <TableCell className=\"af-text-muted-foreground af-max-w-[200px] af-truncate\">\n {preview || (\n <span className=\"af-italic\">No preview available</span>\n )}\n </TableCell>\n <TableCell className=\"af-text-muted-foreground\">\n {formatDate(submission.metadata.submitted_at)}\n </TableCell>\n <TableCell className=\"af-text-right\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleViewSubmission(submission)}\n title=\"View details\"\n >\n <Eye className=\"af-h-4 af-w-4\" />\n </Button>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n\n {/* Pagination */}\n <div className=\"af-flex af-items-center af-justify-between af-px-2 af-py-4\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-sm af-text-muted-foreground\">\n <span>\n Showing {startIndex}-{endIndex} of {total}\n </span>\n <Select\n value={String(pageSize)}\n onValueChange={(value) => setPageSize(Number(value))}\n >\n <SelectTrigger className=\"af-w-[70px] af-h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"10\">10</SelectItem>\n <SelectItem value=\"25\">25</SelectItem>\n <SelectItem value=\"50\">50</SelectItem>\n <SelectItem value=\"100\">100</SelectItem>\n </SelectContent>\n </Select>\n <span>per page</span>\n </div>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page - 1)}\n disabled={!hasPreviousPage}\n >\n <ChevronLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page + 1)}\n disabled={!hasNextPage}\n >\n Next\n <ChevronRight className=\"af-h-4 af-w-4 af-ml-1\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-flex af-h-9 af-w-full af-items-center af-justify-between af-whitespace-nowrap af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-2 af-text-sm af-shadow-sm af-ring-offset-background placeholder:af-text-muted-foreground focus:af-outline-none focus:af-ring-1 focus:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50 [&>span]:af-line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"af-h-4 af-w-4 af-opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronUp className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronDown className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'af-relative af-z-50 af-max-h-96 af-min-w-[8rem] af-overflow-hidden af-rounded-md af-border af-bg-popover af-text-popover-foreground af-shadow-md data-[state=open]:af-animate-in data-[state=closed]:af-animate-out data-[state=closed]:af-fade-out-0 data-[state=open]:af-fade-in-0 data-[state=closed]:af-zoom-out-95 data-[state=open]:af-zoom-in-95 data-[side=bottom]:af-slide-in-from-top-2 data-[side=left]:af-slide-in-from-right-2 data-[side=right]:af-slide-in-from-left-2 data-[side=top]:af-slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:af-translate-y-1 data-[side=left]:af--translate-x-1 data-[side=right]:af-translate-x-1 data-[side=top]:af--translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'af-p-1',\n position === 'popper' &&\n 'af-h-[var(--radix-select-trigger-height)] af-w-full af-min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('af-px-2 af-py-1.5 af-text-sm af-font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'af-relative af-flex af-w-full af-cursor-default af-select-none af-items-center af-rounded-sm af-py-1.5 af-pl-2 af-pr-8 af-text-sm af-outline-none focus:af-bg-accent focus:af-text-accent-foreground data-[disabled]:af-pointer-events-none data-[disabled]:af-opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"af-absolute af-right-2 af-flex af-h-3.5 af-w-3.5 af-items-center af-justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('af--mx-1 af-my-1 af-h-px af-bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type {\n Submission,\n PaginatedSubmissions,\n GetSubmissionsOptions,\n} from '../types'\n\nexport interface UseSubmissionsReturn {\n submissions: Submission[]\n total: number\n isLoading: boolean\n error: Error | null\n page: number\n pageSize: number\n hasNextPage: boolean\n hasPreviousPage: boolean\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n refetch: () => Promise<void>\n deleteSubmission: (submissionId: string) => Promise<void>\n}\n\nexport interface UseSubmissionsOptions {\n formId: string\n initialPageSize?: number\n}\n\nexport function useSubmissions({\n formId,\n initialPageSize = 25,\n}: UseSubmissionsOptions): UseSubmissionsReturn {\n const { api } = useAifeaturesContext()\n const [submissions, setSubmissions] = React.useState<Submission[]>([])\n const [total, setTotal] = React.useState(0)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n const [page, setPage] = React.useState(0)\n const [pageSize, setPageSize] = React.useState(initialPageSize)\n\n const fetchSubmissions = React.useCallback(async () => {\n if (!formId) return\n\n try {\n setIsLoading(true)\n setError(null)\n const options: GetSubmissionsOptions = {\n limit: pageSize,\n offset: page * pageSize,\n }\n const data: PaginatedSubmissions = await api.getSubmissions(\n formId,\n options\n )\n setSubmissions(data.submissions)\n setTotal(data.total)\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error('Failed to fetch submissions')\n )\n } finally {\n setIsLoading(false)\n }\n }, [api, formId, page, pageSize])\n\n React.useEffect(() => {\n fetchSubmissions()\n }, [fetchSubmissions])\n\n const deleteSubmission = React.useCallback(\n async (submissionId: string): Promise<void> => {\n await api.deleteSubmission(submissionId)\n setSubmissions((prev) => prev.filter((s) => s.id !== submissionId))\n setTotal((prev) => prev - 1)\n },\n [api]\n )\n\n const totalPages = Math.ceil(total / pageSize)\n\n return {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage: page < totalPages - 1,\n hasPreviousPage: page > 0,\n setPage,\n setPageSize: (size: number) => {\n setPageSize(size)\n setPage(0) // Reset to first page when page size changes\n },\n refetch: fetchSubmissions,\n deleteSubmission,\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Download, Globe, Clock, FileText, Loader2, Monitor, Mail } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Submission } from '../types'\n\nexport interface SubmissionDetailProps {\n submission: Submission\n onBack: () => void\n}\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`\n}\n\nexport function SubmissionDetail({\n submission,\n onBack,\n}: SubmissionDetailProps) {\n const { api } = useAifeaturesContext()\n const [downloadingFile, setDownloadingFile] = React.useState<string | null>(null)\n\n const handleDownload = async (filename: string) => {\n setDownloadingFile(filename)\n try {\n await api.downloadAttachment(submission.id, filename)\n } catch (error) {\n console.error('Download failed:', error)\n } finally {\n setDownloadingFile(null)\n }\n }\n\n const dataEntries = Object.entries(submission.data).filter(\n ([key]) => !key.startsWith('_')\n )\n\n return (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Submissions\n </Button>\n <h3 className=\"af-text-lg af-font-semibold\">Submission Details</h3>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Submitted {formatDate(submission.metadata.submitted_at)}\n </p>\n </div>\n\n <div className=\"af-space-y-6\">\n {/* Form Data */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Form Data</h4>\n <div className=\"af-space-y-3\">\n {dataEntries.map(([key, value]) => (\n <div key={key} className=\"af-grid af-grid-cols-3 af-gap-2\">\n <div className=\"af-text-sm af-text-muted-foreground af-capitalize\">\n {key.replace(/_/g, ' ')}\n </div>\n <div className=\"af-col-span-2 af-text-sm af-break-words\">\n {typeof value === 'string' && value.includes('\\n') ? (\n <pre className=\"af-whitespace-pre-wrap af-font-sans af-bg-muted af-p-2 af-rounded af-text-xs\">\n {value}\n </pre>\n ) : (\n String(value)\n )}\n </div>\n </div>\n ))}\n {dataEntries.length === 0 && (\n <p className=\"af-text-sm af-text-muted-foreground\">No data submitted</p>\n )}\n </div>\n </div>\n\n {/* Attachments */}\n {submission.attachments.length > 0 && (\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Attachments</h4>\n <div className=\"af-space-y-2\">\n {submission.attachments.map((attachment, index) => (\n <div\n key={index}\n className=\"af-flex af-items-center af-justify-between af-p-2 af-bg-muted af-rounded\"\n >\n <div className=\"af-flex af-items-center af-gap-2\">\n <FileText className=\"af-h-4 af-w-4 af-text-muted-foreground\" />\n <span className=\"af-text-sm\">{attachment.name}</span>\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({formatBytes(attachment.size)})\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleDownload(attachment.name)}\n disabled={downloadingFile === attachment.name}\n >\n {downloadingFile === attachment.name ? (\n <Loader2 className=\"af-h-4 af-w-4 af-mr-1 af-animate-spin\" />\n ) : (\n <Download className=\"af-h-4 af-w-4 af-mr-1\" />\n )}\n {downloadingFile === attachment.name ? 'Downloading...' : 'Download'}\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Metadata */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Metadata</h4>\n <div className=\"af-space-y-2 af-text-sm\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Clock className=\"af-h-4 af-w-4\" />\n <span>{formatDate(submission.metadata.submitted_at)}</span>\n </div>\n {submission.metadata.ip_address && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Globe className=\"af-h-4 af-w-4\" />\n <span>IP: {submission.metadata.ip_address}</span>\n </div>\n )}\n {submission.metadata.user_agent && (\n <div className=\"af-flex af-items-start af-gap-2 af-text-muted-foreground\">\n <Monitor className=\"af-h-4 af-w-4 af-mt-0.5\" />\n <span className=\"af-text-xs af-break-all\">\n {submission.metadata.user_agent}\n </span>\n </div>\n )}\n {submission.resend_id && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Mail className=\"af-h-4 af-w-4\" />\n <span>Email ID: {submission.resend_id}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Plus, X, Loader2, Check } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport { Badge } from '../ui/badge'\nimport { useForms } from '../hooks/useForms'\nimport type { Form, UpdateFormInput } from '../types'\n\nexport interface FormSettingsProps {\n /** The form to edit */\n form: Form\n /** Called when settings are saved */\n onSaved?: (form: Form) => void\n /** Optional className */\n className?: string\n}\n\nexport function FormSettings({ form, onSaved, className }: FormSettingsProps) {\n const { updateForm } = useForms()\n const [isSaving, setIsSaving] = React.useState(false)\n const [lastSaved, setLastSaved] = React.useState<Date | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n\n // Local form state\n const [name, setName] = React.useState(form.name)\n const [redirectUrl, setRedirectUrl] = React.useState(form.redirect_url || '')\n const [emailRecipients, setEmailRecipients] = React.useState<string[]>(\n form.email_recipients\n )\n const [newEmail, setNewEmail] = React.useState('')\n\n // Reset state when form changes\n React.useEffect(() => {\n setName(form.name)\n setRedirectUrl(form.redirect_url || '')\n setEmailRecipients(form.email_recipients)\n setError(null)\n }, [form])\n\n // Auto-save function\n const save = React.useCallback(\n async (updates: UpdateFormInput) => {\n try {\n setIsSaving(true)\n setError(null)\n const updatedForm = await updateForm(form.id, updates)\n setLastSaved(new Date())\n onSaved?.(updatedForm)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save')\n } finally {\n setIsSaving(false)\n }\n },\n [form.id, updateForm, onSaved]\n )\n\n // Clear \"saved\" indicator after 2 seconds\n React.useEffect(() => {\n if (lastSaved) {\n const timer = setTimeout(() => setLastSaved(null), 2000)\n return () => clearTimeout(timer)\n }\n }, [lastSaved])\n\n const handleAddEmail = async () => {\n const email = newEmail.trim().toLowerCase()\n if (!email) return\n if (!email.includes('@')) {\n setError('Please enter a valid email address')\n return\n }\n if (emailRecipients.includes(email)) {\n setError('This email is already added')\n return\n }\n const newRecipients = [...emailRecipients, email]\n setEmailRecipients(newRecipients)\n setNewEmail('')\n setError(null)\n await save({ email_recipients: newRecipients })\n }\n\n const handleRemoveEmail = async (email: string) => {\n const newRecipients = emailRecipients.filter((e) => e !== email)\n setEmailRecipients(newRecipients)\n await save({ email_recipients: newRecipients })\n }\n\n // Save text fields on blur\n const handleNameBlur = async () => {\n if (name !== form.name) {\n await save({ name })\n }\n }\n\n const handleRedirectBlur = async () => {\n const newValue = redirectUrl || null\n if (newValue !== form.redirect_url) {\n await save({ redirect_url: newValue })\n }\n }\n\n return (\n <div className={`af-space-y-6 af-relative ${className || ''}`}>\n {/* Toast notification */}\n {(isSaving || lastSaved) && (\n <div className=\"aifeatures-admin af-fixed af-bottom-4 af-right-4 af-z-50\">\n {isSaving ? (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-background af-border af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Loader2 className=\"af-h-4 af-w-4 af-animate-spin af-text-muted-foreground\" />\n <span className=\"af-text-sm\">Saving...</span>\n </div>\n ) : (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-green-50 af-border af-border-green-200 af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Check className=\"af-h-4 af-w-4 af-text-green-600\" />\n <span className=\"af-text-sm af-text-green-800\">Changes saved</span>\n </div>\n )}\n </div>\n )}\n\n {/* Form Name */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"form-name\">Form Name</Label>\n <Input\n id=\"form-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={handleNameBlur}\n placeholder=\"Contact Form\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n A name to identify this form in your dashboard.\n </p>\n </div>\n\n {/* Email Recipients */}\n <div className=\"af-space-y-2\">\n <Label>Email Recipients</Label>\n <p className=\"af-text-xs af-text-muted-foreground af-mb-2\">\n Form submissions will be sent to these email addresses.\n </p>\n <div className=\"af-flex af-flex-wrap af-gap-2 af-mb-2\">\n {emailRecipients.map((email) => (\n <Badge key={email} variant=\"secondary\" className=\"af-gap-1\">\n {email}\n <button\n type=\"button\"\n onClick={() => handleRemoveEmail(email)}\n className=\"af-ml-1 hover:af-text-destructive\"\n disabled={isSaving}\n >\n <X className=\"af-h-3 af-w-3\" />\n </button>\n </Badge>\n ))}\n {emailRecipients.length === 0 && (\n <span className=\"af-text-sm af-text-muted-foreground af-italic\">\n No recipients configured\n </span>\n )}\n </div>\n <div className=\"af-flex af-gap-2\">\n <Input\n type=\"email\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder=\"Add email address\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleAddEmail()\n }\n }}\n disabled={isSaving}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddEmail}\n disabled={!newEmail.trim() || isSaving}\n >\n <Plus className=\"af-h-4 af-w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Redirect URL */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"redirect-url\">Redirect URL</Label>\n <Input\n id=\"redirect-url\"\n value={redirectUrl}\n onChange={(e) => setRedirectUrl(e.target.value)}\n onBlur={handleRedirectBlur}\n placeholder=\"/thank-you\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n URL to redirect visitors to after successful submission. Leave empty\n for a default success page.\n </p>\n </div>\n\n {/* Form Endpoint (read-only) */}\n <div className=\"af-space-y-2\">\n <Label>Form Endpoint</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <code className=\"af-flex-1 af-text-xs af-bg-muted af-px-3 af-py-2 af-rounded af-border\">\n {form.endpoint_url}\n </code>\n </div>\n <p className=\"af-text-xs af-text-muted-foreground\">\n Use this URL as the form action attribute.\n </p>\n </div>\n\n {/* Captcha Status (read-only for now) */}\n <div className=\"af-space-y-2\">\n <Label>Captcha Protection</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Badge variant={form.captcha.enabled ? 'success' : 'secondary'}>\n {form.captcha.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n {form.captcha.enabled && form.captcha.provider && (\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({form.captcha.provider})\n </span>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"af-text-sm af-text-destructive af-bg-destructive/10 af-px-3 af-py-2 af-rounded\">\n {error}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'af-flex af-h-9 af-w-full af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-1 af-text-sm af-shadow-sm af-transition-colors file:af-border-0 file:af-bg-transparent file:af-text-sm file:af-font-medium file:af-text-foreground placeholder:af-text-muted-foreground focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst labelVariants = cva(\n 'af-text-sm af-font-medium af-leading-none peer-disabled:af-cursor-not-allowed peer-disabled:af-opacity-70'\n)\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label ref={ref} className={cn(labelVariants(), className)} {...props} />\n )\n)\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst badgeVariants = cva(\n 'af-inline-flex af-items-center af-rounded-md af-border af-px-2.5 af-py-0.5 af-text-xs af-font-semibold af-transition-colors focus:af-outline-none focus:af-ring-2 focus:af-ring-ring focus:af-ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'af-border-transparent af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/80',\n secondary:\n 'af-border-transparent af-bg-secondary af-text-secondary-foreground hover:af-bg-secondary/80',\n destructive:\n 'af-border-transparent af-bg-destructive af-text-destructive-foreground af-shadow hover:af-bg-destructive/80',\n outline: 'af-text-foreground',\n success:\n 'af-border-transparent af-bg-green-100 af-text-green-800',\n warning:\n 'af-border-transparent af-bg-yellow-100 af-text-yellow-800',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":"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","names":["React","import_lucide_react","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","React","import_lucide_react","import_jsx_runtime","React","React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","formatDate","React","import_lucide_react","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","Label","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","Label","import_jsx_runtime"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -42,6 +42,7 @@ interface SubmissionMetadata {
|
|
|
42
42
|
*/
|
|
43
43
|
interface Submission {
|
|
44
44
|
id: string;
|
|
45
|
+
form_id: string;
|
|
45
46
|
data: Record<string, unknown>;
|
|
46
47
|
attachments: Attachment[];
|
|
47
48
|
metadata: SubmissionMetadata;
|
|
@@ -137,8 +138,10 @@ declare function useAifeaturesContext(): AifeaturesContextValue;
|
|
|
137
138
|
interface FormsDashboardProps {
|
|
138
139
|
/** Optional className */
|
|
139
140
|
className?: string;
|
|
141
|
+
/** Submission ID to deep link to (opens form and shows submission detail) */
|
|
142
|
+
submissionId?: string;
|
|
140
143
|
}
|
|
141
|
-
declare function FormsDashboard({ className }: FormsDashboardProps): react_jsx_runtime.JSX.Element;
|
|
144
|
+
declare function FormsDashboard({ className, submissionId }: FormsDashboardProps): react_jsx_runtime.JSX.Element;
|
|
142
145
|
|
|
143
146
|
interface FormsListProps {
|
|
144
147
|
/** Called when a form is selected */
|
|
@@ -153,8 +156,10 @@ interface FormSubmissionsProps {
|
|
|
153
156
|
formId: string;
|
|
154
157
|
/** Optional className */
|
|
155
158
|
className?: string;
|
|
159
|
+
/** Submission ID to auto-open in detail view */
|
|
160
|
+
defaultSubmissionId?: string;
|
|
156
161
|
}
|
|
157
|
-
declare function FormSubmissions({ formId, className }: FormSubmissionsProps): react_jsx_runtime.JSX.Element;
|
|
162
|
+
declare function FormSubmissions({ formId, className, defaultSubmissionId }: FormSubmissionsProps): react_jsx_runtime.JSX.Element;
|
|
158
163
|
|
|
159
164
|
interface FormSettingsProps {
|
|
160
165
|
/** The form to edit */
|
package/dist/index.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ interface SubmissionMetadata {
|
|
|
42
42
|
*/
|
|
43
43
|
interface Submission {
|
|
44
44
|
id: string;
|
|
45
|
+
form_id: string;
|
|
45
46
|
data: Record<string, unknown>;
|
|
46
47
|
attachments: Attachment[];
|
|
47
48
|
metadata: SubmissionMetadata;
|
|
@@ -137,8 +138,10 @@ declare function useAifeaturesContext(): AifeaturesContextValue;
|
|
|
137
138
|
interface FormsDashboardProps {
|
|
138
139
|
/** Optional className */
|
|
139
140
|
className?: string;
|
|
141
|
+
/** Submission ID to deep link to (opens form and shows submission detail) */
|
|
142
|
+
submissionId?: string;
|
|
140
143
|
}
|
|
141
|
-
declare function FormsDashboard({ className }: FormsDashboardProps): react_jsx_runtime.JSX.Element;
|
|
144
|
+
declare function FormsDashboard({ className, submissionId }: FormsDashboardProps): react_jsx_runtime.JSX.Element;
|
|
142
145
|
|
|
143
146
|
interface FormsListProps {
|
|
144
147
|
/** Called when a form is selected */
|
|
@@ -153,8 +156,10 @@ interface FormSubmissionsProps {
|
|
|
153
156
|
formId: string;
|
|
154
157
|
/** Optional className */
|
|
155
158
|
className?: string;
|
|
159
|
+
/** Submission ID to auto-open in detail view */
|
|
160
|
+
defaultSubmissionId?: string;
|
|
156
161
|
}
|
|
157
|
-
declare function FormSubmissions({ formId, className }: FormSubmissionsProps): react_jsx_runtime.JSX.Element;
|
|
162
|
+
declare function FormSubmissions({ formId, className, defaultSubmissionId }: FormSubmissionsProps): react_jsx_runtime.JSX.Element;
|
|
158
163
|
|
|
159
164
|
interface FormSettingsProps {
|
|
160
165
|
/** The form to edit */
|
package/dist/index.js
CHANGED
|
@@ -830,7 +830,7 @@ function getPreviewText(data) {
|
|
|
830
830
|
const text = String(value);
|
|
831
831
|
return text.length > 50 ? text.slice(0, 50) + "..." : text;
|
|
832
832
|
}
|
|
833
|
-
function FormSubmissions({ formId, className }) {
|
|
833
|
+
function FormSubmissions({ formId, className, defaultSubmissionId }) {
|
|
834
834
|
const {
|
|
835
835
|
submissions,
|
|
836
836
|
total,
|
|
@@ -845,6 +845,15 @@ function FormSubmissions({ formId, className }) {
|
|
|
845
845
|
} = useSubmissions({ formId });
|
|
846
846
|
const [view, setView] = React9.useState("list");
|
|
847
847
|
const [selectedSubmission, setSelectedSubmission] = React9.useState(null);
|
|
848
|
+
React9.useEffect(() => {
|
|
849
|
+
if (defaultSubmissionId && submissions.length > 0) {
|
|
850
|
+
const submission = submissions.find((s) => s.id === defaultSubmissionId);
|
|
851
|
+
if (submission) {
|
|
852
|
+
setSelectedSubmission(submission);
|
|
853
|
+
setView("detail");
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
}, [defaultSubmissionId, submissions]);
|
|
848
857
|
const handleViewSubmission = (submission) => {
|
|
849
858
|
setSelectedSubmission(submission);
|
|
850
859
|
setView("detail");
|
|
@@ -1219,24 +1228,50 @@ function FormSettings({ form, onSaved, className }) {
|
|
|
1219
1228
|
|
|
1220
1229
|
// src/components/FormsDashboard.tsx
|
|
1221
1230
|
import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1222
|
-
function FormsDashboard({ className }) {
|
|
1231
|
+
function FormsDashboard({ className, submissionId }) {
|
|
1232
|
+
const { api } = useAifeaturesContext();
|
|
1223
1233
|
const [view, setView] = React13.useState("list");
|
|
1224
1234
|
const [selectedForm, setSelectedForm] = React13.useState(null);
|
|
1225
1235
|
const [activeTab, setActiveTab] = React13.useState(
|
|
1226
1236
|
"submissions"
|
|
1227
1237
|
);
|
|
1238
|
+
const [deepLinkSubmissionId, setDeepLinkSubmissionId] = React13.useState(submissionId);
|
|
1239
|
+
const [isLoadingDeepLink, setIsLoadingDeepLink] = React13.useState(!!submissionId);
|
|
1240
|
+
React13.useEffect(() => {
|
|
1241
|
+
if (!submissionId) return;
|
|
1242
|
+
async function loadSubmission() {
|
|
1243
|
+
try {
|
|
1244
|
+
const submission = await api.getSubmission(submissionId);
|
|
1245
|
+
const form = await api.getForm(submission.form_id);
|
|
1246
|
+
setSelectedForm(form);
|
|
1247
|
+
setView("detail");
|
|
1248
|
+
setActiveTab("submissions");
|
|
1249
|
+
setDeepLinkSubmissionId(submissionId);
|
|
1250
|
+
} catch (error) {
|
|
1251
|
+
console.error("Failed to load submission for deep link:", error);
|
|
1252
|
+
} finally {
|
|
1253
|
+
setIsLoadingDeepLink(false);
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
loadSubmission();
|
|
1257
|
+
}, [submissionId, api]);
|
|
1228
1258
|
const handleSelectForm = (form, tab) => {
|
|
1229
1259
|
setSelectedForm(form);
|
|
1230
1260
|
setView("detail");
|
|
1231
1261
|
setActiveTab(tab);
|
|
1262
|
+
setDeepLinkSubmissionId(void 0);
|
|
1232
1263
|
};
|
|
1233
1264
|
const handleBack = () => {
|
|
1234
1265
|
setView("list");
|
|
1235
1266
|
setSelectedForm(null);
|
|
1267
|
+
setDeepLinkSubmissionId(void 0);
|
|
1236
1268
|
};
|
|
1237
1269
|
const handleFormSaved = (updatedForm) => {
|
|
1238
1270
|
setSelectedForm(updatedForm);
|
|
1239
1271
|
};
|
|
1272
|
+
if (isLoadingDeepLink) {
|
|
1273
|
+
return /* @__PURE__ */ jsx13("div", { className: `af-flex af-items-center af-justify-center af-py-8 ${className || ""}`, children: /* @__PURE__ */ jsx13("div", { className: "af-text-muted-foreground", children: "Loading..." }) });
|
|
1274
|
+
}
|
|
1240
1275
|
return /* @__PURE__ */ jsxs7("div", { className, children: [
|
|
1241
1276
|
view === "list" && /* @__PURE__ */ jsxs7("div", { children: [
|
|
1242
1277
|
/* @__PURE__ */ jsxs7("div", { className: "af-mb-6", children: [
|
|
@@ -1279,7 +1314,7 @@ function FormsDashboard({ className }) {
|
|
|
1279
1314
|
"Settings"
|
|
1280
1315
|
] })
|
|
1281
1316
|
] }),
|
|
1282
|
-
/* @__PURE__ */ jsx13(TabsContent, { value: "submissions", children: /* @__PURE__ */ jsx13(FormSubmissions, { formId: selectedForm.id }) }),
|
|
1317
|
+
/* @__PURE__ */ jsx13(TabsContent, { value: "submissions", children: /* @__PURE__ */ jsx13(FormSubmissions, { formId: selectedForm.id, defaultSubmissionId: deepLinkSubmissionId }) }),
|
|
1283
1318
|
/* @__PURE__ */ jsx13(TabsContent, { value: "settings", children: /* @__PURE__ */ jsx13(FormSettings, { form: selectedForm, onSaved: handleFormSaved }) })
|
|
1284
1319
|
]
|
|
1285
1320
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/AifeaturesProvider.tsx","../src/lib/api.ts","../src/components/FormsDashboard.tsx","../src/ui/tabs.tsx","../src/lib/cn.ts","../src/ui/button.tsx","../src/components/FormsList.tsx","../src/ui/table.tsx","../src/hooks/useForms.ts","../src/components/FormSubmissions.tsx","../src/ui/select.tsx","../src/hooks/useSubmissions.ts","../src/components/SubmissionDetail.tsx","../src/components/FormSettings.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/badge.tsx"],"sourcesContent":["import * as React from 'react'\nimport { createApiClient, type AifeaturesApiClient } from '../lib/api'\n\nexport interface AifeaturesContextValue {\n siteToken: string\n apiUrl: string\n api: AifeaturesApiClient\n}\n\nconst AifeaturesContext = React.createContext<AifeaturesContextValue | null>(\n null\n)\n\nexport interface AifeaturesProviderProps {\n /** Site-scoped API token from aifeatures */\n siteToken: string\n /** API URL (defaults to https://aifeatures.dev) */\n apiUrl?: string\n /** Optional dark mode */\n dark?: boolean\n /** Optional className for the wrapper */\n className?: string\n children: React.ReactNode\n}\n\n/**\n * Validates the token and returns an error message if invalid\n */\nfunction validateToken(token: string): string | null {\n if (!token) {\n return 'No siteToken provided to AifeaturesProvider'\n }\n\n if (token.startsWith('sk_')) {\n return 'Invalid token type: You passed an organization API key (sk_xxx) but AifeaturesProvider requires a site token (st_xxx). Site tokens are returned when you create a site via the API.'\n }\n\n if (!token.startsWith('st_')) {\n return `Invalid token format: Expected a site token starting with \"st_\" but got \"${token.slice(0, 10)}...\". Site tokens are returned when you create a site via the API.`\n }\n\n return null\n}\n\nexport function AifeaturesProvider({\n siteToken,\n apiUrl = 'https://aifeatures.dev',\n dark = false,\n className,\n children,\n}: AifeaturesProviderProps) {\n // Validate token on mount and when it changes\n const tokenError = React.useMemo(() => validateToken(siteToken), [siteToken])\n\n const api = React.useMemo(\n () => createApiClient(siteToken, apiUrl),\n [siteToken, apiUrl]\n )\n\n const value = React.useMemo(\n () => ({\n siteToken,\n apiUrl,\n api,\n }),\n [siteToken, apiUrl, api]\n )\n\n // Show error UI if token is invalid\n if (tokenError) {\n return (\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n <div className=\"af-rounded-md af-border af-border-destructive af-bg-destructive/10 af-p-4\">\n <h3 className=\"af-text-sm af-font-semibold af-text-destructive af-mb-2\">\n AifeaturesProvider Configuration Error\n </h3>\n <p className=\"af-text-sm af-text-destructive\">\n {tokenError}\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <AifeaturesContext.Provider value={value}>\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n {children}\n </div>\n </AifeaturesContext.Provider>\n )\n}\n\nexport function useAifeaturesContext(): AifeaturesContextValue {\n const context = React.useContext(AifeaturesContext)\n if (!context) {\n throw new Error(\n 'useAifeaturesContext must be used within an AifeaturesProvider'\n )\n }\n return context\n}\n\nexport { AifeaturesContext }\n","import type {\n Form,\n Submission,\n FormsListResponse,\n PaginatedSubmissions,\n CreateFormInput,\n UpdateFormInput,\n GetSubmissionsOptions,\n ApiError,\n} from '../types'\n\nexport class AifeaturesApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public details?: ApiError\n ) {\n super(message)\n this.name = 'AifeaturesApiError'\n }\n}\n\nexport interface AifeaturesApiClient {\n // Forms\n getForms(): Promise<Form[]>\n getForm(formId: string): Promise<Form>\n createForm(input: CreateFormInput): Promise<Form>\n updateForm(formId: string, input: UpdateFormInput): Promise<Form>\n deleteForm(formId: string): Promise<void>\n\n // Submissions\n getSubmissions(\n formId: string,\n options?: GetSubmissionsOptions\n ): Promise<PaginatedSubmissions>\n getSubmission(submissionId: string): Promise<Submission>\n deleteSubmission(submissionId: string): Promise<void>\n\n // Attachments\n downloadAttachment(submissionId: string, filename: string): Promise<void>\n}\n\nexport function createApiClient(\n siteToken: string,\n apiUrl: string = 'https://aifeatures.dev'\n): AifeaturesApiClient {\n async function request<T>(\n path: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${apiUrl}${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Request failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T\n }\n\n return response.json()\n }\n\n return {\n // Forms\n async getForms(): Promise<Form[]> {\n const data = await request<FormsListResponse>('/api/v1/forms')\n return data.forms\n },\n\n async getForm(formId: string): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`)\n },\n\n async createForm(input: CreateFormInput): Promise<Form> {\n return request<Form>('/api/v1/forms', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n },\n\n async updateForm(formId: string, input: UpdateFormInput): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n })\n },\n\n async deleteForm(formId: string): Promise<void> {\n await request<void>(`/api/v1/forms/${formId}`, {\n method: 'DELETE',\n })\n },\n\n // Submissions\n async getSubmissions(\n formId: string,\n options: GetSubmissionsOptions = {}\n ): Promise<PaginatedSubmissions> {\n const params = new URLSearchParams()\n if (options.limit !== undefined) {\n params.set('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.set('offset', String(options.offset))\n }\n const query = params.toString()\n const path = `/api/v1/forms/${formId}/submissions${query ? `?${query}` : ''}`\n return request<PaginatedSubmissions>(path)\n },\n\n async getSubmission(submissionId: string): Promise<Submission> {\n return request<Submission>(`/api/v1/submissions/${submissionId}`)\n },\n\n async deleteSubmission(submissionId: string): Promise<void> {\n await request<void>(`/api/v1/submissions/${submissionId}`, {\n method: 'DELETE',\n })\n },\n\n // Attachments\n async downloadAttachment(submissionId: string, filename: string): Promise<void> {\n const url = `${apiUrl}/api/v1/submissions/${submissionId}/attachments/${encodeURIComponent(filename)}`\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Download failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Create blob and trigger download\n const blob = await response.blob()\n const blobUrl = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(blobUrl)\n },\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Settings, Inbox } from 'lucide-react'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'\nimport { Button } from '../ui/button'\nimport { FormsList } from './FormsList'\nimport { FormSubmissions } from './FormSubmissions'\nimport { FormSettings } from './FormSettings'\nimport type { Form } from '../types'\n\nexport interface FormsDashboardProps {\n /** Optional className */\n className?: string\n}\n\ntype View = 'list' | 'detail'\n\nexport function FormsDashboard({ className }: FormsDashboardProps) {\n const [view, setView] = React.useState<View>('list')\n const [selectedForm, setSelectedForm] = React.useState<Form | null>(null)\n const [activeTab, setActiveTab] = React.useState<'submissions' | 'settings'>(\n 'submissions'\n )\n\n const handleSelectForm = (form: Form, tab: 'submissions' | 'settings') => {\n setSelectedForm(form)\n setView('detail')\n setActiveTab(tab)\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedForm(null)\n }\n\n const handleFormSaved = (updatedForm: Form) => {\n setSelectedForm(updatedForm)\n }\n\n return (\n <div className={className}>\n {view === 'list' && (\n <div>\n <div className=\"af-mb-6\">\n <h2 className=\"af-text-lg af-font-semibold\">Forms</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Manage your contact forms and view submissions.\n </p>\n </div>\n <FormsList onSelectForm={handleSelectForm} />\n </div>\n )}\n\n {view === 'detail' && selectedForm && (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Forms\n </Button>\n <h2 className=\"af-text-lg af-font-semibold\">{selectedForm.name}</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {selectedForm.endpoint_url}\n </code>\n </p>\n </div>\n\n {/* Tabs for submissions and settings */}\n <Tabs\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as 'submissions' | 'settings')}\n >\n <TabsList className=\"af-mb-4\">\n <TabsTrigger value=\"submissions\" className=\"af-gap-2\">\n <Inbox className=\"af-h-4 af-w-4\" />\n Submissions\n </TabsTrigger>\n <TabsTrigger value=\"settings\" className=\"af-gap-2\">\n <Settings className=\"af-h-4 af-w-4\" />\n Settings\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"submissions\">\n <FormSubmissions formId={selectedForm.id} />\n </TabsContent>\n\n <TabsContent value=\"settings\">\n <FormSettings form={selectedForm} onSaved={handleFormSaved} />\n </TabsContent>\n </Tabs>\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/cn'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'af-inline-flex af-h-9 af-items-center af-justify-center af-rounded-lg af-bg-muted af-p-1 af-text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-inline-flex af-items-center af-justify-center af-whitespace-nowrap af-rounded-md af-px-3 af-py-1 af-text-sm af-font-medium af-ring-offset-background af-transition-all focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2 disabled:af-pointer-events-none disabled:af-opacity-50 data-[state=active]:af-bg-background data-[state=active]:af-text-foreground data-[state=active]:af-shadow',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'af-mt-2 af-ring-offset-background focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst buttonVariants = cva(\n 'af-inline-flex af-items-center af-justify-center af-gap-2 af-whitespace-nowrap af-rounded-md af-text-sm af-font-medium af-transition-colors focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-pointer-events-none disabled:af-opacity-50 [&_svg]:af-pointer-events-none [&_svg]:af-size-4 [&_svg]:af-shrink-0',\n {\n variants: {\n variant: {\n default:\n 'af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/90',\n destructive:\n 'af-bg-destructive af-text-destructive-foreground af-shadow-sm hover:af-bg-destructive/90',\n outline:\n 'af-border af-border-input af-bg-background af-shadow-sm hover:af-bg-accent hover:af-text-accent-foreground',\n secondary:\n 'af-bg-secondary af-text-secondary-foreground af-shadow-sm hover:af-bg-secondary/80',\n ghost: 'hover:af-bg-accent hover:af-text-accent-foreground',\n link: 'af-text-primary af-underline-offset-4 hover:af-underline',\n },\n size: {\n default: 'af-h-9 af-px-4 af-py-2',\n sm: 'af-h-8 af-rounded-md af-px-3 af-text-xs',\n lg: 'af-h-10 af-rounded-md af-px-8',\n icon: 'af-h-9 af-w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n 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 return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\nimport { Inbox, Settings } from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport { useForms } from '../hooks/useForms'\nimport type { Form } from '../types'\n\nexport interface FormsListProps {\n /** Called when a form is selected */\n onSelectForm?: (form: Form, tab: 'submissions' | 'settings') => void\n /** Optional className */\n className?: string\n}\n\nexport function FormsList({ onSelectForm, className }: FormsListProps) {\n const { forms, isLoading, error } = useForms()\n\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading forms...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (forms.length === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No forms yet.\n <br />\n Forms will appear here when the AI creates contact forms on your website.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Endpoint</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {forms.map((form) => (\n <TableRow key={form.id}>\n <TableCell className=\"af-font-medium\">{form.name}</TableCell>\n <TableCell>\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {form.endpoint_url.replace('https://aifeatures.dev', '')}\n </code>\n </TableCell>\n <TableCell className=\"af-text-right\">\n <div className=\"af-flex af-items-center af-justify-end af-gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'submissions')}\n >\n <Inbox className=\"af-h-4 af-w-4 af-mr-1\" />\n Submissions\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'settings')}\n >\n <Settings className=\"af-h-4 af-w-4 af-mr-1\" />\n Settings\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"af-relative af-w-full af-overflow-auto\">\n <table\n ref={ref}\n className={cn('af-w-full af-caption-bottom af-text-sm', className)}\n {...props}\n />\n </div>\n))\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:af-border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn('[&_tr:last-child]:af-border-0', className)}\n {...props}\n />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'af-border-t af-bg-muted/50 af-font-medium [&>tr]:last:af-border-b-0',\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'af-border-b af-transition-colors hover:af-bg-muted/50 data-[state=selected]:af-bg-muted',\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'af-h-10 af-px-2 af-text-left af-align-middle af-font-medium af-text-muted-foreground [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'af-p-2 af-align-middle [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn('af-mt-4 af-text-sm af-text-muted-foreground', className)}\n {...props}\n />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Form, CreateFormInput, UpdateFormInput } from '../types'\n\nexport interface UseFormsReturn {\n forms: Form[]\n isLoading: boolean\n error: Error | null\n refetch: () => Promise<void>\n createForm: (input: CreateFormInput) => Promise<Form>\n updateForm: (formId: string, input: UpdateFormInput) => Promise<Form>\n deleteForm: (formId: string) => Promise<void>\n}\n\nexport function useForms(): UseFormsReturn {\n const { api } = useAifeaturesContext()\n const [forms, setForms] = React.useState<Form[]>([])\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n\n const fetchForms = React.useCallback(async () => {\n try {\n setIsLoading(true)\n setError(null)\n const data = await api.getForms()\n setForms(data)\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch forms'))\n } finally {\n setIsLoading(false)\n }\n }, [api])\n\n React.useEffect(() => {\n fetchForms()\n }, [fetchForms])\n\n const createForm = React.useCallback(\n async (input: CreateFormInput): Promise<Form> => {\n const form = await api.createForm(input)\n setForms((prev) => [...prev, form])\n return form\n },\n [api]\n )\n\n const updateForm = React.useCallback(\n async (formId: string, input: UpdateFormInput): Promise<Form> => {\n const form = await api.updateForm(formId, input)\n setForms((prev) => prev.map((f) => (f.id === formId ? form : f)))\n return form\n },\n [api]\n )\n\n const deleteForm = React.useCallback(\n async (formId: string): Promise<void> => {\n await api.deleteForm(formId)\n setForms((prev) => prev.filter((f) => f.id !== formId))\n },\n [api]\n )\n\n return {\n forms,\n isLoading,\n error,\n refetch: fetchForms,\n createForm,\n updateForm,\n deleteForm,\n }\n}\n","import * as React from 'react'\nimport {\n ChevronLeft,\n ChevronRight,\n Eye,\n Inbox,\n Paperclip,\n} from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { useSubmissions } from '../hooks/useSubmissions'\nimport { SubmissionDetail } from './SubmissionDetail'\nimport type { Submission } from '../types'\n\nexport interface FormSubmissionsProps {\n /** The form ID to show submissions for */\n formId: string\n /** Optional className */\n className?: string\n}\n\ntype View = 'list' | 'detail'\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction getEmailFromData(data: Record<string, unknown>): string | null {\n // Try common email field names\n const emailFields = ['email', 'Email', 'EMAIL', 'e-mail', 'mail']\n for (const field of emailFields) {\n if (typeof data[field] === 'string') {\n return data[field] as string\n }\n }\n return null\n}\n\nfunction getPreviewText(data: Record<string, unknown>): string {\n // Get first non-email, non-internal field as preview\n const entries = Object.entries(data).filter(\n ([key]) => !key.startsWith('_') && !key.toLowerCase().includes('email')\n )\n if (entries.length === 0) return ''\n\n const [, value] = entries[0]\n const text = String(value)\n return text.length > 50 ? text.slice(0, 50) + '...' : text\n}\n\nexport function FormSubmissions({ formId, className }: FormSubmissionsProps) {\n const {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage,\n hasPreviousPage,\n setPage,\n setPageSize,\n } = useSubmissions({ formId })\n\n const [view, setView] = React.useState<View>('list')\n const [selectedSubmission, setSelectedSubmission] =\n React.useState<Submission | null>(null)\n\n const handleViewSubmission = (submission: Submission) => {\n setSelectedSubmission(submission)\n setView('detail')\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedSubmission(null)\n }\n\n // Show detail view\n if (view === 'detail' && selectedSubmission) {\n return (\n <div className={className}>\n <SubmissionDetail\n submission={selectedSubmission}\n onBack={handleBack}\n />\n </div>\n )\n }\n\n // Show list view\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading submissions...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (submissions.length === 0 && page === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No submissions yet.\n <br />\n Submissions will appear here when visitors use your form.\n </p>\n </div>\n )\n }\n\n const startIndex = page * pageSize + 1\n const endIndex = Math.min((page + 1) * pageSize, total)\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Email</TableHead>\n <TableHead>Preview</TableHead>\n <TableHead>Date</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {submissions.map((submission) => {\n const email = getEmailFromData(submission.data)\n const preview = getPreviewText(submission.data)\n\n return (\n <TableRow key={submission.id}>\n <TableCell className=\"af-font-medium\">\n <div className=\"af-flex af-items-center af-gap-2\">\n {email || (\n <span className=\"af-text-muted-foreground af-italic\">No email</span>\n )}\n {submission.attachments.length > 0 && (\n <span className=\"af-flex af-items-center af-gap-1 af-text-muted-foreground\" title={`${submission.attachments.length} attachment(s)`}>\n <Paperclip className=\"af-h-3 af-w-3\" />\n <span className=\"af-text-xs\">{submission.attachments.length}</span>\n </span>\n )}\n </div>\n </TableCell>\n <TableCell className=\"af-text-muted-foreground af-max-w-[200px] af-truncate\">\n {preview || (\n <span className=\"af-italic\">No preview available</span>\n )}\n </TableCell>\n <TableCell className=\"af-text-muted-foreground\">\n {formatDate(submission.metadata.submitted_at)}\n </TableCell>\n <TableCell className=\"af-text-right\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleViewSubmission(submission)}\n title=\"View details\"\n >\n <Eye className=\"af-h-4 af-w-4\" />\n </Button>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n\n {/* Pagination */}\n <div className=\"af-flex af-items-center af-justify-between af-px-2 af-py-4\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-sm af-text-muted-foreground\">\n <span>\n Showing {startIndex}-{endIndex} of {total}\n </span>\n <Select\n value={String(pageSize)}\n onValueChange={(value) => setPageSize(Number(value))}\n >\n <SelectTrigger className=\"af-w-[70px] af-h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"10\">10</SelectItem>\n <SelectItem value=\"25\">25</SelectItem>\n <SelectItem value=\"50\">50</SelectItem>\n <SelectItem value=\"100\">100</SelectItem>\n </SelectContent>\n </Select>\n <span>per page</span>\n </div>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page - 1)}\n disabled={!hasPreviousPage}\n >\n <ChevronLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page + 1)}\n disabled={!hasNextPage}\n >\n Next\n <ChevronRight className=\"af-h-4 af-w-4 af-ml-1\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-flex af-h-9 af-w-full af-items-center af-justify-between af-whitespace-nowrap af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-2 af-text-sm af-shadow-sm af-ring-offset-background placeholder:af-text-muted-foreground focus:af-outline-none focus:af-ring-1 focus:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50 [&>span]:af-line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"af-h-4 af-w-4 af-opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronUp className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronDown className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'af-relative af-z-50 af-max-h-96 af-min-w-[8rem] af-overflow-hidden af-rounded-md af-border af-bg-popover af-text-popover-foreground af-shadow-md data-[state=open]:af-animate-in data-[state=closed]:af-animate-out data-[state=closed]:af-fade-out-0 data-[state=open]:af-fade-in-0 data-[state=closed]:af-zoom-out-95 data-[state=open]:af-zoom-in-95 data-[side=bottom]:af-slide-in-from-top-2 data-[side=left]:af-slide-in-from-right-2 data-[side=right]:af-slide-in-from-left-2 data-[side=top]:af-slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:af-translate-y-1 data-[side=left]:af--translate-x-1 data-[side=right]:af-translate-x-1 data-[side=top]:af--translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'af-p-1',\n position === 'popper' &&\n 'af-h-[var(--radix-select-trigger-height)] af-w-full af-min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('af-px-2 af-py-1.5 af-text-sm af-font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'af-relative af-flex af-w-full af-cursor-default af-select-none af-items-center af-rounded-sm af-py-1.5 af-pl-2 af-pr-8 af-text-sm af-outline-none focus:af-bg-accent focus:af-text-accent-foreground data-[disabled]:af-pointer-events-none data-[disabled]:af-opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"af-absolute af-right-2 af-flex af-h-3.5 af-w-3.5 af-items-center af-justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('af--mx-1 af-my-1 af-h-px af-bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type {\n Submission,\n PaginatedSubmissions,\n GetSubmissionsOptions,\n} from '../types'\n\nexport interface UseSubmissionsReturn {\n submissions: Submission[]\n total: number\n isLoading: boolean\n error: Error | null\n page: number\n pageSize: number\n hasNextPage: boolean\n hasPreviousPage: boolean\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n refetch: () => Promise<void>\n deleteSubmission: (submissionId: string) => Promise<void>\n}\n\nexport interface UseSubmissionsOptions {\n formId: string\n initialPageSize?: number\n}\n\nexport function useSubmissions({\n formId,\n initialPageSize = 25,\n}: UseSubmissionsOptions): UseSubmissionsReturn {\n const { api } = useAifeaturesContext()\n const [submissions, setSubmissions] = React.useState<Submission[]>([])\n const [total, setTotal] = React.useState(0)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n const [page, setPage] = React.useState(0)\n const [pageSize, setPageSize] = React.useState(initialPageSize)\n\n const fetchSubmissions = React.useCallback(async () => {\n if (!formId) return\n\n try {\n setIsLoading(true)\n setError(null)\n const options: GetSubmissionsOptions = {\n limit: pageSize,\n offset: page * pageSize,\n }\n const data: PaginatedSubmissions = await api.getSubmissions(\n formId,\n options\n )\n setSubmissions(data.submissions)\n setTotal(data.total)\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error('Failed to fetch submissions')\n )\n } finally {\n setIsLoading(false)\n }\n }, [api, formId, page, pageSize])\n\n React.useEffect(() => {\n fetchSubmissions()\n }, [fetchSubmissions])\n\n const deleteSubmission = React.useCallback(\n async (submissionId: string): Promise<void> => {\n await api.deleteSubmission(submissionId)\n setSubmissions((prev) => prev.filter((s) => s.id !== submissionId))\n setTotal((prev) => prev - 1)\n },\n [api]\n )\n\n const totalPages = Math.ceil(total / pageSize)\n\n return {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage: page < totalPages - 1,\n hasPreviousPage: page > 0,\n setPage,\n setPageSize: (size: number) => {\n setPageSize(size)\n setPage(0) // Reset to first page when page size changes\n },\n refetch: fetchSubmissions,\n deleteSubmission,\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Download, Globe, Clock, FileText, Loader2, Monitor, Mail } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Submission } from '../types'\n\nexport interface SubmissionDetailProps {\n submission: Submission\n onBack: () => void\n}\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`\n}\n\nexport function SubmissionDetail({\n submission,\n onBack,\n}: SubmissionDetailProps) {\n const { api } = useAifeaturesContext()\n const [downloadingFile, setDownloadingFile] = React.useState<string | null>(null)\n\n const handleDownload = async (filename: string) => {\n setDownloadingFile(filename)\n try {\n await api.downloadAttachment(submission.id, filename)\n } catch (error) {\n console.error('Download failed:', error)\n } finally {\n setDownloadingFile(null)\n }\n }\n\n const dataEntries = Object.entries(submission.data).filter(\n ([key]) => !key.startsWith('_')\n )\n\n return (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Submissions\n </Button>\n <h3 className=\"af-text-lg af-font-semibold\">Submission Details</h3>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Submitted {formatDate(submission.metadata.submitted_at)}\n </p>\n </div>\n\n <div className=\"af-space-y-6\">\n {/* Form Data */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Form Data</h4>\n <div className=\"af-space-y-3\">\n {dataEntries.map(([key, value]) => (\n <div key={key} className=\"af-grid af-grid-cols-3 af-gap-2\">\n <div className=\"af-text-sm af-text-muted-foreground af-capitalize\">\n {key.replace(/_/g, ' ')}\n </div>\n <div className=\"af-col-span-2 af-text-sm af-break-words\">\n {typeof value === 'string' && value.includes('\\n') ? (\n <pre className=\"af-whitespace-pre-wrap af-font-sans af-bg-muted af-p-2 af-rounded af-text-xs\">\n {value}\n </pre>\n ) : (\n String(value)\n )}\n </div>\n </div>\n ))}\n {dataEntries.length === 0 && (\n <p className=\"af-text-sm af-text-muted-foreground\">No data submitted</p>\n )}\n </div>\n </div>\n\n {/* Attachments */}\n {submission.attachments.length > 0 && (\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Attachments</h4>\n <div className=\"af-space-y-2\">\n {submission.attachments.map((attachment, index) => (\n <div\n key={index}\n className=\"af-flex af-items-center af-justify-between af-p-2 af-bg-muted af-rounded\"\n >\n <div className=\"af-flex af-items-center af-gap-2\">\n <FileText className=\"af-h-4 af-w-4 af-text-muted-foreground\" />\n <span className=\"af-text-sm\">{attachment.name}</span>\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({formatBytes(attachment.size)})\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleDownload(attachment.name)}\n disabled={downloadingFile === attachment.name}\n >\n {downloadingFile === attachment.name ? (\n <Loader2 className=\"af-h-4 af-w-4 af-mr-1 af-animate-spin\" />\n ) : (\n <Download className=\"af-h-4 af-w-4 af-mr-1\" />\n )}\n {downloadingFile === attachment.name ? 'Downloading...' : 'Download'}\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Metadata */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Metadata</h4>\n <div className=\"af-space-y-2 af-text-sm\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Clock className=\"af-h-4 af-w-4\" />\n <span>{formatDate(submission.metadata.submitted_at)}</span>\n </div>\n {submission.metadata.ip_address && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Globe className=\"af-h-4 af-w-4\" />\n <span>IP: {submission.metadata.ip_address}</span>\n </div>\n )}\n {submission.metadata.user_agent && (\n <div className=\"af-flex af-items-start af-gap-2 af-text-muted-foreground\">\n <Monitor className=\"af-h-4 af-w-4 af-mt-0.5\" />\n <span className=\"af-text-xs af-break-all\">\n {submission.metadata.user_agent}\n </span>\n </div>\n )}\n {submission.resend_id && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Mail className=\"af-h-4 af-w-4\" />\n <span>Email ID: {submission.resend_id}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Plus, X, Loader2, Check } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport { Badge } from '../ui/badge'\nimport { useForms } from '../hooks/useForms'\nimport type { Form, UpdateFormInput } from '../types'\n\nexport interface FormSettingsProps {\n /** The form to edit */\n form: Form\n /** Called when settings are saved */\n onSaved?: (form: Form) => void\n /** Optional className */\n className?: string\n}\n\nexport function FormSettings({ form, onSaved, className }: FormSettingsProps) {\n const { updateForm } = useForms()\n const [isSaving, setIsSaving] = React.useState(false)\n const [lastSaved, setLastSaved] = React.useState<Date | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n\n // Local form state\n const [name, setName] = React.useState(form.name)\n const [redirectUrl, setRedirectUrl] = React.useState(form.redirect_url || '')\n const [emailRecipients, setEmailRecipients] = React.useState<string[]>(\n form.email_recipients\n )\n const [newEmail, setNewEmail] = React.useState('')\n\n // Reset state when form changes\n React.useEffect(() => {\n setName(form.name)\n setRedirectUrl(form.redirect_url || '')\n setEmailRecipients(form.email_recipients)\n setError(null)\n }, [form])\n\n // Auto-save function\n const save = React.useCallback(\n async (updates: UpdateFormInput) => {\n try {\n setIsSaving(true)\n setError(null)\n const updatedForm = await updateForm(form.id, updates)\n setLastSaved(new Date())\n onSaved?.(updatedForm)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save')\n } finally {\n setIsSaving(false)\n }\n },\n [form.id, updateForm, onSaved]\n )\n\n // Clear \"saved\" indicator after 2 seconds\n React.useEffect(() => {\n if (lastSaved) {\n const timer = setTimeout(() => setLastSaved(null), 2000)\n return () => clearTimeout(timer)\n }\n }, [lastSaved])\n\n const handleAddEmail = async () => {\n const email = newEmail.trim().toLowerCase()\n if (!email) return\n if (!email.includes('@')) {\n setError('Please enter a valid email address')\n return\n }\n if (emailRecipients.includes(email)) {\n setError('This email is already added')\n return\n }\n const newRecipients = [...emailRecipients, email]\n setEmailRecipients(newRecipients)\n setNewEmail('')\n setError(null)\n await save({ email_recipients: newRecipients })\n }\n\n const handleRemoveEmail = async (email: string) => {\n const newRecipients = emailRecipients.filter((e) => e !== email)\n setEmailRecipients(newRecipients)\n await save({ email_recipients: newRecipients })\n }\n\n // Save text fields on blur\n const handleNameBlur = async () => {\n if (name !== form.name) {\n await save({ name })\n }\n }\n\n const handleRedirectBlur = async () => {\n const newValue = redirectUrl || null\n if (newValue !== form.redirect_url) {\n await save({ redirect_url: newValue })\n }\n }\n\n return (\n <div className={`af-space-y-6 af-relative ${className || ''}`}>\n {/* Toast notification */}\n {(isSaving || lastSaved) && (\n <div className=\"aifeatures-admin af-fixed af-bottom-4 af-right-4 af-z-50\">\n {isSaving ? (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-background af-border af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Loader2 className=\"af-h-4 af-w-4 af-animate-spin af-text-muted-foreground\" />\n <span className=\"af-text-sm\">Saving...</span>\n </div>\n ) : (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-green-50 af-border af-border-green-200 af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Check className=\"af-h-4 af-w-4 af-text-green-600\" />\n <span className=\"af-text-sm af-text-green-800\">Changes saved</span>\n </div>\n )}\n </div>\n )}\n\n {/* Form Name */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"form-name\">Form Name</Label>\n <Input\n id=\"form-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={handleNameBlur}\n placeholder=\"Contact Form\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n A name to identify this form in your dashboard.\n </p>\n </div>\n\n {/* Email Recipients */}\n <div className=\"af-space-y-2\">\n <Label>Email Recipients</Label>\n <p className=\"af-text-xs af-text-muted-foreground af-mb-2\">\n Form submissions will be sent to these email addresses.\n </p>\n <div className=\"af-flex af-flex-wrap af-gap-2 af-mb-2\">\n {emailRecipients.map((email) => (\n <Badge key={email} variant=\"secondary\" className=\"af-gap-1\">\n {email}\n <button\n type=\"button\"\n onClick={() => handleRemoveEmail(email)}\n className=\"af-ml-1 hover:af-text-destructive\"\n disabled={isSaving}\n >\n <X className=\"af-h-3 af-w-3\" />\n </button>\n </Badge>\n ))}\n {emailRecipients.length === 0 && (\n <span className=\"af-text-sm af-text-muted-foreground af-italic\">\n No recipients configured\n </span>\n )}\n </div>\n <div className=\"af-flex af-gap-2\">\n <Input\n type=\"email\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder=\"Add email address\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleAddEmail()\n }\n }}\n disabled={isSaving}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddEmail}\n disabled={!newEmail.trim() || isSaving}\n >\n <Plus className=\"af-h-4 af-w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Redirect URL */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"redirect-url\">Redirect URL</Label>\n <Input\n id=\"redirect-url\"\n value={redirectUrl}\n onChange={(e) => setRedirectUrl(e.target.value)}\n onBlur={handleRedirectBlur}\n placeholder=\"/thank-you\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n URL to redirect visitors to after successful submission. Leave empty\n for a default success page.\n </p>\n </div>\n\n {/* Form Endpoint (read-only) */}\n <div className=\"af-space-y-2\">\n <Label>Form Endpoint</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <code className=\"af-flex-1 af-text-xs af-bg-muted af-px-3 af-py-2 af-rounded af-border\">\n {form.endpoint_url}\n </code>\n </div>\n <p className=\"af-text-xs af-text-muted-foreground\">\n Use this URL as the form action attribute.\n </p>\n </div>\n\n {/* Captcha Status (read-only for now) */}\n <div className=\"af-space-y-2\">\n <Label>Captcha Protection</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Badge variant={form.captcha.enabled ? 'success' : 'secondary'}>\n {form.captcha.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n {form.captcha.enabled && form.captcha.provider && (\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({form.captcha.provider})\n </span>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"af-text-sm af-text-destructive af-bg-destructive/10 af-px-3 af-py-2 af-rounded\">\n {error}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'af-flex af-h-9 af-w-full af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-1 af-text-sm af-shadow-sm af-transition-colors file:af-border-0 file:af-bg-transparent file:af-text-sm file:af-font-medium file:af-text-foreground placeholder:af-text-muted-foreground focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst labelVariants = cva(\n 'af-text-sm af-font-medium af-leading-none peer-disabled:af-cursor-not-allowed peer-disabled:af-opacity-70'\n)\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label ref={ref} className={cn(labelVariants(), className)} {...props} />\n )\n)\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst badgeVariants = cva(\n 'af-inline-flex af-items-center af-rounded-md af-border af-px-2.5 af-py-0.5 af-text-xs af-font-semibold af-transition-colors focus:af-outline-none focus:af-ring-2 focus:af-ring-ring focus:af-ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'af-border-transparent af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/80',\n secondary:\n 'af-border-transparent af-bg-secondary af-text-secondary-foreground hover:af-bg-secondary/80',\n destructive:\n 'af-border-transparent af-bg-destructive af-text-destructive-foreground af-shadow hover:af-bg-destructive/80',\n outline: 'af-text-foreground',\n success:\n 'af-border-transparent af-bg-green-100 af-text-green-800',\n warning:\n 'af-border-transparent af-bg-yellow-100 af-text-yellow-800',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":"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","names":["React","ArrowLeft","Settings","Inbox","React","jsx","React","jsx","React","jsx","React","jsx","jsxs","React","Inbox","React","jsx","jsxs","jsxs","jsx","React","React","jsx","jsxs","jsx","jsxs","formatDate","Inbox","React","Loader2","Check","React","jsx","React","cva","jsx","cva","Label","cva","jsx","cva","jsx","jsxs","Loader2","Check","Label","jsx","jsxs","ArrowLeft","Inbox","Settings"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider/AifeaturesProvider.tsx","../src/lib/api.ts","../src/components/FormsDashboard.tsx","../src/ui/tabs.tsx","../src/lib/cn.ts","../src/ui/button.tsx","../src/components/FormsList.tsx","../src/ui/table.tsx","../src/hooks/useForms.ts","../src/components/FormSubmissions.tsx","../src/ui/select.tsx","../src/hooks/useSubmissions.ts","../src/components/SubmissionDetail.tsx","../src/components/FormSettings.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/badge.tsx"],"sourcesContent":["import * as React from 'react'\nimport { createApiClient, type AifeaturesApiClient } from '../lib/api'\n\nexport interface AifeaturesContextValue {\n siteToken: string\n apiUrl: string\n api: AifeaturesApiClient\n}\n\nconst AifeaturesContext = React.createContext<AifeaturesContextValue | null>(\n null\n)\n\nexport interface AifeaturesProviderProps {\n /** Site-scoped API token from aifeatures */\n siteToken: string\n /** API URL (defaults to https://aifeatures.dev) */\n apiUrl?: string\n /** Optional dark mode */\n dark?: boolean\n /** Optional className for the wrapper */\n className?: string\n children: React.ReactNode\n}\n\n/**\n * Validates the token and returns an error message if invalid\n */\nfunction validateToken(token: string): string | null {\n if (!token) {\n return 'No siteToken provided to AifeaturesProvider'\n }\n\n if (token.startsWith('sk_')) {\n return 'Invalid token type: You passed an organization API key (sk_xxx) but AifeaturesProvider requires a site token (st_xxx). Site tokens are returned when you create a site via the API.'\n }\n\n if (!token.startsWith('st_')) {\n return `Invalid token format: Expected a site token starting with \"st_\" but got \"${token.slice(0, 10)}...\". Site tokens are returned when you create a site via the API.`\n }\n\n return null\n}\n\nexport function AifeaturesProvider({\n siteToken,\n apiUrl = 'https://aifeatures.dev',\n dark = false,\n className,\n children,\n}: AifeaturesProviderProps) {\n // Validate token on mount and when it changes\n const tokenError = React.useMemo(() => validateToken(siteToken), [siteToken])\n\n const api = React.useMemo(\n () => createApiClient(siteToken, apiUrl),\n [siteToken, apiUrl]\n )\n\n const value = React.useMemo(\n () => ({\n siteToken,\n apiUrl,\n api,\n }),\n [siteToken, apiUrl, api]\n )\n\n // Show error UI if token is invalid\n if (tokenError) {\n return (\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n <div className=\"af-rounded-md af-border af-border-destructive af-bg-destructive/10 af-p-4\">\n <h3 className=\"af-text-sm af-font-semibold af-text-destructive af-mb-2\">\n AifeaturesProvider Configuration Error\n </h3>\n <p className=\"af-text-sm af-text-destructive\">\n {tokenError}\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <AifeaturesContext.Provider value={value}>\n <div className={`aifeatures-admin ${dark ? 'dark' : ''} ${className || ''}`}>\n {children}\n </div>\n </AifeaturesContext.Provider>\n )\n}\n\nexport function useAifeaturesContext(): AifeaturesContextValue {\n const context = React.useContext(AifeaturesContext)\n if (!context) {\n throw new Error(\n 'useAifeaturesContext must be used within an AifeaturesProvider'\n )\n }\n return context\n}\n\nexport { AifeaturesContext }\n","import type {\n Form,\n Submission,\n FormsListResponse,\n PaginatedSubmissions,\n CreateFormInput,\n UpdateFormInput,\n GetSubmissionsOptions,\n ApiError,\n} from '../types'\n\nexport class AifeaturesApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public details?: ApiError\n ) {\n super(message)\n this.name = 'AifeaturesApiError'\n }\n}\n\nexport interface AifeaturesApiClient {\n // Forms\n getForms(): Promise<Form[]>\n getForm(formId: string): Promise<Form>\n createForm(input: CreateFormInput): Promise<Form>\n updateForm(formId: string, input: UpdateFormInput): Promise<Form>\n deleteForm(formId: string): Promise<void>\n\n // Submissions\n getSubmissions(\n formId: string,\n options?: GetSubmissionsOptions\n ): Promise<PaginatedSubmissions>\n getSubmission(submissionId: string): Promise<Submission>\n deleteSubmission(submissionId: string): Promise<void>\n\n // Attachments\n downloadAttachment(submissionId: string, filename: string): Promise<void>\n}\n\nexport function createApiClient(\n siteToken: string,\n apiUrl: string = 'https://aifeatures.dev'\n): AifeaturesApiClient {\n async function request<T>(\n path: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${apiUrl}${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Request failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T\n }\n\n return response.json()\n }\n\n return {\n // Forms\n async getForms(): Promise<Form[]> {\n const data = await request<FormsListResponse>('/api/v1/forms')\n return data.forms\n },\n\n async getForm(formId: string): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`)\n },\n\n async createForm(input: CreateFormInput): Promise<Form> {\n return request<Form>('/api/v1/forms', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n },\n\n async updateForm(formId: string, input: UpdateFormInput): Promise<Form> {\n return request<Form>(`/api/v1/forms/${formId}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n })\n },\n\n async deleteForm(formId: string): Promise<void> {\n await request<void>(`/api/v1/forms/${formId}`, {\n method: 'DELETE',\n })\n },\n\n // Submissions\n async getSubmissions(\n formId: string,\n options: GetSubmissionsOptions = {}\n ): Promise<PaginatedSubmissions> {\n const params = new URLSearchParams()\n if (options.limit !== undefined) {\n params.set('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.set('offset', String(options.offset))\n }\n const query = params.toString()\n const path = `/api/v1/forms/${formId}/submissions${query ? `?${query}` : ''}`\n return request<PaginatedSubmissions>(path)\n },\n\n async getSubmission(submissionId: string): Promise<Submission> {\n return request<Submission>(`/api/v1/submissions/${submissionId}`)\n },\n\n async deleteSubmission(submissionId: string): Promise<void> {\n await request<void>(`/api/v1/submissions/${submissionId}`, {\n method: 'DELETE',\n })\n },\n\n // Attachments\n async downloadAttachment(submissionId: string, filename: string): Promise<void> {\n const url = `${apiUrl}/api/v1/submissions/${submissionId}/attachments/${encodeURIComponent(filename)}`\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${siteToken}`,\n },\n })\n\n if (!response.ok) {\n let details: ApiError | undefined\n try {\n details = await response.json()\n } catch {\n // Ignore JSON parse errors\n }\n throw new AifeaturesApiError(\n details?.error || `Download failed with status ${response.status}`,\n response.status,\n details\n )\n }\n\n // Create blob and trigger download\n const blob = await response.blob()\n const blobUrl = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(blobUrl)\n },\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Settings, Inbox } from 'lucide-react'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'\nimport { Button } from '../ui/button'\nimport { FormsList } from './FormsList'\nimport { FormSubmissions } from './FormSubmissions'\nimport { FormSettings } from './FormSettings'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Form } from '../types'\n\nexport interface FormsDashboardProps {\n /** Optional className */\n className?: string\n /** Submission ID to deep link to (opens form and shows submission detail) */\n submissionId?: string\n}\n\ntype View = 'list' | 'detail'\n\nexport function FormsDashboard({ className, submissionId }: FormsDashboardProps) {\n const { api } = useAifeaturesContext()\n const [view, setView] = React.useState<View>('list')\n const [selectedForm, setSelectedForm] = React.useState<Form | null>(null)\n const [activeTab, setActiveTab] = React.useState<'submissions' | 'settings'>(\n 'submissions'\n )\n const [deepLinkSubmissionId, setDeepLinkSubmissionId] = React.useState<string | undefined>(submissionId)\n const [isLoadingDeepLink, setIsLoadingDeepLink] = React.useState(!!submissionId)\n\n // Handle deep linking to a submission\n React.useEffect(() => {\n if (!submissionId) return\n\n async function loadSubmission() {\n try {\n // Fetch the submission to get its form_id\n const submission = await api.getSubmission(submissionId!)\n // Fetch the form\n const form = await api.getForm(submission.form_id)\n // Navigate to the form with the submission selected\n setSelectedForm(form)\n setView('detail')\n setActiveTab('submissions')\n setDeepLinkSubmissionId(submissionId)\n } catch (error) {\n console.error('Failed to load submission for deep link:', error)\n } finally {\n setIsLoadingDeepLink(false)\n }\n }\n\n loadSubmission()\n }, [submissionId, api])\n\n const handleSelectForm = (form: Form, tab: 'submissions' | 'settings') => {\n setSelectedForm(form)\n setView('detail')\n setActiveTab(tab)\n setDeepLinkSubmissionId(undefined) // Clear deep link when manually selecting\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedForm(null)\n setDeepLinkSubmissionId(undefined)\n }\n\n const handleFormSaved = (updatedForm: Form) => {\n setSelectedForm(updatedForm)\n }\n\n if (isLoadingDeepLink) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading...</div>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {view === 'list' && (\n <div>\n <div className=\"af-mb-6\">\n <h2 className=\"af-text-lg af-font-semibold\">Forms</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Manage your contact forms and view submissions.\n </p>\n </div>\n <FormsList onSelectForm={handleSelectForm} />\n </div>\n )}\n\n {view === 'detail' && selectedForm && (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Forms\n </Button>\n <h2 className=\"af-text-lg af-font-semibold\">{selectedForm.name}</h2>\n <p className=\"af-text-sm af-text-muted-foreground\">\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {selectedForm.endpoint_url}\n </code>\n </p>\n </div>\n\n {/* Tabs for submissions and settings */}\n <Tabs\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as 'submissions' | 'settings')}\n >\n <TabsList className=\"af-mb-4\">\n <TabsTrigger value=\"submissions\" className=\"af-gap-2\">\n <Inbox className=\"af-h-4 af-w-4\" />\n Submissions\n </TabsTrigger>\n <TabsTrigger value=\"settings\" className=\"af-gap-2\">\n <Settings className=\"af-h-4 af-w-4\" />\n Settings\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"submissions\">\n <FormSubmissions formId={selectedForm.id} defaultSubmissionId={deepLinkSubmissionId} />\n </TabsContent>\n\n <TabsContent value=\"settings\">\n <FormSettings form={selectedForm} onSaved={handleFormSaved} />\n </TabsContent>\n </Tabs>\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/cn'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'af-inline-flex af-h-9 af-items-center af-justify-center af-rounded-lg af-bg-muted af-p-1 af-text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-inline-flex af-items-center af-justify-center af-whitespace-nowrap af-rounded-md af-px-3 af-py-1 af-text-sm af-font-medium af-ring-offset-background af-transition-all focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2 disabled:af-pointer-events-none disabled:af-opacity-50 data-[state=active]:af-bg-background data-[state=active]:af-text-foreground data-[state=active]:af-shadow',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'af-mt-2 af-ring-offset-background focus-visible:af-outline-none focus-visible:af-ring-2 focus-visible:af-ring-ring focus-visible:af-ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst buttonVariants = cva(\n 'af-inline-flex af-items-center af-justify-center af-gap-2 af-whitespace-nowrap af-rounded-md af-text-sm af-font-medium af-transition-colors focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-pointer-events-none disabled:af-opacity-50 [&_svg]:af-pointer-events-none [&_svg]:af-size-4 [&_svg]:af-shrink-0',\n {\n variants: {\n variant: {\n default:\n 'af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/90',\n destructive:\n 'af-bg-destructive af-text-destructive-foreground af-shadow-sm hover:af-bg-destructive/90',\n outline:\n 'af-border af-border-input af-bg-background af-shadow-sm hover:af-bg-accent hover:af-text-accent-foreground',\n secondary:\n 'af-bg-secondary af-text-secondary-foreground af-shadow-sm hover:af-bg-secondary/80',\n ghost: 'hover:af-bg-accent hover:af-text-accent-foreground',\n link: 'af-text-primary af-underline-offset-4 hover:af-underline',\n },\n size: {\n default: 'af-h-9 af-px-4 af-py-2',\n sm: 'af-h-8 af-rounded-md af-px-3 af-text-xs',\n lg: 'af-h-10 af-rounded-md af-px-8',\n icon: 'af-h-9 af-w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n 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 return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\nimport { Inbox, Settings } from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport { useForms } from '../hooks/useForms'\nimport type { Form } from '../types'\n\nexport interface FormsListProps {\n /** Called when a form is selected */\n onSelectForm?: (form: Form, tab: 'submissions' | 'settings') => void\n /** Optional className */\n className?: string\n}\n\nexport function FormsList({ onSelectForm, className }: FormsListProps) {\n const { forms, isLoading, error } = useForms()\n\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading forms...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (forms.length === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No forms yet.\n <br />\n Forms will appear here when the AI creates contact forms on your website.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Endpoint</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {forms.map((form) => (\n <TableRow key={form.id}>\n <TableCell className=\"af-font-medium\">{form.name}</TableCell>\n <TableCell>\n <code className=\"af-text-xs af-bg-muted af-px-1.5 af-py-0.5 af-rounded\">\n {form.endpoint_url.replace('https://aifeatures.dev', '')}\n </code>\n </TableCell>\n <TableCell className=\"af-text-right\">\n <div className=\"af-flex af-items-center af-justify-end af-gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'submissions')}\n >\n <Inbox className=\"af-h-4 af-w-4 af-mr-1\" />\n Submissions\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSelectForm?.(form, 'settings')}\n >\n <Settings className=\"af-h-4 af-w-4 af-mr-1\" />\n Settings\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"af-relative af-w-full af-overflow-auto\">\n <table\n ref={ref}\n className={cn('af-w-full af-caption-bottom af-text-sm', className)}\n {...props}\n />\n </div>\n))\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:af-border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn('[&_tr:last-child]:af-border-0', className)}\n {...props}\n />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'af-border-t af-bg-muted/50 af-font-medium [&>tr]:last:af-border-b-0',\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'af-border-b af-transition-colors hover:af-bg-muted/50 data-[state=selected]:af-bg-muted',\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'af-h-10 af-px-2 af-text-left af-align-middle af-font-medium af-text-muted-foreground [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'af-p-2 af-align-middle [&:has([role=checkbox])]:af-pr-0 [&>[role=checkbox]]:af-translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn('af-mt-4 af-text-sm af-text-muted-foreground', className)}\n {...props}\n />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Form, CreateFormInput, UpdateFormInput } from '../types'\n\nexport interface UseFormsReturn {\n forms: Form[]\n isLoading: boolean\n error: Error | null\n refetch: () => Promise<void>\n createForm: (input: CreateFormInput) => Promise<Form>\n updateForm: (formId: string, input: UpdateFormInput) => Promise<Form>\n deleteForm: (formId: string) => Promise<void>\n}\n\nexport function useForms(): UseFormsReturn {\n const { api } = useAifeaturesContext()\n const [forms, setForms] = React.useState<Form[]>([])\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n\n const fetchForms = React.useCallback(async () => {\n try {\n setIsLoading(true)\n setError(null)\n const data = await api.getForms()\n setForms(data)\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch forms'))\n } finally {\n setIsLoading(false)\n }\n }, [api])\n\n React.useEffect(() => {\n fetchForms()\n }, [fetchForms])\n\n const createForm = React.useCallback(\n async (input: CreateFormInput): Promise<Form> => {\n const form = await api.createForm(input)\n setForms((prev) => [...prev, form])\n return form\n },\n [api]\n )\n\n const updateForm = React.useCallback(\n async (formId: string, input: UpdateFormInput): Promise<Form> => {\n const form = await api.updateForm(formId, input)\n setForms((prev) => prev.map((f) => (f.id === formId ? form : f)))\n return form\n },\n [api]\n )\n\n const deleteForm = React.useCallback(\n async (formId: string): Promise<void> => {\n await api.deleteForm(formId)\n setForms((prev) => prev.filter((f) => f.id !== formId))\n },\n [api]\n )\n\n return {\n forms,\n isLoading,\n error,\n refetch: fetchForms,\n createForm,\n updateForm,\n deleteForm,\n }\n}\n","import * as React from 'react'\nimport {\n ChevronLeft,\n ChevronRight,\n Eye,\n Inbox,\n Paperclip,\n} from 'lucide-react'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { useSubmissions } from '../hooks/useSubmissions'\nimport { SubmissionDetail } from './SubmissionDetail'\nimport type { Submission } from '../types'\n\nexport interface FormSubmissionsProps {\n /** The form ID to show submissions for */\n formId: string\n /** Optional className */\n className?: string\n /** Submission ID to auto-open in detail view */\n defaultSubmissionId?: string\n}\n\ntype View = 'list' | 'detail'\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction getEmailFromData(data: Record<string, unknown>): string | null {\n // Try common email field names\n const emailFields = ['email', 'Email', 'EMAIL', 'e-mail', 'mail']\n for (const field of emailFields) {\n if (typeof data[field] === 'string') {\n return data[field] as string\n }\n }\n return null\n}\n\nfunction getPreviewText(data: Record<string, unknown>): string {\n // Get first non-email, non-internal field as preview\n const entries = Object.entries(data).filter(\n ([key]) => !key.startsWith('_') && !key.toLowerCase().includes('email')\n )\n if (entries.length === 0) return ''\n\n const [, value] = entries[0]\n const text = String(value)\n return text.length > 50 ? text.slice(0, 50) + '...' : text\n}\n\nexport function FormSubmissions({ formId, className, defaultSubmissionId }: FormSubmissionsProps) {\n const {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage,\n hasPreviousPage,\n setPage,\n setPageSize,\n } = useSubmissions({ formId })\n\n const [view, setView] = React.useState<View>('list')\n const [selectedSubmission, setSelectedSubmission] =\n React.useState<Submission | null>(null)\n\n // Auto-open submission detail if defaultSubmissionId is provided\n React.useEffect(() => {\n if (defaultSubmissionId && submissions.length > 0) {\n const submission = submissions.find(s => s.id === defaultSubmissionId)\n if (submission) {\n setSelectedSubmission(submission)\n setView('detail')\n }\n }\n }, [defaultSubmissionId, submissions])\n\n const handleViewSubmission = (submission: Submission) => {\n setSelectedSubmission(submission)\n setView('detail')\n }\n\n const handleBack = () => {\n setView('list')\n setSelectedSubmission(null)\n }\n\n // Show detail view\n if (view === 'detail' && selectedSubmission) {\n return (\n <div className={className}>\n <SubmissionDetail\n submission={selectedSubmission}\n onBack={handleBack}\n />\n </div>\n )\n }\n\n // Show list view\n if (isLoading) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-muted-foreground\">Loading submissions...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`af-flex af-items-center af-justify-center af-py-8 ${className || ''}`}>\n <div className=\"af-text-destructive\">Error: {error.message}</div>\n </div>\n )\n }\n\n if (submissions.length === 0 && page === 0) {\n return (\n <div className={`af-flex af-flex-col af-items-center af-justify-center af-py-12 ${className || ''}`}>\n <Inbox className=\"af-h-12 af-w-12 af-text-muted-foreground af-mb-4\" />\n <p className=\"af-text-muted-foreground af-text-center\">\n No submissions yet.\n <br />\n Submissions will appear here when visitors use your form.\n </p>\n </div>\n )\n }\n\n const startIndex = page * pageSize + 1\n const endIndex = Math.min((page + 1) * pageSize, total)\n\n return (\n <div className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Email</TableHead>\n <TableHead>Preview</TableHead>\n <TableHead>Date</TableHead>\n <TableHead className=\"af-text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {submissions.map((submission) => {\n const email = getEmailFromData(submission.data)\n const preview = getPreviewText(submission.data)\n\n return (\n <TableRow key={submission.id}>\n <TableCell className=\"af-font-medium\">\n <div className=\"af-flex af-items-center af-gap-2\">\n {email || (\n <span className=\"af-text-muted-foreground af-italic\">No email</span>\n )}\n {submission.attachments.length > 0 && (\n <span className=\"af-flex af-items-center af-gap-1 af-text-muted-foreground\" title={`${submission.attachments.length} attachment(s)`}>\n <Paperclip className=\"af-h-3 af-w-3\" />\n <span className=\"af-text-xs\">{submission.attachments.length}</span>\n </span>\n )}\n </div>\n </TableCell>\n <TableCell className=\"af-text-muted-foreground af-max-w-[200px] af-truncate\">\n {preview || (\n <span className=\"af-italic\">No preview available</span>\n )}\n </TableCell>\n <TableCell className=\"af-text-muted-foreground\">\n {formatDate(submission.metadata.submitted_at)}\n </TableCell>\n <TableCell className=\"af-text-right\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleViewSubmission(submission)}\n title=\"View details\"\n >\n <Eye className=\"af-h-4 af-w-4\" />\n </Button>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n\n {/* Pagination */}\n <div className=\"af-flex af-items-center af-justify-between af-px-2 af-py-4\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-sm af-text-muted-foreground\">\n <span>\n Showing {startIndex}-{endIndex} of {total}\n </span>\n <Select\n value={String(pageSize)}\n onValueChange={(value) => setPageSize(Number(value))}\n >\n <SelectTrigger className=\"af-w-[70px] af-h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"10\">10</SelectItem>\n <SelectItem value=\"25\">25</SelectItem>\n <SelectItem value=\"50\">50</SelectItem>\n <SelectItem value=\"100\">100</SelectItem>\n </SelectContent>\n </Select>\n <span>per page</span>\n </div>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page - 1)}\n disabled={!hasPreviousPage}\n >\n <ChevronLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage(page + 1)}\n disabled={!hasNextPage}\n >\n Next\n <ChevronRight className=\"af-h-4 af-w-4 af-ml-1\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'af-flex af-h-9 af-w-full af-items-center af-justify-between af-whitespace-nowrap af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-2 af-text-sm af-shadow-sm af-ring-offset-background placeholder:af-text-muted-foreground focus:af-outline-none focus:af-ring-1 focus:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50 [&>span]:af-line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"af-h-4 af-w-4 af-opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronUp className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n 'af-flex af-cursor-default af-items-center af-justify-center af-py-1',\n className\n )}\n {...props}\n >\n <ChevronDown className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'af-relative af-z-50 af-max-h-96 af-min-w-[8rem] af-overflow-hidden af-rounded-md af-border af-bg-popover af-text-popover-foreground af-shadow-md data-[state=open]:af-animate-in data-[state=closed]:af-animate-out data-[state=closed]:af-fade-out-0 data-[state=open]:af-fade-in-0 data-[state=closed]:af-zoom-out-95 data-[state=open]:af-zoom-in-95 data-[side=bottom]:af-slide-in-from-top-2 data-[side=left]:af-slide-in-from-right-2 data-[side=right]:af-slide-in-from-left-2 data-[side=top]:af-slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:af-translate-y-1 data-[side=left]:af--translate-x-1 data-[side=right]:af-translate-x-1 data-[side=top]:af--translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'af-p-1',\n position === 'popper' &&\n 'af-h-[var(--radix-select-trigger-height)] af-w-full af-min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('af-px-2 af-py-1.5 af-text-sm af-font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'af-relative af-flex af-w-full af-cursor-default af-select-none af-items-center af-rounded-sm af-py-1.5 af-pl-2 af-pr-8 af-text-sm af-outline-none focus:af-bg-accent focus:af-text-accent-foreground data-[disabled]:af-pointer-events-none data-[disabled]:af-opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"af-absolute af-right-2 af-flex af-h-3.5 af-w-3.5 af-items-center af-justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"af-h-4 af-w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('af--mx-1 af-my-1 af-h-px af-bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from 'react'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type {\n Submission,\n PaginatedSubmissions,\n GetSubmissionsOptions,\n} from '../types'\n\nexport interface UseSubmissionsReturn {\n submissions: Submission[]\n total: number\n isLoading: boolean\n error: Error | null\n page: number\n pageSize: number\n hasNextPage: boolean\n hasPreviousPage: boolean\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n refetch: () => Promise<void>\n deleteSubmission: (submissionId: string) => Promise<void>\n}\n\nexport interface UseSubmissionsOptions {\n formId: string\n initialPageSize?: number\n}\n\nexport function useSubmissions({\n formId,\n initialPageSize = 25,\n}: UseSubmissionsOptions): UseSubmissionsReturn {\n const { api } = useAifeaturesContext()\n const [submissions, setSubmissions] = React.useState<Submission[]>([])\n const [total, setTotal] = React.useState(0)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<Error | null>(null)\n const [page, setPage] = React.useState(0)\n const [pageSize, setPageSize] = React.useState(initialPageSize)\n\n const fetchSubmissions = React.useCallback(async () => {\n if (!formId) return\n\n try {\n setIsLoading(true)\n setError(null)\n const options: GetSubmissionsOptions = {\n limit: pageSize,\n offset: page * pageSize,\n }\n const data: PaginatedSubmissions = await api.getSubmissions(\n formId,\n options\n )\n setSubmissions(data.submissions)\n setTotal(data.total)\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error('Failed to fetch submissions')\n )\n } finally {\n setIsLoading(false)\n }\n }, [api, formId, page, pageSize])\n\n React.useEffect(() => {\n fetchSubmissions()\n }, [fetchSubmissions])\n\n const deleteSubmission = React.useCallback(\n async (submissionId: string): Promise<void> => {\n await api.deleteSubmission(submissionId)\n setSubmissions((prev) => prev.filter((s) => s.id !== submissionId))\n setTotal((prev) => prev - 1)\n },\n [api]\n )\n\n const totalPages = Math.ceil(total / pageSize)\n\n return {\n submissions,\n total,\n isLoading,\n error,\n page,\n pageSize,\n hasNextPage: page < totalPages - 1,\n hasPreviousPage: page > 0,\n setPage,\n setPageSize: (size: number) => {\n setPageSize(size)\n setPage(0) // Reset to first page when page size changes\n },\n refetch: fetchSubmissions,\n deleteSubmission,\n }\n}\n","import * as React from 'react'\nimport { ArrowLeft, Download, Globe, Clock, FileText, Loader2, Monitor, Mail } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { useAifeaturesContext } from '../provider/AifeaturesProvider'\nimport type { Submission } from '../types'\n\nexport interface SubmissionDetailProps {\n submission: Submission\n onBack: () => void\n}\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`\n}\n\nexport function SubmissionDetail({\n submission,\n onBack,\n}: SubmissionDetailProps) {\n const { api } = useAifeaturesContext()\n const [downloadingFile, setDownloadingFile] = React.useState<string | null>(null)\n\n const handleDownload = async (filename: string) => {\n setDownloadingFile(filename)\n try {\n await api.downloadAttachment(submission.id, filename)\n } catch (error) {\n console.error('Download failed:', error)\n } finally {\n setDownloadingFile(null)\n }\n }\n\n const dataEntries = Object.entries(submission.data).filter(\n ([key]) => !key.startsWith('_')\n )\n\n return (\n <div>\n {/* Header with back button */}\n <div className=\"af-mb-6\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onBack}\n className=\"af-mb-2 af--ml-2\"\n >\n <ArrowLeft className=\"af-h-4 af-w-4 af-mr-1\" />\n Back to Submissions\n </Button>\n <h3 className=\"af-text-lg af-font-semibold\">Submission Details</h3>\n <p className=\"af-text-sm af-text-muted-foreground\">\n Submitted {formatDate(submission.metadata.submitted_at)}\n </p>\n </div>\n\n <div className=\"af-space-y-6\">\n {/* Form Data */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Form Data</h4>\n <div className=\"af-space-y-3\">\n {dataEntries.map(([key, value]) => (\n <div key={key} className=\"af-grid af-grid-cols-3 af-gap-2\">\n <div className=\"af-text-sm af-text-muted-foreground af-capitalize\">\n {key.replace(/_/g, ' ')}\n </div>\n <div className=\"af-col-span-2 af-text-sm af-break-words\">\n {typeof value === 'string' && value.includes('\\n') ? (\n <pre className=\"af-whitespace-pre-wrap af-font-sans af-bg-muted af-p-2 af-rounded af-text-xs\">\n {value}\n </pre>\n ) : (\n String(value)\n )}\n </div>\n </div>\n ))}\n {dataEntries.length === 0 && (\n <p className=\"af-text-sm af-text-muted-foreground\">No data submitted</p>\n )}\n </div>\n </div>\n\n {/* Attachments */}\n {submission.attachments.length > 0 && (\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Attachments</h4>\n <div className=\"af-space-y-2\">\n {submission.attachments.map((attachment, index) => (\n <div\n key={index}\n className=\"af-flex af-items-center af-justify-between af-p-2 af-bg-muted af-rounded\"\n >\n <div className=\"af-flex af-items-center af-gap-2\">\n <FileText className=\"af-h-4 af-w-4 af-text-muted-foreground\" />\n <span className=\"af-text-sm\">{attachment.name}</span>\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({formatBytes(attachment.size)})\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleDownload(attachment.name)}\n disabled={downloadingFile === attachment.name}\n >\n {downloadingFile === attachment.name ? (\n <Loader2 className=\"af-h-4 af-w-4 af-mr-1 af-animate-spin\" />\n ) : (\n <Download className=\"af-h-4 af-w-4 af-mr-1\" />\n )}\n {downloadingFile === attachment.name ? 'Downloading...' : 'Download'}\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Metadata */}\n <div>\n <h4 className=\"af-text-sm af-font-medium af-mb-3\">Metadata</h4>\n <div className=\"af-space-y-2 af-text-sm\">\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Clock className=\"af-h-4 af-w-4\" />\n <span>{formatDate(submission.metadata.submitted_at)}</span>\n </div>\n {submission.metadata.ip_address && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Globe className=\"af-h-4 af-w-4\" />\n <span>IP: {submission.metadata.ip_address}</span>\n </div>\n )}\n {submission.metadata.user_agent && (\n <div className=\"af-flex af-items-start af-gap-2 af-text-muted-foreground\">\n <Monitor className=\"af-h-4 af-w-4 af-mt-0.5\" />\n <span className=\"af-text-xs af-break-all\">\n {submission.metadata.user_agent}\n </span>\n </div>\n )}\n {submission.resend_id && (\n <div className=\"af-flex af-items-center af-gap-2 af-text-muted-foreground\">\n <Mail className=\"af-h-4 af-w-4\" />\n <span>Email ID: {submission.resend_id}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Plus, X, Loader2, Check } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport { Badge } from '../ui/badge'\nimport { useForms } from '../hooks/useForms'\nimport type { Form, UpdateFormInput } from '../types'\n\nexport interface FormSettingsProps {\n /** The form to edit */\n form: Form\n /** Called when settings are saved */\n onSaved?: (form: Form) => void\n /** Optional className */\n className?: string\n}\n\nexport function FormSettings({ form, onSaved, className }: FormSettingsProps) {\n const { updateForm } = useForms()\n const [isSaving, setIsSaving] = React.useState(false)\n const [lastSaved, setLastSaved] = React.useState<Date | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n\n // Local form state\n const [name, setName] = React.useState(form.name)\n const [redirectUrl, setRedirectUrl] = React.useState(form.redirect_url || '')\n const [emailRecipients, setEmailRecipients] = React.useState<string[]>(\n form.email_recipients\n )\n const [newEmail, setNewEmail] = React.useState('')\n\n // Reset state when form changes\n React.useEffect(() => {\n setName(form.name)\n setRedirectUrl(form.redirect_url || '')\n setEmailRecipients(form.email_recipients)\n setError(null)\n }, [form])\n\n // Auto-save function\n const save = React.useCallback(\n async (updates: UpdateFormInput) => {\n try {\n setIsSaving(true)\n setError(null)\n const updatedForm = await updateForm(form.id, updates)\n setLastSaved(new Date())\n onSaved?.(updatedForm)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save')\n } finally {\n setIsSaving(false)\n }\n },\n [form.id, updateForm, onSaved]\n )\n\n // Clear \"saved\" indicator after 2 seconds\n React.useEffect(() => {\n if (lastSaved) {\n const timer = setTimeout(() => setLastSaved(null), 2000)\n return () => clearTimeout(timer)\n }\n }, [lastSaved])\n\n const handleAddEmail = async () => {\n const email = newEmail.trim().toLowerCase()\n if (!email) return\n if (!email.includes('@')) {\n setError('Please enter a valid email address')\n return\n }\n if (emailRecipients.includes(email)) {\n setError('This email is already added')\n return\n }\n const newRecipients = [...emailRecipients, email]\n setEmailRecipients(newRecipients)\n setNewEmail('')\n setError(null)\n await save({ email_recipients: newRecipients })\n }\n\n const handleRemoveEmail = async (email: string) => {\n const newRecipients = emailRecipients.filter((e) => e !== email)\n setEmailRecipients(newRecipients)\n await save({ email_recipients: newRecipients })\n }\n\n // Save text fields on blur\n const handleNameBlur = async () => {\n if (name !== form.name) {\n await save({ name })\n }\n }\n\n const handleRedirectBlur = async () => {\n const newValue = redirectUrl || null\n if (newValue !== form.redirect_url) {\n await save({ redirect_url: newValue })\n }\n }\n\n return (\n <div className={`af-space-y-6 af-relative ${className || ''}`}>\n {/* Toast notification */}\n {(isSaving || lastSaved) && (\n <div className=\"aifeatures-admin af-fixed af-bottom-4 af-right-4 af-z-50\">\n {isSaving ? (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-background af-border af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Loader2 className=\"af-h-4 af-w-4 af-animate-spin af-text-muted-foreground\" />\n <span className=\"af-text-sm\">Saving...</span>\n </div>\n ) : (\n <div className=\"af-flex af-items-center af-gap-2 af-bg-green-50 af-border af-border-green-200 af-shadow-lg af-rounded-lg af-px-4 af-py-3\">\n <Check className=\"af-h-4 af-w-4 af-text-green-600\" />\n <span className=\"af-text-sm af-text-green-800\">Changes saved</span>\n </div>\n )}\n </div>\n )}\n\n {/* Form Name */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"form-name\">Form Name</Label>\n <Input\n id=\"form-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={handleNameBlur}\n placeholder=\"Contact Form\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n A name to identify this form in your dashboard.\n </p>\n </div>\n\n {/* Email Recipients */}\n <div className=\"af-space-y-2\">\n <Label>Email Recipients</Label>\n <p className=\"af-text-xs af-text-muted-foreground af-mb-2\">\n Form submissions will be sent to these email addresses.\n </p>\n <div className=\"af-flex af-flex-wrap af-gap-2 af-mb-2\">\n {emailRecipients.map((email) => (\n <Badge key={email} variant=\"secondary\" className=\"af-gap-1\">\n {email}\n <button\n type=\"button\"\n onClick={() => handleRemoveEmail(email)}\n className=\"af-ml-1 hover:af-text-destructive\"\n disabled={isSaving}\n >\n <X className=\"af-h-3 af-w-3\" />\n </button>\n </Badge>\n ))}\n {emailRecipients.length === 0 && (\n <span className=\"af-text-sm af-text-muted-foreground af-italic\">\n No recipients configured\n </span>\n )}\n </div>\n <div className=\"af-flex af-gap-2\">\n <Input\n type=\"email\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder=\"Add email address\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleAddEmail()\n }\n }}\n disabled={isSaving}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleAddEmail}\n disabled={!newEmail.trim() || isSaving}\n >\n <Plus className=\"af-h-4 af-w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Redirect URL */}\n <div className=\"af-space-y-2\">\n <Label htmlFor=\"redirect-url\">Redirect URL</Label>\n <Input\n id=\"redirect-url\"\n value={redirectUrl}\n onChange={(e) => setRedirectUrl(e.target.value)}\n onBlur={handleRedirectBlur}\n placeholder=\"/thank-you\"\n />\n <p className=\"af-text-xs af-text-muted-foreground\">\n URL to redirect visitors to after successful submission. Leave empty\n for a default success page.\n </p>\n </div>\n\n {/* Form Endpoint (read-only) */}\n <div className=\"af-space-y-2\">\n <Label>Form Endpoint</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <code className=\"af-flex-1 af-text-xs af-bg-muted af-px-3 af-py-2 af-rounded af-border\">\n {form.endpoint_url}\n </code>\n </div>\n <p className=\"af-text-xs af-text-muted-foreground\">\n Use this URL as the form action attribute.\n </p>\n </div>\n\n {/* Captcha Status (read-only for now) */}\n <div className=\"af-space-y-2\">\n <Label>Captcha Protection</Label>\n <div className=\"af-flex af-items-center af-gap-2\">\n <Badge variant={form.captcha.enabled ? 'success' : 'secondary'}>\n {form.captcha.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n {form.captcha.enabled && form.captcha.provider && (\n <span className=\"af-text-xs af-text-muted-foreground\">\n ({form.captcha.provider})\n </span>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"af-text-sm af-text-destructive af-bg-destructive/10 af-px-3 af-py-2 af-rounded\">\n {error}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'af-flex af-h-9 af-w-full af-rounded-md af-border af-border-input af-bg-transparent af-px-3 af-py-1 af-text-sm af-shadow-sm af-transition-colors file:af-border-0 file:af-bg-transparent file:af-text-sm file:af-font-medium file:af-text-foreground placeholder:af-text-muted-foreground focus-visible:af-outline-none focus-visible:af-ring-1 focus-visible:af-ring-ring disabled:af-cursor-not-allowed disabled:af-opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst labelVariants = cva(\n 'af-text-sm af-font-medium af-leading-none peer-disabled:af-cursor-not-allowed peer-disabled:af-opacity-70'\n)\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label ref={ref} className={cn(labelVariants(), className)} {...props} />\n )\n)\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst badgeVariants = cva(\n 'af-inline-flex af-items-center af-rounded-md af-border af-px-2.5 af-py-0.5 af-text-xs af-font-semibold af-transition-colors focus:af-outline-none focus:af-ring-2 focus:af-ring-ring focus:af-ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'af-border-transparent af-bg-primary af-text-primary-foreground af-shadow hover:af-bg-primary/80',\n secondary:\n 'af-border-transparent af-bg-secondary af-text-secondary-foreground hover:af-bg-secondary/80',\n destructive:\n 'af-border-transparent af-bg-destructive af-text-destructive-foreground af-shadow hover:af-bg-destructive/80',\n outline: 'af-text-foreground',\n success:\n 'af-border-transparent af-bg-green-100 af-text-green-800',\n warning:\n 'af-border-transparent af-bg-yellow-100 af-text-yellow-800',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":"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","names":["React","ArrowLeft","Settings","Inbox","React","jsx","React","jsx","React","jsx","React","jsx","jsxs","React","Inbox","React","jsx","jsxs","jsxs","jsx","React","React","jsx","jsxs","jsx","jsxs","formatDate","Inbox","React","Loader2","Check","React","jsx","React","cva","jsx","cva","Label","cva","jsx","cva","jsx","jsxs","Loader2","Check","Label","jsx","jsxs","ArrowLeft","Inbox","Settings"]}
|