@fayz-ai/app-builder 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/admin/AdminAppBuilder.d.ts +11 -0
  4. package/dist/admin/AdminAppBuilder.d.ts.map +1 -0
  5. package/dist/admin/agent-surface.d.ts +18 -0
  6. package/dist/admin/agent-surface.d.ts.map +1 -0
  7. package/dist/admin/options.d.ts +22 -0
  8. package/dist/admin/options.d.ts.map +1 -0
  9. package/dist/admin/target.d.ts +20 -0
  10. package/dist/admin/target.d.ts.map +1 -0
  11. package/dist/chunk-45SFS6FV.js +721 -0
  12. package/dist/chunk-45SFS6FV.js.map +1 -0
  13. package/dist/components/AppBuilder.d.ts +12 -0
  14. package/dist/components/AppBuilder.d.ts.map +1 -0
  15. package/dist/components/BuilderCanvas.d.ts +9 -0
  16. package/dist/components/BuilderCanvas.d.ts.map +1 -0
  17. package/dist/components/BuilderChrome.d.ts +25 -0
  18. package/dist/components/BuilderChrome.d.ts.map +1 -0
  19. package/dist/components/BuilderEmpty.d.ts +7 -0
  20. package/dist/components/BuilderEmpty.d.ts.map +1 -0
  21. package/dist/components/PagePicker.d.ts +20 -0
  22. package/dist/components/PagePicker.d.ts.map +1 -0
  23. package/dist/components/PublishButton.d.ts +9 -0
  24. package/dist/components/PublishButton.d.ts.map +1 -0
  25. package/dist/hooks/useBuilderFrame.d.ts +22 -0
  26. package/dist/hooks/useBuilderFrame.d.ts.map +1 -0
  27. package/dist/index.d.ts +15 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +3 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lib/bridge.d.ts +38 -0
  32. package/dist/lib/bridge.d.ts.map +1 -0
  33. package/dist/lib/cn.d.ts +4 -0
  34. package/dist/lib/cn.d.ts.map +1 -0
  35. package/dist/lib/pages.d.ts +29 -0
  36. package/dist/lib/pages.d.ts.map +1 -0
  37. package/dist/lib/url.d.ts +9 -0
  38. package/dist/lib/url.d.ts.map +1 -0
  39. package/dist/plugin.d.ts +12 -0
  40. package/dist/plugin.d.ts.map +1 -0
  41. package/dist/plugin.js +277 -0
  42. package/dist/plugin.js.map +1 -0
  43. package/dist/types.d.ts +107 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/package.json +71 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/PublishButton.tsx","../src/lib/pages.ts","../src/lib/cn.ts","../src/components/PagePicker.tsx","../src/components/BuilderChrome.tsx","../src/components/BuilderCanvas.tsx","../src/components/BuilderEmpty.tsx","../src/lib/bridge.ts","../src/lib/url.ts","../src/hooks/useBuilderFrame.ts","../src/components/AppBuilder.tsx"],"names":["React","jsxs","jsx","Check","React2","Loader2","React4"],"mappings":"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","file":"chunk-45SFS6FV.js","sourcesContent":["import * as React from 'react'\nimport { Loader2, Check } from 'lucide-react'\nimport type { BuilderLabels, BuilderPublishContract } from '../types'\n\n/** The same button in both hosts; only the transport behind `publish` differs.\n * No contract means the path is not wired up here, and it says so. */\nexport function PublishButton({\n publish,\n labels,\n}: {\n publish?: BuilderPublishContract\n labels?: BuilderLabels\n}) {\n const label = labels?.publish ?? 'Publicar'\n const state = publish?.state ?? 'idle'\n const busy = state === 'publishing'\n const disabled = !publish || busy\n\n return (\n <button\n type=\"button\"\n onClick={() => publish?.publish()}\n disabled={disabled}\n title={\n publish\n ? publish.error ?? label\n : labels?.publishUnavailable ?? 'Publicar ainda não está ligado neste ambiente'\n }\n className=\"flex h-9 items-center gap-1.5 rounded-full bg-primary px-4 text-sm font-medium text-primary-foreground shadow-sm transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {busy ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : null}\n {state === 'published' && !busy ? <Check className=\"h-3.5 w-3.5\" /> : null}\n {label}\n </button>\n )\n}\n","/** A route the app announced, named the way a person would say it. */\nexport interface BuilderPage {\n route: string\n label: string\n}\n\nconst HOME_LABELS: Record<string, string> = { '/': 'Início' }\n\n/** \"#/produtos\" and \"/produtos\" are the same page said two ways — hash routing\n * is a routing style, not a different address space. */\nexport function normalizeRoute(route: string): string {\n const clean = route.split('?')[0].replace(/^#/, '')\n return clean.startsWith('/') ? clean : `/${clean}`\n}\n\nexport function isHomeRoute(route: string): boolean {\n return normalizeRoute(route) === '/'\n}\n\nconst KNOWN: Record<string, string> = {\n produtos: 'Produtos',\n products: 'Produtos',\n carrinho: 'Carrinho',\n cart: 'Carrinho',\n checkout: 'Checkout',\n contato: 'Contato',\n contact: 'Contato',\n sobre: 'Sobre',\n about: 'Sobre',\n blog: 'Blog',\n colecoes: 'Coleções',\n collections: 'Coleções',\n cardapio: 'Cardápio',\n conta: 'Conta',\n account: 'Conta',\n pedidos: 'Pedidos',\n catalog: 'Catálogo',\n catalogo: 'Catálogo',\n privacy: 'Privacidade',\n terms: 'Termos',\n refunds: 'Reembolsos',\n receitas: 'Receitas',\n product: 'Produtos',\n collection: 'Coleções',\n}\n\n/**\n * \"/produtos/:slug\" → \"Produtos ▸ :slug\". A path is what the app calls the page;\n * this is what the person calls it, which is the whole point of the picker.\n */\nexport function labelForRoute(route: string): string {\n const clean = normalizeRoute(route)\n if (HOME_LABELS[clean]) return HOME_LABELS[clean]\n\n const segments = clean.split('/').filter(Boolean)\n if (!segments.length) return HOME_LABELS['/']\n\n return segments\n .map((segment) => {\n const key = segment.toLowerCase()\n if (KNOWN[key]) return KNOWN[key]\n const words = segment.replace(/^:/, '').replace(/[-_]+/g, ' ')\n return words.charAt(0).toUpperCase() + words.slice(1)\n })\n .join(' › ')\n}\n\n/** A leaf, or a section with the pages under it. */\nexport interface BuilderPageGroup {\n key: string\n label: string\n route?: string\n children: BuilderPage[]\n}\n\nconst GROUP_FROM = 3\n\n/**\n * One level of grouping, and only where it earns its place: eleven product\n * pages listed flat bury the four pages someone actually navigates to. Below\n * {@link GROUP_FROM} siblings the folder costs a click and saves nothing.\n */\nexport function toPageGroups(routes: string[]): BuilderPageGroup[] {\n const bySegment = new Map<string, BuilderPage[]>()\n for (const route of routes) {\n const segment = normalizeRoute(route).split('/').filter(Boolean)[0] ?? ''\n const list = bySegment.get(segment) ?? []\n list.push({ route, label: labelForRoute(route) })\n bySegment.set(segment, list)\n }\n\n const groups: BuilderPageGroup[] = []\n for (const [segment, pages] of bySegment) {\n if (pages.length < GROUP_FROM || !segment) {\n groups.push(...pages.map((page) => ({ key: page.route, label: page.label, route: page.route, children: [] })))\n continue\n }\n groups.push({\n key: segment,\n label: labelForRoute(`/${segment}`),\n children: pages.map((page) => ({\n route: page.route,\n // Inside the folder the section name is the folder's, not each row's.\n label: page.label.split(' › ').slice(1).join(' › ') || page.label,\n })),\n })\n }\n // Home first, then alphabetical. A comparator that only says \"home wins\"\n // when home is one of the two arguments is not an order, and sort showed it.\n const rank = (g: BuilderPageGroup) => (g.route && isHomeRoute(g.route) ? 0 : 1)\n return groups.sort((a, b) => rank(a) - rank(b) || a.label.localeCompare(b.label))\n}\n\nexport function toPages(routes: string[]): BuilderPage[] {\n return routes.map((route) => ({ route, label: labelForRoute(route) }))\n}\n","/** The whole of clsx we need. Keeping it local is what keeps this package free\n * of a design-system dependency, so both hosts can mount the surface. */\nexport function cn(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ')\n}\n","import * as React from 'react'\nimport { ChevronsUpDown, Search, House, FileText, Folder, ChevronRight, ChevronLeft, Check } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { isHomeRoute, labelForRoute, normalizeRoute, toPageGroups, toPages } from '../lib/pages'\n\n/**\n * The address bar as the app's own table of contents: the page you are on, by\n * its name, and the pages you can go to. A raw URL is the app's word for the\n * page; this is the person's.\n *\n * With no routes announced it stays a plain label — a picker that opens on\n * nothing is worse than no picker.\n */\nexport function PagePicker({\n routes,\n currentPath,\n onNavigate,\n fallback,\n leading,\n searchLabel = 'Buscar página',\n emptyLabel = 'Nenhuma página com esse nome',\n}: {\n routes: string[]\n currentPath: string\n onNavigate: (route: string) => void\n /** Shown when the app has not announced any route. */\n fallback: string\n leading?: React.ReactNode\n searchLabel?: string\n emptyLabel?: string\n}) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const boxRef = React.useRef<HTMLDivElement | null>(null)\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n\n const [section, setSection] = React.useState<string | null>(null)\n\n const pages = React.useMemo(() => toPages(routes), [routes])\n const groups = React.useMemo(() => toPageGroups(routes), [routes])\n const openSection = React.useMemo(() => groups.find((g) => g.key === section) ?? null, [groups, section])\n\n // Search reaches every page, folders and all — a name is easier to type than\n // to remember which section it lives in.\n const matches = React.useMemo(() => {\n const q = query.trim().toLowerCase()\n if (q) return pages.filter((p) => p.label.toLowerCase().includes(q) || p.route.toLowerCase().includes(q))\n if (openSection) return openSection.children\n return null\n }, [pages, query, openSection])\n\n React.useEffect(() => {\n if (!open) return\n const onDown = (event: MouseEvent) => {\n if (!boxRef.current?.contains(event.target as Node)) setOpen(false)\n }\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onDown)\n document.addEventListener('keydown', onKey)\n inputRef.current?.focus()\n return () => {\n document.removeEventListener('mousedown', onDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n const label = pages.length ? labelForRoute(currentPath) : fallback\n\n if (!pages.length) {\n return (\n <div className=\"flex h-9 min-w-0 flex-1 items-center gap-2 rounded-full bg-muted/60 px-2\">\n {leading}\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">{label}</span>\n </div>\n )\n }\n\n return (\n <div ref={boxRef} className=\"relative flex h-9 min-w-0 flex-1 items-center gap-2 rounded-full bg-muted/60 px-2\">\n {leading}\n <button\n type=\"button\"\n onClick={() => {\n setQuery('')\n setSection(null)\n setOpen((v) => !v)\n }}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-full py-1 text-left text-xs font-medium text-foreground\"\n >\n <span className=\"min-w-0 truncate\">{label}</span>\n <ChevronsUpDown className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </button>\n\n {open ? (\n <div\n role=\"listbox\"\n className=\"absolute left-0 top-[calc(100%+6px)] z-50 w-[min(22rem,100%)] overflow-hidden rounded-xl border border-border bg-card shadow-lg\"\n >\n {openSection && !query ? (\n <button\n type=\"button\"\n onClick={() => setSection(null)}\n className=\"flex w-full items-center gap-2 border-b border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/60\"\n >\n <ChevronLeft className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n {openSection.label}\n </button>\n ) : null}\n\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <Search className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchLabel}\n aria-label={searchLabel}\n className=\"w-full bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n />\n </div>\n\n <div className=\"max-h-72 overflow-y-auto p-1\">\n {!matches ? (\n groups.map((group) => {\n if (!group.route) {\n return (\n <button\n key={group.key}\n type=\"button\"\n onClick={() => setSection(group.key)}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-sm text-foreground transition-colors hover:bg-muted/60\"\n >\n <Folder className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{group.label}</span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{group.children.length}</span>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n )\n }\n const active = normalizeRoute(group.route) === normalizeRoute(currentPath)\n const Icon = isHomeRoute(group.route) ? House : FileText\n return (\n <button\n key={group.key}\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n onClick={() => {\n onNavigate(group.route!)\n setOpen(false)\n }}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-sm transition-colors',\n active ? 'bg-muted font-medium text-foreground' : 'text-foreground hover:bg-muted/60',\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{group.label}</span>\n {active ? <Check className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n </button>\n )\n })\n ) : matches.length ? (\n matches.map((page) => {\n const active = normalizeRoute(page.route) === normalizeRoute(currentPath)\n const Icon = isHomeRoute(page.route) ? House : FileText\n return (\n <button\n key={page.route}\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n onClick={() => {\n onNavigate(page.route)\n setOpen(false)\n }}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-sm transition-colors',\n active ? 'bg-muted font-medium text-foreground' : 'text-foreground hover:bg-muted/60',\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{page.label}</span>\n {active ? <Check className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n </button>\n )\n })\n ) : (\n <p className=\"px-2.5 py-6 text-center text-xs text-muted-foreground\">{emptyLabel}</p>\n )}\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Monitor, Smartphone, RotateCw, ExternalLink, Code2, Eye } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { PublishButton } from './PublishButton'\nimport { PagePicker } from './PagePicker'\nimport type {\n BuilderLabels,\n BuilderMode,\n BuilderPublishContract,\n BuilderTarget,\n BuilderViewport,\n} from '../types'\n\nconst iconButton =\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground disabled:pointer-events-none disabled:opacity-40'\n\n/** Domain + path, the way a browser bar reads — the scheme is noise here. */\nfunction addressOf(url: string | null, path: string): string {\n if (!url) return path\n try {\n const parsed = new URL(url)\n const base = parsed.host + parsed.pathname.replace(/\\/+$/, '')\n return path === '/' ? base + '/' : base + path\n } catch {\n return path\n }\n}\n\n/**\n * macOS window buttons, and they do what those buttons do. A light with no\n * handler is not rendered dead — it is not rendered.\n */\nfunction TrafficLights({\n onClose,\n onToggleChat,\n onToggleWide,\n labels,\n}: {\n onClose?: () => void\n onToggleChat?: () => void\n onToggleWide?: () => void\n labels?: BuilderLabels\n}) {\n const lights = [\n { id: 'close', color: 'bg-[#ff5f57]', label: labels?.close ?? 'Sair', onClick: onClose },\n { id: 'minimize', color: 'bg-[#febc2e]', label: labels?.toggleChat ?? 'Recolher a conversa', onClick: onToggleChat },\n { id: 'zoom', color: 'bg-[#28c840]', label: labels?.toggleWide ?? 'Dar a tela toda ao app', onClick: onToggleWide },\n ].filter((light) => !!light.onClick)\n\n if (!lights.length) return null\n\n return (\n <div className=\"flex shrink-0 items-center gap-1.5 pl-1\">\n {lights.map((light) => (\n <button\n key={light.id}\n type=\"button\"\n title={light.label}\n aria-label={light.label}\n onClick={light.onClick}\n className=\"flex h-4 w-4 items-center justify-center rounded-full transition-transform hover:scale-125 active:scale-95\"\n >\n <span className={cn('h-3 w-3 rounded-full', light.color)} />\n </button>\n ))}\n </div>\n )\n}\n\n/**\n * One row, the shape of a browser: window buttons, then the address bar the\n * width of the page, then what you do to it. The page owns this bar — the\n * shell's own is gone on an immersive route — so there is exactly one.\n */\nexport function BuilderChrome({\n target,\n currentPath,\n routes,\n onNavigate,\n viewport,\n onViewportChange,\n onReload,\n mode,\n onModeChange,\n publish,\n onClose,\n onToggleChat,\n onToggleWide,\n chromeEnd,\n labels,\n}: {\n target: BuilderTarget\n currentPath: string\n routes: string[]\n onNavigate: (route: string) => void\n viewport: BuilderViewport\n onViewportChange: (viewport: BuilderViewport) => void\n onReload: () => void\n mode: BuilderMode\n onModeChange?: (mode: BuilderMode) => void\n publish?: BuilderPublishContract\n onClose?: () => void\n onToggleChat?: () => void\n onToggleWide?: () => void\n chromeEnd?: React.ReactNode\n labels?: BuilderLabels\n}) {\n const address = addressOf(target.url, currentPath)\n const openTarget = target.liveUrl ?? target.url\n // The icon states WHERE YOU ARE, the way a browser's does; the tooltip states\n // what a click does. Showing the next state instead made the control read as\n // a claim about the canvas that was never true.\n const Device = viewport === 'desktop' ? Monitor : Smartphone\n const deviceLabel = viewport === 'desktop' ? 'Ver no celular' : 'Ver no computador'\n\n return (\n // Same 56px as the companion column's header (RightRail), so the two read\n // as one window bar rather than two rows that nearly line up.\n <div className=\"flex h-14 shrink-0 items-center gap-2 border-b border-border px-3\">\n {/* No window buttons on a phone: the frame is a device, not a window, and\n the three dots would be spending the narrowest row's width saying so. */}\n {viewport === 'desktop' ? (\n <TrafficLights\n onClose={onClose}\n onToggleChat={onToggleChat}\n onToggleWide={onToggleWide}\n labels={labels}\n />\n ) : null}\n\n {onModeChange ? (\n <div className=\"ml-1 flex shrink-0 items-center gap-0.5 rounded-full bg-muted/60 p-0.5\">\n {([\n { id: 'preview' as const, icon: Eye, title: labels?.preview ?? 'Visual' },\n { id: 'code' as const, icon: Code2, title: labels?.code ?? 'Código' },\n ]).map(({ id, icon: Icon, title }) => (\n <button\n key={id}\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={mode === id}\n onClick={() => onModeChange(id)}\n className={cn(\n 'flex h-7 items-center gap-1.5 rounded-full px-2.5 text-xs font-medium transition-colors',\n mode === id ? 'bg-card text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground',\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {title}\n </button>\n ))}\n </div>\n ) : null}\n\n {/* The address bar IS the row: the device toggle lives at its left, the\n way a browser puts the shield or the lock there. */}\n <PagePicker\n routes={routes}\n currentPath={currentPath}\n onNavigate={onNavigate}\n fallback={address}\n searchLabel={labels?.searchPage}\n emptyLabel={labels?.noPage}\n leading={\n <button\n type=\"button\"\n title={deviceLabel}\n aria-label={deviceLabel}\n onClick={() => onViewportChange(viewport === 'desktop' ? 'mobile' : 'desktop')}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground\"\n >\n <Device className=\"h-4 w-4\" />\n </button>\n }\n />\n\n <button\n type=\"button\"\n title={labels?.viewLive ?? 'Abrir em uma aba'}\n aria-label={labels?.viewLive ?? 'Abrir em uma aba'}\n disabled={!openTarget}\n onClick={() => openTarget && window.open(openTarget, '_blank', 'noopener,noreferrer')}\n className={iconButton}\n >\n <ExternalLink className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n title={labels?.reload ?? 'Recarregar'}\n aria-label={labels?.reload ?? 'Recarregar'}\n onClick={onReload}\n className={iconButton}\n >\n <RotateCw className=\"h-4 w-4\" />\n </button>\n\n {chromeEnd}\n <PublishButton publish={publish} labels={labels} />\n </div>\n )\n}\n","import * as React from 'react'\nimport { Loader2, AlertTriangle } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport type { BuilderFrameController } from '../hooks/useBuilderFrame'\nimport type { BuilderLabels, BuilderTarget } from '../types'\n\n// The window around it is what narrows on mobile (see AppBuilder), so the frame\n// itself always fills whatever it was given.\nconst FRAME = 'h-full w-full'\n\nexport function BuilderCanvas({\n target,\n frame,\n labels,\n}: {\n target: BuilderTarget\n frame: BuilderFrameController\n labels?: BuilderLabels\n}) {\n // Dragging a divider anywhere in the host moves the pointer over the canvas,\n // and a cross-origin frame swallows every move event once it does.\n const [dragging, setDragging] = React.useState(false)\n React.useEffect(() => {\n const down = (event: PointerEvent) => {\n const el = event.target as HTMLElement | null\n if (el?.closest('[role=\"separator\"]')) setDragging(true)\n }\n const up = () => setDragging(false)\n window.addEventListener('pointerdown', down, true)\n window.addEventListener('pointerup', up, true)\n return () => {\n window.removeEventListener('pointerdown', down, true)\n window.removeEventListener('pointerup', up, true)\n }\n }, [])\n\n if (!frame.src) return null\n\n return (\n <div className=\"relative flex min-h-0 flex-1 justify-center overflow-hidden\">\n <iframe\n key={`${frame.src}#${frame.nonce}`}\n ref={frame.frameRef}\n src={frame.src}\n title={target.name}\n onLoad={frame.onLoad}\n className={cn('border-0 bg-white', FRAME, dragging && 'pointer-events-none')}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-modals\"\n />\n\n {frame.loading && !frame.failed && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n )}\n\n {frame.failed && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 bg-background/95 p-6 text-center\">\n <AlertTriangle className=\"h-6 w-6 text-muted-foreground\" />\n <p className=\"text-sm font-medium text-foreground\">\n {labels?.loadFailed ?? 'Não foi possível carregar o app aqui dentro.'}\n </p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">\n {labels?.loadFailedHint\n ?? 'O servidor pode estar bloqueando a exibição em outra página. Abra em uma nova aba enquanto isso.'}\n </p>\n <button\n type=\"button\"\n onClick={() => frame.src && window.open(frame.src, '_blank', 'noopener,noreferrer')}\n className=\"mt-1 rounded-full border border-border px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted\"\n >\n {labels?.openInTab ?? 'Abrir em nova aba'}\n </button>\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Globe } from 'lucide-react'\nimport type { BuilderLabels } from '../types'\n\nexport function BuilderEmpty({ labels, onAction }: { labels?: BuilderLabels; onAction?: () => void }) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <Globe className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium text-foreground\">\n {labels?.emptyTitle ?? 'Nenhum app vinculado ainda'}\n </p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">\n {labels?.emptyBody ?? 'Vincule o projeto para editá-lo aqui, conversando com o assistente.'}\n </p>\n {onAction ? (\n <button\n type=\"button\"\n onClick={onAction}\n className=\"mt-1 rounded-full border border-border px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted\"\n >\n {labels?.emptyAction ?? 'Vincular em Configurações'}\n </button>\n ) : null}\n </div>\n )\n}\n","// Host side of the picker protocol both the storefront and the platform's\n// injected overlay already speak. v1 listens for navigation and drives the\n// frame; activate/picked are declared so the overlay lands without\n// renegotiating the channel.\nexport const BUILDER_MESSAGES = {\n activate: 'ACTIVATE_ELEMENT_PICKER',\n deactivate: 'DEACTIVATE_ELEMENT_PICKER',\n ready: 'ELEMENT_PICKER_READY',\n picked: 'ELEMENT_PICKED',\n cancelled: 'ELEMENT_PICKER_CANCELLED',\n navigation: 'NAVIGATION_CHANGE',\n} as const\n\nexport interface BuilderPickedBlock {\n path: string\n type: string\n rect?: { top: number; left: number; width: number; height: number }\n}\n\n/** The channel the platform's injected script already speaks (route-discovery.ts). */\nexport const ROUTES_SOURCE = 'fayz-routes'\nexport const ROUTES_PARENT_SOURCE = 'fayz-routes-parent'\n\nexport interface BuilderBridgeHandlers {\n onRoutes?: (routes: string[]) => void\n onNavigate?: (path: string) => void\n onReady?: () => void\n onPicked?: (block: BuilderPickedBlock) => void\n onCancelled?: () => void\n}\n\n/**\n * Listen to one frame. `origin` is derived from the canvas URL by us — a frame\n * that announces its own origin is a frame that can lie about it.\n */\nexport function connectBuilderBridge(\n frame: HTMLIFrameElement,\n origin: string,\n handlers: BuilderBridgeHandlers,\n): () => void {\n const win = typeof window === 'undefined' ? undefined : window\n if (!win) return () => {}\n\n const onMessage = (event: MessageEvent) => {\n if (event.origin !== origin) return\n if (event.source !== frame.contentWindow) return\n const data = event.data as\n | { source?: string; type?: string; path?: string; route?: string; routes?: string[]; data?: BuilderPickedBlock }\n | null\n\n if (data?.source === ROUTES_SOURCE) {\n if (data.type === 'ROUTES_DISCOVERED' && Array.isArray(data.routes)) handlers.onRoutes?.(data.routes)\n else if (data.type === 'ROUTE_CHANGED' && typeof data.route === 'string') handlers.onNavigate?.(data.route)\n return\n }\n\n switch (data?.type) {\n case BUILDER_MESSAGES.navigation:\n if (typeof data.path === 'string') handlers.onNavigate?.(data.path)\n break\n case BUILDER_MESSAGES.ready:\n handlers.onReady?.()\n break\n case BUILDER_MESSAGES.picked:\n if (data.data) handlers.onPicked?.(data.data)\n break\n case BUILDER_MESSAGES.cancelled:\n handlers.onCancelled?.()\n break\n }\n }\n\n win.addEventListener('message', onMessage)\n return () => win.removeEventListener('message', onMessage)\n}\n\n/** Ask the app to go somewhere. Same message its injected script listens for. */\nexport function navigateBuilder(\n frame: HTMLIFrameElement | null,\n origin: string | null,\n route: string,\n): void {\n postToBuilder(frame, origin, { source: ROUTES_PARENT_SOURCE, type: 'NAVIGATE', route })\n}\n\n/** Outbound always names the expected origin — never '*'. */\nexport function postToBuilder(\n frame: HTMLIFrameElement | null,\n origin: string | null,\n message: Record<string, unknown>,\n): void {\n if (!frame?.contentWindow || !origin) return\n frame.contentWindow.postMessage(message, origin)\n}\n","// Ported from the Fayz editor (apps/web/src/utils/previewUrlBuilder.ts): the one\n// part of its preview with real logic and no dependency. When the editor mounts\n// this surface it deletes its copy.\n\nexport function getBaseUrl(url: string): string {\n return url.split('?')[0].split('#')[0].replace(/\\/$/, '')\n}\n\nexport function getQueryString(url: string): string {\n const parts = url.split('?')\n return parts.length > 1 ? parts[1].split('#')[0] : ''\n}\n\n/** Point a preview URL at a route, keeping the query the container needs. */\nexport function buildIframeUrl(baseUrl: string, route: string): string {\n const cleanBase = getBaseUrl(baseUrl)\n const queryString = getQueryString(baseUrl)\n\n // Hash routing: the route IS the fragment, so it goes after the query.\n if (route.startsWith('#/')) {\n return `${cleanBase}${queryString ? '?' + queryString : ''}${route}`\n }\n\n // A route can carry its own anchor (\"/#pricing\"), which belongs last.\n const hashIndex = route.indexOf('#')\n const routePath = hashIndex === -1 ? route : route.substring(0, hashIndex)\n const hashFragment = hashIndex === -1 ? '' : route.substring(hashIndex)\n\n let result = `${cleanBase}${routePath === '/' ? '' : routePath}`\n if (queryString) result += `?${queryString}`\n if (hashFragment) result += hashFragment\n return result\n}\n\nexport function addCacheBuster(url: string, now: number = Date.now()): string {\n return `${url}${url.includes('?') ? '&' : '?'}_cb=${now}`\n}\n\nexport function extractRouteFromUrl(fullUrl: string, baseUrl: string): string {\n try {\n const full = new URL(fullUrl)\n const base = new URL(baseUrl)\n if (full.host !== base.host) return '/'\n\n let pathname = full.pathname\n if (base.pathname !== '/' && pathname.startsWith(base.pathname)) {\n pathname = pathname.slice(base.pathname.length)\n }\n if (!pathname.startsWith('/')) pathname = '/' + pathname\n return pathname || '/'\n } catch {\n return '/'\n }\n}\n\nexport function isValidPreviewUrl(url: string | null | undefined): boolean {\n if (!url) return false\n try {\n const parsed = new URL(url)\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\n } catch {\n return false\n }\n}\n\nexport function getUrlOrigin(url: string): string | null {\n try {\n return new URL(url).origin\n } catch {\n return null\n }\n}\n","import * as React from 'react'\nimport { connectBuilderBridge, navigateBuilder } from '../lib/bridge'\nimport { buildIframeUrl, getUrlOrigin } from '../lib/url'\nimport type { BuilderElementContext } from '../types'\n\nexport interface BuilderFrameController {\n frameRef: React.MutableRefObject<HTMLIFrameElement | null>\n /** Remount key — the only reliable way to reload a cross-origin document. */\n nonce: number\n src: string | null\n origin: string | null\n loading: boolean\n failed: boolean\n currentPath: string\n /** Routes the app announced through its own discovery script. */\n routes: string[]\n onLoad: () => void\n reload: () => void\n navigate: (path: string) => void\n}\n\n/** A cross-origin frame that never loads never errors either, so time is the signal. */\nconst LOAD_TIMEOUT_MS = 8000\n\nexport function useBuilderFrame(\n url: string | null,\n handlers?: { onNavigate?: (path: string) => void; onPick?: (context: BuilderElementContext) => void },\n): BuilderFrameController {\n const frameRef = React.useRef<HTMLIFrameElement | null>(null)\n const [nonce, setNonce] = React.useState(0)\n const [loading, setLoading] = React.useState(true)\n const [failed, setFailed] = React.useState(false)\n const [currentPath, setCurrentPath] = React.useState('/')\n const [routes, setRoutes] = React.useState<string[]>([])\n\n const origin = React.useMemo(() => (url ? getUrlOrigin(url) : null), [url])\n // The initial document only. Intra-app navigation happens inside the frame,\n // so following currentPath here would reload the page on every click.\n const src = React.useMemo(() => (url ? buildIframeUrl(url, '/') : null), [url])\n\n const cb = React.useRef(handlers)\n cb.current = handlers\n\n React.useEffect(() => {\n setLoading(true)\n setFailed(false)\n }, [src, nonce])\n\n React.useEffect(() => {\n if (!loading) return\n const timer = setTimeout(() => setFailed(true), LOAD_TIMEOUT_MS)\n return () => clearTimeout(timer)\n }, [loading, src, nonce])\n\n React.useEffect(() => {\n const frame = frameRef.current\n if (!frame || !origin) return\n return connectBuilderBridge(frame, origin, {\n onRoutes: setRoutes,\n onNavigate: (path) => {\n setCurrentPath(path)\n cb.current?.onNavigate?.(path)\n },\n onPicked: (block) => cb.current?.onPick?.({ selector: block.path, tagName: block.type }),\n })\n }, [origin, nonce])\n\n const reload = React.useCallback(() => setNonce((n) => n + 1), [])\n\n // The app moves itself; we only ask. Rebuilding the src would reload the\n // whole thing and lose whatever state the page was in.\n const navigate = React.useCallback(\n (path: string) => {\n setCurrentPath(path)\n navigateBuilder(frameRef.current, origin, path)\n },\n [origin],\n )\n\n const onLoad = React.useCallback(() => {\n setLoading(false)\n setFailed(false)\n }, [])\n\n return { frameRef, nonce, src, origin, loading, failed, currentPath, routes, onLoad, reload, navigate }\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\nimport { BuilderChrome } from './BuilderChrome'\nimport { BuilderCanvas } from './BuilderCanvas'\nimport { BuilderEmpty } from './BuilderEmpty'\nimport { useBuilderFrame } from '../hooks/useBuilderFrame'\nimport type { AppBuilderProps, BuilderElementContext, BuilderViewport } from '../types'\n\n/**\n * The app-builder surface: a window bar, the app running inside it, and the\n * seams for the three things every builder also needs — seeing the code,\n * publishing, and talking to whoever is doing the work.\n *\n * It draws its OWN bar instead of portalling into a host's header. That is what\n * lets the same component sit in the Fayz editor and in an admin shell.\n */\nexport function AppBuilder({\n target,\n mode = 'preview',\n onModeChange,\n code,\n chat,\n publish,\n onClose,\n onToggleChat,\n onToggleWide,\n onNavigate,\n onPick,\n viewport: viewportProp,\n onViewportChange,\n empty,\n labels,\n slots,\n className,\n frame: frameProp,\n}: AppBuilderProps) {\n // `chatContract` is declared on the props and deliberately not read yet: the\n // only sender is the element picker, which is the next milestone. Taking it\n // out of the contract now would make that milestone an API change.\n const [internalViewport, setInternalViewport] = React.useState<BuilderViewport>('desktop')\n const viewport = viewportProp ?? internalViewport\n const setViewport = onViewportChange ?? setInternalViewport\n\n // A pick is only worth reporting when something can act on it: the host's\n // callback, or the conversation the host mounted.\n // A pick goes wherever the host says. There is no picker UI yet — the wire is\n // live so the overlay lands without renegotiating who a pick belongs to.\n const handlePick = React.useCallback(\n (context: BuilderElementContext) => onPick?.(context),\n [onPick],\n )\n\n // The host may own the controller (it needs the handle to drive the canvas\n // from an agent tool or a button); otherwise the surface owns one. Passing a\n // null url to the unused one keeps it from running timers for nothing.\n const ownFrame = useBuilderFrame(frameProp ? null : target.url, { onNavigate, onPick: handlePick })\n const frame = frameProp ?? ownFrame\n\n const body = !target.url ? (\n (empty ?? <BuilderEmpty labels={labels} />)\n ) : mode === 'code' && code ? (\n <div className=\"min-h-0 flex-1 overflow-hidden\">{code}</div>\n ) : (\n <BuilderCanvas target={target} frame={frame} labels={labels} />\n )\n\n // Mobile narrows the WHOLE window, chrome and all — a desktop-width toolbar\n // over a phone-width page is a claim about a device nobody is holding.\n const mobile = viewport === 'mobile' && !!target.url\n\n return (\n <div className={cn('flex h-full min-h-0 overflow-hidden', className)}>\n <div className={cn('flex min-w-0 flex-1 flex-col overflow-hidden', mobile && 'items-center bg-muted/30 py-3')}>\n <div\n className={cn(\n 'flex min-h-0 w-full flex-1 flex-col overflow-hidden',\n mobile && 'max-w-[420px] rounded-2xl border border-border bg-card shadow-xl',\n )}\n >\n <BuilderChrome\n target={target}\n currentPath={frame.currentPath}\n routes={frame.routes}\n onNavigate={frame.navigate}\n viewport={viewport}\n onViewportChange={setViewport}\n onReload={frame.reload}\n mode={mode}\n onModeChange={code ? onModeChange : undefined}\n publish={publish}\n onClose={onClose}\n onToggleChat={onToggleChat}\n onToggleWide={onToggleWide}\n chromeEnd={slots?.chromeEnd}\n labels={labels}\n />\n {body}\n </div>\n {slots?.belowCanvas}\n </div>\n\n {chat ? (\n <div className=\"hidden w-[min(28rem,32%)] shrink-0 border-l border-border md:flex md:flex-col md:overflow-hidden\">\n {chat}\n </div>\n ) : null}\n </div>\n )\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import type { AppBuilderProps } from '../types';
3
+ /**
4
+ * The app-builder surface: a window bar, the app running inside it, and the
5
+ * seams for the three things every builder also needs — seeing the code,
6
+ * publishing, and talking to whoever is doing the work.
7
+ *
8
+ * It draws its OWN bar instead of portalling into a host's header. That is what
9
+ * lets the same component sit in the Fayz editor and in an admin shell.
10
+ */
11
+ export declare function AppBuilder({ target, mode, onModeChange, code, chat, publish, onClose, onToggleChat, onToggleWide, onNavigate, onPick, viewport: viewportProp, onViewportChange, empty, labels, slots, className, frame: frameProp, }: AppBuilderProps): React.JSX.Element;
12
+ //# sourceMappingURL=AppBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppBuilder.d.ts","sourceRoot":"","sources":["../../src/components/AppBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,eAAe,EAA0C,MAAM,UAAU,CAAA;AAEvF;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,IAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,MAAM,EACN,QAAQ,EAAE,YAAY,EACtB,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,KAAK,EAAE,SAAS,GACjB,EAAE,eAAe,qBAyEjB"}
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ import type { BuilderFrameController } from '../hooks/useBuilderFrame';
3
+ import type { BuilderLabels, BuilderTarget } from '../types';
4
+ export declare function BuilderCanvas({ target, frame, labels, }: {
5
+ target: BuilderTarget;
6
+ frame: BuilderFrameController;
7
+ labels?: BuilderLabels;
8
+ }): React.JSX.Element | null;
9
+ //# sourceMappingURL=BuilderCanvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderCanvas.d.ts","sourceRoot":"","sources":["../../src/components/BuilderCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAM5D,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,MAAM,GACP,EAAE;IACD,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,sBAAsB,CAAA;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB,4BA2DA"}
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import type { BuilderLabels, BuilderMode, BuilderPublishContract, BuilderTarget, BuilderViewport } from '../types';
3
+ /**
4
+ * One row, the shape of a browser: window buttons, then the address bar the
5
+ * width of the page, then what you do to it. The page owns this bar — the
6
+ * shell's own is gone on an immersive route — so there is exactly one.
7
+ */
8
+ export declare function BuilderChrome({ target, currentPath, routes, onNavigate, viewport, onViewportChange, onReload, mode, onModeChange, publish, onClose, onToggleChat, onToggleWide, chromeEnd, labels, }: {
9
+ target: BuilderTarget;
10
+ currentPath: string;
11
+ routes: string[];
12
+ onNavigate: (route: string) => void;
13
+ viewport: BuilderViewport;
14
+ onViewportChange: (viewport: BuilderViewport) => void;
15
+ onReload: () => void;
16
+ mode: BuilderMode;
17
+ onModeChange?: (mode: BuilderMode) => void;
18
+ publish?: BuilderPublishContract;
19
+ onClose?: () => void;
20
+ onToggleChat?: () => void;
21
+ onToggleWide?: () => void;
22
+ chromeEnd?: React.ReactNode;
23
+ labels?: BuilderLabels;
24
+ }): React.JSX.Element;
25
+ //# sourceMappingURL=BuilderChrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderChrome.d.ts","sourceRoot":"","sources":["../../src/components/BuilderChrome.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,eAAe,EAChB,MAAM,UAAU,CAAA;AA0DjB;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,WAAW,EACX,MAAM,EACN,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,MAAM,GACP,EAAE;IACD,MAAM,EAAE,aAAa,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,EAAE,eAAe,CAAA;IACzB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAA;IACrD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,IAAI,EAAE,WAAW,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IAC1C,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB,qBA+FA"}
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import type { BuilderLabels } from '../types';
3
+ export declare function BuilderEmpty({ labels, onAction }: {
4
+ labels?: BuilderLabels;
5
+ onAction?: () => void;
6
+ }): React.JSX.Element;
7
+ //# sourceMappingURL=BuilderEmpty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderEmpty.d.ts","sourceRoot":"","sources":["../../src/components/BuilderEmpty.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,qBAuBnG"}
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * The address bar as the app's own table of contents: the page you are on, by
4
+ * its name, and the pages you can go to. A raw URL is the app's word for the
5
+ * page; this is the person's.
6
+ *
7
+ * With no routes announced it stays a plain label — a picker that opens on
8
+ * nothing is worse than no picker.
9
+ */
10
+ export declare function PagePicker({ routes, currentPath, onNavigate, fallback, leading, searchLabel, emptyLabel, }: {
11
+ routes: string[];
12
+ currentPath: string;
13
+ onNavigate: (route: string) => void;
14
+ /** Shown when the app has not announced any route. */
15
+ fallback: string;
16
+ leading?: React.ReactNode;
17
+ searchLabel?: string;
18
+ emptyLabel?: string;
19
+ }): React.JSX.Element;
20
+ //# sourceMappingURL=PagePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagePicker.d.ts","sourceRoot":"","sources":["../../src/components/PagePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,WAAW,EACX,UAAU,EACV,QAAQ,EACR,OAAO,EACP,WAA6B,EAC7B,UAA2C,GAC5C,EAAE;IACD,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,qBAyKA"}
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ import type { BuilderLabels, BuilderPublishContract } from '../types';
3
+ /** The same button in both hosts; only the transport behind `publish` differs.
4
+ * No contract means the path is not wired up here, and it says so. */
5
+ export declare function PublishButton({ publish, labels, }: {
6
+ publish?: BuilderPublishContract;
7
+ labels?: BuilderLabels;
8
+ }): React.JSX.Element;
9
+ //# sourceMappingURL=PublishButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishButton.d.ts","sourceRoot":"","sources":["../../src/components/PublishButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAErE;uEACuE;AACvE,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,MAAM,GACP,EAAE;IACD,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB,qBAuBA"}
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ import type { BuilderElementContext } from '../types';
3
+ export interface BuilderFrameController {
4
+ frameRef: React.MutableRefObject<HTMLIFrameElement | null>;
5
+ /** Remount key — the only reliable way to reload a cross-origin document. */
6
+ nonce: number;
7
+ src: string | null;
8
+ origin: string | null;
9
+ loading: boolean;
10
+ failed: boolean;
11
+ currentPath: string;
12
+ /** Routes the app announced through its own discovery script. */
13
+ routes: string[];
14
+ onLoad: () => void;
15
+ reload: () => void;
16
+ navigate: (path: string) => void;
17
+ }
18
+ export declare function useBuilderFrame(url: string | null, handlers?: {
19
+ onNavigate?: (path: string) => void;
20
+ onPick?: (context: BuilderElementContext) => void;
21
+ }): BuilderFrameController;
22
+ //# sourceMappingURL=useBuilderFrame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBuilderFrame.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuilderFrame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAErD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAC1D,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,iEAAiE;IACjE,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAKD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,QAAQ,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAAE,GACpG,sBAAsB,CA0DxB"}
@@ -0,0 +1,15 @@
1
+ export { AppBuilder } from './components/AppBuilder';
2
+ export { BuilderChrome } from './components/BuilderChrome';
3
+ export { BuilderCanvas } from './components/BuilderCanvas';
4
+ export { BuilderEmpty } from './components/BuilderEmpty';
5
+ export { PublishButton } from './components/PublishButton';
6
+ export { useBuilderFrame } from './hooks/useBuilderFrame';
7
+ export type { BuilderFrameController } from './hooks/useBuilderFrame';
8
+ export { BUILDER_MESSAGES, connectBuilderBridge, navigateBuilder, postToBuilder } from './lib/bridge';
9
+ export { PagePicker } from './components/PagePicker';
10
+ export { isHomeRoute, labelForRoute, normalizeRoute, toPageGroups, toPages } from './lib/pages';
11
+ export type { BuilderPage, BuilderPageGroup } from './lib/pages';
12
+ export type { BuilderBridgeHandlers, BuilderPickedBlock } from './lib/bridge';
13
+ export { buildIframeUrl, addCacheBuster, extractRouteFromUrl, getBaseUrl, getQueryString, getUrlOrigin, isValidPreviewUrl, } from './lib/url';
14
+ export type { AppBuilderProps, BuilderChatContract, BuilderElementContext, BuilderLabels, BuilderMode, BuilderPublishContract, BuilderTarget, BuilderViewport, } from './types';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACrG,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/F,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC7E,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,eAAe,GAChB,MAAM,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { AppBuilder, BUILDER_MESSAGES, BuilderCanvas, BuilderChrome, BuilderEmpty, PagePicker, PublishButton, addCacheBuster, buildIframeUrl, connectBuilderBridge, extractRouteFromUrl, getBaseUrl, getQueryString, getUrlOrigin, isHomeRoute, isValidPreviewUrl, labelForRoute, navigateBuilder, normalizeRoute, postToBuilder, toPageGroups, toPages, useBuilderFrame } from './chunk-45SFS6FV.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,38 @@
1
+ export declare const BUILDER_MESSAGES: {
2
+ readonly activate: "ACTIVATE_ELEMENT_PICKER";
3
+ readonly deactivate: "DEACTIVATE_ELEMENT_PICKER";
4
+ readonly ready: "ELEMENT_PICKER_READY";
5
+ readonly picked: "ELEMENT_PICKED";
6
+ readonly cancelled: "ELEMENT_PICKER_CANCELLED";
7
+ readonly navigation: "NAVIGATION_CHANGE";
8
+ };
9
+ export interface BuilderPickedBlock {
10
+ path: string;
11
+ type: string;
12
+ rect?: {
13
+ top: number;
14
+ left: number;
15
+ width: number;
16
+ height: number;
17
+ };
18
+ }
19
+ /** The channel the platform's injected script already speaks (route-discovery.ts). */
20
+ export declare const ROUTES_SOURCE = "fayz-routes";
21
+ export declare const ROUTES_PARENT_SOURCE = "fayz-routes-parent";
22
+ export interface BuilderBridgeHandlers {
23
+ onRoutes?: (routes: string[]) => void;
24
+ onNavigate?: (path: string) => void;
25
+ onReady?: () => void;
26
+ onPicked?: (block: BuilderPickedBlock) => void;
27
+ onCancelled?: () => void;
28
+ }
29
+ /**
30
+ * Listen to one frame. `origin` is derived from the canvas URL by us — a frame
31
+ * that announces its own origin is a frame that can lie about it.
32
+ */
33
+ export declare function connectBuilderBridge(frame: HTMLIFrameElement, origin: string, handlers: BuilderBridgeHandlers): () => void;
34
+ /** Ask the app to go somewhere. Same message its injected script listens for. */
35
+ export declare function navigateBuilder(frame: HTMLIFrameElement | null, origin: string | null, route: string): void;
36
+ /** Outbound always names the expected origin — never '*'. */
37
+ export declare function postToBuilder(frame: HTMLIFrameElement | null, origin: string | null, message: Record<string, unknown>): void;
38
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/lib/bridge.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAA;AAEV,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACpE;AAED,sFAAsF;AACtF,eAAO,MAAM,aAAa,gBAAgB,CAAA;AAC1C,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACrC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC9C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,qBAAqB,GAC9B,MAAM,IAAI,CAmCZ;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAC7B,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI,CAEN;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAC3B,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAGN"}
@@ -0,0 +1,4 @@
1
+ /** The whole of clsx we need. Keeping it local is what keeps this package free
2
+ * of a design-system dependency, so both hosts can mount the surface. */
3
+ export declare function cn(...parts: Array<string | false | null | undefined>): string;
4
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../src/lib/cn.ts"],"names":[],"mappings":"AAAA;0EAC0E;AAC1E,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E"}
@@ -0,0 +1,29 @@
1
+ /** A route the app announced, named the way a person would say it. */
2
+ export interface BuilderPage {
3
+ route: string;
4
+ label: string;
5
+ }
6
+ /** "#/produtos" and "/produtos" are the same page said two ways — hash routing
7
+ * is a routing style, not a different address space. */
8
+ export declare function normalizeRoute(route: string): string;
9
+ export declare function isHomeRoute(route: string): boolean;
10
+ /**
11
+ * "/produtos/:slug" → "Produtos ▸ :slug". A path is what the app calls the page;
12
+ * this is what the person calls it, which is the whole point of the picker.
13
+ */
14
+ export declare function labelForRoute(route: string): string;
15
+ /** A leaf, or a section with the pages under it. */
16
+ export interface BuilderPageGroup {
17
+ key: string;
18
+ label: string;
19
+ route?: string;
20
+ children: BuilderPage[];
21
+ }
22
+ /**
23
+ * One level of grouping, and only where it earns its place: eleven product
24
+ * pages listed flat bury the four pages someone actually navigates to. Below
25
+ * {@link GROUP_FROM} siblings the folder costs a click and saves nothing.
26
+ */
27
+ export declare function toPageGroups(routes: string[]): BuilderPageGroup[];
28
+ export declare function toPages(routes: string[]): BuilderPage[];
29
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/lib/pages.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAID;yDACyD;AACzD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AA6BD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAenD;AAED,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,WAAW,EAAE,CAAA;CACxB;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CA6BjE;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAEvD"}
@@ -0,0 +1,9 @@
1
+ export declare function getBaseUrl(url: string): string;
2
+ export declare function getQueryString(url: string): string;
3
+ /** Point a preview URL at a route, keeping the query the container needs. */
4
+ export declare function buildIframeUrl(baseUrl: string, route: string): string;
5
+ export declare function addCacheBuster(url: string, now?: number): string;
6
+ export declare function extractRouteFromUrl(fullUrl: string, baseUrl: string): string;
7
+ export declare function isValidPreviewUrl(url: string | null | undefined): boolean;
8
+ export declare function getUrlOrigin(url: string): string | null;
9
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/lib/url.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBrE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAE5E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAe5E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQzE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD"}
@@ -0,0 +1,12 @@
1
+ import type { PluginManifest } from '@fayz-ai/core';
2
+ import type { AppBuilderPluginOptions } from './admin/options';
3
+ export type { AppBuilderPluginOptions } from './admin/options';
4
+ export { AdminAppBuilder } from './admin/AdminAppBuilder';
5
+ export { useAdminBuilderTarget } from './admin/target';
6
+ /**
7
+ * The admin's mount of the builder surface. Everything host-specific — the
8
+ * target, the rail, the agent — lives behind this door, so the surface itself
9
+ * stays importable by an app that has none of it.
10
+ */
11
+ export declare function createAppBuilderPlugin(options?: AppBuilderPluginOptions): PluginManifest;
12
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAGnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAE9D,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAItD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,cAAc,CAgCxF"}