@fayz-ai/plugin-forms 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +3 -3
  2. package/dist/{FormBuilder-7SWZQKFN.js → FormBuilder-JCNHXQXT.js} +4 -4
  3. package/dist/{FormBuilder-7SWZQKFN.js.map → FormBuilder-JCNHXQXT.js.map} +1 -1
  4. package/dist/{chunk-W2ZNJGQC.js → chunk-JCAWSDX6.js} +3 -3
  5. package/dist/chunk-JCAWSDX6.js.map +1 -0
  6. package/dist/components/AddDocumentDropdown.d.ts +1 -1
  7. package/dist/components/AddDocumentDropdown.d.ts.map +1 -1
  8. package/dist/{CustomFormsContext.d.ts → context.d.ts} +1 -1
  9. package/dist/context.d.ts.map +1 -0
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -4
  13. package/dist/index.js.map +1 -1
  14. package/dist/lib/agent-tools.d.ts.map +1 -0
  15. package/dist/lib/document-types.d.ts.map +1 -0
  16. package/package.json +5 -7
  17. package/dist/CustomFormsContext.d.ts.map +0 -1
  18. package/dist/agent-tools.d.ts.map +0 -1
  19. package/dist/chunk-W2ZNJGQC.js.map +0 -1
  20. package/dist/document-types.d.ts.map +0 -1
  21. package/src/CustomFormsContext.tsx +0 -28
  22. package/src/agent-tools.ts +0 -73
  23. package/src/components/AddDocumentDropdown.tsx +0 -92
  24. package/src/components/BuilderCanvas.tsx +0 -87
  25. package/src/components/BuilderField.tsx +0 -81
  26. package/src/components/DocumentFormDialog.tsx +0 -155
  27. package/src/components/DocumentList.tsx +0 -254
  28. package/src/components/FieldConfigDialog.tsx +0 -243
  29. package/src/components/FieldPalette.tsx +0 -81
  30. package/src/components/FormBuilder.tsx +0 -427
  31. package/src/components/FormRenderer.tsx +0 -256
  32. package/src/components/FormViewer.tsx +0 -94
  33. package/src/components/PersonDocumentsWidget.tsx +0 -229
  34. package/src/components/TemplateSelector.tsx +0 -91
  35. package/src/config.ts +0 -43
  36. package/src/data/index.ts +0 -3
  37. package/src/data/mock.ts +0 -193
  38. package/src/data/supabase.ts +0 -408
  39. package/src/data/tables.ts +0 -7
  40. package/src/data/types.ts +0 -33
  41. package/src/document-types.ts +0 -51
  42. package/src/index.ts +0 -234
  43. package/src/lib/person-fields.ts +0 -67
  44. package/src/lib/print.ts +0 -207
  45. package/src/lib/tenant.ts +0 -9
  46. package/src/locales/en.ts +0 -95
  47. package/src/locales/index.ts +0 -7
  48. package/src/locales/pt-BR.ts +0 -95
  49. package/src/migrations/000_plg_rename.sql +0 -21
  50. package/src/migrations/001_frm_base.sql +0 -174
  51. package/src/migrations/002_document_archetype.sql +0 -223
  52. package/src/migrations/003_agent_rpcs.sql +0 -174
  53. package/src/migrations/index.ts +0 -610
  54. package/src/store.ts +0 -167
  55. package/src/types.ts +0 -217
  56. package/src/views/CustomFormsSettingsTab.tsx +0 -105
  57. package/src/views/TemplateListView.tsx +0 -174
  58. /package/dist/{agent-tools.d.ts → lib/agent-tools.d.ts} +0 -0
  59. /package/dist/{document-types.d.ts → lib/document-types.d.ts} +0 -0
package/README.md CHANGED
@@ -28,7 +28,7 @@ Peer deps: `react`, `react-dom`. Runtime deps: `@fayz-ai/core`, `@fayz-ai/ui`.
28
28
 
29
29
  ## Usage
30
30
  ```tsx
31
- import { defineSaas } from '@fayz-ai/saas'
31
+ import { defineSaas } from '@fayz-ai/admin'
32
32
  import { createCustomFormsPlugin } from '@fayz-ai/plugin-forms'
33
33
 
34
34
  export const app = defineSaas({
@@ -43,7 +43,7 @@ export const app = defineSaas({
43
43
  ```
44
44
 
45
45
  ## Part of the Fayz SDK
46
- One of the composable plugins that turn `@fayz-ai/saas` into a real, vertical-specific SaaS — this one owns documents and signatures.
46
+ One of the composable plugins that turn `@fayz-ai/admin` into a real, vertical-specific SaaS — this one owns documents and signatures.
47
47
 
48
48
  ## Roadmap & contributing
49
- Built and evolving in the open. See the [Fayz SDK roadmap](../../docs/ROADMAP.md#plugin-forms) for current gaps, missing features, and good first issues.
49
+ Built and evolving in the open. See the [Fayz SDK roadmap](../../docs/platform/ROADMAP.md#plugin-forms) for current gaps, missing features, and good first issues.
@@ -1,4 +1,4 @@
1
- import { FORM_BUILDER_INSTRUCTIONS, FormRenderer, buildPrintHtml, PERSON_FIELD_OPTIONS } from './chunk-W2ZNJGQC.js';
1
+ import { FORM_BUILDER_INSTRUCTIONS, FormRenderer, buildPrintHtml, PERSON_FIELD_OPTIONS } from './chunk-JCAWSDX6.js';
2
2
  import React2, { useState, useEffect, useCallback } from 'react';
3
3
  import { useSensors, useSensor, PointerSensor, DndContext, pointerWithin, DragOverlay, useDroppable, useDraggable } from '@dnd-kit/core';
4
4
  import { arrayMove, SortableContext, verticalListSortingStrategy, useSortable } from '@dnd-kit/sortable';
@@ -6,7 +6,7 @@ import { snapCenterToCursor } from '@dnd-kit/modifiers';
6
6
  import { Heading, Type, AlignLeft, FileEdit, CalendarDays, ChevronDown, CircleDot, Tags, CheckSquare, Image, GalleryHorizontalEnd, Receipt, ArrowLeft, Eye, Pencil, Printer, Trash2, Plus, GripVertical, X } from 'lucide-react';
7
7
  import { toast, useSaveBar, Card, CardContent, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Badge, Button, Sheet, SheetContent, SheetHeader, SheetTitle, SheetBody, SheetFooter } from '@fayz-ai/ui';
8
8
  import { useTranslation } from '@fayz-ai/core';
9
- import { useLimitGuard, useAgentSurface, invalidateLimit } from '@fayz-ai/saas';
9
+ import { useLimitGuard, useAgentSurface, invalidateLimit } from '@fayz-ai/admin';
10
10
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
11
11
  import { CSS } from '@dnd-kit/utilities';
12
12
  import { createPortal } from 'react-dom';
@@ -716,5 +716,5 @@ function FormBuilder({ templateId, store, provider, config, onBack }) {
716
716
  }
717
717
 
718
718
  export { FormBuilder };
719
- //# sourceMappingURL=FormBuilder-7SWZQKFN.js.map
720
- //# sourceMappingURL=FormBuilder-7SWZQKFN.js.map
719
+ //# sourceMappingURL=FormBuilder-JCNHXQXT.js.map
720
+ //# sourceMappingURL=FormBuilder-JCNHXQXT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/FieldPalette.tsx","../src/components/BuilderField.tsx","../src/components/BuilderCanvas.tsx","../src/components/FieldConfigDialog.tsx","../src/components/FormBuilder.tsx"],"names":["useTranslation","jsxs","jsx","useState","useEffect","React","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button"],"mappings":"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","file":"FormBuilder-7SWZQKFN.js","sourcesContent":["import React from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n Heading, Type, AlignLeft, FileEdit, CalendarDays,\n ChevronDown, CircleDot, Tags, CheckSquare,\n Image, GalleryHorizontalEnd, Receipt,\n} from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldType } from '../types'\n\nexport interface FieldTypeItem {\n type: FormFieldType\n icon: React.ElementType\n}\n\nexport const DEFAULT_COL_SPAN: Record<string, number> = {\n title: 12,\n memo: 12,\n richtext: 12,\n gallery: 12,\n budget: 12,\n image: 6,\n text: 6,\n date: 4,\n select: 6,\n radio: 6,\n tags: 8,\n checkbox: 4,\n}\n\nexport const FIELD_TYPES: FieldTypeItem[] = [\n { type: 'title', icon: Heading },\n { type: 'text', icon: Type },\n { type: 'memo', icon: AlignLeft },\n { type: 'richtext', icon: FileEdit },\n { type: 'date', icon: CalendarDays },\n { type: 'select', icon: ChevronDown },\n { type: 'radio', icon: CircleDot },\n { type: 'tags', icon: Tags },\n { type: 'checkbox', icon: CheckSquare },\n { type: 'image', icon: Image },\n { type: 'gallery', icon: GalleryHorizontalEnd },\n { type: 'budget', icon: Receipt },\n]\n\nfunction DraggableFieldType({ item }: { item: FieldTypeItem }) {\n const t = useTranslation()\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: `palette-${item.type}`,\n data: { source: 'palette', fieldType: item.type },\n })\n\n const Icon = item.icon\n\n return (\n <button\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg border bg-card text-sm font-medium transition-all hover:shadow-sm hover:border-primary/30 cursor-grab active:cursor-grabbing ${isDragging ? 'opacity-30' : ''}`}\n >\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"truncate\">{t(`customForms.fieldType.${item.type}`)}</span>\n </button>\n )\n}\n\nexport function FieldPalette() {\n const t = useTranslation()\n\n return (\n <div className=\"w-44 shrink-0 space-y-1.5\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground px-1 mb-2\">\n {t('customForms.builder.fields')}\n </p>\n {FIELD_TYPES.map((item) => (\n <DraggableFieldType key={item.type} item={item} />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\n\ninterface BuilderFieldProps {\n field: FormFieldDef\n onSelect: (field: FormFieldDef) => void\n onRemove: (fieldId: string) => void\n isSelected: boolean\n}\n\nexport function BuilderField({ field, onSelect, onRemove, isSelected }: BuilderFieldProps) {\n const t = useTranslation()\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: field.id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n gridColumn: `span ${field.colSpan}`,\n opacity: isDragging ? 0.5 : 1,\n }\n\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`group relative flex items-start gap-2 rounded-lg border-2 bg-card p-3 transition-colors cursor-pointer ${\n isSelected\n ? 'border-primary ring-1 ring-primary/20'\n : 'border-border hover:border-primary/30'\n }`}\n onClick={() => onSelect(field)}\n >\n {/* Drag handle */}\n <button\n {...attributes}\n {...listeners}\n className=\"mt-0.5 cursor-grab active:cursor-grabbing text-muted-foreground/50 hover:text-muted-foreground\"\n onClick={(e) => e.stopPropagation()}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />}\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t(`customForms.fieldType.${field.type}`)}\n </span>\n </div>\n <p className=\"text-sm font-medium mt-0.5 truncate\">{field.label}</p>\n {field.required && (\n <span className=\"text-[10px] text-destructive\">*</span>\n )}\n </div>\n\n {/* Remove button */}\n <button\n onClick={(e) => { e.stopPropagation(); onRemove(field.id) }}\n className=\"absolute top-1.5 right-1.5 p-1 rounded-md opacity-0 group-hover:opacity-100 hover:bg-destructive/10 transition-opacity\"\n >\n <X className=\"h-3 w-3 text-destructive\" />\n </button>\n </div>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef, FormFieldType } from '../types'\nimport { BuilderField } from './BuilderField'\nimport { FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\n\ninterface BuilderCanvasProps {\n fields: FormFieldDef[]\n selectedFieldId: string | null\n onSelectField: (field: FormFieldDef) => void\n onRemoveField: (fieldId: string) => void\n draggingFieldType: FormFieldType | null\n}\n\nfunction DropPreview({ fieldType }: { fieldType: FormFieldType }) {\n const t = useTranslation()\n const def = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!def) return null\n const Icon = def.icon\n\n return (\n <div\n className=\"flex items-center gap-2 rounded-lg border-2 border-dashed border-primary/40 bg-primary/5 p-3\"\n style={{ gridColumn: `span ${DEFAULT_COL_SPAN[fieldType] ?? 12}` }}\n >\n <Icon className=\"h-4 w-4 text-primary/50\" />\n <span className=\"text-sm text-primary/50 font-medium\">\n {t(`customForms.fieldType.${fieldType}`)}\n </span>\n </div>\n )\n}\n\nexport function BuilderCanvas({\n fields,\n selectedFieldId,\n onSelectField,\n onRemoveField,\n draggingFieldType,\n}: BuilderCanvasProps) {\n const t = useTranslation()\n const { setNodeRef, isOver } = useDroppable({ id: 'builder-canvas' })\n\n const sortedFields = [...fields].sort((a, b) => a.row - b.row || a.col - b.col)\n const showPreview = isOver && draggingFieldType !== null\n\n return (\n <div\n ref={setNodeRef}\n className={`flex-1 min-h-[400px] rounded-xl border-2 border-dashed p-4 transition-colors ${\n isOver ? 'border-primary/50 bg-primary/5' : 'border-border bg-muted/20'\n }`}\n style={{\n backgroundImage:\n 'repeating-linear-gradient(90deg, transparent, transparent calc(8.333% - 1px), hsl(var(--border) / 0.3) calc(8.333% - 1px), hsl(var(--border) / 0.3) 8.333%)',\n backgroundSize: '100% 100%',\n }}\n >\n {fields.length === 0 && !showPreview && (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n {t('customForms.builder.emptyCanvas')}\n </div>\n )}\n\n <SortableContext items={sortedFields.map((f) => f.id)} strategy={verticalListSortingStrategy}>\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: 'repeat(12, 1fr)' }}\n >\n {sortedFields.map((field) => (\n <BuilderField\n key={field.id}\n field={field}\n isSelected={field.id === selectedFieldId}\n onSelect={onSelectField}\n onRemove={onRemoveField}\n />\n ))}\n\n {showPreview && <DropPreview fieldType={draggingFieldType!} />}\n </div>\n </SortableContext>\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n SheetFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\nimport { PERSON_FIELD_OPTIONS } from '../lib/person-fields'\n\n/** Field types that can be auto-filled from a person record. */\nconst MAPPABLE_TYPES = ['text', 'memo', 'richtext', 'date']\nconst MAP_NONE = '__none__'\n\nconst SIZE_OPTIONS = [\n { span: 3, label: '1/4' },\n { span: 4, label: '1/3' },\n { span: 6, label: '1/2' },\n { span: 8, label: '2/3' },\n { span: 9, label: '3/4' },\n { span: 12, label: 'Full' },\n]\n\ninterface FieldConfigDrawerProps {\n field: FormFieldDef | null\n onSave: (updated: FormFieldDef) => void\n /** Live update without closing — used for visual changes like colSpan */\n onUpdate?: (updated: FormFieldDef) => void\n onClose: () => void\n}\n\nexport function FieldConfigDrawer({ field, onSave, onUpdate, onClose }: FieldConfigDrawerProps) {\n const t = useTranslation()\n const [label, setLabel] = useState('')\n const [placeholder, setPlaceholder] = useState('')\n const [required, setRequired] = useState(false)\n const [colSpan, setColSpan] = useState(12)\n const [options, setOptions] = useState<Array<{ label: string; value: string }>>([])\n const [map, setMap] = useState<string>('')\n\n // Sync state when field changes\n useEffect(() => {\n if (!field) return\n setLabel(field.label)\n setPlaceholder(field.placeholder ?? '')\n setRequired(field.required ?? false)\n setColSpan(field.colSpan)\n setOptions(field.options ?? [])\n setMap(field.map ?? '')\n }, [field?.id])\n\n if (!field) return null\n\n const hasOptions = ['select', 'radio', 'tags'].includes(field.type)\n const canMap = MAPPABLE_TYPES.includes(field.type)\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n const handleSave = () => {\n onSave({\n ...field,\n label,\n placeholder: placeholder || undefined,\n required,\n colSpan: Math.max(1, Math.min(12, colSpan)),\n options: hasOptions ? options.filter((o) => o.label.trim()) : field.options,\n map: canMap && map ? map : undefined,\n })\n }\n\n const addOption = () => {\n setOptions([...options, { label: '', value: '' }])\n }\n\n const updateOption = (index: number, newLabel: string) => {\n const updated = [...options]\n updated[index] = { label: newLabel, value: newLabel.toLowerCase().replace(/\\s+/g, '_') }\n setOptions(updated)\n }\n\n const removeOption = (index: number) => {\n setOptions(options.filter((_, i) => i !== index))\n }\n\n return (\n <Sheet open={!!field} onOpenChange={(open) => { if (!open) onClose() }}>\n <SheetContent className=\"w-80 sm:w-96\" overlay=\"none\">\n <SheetHeader>\n <SheetTitle className=\"flex items-center gap-2 text-sm\">\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground\" />}\n {t(`customForms.fieldType.${field.type}`)}\n </SheetTitle>\n </SheetHeader>\n\n <SheetBody className=\"space-y-4 py-4\">\n {/* Label */}\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldLabel')}</label>\n <Input\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n className=\"h-9 text-sm\"\n autoFocus\n />\n </div>\n\n {/* Placeholder */}\n {!['title', 'checkbox', 'image', 'gallery'].includes(field.type) && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldPlaceholder')}</label>\n <Input\n value={placeholder}\n onChange={(e) => setPlaceholder(e.target.value)}\n className=\"h-9 text-sm\"\n />\n </div>\n )}\n\n {/* Column span — visual skeleton selector */}\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.colSpan')}</label>\n <div className=\"grid grid-cols-3 gap-2\">\n {SIZE_OPTIONS.map((opt) => (\n <button\n key={opt.span}\n onClick={() => {\n setColSpan(opt.span)\n if (onUpdate && field) {\n onUpdate({ ...field, colSpan: opt.span })\n }\n }}\n className={`group relative rounded-lg border-2 p-2 transition-all ${\n colSpan === opt.span\n ? 'border-primary bg-primary/5'\n : 'border-border hover:border-primary/30'\n }`}\n >\n {/* Mini 12-col skeleton preview */}\n <div className=\"flex gap-px h-3 mb-1.5\">\n <div\n className={`rounded-sm ${colSpan === opt.span ? 'bg-primary/60' : 'bg-muted-foreground/30 group-hover:bg-primary/30'}`}\n style={{ width: `${(opt.span / 12) * 100}%` }}\n />\n {opt.span < 12 && (\n <div\n className=\"rounded-sm bg-muted/60\"\n style={{ width: `${((12 - opt.span) / 12) * 100}%` }}\n />\n )}\n </div>\n <span className={`text-[10px] font-medium ${colSpan === opt.span ? 'text-primary' : 'text-muted-foreground'}`}>\n {opt.label}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Required */}\n {field.type !== 'title' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={required}\n onChange={(e) => setRequired(e.target.checked)}\n className=\"rounded border-input accent-primary\"\n />\n <span className=\"text-sm\">{t('customForms.builder.fieldRequired')}</span>\n </label>\n )}\n\n {/* Auto-fill from person record */}\n {canMap && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.mapToPerson')}</label>\n <Select\n value={map || MAP_NONE}\n onValueChange={(v) => setMap(v === MAP_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={MAP_NONE}>{t('customForms.builder.mapNone')}</SelectItem>\n {PERSON_FIELD_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {t(opt.labelKey)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[10px] text-muted-foreground\">{t('customForms.builder.mapHint')}</p>\n </div>\n )}\n\n {/* Options */}\n {hasOptions && (\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldOptions')}</label>\n {options.map((opt, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <Input\n value={opt.label}\n onChange={(e) => updateOption(i, e.target.value)}\n placeholder={`Option ${i + 1}`}\n className=\"h-8 text-sm flex-1\"\n />\n <button onClick={() => removeOption(i)} className=\"p-1 hover:bg-destructive/10 rounded\">\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addOption} className=\"h-8 text-xs w-full\">\n <Plus className=\"h-3 w-3 mr-1\" />\n {t('customForms.builder.addOption')}\n </Button>\n </div>\n )}\n </SheetBody>\n\n <SheetFooter className=\"pt-4 border-t\">\n <Button size=\"sm\" onClick={handleSave} className=\"w-full\">\n OK\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport { arrayMove } from '@dnd-kit/sortable'\nimport { snapCenterToCursor } from '@dnd-kit/modifiers'\nimport { ArrowLeft, Eye, Pencil, Printer } from 'lucide-react'\nimport { Button, useSaveBar, toast } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit, useAgentSurface, type AgentSurfaceContribution } from '@fayz-ai/saas'\nimport type { CustomFormsStore } from '../store'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormFieldDef, FormSchema, TemplateCategory } from '../types'\nimport { FieldPalette, FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\nimport { BuilderCanvas } from './BuilderCanvas'\nimport { FieldConfigDrawer } from './FieldConfigDialog'\nimport { createPortal } from 'react-dom'\nimport { FormRenderer } from './FormRenderer'\nimport { buildPrintHtml } from '../lib/print'\nimport { FORM_BUILDER_INSTRUCTIONS } from '../agent-tools'\n\nconst TEMPLATE_CATEGORIES: TemplateCategory[] = ['anamnesis', 'evolution', 'report', 'contract', 'general']\n\ninterface FormBuilderProps {\n templateId?: string\n store: CustomFormsStore\n provider: CustomFormsDataProvider\n config: CustomFormsConfig\n onBack: () => void\n}\n\nexport function FormBuilder({ templateId, store, provider, config, onBack }: FormBuilderProps) {\n const t = useTranslation()\n const guardTemplates = useLimitGuard('form_templates')\n\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [category, setCategory] = useState<TemplateCategory>('general')\n const [fields, setFields] = useState<FormFieldDef[]>([])\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [previewMode, setPreviewMode] = useState<'editor' | 'print'>('editor')\n const [previewData, setPreviewData] = useState<Record<string, unknown>>({})\n const [draggingFieldType, setDraggingFieldType] = useState<import('../types').FormFieldType | null>(null)\n const [templateName, setTemplateName] = useState<string | null>(null)\n\n // Load existing template\n useEffect(() => {\n if (!templateId) return\n let cancelled = false\n provider.getTemplateById(templateId).then((tpl) => {\n if (cancelled || !tpl) return\n setName(tpl.name)\n setTemplateName(tpl.name)\n setDescription(tpl.description ?? '')\n setCategory(tpl.category)\n setFields(tpl.schema.fields)\n })\n return () => { cancelled = true }\n }, [templateId, provider])\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n )\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const data = event.active.data.current\n if (data?.source === 'palette') {\n setDraggingFieldType(data.fieldType)\n }\n }, [])\n\n const handleDragEnd = useCallback((event: DragEndEvent) => {\n setDraggingFieldType(null)\n const { active, over } = event\n\n // Dropped from palette onto canvas\n if (active.data.current?.source === 'palette' && over) {\n const fieldType = active.data.current.fieldType\n const typeDef = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!typeDef) return\n\n const newField: FormFieldDef = {\n id: crypto.randomUUID(),\n type: fieldType,\n label: t(`customForms.fieldType.${fieldType}`),\n col: 0,\n row: fields.length,\n colSpan: DEFAULT_COL_SPAN[fieldType] ?? 12,\n }\n\n if (['select', 'radio', 'tags'].includes(fieldType)) {\n newField.options = [\n { label: 'Option 1', value: 'option_1' },\n { label: 'Option 2', value: 'option_2' },\n ]\n }\n\n setFields((prev) => [...prev, newField])\n return\n }\n\n // Reorder within canvas\n if (active.id !== over?.id && over) {\n setFields((prev) => {\n const oldIndex = prev.findIndex((f) => f.id === active.id)\n const newIndex = prev.findIndex((f) => f.id === over.id)\n if (oldIndex === -1 || newIndex === -1) return prev\n const reordered = arrayMove(prev, oldIndex, newIndex)\n return reordered.map((f, i) => ({ ...f, row: i }))\n })\n }\n }, [fields, t])\n\n const handleSelectField = useCallback((field: FormFieldDef) => {\n setSelectedFieldId(field.id)\n }, [])\n\n const handleRemoveField = useCallback((fieldId: string) => {\n setFields((prev) => prev.filter((f) => f.id !== fieldId).map((f, i) => ({ ...f, row: i })))\n if (selectedFieldId === fieldId) setSelectedFieldId(null)\n }, [selectedFieldId])\n\n const handleFieldUpdate = useCallback((updated: FormFieldDef) => {\n setFields((prev) => prev.map((f) => (f.id === updated.id ? updated : f)))\n }, [])\n\n // --- Assistant surface: publish WHAT THE USER IS EDITING as context --------\n // The build action is the server-plane createOrUpdateForm tool (a pool RPC),\n // which works from any page. This surface only tells the model which template\n // is open and its current fields+ids, so \"add an allergies field to THIS\n // form\" resolves to the right templateId. No client-side mutation here.\n const surfaceStateRef = React.useRef({ templateId, name, description, category, fields })\n surfaceStateRef.current = { templateId, name, description, category, fields }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(\n () => ({\n id: 'custom_forms.builder',\n pluginId: 'custom_forms',\n instructions: FORM_BUILDER_INSTRUCTIONS,\n describe: () => {\n const o = surfaceStateRef.current\n return {\n title: `Construtor de formulário — ${o.name?.trim() || 'novo modelo'}`,\n state: {\n // Pass this as `templateId` to createOrUpdateForm when editing THIS\n // form. Null = an unsaved new form (create, then it gets an id).\n templateId: o.templateId ?? null,\n unsaved: !o.templateId,\n name: o.name ?? '',\n category: o.category ?? 'general',\n description: o.description ?? '',\n fieldCount: o.fields.length,\n fields: o.fields.map((f) => ({\n id: f.id,\n type: f.type,\n label: f.label,\n required: !!f.required,\n ...(f.options?.length ? { options: f.options.map((x) => x.label) } : {}),\n })),\n },\n }\n },\n }),\n [],\n )\n useAgentSurface(agentSurface)\n // ---------------------------------------------------------------------------\n\n const handleFieldConfigSave = useCallback((updated: FormFieldDef) => {\n handleFieldUpdate(updated)\n setSelectedFieldId(null)\n }, [handleFieldUpdate])\n\n const handleSave = useCallback(async () => {\n if (!name.trim()) { toast.error(t('common.formIncomplete')); return }\n // Plan quantity guard (client-side, before the provider call) — only on\n // create. Opens the global UpgradeModal and aborts when the cap is reached.\n if (!templateId && (await guardTemplates()) === 'blocked') return\n setSaving(true)\n try {\n const schema: FormSchema = { fields, layout: { columns: 12 } }\n\n if (templateId) {\n await store.getState().updateTemplate(templateId, { name, description, category, schema })\n } else {\n await store.getState().createTemplate({ name, description, category, schema })\n invalidateLimit('form_templates')\n }\n onBack()\n } finally {\n setSaving(false)\n }\n }, [templateId, name, description, category, fields, store, onBack, guardTemplates])\n\n // Dirty detection — snapshot editable fields once async load settles\n const currentFields = { name, description, category, fields }\n const snapshot = React.useRef<string | null>(null)\n const loaded = !templateId || templateName !== null\n useEffect(() => {\n if (loaded && snapshot.current === null) snapshot.current = JSON.stringify(currentFields)\n }, [loaded])\n const dirty = snapshot.current !== null && JSON.stringify(currentFields) !== snapshot.current\n\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void handleSave() },\n onDiscard: () => onBack(),\n saveLabel: t('customForms.builder.save'),\n })\n\n const selectedField = selectedFieldId\n ? fields.find((f) => f.id === selectedFieldId) ?? null\n : null\n\n const isNew = !templateId\n const breadcrumbLabel = isNew\n ? t('customForms.newTemplate')\n : templateName ?? t('customForms.editTemplate')\n\n return (\n <div className=\"space-y-4\">\n {/* Breadcrumb */}\n <div className=\"flex items-center gap-1.5 text-sm\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('customForms.templates')}\n </button>\n <span className=\"text-muted-foreground\">/</span>\n <span className=\"font-medium\">{breadcrumbLabel}</span>\n </div>\n\n {/* Form meta — card layout matching CRUD form */}\n <Card>\n <CardContent className=\"p-5 space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">\n {t('customForms.templateName')} <span className=\"text-destructive\">*</span>\n </label>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('customForms.templateName')}\n className=\"h-9 text-sm\"\n autoFocus={isNew}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateCategory')}</label>\n <Select value={category} onValueChange={(v) => setCategory(v as TemplateCategory)}>\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TEMPLATE_CATEGORIES.map((cat) => (\n <SelectItem key={cat} value={cat}>\n {t(`customForms.category.${cat}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateDescription')}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('customForms.templateDescription')}\n className=\"h-9 text-sm\"\n />\n </div>\n </CardContent>\n </Card>\n\n {/* Builder section header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{t('customForms.builder.fields')}</h3>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {t('customForms.builder.fieldCount', { count: String(fields.length) })}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n disabled={fields.length === 0}\n onClick={() => { setPreviewData({}); setPreviewMode('editor'); setShowPreview(true) }}\n >\n <Eye className=\"h-3.5 w-3.5 mr-1.5\" />\n Preview\n </Button>\n </div>\n </div>\n\n {/* Builder body — drag palette + canvas */}\n <DndContext sensors={sensors} collisionDetection={pointerWithin} onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div className=\"flex gap-4\">\n <FieldPalette />\n <BuilderCanvas\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={handleSelectField}\n onRemoveField={handleRemoveField}\n draggingFieldType={draggingFieldType}\n />\n </div>\n\n <DragOverlay dropAnimation={null} modifiers={[snapCenterToCursor]}>\n {draggingFieldType ? (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg border bg-card shadow-xl text-sm font-medium opacity-90 pointer-events-none\">\n {(() => {\n const def = FIELD_TYPES.find((ft) => ft.type === draggingFieldType)\n if (!def) return null\n const Icon = def.icon\n return (\n <>\n <Icon className=\"h-4 w-4 text-primary\" />\n {t(`customForms.fieldType.${draggingFieldType}`)}\n </>\n )\n })()}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {/* Field config drawer (right side) */}\n <FieldConfigDrawer\n field={selectedField}\n onSave={handleFieldConfigSave}\n onUpdate={handleFieldUpdate}\n onClose={() => setSelectedFieldId(null)}\n />\n\n {/* Preview — A4 paper overlay (portaled to body) */}\n {showPreview && createPortal(\n <div className=\"fixed inset-0 z-[100] flex items-start justify-center bg-black/60 overflow-y-auto py-10 px-4\" onClick={() => setShowPreview(false)}>\n <div\n className=\"relative w-full max-w-3xl bg-white rounded-modal shadow-lg\"\n style={{ minHeight: '80vh' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Toggle Editor ⟷ Impressão (centered) + close, on a sticky top bar. */}\n <div className=\"sticky top-0 z-10 flex items-center justify-center border-b bg-white/95 backdrop-blur px-4 py-2.5 rounded-t-modal\">\n <div className=\"inline-flex rounded-lg border p-0.5 text-xs\">\n <button\n onClick={() => setPreviewMode('editor')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'editor' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.editor')}\n </button>\n <button\n onClick={() => setPreviewMode('print')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'print' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Printer className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.print')}\n </button>\n </div>\n <button\n onClick={() => setShowPreview(false)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 flex h-8 w-8 items-center justify-center rounded-full text-neutral-400 hover:bg-neutral-100 hover:text-neutral-700 transition-colors\"\n >\n <span className=\"text-lg\">✕</span>\n </button>\n </div>\n\n {previewMode === 'editor' ? (\n /* Editor — fillable form (same renderer used on the person's ficha) */\n <div className=\"px-10 py-8 sm:px-14 sm:py-10 text-neutral-900\">\n <h1 className=\"text-2xl font-bold mb-1\">{name || t('customForms.newTemplate')}</h1>\n {description && <p className=\"text-sm text-neutral-500 mb-8\">{description}</p>}\n {!description && <div className=\"mb-8\" />}\n\n <FormRenderer\n schema={{ fields, layout: { columns: 12 } }}\n data={previewData}\n onChange={setPreviewData}\n />\n </div>\n ) : (\n /* Impressão — exact print/PDF output rendered in an isolated iframe */\n <iframe\n title=\"print-preview\"\n className=\"w-full rounded-b-modal\"\n style={{ height: '75vh', border: 'none' }}\n srcDoc={buildPrintHtml(\n { id: 'preview', name: name || t('customForms.newTemplate'), schema: { fields, layout: { columns: 12 } } } as any,\n { title: name || t('customForms.newTemplate'), createdAt: new Date().toISOString(), status: 'draft', data: previewData } as any,\n )}\n />\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/FieldPalette.tsx","../src/components/BuilderField.tsx","../src/components/BuilderCanvas.tsx","../src/components/FieldConfigDialog.tsx","../src/components/FormBuilder.tsx"],"names":["useTranslation","jsxs","jsx","useState","useEffect","React","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button"],"mappings":";;;;;;;;;;;;;AAeO,IAAM,gBAAA,GAA2C;AAAA,EACtD,KAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAU,EAAA;AAAA,EACV,KAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAU,CAAA;AAAA,EACV,MAAA,EAAU,CAAA;AAAA,EACV,KAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAU,CAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,WAAA,GAA+B;AAAA,EAC1C,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC/B,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3B,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,EAChC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAS;AAAA,EACnC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAa;AAAA,EACnC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,WAAA,EAAY;AAAA,EACpC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,EACjC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3B,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAA,EAAY;AAAA,EACtC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EAC7B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,oBAAA,EAAqB;AAAA,EAC9C,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA;AAC1B,CAAA;AAEA,SAAS,kBAAA,CAAmB,EAAE,IAAA,EAAK,EAA4B;AAC7D,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAe,YAAA,CAAa;AAAA,IACrE,EAAA,EAAI,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,IACxB,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,KAAK,IAAA;AAAK,GACjD,CAAA;AAED,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACJ,GAAG,SAAA;AAAA,MACH,GAAG,UAAA;AAAA,MACJ,SAAA,EAAW,CAAA,iLAAA,EAAoL,UAAA,GAAa,YAAA,GAAe,EAAE,CAAA,CAAA;AAAA,MAE7N,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,wCAAA,EAAyC,CAAA;AAAA,wBACzD,GAAA,CAAC,UAAK,SAAA,EAAU,UAAA,EAAY,YAAE,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,EAAE;AAAA;AAAA;AAAA,GACtE;AAEJ;AAEO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,IAAI,cAAA,EAAe;AAEzB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oFAAA,EACV,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EACjC,CAAA;AAAA,IACC,WAAA,CAAY,IAAI,CAAC,IAAA,yBACf,kBAAA,EAAA,EAAmC,IAAA,EAAA,EAAX,IAAA,CAAK,IAAkB,CACjD;AAAA,GAAA,EACH,CAAA;AAEJ;ACjEO,SAAS,aAAa,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,YAAW,EAAsB;AACzF,EAAA,MAAM,IAAIA,cAAAA,EAAe;AACzB,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,WAAA,CAAY,EAAE,EAAA,EAAI,KAAA,CAAM,IAAI,CAAA;AAEhC,EAAA,MAAM,KAAA,GAA6B;AAAA,IACjC,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,IAC3C,UAAA;AAAA,IACA,UAAA,EAAY,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,IACjC,OAAA,EAAS,aAAa,GAAA,GAAM;AAAA,GAC9B;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,IAAA,KAAS,MAAM,IAAI,CAAA;AACpE,EAAA,MAAM,OAAO,YAAA,EAAc,IAAA;AAE3B,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA;AAAA,MACA,SAAA,EAAW,CAAA,uGAAA,EACT,UAAA,GACI,uCAAA,GACA,uCACN,CAAA,CAAA;AAAA,MACA,OAAA,EAAS,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,MAG7B,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACE,GAAG,UAAA;AAAA,YACH,GAAG,SAAA;AAAA,YACJ,SAAA,EAAU,gGAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,YAElC,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACpC;AAAA,wBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,YAAA,IAAA,oBAAQC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,4BACtEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wEAAA,EACb,YAAE,CAAA,sBAAA,EAAyB,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA,EAC1C;AAAA,WAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAuC,gBAAM,KAAA,EAAM,CAAA;AAAA,UAC/D,MAAM,QAAA,oBACLA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAA+B,QAAA,EAAA,GAAA,EAAC;AAAA,SAAA,EAEpD,CAAA;AAAA,wBAGAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,cAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,cAAA,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,YAAE,CAAA;AAAA,YAC1D,SAAA,EAAU,wHAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA2B;AAAA;AAAA;AAC1C;AAAA;AAAA,GACF;AAEJ;AChEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAiC;AAChE,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,MAAM,WAAA,CAAY,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,SAAS,CAAA;AAC1D,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AAEjB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,8FAAA;AAAA,MACV,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,KAAA,EAAQ,iBAAiB,SAAS,CAAA,IAAK,EAAE,CAAA,CAAA,EAAG;AAAA,MAEjE,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,CAAA;AAAA,wBAC1CA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCACb,QAAA,EAAA,CAAA,CAAE,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA,EACzC;AAAA;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,EAAE,YAAY,MAAA,EAAO,GAAI,aAAa,EAAE,EAAA,EAAI,kBAAkB,CAAA;AAEpE,EAAA,MAAM,eAAe,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAC9E,EAAA,MAAM,WAAA,GAAc,UAAU,iBAAA,KAAsB,IAAA;AAEpD,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,CAAA,6EAAA,EACT,MAAA,GAAS,gCAAA,GAAmC,2BAC9C,CAAA,CAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,eAAA,EACE,6JAAA;AAAA,QACF,cAAA,EAAgB;AAAA,OAClB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,CAAC,WAAA,oBACvBC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACZ,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EACtC,CAAA;AAAA,wBAGFA,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAG,QAAA,EAAU,6BAC/D,QAAA,kBAAAD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,KAAA,EAAO,EAAE,mBAAA,EAAqB,iBAAA,EAAkB;AAAA,YAE/C,QAAA,EAAA;AAAA,cAAA,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,qBACjBC,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBAEC,KAAA;AAAA,kBACA,UAAA,EAAY,MAAM,EAAA,KAAO,eAAA;AAAA,kBACzB,QAAA,EAAU,aAAA;AAAA,kBACV,QAAA,EAAU;AAAA,iBAAA;AAAA,gBAJL,KAAA,CAAM;AAAA,eAMd,CAAA;AAAA,cAEA,WAAA,oBAAeA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAW,iBAAA,EAAoB;AAAA;AAAA;AAAA,SAC9D,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AC7DA,IAAM,cAAA,GAAiB,CAAC,MAAA,EAAQ,MAAA,EAAQ,YAAY,MAAM,CAAA;AAC1D,IAAM,QAAA,GAAW,UAAA;AAEjB,IAAM,YAAA,GAAe;AAAA,EACnB,EAAE,IAAA,EAAM,CAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,IAAA,EAAM,CAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,IAAA,EAAM,CAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,IAAA,EAAM,CAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,IAAA,EAAM,CAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,EACzB,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,MAAA;AACrB,CAAA;AAUO,SAAS,kBAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,SAAQ,EAA2B;AAC9F,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAkD,EAAE,CAAA;AAClF,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAiB,EAAE,CAAA;AAGzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AACpB,IAAA,cAAA,CAAe,KAAA,CAAM,eAAe,EAAE,CAAA;AACtC,IAAA,WAAA,CAAY,KAAA,CAAM,YAAY,KAAK,CAAA;AACnC,IAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AACxB,IAAA,UAAA,CAAW,KAAA,CAAM,OAAA,IAAW,EAAE,CAAA;AAC9B,IAAA,MAAA,CAAO,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,KAAA,EAAO,EAAE,CAAC,CAAA;AAEd,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,CAAC,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,IAAI,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,YAAY,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,IAAA,KAAS,MAAM,IAAI,CAAA;AACpE,EAAA,MAAM,OAAO,YAAA,EAAc,IAAA;AAE3B,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,KAAA;AAAA,MACH,KAAA;AAAA,MACA,aAAa,WAAA,IAAe,MAAA;AAAA,MAC5B,QAAA;AAAA,MACA,OAAA,EAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA,MAC1C,OAAA,EAAS,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,CAAA,GAAI,KAAA,CAAM,OAAA;AAAA,MACpE,GAAA,EAAK,MAAA,IAAU,GAAA,GAAM,GAAA,GAAM;AAAA,KAC5B,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,UAAA,CAAW,CAAC,GAAG,OAAA,EAAS,EAAE,OAAO,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,CAAC,CAAA;AAAA,EACnD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAAe,QAAA,KAAqB;AACxD,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA;AAC3B,IAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,EAAE;AACvF,IAAA,UAAA,CAAW,OAAO,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAkB;AACtC,IAAA,UAAA,CAAW,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,uBACEE,IAAC,KAAA,EAAA,EAAM,IAAA,EAAM,CAAC,CAAC,KAAA,EAAO,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,IAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,EAAE,GACnE,QAAA,kBAAAD,IAAAA,CAAC,gBAAa,SAAA,EAAU,cAAA,EAAe,SAAQ,MAAA,EAC7C,QAAA,EAAA;AAAA,oBAAAC,IAAC,WAAA,EAAA,EACC,QAAA,kBAAAD,IAAAA,CAAC,UAAA,EAAA,EAAW,WAAU,iCAAA,EACnB,QAAA,EAAA;AAAA,MAAA,IAAA,oBAAQC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,MACxD,CAAA,CAAE,CAAA,sBAAA,EAAyB,KAAA,CAAM,IAAI,CAAA,CAAE;AAAA,KAAA,EAC1C,CAAA,EACF,CAAA;AAAA,oBAEAD,IAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,gBAAA,EAEnB,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EAAE,CAAA;AAAA,wBAC5EA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,KAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,SAAA,EAAU,aAAA;AAAA,YACV,SAAA,EAAS;AAAA;AAAA;AACX,OAAA,EACF,CAAA;AAAA,MAGC,CAAC,CAAC,OAAA,EAAS,UAAA,EAAY,SAAS,SAAS,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,oBAC7DD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAAA,EAAE,CAAA;AAAA,wBAClFA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBAIFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE,CAAA;AAAA,wBACzEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,qBACjBD,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,cAAA,UAAA,CAAW,IAAI,IAAI,CAAA;AACnB,cAAA,IAAI,YAAY,KAAA,EAAO;AACrB,gBAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,GAAA,CAAI,MAAM,CAAA;AAAA,cAC1C;AAAA,YACF,CAAA;AAAA,YACA,WAAW,CAAA,sDAAA,EACT,OAAA,KAAY,GAAA,CAAI,IAAA,GACZ,gCACA,uCACN,CAAA,CAAA;AAAA,YAGA,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,WAAW,CAAA,WAAA,EAAc,OAAA,KAAY,GAAA,CAAI,IAAA,GAAO,kBAAkB,kDAAkD,CAAA,CAAA;AAAA,oBACpH,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAI,IAAI,IAAA,GAAO,EAAA,GAAM,GAAG,CAAA,CAAA,CAAA;AAAI;AAAA,iBAC9C;AAAA,gBACC,GAAA,CAAI,IAAA,GAAO,EAAA,oBACVA,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,wBAAA;AAAA,oBACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAA,CAAK,KAAK,GAAA,CAAI,IAAA,IAAQ,EAAA,GAAM,GAAG,CAAA,CAAA,CAAA;AAAI;AAAA;AACrD,eAAA,EAEJ,CAAA;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,wBAAA,EAA2B,OAAA,KAAY,GAAA,CAAI,IAAA,GAAO,cAAA,GAAiB,uBAAuB,CAAA,CAAA,EACxG,QAAA,EAAA,GAAA,CAAI,KAAA,EACP;AAAA;AAAA,WAAA;AAAA,UA5BK,GAAA,CAAI;AAAA,SA8BZ,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,MAAM,IAAA,KAAS,OAAA,oBACdD,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,wCAAA,EACf,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,YAC7C,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,SAAA,EAAW,QAAA,EAAA,CAAA,CAAE,mCAAmC,CAAA,EAAE;AAAA,OAAA,EACpE,CAAA;AAAA,MAID,MAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EAAE,CAAA;AAAA,wBAC7ED,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAO,GAAA,IAAO,QAAA;AAAA,YACd,eAAe,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AAAA,YAEpD,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,SAAA,EAAU,eACvB,QAAA,kBAAAA,GAAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,8BACAD,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAC,IAAC,UAAA,EAAA,EAAW,KAAA,EAAO,QAAA,EAAW,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE,CAAA;AAAA,gBAC9D,qBAAqB,GAAA,CAAI,CAAC,GAAA,qBACzBA,IAAC,UAAA,EAAA,EAA2B,KAAA,EAAO,GAAA,CAAI,KAAA,EACpC,YAAE,GAAA,CAAI,QAAQ,CAAA,EAAA,EADA,GAAA,CAAI,KAErB,CACD;AAAA,eAAA,EACH;AAAA;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAqC,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE;AAAA,OAAA,EACrF,CAAA;AAAA,MAID,UAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,kCAAkC,CAAA,EAAE,CAAA;AAAA,QAC7E,OAAA,CAAQ,IAAI,CAAC,GAAA,EAAK,sBACjBD,IAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,yBAAA,EACrB,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAO,GAAA,CAAI,KAAA;AAAA,cACX,UAAU,CAAC,CAAA,KAAM,aAAa,CAAA,EAAG,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC/C,WAAA,EAAa,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,cAC5B,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,CAAA,EAAG,SAAA,EAAU,uCAChD,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,gCAA+B,CAAA,EACnD;AAAA,SAAA,EAAA,EATQ,CAUV,CACD,CAAA;AAAA,wBACDD,IAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,MAAK,IAAA,EAAK,OAAA,EAAS,SAAA,EAAW,SAAA,EAAU,oBAAA,EAChE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,UAC9B,EAAE,+BAA+B;AAAA,SAAA,EACpC;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,iBACrB,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAS,UAAA,EAAY,SAAA,EAAU,QAAA,EAAS,gBAE1D,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AC3MA,IAAM,sBAA0C,CAAC,WAAA,EAAa,WAAA,EAAa,QAAA,EAAU,YAAY,SAAS,CAAA;AAUnG,SAAS,YAAY,EAAE,UAAA,EAAY,OAAO,QAAA,EAAU,MAAA,EAAQ,QAAO,EAAqB;AAC7F,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,cAAA,GAAiB,cAAc,gBAAgB,CAAA;AAErD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAA2B,SAAS,CAAA;AACpE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAyB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA6B,QAAQ,CAAA;AAC3E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AAC1E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAkD,IAAI,CAAA;AACxG,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAGpE,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,QAAA,CAAS,eAAA,CAAgB,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AACjD,MAAA,IAAI,SAAA,IAAa,CAAC,GAAA,EAAK;AACvB,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,MAAA,eAAA,CAAgB,IAAI,IAAI,CAAA;AACxB,MAAA,cAAA,CAAe,GAAA,CAAI,eAAe,EAAE,CAAA;AACpC,MAAA,WAAA,CAAY,IAAI,QAAQ,CAAA;AACxB,MAAA,SAAA,CAAU,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzB,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,SAAA,CAAU,eAAe,EAAE,oBAAA,EAAsB,EAAE,QAAA,EAAU,CAAA,IAAK;AAAA,GACpE;AAEA,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,KAAA,KAA0B;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA;AAC/B,IAAA,IAAI,IAAA,EAAM,WAAW,SAAA,EAAW;AAC9B,MAAA,oBAAA,CAAqB,KAAK,SAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,KAAA,KAAwB;AACzD,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AAGzB,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,MAAA,KAAW,aAAa,IAAA,EAAM;AACrD,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,SAAA;AACtC,MAAA,MAAM,UAAU,WAAA,CAAY,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,SAAS,CAAA;AAC9D,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,QAAA,GAAyB;AAAA,QAC7B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,CAAA,CAAE,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAAA,QAC7C,GAAA,EAAK,CAAA;AAAA,QACL,KAAK,MAAA,CAAO,MAAA;AAAA,QACZ,OAAA,EAAS,gBAAA,CAAiB,SAAS,CAAA,IAAK;AAAA,OAC1C;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AACnD,QAAA,QAAA,CAAS,OAAA,GAAU;AAAA,UACjB,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,UACvC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAAW,SACzC;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,QAAQ,CAAC,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,EAAA,KAAO,IAAA,EAAM,EAAA,IAAM,IAAA,EAAM;AAClC,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,QAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,EAAE,CAAA;AACzD,QAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AACvD,QAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,EAAA,EAAI,OAAO,IAAA;AAC/C,QAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AACpD,QAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE,CAAE,CAAA;AAAA,MACnD,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,CAAC,CAAC,CAAA;AAEd,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,KAAA,KAAwB;AAC7D,IAAA,kBAAA,CAAmB,MAAM,EAAE,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,OAAA,KAAoB;AACzD,IAAA,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,OAAO,EAAE,GAAG,GAAG,GAAA,EAAK,CAAA,GAAI,CAAC,CAAA;AAC1F,IAAA,IAAI,eAAA,KAAoB,OAAA,EAAS,kBAAA,CAAmB,IAAI,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,OAAA,KAA0B;AAC/D,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,EAAA,GAAK,OAAA,GAAU,CAAE,CAAC,CAAA;AAAA,EAC1E,CAAA,EAAG,EAAE,CAAA;AAOL,EAAA,MAAM,eAAA,GAAkBC,OAAM,MAAA,CAAO,EAAE,YAAY,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,MAAA,EAAQ,CAAA;AACxF,EAAA,eAAA,CAAgB,UAAU,EAAE,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,UAAU,MAAA,EAAO;AAE5E,EAAA,MAAM,eAAeA,MAAAA,CAAM,OAAA;AAAA,IACzB,OAAO;AAAA,MACL,EAAA,EAAI,sBAAA;AAAA,MACJ,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc,yBAAA;AAAA,MACd,UAAU,MAAM;AACd,QAAA,MAAM,IAAI,eAAA,CAAgB,OAAA;AAC1B,QAAA,OAAO;AAAA,UACL,OAAO,CAAA,mCAAA,EAA8B,CAAA,CAAE,IAAA,EAAM,IAAA,MAAU,aAAa,CAAA,CAAA;AAAA,UACpE,KAAA,EAAO;AAAA;AAAA;AAAA,YAGL,UAAA,EAAY,EAAE,UAAA,IAAc,IAAA;AAAA,YAC5B,OAAA,EAAS,CAAC,CAAA,CAAE,UAAA;AAAA,YACZ,IAAA,EAAM,EAAE,IAAA,IAAQ,EAAA;AAAA,YAChB,QAAA,EAAU,EAAE,QAAA,IAAY,SAAA;AAAA,YACxB,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,YAC9B,UAAA,EAAY,EAAE,MAAA,CAAO,MAAA;AAAA,YACrB,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAC3B,IAAI,CAAA,CAAE,EAAA;AAAA,cACN,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,OAAO,CAAA,CAAE,KAAA;AAAA,cACT,QAAA,EAAU,CAAC,CAAC,CAAA,CAAE,QAAA;AAAA,cACd,GAAI,CAAA,CAAE,OAAA,EAAS,MAAA,GAAS,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,KAAM;AAAC,aACxE,CAAE;AAAA;AACJ,SACF;AAAA,MACF;AAAA,KACF,CAAA;AAAA,IACA;AAAC,GACH;AACA,EAAA,eAAA,CAAgB,YAAY,CAAA;AAG5B,EAAA,MAAM,qBAAA,GAAwB,WAAA,CAAY,CAAC,OAAA,KAA0B;AACnE,IAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,UAAA,GAAa,YAAY,YAAY;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAAE,MAAA,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,uBAAuB,CAAC,CAAA;AAAG,MAAA;AAAA,IAAO;AAGpE,IAAA,IAAI,CAAC,UAAA,IAAe,MAAM,cAAA,OAAsB,SAAA,EAAW;AAC3D,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,SAAqB,EAAE,MAAA,EAAQ,QAAQ,EAAE,OAAA,EAAS,IAAG,EAAE;AAE7D,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,cAAA,CAAe,UAAA,EAAY,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,MAAA,EAAQ,CAAA;AAAA,MAC3F,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,CAAM,UAAS,CAAE,cAAA,CAAe,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,MAAA,EAAQ,CAAA;AAC7E,QAAA,eAAA,CAAgB,gBAAgB,CAAA;AAAA,MAClC;AACA,MAAA,MAAA,EAAO;AAAA,IACT,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,UAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,cAAc,CAAC,CAAA;AAGnF,EAAA,MAAM,aAAA,GAAgB,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,MAAA,EAAO;AAC5D,EAAA,MAAM,QAAA,GAAWA,MAAAA,CAAM,MAAA,CAAsB,IAAI,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,CAAC,UAAA,IAAc,YAAA,KAAiB,IAAA;AAC/C,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,SAAS,OAAA,KAAY,IAAA,WAAe,OAAA,GAAU,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,EAC1F,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,KAAY,IAAA,IAAQ,KAAK,SAAA,CAAU,aAAa,MAAM,QAAA,CAAS,OAAA;AAEtF,EAAA,UAAA,CAAW;AAAA,IACT,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAQ,MAAM;AAAE,MAAA,KAAK,UAAA,EAAW;AAAA,IAAE,CAAA;AAAA,IAClC,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA,IACxB,SAAA,EAAW,EAAE,0BAA0B;AAAA,GACxC,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,eAAA,GAClB,MAAA,CAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,eAAe,CAAA,IAAK,IAAA,GAChD,IAAA;AAEJ,EAAA,MAAM,QAAQ,CAAC,UAAA;AACf,EAAA,MAAM,kBAAkB,KAAA,GACpB,CAAA,CAAE,yBAAyB,CAAA,GAC3B,YAAA,IAAgB,EAAE,0BAA0B,CAAA;AAEhD,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAA;AAAA,UACT,SAAA,EAAU,uFAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAClC,EAAE,uBAAuB;AAAA;AAAA;AAAA,OAC5B;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAe,QAAA,EAAA,eAAA,EAAgB;AAAA,KAAA,EACjD,CAAA;AAAA,oBAGAA,GAAAA,CAAC,IAAA,EAAA,EACC,0BAAAD,IAAAA,CAAC,WAAA,EAAA,EAAY,WAAU,eAAA,EACrB,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACd,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,0BAA0B,CAAA;AAAA,YAAE,GAAA;AAAA,4BAACC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,GAAA,EAAC;AAAA,WAAA,EACtE,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAACI,KAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,IAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACvC,WAAA,EAAa,EAAE,0BAA0B,CAAA;AAAA,cACzC,SAAA,EAAU,aAAA;AAAA,cACV,SAAA,EAAW;AAAA;AAAA;AACb,SAAA,EACF,CAAA;AAAA,wBACAL,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EAAE,CAAA;AAAA,0BAC1ED,IAAAA,CAACM,MAAAA,EAAA,EAAO,KAAA,EAAO,QAAA,EAAU,aAAA,EAAe,CAAC,CAAA,KAAM,WAAA,CAAY,CAAqB,CAAA,EAC9E,QAAA,EAAA;AAAA,4BAAAL,GAAAA,CAACM,eAAA,EAAc,SAAA,EAAU,eACvB,QAAA,kBAAAN,GAAAA,CAACO,WAAAA,EAAA,EAAY,CAAA,EACf,CAAA;AAAA,4BACAP,IAACQ,aAAAA,EAAA,EACE,8BAAoB,GAAA,CAAI,CAAC,wBACxBR,GAAAA,CAACS,YAAA,EAAqB,KAAA,EAAO,KAC1B,QAAA,EAAA,CAAA,CAAE,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAE,CAAA,EAAA,EADjB,GAEjB,CACD,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EAAE,CAAA;AAAA,wBAC7EA,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,WAAA,EAAa,EAAE,iCAAiC,CAAA;AAAA,YAChD,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAL,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EAAE,CAAA;AAAA,wBACvEA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,WAAU,aAAA,EAClC,QAAA,EAAA,CAAA,CAAE,gCAAA,EAAkC,EAAE,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,EAAG,CAAA,EACvE;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BACb,QAAA,kBAAAD,IAAAA;AAAA,QAACW,MAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,SAAA,EAAU,KAAA;AAAA,UACV,QAAA,EAAU,OAAO,MAAA,KAAW,CAAA;AAAA,UAC5B,SAAS,MAAM;AAAE,YAAA,cAAA,CAAe,EAAE,CAAA;AAAG,YAAA,cAAA,CAAe,QAAQ,CAAA;AAAG,YAAA,cAAA,CAAe,IAAI,CAAA;AAAA,UAAE,CAAA;AAAA,UAEpF,QAAA,EAAA;AAAA,4BAAAV,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OAExC,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,KAAC,UAAA,EAAA,EAAW,OAAA,EAAkB,oBAAoB,aAAA,EAAe,WAAA,EAAa,eAAA,EAAiB,SAAA,EAAW,aAAA,EACxG,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA,wBACdA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,eAAA;AAAA,YACA,aAAA,EAAe,iBAAA;AAAA,YACf,aAAA,EAAe,iBAAA;AAAA,YACf;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,WAAA,EAAA,EAAY,aAAA,EAAe,MAAM,SAAA,EAAW,CAAC,kBAAkB,CAAA,EAC7D,8CACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4HACX,QAAA,EAAA,CAAA,MAAM;AACN,QAAA,MAAM,MAAM,WAAA,CAAY,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,iBAAiB,CAAA;AAClE,QAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,QAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,QAAA,uBACED,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,UACtC,CAAA,CAAE,CAAA,sBAAA,EAAyB,iBAAiB,CAAA,CAAE;AAAA,SAAA,EACjD,CAAA;AAAA,MAEJ,CAAA,GAAG,EACL,CAAA,GACE,IAAA,EACN;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,aAAA;AAAA,QACP,MAAA,EAAQ,qBAAA;AAAA,QACR,QAAA,EAAU,iBAAA;AAAA,QACV,OAAA,EAAS,MAAM,kBAAA,CAAmB,IAAI;AAAA;AAAA,KACxC;AAAA,IAGC,WAAA,IAAe,YAAA;AAAA,sBACdA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EAA+F,SAAS,MAAM,cAAA,CAAe,KAAK,CAAA,EAC/I,QAAA,kBAAAD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,4DAAA;AAAA,UACV,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,UAC3B,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAGlC,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mHAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,MAAM,cAAA,CAAe,QAAQ,CAAA;AAAA,oBACtC,SAAA,EAAW,CAAA,oFAAA,EAAuF,WAAA,KAAgB,QAAA,GAAW,8BAA8B,yCAAyC,CAAA,CAAA;AAAA,oBAEpM,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,sBAC/B,EAAE,4BAA4B;AAAA;AAAA;AAAA,iBACjC;AAAA,gCACAD,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,oBACrC,SAAA,EAAW,CAAA,oFAAA,EAAuF,WAAA,KAAgB,OAAA,GAAU,8BAA8B,yCAAyC,CAAA,CAAA;AAAA,oBAEnM,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,sBAChC,EAAE,2BAA2B;AAAA;AAAA;AAAA;AAChC,eAAA,EACF,CAAA;AAAA,8BACAA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,kBACnC,SAAA,EAAU,gLAAA;AAAA,kBAEV,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,QAAA,EAAC;AAAA;AAAA;AAC7B,aAAA,EACF,CAAA;AAAA,YAEC,WAAA,KAAgB,QAAA;AAAA;AAAA,8BAEfD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2BAA2B,QAAA,EAAA,IAAA,IAAQ,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,gBAC7E,+BAAeA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,gBACzE,CAAC,WAAA,oBAAeA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAO,CAAA;AAAA,gCAEvCA,GAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,QAAQ,EAAE,MAAA,EAAQ,QAAQ,EAAE,OAAA,EAAS,IAAG,EAAE;AAAA,oBAC1C,IAAA,EAAM,WAAA;AAAA,oBACN,QAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF;AAAA;AAAA;AAAA,8BAGAA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,eAAA;AAAA,kBACN,SAAA,EAAU,wBAAA;AAAA,kBACV,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,kBACxC,MAAA,EAAQ,cAAA;AAAA,oBACN,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,IAAA,IAAQ,EAAE,yBAAyB,CAAA,EAAG,MAAA,EAAQ,EAAE,QAAQ,MAAA,EAAQ,EAAE,OAAA,EAAS,EAAA,IAAK,EAAE;AAAA,oBACzG,EAAE,KAAA,EAAO,IAAA,IAAQ,CAAA,CAAE,yBAAyB,CAAA,EAAG,SAAA,EAAA,iBAAW,IAAI,IAAA,IAAO,WAAA,EAAY,EAAG,MAAA,EAAQ,OAAA,EAAS,MAAM,WAAA;AAAY;AACzH;AAAA;AACF;AAAA;AAAA;AAAA,OAEJ,EACF,CAAA;AAAA,MACA,QAAA,CAAS;AAAA;AACX,GAAA,EACF,CAAA;AAEJ","file":"FormBuilder-JCNHXQXT.js","sourcesContent":["import React from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n Heading, Type, AlignLeft, FileEdit, CalendarDays,\n ChevronDown, CircleDot, Tags, CheckSquare,\n Image, GalleryHorizontalEnd, Receipt,\n} from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldType } from '../types'\n\nexport interface FieldTypeItem {\n type: FormFieldType\n icon: React.ElementType\n}\n\nexport const DEFAULT_COL_SPAN: Record<string, number> = {\n title: 12,\n memo: 12,\n richtext: 12,\n gallery: 12,\n budget: 12,\n image: 6,\n text: 6,\n date: 4,\n select: 6,\n radio: 6,\n tags: 8,\n checkbox: 4,\n}\n\nexport const FIELD_TYPES: FieldTypeItem[] = [\n { type: 'title', icon: Heading },\n { type: 'text', icon: Type },\n { type: 'memo', icon: AlignLeft },\n { type: 'richtext', icon: FileEdit },\n { type: 'date', icon: CalendarDays },\n { type: 'select', icon: ChevronDown },\n { type: 'radio', icon: CircleDot },\n { type: 'tags', icon: Tags },\n { type: 'checkbox', icon: CheckSquare },\n { type: 'image', icon: Image },\n { type: 'gallery', icon: GalleryHorizontalEnd },\n { type: 'budget', icon: Receipt },\n]\n\nfunction DraggableFieldType({ item }: { item: FieldTypeItem }) {\n const t = useTranslation()\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: `palette-${item.type}`,\n data: { source: 'palette', fieldType: item.type },\n })\n\n const Icon = item.icon\n\n return (\n <button\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg border bg-card text-sm font-medium transition-all hover:shadow-sm hover:border-primary/30 cursor-grab active:cursor-grabbing ${isDragging ? 'opacity-30' : ''}`}\n >\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"truncate\">{t(`customForms.fieldType.${item.type}`)}</span>\n </button>\n )\n}\n\nexport function FieldPalette() {\n const t = useTranslation()\n\n return (\n <div className=\"w-44 shrink-0 space-y-1.5\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground px-1 mb-2\">\n {t('customForms.builder.fields')}\n </p>\n {FIELD_TYPES.map((item) => (\n <DraggableFieldType key={item.type} item={item} />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\n\ninterface BuilderFieldProps {\n field: FormFieldDef\n onSelect: (field: FormFieldDef) => void\n onRemove: (fieldId: string) => void\n isSelected: boolean\n}\n\nexport function BuilderField({ field, onSelect, onRemove, isSelected }: BuilderFieldProps) {\n const t = useTranslation()\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: field.id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n gridColumn: `span ${field.colSpan}`,\n opacity: isDragging ? 0.5 : 1,\n }\n\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`group relative flex items-start gap-2 rounded-lg border-2 bg-card p-3 transition-colors cursor-pointer ${\n isSelected\n ? 'border-primary ring-1 ring-primary/20'\n : 'border-border hover:border-primary/30'\n }`}\n onClick={() => onSelect(field)}\n >\n {/* Drag handle */}\n <button\n {...attributes}\n {...listeners}\n className=\"mt-0.5 cursor-grab active:cursor-grabbing text-muted-foreground/50 hover:text-muted-foreground\"\n onClick={(e) => e.stopPropagation()}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />}\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t(`customForms.fieldType.${field.type}`)}\n </span>\n </div>\n <p className=\"text-sm font-medium mt-0.5 truncate\">{field.label}</p>\n {field.required && (\n <span className=\"text-[10px] text-destructive\">*</span>\n )}\n </div>\n\n {/* Remove button */}\n <button\n onClick={(e) => { e.stopPropagation(); onRemove(field.id) }}\n className=\"absolute top-1.5 right-1.5 p-1 rounded-md opacity-0 group-hover:opacity-100 hover:bg-destructive/10 transition-opacity\"\n >\n <X className=\"h-3 w-3 text-destructive\" />\n </button>\n </div>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef, FormFieldType } from '../types'\nimport { BuilderField } from './BuilderField'\nimport { FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\n\ninterface BuilderCanvasProps {\n fields: FormFieldDef[]\n selectedFieldId: string | null\n onSelectField: (field: FormFieldDef) => void\n onRemoveField: (fieldId: string) => void\n draggingFieldType: FormFieldType | null\n}\n\nfunction DropPreview({ fieldType }: { fieldType: FormFieldType }) {\n const t = useTranslation()\n const def = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!def) return null\n const Icon = def.icon\n\n return (\n <div\n className=\"flex items-center gap-2 rounded-lg border-2 border-dashed border-primary/40 bg-primary/5 p-3\"\n style={{ gridColumn: `span ${DEFAULT_COL_SPAN[fieldType] ?? 12}` }}\n >\n <Icon className=\"h-4 w-4 text-primary/50\" />\n <span className=\"text-sm text-primary/50 font-medium\">\n {t(`customForms.fieldType.${fieldType}`)}\n </span>\n </div>\n )\n}\n\nexport function BuilderCanvas({\n fields,\n selectedFieldId,\n onSelectField,\n onRemoveField,\n draggingFieldType,\n}: BuilderCanvasProps) {\n const t = useTranslation()\n const { setNodeRef, isOver } = useDroppable({ id: 'builder-canvas' })\n\n const sortedFields = [...fields].sort((a, b) => a.row - b.row || a.col - b.col)\n const showPreview = isOver && draggingFieldType !== null\n\n return (\n <div\n ref={setNodeRef}\n className={`flex-1 min-h-[400px] rounded-xl border-2 border-dashed p-4 transition-colors ${\n isOver ? 'border-primary/50 bg-primary/5' : 'border-border bg-muted/20'\n }`}\n style={{\n backgroundImage:\n 'repeating-linear-gradient(90deg, transparent, transparent calc(8.333% - 1px), hsl(var(--border) / 0.3) calc(8.333% - 1px), hsl(var(--border) / 0.3) 8.333%)',\n backgroundSize: '100% 100%',\n }}\n >\n {fields.length === 0 && !showPreview && (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n {t('customForms.builder.emptyCanvas')}\n </div>\n )}\n\n <SortableContext items={sortedFields.map((f) => f.id)} strategy={verticalListSortingStrategy}>\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: 'repeat(12, 1fr)' }}\n >\n {sortedFields.map((field) => (\n <BuilderField\n key={field.id}\n field={field}\n isSelected={field.id === selectedFieldId}\n onSelect={onSelectField}\n onRemove={onRemoveField}\n />\n ))}\n\n {showPreview && <DropPreview fieldType={draggingFieldType!} />}\n </div>\n </SortableContext>\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n SheetFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\nimport { PERSON_FIELD_OPTIONS } from '../lib/person-fields'\n\n/** Field types that can be auto-filled from a person record. */\nconst MAPPABLE_TYPES = ['text', 'memo', 'richtext', 'date']\nconst MAP_NONE = '__none__'\n\nconst SIZE_OPTIONS = [\n { span: 3, label: '1/4' },\n { span: 4, label: '1/3' },\n { span: 6, label: '1/2' },\n { span: 8, label: '2/3' },\n { span: 9, label: '3/4' },\n { span: 12, label: 'Full' },\n]\n\ninterface FieldConfigDrawerProps {\n field: FormFieldDef | null\n onSave: (updated: FormFieldDef) => void\n /** Live update without closing — used for visual changes like colSpan */\n onUpdate?: (updated: FormFieldDef) => void\n onClose: () => void\n}\n\nexport function FieldConfigDrawer({ field, onSave, onUpdate, onClose }: FieldConfigDrawerProps) {\n const t = useTranslation()\n const [label, setLabel] = useState('')\n const [placeholder, setPlaceholder] = useState('')\n const [required, setRequired] = useState(false)\n const [colSpan, setColSpan] = useState(12)\n const [options, setOptions] = useState<Array<{ label: string; value: string }>>([])\n const [map, setMap] = useState<string>('')\n\n // Sync state when field changes\n useEffect(() => {\n if (!field) return\n setLabel(field.label)\n setPlaceholder(field.placeholder ?? '')\n setRequired(field.required ?? false)\n setColSpan(field.colSpan)\n setOptions(field.options ?? [])\n setMap(field.map ?? '')\n }, [field?.id])\n\n if (!field) return null\n\n const hasOptions = ['select', 'radio', 'tags'].includes(field.type)\n const canMap = MAPPABLE_TYPES.includes(field.type)\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n const handleSave = () => {\n onSave({\n ...field,\n label,\n placeholder: placeholder || undefined,\n required,\n colSpan: Math.max(1, Math.min(12, colSpan)),\n options: hasOptions ? options.filter((o) => o.label.trim()) : field.options,\n map: canMap && map ? map : undefined,\n })\n }\n\n const addOption = () => {\n setOptions([...options, { label: '', value: '' }])\n }\n\n const updateOption = (index: number, newLabel: string) => {\n const updated = [...options]\n updated[index] = { label: newLabel, value: newLabel.toLowerCase().replace(/\\s+/g, '_') }\n setOptions(updated)\n }\n\n const removeOption = (index: number) => {\n setOptions(options.filter((_, i) => i !== index))\n }\n\n return (\n <Sheet open={!!field} onOpenChange={(open) => { if (!open) onClose() }}>\n <SheetContent className=\"w-80 sm:w-96\" overlay=\"none\">\n <SheetHeader>\n <SheetTitle className=\"flex items-center gap-2 text-sm\">\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground\" />}\n {t(`customForms.fieldType.${field.type}`)}\n </SheetTitle>\n </SheetHeader>\n\n <SheetBody className=\"space-y-4 py-4\">\n {/* Label */}\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldLabel')}</label>\n <Input\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n className=\"h-9 text-sm\"\n autoFocus\n />\n </div>\n\n {/* Placeholder */}\n {!['title', 'checkbox', 'image', 'gallery'].includes(field.type) && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldPlaceholder')}</label>\n <Input\n value={placeholder}\n onChange={(e) => setPlaceholder(e.target.value)}\n className=\"h-9 text-sm\"\n />\n </div>\n )}\n\n {/* Column span — visual skeleton selector */}\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.colSpan')}</label>\n <div className=\"grid grid-cols-3 gap-2\">\n {SIZE_OPTIONS.map((opt) => (\n <button\n key={opt.span}\n onClick={() => {\n setColSpan(opt.span)\n if (onUpdate && field) {\n onUpdate({ ...field, colSpan: opt.span })\n }\n }}\n className={`group relative rounded-lg border-2 p-2 transition-all ${\n colSpan === opt.span\n ? 'border-primary bg-primary/5'\n : 'border-border hover:border-primary/30'\n }`}\n >\n {/* Mini 12-col skeleton preview */}\n <div className=\"flex gap-px h-3 mb-1.5\">\n <div\n className={`rounded-sm ${colSpan === opt.span ? 'bg-primary/60' : 'bg-muted-foreground/30 group-hover:bg-primary/30'}`}\n style={{ width: `${(opt.span / 12) * 100}%` }}\n />\n {opt.span < 12 && (\n <div\n className=\"rounded-sm bg-muted/60\"\n style={{ width: `${((12 - opt.span) / 12) * 100}%` }}\n />\n )}\n </div>\n <span className={`text-[10px] font-medium ${colSpan === opt.span ? 'text-primary' : 'text-muted-foreground'}`}>\n {opt.label}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Required */}\n {field.type !== 'title' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={required}\n onChange={(e) => setRequired(e.target.checked)}\n className=\"rounded border-input accent-primary\"\n />\n <span className=\"text-sm\">{t('customForms.builder.fieldRequired')}</span>\n </label>\n )}\n\n {/* Auto-fill from person record */}\n {canMap && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.mapToPerson')}</label>\n <Select\n value={map || MAP_NONE}\n onValueChange={(v) => setMap(v === MAP_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={MAP_NONE}>{t('customForms.builder.mapNone')}</SelectItem>\n {PERSON_FIELD_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {t(opt.labelKey)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[10px] text-muted-foreground\">{t('customForms.builder.mapHint')}</p>\n </div>\n )}\n\n {/* Options */}\n {hasOptions && (\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldOptions')}</label>\n {options.map((opt, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <Input\n value={opt.label}\n onChange={(e) => updateOption(i, e.target.value)}\n placeholder={`Option ${i + 1}`}\n className=\"h-8 text-sm flex-1\"\n />\n <button onClick={() => removeOption(i)} className=\"p-1 hover:bg-destructive/10 rounded\">\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addOption} className=\"h-8 text-xs w-full\">\n <Plus className=\"h-3 w-3 mr-1\" />\n {t('customForms.builder.addOption')}\n </Button>\n </div>\n )}\n </SheetBody>\n\n <SheetFooter className=\"pt-4 border-t\">\n <Button size=\"sm\" onClick={handleSave} className=\"w-full\">\n OK\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport { arrayMove } from '@dnd-kit/sortable'\nimport { snapCenterToCursor } from '@dnd-kit/modifiers'\nimport { ArrowLeft, Eye, Pencil, Printer } from 'lucide-react'\nimport { Button, useSaveBar, toast } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit, useAgentSurface, type AgentSurfaceContribution } from '@fayz-ai/admin'\nimport type { CustomFormsStore } from '../store'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormFieldDef, FormSchema, TemplateCategory } from '../types'\nimport { FieldPalette, FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\nimport { BuilderCanvas } from './BuilderCanvas'\nimport { FieldConfigDrawer } from './FieldConfigDialog'\nimport { createPortal } from 'react-dom'\nimport { FormRenderer } from './FormRenderer'\nimport { buildPrintHtml } from '../lib/print'\nimport { FORM_BUILDER_INSTRUCTIONS } from '../lib/agent-tools'\n\nconst TEMPLATE_CATEGORIES: TemplateCategory[] = ['anamnesis', 'evolution', 'report', 'contract', 'general']\n\ninterface FormBuilderProps {\n templateId?: string\n store: CustomFormsStore\n provider: CustomFormsDataProvider\n config: CustomFormsConfig\n onBack: () => void\n}\n\nexport function FormBuilder({ templateId, store, provider, config, onBack }: FormBuilderProps) {\n const t = useTranslation()\n const guardTemplates = useLimitGuard('form_templates')\n\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [category, setCategory] = useState<TemplateCategory>('general')\n const [fields, setFields] = useState<FormFieldDef[]>([])\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [previewMode, setPreviewMode] = useState<'editor' | 'print'>('editor')\n const [previewData, setPreviewData] = useState<Record<string, unknown>>({})\n const [draggingFieldType, setDraggingFieldType] = useState<import('../types').FormFieldType | null>(null)\n const [templateName, setTemplateName] = useState<string | null>(null)\n\n // Load existing template\n useEffect(() => {\n if (!templateId) return\n let cancelled = false\n provider.getTemplateById(templateId).then((tpl) => {\n if (cancelled || !tpl) return\n setName(tpl.name)\n setTemplateName(tpl.name)\n setDescription(tpl.description ?? '')\n setCategory(tpl.category)\n setFields(tpl.schema.fields)\n })\n return () => { cancelled = true }\n }, [templateId, provider])\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n )\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const data = event.active.data.current\n if (data?.source === 'palette') {\n setDraggingFieldType(data.fieldType)\n }\n }, [])\n\n const handleDragEnd = useCallback((event: DragEndEvent) => {\n setDraggingFieldType(null)\n const { active, over } = event\n\n // Dropped from palette onto canvas\n if (active.data.current?.source === 'palette' && over) {\n const fieldType = active.data.current.fieldType\n const typeDef = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!typeDef) return\n\n const newField: FormFieldDef = {\n id: crypto.randomUUID(),\n type: fieldType,\n label: t(`customForms.fieldType.${fieldType}`),\n col: 0,\n row: fields.length,\n colSpan: DEFAULT_COL_SPAN[fieldType] ?? 12,\n }\n\n if (['select', 'radio', 'tags'].includes(fieldType)) {\n newField.options = [\n { label: 'Option 1', value: 'option_1' },\n { label: 'Option 2', value: 'option_2' },\n ]\n }\n\n setFields((prev) => [...prev, newField])\n return\n }\n\n // Reorder within canvas\n if (active.id !== over?.id && over) {\n setFields((prev) => {\n const oldIndex = prev.findIndex((f) => f.id === active.id)\n const newIndex = prev.findIndex((f) => f.id === over.id)\n if (oldIndex === -1 || newIndex === -1) return prev\n const reordered = arrayMove(prev, oldIndex, newIndex)\n return reordered.map((f, i) => ({ ...f, row: i }))\n })\n }\n }, [fields, t])\n\n const handleSelectField = useCallback((field: FormFieldDef) => {\n setSelectedFieldId(field.id)\n }, [])\n\n const handleRemoveField = useCallback((fieldId: string) => {\n setFields((prev) => prev.filter((f) => f.id !== fieldId).map((f, i) => ({ ...f, row: i })))\n if (selectedFieldId === fieldId) setSelectedFieldId(null)\n }, [selectedFieldId])\n\n const handleFieldUpdate = useCallback((updated: FormFieldDef) => {\n setFields((prev) => prev.map((f) => (f.id === updated.id ? updated : f)))\n }, [])\n\n // --- Assistant surface: publish WHAT THE USER IS EDITING as context --------\n // The build action is the server-plane createOrUpdateForm tool (a pool RPC),\n // which works from any page. This surface only tells the model which template\n // is open and its current fields+ids, so \"add an allergies field to THIS\n // form\" resolves to the right templateId. No client-side mutation here.\n const surfaceStateRef = React.useRef({ templateId, name, description, category, fields })\n surfaceStateRef.current = { templateId, name, description, category, fields }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(\n () => ({\n id: 'custom_forms.builder',\n pluginId: 'custom_forms',\n instructions: FORM_BUILDER_INSTRUCTIONS,\n describe: () => {\n const o = surfaceStateRef.current\n return {\n title: `Construtor de formulário — ${o.name?.trim() || 'novo modelo'}`,\n state: {\n // Pass this as `templateId` to createOrUpdateForm when editing THIS\n // form. Null = an unsaved new form (create, then it gets an id).\n templateId: o.templateId ?? null,\n unsaved: !o.templateId,\n name: o.name ?? '',\n category: o.category ?? 'general',\n description: o.description ?? '',\n fieldCount: o.fields.length,\n fields: o.fields.map((f) => ({\n id: f.id,\n type: f.type,\n label: f.label,\n required: !!f.required,\n ...(f.options?.length ? { options: f.options.map((x) => x.label) } : {}),\n })),\n },\n }\n },\n }),\n [],\n )\n useAgentSurface(agentSurface)\n // ---------------------------------------------------------------------------\n\n const handleFieldConfigSave = useCallback((updated: FormFieldDef) => {\n handleFieldUpdate(updated)\n setSelectedFieldId(null)\n }, [handleFieldUpdate])\n\n const handleSave = useCallback(async () => {\n if (!name.trim()) { toast.error(t('common.formIncomplete')); return }\n // Plan quantity guard (client-side, before the provider call) — only on\n // create. Opens the global UpgradeModal and aborts when the cap is reached.\n if (!templateId && (await guardTemplates()) === 'blocked') return\n setSaving(true)\n try {\n const schema: FormSchema = { fields, layout: { columns: 12 } }\n\n if (templateId) {\n await store.getState().updateTemplate(templateId, { name, description, category, schema })\n } else {\n await store.getState().createTemplate({ name, description, category, schema })\n invalidateLimit('form_templates')\n }\n onBack()\n } finally {\n setSaving(false)\n }\n }, [templateId, name, description, category, fields, store, onBack, guardTemplates])\n\n // Dirty detection — snapshot editable fields once async load settles\n const currentFields = { name, description, category, fields }\n const snapshot = React.useRef<string | null>(null)\n const loaded = !templateId || templateName !== null\n useEffect(() => {\n if (loaded && snapshot.current === null) snapshot.current = JSON.stringify(currentFields)\n }, [loaded])\n const dirty = snapshot.current !== null && JSON.stringify(currentFields) !== snapshot.current\n\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void handleSave() },\n onDiscard: () => onBack(),\n saveLabel: t('customForms.builder.save'),\n })\n\n const selectedField = selectedFieldId\n ? fields.find((f) => f.id === selectedFieldId) ?? null\n : null\n\n const isNew = !templateId\n const breadcrumbLabel = isNew\n ? t('customForms.newTemplate')\n : templateName ?? t('customForms.editTemplate')\n\n return (\n <div className=\"space-y-4\">\n {/* Breadcrumb */}\n <div className=\"flex items-center gap-1.5 text-sm\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('customForms.templates')}\n </button>\n <span className=\"text-muted-foreground\">/</span>\n <span className=\"font-medium\">{breadcrumbLabel}</span>\n </div>\n\n {/* Form meta — card layout matching CRUD form */}\n <Card>\n <CardContent className=\"p-5 space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">\n {t('customForms.templateName')} <span className=\"text-destructive\">*</span>\n </label>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('customForms.templateName')}\n className=\"h-9 text-sm\"\n autoFocus={isNew}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateCategory')}</label>\n <Select value={category} onValueChange={(v) => setCategory(v as TemplateCategory)}>\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TEMPLATE_CATEGORIES.map((cat) => (\n <SelectItem key={cat} value={cat}>\n {t(`customForms.category.${cat}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateDescription')}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('customForms.templateDescription')}\n className=\"h-9 text-sm\"\n />\n </div>\n </CardContent>\n </Card>\n\n {/* Builder section header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{t('customForms.builder.fields')}</h3>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {t('customForms.builder.fieldCount', { count: String(fields.length) })}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n disabled={fields.length === 0}\n onClick={() => { setPreviewData({}); setPreviewMode('editor'); setShowPreview(true) }}\n >\n <Eye className=\"h-3.5 w-3.5 mr-1.5\" />\n Preview\n </Button>\n </div>\n </div>\n\n {/* Builder body — drag palette + canvas */}\n <DndContext sensors={sensors} collisionDetection={pointerWithin} onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div className=\"flex gap-4\">\n <FieldPalette />\n <BuilderCanvas\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={handleSelectField}\n onRemoveField={handleRemoveField}\n draggingFieldType={draggingFieldType}\n />\n </div>\n\n <DragOverlay dropAnimation={null} modifiers={[snapCenterToCursor]}>\n {draggingFieldType ? (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg border bg-card shadow-xl text-sm font-medium opacity-90 pointer-events-none\">\n {(() => {\n const def = FIELD_TYPES.find((ft) => ft.type === draggingFieldType)\n if (!def) return null\n const Icon = def.icon\n return (\n <>\n <Icon className=\"h-4 w-4 text-primary\" />\n {t(`customForms.fieldType.${draggingFieldType}`)}\n </>\n )\n })()}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {/* Field config drawer (right side) */}\n <FieldConfigDrawer\n field={selectedField}\n onSave={handleFieldConfigSave}\n onUpdate={handleFieldUpdate}\n onClose={() => setSelectedFieldId(null)}\n />\n\n {/* Preview — A4 paper overlay (portaled to body) */}\n {showPreview && createPortal(\n <div className=\"fixed inset-0 z-[100] flex items-start justify-center bg-black/60 overflow-y-auto py-10 px-4\" onClick={() => setShowPreview(false)}>\n <div\n className=\"relative w-full max-w-3xl bg-white rounded-modal shadow-lg\"\n style={{ minHeight: '80vh' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Toggle Editor ⟷ Impressão (centered) + close, on a sticky top bar. */}\n <div className=\"sticky top-0 z-10 flex items-center justify-center border-b bg-white/95 backdrop-blur px-4 py-2.5 rounded-t-modal\">\n <div className=\"inline-flex rounded-lg border p-0.5 text-xs\">\n <button\n onClick={() => setPreviewMode('editor')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'editor' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.editor')}\n </button>\n <button\n onClick={() => setPreviewMode('print')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'print' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Printer className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.print')}\n </button>\n </div>\n <button\n onClick={() => setShowPreview(false)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 flex h-8 w-8 items-center justify-center rounded-full text-neutral-400 hover:bg-neutral-100 hover:text-neutral-700 transition-colors\"\n >\n <span className=\"text-lg\">✕</span>\n </button>\n </div>\n\n {previewMode === 'editor' ? (\n /* Editor — fillable form (same renderer used on the person's ficha) */\n <div className=\"px-10 py-8 sm:px-14 sm:py-10 text-neutral-900\">\n <h1 className=\"text-2xl font-bold mb-1\">{name || t('customForms.newTemplate')}</h1>\n {description && <p className=\"text-sm text-neutral-500 mb-8\">{description}</p>}\n {!description && <div className=\"mb-8\" />}\n\n <FormRenderer\n schema={{ fields, layout: { columns: 12 } }}\n data={previewData}\n onChange={setPreviewData}\n />\n </div>\n ) : (\n /* Impressão — exact print/PDF output rendered in an isolated iframe */\n <iframe\n title=\"print-preview\"\n className=\"w-full rounded-b-modal\"\n style={{ height: '75vh', border: 'none' }}\n srcDoc={buildPrintHtml(\n { id: 'preview', name: name || t('customForms.newTemplate'), schema: { fields, layout: { columns: 12 } } } as any,\n { title: name || t('customForms.newTemplate'), createdAt: new Date().toISOString(), status: 'draft', data: previewData } as any,\n )}\n />\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n"]}
@@ -343,7 +343,7 @@ function printDocument(template, doc, opts) {
343
343
  printHtml(buildPrintHtml(template, doc, opts));
344
344
  }
345
345
 
346
- // src/agent-tools.ts
346
+ // src/lib/agent-tools.ts
347
347
  var CATEGORY_ENUM = ["anamnesis", "evolution", "report", "contract", "general"];
348
348
  var FIELD_SHAPE = "A field object: { type, label, required?, placeholder?, options?[] }. type \u2208 title|text|memo|richtext|date|select|radio|tags|checkbox|image|gallery|budget (title = section heading, no input). options are plain strings, only for select/radio/tags.";
349
349
  var createOrUpdateFormTool = {
@@ -434,5 +434,5 @@ function prefillFromPerson(schema, person, existing = {}) {
434
434
  }
435
435
 
436
436
  export { FORM_BUILDER_INSTRUCTIONS, FormRenderer, PERSON_FIELD_OPTIONS, buildPrintHtml, createOrUpdateFormTool, prefillFromPerson, printDocument };
437
- //# sourceMappingURL=chunk-W2ZNJGQC.js.map
438
- //# sourceMappingURL=chunk-W2ZNJGQC.js.map
437
+ //# sourceMappingURL=chunk-JCAWSDX6.js.map
438
+ //# sourceMappingURL=chunk-JCAWSDX6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/FormRenderer.tsx","../src/lib/print.ts","../src/lib/agent-tools.ts","../src/lib/person-fields.ts"],"names":["t"],"mappings":"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","file":"chunk-JCAWSDX6.js","sourcesContent":["import React, { useCallback } from 'react'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef, FormSchema } from '../types'\n\ninterface FormRendererProps {\n schema: FormSchema\n data: Record<string, unknown>\n onChange: (data: Record<string, unknown>) => void\n readOnly?: boolean\n}\n\nfunction FieldRenderer({\n field,\n value,\n onChange,\n readOnly,\n}: {\n field: FormFieldDef\n value: unknown\n onChange: (value: unknown) => void\n readOnly?: boolean\n}) {\n const t = useTranslation()\n\n switch (field.type) {\n case 'title':\n return (\n <h3 className=\"text-base font-semibold pt-2 pb-1 border-b\">\n {field.label}\n </h3>\n )\n\n case 'text':\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n <Input\n value={(value as string) ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={field.placeholder}\n className=\"h-9 text-sm\"\n readOnly={readOnly}\n />\n </div>\n )\n\n case 'memo':\n case 'richtext':\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n <textarea\n value={(value as string) ?? ''}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value)}\n placeholder={field.placeholder}\n className=\"flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 min-h-[100px]\"\n readOnly={readOnly}\n />\n </div>\n )\n\n case 'date':\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n <Input\n type=\"date\"\n value={(value as string) ?? ''}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 text-sm\"\n readOnly={readOnly}\n />\n </div>\n )\n\n case 'select':\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {readOnly ? (\n <p className=\"text-sm py-1\">{(value as string) ?? '-'}</p>\n ) : (\n <Select value={(value as string) ?? ''} onValueChange={onChange}>\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue placeholder={field.placeholder ?? '...'} />\n </SelectTrigger>\n <SelectContent>\n {(field.options ?? []).map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n )\n\n case 'radio':\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n <div className=\"space-y-1\">\n {(field.options ?? []).map((opt) => (\n <label key={opt.value} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name={field.id}\n value={opt.value}\n checked={value === opt.value}\n onChange={() => onChange(opt.value)}\n disabled={readOnly}\n className=\"text-primary\"\n />\n <span className=\"text-sm\">{opt.label}</span>\n </label>\n ))}\n </div>\n </div>\n )\n\n case 'tags': {\n const selectedTags = Array.isArray(value) ? (value as string[]) : []\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n <div className=\"flex flex-wrap gap-1.5\">\n {(field.options ?? []).map((opt) => {\n const active = selectedTags.includes(opt.value)\n return (\n <Badge\n key={opt.value}\n variant={active ? 'default' : 'outline'}\n className={`cursor-pointer text-xs ${readOnly ? 'pointer-events-none' : ''}`}\n onClick={() => {\n if (readOnly) return\n onChange(\n active\n ? selectedTags.filter((t) => t !== opt.value)\n : [...selectedTags, opt.value],\n )\n }}\n >\n {opt.label}\n </Badge>\n )\n })}\n </div>\n </div>\n )\n }\n\n case 'checkbox':\n return (\n <label className=\"flex items-center gap-2 cursor-pointer py-1\">\n <input\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n disabled={readOnly}\n className=\"rounded border-input\"\n />\n <span className=\"text-sm font-medium\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </span>\n </label>\n )\n\n case 'image':\n case 'gallery':\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n <div className=\"flex items-center justify-center rounded-lg border-2 border-dashed py-8 text-sm text-muted-foreground\">\n {field.type === 'gallery' ? 'Gallery upload' : 'Image upload'} — v2\n </div>\n </div>\n )\n\n case 'budget':\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium block\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n <div className=\"flex items-center justify-center rounded-lg border-2 border-dashed py-8 text-sm text-muted-foreground\">\n Budget / line items — v2\n </div>\n </div>\n )\n\n default:\n return null\n }\n}\n\nexport function FormRenderer({ schema, data, onChange, readOnly }: FormRendererProps) {\n const sortedFields = [...schema.fields].sort((a, b) => a.row - b.row || a.col - b.col)\n\n const handleFieldChange = useCallback(\n (fieldId: string, value: unknown) => {\n onChange({ ...data, [fieldId]: value })\n },\n [data, onChange],\n )\n\n return (\n <div\n className=\"grid gap-x-4 gap-y-3\"\n style={{ gridTemplateColumns: 'repeat(12, 1fr)' }}\n >\n {sortedFields.map((field) => (\n <div key={field.id} style={{ gridColumn: `span ${field.colSpan}` }}>\n <FieldRenderer\n field={field}\n value={data[field.id]}\n onChange={(v) => handleFieldChange(field.id, v)}\n readOnly={readOnly}\n />\n </div>\n ))}\n </div>\n )\n}\n","// ============================================================\n// PRINT / PDF — render a filled document to a printable A4 page\n// ============================================================\n//\n// Browser print-to-PDF: we build a clean, self-contained A4 HTML document from\n// the template schema + saved data, drop it into a hidden iframe, and call\n// print() on it. The browser's print dialog covers both physical printing and\n// \"Save as PDF\". No external deps.\n\nimport type { FormDocument, FormFieldDef, FormTemplate } from '../types'\n\nfunction esc(value: unknown): string {\n return String(value ?? '').replace(/[&<>\"']/g, (c) =>\n ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c] as string),\n )\n}\n\nfunction nl2br(value: string): string {\n return esc(value).replace(/\\r?\\n/g, '<br/>')\n}\n\nfunction formatDate(value: string): string {\n // ISO date (YYYY-MM-DD) → locale date; anything else passes through.\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(value)\n if (!m) return esc(value)\n return `${m[3]}/${m[2]}/${m[1]}`\n}\n\nfunction optionLabel(field: FormFieldDef, value: unknown): string {\n const opt = (field.options ?? []).find((o) => o.value === value)\n return esc(opt ? opt.label : value)\n}\n\n/** Render one field's value as an HTML fragment for the printed page. */\nfunction renderValue(field: FormFieldDef, value: unknown): string {\n const empty = '<span class=\"empty\">—</span>'\n switch (field.type) {\n case 'memo':\n case 'richtext':\n return value ? `<div class=\"long\">${nl2br(String(value))}</div>` : empty\n case 'date':\n return value ? formatDate(String(value)) : empty\n case 'select':\n case 'radio':\n return value ? optionLabel(field, value) : empty\n case 'tags': {\n const arr = Array.isArray(value) ? value : []\n return arr.length\n ? arr.map((v) => optionLabel(field, v)).join(', ')\n : empty\n }\n case 'checkbox':\n return value ? 'Sim' : 'Não'\n case 'image':\n case 'gallery':\n case 'budget':\n return '' // not meaningful on a printed contract\n default:\n return value ? esc(value) : empty\n }\n}\n\nexport interface BuildPrintOptions {\n /** Heading shown at the top of the page (defaults to the document title). */\n heading?: string\n /** Small line under the heading (e.g. person name). */\n subheading?: string\n}\n\n/** Build a full, self-contained printable HTML document. */\nexport function buildPrintHtml(\n template: FormTemplate,\n doc: FormDocument,\n opts: BuildPrintOptions = {},\n): string {\n const heading = opts.heading ?? doc.title ?? template.name\n const subParts = [opts.subheading ?? doc.personName, new Date(doc.createdAt).toLocaleDateString()]\n .filter(Boolean)\n .map((s) => esc(s))\n .join(' &middot; ')\n\n const fields = [...template.schema.fields].sort((a, b) => a.row - b.row || a.col - b.col)\n\n const clampSpan = (n: unknown) => Math.max(1, Math.min(12, Number(n) || 12))\n\n // Mirror the builder's 12-column grid so the print keeps the authored layout\n // (side-by-side fields stay side by side). Titles span the full row.\n const body = fields\n .map((field) => {\n if (field.type === 'title') {\n return `<h2 class=\"section\" style=\"grid-column: 1 / -1\">${esc(field.label)}</h2>`\n }\n const rendered = renderValue(field, doc.data[field.id])\n if (rendered === '') return ''\n const isLong = field.type === 'memo' || field.type === 'richtext'\n return `<div class=\"field${isLong ? ' field--long' : ''}\" style=\"grid-column: span ${clampSpan(field.colSpan)}\">\n <div class=\"label\">${esc(field.label)}</div>\n <div class=\"value\">${rendered}</div>\n </div>`\n })\n .join('\\n')\n\n return `<!doctype html>\n<html lang=\"pt-BR\">\n<head>\n<meta charset=\"utf-8\"/>\n<title>${esc(heading)}</title>\n<style>\n @page { size: A4; margin: 20mm; }\n * { box-sizing: border-box; }\n html, body { margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n color: #111; font-size: 12pt; line-height: 1.5;\n -webkit-print-color-adjust: exact; print-color-adjust: exact;\n }\n .page { max-width: 170mm; margin: 0 auto; padding: 12mm 0; }\n header { border-bottom: 2px solid #111; padding-bottom: 8px; margin-bottom: 20px; }\n header h1 { font-size: 18pt; margin: 0 0 2px; }\n header .sub { font-size: 10pt; color: #555; }\n /* 12-column grid — mirrors the builder Preview (FormRenderer) so the print\n keeps the authored column layout. */\n .grid { display: grid; grid-template-columns: repeat(12, 1fr); column-gap: 16px; row-gap: 12px; align-items: start; }\n h2.section { font-size: 13pt; margin: 22px 0 4px; padding-bottom: 3px; border-bottom: 1px solid #ccc; }\n .grid > h2.section:first-child { margin-top: 4px; }\n .field { margin: 0; min-width: 0; }\n .field .label { font-size: 9pt; text-transform: uppercase; letter-spacing: .04em; color: #666; margin-bottom: 2px; }\n .field .value { font-size: 12pt; }\n .field--long .value .long { white-space: normal; text-align: justify; }\n .empty { color: #bbb; }\n footer { margin-top: 40px; font-size: 9pt; color: #888; text-align: center; }\n @media screen { body { background: #f3f3f3; } .page { background: #fff; max-width: 210mm; min-height: 297mm; padding: 20mm; box-shadow: 0 1px 8px rgba(0,0,0,.15); } }\n</style>\n</head>\n<body>\n <div class=\"page\">\n <header>\n <h1>${esc(heading)}</h1>\n ${subParts ? `<div class=\"sub\">${subParts}</div>` : ''}\n </header>\n <div class=\"grid\">\n ${body}\n </div>\n </div>\n</body>\n</html>`\n}\n\n/**\n * Print a prebuilt HTML document via a hidden iframe (popup-blocker safe).\n * The browser print dialog handles both printing and \"Save as PDF\".\n */\nexport function printHtml(html: string): void {\n if (typeof document === 'undefined') return\n const iframe = document.createElement('iframe')\n iframe.setAttribute('aria-hidden', 'true')\n iframe.style.position = 'fixed'\n iframe.style.right = '0'\n iframe.style.bottom = '0'\n iframe.style.width = '0'\n iframe.style.height = '0'\n iframe.style.border = '0'\n document.body.appendChild(iframe)\n\n const cleanup = () => {\n // Give the print dialog a beat before tearing the frame down.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe)\n }, 1000)\n }\n\n const win = iframe.contentWindow\n const idoc = iframe.contentDocument || win?.document\n if (!win || !idoc) {\n cleanup()\n return\n }\n\n idoc.open()\n idoc.write(html)\n idoc.close()\n\n const doPrint = () => {\n try {\n win.focus()\n win.print()\n } finally {\n cleanup()\n }\n }\n\n // Wait for the frame document to be ready before printing.\n if (idoc.readyState === 'complete') {\n setTimeout(doPrint, 50)\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true })\n }\n}\n\n/** Convenience: build + print a document in one call. */\nexport function printDocument(\n template: FormTemplate,\n doc: FormDocument,\n opts?: BuildPrintOptions,\n): void {\n printHtml(buildPrintHtml(template, doc, opts))\n}\n","import type { PluginAITool } from '@fayz-ai/core'\n\n/**\n * The assistant's form-building tool. It is a SERVER-PLANE write (a pool RPC),\n * not a client-side surface mutation — so it works from any page and any\n * channel (in-app FAB, WhatsApp, MCP), and persists straight to the tenant's\n * form templates. This is the same pattern agenda/financial/marketing use.\n *\n * The builder surface (see FormBuilder) still publishes CONTEXT — which form is\n * open and its current fields with ids — so \"add an allergies field to THIS\n * form\" resolves to the right template. But the action itself is this tool.\n */\n\nconst CATEGORY_ENUM = ['anamnesis', 'evolution', 'report', 'contract', 'general'] as const\n\nconst FIELD_SHAPE =\n 'A field object: { type, label, required?, placeholder?, options?[] }. ' +\n 'type ∈ title|text|memo|richtext|date|select|radio|tags|checkbox|image|gallery|budget ' +\n '(title = section heading, no input). options are plain strings, only for select/radio/tags.'\n\nexport const createOrUpdateFormTool: PluginAITool = {\n id: 'custom_forms.createOrUpdateForm',\n name: 'createOrUpdateForm',\n description:\n 'Creates or edits a form template (anamnese, contrato, ficha…). Persisted server-side, so it works from ANY page — the user does NOT need the form builder open. ' +\n 'Omit templateId to CREATE (name required); pass templateId to EDIT an existing form. ' +\n 'Send the FULL desired field list in `fields` (replaces all fields), or `append_fields` to add to what already exists. ' +\n 'Layout is automatic — never send positions. Understand the intent and propose a sensible field set in one call rather than asking field by field. The user confirms before it is saved.',\n icon: 'FileText',\n mode: 'persist',\n limitKey: 'form_templates',\n permission: { feature: 'custom_forms', action: 'create' },\n execution: { plane: 'server', kind: 'rpc', rpc: 'agent_forms_upsert_template' },\n category: 'Forms',\n suggestions: [\n { label: 'Monte um formulário de anamnese' },\n { label: 'Adicione um campo de alergias neste formulário' },\n ],\n parameters: {\n type: 'object',\n properties: {\n templateId: {\n type: 'string',\n description: 'Existing form id to EDIT (from context or listFormTemplates). Omit to create a new form.',\n },\n name: { type: 'string', description: 'Form name — required when creating.' },\n category: {\n type: 'string',\n enum: [...CATEGORY_ENUM],\n description: 'anamnesis | evolution | report | contract | general',\n },\n description: { type: 'string', description: 'Optional short description of the form.' },\n fields: {\n type: 'array',\n description: `The FULL desired field list — REPLACES every existing field. Each item: ${FIELD_SHAPE}`,\n items: { type: 'object', description: FIELD_SHAPE },\n },\n append_fields: {\n type: 'array',\n description: `Fields to ADD to the existing form, keeping current ones. Use this for incremental edits instead of \\`fields\\`. Each item: ${FIELD_SHAPE}`,\n items: { type: 'object', description: FIELD_SHAPE },\n },\n },\n },\n}\n\nexport const FORM_BUILDER_INSTRUCTIONS = [\n 'Você está na tela do CONSTRUTOR DE FORMULÁRIOS. Para montar ou editar formulários use a tool createOrUpdateForm (ela persiste no backend e funciona mesmo fora desta tela).',\n 'O formulário aberto agora — id, nome, categoria e campos com seus ids — está no JSON da tela em contexto.',\n 'Para EDITAR este formulário, passe o templateId do contexto. Para adicionar campos mantendo os atuais, use append_fields; para redefinir tudo, use fields com a lista completa.',\n 'Ao criar do zero: entenda a intenção e proponha um conjunto de campos enxuto numa única chamada (não pergunte campo a campo). Depois confirme em uma frase o que foi montado.',\n 'Tipos de campo: title (cabeçalho de seção, sem input), text, memo (multilinha), richtext, date, select, radio, tags, checkbox, image, gallery, budget. Layout é automático.',\n].join(' ')\n","// ============================================================\n// PERSON FIELD MAPPING — prefill a document from a person record\n// ============================================================\n//\n// A template field can declare `map: '<personKey>'` (see FormFieldDef.map).\n// When a document is created from a person's profile, fields with a mapping are\n// pre-filled from that person's record. The person record reaching the widget\n// is the host app's CRUD detail `item`, keyed by the entity's field keys\n// (camelCase, e.g. `documentNumber`). We resolve tolerantly so the same mapping\n// works whether the host exposes camelCase or snake_case keys.\n\nimport type { FormSchema } from '../types'\n\n/** Curated, vertical-agnostic person keys offered in the field builder. */\nexport const PERSON_FIELD_OPTIONS: Array<{ value: string; labelKey: string }> = [\n { value: 'name', labelKey: 'customForms.personField.name' },\n { value: 'documentNumber', labelKey: 'customForms.personField.documentNumber' },\n { value: 'email', labelKey: 'customForms.personField.email' },\n { value: 'phone', labelKey: 'customForms.personField.phone' },\n { value: 'dateOfBirth', labelKey: 'customForms.personField.dateOfBirth' },\n { value: 'guardianName', labelKey: 'customForms.personField.guardianName' },\n { value: 'address', labelKey: 'customForms.personField.address' },\n { value: 'city', labelKey: 'customForms.personField.city' },\n { value: 'state', labelKey: 'customForms.personField.state' },\n]\n\nconst toSnake = (k: string) => k.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase())\nconst toCamel = (k: string) => k.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase())\n\n/** Read a person field value, tolerating camelCase/snake_case key variants. */\nexport function resolvePersonValue(\n person: Record<string, unknown> | undefined | null,\n mapKey: string | undefined,\n): unknown {\n if (!person || !mapKey) return undefined\n for (const key of [mapKey, toSnake(mapKey), toCamel(mapKey)]) {\n const v = person[key]\n if (v != null && v !== '') return v\n }\n return undefined\n}\n\n/**\n * Build the initial document data for a template. For each field, applies (in\n * priority order) an existing value, then the mapped person value, then the\n * field's static `defaultValue`. Never overwrites a value already present in\n * `existing`.\n */\nexport function prefillFromPerson(\n schema: FormSchema | undefined,\n person: Record<string, unknown> | undefined | null,\n existing: Record<string, unknown> = {},\n): Record<string, unknown> {\n const data: Record<string, unknown> = { ...existing }\n if (!schema) return data\n for (const field of schema.fields) {\n const current = data[field.id]\n if (current != null && current !== '') continue\n const mapped = field.map ? resolvePersonValue(person, field.map) : undefined\n if (mapped != null) {\n data[field.id] = mapped\n } else if (field.defaultValue != null) {\n data[field.id] = field.defaultValue\n }\n }\n return data\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { type DocumentTypeOption } from '../document-types';
2
+ import { type DocumentTypeOption } from '../lib/document-types';
3
3
  interface AddDocumentDropdownProps {
4
4
  personId: string;
5
5
  onSelect: (option: DocumentTypeOption) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"AddDocumentDropdown.d.ts","sourceRoot":"","sources":["../../src/components/AddDocumentDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAA;AAY5D,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEhF,UAAU,wBAAwB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAA;CAC/C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,wBAAwB,qBAwEnF"}
1
+ {"version":3,"file":"AddDocumentDropdown.d.ts","sourceRoot":"","sources":["../../src/components/AddDocumentDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAA;AAY5D,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAEpF,UAAU,wBAAwB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAA;CAC/C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,wBAAwB,qBAwEnF"}
@@ -12,4 +12,4 @@ export declare function CustomFormsProvider({ value, children, }: {
12
12
  children: React.ReactNode;
13
13
  }): React.FunctionComponentElement<React.ProviderProps<CustomFormsContextValue | null>>;
14
14
  export declare function useCustomFormsContext(): CustomFormsContextValue;
15
- //# sourceMappingURL=CustomFormsContext.d.ts.map
15
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAA;IACzB,QAAQ,EAAE,uBAAuB,CAAA;IACjC,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAID,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,uBAAuB,CAAA;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,uFAEA;AAED,wBAAgB,qBAAqB,IAAI,uBAAuB,CAI/D"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { PluginManifest } from '@fayz-ai/core';
2
2
  import type { CustomFormsPluginOptions } from './config';
3
3
  export type { CustomFormsPluginOptions };
4
- export { registerDocumentTypeProvider, type DocumentTypeOption, type DocumentTypeProvider } from './document-types';
4
+ export { registerDocumentTypeProvider, type DocumentTypeOption, type DocumentTypeProvider } from './lib/document-types';
5
5
  export declare function createCustomFormsPlugin(options?: CustomFormsPluginOptions): PluginManifest;
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAUnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AA0CxD,YAAY,EAAE,wBAAwB,EAAE,CAAA;AACxC,OAAO,EAAE,4BAA4B,EAAE,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEnH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,cAAc,CAiL1F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAUnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AA0CxD,YAAY,EAAE,wBAAwB,EAAE,CAAA;AACxC,OAAO,EAAE,4BAA4B,EAAE,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAEvH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,cAAc,CAiL1F"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { createOrUpdateFormTool, prefillFromPerson, FormRenderer, printDocument } from './chunk-W2ZNJGQC.js';
1
+ import { createOrUpdateFormTool, prefillFromPerson, FormRenderer, printDocument } from './chunk-JCAWSDX6.js';
2
2
  import React2, { useState, useCallback, useRef, useEffect } from 'react';
3
3
  import { registerTranslations, createSafeDataProvider, useTranslation, getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core';
4
- import { PluginSettingsPanel, useLimitGuard, invalidateLimit, PermissionGate } from '@fayz-ai/saas';
4
+ import { PluginSettingsPanel, useLimitGuard, invalidateLimit, PermissionGate } from '@fayz-ai/admin';
5
5
  import { create } from 'zustand';
6
6
  import { FileText, Image, Paperclip, Search, Plus, Pencil, Archive, ArrowLeft, Printer, ChevronDown, Upload, Eye } from 'lucide-react';
7
7
  import { Input, Button, Card, CardContent, Badge, useSaveBar, Dropdown, DropdownTrigger, DropdownContent, DropdownSeparator, DropdownLabel, DropdownItem } from '@fayz-ai/ui';
@@ -917,7 +917,7 @@ function BuilderWrapper({
917
917
  onBack
918
918
  }) {
919
919
  const FormBuilderLazy = React2.lazy(
920
- () => import('./FormBuilder-7SWZQKFN.js').then((m) => ({ default: m.FormBuilder }))
920
+ () => import('./FormBuilder-JCNHXQXT.js').then((m) => ({ default: m.FormBuilder }))
921
921
  );
922
922
  return /* @__PURE__ */ jsx(
923
923
  React2.Suspense,
@@ -1288,7 +1288,7 @@ function FormViewer({ document: doc, provider, onBack, onEdit }) {
1288
1288
  ] });
1289
1289
  }
1290
1290
 
1291
- // src/document-types.ts
1291
+ // src/lib/document-types.ts
1292
1292
  var providers = [];
1293
1293
  function registerDocumentTypeProvider(provider) {
1294
1294
  if (providers.find((p) => p.id === provider.id)) return;