@zenith-open/zenithcms-admin 1.0.0-beta.5 → 1.0.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{ApiExplorerPage-CLsHG-Ke.js → ApiExplorerPage-85UWt1EW.js} +1 -1
- package/dist/assets/{ApiExplorerPage-CLsHG-Ke.js.map → ApiExplorerPage-85UWt1EW.js.map} +1 -1
- package/dist/assets/{AuditLogPage-Bp2Nvabr.js → AuditLogPage-CwULx1tr.js} +1 -1
- package/dist/assets/{AuditLogPage-Bp2Nvabr.js.map → AuditLogPage-CwULx1tr.js.map} +1 -1
- package/dist/assets/{BlockBuilderPage-CeVMk5Ns.js → BlockBuilderPage-XD1IjOgx.js} +1 -1
- package/dist/assets/{BlockBuilderPage-CeVMk5Ns.js.map → BlockBuilderPage-XD1IjOgx.js.map} +1 -1
- package/dist/assets/{CollectionHooksPage-EFkVZNrc.js → CollectionHooksPage-DIaSrKDj.js} +1 -1
- package/dist/assets/{CollectionHooksPage-EFkVZNrc.js.map → CollectionHooksPage-DIaSrKDj.js.map} +1 -1
- package/dist/assets/{CollectionsPage-D-N_ykJz.js → CollectionsPage-CL_t5JRI.js} +1 -1
- package/dist/assets/{CollectionsPage-D-N_ykJz.js.map → CollectionsPage-CL_t5JRI.js.map} +1 -1
- package/dist/assets/{ComponentBuilderPage-C3mhOLPs.js → ComponentBuilderPage-C58Rr1cu.js} +1 -1
- package/dist/assets/{ComponentBuilderPage-C3mhOLPs.js.map → ComponentBuilderPage-C58Rr1cu.js.map} +1 -1
- package/dist/assets/{DashboardBuilder-Beiurp0v.js → DashboardBuilder-Chjyqyb7.js} +1 -1
- package/dist/assets/{DashboardBuilder-Beiurp0v.js.map → DashboardBuilder-Chjyqyb7.js.map} +1 -1
- package/dist/assets/{PluginsPage-BjPoOvBl.js → PluginsPage-DAR4Fsz-.js} +1 -1
- package/dist/assets/{PluginsPage-BjPoOvBl.js.map → PluginsPage-DAR4Fsz-.js.map} +1 -1
- package/dist/assets/{RedirectsPage-GIZCbEll.js → RedirectsPage-DfMTJsac.js} +1 -1
- package/dist/assets/{RedirectsPage-GIZCbEll.js.map → RedirectsPage-DfMTJsac.js.map} +1 -1
- package/dist/assets/{SchemaBuilderPage-3CDbJi28.js → SchemaBuilderPage-BYprOkEv.js} +1 -1
- package/dist/assets/{SchemaBuilderPage-3CDbJi28.js.map → SchemaBuilderPage-BYprOkEv.js.map} +1 -1
- package/dist/assets/{SettingsPage-DYYNnxkV.js → SettingsPage-B2r_uNVc.js} +1 -1
- package/dist/assets/{SettingsPage-DYYNnxkV.js.map → SettingsPage-B2r_uNVc.js.map} +1 -1
- package/dist/assets/SetupWizard-CBA43yJr.js +62 -0
- package/dist/assets/SetupWizard-CBA43yJr.js.map +1 -0
- package/dist/assets/SpatialEditor-BohlovfE.js +3 -0
- package/dist/assets/SpatialEditor-BohlovfE.js.map +1 -0
- package/dist/assets/{TemplatesPage-DfeCDCe_.js → TemplatesPage-BplB2ksb.js} +1 -1
- package/dist/assets/{TemplatesPage-DfeCDCe_.js.map → TemplatesPage-BplB2ksb.js.map} +1 -1
- package/dist/assets/{TrashPage-DGi-7RPl.js → TrashPage-BIhKrs5x.js} +1 -1
- package/dist/assets/{TrashPage-DGi-7RPl.js.map → TrashPage-BIhKrs5x.js.map} +1 -1
- package/dist/assets/{index-C4J6QNLn.js → index-yE_3fruG.js} +3 -3
- package/dist/assets/index-yE_3fruG.js.map +1 -0
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/dist/sw.js.map +1 -1
- package/package.json +4 -4
- package/dist/assets/SetupWizard-D57HIkrs.js +0 -62
- package/dist/assets/SetupWizard-D57HIkrs.js.map +0 -1
- package/dist/assets/SpatialEditor-DlyP5PPa.js +0 -3
- package/dist/assets/SpatialEditor-DlyP5PPa.js.map +0 -1
- package/dist/assets/index-C4J6QNLn.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionsPage-D-N_ykJz.js","names":[],"sources":["../../src/pages/CollectionsPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport {\n Database,\n Layers,\n ArrowRight,\n Search,\n Activity,\n Shield,\n Zap,\n Loader2,\n Plus,\n Trash2,\n Check,\n Code2,\n} from 'lucide-react'\nimport { Link, useNavigate } from 'react-router-dom'\nimport { motion } from 'framer-motion'\nimport { cn } from '../lib/utils'\nimport api from '../lib/api'\nimport toast from 'react-hot-toast'\nimport { useTheme } from '../context/ThemeContext'\nimport { useSystemMetadata } from '../hooks/useQueries'\nimport { PageHeader } from '../components/ui/PageHeader'\n\nconst CollectionsPage: React.FC = () => {\n const { theme } = useTheme()\n const navigate = useNavigate()\n // --- REGISTRY STATE: CONTENT INFRASTRUCTURE ---\n const [collections, setCollections] = useState<any[]>([])\n const [loading, setLoading] = useState(true)\n const [searchQuery, setSearchQuery] = useState('')\n const [stats, setStats] = useState<any>({})\n\n /**\n * REGISTRY HARVEST: SYNCHRONIZE CONTENT NODES\n * Orchestrates parallel retrieval of system health (for schema/labels)\n * and record counts for each collection node.\n */\n const { data: healthData, isLoading: healthLoading } = useSystemMetadata()\n\n useEffect(() => {\n const fetchCounts = async () => {\n if (!healthData) return\n try {\n const countsRes = await api.get('/system/counts').catch(() => null)\n \n const rawCollections = healthData.collections || []\n\n const processedCollections = rawCollections.map((c: any) => ({\n ...c,\n label: c.label || c.name || c.slug || 'Unnamed Collection',\n }))\n\n setCollections(processedCollections)\n setStats(countsRes?.data?.data || {})\n } catch (error) {\n console.error('Critical Registry Synchronization Failure', error)\n toast.error('Failed to load collections')\n } finally {\n setLoading(false)\n }\n }\n\n if (!healthLoading) {\n fetchCounts()\n }\n }, [healthData, healthLoading])\n\n /**\n * SEARCH & FILTER LOGIC: CLIENT-SIDE MATRIX REDUCTION\n */\n const filteredCollections = collections.filter((col) => {\n const label = (col.label || '').toLowerCase()\n const slug = (col.slug || '').toLowerCase()\n const query = searchQuery.toLowerCase()\n return label.includes(query) || slug.includes(query)\n })\n\n const [isAIModalOpen, setIsAIModalOpen] = useState(false)\n const [aiPrompt, setAiPrompt] = useState('')\n const [aiLoading, setAiLoading] = useState(false)\n const [aiResult, setAiResult] = useState<any>(null)\n\n const handleAIGenerate = async () => {\n if (!aiPrompt) return\n setAiLoading(true)\n setAiResult(null)\n try {\n const res = await api.post('/system/ai-architect', { prompt: aiPrompt })\n setAiResult(res.data?.data?.schema || { error: 'Failed to parse schema.' })\n } catch (e) {\n setAiResult({ error: 'Failed to connect to AI Architect.' })\n } finally {\n setAiLoading(false)\n }\n }\n\n // --- VISUAL CONTENT-TYPE BUILDER STATE ---\n const [isVisualModalOpen, setIsVisualModalOpen] = useState(false)\n const [visualLoading, setVisualLoading] = useState(false)\n const [newColName, setNewColName] = useState('')\n const [newColSlug, setNewColSlug] = useState('')\n const [newColDrafts, setNewColDrafts] = useState(true)\n const [newColFields, setNewColFields] = useState<any[]>([\n { name: 'title', type: 'text', required: true, options: '', relationTo: '' },\n ])\n\n const handleNameChange = (name: string) => {\n setNewColName(name)\n setNewColSlug(\n name\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n )\n }\n\n const handleAddField = () => {\n setNewColFields([\n ...newColFields,\n { name: '', type: 'text', required: false, options: '', relationTo: '' },\n ])\n }\n\n const handleRemoveField = (index: number) => {\n setNewColFields(newColFields.filter((_, idx) => idx !== index))\n }\n\n const handleFieldChange = (index: number, key: string, value: any) => {\n setNewColFields(\n newColFields.map((field, idx) => {\n if (idx === index) {\n return { ...field, [key]: value }\n }\n return field\n })\n )\n }\n\n const handleCreateCollection = async () => {\n if (!newColName || !newColSlug || newColFields.length === 0) {\n toast.error('Please enter a collection name and add at least one field.')\n return\n }\n if (newColFields.some((f) => !f.name)) {\n toast.error('All fields must have a name.')\n return\n }\n\n setVisualLoading(true)\n try {\n await api.post('/system/collections', {\n name: newColName,\n slug: newColSlug,\n drafts: newColDrafts,\n fields: newColFields.map((f) => ({\n name: f.name\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '_')\n .replace(/[^a-z0-9_]/g, ''),\n type: f.type,\n required: !!f.required,\n ...(f.type === 'select' &&\n f.options && {\n options: f.options\n .split(',')\n .map((o: string) => ({ label: o.trim(), value: o.trim() }))\n .filter((o: any) => o.value),\n }),\n ...(f.type === 'relationship' && f.relationTo && { relationTo: f.relationTo }),\n })),\n })\n toast.success('Collection created successfully! Reloading...')\n setIsVisualModalOpen(false)\n setTimeout(() => {\n window.location.reload()\n }, 1500)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to create collection.')\n } finally {\n setVisualLoading(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <Loader2 className=\"animate-spin text-z-secondary \" size={32} />\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col h-[calc(100vh-64px)] overflow-hidden\">\n <PageHeader\n title=\"Content Assets\"\n actions={\n <div className=\"flex items-center gap-4 w-full md:w-auto flex-wrap\">\n <button\n onClick={() => setIsVisualModalOpen(true)}\n className=\"flex items-center gap-2 px-6 py-4 bg-z-accent text-z-logo-text text-sm font-semibold hover:bg-z-accent transition-colors shadow-lg shadow-sm\"\n >\n <Plus size={14} />\n Create Collection\n </button>\n\n <button\n onClick={() => setIsAIModalOpen(true)}\n className={cn(\n \"flex items-center gap-2 px-6 py-4 text-sm font-semibold transition-colors\",\n 'bg-z-panel hover:bg-z-hover text-z-primary border-z-border'\n )}\n >\n <Zap size={14} className=\"text-z-active-text\" />\n AI Architect\n </button>\n\n <div className=\"relative w-full md:w-80\">\n <Search className=\"absolute left-4 top-1/2 -translate-y-1/2 text-z-secondary\" size={14} />\n <input\n type=\"text\"\n placeholder=\"FILTER_COLLECTIONS...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full border rounded-none-none py-4 pl-12 pr-4 text-sm font-semibold transition-all outline-none ',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-accent/50 focus:bg-z-hover'\n : 'bg-z-panel border-z-border focus:border-z-accent/50'\n )}\n />\n </div>\n </div>\n }\n />\n <div className={cn(\n 'flex-1 overflow-y-auto p-6 md:p-10 space-y-10 transition-colors duration-500',\n theme === 'dark' ? 'bg-app text-z-primary' : 'bg-[#fafafa] text-z-primary'\n )}>\n {/* System Integrity Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n {[\n {\n label: 'Total Records',\n value: String(Object.values(stats).reduce((a: number, b: number) => a + b, 0)),\n icon: Activity,\n sub: 'Global Synchronization',\n },\n { label: 'Schema Health', value: '100%', icon: Shield, sub: 'Optimal Performance' },\n { label: 'Latency', value: '14ms', icon: Zap, sub: 'Neural Processing' },\n ].map((item, i) => (\n <div\n key={i}\n className={cn(\n 'p-8 border rounded-none-none flex flex-col gap-4 transition-all relative overflow-hidden group',\n theme === 'dark'\n ? 'bg-z-panel border-z-border'\n : 'bg-z-panel border-z-border shadow-sm shadow-sm'\n )}\n >\n <div className=\"absolute top-0 right-0 p-4 opacity-5 group-hover:opacity-10 transition-opacity\">\n <item.icon size={80} />\n </div>\n <span className=\"text-sm font-semibold text-z-secondary\">\n {item.label}\n </span>\n <div className=\"flex items-baseline gap-3\">\n <span className=\"text-4xl font-semibold\">\n {item.value}\n </span>\n <span className=\"text-sm font-bold text-z-secondary \">\n {item.sub}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Collection Matrix */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-6\">\n {filteredCollections.map((col, i) => (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: i * 0.05 }}\n key={col.slug}\n >\n <div\n onClick={() => navigate(`/collections/${col.slug}`)}\n className={cn(\n 'group p-8 border flex flex-col items-center text-center gap-5 transition-all duration-500 relative overflow-hidden cursor-pointer',\n 'bg-z-panel backdrop-blur-xl border-z-border shadow-sm hover:scale-[1.02] hover:border-z-active-border hover:shadow-premium'\n )}\n >\n {/* Micro-animation gradient background */}\n <div className=\"absolute inset-0 bg-gradient-to-br from-z-accent/0 to-z-accent/0 group-hover:from-z-accent/5 group-hover:to-transparent transition-all duration-500\" />\n \n <div\n className={cn(\n 'w-14 h-14 rounded-full flex items-center justify-center transition-all duration-500 relative z-10',\n 'bg-z-hover text-z-muted group-hover:bg-z-active-bg group-hover:text-z-active-text'\n )}\n >\n <Layers size={24} strokeWidth={1.5} />\n </div>\n\n <div className=\"relative z-10 flex flex-col items-center w-full\">\n <h3 className=\"text-xl font-black tracking-tight leading-none mb-3 group-hover:text-z-active-text transition-colors duration-500\">\n {col.label.replace(/-/g, ' ')}\n </h3>\n <div className=\"flex items-center justify-center mb-4\">\n <span className=\"px-2.5 py-1 rounded-full text-[9px] font-black uppercase tracking-widest bg-z-hover text-z-primary\">\n {stats[col.slug] || 0} Entries\n </span>\n </div>\n <p className=\"text-[11px] font-medium text-z-secondary leading-relaxed max-w-[90%]\">\n Manage and organize your {col.label.toLowerCase()} documents.\n </p>\n </div>\n\n <div className=\"w-full flex items-center justify-center pt-5 mt-auto border-t border-z-border/50 relative z-10\">\n <Link\n to={`/collections/${col.slug}/hooks`}\n onClick={(e) => e.stopPropagation()}\n className=\"flex items-center gap-1.5 text-[10px] font-black uppercase tracking-widest text-z-secondary hover:text-z-active-text transition-colors duration-300\"\n >\n <Code2 size={12} />\n Manage Hooks\n </Link>\n </div>\n </div>\n </motion.div>\n ))}\n </div>\n\n {isAIModalOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm p-4\">\n <div\n className={cn(\n 'w-full max-w-3xl p-8 border shadow-2xl relative',\n 'bg-z-panel border-z-border'\n )}\n >\n <button\n onClick={() => setIsAIModalOpen(false)}\n className=\"absolute top-4 right-4 text-z-secondary hover:text-z-primary\"\n >\n \n </button>\n <h2 className=\"text-2xl font-semibold mb-4 flex items-center gap-2\">\n <Zap className=\"text-z-secondary \" /> AI Schema Architect\n </h2>\n <p className=\"text-sm font-bold text-z-secondary mb-6\">\n Describe the collection you want to create and let AI build the schema configuration.\n </p>\n\n <textarea\n value={aiPrompt}\n onChange={(e) => setAiPrompt(e.target.value)}\n placeholder=\"e.g., I need a blog post collection with title, content, cover image, seo metadata, and a category dropdown...\"\n className={cn(\n 'w-full h-32 p-4 mb-4 font-mono text-sm border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black focus:ring-2 focus:ring-z-active-border resize-none',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-input border-z-border'\n )}\n />\n\n <button\n onClick={handleAIGenerate}\n disabled={aiLoading}\n className=\"w-full py-4 bg-z-accent hover:bg-z-base text-z-primary font-semibold flex items-center justify-center gap-2\"\n >\n {aiLoading ? <Loader2 className=\"animate-spin\" size={16} /> : <Database size={16} />}\n {aiLoading ? 'Synthesizing Architecture...' : 'Generate Schema'}\n </button>\n\n {aiResult && (\n <div className=\"mt-6 border-t border-z-border pt-6\">\n <p className=\"text-sm font-bold text-z-muted mb-2\">\n Generated Schema Configuration (Copy to cms.config.ts)\n </p>\n <div className=\"relative\">\n <pre className=\"p-4 bg-[var(--z-bg-code)] text-z-muted text-xs font-mono overflow-auto max-h-64 border border-z-border\">\n {JSON.stringify(aiResult, null, 2)}\n </pre>\n <button\n onClick={() => navigator.clipboard.writeText(JSON.stringify(aiResult, null, 2))}\n className=\"absolute top-2 right-2 px-3 py-1 bg-z-hover hover:bg-z-panel border border-z-border text-sm font-semibold text-z-primary\"\n >\n Copy\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n {isVisualModalOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-md p-4 overflow-y-auto\">\n <div\n className={cn(\n 'w-full max-w-4xl p-10 border shadow-2xl relative my-8',\n 'bg-z-panel border-z-border text-z-primary'\n )}\n >\n <button\n onClick={() => setIsVisualModalOpen(false)}\n className=\"absolute top-6 right-6 w-8 h-8 flex items-center justify-center bg-z-hover hover:bg-z-panel rounded-none-none border border-z-border transition-colors text-z-muted hover:text-z-primary\"\n >\n \n </button>\n <h2 className=\"text-3xl font-semibold mb-4 flex items-center gap-3\">\n <Database className=\"text-z-secondary animate-pulse\" /> Visual Schema Builder\n </h2>\n <p className=\"text-sm font-semibold text-z-secondary mb-8 border-b border-z-border pb-4\">\n Define collection specifications, fields, types, and constraints visually without\n writing code.\n </p>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-8\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Collection Name\n </label>\n <input\n type=\"text\"\n name=\"name\"\n value={newColName}\n onChange={(e) => handleNameChange(e.target.value)}\n placeholder=\"e.g. Review\"\n className={cn(\n 'w-full px-4 py-3 text-sm font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all ',\n 'bg-z-input border-z-border text-z-primary'\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Slug\n </label>\n <input\n type=\"text\"\n name=\"slug\"\n value={newColSlug}\n onChange={(e) => setNewColSlug(e.target.value)}\n placeholder=\"e.g. reviews\"\n className={cn(\n 'w-full px-4 py-3 text-sm font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all lowercase ',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-muted'\n : 'bg-z-input border-z-border text-z-secondary'\n )}\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 mb-8 px-2\">\n <input\n type=\"checkbox\"\n id=\"enable-drafts-checkbox\"\n checked={newColDrafts}\n onChange={(e) => setNewColDrafts(e.target.checked)}\n className=\"w-4 h-4 text-z-secondary focus:ring-z-active-border border-z-border-strong rounded-none-none bg-app\"\n />\n <label\n htmlFor=\"enable-drafts-checkbox\"\n className=\"text-sm font-semibold text-z-muted cursor-pointer select-none\"\n >\n Enable Draft/Publish Workflow\n </label>\n </div>\n\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-3\">\n <h3 className=\"text-xs font-semibold text-z-muted\">\n Field Definitions\n </h3>\n <button\n onClick={handleAddField}\n className=\"px-4 py-2 border border-dashed border-z-border/30 text-z-secondary hover:bg-z-hover text-sm font-semibold transition-all flex items-center gap-2\"\n >\n <Plus size={12} /> Add Field\n </button>\n </div>\n\n <div className=\"space-y-4 max-h-[30vh] overflow-y-auto pr-2 custom-scrollbar\">\n {newColFields.map((field, index) => (\n <div\n key={index}\n className={cn(\n 'p-5 border rounded-none-none grid grid-cols-1 md:grid-cols-4 gap-4 items-center relative group/field',\n theme === 'dark'\n ? 'bg-app border-z-border'\n : 'bg-z-input border-z-border shadow-sm'\n )}\n >\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Field Name\n </label>\n <input\n type=\"text\"\n name={`field-name-${index}`}\n value={field.name}\n onChange={(e) => handleFieldChange(index, 'name', e.target.value)}\n placeholder=\"e.g. rating\"\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all lowercase font-mono',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Type\n </label>\n <select\n value={field.type}\n onChange={(e) => handleFieldChange(index, 'type', e.target.value)}\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n >\n <option value=\"text\">Text</option>\n <option value=\"number\">Number</option>\n <option value=\"richtext\">Rich Text</option>\n <option value=\"media\">Media</option>\n <option value=\"checkbox\">Boolean</option>\n <option value=\"select\">Dropdown Select</option>\n <option value=\"relationship\">Relationship</option>\n </select>\n </div>\n\n {field.type === 'select' ? (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Options (Comma separated)\n </label>\n <input\n type=\"text\"\n value={field.options || ''}\n onChange={(e) => handleFieldChange(index, 'options', e.target.value)}\n placeholder=\"e.g. red, blue, green\"\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n />\n </div>\n ) : field.type === 'relationship' ? (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Relate To Collection\n </label>\n <select\n value={field.relationTo || ''}\n onChange={(e) => handleFieldChange(index, 'relationTo', e.target.value)}\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n >\n <option value=\"\">Select Target...</option>\n <option value=\"users\">Users</option>\n {collections.map((c) => (\n <option key={c.slug} value={c.slug}>\n {c.label}\n </option>\n ))}\n </select>\n </div>\n ) : (\n <div className=\"flex items-center gap-3 pt-6\">\n <input\n type=\"checkbox\"\n id={`required-checkbox-${index}`}\n checked={!!field.required}\n onChange={(e) => handleFieldChange(index, 'required', e.target.checked)}\n className=\"w-3.5 h-3.5 text-z-secondary focus:ring-z-active-border border-z-border-strong rounded-none-none bg-app\"\n />\n <label\n htmlFor={`required-checkbox-${index}`}\n className=\"text-sm font-semibold text-z-muted cursor-pointer select-none\"\n >\n Required Field\n </label>\n </div>\n )}\n\n <div className=\"flex justify-end pt-5 md:pt-0\">\n <button\n onClick={() => handleRemoveField(index)}\n disabled={newColFields.length === 1}\n className=\"p-2 border border-transparent hover:border-red-500/30 hover:bg-red-500/5 text-z-secondary hover:text-red-500 transition-colors disabled:opacity-20\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-10 pt-8 border-t border-z-border flex justify-end gap-4\">\n <button\n onClick={() => setIsVisualModalOpen(false)}\n className={cn(\n 'px-6 py-3 font-semibold text-sm transition-all leading-none border',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-muted hover:text-z-primary'\n : 'bg-z-panel border-z-border text-z-muted hover:text-z-primary'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleCreateCollection}\n disabled={visualLoading}\n className=\"px-8 py-3 bg-z-accent hover:bg-z-base text-z-primary rounded-none-none text-sm font-semibold shadow-xl shadow-[var(--z-border)] transition-all flex items-center gap-2 leading-none\"\n >\n {visualLoading ? (\n <Loader2 size={12} className=\"animate-spin\" />\n ) : (\n <Check size={12} />\n )}\n Create Content Type\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default CollectionsPage\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CollectionsPage-CL_t5JRI.js","names":[],"sources":["../../src/pages/CollectionsPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport {\n Database,\n Layers,\n ArrowRight,\n Search,\n Activity,\n Shield,\n Zap,\n Loader2,\n Plus,\n Trash2,\n Check,\n Code2,\n} from 'lucide-react'\nimport { Link, useNavigate } from 'react-router-dom'\nimport { motion } from 'framer-motion'\nimport { cn } from '../lib/utils'\nimport api from '../lib/api'\nimport toast from 'react-hot-toast'\nimport { useTheme } from '../context/ThemeContext'\nimport { useSystemMetadata } from '../hooks/useQueries'\nimport { PageHeader } from '../components/ui/PageHeader'\n\nconst CollectionsPage: React.FC = () => {\n const { theme } = useTheme()\n const navigate = useNavigate()\n // --- REGISTRY STATE: CONTENT INFRASTRUCTURE ---\n const [collections, setCollections] = useState<any[]>([])\n const [loading, setLoading] = useState(true)\n const [searchQuery, setSearchQuery] = useState('')\n const [stats, setStats] = useState<any>({})\n\n /**\n * REGISTRY HARVEST: SYNCHRONIZE CONTENT NODES\n * Orchestrates parallel retrieval of system health (for schema/labels)\n * and record counts for each collection node.\n */\n const { data: healthData, isLoading: healthLoading } = useSystemMetadata()\n\n useEffect(() => {\n const fetchCounts = async () => {\n if (!healthData) return\n try {\n const countsRes = await api.get('/system/counts').catch(() => null)\n \n const rawCollections = healthData.collections || []\n\n const processedCollections = rawCollections.map((c: any) => ({\n ...c,\n label: c.label || c.name || c.slug || 'Unnamed Collection',\n }))\n\n setCollections(processedCollections)\n setStats(countsRes?.data?.data || {})\n } catch (error) {\n console.error('Critical Registry Synchronization Failure', error)\n toast.error('Failed to load collections')\n } finally {\n setLoading(false)\n }\n }\n\n if (!healthLoading) {\n fetchCounts()\n }\n }, [healthData, healthLoading])\n\n /**\n * SEARCH & FILTER LOGIC: CLIENT-SIDE MATRIX REDUCTION\n */\n const filteredCollections = collections.filter((col) => {\n const label = (col.label || '').toLowerCase()\n const slug = (col.slug || '').toLowerCase()\n const query = searchQuery.toLowerCase()\n return label.includes(query) || slug.includes(query)\n })\n\n const [isAIModalOpen, setIsAIModalOpen] = useState(false)\n const [aiPrompt, setAiPrompt] = useState('')\n const [aiLoading, setAiLoading] = useState(false)\n const [aiResult, setAiResult] = useState<any>(null)\n\n const handleAIGenerate = async () => {\n if (!aiPrompt) return\n setAiLoading(true)\n setAiResult(null)\n try {\n const res = await api.post('/system/ai-architect', { prompt: aiPrompt })\n setAiResult(res.data?.data?.schema || { error: 'Failed to parse schema.' })\n } catch (e) {\n setAiResult({ error: 'Failed to connect to AI Architect.' })\n } finally {\n setAiLoading(false)\n }\n }\n\n // --- VISUAL CONTENT-TYPE BUILDER STATE ---\n const [isVisualModalOpen, setIsVisualModalOpen] = useState(false)\n const [visualLoading, setVisualLoading] = useState(false)\n const [newColName, setNewColName] = useState('')\n const [newColSlug, setNewColSlug] = useState('')\n const [newColDrafts, setNewColDrafts] = useState(true)\n const [newColFields, setNewColFields] = useState<any[]>([\n { name: 'title', type: 'text', required: true, options: '', relationTo: '' },\n ])\n\n const handleNameChange = (name: string) => {\n setNewColName(name)\n setNewColSlug(\n name\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n )\n }\n\n const handleAddField = () => {\n setNewColFields([\n ...newColFields,\n { name: '', type: 'text', required: false, options: '', relationTo: '' },\n ])\n }\n\n const handleRemoveField = (index: number) => {\n setNewColFields(newColFields.filter((_, idx) => idx !== index))\n }\n\n const handleFieldChange = (index: number, key: string, value: any) => {\n setNewColFields(\n newColFields.map((field, idx) => {\n if (idx === index) {\n return { ...field, [key]: value }\n }\n return field\n })\n )\n }\n\n const handleCreateCollection = async () => {\n if (!newColName || !newColSlug || newColFields.length === 0) {\n toast.error('Please enter a collection name and add at least one field.')\n return\n }\n if (newColFields.some((f) => !f.name)) {\n toast.error('All fields must have a name.')\n return\n }\n\n setVisualLoading(true)\n try {\n await api.post('/system/collections', {\n name: newColName,\n slug: newColSlug,\n drafts: newColDrafts,\n fields: newColFields.map((f) => ({\n name: f.name\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '_')\n .replace(/[^a-z0-9_]/g, ''),\n type: f.type,\n required: !!f.required,\n ...(f.type === 'select' &&\n f.options && {\n options: f.options\n .split(',')\n .map((o: string) => ({ label: o.trim(), value: o.trim() }))\n .filter((o: any) => o.value),\n }),\n ...(f.type === 'relationship' && f.relationTo && { relationTo: f.relationTo }),\n })),\n })\n toast.success('Collection created successfully! Reloading...')\n setIsVisualModalOpen(false)\n setTimeout(() => {\n window.location.reload()\n }, 1500)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to create collection.')\n } finally {\n setVisualLoading(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <Loader2 className=\"animate-spin text-z-secondary \" size={32} />\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col h-[calc(100vh-64px)] overflow-hidden\">\n <PageHeader\n title=\"Content Assets\"\n actions={\n <div className=\"flex items-center gap-4 w-full md:w-auto flex-wrap\">\n <button\n onClick={() => setIsVisualModalOpen(true)}\n className=\"flex items-center gap-2 px-6 py-4 bg-z-accent text-z-logo-text text-sm font-semibold hover:bg-z-accent transition-colors shadow-lg shadow-sm\"\n >\n <Plus size={14} />\n Create Collection\n </button>\n\n <button\n onClick={() => setIsAIModalOpen(true)}\n className={cn(\n \"flex items-center gap-2 px-6 py-4 text-sm font-semibold transition-colors\",\n 'bg-z-panel hover:bg-z-hover text-z-primary border-z-border'\n )}\n >\n <Zap size={14} className=\"text-z-active-text\" />\n AI Architect\n </button>\n\n <div className=\"relative w-full md:w-80\">\n <Search className=\"absolute left-4 top-1/2 -translate-y-1/2 text-z-secondary\" size={14} />\n <input\n type=\"text\"\n placeholder=\"FILTER_COLLECTIONS...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full border rounded-none-none py-4 pl-12 pr-4 text-sm font-semibold transition-all outline-none ',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-accent/50 focus:bg-z-hover'\n : 'bg-z-panel border-z-border focus:border-z-accent/50'\n )}\n />\n </div>\n </div>\n }\n />\n <div className={cn(\n 'flex-1 overflow-y-auto p-6 md:p-10 space-y-10 transition-colors duration-500',\n theme === 'dark' ? 'bg-app text-z-primary' : 'bg-[#fafafa] text-z-primary'\n )}>\n {/* System Integrity Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n {[\n {\n label: 'Total Records',\n value: String(Object.values(stats).reduce((a: number, b: number) => a + b, 0)),\n icon: Activity,\n sub: 'Global Synchronization',\n },\n { label: 'Schema Health', value: '100%', icon: Shield, sub: 'Optimal Performance' },\n { label: 'Latency', value: '14ms', icon: Zap, sub: 'Neural Processing' },\n ].map((item, i) => (\n <div\n key={i}\n className={cn(\n 'p-8 border rounded-none-none flex flex-col gap-4 transition-all relative overflow-hidden group',\n theme === 'dark'\n ? 'bg-z-panel border-z-border'\n : 'bg-z-panel border-z-border shadow-sm shadow-sm'\n )}\n >\n <div className=\"absolute top-0 right-0 p-4 opacity-5 group-hover:opacity-10 transition-opacity\">\n <item.icon size={80} />\n </div>\n <span className=\"text-sm font-semibold text-z-secondary\">\n {item.label}\n </span>\n <div className=\"flex items-baseline gap-3\">\n <span className=\"text-4xl font-semibold\">\n {item.value}\n </span>\n <span className=\"text-sm font-bold text-z-secondary \">\n {item.sub}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Collection Matrix */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-6\">\n {filteredCollections.map((col, i) => (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: i * 0.05 }}\n key={col.slug}\n >\n <div\n onClick={() => navigate(`/collections/${col.slug}`)}\n className={cn(\n 'group p-8 border flex flex-col items-center text-center gap-5 transition-all duration-500 relative overflow-hidden cursor-pointer',\n 'bg-z-panel backdrop-blur-xl border-z-border shadow-sm hover:scale-[1.02] hover:border-z-active-border hover:shadow-premium'\n )}\n >\n {/* Micro-animation gradient background */}\n <div className=\"absolute inset-0 bg-gradient-to-br from-z-accent/0 to-z-accent/0 group-hover:from-z-accent/5 group-hover:to-transparent transition-all duration-500\" />\n \n <div\n className={cn(\n 'w-14 h-14 rounded-full flex items-center justify-center transition-all duration-500 relative z-10',\n 'bg-z-hover text-z-muted group-hover:bg-z-active-bg group-hover:text-z-active-text'\n )}\n >\n <Layers size={24} strokeWidth={1.5} />\n </div>\n\n <div className=\"relative z-10 flex flex-col items-center w-full\">\n <h3 className=\"text-xl font-black tracking-tight leading-none mb-3 group-hover:text-z-active-text transition-colors duration-500\">\n {col.label.replace(/-/g, ' ')}\n </h3>\n <div className=\"flex items-center justify-center mb-4\">\n <span className=\"px-2.5 py-1 rounded-full text-[9px] font-black uppercase tracking-widest bg-z-hover text-z-primary\">\n {stats[col.slug] || 0} Entries\n </span>\n </div>\n <p className=\"text-[11px] font-medium text-z-secondary leading-relaxed max-w-[90%]\">\n Manage and organize your {col.label.toLowerCase()} documents.\n </p>\n </div>\n\n <div className=\"w-full flex items-center justify-center pt-5 mt-auto border-t border-z-border/50 relative z-10\">\n <Link\n to={`/collections/${col.slug}/hooks`}\n onClick={(e) => e.stopPropagation()}\n className=\"flex items-center gap-1.5 text-[10px] font-black uppercase tracking-widest text-z-secondary hover:text-z-active-text transition-colors duration-300\"\n >\n <Code2 size={12} />\n Manage Hooks\n </Link>\n </div>\n </div>\n </motion.div>\n ))}\n </div>\n\n {isAIModalOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm p-4\">\n <div\n className={cn(\n 'w-full max-w-3xl p-8 border shadow-2xl relative',\n 'bg-z-panel border-z-border'\n )}\n >\n <button\n onClick={() => setIsAIModalOpen(false)}\n className=\"absolute top-4 right-4 text-z-secondary hover:text-z-primary\"\n >\n \n </button>\n <h2 className=\"text-2xl font-semibold mb-4 flex items-center gap-2\">\n <Zap className=\"text-z-secondary \" /> AI Schema Architect\n </h2>\n <p className=\"text-sm font-bold text-z-secondary mb-6\">\n Describe the collection you want to create and let AI build the schema configuration.\n </p>\n\n <textarea\n value={aiPrompt}\n onChange={(e) => setAiPrompt(e.target.value)}\n placeholder=\"e.g., I need a blog post collection with title, content, cover image, seo metadata, and a category dropdown...\"\n className={cn(\n 'w-full h-32 p-4 mb-4 font-mono text-sm border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black focus:ring-2 focus:ring-z-active-border resize-none',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-input border-z-border'\n )}\n />\n\n <button\n onClick={handleAIGenerate}\n disabled={aiLoading}\n className=\"w-full py-4 bg-z-accent hover:bg-z-base text-z-primary font-semibold flex items-center justify-center gap-2\"\n >\n {aiLoading ? <Loader2 className=\"animate-spin\" size={16} /> : <Database size={16} />}\n {aiLoading ? 'Synthesizing Architecture...' : 'Generate Schema'}\n </button>\n\n {aiResult && (\n <div className=\"mt-6 border-t border-z-border pt-6\">\n <p className=\"text-sm font-bold text-z-muted mb-2\">\n Generated Schema Configuration (Copy to cms.config.ts)\n </p>\n <div className=\"relative\">\n <pre className=\"p-4 bg-[var(--z-bg-code)] text-z-muted text-xs font-mono overflow-auto max-h-64 border border-z-border\">\n {JSON.stringify(aiResult, null, 2)}\n </pre>\n <button\n onClick={() => navigator.clipboard.writeText(JSON.stringify(aiResult, null, 2))}\n className=\"absolute top-2 right-2 px-3 py-1 bg-z-hover hover:bg-z-panel border border-z-border text-sm font-semibold text-z-primary\"\n >\n Copy\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n {isVisualModalOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-md p-4 overflow-y-auto\">\n <div\n className={cn(\n 'w-full max-w-4xl p-10 border shadow-2xl relative my-8',\n 'bg-z-panel border-z-border text-z-primary'\n )}\n >\n <button\n onClick={() => setIsVisualModalOpen(false)}\n className=\"absolute top-6 right-6 w-8 h-8 flex items-center justify-center bg-z-hover hover:bg-z-panel rounded-none-none border border-z-border transition-colors text-z-muted hover:text-z-primary\"\n >\n \n </button>\n <h2 className=\"text-3xl font-semibold mb-4 flex items-center gap-3\">\n <Database className=\"text-z-secondary animate-pulse\" /> Visual Schema Builder\n </h2>\n <p className=\"text-sm font-semibold text-z-secondary mb-8 border-b border-z-border pb-4\">\n Define collection specifications, fields, types, and constraints visually without\n writing code.\n </p>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6 mb-8\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Collection Name\n </label>\n <input\n type=\"text\"\n name=\"name\"\n value={newColName}\n onChange={(e) => handleNameChange(e.target.value)}\n placeholder=\"e.g. Review\"\n className={cn(\n 'w-full px-4 py-3 text-sm font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all ',\n 'bg-z-input border-z-border text-z-primary'\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Slug\n </label>\n <input\n type=\"text\"\n name=\"slug\"\n value={newColSlug}\n onChange={(e) => setNewColSlug(e.target.value)}\n placeholder=\"e.g. reviews\"\n className={cn(\n 'w-full px-4 py-3 text-sm font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all lowercase ',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-muted'\n : 'bg-z-input border-z-border text-z-secondary'\n )}\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 mb-8 px-2\">\n <input\n type=\"checkbox\"\n id=\"enable-drafts-checkbox\"\n checked={newColDrafts}\n onChange={(e) => setNewColDrafts(e.target.checked)}\n className=\"w-4 h-4 text-z-secondary focus:ring-z-active-border border-z-border-strong rounded-none-none bg-app\"\n />\n <label\n htmlFor=\"enable-drafts-checkbox\"\n className=\"text-sm font-semibold text-z-muted cursor-pointer select-none\"\n >\n Enable Draft/Publish Workflow\n </label>\n </div>\n\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-3\">\n <h3 className=\"text-xs font-semibold text-z-muted\">\n Field Definitions\n </h3>\n <button\n onClick={handleAddField}\n className=\"px-4 py-2 border border-dashed border-z-border/30 text-z-secondary hover:bg-z-hover text-sm font-semibold transition-all flex items-center gap-2\"\n >\n <Plus size={12} /> Add Field\n </button>\n </div>\n\n <div className=\"space-y-4 max-h-[30vh] overflow-y-auto pr-2 custom-scrollbar\">\n {newColFields.map((field, index) => (\n <div\n key={index}\n className={cn(\n 'p-5 border rounded-none-none grid grid-cols-1 md:grid-cols-4 gap-4 items-center relative group/field',\n theme === 'dark'\n ? 'bg-app border-z-border'\n : 'bg-z-input border-z-border shadow-sm'\n )}\n >\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Field Name\n </label>\n <input\n type=\"text\"\n name={`field-name-${index}`}\n value={field.name}\n onChange={(e) => handleFieldChange(index, 'name', e.target.value)}\n placeholder=\"e.g. rating\"\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all lowercase font-mono',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Type\n </label>\n <select\n value={field.type}\n onChange={(e) => handleFieldChange(index, 'type', e.target.value)}\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n >\n <option value=\"text\">Text</option>\n <option value=\"number\">Number</option>\n <option value=\"richtext\">Rich Text</option>\n <option value=\"media\">Media</option>\n <option value=\"checkbox\">Boolean</option>\n <option value=\"select\">Dropdown Select</option>\n <option value=\"relationship\">Relationship</option>\n </select>\n </div>\n\n {field.type === 'select' ? (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Options (Comma separated)\n </label>\n <input\n type=\"text\"\n value={field.options || ''}\n onChange={(e) => handleFieldChange(index, 'options', e.target.value)}\n placeholder=\"e.g. red, blue, green\"\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n />\n </div>\n ) : field.type === 'relationship' ? (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary block\">\n Relate To Collection\n </label>\n <select\n value={field.relationTo || ''}\n onChange={(e) => handleFieldChange(index, 'relationTo', e.target.value)}\n className={cn(\n 'w-full px-3 py-2 text-xs font-bold border rounded-none-none focus:ring-2 focus:ring-z-active-border outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-all',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary'\n : 'bg-z-panel border-z-border'\n )}\n >\n <option value=\"\">Select Target...</option>\n <option value=\"users\">Users</option>\n {collections.map((c) => (\n <option key={c.slug} value={c.slug}>\n {c.label}\n </option>\n ))}\n </select>\n </div>\n ) : (\n <div className=\"flex items-center gap-3 pt-6\">\n <input\n type=\"checkbox\"\n id={`required-checkbox-${index}`}\n checked={!!field.required}\n onChange={(e) => handleFieldChange(index, 'required', e.target.checked)}\n className=\"w-3.5 h-3.5 text-z-secondary focus:ring-z-active-border border-z-border-strong rounded-none-none bg-app\"\n />\n <label\n htmlFor={`required-checkbox-${index}`}\n className=\"text-sm font-semibold text-z-muted cursor-pointer select-none\"\n >\n Required Field\n </label>\n </div>\n )}\n\n <div className=\"flex justify-end pt-5 md:pt-0\">\n <button\n onClick={() => handleRemoveField(index)}\n disabled={newColFields.length === 1}\n className=\"p-2 border border-transparent hover:border-red-500/30 hover:bg-red-500/5 text-z-secondary hover:text-red-500 transition-colors disabled:opacity-20\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-10 pt-8 border-t border-z-border flex justify-end gap-4\">\n <button\n onClick={() => setIsVisualModalOpen(false)}\n className={cn(\n 'px-6 py-3 font-semibold text-sm transition-all leading-none border',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-muted hover:text-z-primary'\n : 'bg-z-panel border-z-border text-z-muted hover:text-z-primary'\n )}\n >\n Cancel\n </button>\n <button\n onClick={handleCreateCollection}\n disabled={visualLoading}\n className=\"px-8 py-3 bg-z-accent hover:bg-z-base text-z-primary rounded-none-none text-sm font-semibold shadow-xl shadow-[var(--z-border)] transition-all flex items-center gap-2 leading-none\"\n >\n {visualLoading ? (\n <Loader2 size={12} className=\"animate-spin\" />\n ) : (\n <Check size={12} />\n )}\n Create Content Type\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default CollectionsPage\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{$n as t,Bt as n,C as r,G as i,Jt as a,Ln as o,Mn as s,Q as c,Ut as l,Vt as u,Zt as d,an as f,cn as p,d as m,fn as h,ir as g,l as _,rr as v,vr as y,xr as b}from"./vendor-react-DQVTOTFO.js";import{a as x,o as S,t as C}from"./utils-fgvbH6CB.js";import{m as w,s as T}from"./index-
|
|
1
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{$n as t,Bt as n,C as r,G as i,Jt as a,Ln as o,Mn as s,Q as c,Ut as l,Vt as u,Zt as d,an as f,cn as p,d as m,fn as h,ir as g,l as _,rr as v,vr as y,xr as b}from"./vendor-react-DQVTOTFO.js";import{a as x,o as S,t as C}from"./utils-fgvbH6CB.js";import{m as w,s as T}from"./index-yE_3fruG.js";var E=e(b(),1),D=y(),O=[`text`,`textarea`,`number`,`boolean`,`richtext`,`date`,`email`,`media`,`relation`,`color`,`array`,`group`,`blocks`,`dz`,`select`,`json`,`slug`,`code`,`password`],k=[`General`,`Layout`,`Content`,`Commerce`,`Media`,`Social`,`Navigation`,`Forms`],A=({activeComponent:e,setActiveComponent:n,showPreview:i,generateJSON:o,generateTS:s,copied:u,setCopied:d,dark:f})=>{let m=C(`w-full border p-3 text-sm font-bold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-colors rounded-none shadow-sm`,`z-input`),h=()=>{n({...e,fields:[...e.fields,{name:``,type:`text`}]})},_=(t,r,i)=>{let a=[...e.fields];a[t]={...a[t],[r]:i},n({...e,fields:a})},y=t=>{let r=[...e.fields];r.splice(t,1),n({...e,fields:r})};return(0,D.jsxs)(v.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0},className:`space-y-6`,children:[(0,D.jsxs)(`div`,{className:C(`p-6 border rounded-none space-y-4 shadow-sm transition-all`,`z-panel`),children:[(0,D.jsx)(`h3`,{className:`text-sm font-semibold text-z-secondary border-b border-z-border/20 pb-2`,children:`General Info`}),(0,D.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,D.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,D.jsx)(`label`,{className:`text-sm font-bold text-z-secondary block`,children:`Display Name`}),(0,D.jsx)(`input`,{type:`text`,value:e.displayName,onChange:t=>n({...e,displayName:t.target.value}),className:m,placeholder:`e.g. Hero Section`})]}),(0,D.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,D.jsx)(`label`,{className:`text-sm font-bold text-z-secondary block`,children:`Category`}),(0,D.jsx)(`select`,{value:e.category,onChange:t=>n({...e,category:t.target.value}),className:C(m,`cursor-pointer`),children:k.map(e=>(0,D.jsx)(`option`,{value:e,className:`text-z-primary`,children:e},e))})]}),(0,D.jsxs)(`div`,{className:`space-y-1.5 col-span-2`,children:[(0,D.jsx)(`label`,{className:`text-sm font-bold text-z-secondary block`,children:`Component Slug (API ID)`}),(0,D.jsx)(`input`,{type:`text`,value:e.slug,onChange:t=>n({...e,slug:t.target.value.toLowerCase().replace(/[^a-z0-9_-]/g,``)}),disabled:!!e.id,className:C(m,`font-mono disabled:opacity-50`),placeholder:`e.g. hero-section`})]}),(0,D.jsxs)(`div`,{className:`space-y-1.5 col-span-2`,children:[(0,D.jsx)(`label`,{className:`text-sm font-bold text-z-secondary block`,children:`Description`}),(0,D.jsx)(`input`,{type:`text`,value:e.description,onChange:t=>n({...e,description:t.target.value}),className:m,placeholder:`Brief description of this component...`})]})]})]}),(0,D.jsxs)(`div`,{className:C(`p-6 border rounded-none shadow-sm transition-all`,`z-panel`),children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-5 border-b border-z-border/20 pb-2`,children:[(0,D.jsx)(`h3`,{className:`text-sm font-semibold text-z-secondary `,children:`Fields Configuration`}),(0,D.jsxs)(`button`,{onClick:h,className:`flex items-center gap-1.5 text-sm font-semibold text-z-secondary hover:text-z-primary hover:bg-z-active-bg px-3 py-1.5 bg-z-panel rounded-none transition-all`,children:[(0,D.jsx)(c,{size:12}),` Add Field`]})]}),(0,D.jsx)(`div`,{className:`space-y-3`,children:(0,D.jsx)(g,{children:e.fields.map((e,t)=>(0,D.jsxs)(v.div,{layout:!0,initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0},className:C(`flex items-center gap-3 p-3.5 border rounded-none group shadow-sm transition-all`,f?`bg-z-panel backdrop-blur-sm border-z-border hover:border-z-active-border`:`bg-z-input border-z-border hover:border-z-border-strong`),children:[(0,D.jsx)(`input`,{type:`text`,value:e.name,onChange:e=>_(t,`name`,e.target.value.toLowerCase().replace(/[^a-z0-9_]/g,``)),placeholder:`field_name`,className:`flex-1 bg-transparent border-b border-transparent focus:border-z-accent text-sm font-mono outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1 transition-colors`}),(0,D.jsx)(`select`,{value:e.type,onChange:e=>_(t,`type`,e.target.value),className:`w-36 bg-transparent border-b border-transparent focus:border-z-accent text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1 transition-colors cursor-pointer`,children:O.map(e=>(0,D.jsx)(`option`,{value:e,className:`text-z-primary`,children:e},e))}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 text-sm font-semibold text-z-muted`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:e.required||!1,onChange:e=>_(t,`required`,e.target.checked),className:`accent-z-accent`}),`Req`]}),(0,D.jsx)(`button`,{onClick:()=>y(t),className:`text-red-500/40 hover:text-red-500 transition-colors p-1.5 rounded-none opacity-0 group-hover:opacity-100`,children:(0,D.jsx)(r,{size:14})})]},t))})})]}),i&&(0,D.jsxs)(`div`,{className:C(`p-6 border rounded-none shadow-sm transition-all`,`z-panel`),children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,D.jsxs)(`h3`,{className:`text-sm font-semibold text-z-active-text flex items-center gap-2`,children:[(0,D.jsx)(t,{size:12}),` Live JSON Preview`]}),(0,D.jsxs)(`div`,{className:`flex gap-2`,children:[(0,D.jsxs)(`button`,{onClick:()=>{navigator.clipboard.writeText(o()),d(!0),setTimeout(()=>d(!1),2e3)},className:C(`flex items-center gap-1.5 px-3 py-1.5 border text-sm font-semibold rounded-none transition-all`,f?`border-z-border hover:bg-z-hover`:`border-z-border hover:bg-[var(--z-bg-input)]`),children:[u?(0,D.jsx)(p,{size:12,className:`text-z-secondary `}):(0,D.jsx)(a,{size:12}),` Copy JSON`]}),(0,D.jsxs)(`button`,{onClick:()=>{let t=new Blob([s()],{type:`text/typescript`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`${e.slug||`component`}.ts`,r.click()},className:C(`flex items-center gap-1.5 px-3 py-1.5 border text-sm font-semibold rounded-none transition-all text-z-active-text border-z-active-border hover:bg-z-active-bg`),children:[(0,D.jsx)(l,{size:12}),` TypeScript`]})]})]}),(0,D.jsx)(`pre`,{className:C(`text-sm font-mono overflow-auto max-h-64 p-4 rounded-none text-z-secondary shadow-inner border`,f?`bg-z-popover border-z-border`:`bg-z-accent border-z-border`),children:o()})]})]},`visual`)},j=({codeImport:e,setCodeImport:t,handleCodeImport:n,handleRegisterCode:r,dark:a})=>(0,D.jsx)(v.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0},className:`space-y-4`,children:(0,D.jsxs)(`div`,{className:C(`p-6 border rounded-none shadow-sm transition-all`,`z-panel`),children:[(0,D.jsxs)(`h3`,{className:`text-sm font-semibold text-z-active-text mb-1 flex items-center gap-2`,children:[(0,D.jsx)(d,{size:12}),` Import from Code / JSON`]}),(0,D.jsx)(`p`,{className:C(`text-sm mb-4 font-medium`,a?`text-z-muted`:`text-z-secondary`),children:`Paste a JSON component definition, a TypeScript interface, or a raw fields array. The parser will auto-detect the format.`}),(0,D.jsxs)(`div`,{className:C(`p-4 rounded-none text-sm font-mono mb-4 text-z-secondary border shadow-inner`,a?`bg-z-popover border-z-border`:`bg-z-accent border-z-border`),children:[(0,D.jsx)(`p`,{className:`text-z-secondary mb-2`,children:`// JSON format (recommended)`}),`{
|
|
2
2
|
"slug": "hero-section",
|
|
3
3
|
"displayName": "Hero Section",
|
|
4
4
|
"category": "Layout",
|
package/dist/assets/{ComponentBuilderPage-C3mhOLPs.js.map → ComponentBuilderPage-C58Rr1cu.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentBuilderPage-C3mhOLPs.js","names":[],"sources":["../../src/pages/component-builder/BuilderVisualTab.tsx","../../src/pages/component-builder/BuilderCodeTab.tsx","../../src/pages/component-builder/BuilderAITab.tsx","../../src/pages/ComponentBuilderPage.tsx"],"sourcesContent":["import React from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Plus, Trash2, Check, Copy, Download, Braces } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nconst FIELD_TYPES = [\n 'text', 'textarea', 'number', 'boolean', 'richtext', 'date',\n 'email', 'media', 'relation', 'color', 'array', 'group', 'blocks', 'dz',\n 'select', 'json', 'slug', 'code', 'password',\n]\n\nconst CATEGORIES = ['General', 'Layout', 'Content', 'Commerce', 'Media', 'Social', 'Navigation', 'Forms']\n\nexport const BuilderVisualTab = ({\n activeComponent,\n setActiveComponent,\n showPreview,\n generateJSON,\n generateTS,\n copied,\n setCopied,\n dark\n}: any) => {\n const inputCls = cn(\n 'w-full border p-3 text-sm font-bold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-colors rounded-none shadow-sm',\n 'z-input'\n )\n\n const addField = () => {\n setActiveComponent({\n ...activeComponent,\n fields: [...activeComponent.fields, { name: '', type: 'text' }]\n })\n }\n\n const updateField = (index: number, key: string, value: any) => {\n const newFields = [...activeComponent.fields]\n newFields[index] = { ...newFields[index], [key]: value }\n setActiveComponent({ ...activeComponent, fields: newFields })\n }\n\n const removeField = (index: number) => {\n const newFields = [...activeComponent.fields]\n newFields.splice(index, 1)\n setActiveComponent({ ...activeComponent, fields: newFields })\n }\n\n return (\n <motion.div key=\"visual\" initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }} className=\"space-y-6\">\n {/* General info */}\n <div className={cn('p-6 border rounded-none space-y-4 shadow-sm transition-all', 'z-panel')}>\n <h3 className=\"text-sm font-semibold text-z-secondary border-b border-z-border/20 pb-2\">General Info</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-bold text-z-secondary block\">Display Name</label>\n <input type=\"text\" value={activeComponent.displayName} onChange={(e) => setActiveComponent({ ...activeComponent, displayName: e.target.value })} className={inputCls} placeholder=\"e.g. Hero Section\" />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-bold text-z-secondary block\">Category</label>\n <select value={activeComponent.category} onChange={(e) => setActiveComponent({ ...activeComponent, category: e.target.value })} className={cn(inputCls, 'cursor-pointer')}>\n {CATEGORIES.map(c => <option key={c} value={c} className=\"text-z-primary\">{c}</option>)}\n </select>\n </div>\n <div className=\"space-y-1.5 col-span-2\">\n <label className=\"text-sm font-bold text-z-secondary block\">Component Slug (API ID)</label>\n <input type=\"text\" value={activeComponent.slug} onChange={(e) => setActiveComponent({ ...activeComponent, slug: e.target.value.toLowerCase().replace(/[^a-z0-9_-]/g, '') })} disabled={!!activeComponent.id} className={cn(inputCls, 'font-mono disabled:opacity-50')} placeholder=\"e.g. hero-section\" />\n </div>\n <div className=\"space-y-1.5 col-span-2\">\n <label className=\"text-sm font-bold text-z-secondary block\">Description</label>\n <input type=\"text\" value={activeComponent.description} onChange={(e) => setActiveComponent({ ...activeComponent, description: e.target.value })} className={inputCls} placeholder=\"Brief description of this component...\" />\n </div>\n </div>\n </div>\n\n {/* Fields */}\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <div className=\"flex items-center justify-between mb-5 border-b border-z-border/20 pb-2\">\n <h3 className=\"text-sm font-semibold text-z-secondary \">Fields Configuration</h3>\n <button onClick={addField} className=\"flex items-center gap-1.5 text-sm font-semibold text-z-secondary hover:text-z-primary hover:bg-z-active-bg px-3 py-1.5 bg-z-panel rounded-none transition-all\">\n <Plus size={12} /> Add Field\n </button>\n </div>\n <div className=\"space-y-3\">\n <AnimatePresence>\n {activeComponent.fields.map((field: any, idx: number) => (\n <motion.div\n key={idx}\n layout\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0 }}\n className={cn('flex items-center gap-3 p-3.5 border rounded-none group shadow-sm transition-all', dark ? 'bg-z-panel backdrop-blur-sm border-z-border hover:border-z-active-border' : 'bg-z-input border-z-border hover:border-z-border-strong')}\n >\n <input\n type=\"text\"\n value={field.name}\n onChange={e => updateField(idx, 'name', e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, ''))}\n placeholder=\"field_name\"\n className=\"flex-1 bg-transparent border-b border-transparent focus:border-z-accent text-sm font-mono outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1 transition-colors\"\n />\n <select\n value={field.type}\n onChange={e => updateField(idx, 'type', e.target.value)}\n className=\"w-36 bg-transparent border-b border-transparent focus:border-z-accent text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1 transition-colors cursor-pointer\"\n >\n {FIELD_TYPES.map(t => <option key={t} value={t} className=\"text-z-primary\">{t}</option>)}\n </select>\n <label className=\"flex items-center gap-2 text-sm font-semibold text-z-muted\">\n <input type=\"checkbox\" checked={field.required || false} onChange={e => updateField(idx, 'required', e.target.checked)} className=\"accent-z-accent\" />\n Req\n </label>\n <button onClick={() => removeField(idx)} className=\"text-red-500/40 hover:text-red-500 transition-colors p-1.5 rounded-none opacity-0 group-hover:opacity-100\">\n <Trash2 size={14} />\n </button>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n </div>\n\n {showPreview && (\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-sm font-semibold text-z-active-text flex items-center gap-2\">\n <Braces size={12} /> Live JSON Preview\n </h3>\n <div className=\"flex gap-2\">\n <button\n onClick={() => { navigator.clipboard.writeText(generateJSON()); setCopied(true); setTimeout(() => setCopied(false), 2000) }}\n className={cn('flex items-center gap-1.5 px-3 py-1.5 border text-sm font-semibold rounded-none transition-all', dark ? 'border-z-border hover:bg-z-hover' : 'border-z-border hover:bg-[var(--z-bg-input)]')}\n >\n {copied ? <Check size={12} className=\"text-z-secondary \" /> : <Copy size={12} />} Copy JSON\n </button>\n <button\n onClick={() => { const blob = new Blob([generateTS()], { type: 'text/typescript' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${activeComponent.slug || 'component'}.ts`; a.click() }}\n className={cn('flex items-center gap-1.5 px-3 py-1.5 border text-sm font-semibold rounded-none transition-all text-z-active-text border-z-active-border hover:bg-z-active-bg')}\n >\n <Download size={12} /> TypeScript\n </button>\n </div>\n </div>\n <pre className={cn('text-sm font-mono overflow-auto max-h-64 p-4 rounded-none text-z-secondary shadow-inner border', dark ? 'bg-z-popover border-z-border' : 'bg-z-accent border-z-border')}>{generateJSON()}</pre>\n </div>\n )}\n </motion.div>\n )\n}\n","import React from 'react'\nimport { motion } from 'framer-motion'\nimport { Code, ChevronRight, Save, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport const BuilderCodeTab = ({\n codeImport,\n setCodeImport,\n handleCodeImport,\n handleRegisterCode,\n dark\n}: any) => {\n return (\n <motion.div key=\"code\" initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }} className=\"space-y-4\">\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <h3 className=\"text-sm font-semibold text-z-active-text mb-1 flex items-center gap-2\">\n <Code size={12} /> Import from Code / JSON\n </h3>\n <p className={cn('text-sm mb-4 font-medium', dark ? 'text-z-muted' : 'text-z-secondary')}>\n Paste a JSON component definition, a TypeScript interface, or a raw fields array. The parser will auto-detect the format.\n </p>\n\n {/* Format examples */}\n <div className={cn('p-4 rounded-none text-sm font-mono mb-4 text-z-secondary border shadow-inner', dark ? 'bg-z-popover border-z-border' : 'bg-z-accent border-z-border')}>\n <p className=\"text-z-secondary mb-2\">// JSON format (recommended)</p>\n {`{\n \"slug\": \"hero-section\",\n \"displayName\": \"Hero Section\",\n \"category\": \"Layout\",\n \"description\": \"Full-width hero with CTA\",\n \"fields\": [\n { \"name\": \"headline\", \"type\": \"text\", \"required\": true },\n { \"name\": \"subtext\", \"type\": \"textarea\" },\n { \"name\": \"backgroundImage\", \"type\": \"media\" },\n { \"name\": \"ctaLabel\", \"type\": \"text\" },\n { \"name\": \"ctaUrl\", \"type\": \"text\" }\n ]\n}`}\n </div>\n\n <textarea\n rows={12}\n value={codeImport}\n onChange={e => setCodeImport(e.target.value)}\n placeholder='Paste JSON or TypeScript interface here...'\n className={cn('w-full border p-4 text-sm font-mono outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black rounded-none placeholder:text-z-secondary resize-none shadow-inner', dark ? 'bg-z-panel backdrop-blur-sm border-z-border focus:border-z-accent/50 text-z-primary' : 'bg-z-input border-z-border focus:border-z-accent text-z-primary')}\n />\n\n <div className=\"flex gap-3 mt-4\">\n <button\n onClick={handleCodeImport}\n disabled={!codeImport.trim()}\n className=\"flex items-center gap-2 px-5 py-2.5 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all disabled:opacity-40 shadow-sm\"\n >\n <ChevronRight size={14} /> Import to Visual Editor\n </button>\n <button\n onClick={handleRegisterCode}\n disabled={!codeImport.trim()}\n className=\"flex items-center gap-2 px-5 py-2.5 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all disabled:opacity-40 shadow-sm\"\n title=\"Save directly to database without going through visual editor\"\n >\n <Save size={14} /> Register Directly\n </button>\n <button\n onClick={() => setCodeImport('')}\n className={cn('flex items-center gap-2 px-4 py-2.5 border text-sm font-semibold rounded-none transition-all', dark ? 'border-z-border hover:bg-z-hover' : 'border-z-border hover:bg-[var(--z-bg-input)]')}\n >\n <X size={14} /> Clear\n </button>\n </div>\n </div>\n </motion.div>\n )\n}\n","import React from 'react'\nimport { motion } from 'framer-motion'\nimport { Sparkles, Loader2 } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport const BuilderAITab = ({\n aiPrompt,\n setAiPrompt,\n isAIGenerating,\n handleAIGenerate,\n dark\n}: any) => {\n return (\n <motion.div key=\"ai\" initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }} className=\"space-y-4\">\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <h3 className=\"text-sm font-semibold text-z-active-text mb-1 flex items-center gap-2\">\n <Sparkles size={12} /> AI Component Architect\n </h3>\n <p className={cn('text-sm mb-6 font-medium', dark ? 'text-z-muted' : 'text-z-secondary')}>\n Describe a component and the AI will generate its complete field schema. Works best with detailed descriptions.\n </p>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-semibold text-z-secondary block mb-2\">Describe your component</label>\n <textarea\n rows={5}\n value={aiPrompt}\n onChange={e => setAiPrompt(e.target.value)}\n placeholder='e.g. \"A pricing card component with a plan name, price per month, list of up to 5 feature bullets, a CTA button label, a highlighted/featured boolean flag, and a color accent picker.\"'\n className={cn('w-full border p-4 text-sm outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black rounded-none placeholder:text-z-secondary resize-none shadow-inner', dark ? 'bg-z-panel backdrop-blur-sm border-z-border focus:border-z-accent/50 text-z-primary' : 'bg-z-input border-z-border focus:border-z-accent text-z-primary')}\n />\n </div>\n\n {/* Prompt suggestions */}\n <div className=\"flex flex-wrap gap-2\">\n {[\n 'Navigation bar with logo, links array, and CTA button',\n 'Product card with image, name, price, and discount badge',\n 'Team member card with photo, name, role, bio, and social links',\n 'Testimonial with quote, author, avatar, rating, and company',\n ].map(suggestion => (\n <button\n key={suggestion}\n onClick={() => setAiPrompt(suggestion)}\n className={cn('text-sm font-semibold px-3 py-1.5 border rounded-none transition-all', dark ? 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-accent/50 hover:bg-z-active-bg' : 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-active-border')}\n >\n {suggestion.slice(0, 40)}...\n </button>\n ))}\n </div>\n\n <button\n disabled={isAIGenerating || !aiPrompt.trim()}\n onClick={handleAIGenerate}\n className=\"w-full py-4 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold flex justify-center items-center gap-2 transition-all rounded-none disabled:opacity-50 shadow-sm\"\n >\n {isAIGenerating\n ? <><Loader2 size={14} className=\"animate-spin\" /> Generating with AI...</>\n : <><Sparkles size={14} /> Generate Component</>\n }\n </button>\n </div>\n </div>\n </motion.div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Plus, Box, Save, Loader2, Trash2, Copy, Code, Sparkles, Eye, EyeOff,\n ChevronRight, Check, X, Braces, Download\n} from 'lucide-react'\nimport { useTheme } from '../context/ThemeContext'\nimport { cn } from '../lib/utils'\nimport api from '../lib/api'\nimport { confirm } from '../store/confirmStore'\nimport toast from 'react-hot-toast'\nimport type { CustomComponent } from '../hooks/useCustomComponents'\nimport { invalidateCustomComponentsCache } from '../hooks/useCustomComponents'\nimport { BuilderVisualTab } from './component-builder/BuilderVisualTab'\nimport { BuilderCodeTab } from './component-builder/BuilderCodeTab'\nimport { BuilderAITab } from './component-builder/BuilderAITab'\n\n\n\n\n\n\ntype EditorTab = 'visual' | 'code' | 'ai'\n\nconst ComponentBuilderPage: React.FC = () => {\n const { theme } = useTheme()\n const dark = theme === 'dark'\n const [components, setComponents] = useState<CustomComponent[]>([])\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [activeComponent, setActiveComponent] = useState<CustomComponent | null>(null)\n const [activeTab, setActiveTab] = useState<EditorTab>('visual')\n const [codeImport, setCodeImport] = useState('')\n const [aiPrompt, setAiPrompt] = useState('')\n const [isAIGenerating, setIsAIGenerating] = useState(false)\n const [copied, setCopied] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n\n useEffect(() => {\n loadComponents()\n }, [])\n\n const loadComponents = async () => {\n setLoading(true)\n try {\n const res = await api.get('/system/components')\n setComponents(res.data.data || [])\n } catch {\n toast.error('Failed to load components')\n } finally {\n setLoading(false)\n }\n }\n\n const handleCreateNew = () => {\n setActiveComponent({\n id: '',\n slug: '',\n displayName: '',\n category: 'General',\n icon: 'Box',\n description: '',\n fields: [{ name: 'title', type: 'text' }]\n })\n setActiveTab('visual')\n }\n\n const handleSave = async () => {\n if (!activeComponent || !activeComponent.slug || !activeComponent.displayName) {\n toast.error('Slug and Display Name are required')\n return\n }\n setSaving(true)\n try {\n if (activeComponent.id) {\n await api.put(`/system/components/${activeComponent.id}`, activeComponent)\n toast.success('Component updated successfully')\n } else {\n const { id, ...dataToPost } = activeComponent\n await api.post('/system/components', dataToPost)\n toast.success('Component created successfully')\n }\n invalidateCustomComponentsCache()\n loadComponents()\n setActiveComponent(null)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to save component')\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async (id: string) => {\n if (!await confirm({ message: 'Delete this component? This may break pages currently using it.' })) return\n try {\n await api.delete(`/system/components/${id}`)\n toast.success('Component deleted')\n invalidateCustomComponentsCache()\n if (activeComponent?.id === id) setActiveComponent(null)\n loadComponents()\n } catch {\n toast.error('Failed to delete component')\n }\n }\n\n const handleDuplicate = async (id: string) => {\n try {\n await api.post(`/system/components/${id}/duplicate`)\n toast.success('Component duplicated')\n invalidateCustomComponentsCache()\n loadComponents()\n } catch {\n toast.error('Failed to duplicate component')\n }\n }\n\n // ── Code Import: parse JSON / TypeScript interface ──────────────────────────\n const handleCodeImport = () => {\n try {\n // Try JSON parse first\n let parsed: any = null\n const trimmed = codeImport.trim()\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const jsonData = JSON.parse(trimmed.startsWith('[') ? `{\"fields\":${trimmed}}` : trimmed)\n parsed = jsonData\n } else if (trimmed.includes('interface') || trimmed.includes('type ')) {\n // Parse TypeScript interface\n const fieldMatches = [...trimmed.matchAll(/(\\w+)\\??:\\s*(string|number|boolean|Date|any|object|unknown)(?:\\[\\])?/g)]\n parsed = {\n fields: fieldMatches.map(m => ({\n name: m[1],\n type: m[2] === 'string' ? 'text' : m[2] === 'number' ? 'number' : m[2] === 'boolean' ? 'checkbox' : 'json'\n }))\n }\n // Try to extract interface name\n const nameMatch = trimmed.match(/interface\\s+(\\w+)/)\n if (nameMatch) {\n parsed.displayName = nameMatch[1]\n parsed.slug = nameMatch[1].replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '')\n }\n }\n\n if (parsed && parsed.fields && Array.isArray(parsed.fields)) {\n setActiveComponent({\n id: '',\n slug: parsed.slug || '',\n displayName: parsed.displayName || parsed.name || '',\n category: parsed.category || 'General',\n icon: 'Box',\n description: parsed.description || '',\n fields: parsed.fields,\n })\n setActiveTab('visual')\n toast.success(`Imported ${parsed.fields.length} fields from code`)\n } else {\n toast.error('Could not parse fields. Use JSON format: { \"slug\": \"...\", \"displayName\": \"...\", \"fields\": [...] }')\n }\n } catch (err: any) {\n toast.error(`Parse error: ${(err instanceof Error ? err.message : String(err))}`)\n }\n }\n\n // ── Register via code (backend endpoint) ───────────────────────────────────\n const handleRegisterCode = async () => {\n try {\n const parsed = JSON.parse(codeImport)\n const res = await api.post('/system/components/register-code', parsed)\n toast.success('Component registered from code!')\n invalidateCustomComponentsCache()\n loadComponents()\n setCodeImport('')\n setActiveTab('visual')\n const comp = res.data?.data\n if (comp) setActiveComponent(comp)\n } catch (err: any) {\n toast.error(err.response?.data?.message || (err instanceof Error ? err.message : String(err)) || 'Failed to register component')\n }\n }\n\n // ── AI Generate ────────────────────────────────────────────────────────────\n const handleAIGenerate = async () => {\n if (!aiPrompt) return toast.error('Enter a prompt')\n setIsAIGenerating(true)\n try {\n const res = await api.post('/system/ai-architect', {\n prompt: `Generate a reusable UI component schema (as JSON with slug, displayName, category, description, and fields array). Component description: ${aiPrompt}`\n })\n const schema = res.data?.data\n if (schema && schema.fields) {\n setActiveComponent({\n id: '',\n slug: schema.slug || '',\n displayName: schema.displayName || schema.name || '',\n category: schema.category || 'General',\n icon: 'Box',\n description: schema.description || '',\n fields: schema.fields,\n })\n setActiveTab('visual')\n toast.success('AI generated component schema!')\n } else {\n toast.error('AI did not return a valid component schema')\n }\n } catch (err: any) {\n toast.error(err.response?.data?.error?.message || 'AI generation failed')\n } finally {\n setIsAIGenerating(false)\n }\n }\n\n // ── Generate JSON preview ──────────────────────────────────────────────────\n const generateJSON = () => {\n if (!activeComponent) return '{}'\n return JSON.stringify({\n slug: activeComponent.slug,\n displayName: activeComponent.displayName,\n category: activeComponent.category,\n description: activeComponent.description,\n fields: activeComponent.fields,\n }, null, 2)\n }\n\n // ── Generate TypeScript Interface ─────────────────────────────────────────\n const generateTS = () => {\n if (!activeComponent) return ''\n const typeName = activeComponent.displayName.replace(/\\s+/g, '') || 'Component'\n const typeMap: Record<string, string> = {\n text: 'string', textarea: 'string', email: 'string', password: 'string',\n slug: 'string', code: 'string', color: 'string',\n number: 'number', checkbox: 'boolean',\n date: 'Date', media: 'MediaItem', relation: 'string | null',\n richtext: 'string', json: 'any',\n array: 'any[]', blocks: 'Block[]', group: 'any',\n select: 'string',\n }\n const fields = activeComponent.fields.map(f => {\n const ts = typeMap[f.type] || 'unknown'\n return ` ${f.name}: ${ts}`\n }).join('\\n')\n return `interface ${typeName} {\\n${fields}\\n}`\n }\n\n const inputCls = cn(\n 'w-full border p-3 text-sm font-bold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-colors rounded-none',\n 'bg-z-input border-z-border focus:border-z-border text-z-primary'\n )\n\n return (\n <div className={cn('flex h-[calc(100vh-64px)] overflow-hidden', dark ? 'bg-app' : 'bg-[var(--z-bg-input)]')}>\n {/* ── Sidebar List ──────────────────────────────────────────────── */}\n <div className={cn('w-64 border-r shrink-0 flex flex-col', 'border-z-border bg-z-panel')}>\n <div className=\"p-4 border-b border-inherit flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold flex items-center gap-2\">\n <Box size={14} className=\"text-z-secondary \" /> Components\n </h2>\n <button\n onClick={handleCreateNew}\n className=\"p-1.5 hover:bg-z-panel text-z-secondary rounded-none transition-colors\"\n >\n <Plus size={14} />\n </button>\n </div>\n <div className=\"flex-1 overflow-auto p-2 space-y-1\">\n {loading ? (\n <div className=\"p-4 flex justify-center\"><Loader2 className=\"animate-spin text-z-muted\" size={16} /></div>\n ) : components.map(c => (\n <div key={c.id} className=\"group flex items-center gap-2 relative\">\n <button\n onClick={() => { setActiveComponent(c); setActiveTab('visual') }}\n className={cn(\n 'flex-1 text-left px-3 py-2 text-sm font-bold transition-colors overflow-hidden text-ellipsis whitespace-nowrap rounded-none',\n activeComponent?.id === c.id\n ? 'bg-z-border text-z-primary'\n : dark ? 'text-z-muted hover:bg-z-hover hover:text-z-primary' : 'text-z-secondary hover:bg-[var(--z-bg-input)] hover:text-z-primary'\n )}\n >\n {c.displayName}\n </button>\n <div className=\"absolute right-2 opacity-0 group-hover:opacity-100 transition-opacity flex items-center gap-1\">\n <button\n onClick={(e) => { e.stopPropagation(); handleDuplicate(c.id) }}\n className=\"p-1 text-z-muted hover:text-z-secondary transition-colors\"\n title=\"Duplicate\"\n >\n <Copy size={12} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); handleDelete(c.id) }}\n className=\"p-1 text-z-muted hover:text-red-500 transition-colors\"\n title=\"Delete\"\n >\n <Trash2 size={12} />\n </button>\n </div>\n </div>\n ))}\n {!loading && components.length === 0 && (\n <div className=\"p-4 text-center text-sm text-z-secondary\">\n No components found\n </div>\n )}\n </div>\n </div>\n\n {/* ── Editor Main ────────────────────────────────────────────────── */}\n <div className=\"flex-1 overflow-auto bg-inherit relative custom-editor-scrollbar\">\n {activeComponent ? (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"max-w-4xl mx-auto p-8 space-y-6\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between pb-6 border-b border-z-border\">\n <div>\n <div className=\"flex items-center gap-3\">\n <a href=\"/\" className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-arrow-left\"><path d=\"m12 19-7-7 7-7\"/><path d=\"M19 12H5\"/></svg>\n </a>\n <h1 className=\"text-2xl font-semibold\">Component Builder</h1>\n </div>\n <p className={cn('text-sm font-bold mt-1 ml-8', 'text-z-secondary')}>\n {activeComponent.id ? 'Editing existing component' : 'Creating new component'}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setShowPreview(!showPreview)}\n className={cn('flex items-center gap-2 px-4 py-2.5 border text-sm font-semibold rounded-none transition-all shadow-sm', dark ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border' : 'bg-z-panel border-z-border hover:bg-[var(--z-bg-input)]')}\n >\n {showPreview ? <EyeOff size={14} /> : <Eye size={14} />}\n {showPreview ? 'Hide' : 'Preview'}\n </button>\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"flex items-center gap-2 px-6 py-2.5 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold shadow-sm rounded-none transition-all disabled:opacity-50\"\n >\n {saving ? <Loader2 size={14} className=\"animate-spin\" /> : <Save size={14} />}\n Save Component\n </button>\n </div>\n </div>\n\n {/* Tab navigation */}\n <div className={cn('flex items-center gap-1 p-1 border rounded-none w-fit shadow-sm', 'z-panel')}>\n {([\n { key: 'visual', label: 'Visual Editor', icon: Box },\n { key: 'code', label: 'Code / JSON Import', icon: Code },\n { key: 'ai', label: 'AI Generate', icon: Sparkles },\n ] as { key: EditorTab; label: string; icon: React.ElementType }[]).map(tab => {\n const Icon = tab.icon\n return (\n <button\n key={tab.key}\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 text-sm font-semibold rounded-none transition-all',\n activeTab === tab.key\n ? 'bg-z-accent text-z-logo-text shadow-sm'\n : dark ? 'text-z-secondary hover:text-z-secondary' : 'text-z-secondary hover:text-z-primary'\n )}\n >\n <Icon size={12} /> {tab.label}\n </button>\n )\n })}\n </div>\n\n {/* ── Visual Editor ───────────────────────────────────────────── */}\n <AnimatePresence mode=\"wait\">\n {activeTab === 'visual' && (\n <BuilderVisualTab\n activeComponent={activeComponent}\n setActiveComponent={setActiveComponent}\n showPreview={showPreview}\n generateJSON={generateJSON}\n generateTS={generateTS}\n copied={copied}\n setCopied={setCopied}\n dark={dark}\n />\n )}\n\n {/* ── Code / JSON Import Tab ───────────────────────────────── */}\n {activeTab === 'code' && (\n <BuilderCodeTab\n codeImport={codeImport}\n setCodeImport={setCodeImport}\n handleCodeImport={handleCodeImport}\n handleRegisterCode={handleRegisterCode}\n dark={dark}\n />\n )}\n\n {/* ── AI Generate Tab ─────────────────────────────────────── */}\n {activeTab === 'ai' && (\n <BuilderAITab\n aiPrompt={aiPrompt}\n setAiPrompt={setAiPrompt}\n isAIGenerating={isAIGenerating}\n handleAIGenerate={handleAIGenerate}\n dark={dark}\n />\n )}\n </AnimatePresence>\n </motion.div>\n ) : (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center space-y-5 max-w-md px-8\">\n <div className=\"w-16 h-16 mx-auto rounded-none bg-z-panel border border-z-border flex items-center justify-center shadow-sm\">\n <Box size={28} className=\"text-z-active-text\" strokeWidth={1.5} />\n </div>\n <div className=\"flex items-center justify-center mb-6\">\n <a href=\"/\" className=\"flex items-center gap-2 text-sm font-semibold text-z-secondary hover:text-z-primary transition-colors\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-arrow-left\"><path d=\"m12 19-7-7 7-7\"/><path d=\"M19 12H5\"/></svg>\n Back to Dashboard\n </a>\n </div>\n <div>\n <p className=\"text-[14px] font-semibold\">Component Builder</p>\n <p className={cn('text-sm font-medium mt-2 leading-relaxed', 'text-z-secondary')}>\n Create reusable components like Navbars, Cards, and Hero Sections to use in Dynamic Zones and Blocks.\n Import from JSON, TypeScript interfaces, or let AI generate them.\n </p>\n </div>\n <div className=\"flex gap-3 justify-center\">\n <button onClick={handleCreateNew} className=\"flex items-center gap-2 px-5 py-3 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all shadow-sm\">\n <Plus size={14} /> New Component\n </button>\n <button onClick={() => { handleCreateNew(); setTimeout(() => setActiveTab('ai'), 50) }} className=\"flex items-center gap-2 px-5 py-3 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all shadow-sm\">\n <Sparkles size={14} /> AI Generate\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default ComponentBuilderPage\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ComponentBuilderPage-C58Rr1cu.js","names":[],"sources":["../../src/pages/component-builder/BuilderVisualTab.tsx","../../src/pages/component-builder/BuilderCodeTab.tsx","../../src/pages/component-builder/BuilderAITab.tsx","../../src/pages/ComponentBuilderPage.tsx"],"sourcesContent":["import React from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Plus, Trash2, Check, Copy, Download, Braces } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nconst FIELD_TYPES = [\n 'text', 'textarea', 'number', 'boolean', 'richtext', 'date',\n 'email', 'media', 'relation', 'color', 'array', 'group', 'blocks', 'dz',\n 'select', 'json', 'slug', 'code', 'password',\n]\n\nconst CATEGORIES = ['General', 'Layout', 'Content', 'Commerce', 'Media', 'Social', 'Navigation', 'Forms']\n\nexport const BuilderVisualTab = ({\n activeComponent,\n setActiveComponent,\n showPreview,\n generateJSON,\n generateTS,\n copied,\n setCopied,\n dark\n}: any) => {\n const inputCls = cn(\n 'w-full border p-3 text-sm font-bold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-colors rounded-none shadow-sm',\n 'z-input'\n )\n\n const addField = () => {\n setActiveComponent({\n ...activeComponent,\n fields: [...activeComponent.fields, { name: '', type: 'text' }]\n })\n }\n\n const updateField = (index: number, key: string, value: any) => {\n const newFields = [...activeComponent.fields]\n newFields[index] = { ...newFields[index], [key]: value }\n setActiveComponent({ ...activeComponent, fields: newFields })\n }\n\n const removeField = (index: number) => {\n const newFields = [...activeComponent.fields]\n newFields.splice(index, 1)\n setActiveComponent({ ...activeComponent, fields: newFields })\n }\n\n return (\n <motion.div key=\"visual\" initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }} className=\"space-y-6\">\n {/* General info */}\n <div className={cn('p-6 border rounded-none space-y-4 shadow-sm transition-all', 'z-panel')}>\n <h3 className=\"text-sm font-semibold text-z-secondary border-b border-z-border/20 pb-2\">General Info</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-bold text-z-secondary block\">Display Name</label>\n <input type=\"text\" value={activeComponent.displayName} onChange={(e) => setActiveComponent({ ...activeComponent, displayName: e.target.value })} className={inputCls} placeholder=\"e.g. Hero Section\" />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-bold text-z-secondary block\">Category</label>\n <select value={activeComponent.category} onChange={(e) => setActiveComponent({ ...activeComponent, category: e.target.value })} className={cn(inputCls, 'cursor-pointer')}>\n {CATEGORIES.map(c => <option key={c} value={c} className=\"text-z-primary\">{c}</option>)}\n </select>\n </div>\n <div className=\"space-y-1.5 col-span-2\">\n <label className=\"text-sm font-bold text-z-secondary block\">Component Slug (API ID)</label>\n <input type=\"text\" value={activeComponent.slug} onChange={(e) => setActiveComponent({ ...activeComponent, slug: e.target.value.toLowerCase().replace(/[^a-z0-9_-]/g, '') })} disabled={!!activeComponent.id} className={cn(inputCls, 'font-mono disabled:opacity-50')} placeholder=\"e.g. hero-section\" />\n </div>\n <div className=\"space-y-1.5 col-span-2\">\n <label className=\"text-sm font-bold text-z-secondary block\">Description</label>\n <input type=\"text\" value={activeComponent.description} onChange={(e) => setActiveComponent({ ...activeComponent, description: e.target.value })} className={inputCls} placeholder=\"Brief description of this component...\" />\n </div>\n </div>\n </div>\n\n {/* Fields */}\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <div className=\"flex items-center justify-between mb-5 border-b border-z-border/20 pb-2\">\n <h3 className=\"text-sm font-semibold text-z-secondary \">Fields Configuration</h3>\n <button onClick={addField} className=\"flex items-center gap-1.5 text-sm font-semibold text-z-secondary hover:text-z-primary hover:bg-z-active-bg px-3 py-1.5 bg-z-panel rounded-none transition-all\">\n <Plus size={12} /> Add Field\n </button>\n </div>\n <div className=\"space-y-3\">\n <AnimatePresence>\n {activeComponent.fields.map((field: any, idx: number) => (\n <motion.div\n key={idx}\n layout\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0 }}\n className={cn('flex items-center gap-3 p-3.5 border rounded-none group shadow-sm transition-all', dark ? 'bg-z-panel backdrop-blur-sm border-z-border hover:border-z-active-border' : 'bg-z-input border-z-border hover:border-z-border-strong')}\n >\n <input\n type=\"text\"\n value={field.name}\n onChange={e => updateField(idx, 'name', e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, ''))}\n placeholder=\"field_name\"\n className=\"flex-1 bg-transparent border-b border-transparent focus:border-z-accent text-sm font-mono outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1 transition-colors\"\n />\n <select\n value={field.type}\n onChange={e => updateField(idx, 'type', e.target.value)}\n className=\"w-36 bg-transparent border-b border-transparent focus:border-z-accent text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1 transition-colors cursor-pointer\"\n >\n {FIELD_TYPES.map(t => <option key={t} value={t} className=\"text-z-primary\">{t}</option>)}\n </select>\n <label className=\"flex items-center gap-2 text-sm font-semibold text-z-muted\">\n <input type=\"checkbox\" checked={field.required || false} onChange={e => updateField(idx, 'required', e.target.checked)} className=\"accent-z-accent\" />\n Req\n </label>\n <button onClick={() => removeField(idx)} className=\"text-red-500/40 hover:text-red-500 transition-colors p-1.5 rounded-none opacity-0 group-hover:opacity-100\">\n <Trash2 size={14} />\n </button>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n </div>\n\n {showPreview && (\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-sm font-semibold text-z-active-text flex items-center gap-2\">\n <Braces size={12} /> Live JSON Preview\n </h3>\n <div className=\"flex gap-2\">\n <button\n onClick={() => { navigator.clipboard.writeText(generateJSON()); setCopied(true); setTimeout(() => setCopied(false), 2000) }}\n className={cn('flex items-center gap-1.5 px-3 py-1.5 border text-sm font-semibold rounded-none transition-all', dark ? 'border-z-border hover:bg-z-hover' : 'border-z-border hover:bg-[var(--z-bg-input)]')}\n >\n {copied ? <Check size={12} className=\"text-z-secondary \" /> : <Copy size={12} />} Copy JSON\n </button>\n <button\n onClick={() => { const blob = new Blob([generateTS()], { type: 'text/typescript' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${activeComponent.slug || 'component'}.ts`; a.click() }}\n className={cn('flex items-center gap-1.5 px-3 py-1.5 border text-sm font-semibold rounded-none transition-all text-z-active-text border-z-active-border hover:bg-z-active-bg')}\n >\n <Download size={12} /> TypeScript\n </button>\n </div>\n </div>\n <pre className={cn('text-sm font-mono overflow-auto max-h-64 p-4 rounded-none text-z-secondary shadow-inner border', dark ? 'bg-z-popover border-z-border' : 'bg-z-accent border-z-border')}>{generateJSON()}</pre>\n </div>\n )}\n </motion.div>\n )\n}\n","import React from 'react'\nimport { motion } from 'framer-motion'\nimport { Code, ChevronRight, Save, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport const BuilderCodeTab = ({\n codeImport,\n setCodeImport,\n handleCodeImport,\n handleRegisterCode,\n dark\n}: any) => {\n return (\n <motion.div key=\"code\" initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }} className=\"space-y-4\">\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <h3 className=\"text-sm font-semibold text-z-active-text mb-1 flex items-center gap-2\">\n <Code size={12} /> Import from Code / JSON\n </h3>\n <p className={cn('text-sm mb-4 font-medium', dark ? 'text-z-muted' : 'text-z-secondary')}>\n Paste a JSON component definition, a TypeScript interface, or a raw fields array. The parser will auto-detect the format.\n </p>\n\n {/* Format examples */}\n <div className={cn('p-4 rounded-none text-sm font-mono mb-4 text-z-secondary border shadow-inner', dark ? 'bg-z-popover border-z-border' : 'bg-z-accent border-z-border')}>\n <p className=\"text-z-secondary mb-2\">// JSON format (recommended)</p>\n {`{\n \"slug\": \"hero-section\",\n \"displayName\": \"Hero Section\",\n \"category\": \"Layout\",\n \"description\": \"Full-width hero with CTA\",\n \"fields\": [\n { \"name\": \"headline\", \"type\": \"text\", \"required\": true },\n { \"name\": \"subtext\", \"type\": \"textarea\" },\n { \"name\": \"backgroundImage\", \"type\": \"media\" },\n { \"name\": \"ctaLabel\", \"type\": \"text\" },\n { \"name\": \"ctaUrl\", \"type\": \"text\" }\n ]\n}`}\n </div>\n\n <textarea\n rows={12}\n value={codeImport}\n onChange={e => setCodeImport(e.target.value)}\n placeholder='Paste JSON or TypeScript interface here...'\n className={cn('w-full border p-4 text-sm font-mono outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black rounded-none placeholder:text-z-secondary resize-none shadow-inner', dark ? 'bg-z-panel backdrop-blur-sm border-z-border focus:border-z-accent/50 text-z-primary' : 'bg-z-input border-z-border focus:border-z-accent text-z-primary')}\n />\n\n <div className=\"flex gap-3 mt-4\">\n <button\n onClick={handleCodeImport}\n disabled={!codeImport.trim()}\n className=\"flex items-center gap-2 px-5 py-2.5 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all disabled:opacity-40 shadow-sm\"\n >\n <ChevronRight size={14} /> Import to Visual Editor\n </button>\n <button\n onClick={handleRegisterCode}\n disabled={!codeImport.trim()}\n className=\"flex items-center gap-2 px-5 py-2.5 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all disabled:opacity-40 shadow-sm\"\n title=\"Save directly to database without going through visual editor\"\n >\n <Save size={14} /> Register Directly\n </button>\n <button\n onClick={() => setCodeImport('')}\n className={cn('flex items-center gap-2 px-4 py-2.5 border text-sm font-semibold rounded-none transition-all', dark ? 'border-z-border hover:bg-z-hover' : 'border-z-border hover:bg-[var(--z-bg-input)]')}\n >\n <X size={14} /> Clear\n </button>\n </div>\n </div>\n </motion.div>\n )\n}\n","import React from 'react'\nimport { motion } from 'framer-motion'\nimport { Sparkles, Loader2 } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport const BuilderAITab = ({\n aiPrompt,\n setAiPrompt,\n isAIGenerating,\n handleAIGenerate,\n dark\n}: any) => {\n return (\n <motion.div key=\"ai\" initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }} className=\"space-y-4\">\n <div className={cn('p-6 border rounded-none shadow-sm transition-all', 'z-panel')}>\n <h3 className=\"text-sm font-semibold text-z-active-text mb-1 flex items-center gap-2\">\n <Sparkles size={12} /> AI Component Architect\n </h3>\n <p className={cn('text-sm mb-6 font-medium', dark ? 'text-z-muted' : 'text-z-secondary')}>\n Describe a component and the AI will generate its complete field schema. Works best with detailed descriptions.\n </p>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-semibold text-z-secondary block mb-2\">Describe your component</label>\n <textarea\n rows={5}\n value={aiPrompt}\n onChange={e => setAiPrompt(e.target.value)}\n placeholder='e.g. \"A pricing card component with a plan name, price per month, list of up to 5 feature bullets, a CTA button label, a highlighted/featured boolean flag, and a color accent picker.\"'\n className={cn('w-full border p-4 text-sm outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black rounded-none placeholder:text-z-secondary resize-none shadow-inner', dark ? 'bg-z-panel backdrop-blur-sm border-z-border focus:border-z-accent/50 text-z-primary' : 'bg-z-input border-z-border focus:border-z-accent text-z-primary')}\n />\n </div>\n\n {/* Prompt suggestions */}\n <div className=\"flex flex-wrap gap-2\">\n {[\n 'Navigation bar with logo, links array, and CTA button',\n 'Product card with image, name, price, and discount badge',\n 'Team member card with photo, name, role, bio, and social links',\n 'Testimonial with quote, author, avatar, rating, and company',\n ].map(suggestion => (\n <button\n key={suggestion}\n onClick={() => setAiPrompt(suggestion)}\n className={cn('text-sm font-semibold px-3 py-1.5 border rounded-none transition-all', dark ? 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-accent/50 hover:bg-z-active-bg' : 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-active-border')}\n >\n {suggestion.slice(0, 40)}...\n </button>\n ))}\n </div>\n\n <button\n disabled={isAIGenerating || !aiPrompt.trim()}\n onClick={handleAIGenerate}\n className=\"w-full py-4 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold flex justify-center items-center gap-2 transition-all rounded-none disabled:opacity-50 shadow-sm\"\n >\n {isAIGenerating\n ? <><Loader2 size={14} className=\"animate-spin\" /> Generating with AI...</>\n : <><Sparkles size={14} /> Generate Component</>\n }\n </button>\n </div>\n </div>\n </motion.div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Plus, Box, Save, Loader2, Trash2, Copy, Code, Sparkles, Eye, EyeOff,\n ChevronRight, Check, X, Braces, Download\n} from 'lucide-react'\nimport { useTheme } from '../context/ThemeContext'\nimport { cn } from '../lib/utils'\nimport api from '../lib/api'\nimport { confirm } from '../store/confirmStore'\nimport toast from 'react-hot-toast'\nimport type { CustomComponent } from '../hooks/useCustomComponents'\nimport { invalidateCustomComponentsCache } from '../hooks/useCustomComponents'\nimport { BuilderVisualTab } from './component-builder/BuilderVisualTab'\nimport { BuilderCodeTab } from './component-builder/BuilderCodeTab'\nimport { BuilderAITab } from './component-builder/BuilderAITab'\n\n\n\n\n\n\ntype EditorTab = 'visual' | 'code' | 'ai'\n\nconst ComponentBuilderPage: React.FC = () => {\n const { theme } = useTheme()\n const dark = theme === 'dark'\n const [components, setComponents] = useState<CustomComponent[]>([])\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [activeComponent, setActiveComponent] = useState<CustomComponent | null>(null)\n const [activeTab, setActiveTab] = useState<EditorTab>('visual')\n const [codeImport, setCodeImport] = useState('')\n const [aiPrompt, setAiPrompt] = useState('')\n const [isAIGenerating, setIsAIGenerating] = useState(false)\n const [copied, setCopied] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n\n useEffect(() => {\n loadComponents()\n }, [])\n\n const loadComponents = async () => {\n setLoading(true)\n try {\n const res = await api.get('/system/components')\n setComponents(res.data.data || [])\n } catch {\n toast.error('Failed to load components')\n } finally {\n setLoading(false)\n }\n }\n\n const handleCreateNew = () => {\n setActiveComponent({\n id: '',\n slug: '',\n displayName: '',\n category: 'General',\n icon: 'Box',\n description: '',\n fields: [{ name: 'title', type: 'text' }]\n })\n setActiveTab('visual')\n }\n\n const handleSave = async () => {\n if (!activeComponent || !activeComponent.slug || !activeComponent.displayName) {\n toast.error('Slug and Display Name are required')\n return\n }\n setSaving(true)\n try {\n if (activeComponent.id) {\n await api.put(`/system/components/${activeComponent.id}`, activeComponent)\n toast.success('Component updated successfully')\n } else {\n const { id, ...dataToPost } = activeComponent\n await api.post('/system/components', dataToPost)\n toast.success('Component created successfully')\n }\n invalidateCustomComponentsCache()\n loadComponents()\n setActiveComponent(null)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to save component')\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async (id: string) => {\n if (!await confirm({ message: 'Delete this component? This may break pages currently using it.' })) return\n try {\n await api.delete(`/system/components/${id}`)\n toast.success('Component deleted')\n invalidateCustomComponentsCache()\n if (activeComponent?.id === id) setActiveComponent(null)\n loadComponents()\n } catch {\n toast.error('Failed to delete component')\n }\n }\n\n const handleDuplicate = async (id: string) => {\n try {\n await api.post(`/system/components/${id}/duplicate`)\n toast.success('Component duplicated')\n invalidateCustomComponentsCache()\n loadComponents()\n } catch {\n toast.error('Failed to duplicate component')\n }\n }\n\n // ── Code Import: parse JSON / TypeScript interface ──────────────────────────\n const handleCodeImport = () => {\n try {\n // Try JSON parse first\n let parsed: any = null\n const trimmed = codeImport.trim()\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const jsonData = JSON.parse(trimmed.startsWith('[') ? `{\"fields\":${trimmed}}` : trimmed)\n parsed = jsonData\n } else if (trimmed.includes('interface') || trimmed.includes('type ')) {\n // Parse TypeScript interface\n const fieldMatches = [...trimmed.matchAll(/(\\w+)\\??:\\s*(string|number|boolean|Date|any|object|unknown)(?:\\[\\])?/g)]\n parsed = {\n fields: fieldMatches.map(m => ({\n name: m[1],\n type: m[2] === 'string' ? 'text' : m[2] === 'number' ? 'number' : m[2] === 'boolean' ? 'checkbox' : 'json'\n }))\n }\n // Try to extract interface name\n const nameMatch = trimmed.match(/interface\\s+(\\w+)/)\n if (nameMatch) {\n parsed.displayName = nameMatch[1]\n parsed.slug = nameMatch[1].replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '')\n }\n }\n\n if (parsed && parsed.fields && Array.isArray(parsed.fields)) {\n setActiveComponent({\n id: '',\n slug: parsed.slug || '',\n displayName: parsed.displayName || parsed.name || '',\n category: parsed.category || 'General',\n icon: 'Box',\n description: parsed.description || '',\n fields: parsed.fields,\n })\n setActiveTab('visual')\n toast.success(`Imported ${parsed.fields.length} fields from code`)\n } else {\n toast.error('Could not parse fields. Use JSON format: { \"slug\": \"...\", \"displayName\": \"...\", \"fields\": [...] }')\n }\n } catch (err: any) {\n toast.error(`Parse error: ${(err instanceof Error ? err.message : String(err))}`)\n }\n }\n\n // ── Register via code (backend endpoint) ───────────────────────────────────\n const handleRegisterCode = async () => {\n try {\n const parsed = JSON.parse(codeImport)\n const res = await api.post('/system/components/register-code', parsed)\n toast.success('Component registered from code!')\n invalidateCustomComponentsCache()\n loadComponents()\n setCodeImport('')\n setActiveTab('visual')\n const comp = res.data?.data\n if (comp) setActiveComponent(comp)\n } catch (err: any) {\n toast.error(err.response?.data?.message || (err instanceof Error ? err.message : String(err)) || 'Failed to register component')\n }\n }\n\n // ── AI Generate ────────────────────────────────────────────────────────────\n const handleAIGenerate = async () => {\n if (!aiPrompt) return toast.error('Enter a prompt')\n setIsAIGenerating(true)\n try {\n const res = await api.post('/system/ai-architect', {\n prompt: `Generate a reusable UI component schema (as JSON with slug, displayName, category, description, and fields array). Component description: ${aiPrompt}`\n })\n const schema = res.data?.data\n if (schema && schema.fields) {\n setActiveComponent({\n id: '',\n slug: schema.slug || '',\n displayName: schema.displayName || schema.name || '',\n category: schema.category || 'General',\n icon: 'Box',\n description: schema.description || '',\n fields: schema.fields,\n })\n setActiveTab('visual')\n toast.success('AI generated component schema!')\n } else {\n toast.error('AI did not return a valid component schema')\n }\n } catch (err: any) {\n toast.error(err.response?.data?.error?.message || 'AI generation failed')\n } finally {\n setIsAIGenerating(false)\n }\n }\n\n // ── Generate JSON preview ──────────────────────────────────────────────────\n const generateJSON = () => {\n if (!activeComponent) return '{}'\n return JSON.stringify({\n slug: activeComponent.slug,\n displayName: activeComponent.displayName,\n category: activeComponent.category,\n description: activeComponent.description,\n fields: activeComponent.fields,\n }, null, 2)\n }\n\n // ── Generate TypeScript Interface ─────────────────────────────────────────\n const generateTS = () => {\n if (!activeComponent) return ''\n const typeName = activeComponent.displayName.replace(/\\s+/g, '') || 'Component'\n const typeMap: Record<string, string> = {\n text: 'string', textarea: 'string', email: 'string', password: 'string',\n slug: 'string', code: 'string', color: 'string',\n number: 'number', checkbox: 'boolean',\n date: 'Date', media: 'MediaItem', relation: 'string | null',\n richtext: 'string', json: 'any',\n array: 'any[]', blocks: 'Block[]', group: 'any',\n select: 'string',\n }\n const fields = activeComponent.fields.map(f => {\n const ts = typeMap[f.type] || 'unknown'\n return ` ${f.name}: ${ts}`\n }).join('\\n')\n return `interface ${typeName} {\\n${fields}\\n}`\n }\n\n const inputCls = cn(\n 'w-full border p-3 text-sm font-bold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black transition-colors rounded-none',\n 'bg-z-input border-z-border focus:border-z-border text-z-primary'\n )\n\n return (\n <div className={cn('flex h-[calc(100vh-64px)] overflow-hidden', dark ? 'bg-app' : 'bg-[var(--z-bg-input)]')}>\n {/* ── Sidebar List ──────────────────────────────────────────────── */}\n <div className={cn('w-64 border-r shrink-0 flex flex-col', 'border-z-border bg-z-panel')}>\n <div className=\"p-4 border-b border-inherit flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold flex items-center gap-2\">\n <Box size={14} className=\"text-z-secondary \" /> Components\n </h2>\n <button\n onClick={handleCreateNew}\n className=\"p-1.5 hover:bg-z-panel text-z-secondary rounded-none transition-colors\"\n >\n <Plus size={14} />\n </button>\n </div>\n <div className=\"flex-1 overflow-auto p-2 space-y-1\">\n {loading ? (\n <div className=\"p-4 flex justify-center\"><Loader2 className=\"animate-spin text-z-muted\" size={16} /></div>\n ) : components.map(c => (\n <div key={c.id} className=\"group flex items-center gap-2 relative\">\n <button\n onClick={() => { setActiveComponent(c); setActiveTab('visual') }}\n className={cn(\n 'flex-1 text-left px-3 py-2 text-sm font-bold transition-colors overflow-hidden text-ellipsis whitespace-nowrap rounded-none',\n activeComponent?.id === c.id\n ? 'bg-z-border text-z-primary'\n : dark ? 'text-z-muted hover:bg-z-hover hover:text-z-primary' : 'text-z-secondary hover:bg-[var(--z-bg-input)] hover:text-z-primary'\n )}\n >\n {c.displayName}\n </button>\n <div className=\"absolute right-2 opacity-0 group-hover:opacity-100 transition-opacity flex items-center gap-1\">\n <button\n onClick={(e) => { e.stopPropagation(); handleDuplicate(c.id) }}\n className=\"p-1 text-z-muted hover:text-z-secondary transition-colors\"\n title=\"Duplicate\"\n >\n <Copy size={12} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); handleDelete(c.id) }}\n className=\"p-1 text-z-muted hover:text-red-500 transition-colors\"\n title=\"Delete\"\n >\n <Trash2 size={12} />\n </button>\n </div>\n </div>\n ))}\n {!loading && components.length === 0 && (\n <div className=\"p-4 text-center text-sm text-z-secondary\">\n No components found\n </div>\n )}\n </div>\n </div>\n\n {/* ── Editor Main ────────────────────────────────────────────────── */}\n <div className=\"flex-1 overflow-auto bg-inherit relative custom-editor-scrollbar\">\n {activeComponent ? (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"max-w-4xl mx-auto p-8 space-y-6\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between pb-6 border-b border-z-border\">\n <div>\n <div className=\"flex items-center gap-3\">\n <a href=\"/\" className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-arrow-left\"><path d=\"m12 19-7-7 7-7\"/><path d=\"M19 12H5\"/></svg>\n </a>\n <h1 className=\"text-2xl font-semibold\">Component Builder</h1>\n </div>\n <p className={cn('text-sm font-bold mt-1 ml-8', 'text-z-secondary')}>\n {activeComponent.id ? 'Editing existing component' : 'Creating new component'}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setShowPreview(!showPreview)}\n className={cn('flex items-center gap-2 px-4 py-2.5 border text-sm font-semibold rounded-none transition-all shadow-sm', dark ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border' : 'bg-z-panel border-z-border hover:bg-[var(--z-bg-input)]')}\n >\n {showPreview ? <EyeOff size={14} /> : <Eye size={14} />}\n {showPreview ? 'Hide' : 'Preview'}\n </button>\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"flex items-center gap-2 px-6 py-2.5 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold shadow-sm rounded-none transition-all disabled:opacity-50\"\n >\n {saving ? <Loader2 size={14} className=\"animate-spin\" /> : <Save size={14} />}\n Save Component\n </button>\n </div>\n </div>\n\n {/* Tab navigation */}\n <div className={cn('flex items-center gap-1 p-1 border rounded-none w-fit shadow-sm', 'z-panel')}>\n {([\n { key: 'visual', label: 'Visual Editor', icon: Box },\n { key: 'code', label: 'Code / JSON Import', icon: Code },\n { key: 'ai', label: 'AI Generate', icon: Sparkles },\n ] as { key: EditorTab; label: string; icon: React.ElementType }[]).map(tab => {\n const Icon = tab.icon\n return (\n <button\n key={tab.key}\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 text-sm font-semibold rounded-none transition-all',\n activeTab === tab.key\n ? 'bg-z-accent text-z-logo-text shadow-sm'\n : dark ? 'text-z-secondary hover:text-z-secondary' : 'text-z-secondary hover:text-z-primary'\n )}\n >\n <Icon size={12} /> {tab.label}\n </button>\n )\n })}\n </div>\n\n {/* ── Visual Editor ───────────────────────────────────────────── */}\n <AnimatePresence mode=\"wait\">\n {activeTab === 'visual' && (\n <BuilderVisualTab\n activeComponent={activeComponent}\n setActiveComponent={setActiveComponent}\n showPreview={showPreview}\n generateJSON={generateJSON}\n generateTS={generateTS}\n copied={copied}\n setCopied={setCopied}\n dark={dark}\n />\n )}\n\n {/* ── Code / JSON Import Tab ───────────────────────────────── */}\n {activeTab === 'code' && (\n <BuilderCodeTab\n codeImport={codeImport}\n setCodeImport={setCodeImport}\n handleCodeImport={handleCodeImport}\n handleRegisterCode={handleRegisterCode}\n dark={dark}\n />\n )}\n\n {/* ── AI Generate Tab ─────────────────────────────────────── */}\n {activeTab === 'ai' && (\n <BuilderAITab\n aiPrompt={aiPrompt}\n setAiPrompt={setAiPrompt}\n isAIGenerating={isAIGenerating}\n handleAIGenerate={handleAIGenerate}\n dark={dark}\n />\n )}\n </AnimatePresence>\n </motion.div>\n ) : (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center space-y-5 max-w-md px-8\">\n <div className=\"w-16 h-16 mx-auto rounded-none bg-z-panel border border-z-border flex items-center justify-center shadow-sm\">\n <Box size={28} className=\"text-z-active-text\" strokeWidth={1.5} />\n </div>\n <div className=\"flex items-center justify-center mb-6\">\n <a href=\"/\" className=\"flex items-center gap-2 text-sm font-semibold text-z-secondary hover:text-z-primary transition-colors\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"lucide lucide-arrow-left\"><path d=\"m12 19-7-7 7-7\"/><path d=\"M19 12H5\"/></svg>\n Back to Dashboard\n </a>\n </div>\n <div>\n <p className=\"text-[14px] font-semibold\">Component Builder</p>\n <p className={cn('text-sm font-medium mt-2 leading-relaxed', 'text-z-secondary')}>\n Create reusable components like Navbars, Cards, and Hero Sections to use in Dynamic Zones and Blocks.\n Import from JSON, TypeScript interfaces, or let AI generate them.\n </p>\n </div>\n <div className=\"flex gap-3 justify-center\">\n <button onClick={handleCreateNew} className=\"flex items-center gap-2 px-5 py-3 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all shadow-sm\">\n <Plus size={14} /> New Component\n </button>\n <button onClick={() => { handleCreateNew(); setTimeout(() => setActiveTab('ai'), 50) }} className=\"flex items-center gap-2 px-5 py-3 bg-z-accent hover:brightness-110 text-z-logo-text text-sm font-semibold rounded-none transition-all shadow-sm\">\n <Sparkles size={14} /> AI Generate\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default ComponentBuilderPage\n"],"mappings":"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"}
|