@fayz-ai/plugin-menu 0.10.8 → 0.10.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.tsx","../src/lib/availability.ts","../src/lib/agent-surface.ts","../src/components/SectionCard.tsx","../src/types.ts","../src/components/ScheduleEditor.tsx","../src/components/MenuRailPage.tsx","../src/components/ItemRailPage.tsx","../src/components/DraftSectionCard.tsx","../src/components/MenuPreview.tsx","../src/views/MenuManagerView.tsx","../src/views/MenuPage.tsx"],"names":["useTranslation","jsxs","jsx","Switch","useState","Button","useEffect","RightRailPage","SheetBody","Input","SheetFooter","Trash2","useMemo","Dropdown","DropdownTrigger","DropdownContent","DropdownItem","Pencil","Copy","DropdownSeparator","Plus","Sparkles","UtensilsCrossed"],"mappings":"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","file":"MenuPage-GC6ATJTT.js","sourcesContent":["import { createPluginContext, formatCurrency, type CurrencyConfig } from '@fayz-ai/admin'\nimport type { MenuDataProvider } from './data/types'\nimport type { MenuUIState } from './store'\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface MenuPluginLabels {\n pageTitle: string\n menuManager: string\n categories: string\n newItem: string\n}\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface MenuModules {\n modifiers: boolean\n deliveryPricing: boolean\n}\n\nexport type MenuCurrency = CurrencyConfig\n\nexport interface ResolvedMenuConfig {\n modules: MenuModules\n labels: MenuPluginLabels\n currency: MenuCurrency\n}\n\nconst ctx = createPluginContext<ResolvedMenuConfig, MenuDataProvider, MenuUIState>('MenuPage')\n\nexport const MenuContextProvider = ctx.ContextProvider\nexport const useMenuConfig = ctx.useConfig\nexport const useMenuProvider = ctx.useProvider\nexport const useMenuStore = ctx.useStore\n\nexport { formatCurrency }\n","import type { MenuAvailability } from '../types'\n\n// ---------------------------------------------------------------------------\n// \"Está sendo servido agora?\"\n//\n// The question the whole multi-menu idea exists to answer. Two rules that a\n// naive string compare gets wrong, so they live here with tests:\n// · a window whose end is before its start crosses midnight (22:00→02:00);\n// · an empty rule means ALWAYS — the common case must cost nothing.\n// ---------------------------------------------------------------------------\n\nconst MINUTES_IN_DAY = 24 * 60\n\n/** \"11:30\" → 690. Returns null for anything that is not HH:MM. */\nexport function parseTime(value: string | undefined): number | null {\n if (!value) return null\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(value.trim())\n if (!match) return null\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (hours > 23 || minutes > 59) return null\n return hours * 60 + minutes\n}\n\nexport function isAlwaysAvailable(availability: MenuAvailability | undefined): boolean {\n if (!availability) return true\n const { days, start, end, from, to } = availability\n return (!days || days.length === 0) && !start && !end && !from && !to\n}\n\n/** Does the rule allow the given moment? */\nexport function isServingAt(availability: MenuAvailability | undefined, at: Date = new Date()): boolean {\n if (isAlwaysAvailable(availability)) return true\n const rule = availability!\n\n const isoDate = `${at.getFullYear()}-${String(at.getMonth() + 1).padStart(2, '0')}-${String(at.getDate()).padStart(2, '0')}`\n if (rule.from && isoDate < rule.from) return false\n if (rule.to && isoDate > rule.to) return false\n\n const start = parseTime(rule.start)\n const end = parseTime(rule.end)\n const nowMinutes = at.getHours() * 60 + at.getMinutes()\n const overnight = start !== null && end !== null && end <= start\n\n // An overnight window belongs to the day it STARTED on: at 01:00 on Sunday a\n // \"Saturday 22:00→02:00\" menu is still being served.\n const dayToCheck = overnight && start !== null && nowMinutes < start\n ? (at.getDay() + 6) % 7\n : at.getDay()\n\n if (rule.days && rule.days.length > 0 && !rule.days.includes(dayToCheck)) return false\n\n if (start === null || end === null) return true\n return overnight\n ? nowMinutes >= start || nowMinutes < end\n : nowMinutes >= start && nowMinutes < end\n}\n\n/** Minutes until the rule next opens — used to say \"abre às 11:30\". */\nexport function minutesUntilOpen(availability: MenuAvailability | undefined, at: Date = new Date()): number | null {\n if (isServingAt(availability, at)) return 0\n const start = parseTime(availability?.start)\n if (start === null) return null\n const nowMinutes = at.getHours() * 60 + at.getMinutes()\n return start > nowMinutes ? start - nowMinutes : MINUTES_IN_DAY - nowMinutes + start\n}\n\n/** Short weekday names in the app's locale, Sunday first (matches Date#getDay). */\nexport function weekdayLabels(locale: string): string[] {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' })\n // 2024-01-07 is a Sunday; noon avoids any timezone rolling the date over.\n return Array.from({ length: 7 }, (_, i) =>\n formatter.format(new Date(2024, 0, 7 + i, 12)).replace('.', ''))\n}\n\n/**\n * One line describing when it runs: \"Seg a Sex · 11:30–15:00\".\n * `alwaysLabel` is passed in because this package has no i18n of its own here.\n */\nexport function describeAvailability(\n availability: MenuAvailability | undefined,\n locale: string,\n alwaysLabel: string,\n): string {\n if (isAlwaysAvailable(availability)) return alwaysLabel\n const rule = availability!\n const parts: string[] = []\n\n if (rule.days && rule.days.length > 0 && rule.days.length < 7) {\n const labels = weekdayLabels(locale)\n const sorted = [...rule.days].sort((a, b) => a - b)\n // Contiguous runs read as a range (\"Seg a Sex\"); anything else is a list.\n const contiguous = sorted.every((day, i) => i === 0 || day === sorted[i - 1] + 1)\n parts.push(contiguous && sorted.length > 2\n ? `${labels[sorted[0]]} a ${labels[sorted[sorted.length - 1]]}`\n : sorted.map((d) => labels[d]).join(', '))\n }\n\n if (rule.start && rule.end) parts.push(`${rule.start}–${rule.end}`)\n else if (rule.start) parts.push(`a partir de ${rule.start}`)\n\n if (rule.from || rule.to) parts.push(`${rule.from ?? '…'} → ${rule.to ?? '…'}`)\n\n return parts.length > 0 ? parts.join(' · ') : alwaysLabel\n}\n","import { useMemo } from 'react'\nimport type { PluginAITool } from '@fayz-ai/core'\nimport { useAgentSurface, type AgentSurfaceContribution, type AgentSurfaceTool } from '@fayz-ai/admin'\n\nimport type {\n DraftItem, DraftSection, ImportResult, Menu, MenuDraft, MenuItem, MenuItemStatus, MenuPlacement, MenuSection,\n} from '../types'\nimport { normalizeName } from './extract-parse'\n\n// ---------------------------------------------------------------------------\n// The menu, as the assistant sees it.\n//\n// The screen publishes what is open and what can be done to it, so \"cria uma\n// seção de sobremesas e move o pudim pra lá\" happens on the menu in front of\n// the user instead of the agent guessing ids. Everything here is client-plane:\n// it runs against the store that is already loaded, which is why it can speak\n// in NAMES — the thing a person actually says.\n// ---------------------------------------------------------------------------\n\nconst INSTRUCTIONS = `Você está com a tela de Cardápio aberta e é VOCÊ quem conduz o cadastro.\n- Trabalhe sempre no cardápio ativo mostrado no estado; se o usuário pedir outro, troque ou crie.\n- Seções e itens são identificados por NOME, do jeito que o usuário fala. Preço é número (29.9), sem moeda.\n\nCadastro em MASSA (foto, PDF ou texto de cardápio):\n- Se a foto/texto do cardápio JÁ ESTÁ nesta conversa: leia você mesmo e chame stageMenuImport UMA vez com todas as seções e itens. NUNCA cadastre seção por seção ou item por item com createMenuSection/createMenuItem — isso estoura o limite de passos e duplica seções. A ferramenta já reaproveita seções existentes e pula itens repetidos.\n- Se o usuário ainda não mandou a foto: diga em uma linha o que vai fazer e chame requestMenuPhotos. Isso põe um botão grande aqui na conversa (\"Subir foto do cardápio\") que abre a câmera ou os arquivos — não peça para o usuário usar o clipe, e não mande ele fazer nada na tela. A foto enviada chega AQUI na conversa como anexo da próxima mensagem: leia e chame stageMenuImport.\n- Este fluxo é todo conversado: NUNCA use startFeatureSetup ou highlightFeature para o cadastro de cardápio — não existe tour para isso, o botão de foto é a ferramenta.\nDepois, nos dois caminhos:\n1. Quando \\`draft\\` aparecer no estado, LEIA em voz alta o que veio: quantas seções, quantos itens, e quais ficaram com preço 0.\n2. Resolva as pendências conversando — pergunte o preço que faltou e chame updateMenuDraftItem. O usuário também pode editar direto na tela; o estado sempre reflete o que está lá.\n3. Só chame commitMenuDraft depois que o usuário confirmar. Se ele desistir, discardMenuDraft.\n\ncreateMenuSection e createMenuItem são para ajustes pontuais (uma seção nova, um prato novo) — nunca para importar um cardápio inteiro.\n\nNUNCA escreva um botão em texto (nada de \"[Subir foto do cardápio]\" ou \"clique no botão abaixo\") — o botão só existe se você chamar a ferramenta. Se ela não estiver disponível, diga isso com todas as letras e ofereça cadastrar item a item.\n\nNunca invente preço, descrição ou item que não estava na foto: um preço errado vai para a mesa do cliente. Prefira perguntar.`\n\nexport interface MenuAgentSurfaceDeps {\n menu?: Menu\n menus: Menu[]\n sections: MenuSection[]\n placements: MenuPlacement[]\n itemsById: Map<string, MenuItem>\n /** What the photos produced, still uncommitted. Both hands edit it. */\n draft: MenuDraft | null\n /** False when no extraction backend is configured — the tool then says so. */\n hasExtractor: boolean\n actions: {\n createSection: (name: string) => Promise<MenuSection | null>\n renameSection: (sectionId: string, name: string) => Promise<void> | void\n reorderSections: (orderedIds: string[]) => Promise<void>\n createItem: (sectionId: string, input: { name: string; price: number; description?: string }) => Promise<MenuItem | null>\n updateItem: (itemId: string, patch: { name?: string; price?: number; description?: string }) => Promise<void>\n setItemStatus: (itemId: string, status: MenuItemStatus) => Promise<void>\n moveItem: (placementId: string, toSectionId: string, toIndex: number) => Promise<void>\n createMenu: (input: { name: string; days?: number[]; start?: string; end?: string }) => Promise<Menu>\n duplicateMenu: (menuId: string, name: string) => Promise<Menu>\n /** Puts the upload button in the conversation and reads what comes back. */\n requestPhotos: () => void\n updateDraftItem: (sectionKey: string, itemKey: string, patch: Partial<DraftItem>) => void\n removeDraftItem: (sectionKey: string, itemKey: string) => void\n updateDraftSection: (sectionKey: string, patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>) => void\n removeDraftSection: (sectionKey: string) => void\n stageDraft: (sections: Array<{ name: string; items: Array<{ name: string; price: number; description?: string }> }>) => {\n sections: number\n items: number\n duplicatesDropped: number\n }\n commitDraft: () => Promise<ImportResult>\n discardDraft: () => void\n }\n}\n\nfunction tool(\n id: string,\n name: string,\n description: string,\n properties: Record<string, any>,\n required: string[],\n mode: 'read' | 'persist' = 'persist',\n): PluginAITool {\n return {\n id,\n name,\n description,\n mode,\n parameters: { type: 'object', properties, required },\n execution: { plane: 'client' },\n // The screen is in front of the user and every one of these is reversible\n // by hand; a confirmation card per rename would make the agent useless for\n // the one job it is good at here — bulk tidying.\n requiresConfirmation: false,\n permission: { feature: 'menu', action: 'edit' },\n }\n}\n\nexport function useMenuAgentSurface(deps: MenuAgentSurfaceDeps): void {\n // A ref-free memo would re-register on every keystroke; the contribution is\n // rebuilt only when the shape of the menu changes.\n const contribution = useMemo<AgentSurfaceContribution>(() => {\n const findSection = (name: string): MenuSection | undefined => {\n const key = normalizeName(name ?? '')\n return deps.sections.find((s) => normalizeName(s.name) === key)\n ?? deps.sections.find((s) => normalizeName(s.name).includes(key))\n }\n const findDraftSection = (draft: MenuDraft | null, name: string): DraftSection | undefined => {\n const key = normalizeName(name ?? '')\n return draft?.sections.find((s) => normalizeName(s.name) === key)\n ?? draft?.sections.find((s) => normalizeName(s.name).includes(key))\n }\n const findDraft = (draft: MenuDraft | null, sectionName: string, itemName: string) => {\n const section = findDraftSection(draft, sectionName)\n if (!section) return undefined\n const key = normalizeName(itemName ?? '')\n const item = section.items.find((i) => normalizeName(i.name) === key)\n ?? section.items.find((i) => normalizeName(i.name).includes(key))\n return item ? { section, item } : undefined\n }\n const findItem = (name: string): { item: MenuItem; placement?: MenuPlacement } | undefined => {\n const key = normalizeName(name ?? '')\n const items = Array.from(deps.itemsById.values())\n const item = items.find((i) => normalizeName(i.name) === key)\n ?? items.find((i) => normalizeName(i.name).includes(key))\n if (!item) return undefined\n return { item, placement: deps.placements.find((p) => p.itemId === item.id) }\n }\n\n const tools: AgentSurfaceTool[] = [\n {\n tool: tool('menu.surface.create-section', 'createMenuSection',\n 'Cria uma seção no cardápio aberto (ex.: Sobremesas, Entradas).',\n { name: { type: 'string', description: 'Nome da seção' } }, ['name']),\n execute: async ({ name }: any) => {\n // Exact normalized match only — the fuzzy finder would swallow\n // \"Pizzas Especiais\" when asked to create \"Pizza\".\n const existing = deps.sections.find((s) => normalizeName(s.name) === normalizeName(String(name)))\n if (existing) return { ok: true, section: existing.name, alreadyExisted: true }\n const created = await deps.actions.createSection(String(name))\n return created ? { ok: true, section: created.name } : { error: 'section_not_created' }\n },\n },\n {\n tool: tool('menu.surface.rename-section', 'renameMenuSection',\n 'Renomeia uma seção do cardápio aberto.',\n { sectionName: { type: 'string' }, newName: { type: 'string' } }, ['sectionName', 'newName']),\n execute: async ({ sectionName, newName }: any) => {\n const section = findSection(sectionName)\n if (!section) return { error: 'section_not_found', sectionName }\n await deps.actions.renameSection(section.id, String(newName))\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.reorder-sections', 'reorderMenuSections',\n 'Reordena as seções do cardápio aberto. Passe TODOS os nomes na ordem desejada.',\n { orderedNames: { type: 'array', items: { type: 'string' }, description: 'Nomes das seções na nova ordem' } },\n ['orderedNames']),\n execute: async ({ orderedNames }: any) => {\n const ids = (orderedNames as string[]).map((name) => findSection(name)?.id).filter(Boolean) as string[]\n if (ids.length !== deps.sections.length) return { error: 'incomplete_order', expected: deps.sections.map((s) => s.name) }\n await deps.actions.reorderSections(ids)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.create-item', 'createMenuItem',\n 'Cria um item no cardápio aberto, dentro de uma seção.',\n {\n name: { type: 'string' },\n price: { type: 'number' },\n sectionName: { type: 'string', description: 'Seção onde entra' },\n description: { type: 'string' },\n }, ['name', 'price', 'sectionName']),\n execute: async ({ name, price, sectionName, description }: any) => {\n const section = findSection(sectionName)\n if (!section) return { error: 'section_not_found', sectionName, available: deps.sections.map((s) => s.name) }\n const created = await deps.actions.createItem(section.id, {\n name: String(name), price: Number(price) || 0, description: description ? String(description) : undefined,\n })\n return created ? { ok: true, item: created.name } : { error: 'item_not_created' }\n },\n },\n {\n tool: tool('menu.surface.update-item', 'updateMenuItem',\n 'Altera nome, preço, descrição ou disponibilidade de um item.',\n {\n itemName: { type: 'string' },\n price: { type: 'number' },\n name: { type: 'string', description: 'Novo nome' },\n description: { type: 'string' },\n status: { type: 'string', enum: ['available', 'sold_out', 'hidden'] },\n }, ['itemName']),\n execute: async ({ itemName, price, name, description, status }: any) => {\n const found = findItem(itemName)\n if (!found) return { error: 'item_not_found', itemName }\n if (price !== undefined || name !== undefined || description !== undefined) {\n await deps.actions.updateItem(found.item.id, {\n price: price !== undefined ? Number(price) : undefined,\n name: name !== undefined ? String(name) : undefined,\n description: description !== undefined ? String(description) : undefined,\n })\n }\n if (status) await deps.actions.setItemStatus(found.item.id, status as MenuItemStatus)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.move-item', 'moveMenuItem',\n 'Move um item para outra seção do cardápio aberto.',\n { itemName: { type: 'string' }, toSectionName: { type: 'string' } }, ['itemName', 'toSectionName']),\n execute: async ({ itemName, toSectionName }: any) => {\n const found = findItem(itemName)\n if (!found?.placement) return { error: 'item_not_in_menu', itemName }\n const section = findSection(toSectionName)\n if (!section) return { error: 'section_not_found', toSectionName }\n const target = deps.placements.filter((p) => p.sectionId === section.id).length\n await deps.actions.moveItem(found.placement.id, section.id, target)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.create-menu', 'createMenu',\n 'Cria outro cardápio (ex.: Executivo de segunda a sexta, Fim de semana). Pode copiar o cardápio aberto.',\n {\n name: { type: 'string' },\n copyFromOpenMenu: { type: 'boolean', description: 'Copiar seções e itens do cardápio aberto' },\n days: { type: 'array', items: { type: 'number' }, description: '0=domingo … 6=sábado' },\n start: { type: 'string', description: 'HH:MM' },\n end: { type: 'string', description: 'HH:MM' },\n }, ['name']),\n execute: async ({ name, copyFromOpenMenu, days, start, end }: any) => {\n if (copyFromOpenMenu && deps.menu) {\n const copy = await deps.actions.duplicateMenu(deps.menu.id, String(name))\n return { ok: true, menu: copy.name, note: 'A cópia começa desativada.' }\n }\n const created = await deps.actions.createMenu({ name: String(name), days, start, end })\n return { ok: true, menu: created.name }\n },\n },\n {\n tool: tool('menu.surface.stage-import', 'stageMenuImport',\n 'IMPORTA O CARDÁPIO (\"importa/cadastra esse cardápio\", foto de cardápio na conversa): você lê a foto ou o texto e passa o cardápio INTEIRO (todas as seções com seus itens) numa chamada só — vira um rascunho na tela para o usuário conferir. Seções com nome de uma seção existente recebem os itens nela (sem duplicar), e itens que já existem são pulados. Nada é gravado até commitMenuDraft. Nunca use tour/setup para importar cardápio.',\n {\n sections: {\n type: 'array',\n description: 'Todas as seções do cardápio lido',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Nome da seção (ex.: Pizzas, Bebidas)' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n price: { type: 'number', description: 'Número, sem moeda. 0 se a foto não mostra o preço.' },\n description: { type: 'string' },\n },\n required: ['name', 'price'],\n },\n },\n },\n required: ['name', 'items'],\n },\n },\n }, ['sections']),\n execute: async ({ sections }: any) => {\n if (!Array.isArray(sections) || sections.length === 0) return { error: 'empty_import' }\n const staged = deps.actions.stageDraft(sections)\n if (staged.sections === 0) {\n return {\n ok: true, staged,\n note: 'Nada novo para cadastrar — tudo que veio já existe no cardápio.',\n }\n }\n return {\n ok: true, staged,\n next: 'O rascunho está na tela. Leia para o usuário o que veio (seções, itens, preços zerados), resolva pendências e só chame commitMenuDraft depois que ele confirmar.',\n }\n },\n },\n {\n tool: tool('menu.surface.request-photos', 'requestMenuPhotos',\n 'Pede as fotos do cardápio ao usuário: aparece um botão grande aqui na conversa para tirar a foto ou escolher o arquivo. A foto enviada chega como anexo da próxima mensagem do usuário — você lê e chama stageMenuImport.',\n {}, [], 'read'),\n execute: async () => {\n deps.actions.requestPhotos()\n return { ok: true, asked: true, next: 'O botão já está na conversa. A foto chega como anexo da próxima mensagem: leia e chame stageMenuImport com o cardápio inteiro.' }\n },\n },\n {\n tool: tool('menu.surface.update-draft-item', 'updateMenuDraftItem',\n 'Corrige um item do RASCUNHO lido das fotos (preço, nome, descrição). Não grava nada ainda.',\n {\n sectionName: { type: 'string' },\n itemName: { type: 'string' },\n price: { type: 'number' },\n name: { type: 'string', description: 'Novo nome' },\n description: { type: 'string' },\n }, ['sectionName', 'itemName']),\n execute: async ({ sectionName, itemName, price, name, description }: any) => {\n const found = findDraft(deps.draft, sectionName, itemName)\n if (!found) return { error: 'draft_item_not_found', itemName }\n deps.actions.updateDraftItem(found.section.key, found.item.key, {\n price: price !== undefined ? Number(price) : undefined,\n name: name !== undefined ? String(name) : undefined,\n description: description !== undefined ? String(description) : undefined,\n })\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.remove-draft-item', 'removeMenuDraftItem',\n 'Tira um item do rascunho (leitura errada, item repetido).',\n { sectionName: { type: 'string' }, itemName: { type: 'string' } }, ['sectionName', 'itemName']),\n execute: async ({ sectionName, itemName }: any) => {\n const found = findDraft(deps.draft, sectionName, itemName)\n if (!found) return { error: 'draft_item_not_found', itemName }\n deps.actions.removeDraftItem(found.section.key, found.item.key)\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.update-draft-section', 'updateMenuDraftSection',\n 'Renomeia uma seção do rascunho, ou manda os itens dela para uma seção que já existe no cardápio.',\n {\n sectionName: { type: 'string' },\n newName: { type: 'string' },\n intoExistingSection: { type: 'string', description: 'Nome de uma seção existente para receber os itens' },\n }, ['sectionName']),\n execute: async ({ sectionName, newName, intoExistingSection }: any) => {\n const section = findDraftSection(deps.draft, sectionName)\n if (!section) return { error: 'draft_section_not_found', sectionName }\n const target = intoExistingSection ? findSection(intoExistingSection) : undefined\n if (intoExistingSection && !target) return { error: 'section_not_found', intoExistingSection }\n deps.actions.updateDraftSection(section.key, {\n name: newName ? String(newName) : undefined,\n targetSectionId: target?.id,\n })\n return { ok: true }\n },\n },\n {\n tool: tool('menu.surface.commit-draft', 'commitMenuDraft',\n 'Grava o rascunho no cardápio. Só chame depois que o usuário confirmar.',\n {}, []),\n execute: async () => {\n if (!deps.draft) return { error: 'no_draft' }\n const result = await deps.actions.commitDraft()\n return { ok: true, ...result }\n },\n },\n {\n tool: tool('menu.surface.discard-draft', 'discardMenuDraft',\n 'Descarta o rascunho lido das fotos sem gravar nada.',\n {}, []),\n execute: async () => {\n deps.actions.discardDraft()\n return { ok: true }\n },\n },\n ]\n\n return {\n id: 'menu.manager',\n pluginId: 'menu',\n // No role on purpose: whoever is answering is answering ABOUT this\n // screen, and a persona filter here is what silently removed these tools\n // from the catalogue while the instructions still arrived.\n instructions: INSTRUCTIONS,\n tools,\n describe: () => ({\n title: deps.menu?.name ?? 'Cardápio',\n state: {\n activeMenu: deps.menu?.name,\n allMenus: deps.menus.map((m) => m.name),\n photoImportAvailable: deps.hasExtractor,\n // The draft is the conversation's subject while it exists, so it goes\n // FIRST in the snapshot the model reads.\n draft: deps.draft ? {\n source: deps.draft.source,\n model: deps.draft.model,\n sections: deps.draft.sections.map((section) => ({\n name: section.name,\n appendingTo: section.targetSectionId\n ? deps.sections.find((s) => s.id === section.targetSectionId)?.name\n : undefined,\n items: section.items.map((item) => ({ name: item.name, price: item.price, description: item.description })),\n })),\n itemsMissingPrice: deps.draft.sections.flatMap((section) =>\n section.items.filter((item) => item.price === 0).map((item) => item.name)),\n } : undefined,\n sections: deps.sections.map((section) => ({\n name: section.name,\n items: deps.placements\n .filter((p) => p.sectionId === section.id)\n .map((p) => {\n const item = deps.itemsById.get(p.itemId)\n return item ? { name: item.name, price: p.priceOverride ?? item.price, status: item.status } : null\n })\n .filter(Boolean),\n })),\n },\n }),\n }\n }, [deps.menu, deps.menus, deps.sections, deps.placements, deps.itemsById, deps.draft, deps.hasExtractor, deps.actions])\n\n useAgentSurface(contribution)\n}\n","import React, { useState } from 'react'\nimport {\n ChevronDown, ChevronRight, Copy, GripVertical, ImageOff, Loader2, MoreHorizontal,\n Pencil, Plus, Star, Trash2, UtensilsCrossed, XCircle,\n} from 'lucide-react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n Button, Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger, Switch,\n} from '@fayz-ai/ui'\n\nimport type { MenuItem, MenuItemStatus, MenuPlacement, MenuSection } from '../types'\nimport { formatCurrency } from '../context'\nimport { describeAvailability, isAlwaysAvailable, isServingAt } from '../lib/availability'\n\n// ---------------------------------------------------------------------------\n// A section and the dishes in it. Both levels are draggable — the order on this\n// screen IS the order the customer reads, and typing numbers into a \"position\"\n// field is not how anyone thinks about a menu.\n// ---------------------------------------------------------------------------\n\nexport interface SectionHandlers {\n onRenameSection: (sectionId: string, name: string) => void\n onEditSection: (section: MenuSection) => void\n onDeleteSection: (section: MenuSection) => void\n onAddItem: (sectionId: string) => void\n onEditItem: (item: MenuItem, placement: MenuPlacement) => void\n onDuplicateItem: (item: MenuItem, sectionId: string) => void\n onRemoveFromMenu: (placement: MenuPlacement) => void\n onDeleteItem: (item: MenuItem) => void\n onToggleItem: (itemId: string, field: 'availableForPos' | 'availableForDelivery' | 'isFeatured', value: boolean) => void\n onSetItemStatus: (itemId: string, status: MenuItemStatus) => void\n onSetPlacementPrice: (placementId: string, price: number | undefined) => void\n}\n\nconst STATUS_STYLE: Record<MenuItemStatus, string> = {\n available: 'bg-success-soft text-success-soft-foreground',\n sold_out: 'bg-destructive-soft text-destructive-soft-foreground',\n hidden: 'bg-muted text-muted-foreground',\n}\n\n/** Click the price, type, Enter. The menu's most repeated edit by far. */\nfunction InlinePrice({ value, currency, muted, onSave }: {\n value: number\n currency: { code: string; locale: string; symbol: string }\n muted?: boolean\n onSave: (next: number) => void\n}) {\n const [editing, setEditing] = useState(false)\n const [draft, setDraft] = useState('')\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setDraft(String(value ?? 0)); setEditing(true) }}\n className={`rounded px-1.5 py-0.5 text-sm tabular-nums transition-colors hover:bg-muted ${muted ? 'text-muted-foreground' : 'font-medium'}`}\n >\n {formatCurrency(value ?? 0, currency)}\n </button>\n )\n }\n\n const commit = () => {\n const parsed = Number(draft.replace(',', '.'))\n setEditing(false)\n if (Number.isFinite(parsed) && parsed !== value) onSave(Math.max(0, parsed))\n }\n\n return (\n <input\n autoFocus\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit()\n if (e.key === 'Escape') setEditing(false)\n }}\n className=\"w-20 rounded border bg-card px-1.5 py-0.5 text-right text-sm tabular-nums focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n )\n}\n\nfunction ItemRow({ placement, item, currency, deliveryPricing, multiMenu, pending, handlers }: {\n placement: MenuPlacement\n item: MenuItem | undefined\n currency: { code: string; locale: string; symbol: string }\n deliveryPricing: boolean\n multiMenu: boolean\n /** Drawn, not yet written. Dimmed and inert rather than absent. */\n pending?: boolean\n handlers: SectionHandlers\n}) {\n const t = useTranslation()\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: placement.id,\n data: { type: 'item', sectionId: placement.sectionId },\n })\n\n if (!item) return null\n\n const price = placement.priceOverride ?? item.price\n const overridden = placement.priceOverride !== undefined && placement.priceOverride !== null\n\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={`group flex items-center gap-3 border-b px-3 py-2 last:border-0 ${isDragging ? 'opacity-40' : 'hover:bg-muted/20'} ${pending ? 'pointer-events-none opacity-60' : ''}`}\n >\n <button\n {...attributes}\n {...listeners}\n aria-label={t('menu.manager.dragItem')}\n className=\"cursor-grab text-muted-foreground/40 opacity-0 transition-opacity group-hover:opacity-100 active:cursor-grabbing\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted/40\">\n {item.imageUrl\n ? <img src={item.imageUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n : <ImageOff className=\"h-3.5 w-3.5 text-muted-foreground/40\" />}\n </div>\n\n <button\n type=\"button\"\n onClick={() => handlers.onEditItem(item, placement)}\n className=\"min-w-0 flex-1 text-left\"\n >\n <div className=\"flex items-center gap-1.5\">\n <span className={`truncate text-sm font-medium ${item.status === 'hidden' ? 'text-muted-foreground' : ''}`}>\n {item.name}\n </span>\n {item.isFeatured && <Star className=\"h-3 w-3 shrink-0 fill-warning text-warning\" />}\n {item.status !== 'available' && (\n <span className={`rounded-full px-1.5 py-0.5 text-[9px] font-medium ${STATUS_STYLE[item.status]}`}>\n {item.status === 'sold_out' ? t('menu.manager.soldOut') : t('menu.manager.hidden')}\n </span>\n )}\n </div>\n {item.description && <p className=\"truncate text-[11px] text-muted-foreground\">{item.description}</p>}\n </button>\n\n <div className=\"flex items-center gap-1\">\n <InlinePrice\n value={price}\n currency={currency}\n onSave={(next) => {\n // In a multi-menu world the number next to a dish belongs to THIS\n // menu, so typing it sets the override, not the product's price.\n if (multiMenu) handlers.onSetPlacementPrice(placement.id, next === item.price ? undefined : next)\n else handlers.onEditItem({ ...item, price: next }, placement)\n }}\n />\n {overridden && (\n <span title={t('menu.manager.overriddenHint')} className=\"text-[9px] font-medium uppercase text-primary\">\n {t('menu.manager.overridden')}\n </span>\n )}\n </div>\n\n {deliveryPricing && (\n <span className=\"hidden w-20 text-right text-xs text-muted-foreground sm:block\">\n {item.deliveryPrice != null ? formatCurrency(item.deliveryPrice, currency) : '—'}\n </span>\n )}\n\n <div className=\"hidden items-center gap-3 md:flex\">\n <Switch size=\"sm\" checked={item.availableForPos} onCheckedChange={(v) => handlers.onToggleItem(item.id, 'availableForPos', v)} label={t('menu.manager.pos')} />\n <Switch size=\"sm\" checked={item.availableForDelivery} onCheckedChange={(v) => handlers.onToggleItem(item.id, 'availableForDelivery', v)} label={t('menu.manager.delivery')} />\n </div>\n\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\" aria-label={t('menu.manager.itemActions')}>\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem onClick={() => handlers.onEditItem(item, placement)}>\n <Pencil className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.edit')}\n </DropdownItem>\n <DropdownItem onClick={() => handlers.onDuplicateItem(item, placement.sectionId)}>\n <Copy className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.duplicate')}\n </DropdownItem>\n <DropdownItem onClick={() => handlers.onSetItemStatus(item.id, item.status === 'sold_out' ? 'available' : 'sold_out')}>\n <XCircle className=\"mr-2 h-3.5 w-3.5\" />\n {item.status === 'sold_out' ? t('menu.manager.markAvailable') : t('menu.manager.markSoldOut')}\n </DropdownItem>\n <DropdownItem onClick={() => handlers.onToggleItem(item.id, 'isFeatured', !item.isFeatured)}>\n <Star className=\"mr-2 h-3.5 w-3.5\" />\n {item.isFeatured ? t('menu.manager.unfeature') : t('menu.manager.feature')}\n </DropdownItem>\n <DropdownSeparator />\n {/* Two different removals, and the difference matters: one takes the\n dish off this menu, the other deletes the dish. */}\n <DropdownItem onClick={() => handlers.onRemoveFromMenu(placement)}>\n <XCircle className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.removeFromMenu')}\n </DropdownItem>\n <DropdownItem className=\"text-destructive focus:text-destructive\" onClick={() => handlers.onDeleteItem(item)}>\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.deleteItem')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n </div>\n )\n}\n\nexport function SectionCard({\n section, placements, itemsById, currency, locale, deliveryPricing, multiMenu, pendingIds, handlers,\n}: {\n section: MenuSection\n placements: MenuPlacement[]\n itemsById: Map<string, MenuItem>\n currency: { code: string; locale: string; symbol: string }\n locale: string\n deliveryPricing: boolean\n multiMenu: boolean\n /** Ids of rows already on screen whose write has not landed. */\n pendingIds?: string[]\n handlers: SectionHandlers\n}) {\n const t = useTranslation()\n const [collapsed, setCollapsed] = useState(false)\n const [renaming, setRenaming] = useState(false)\n const [draft, setDraft] = useState(section.name)\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: section.id,\n data: { type: 'section' },\n })\n\n const scheduled = !isAlwaysAvailable(section.availability)\n const servingNow = isServingAt(section.availability)\n const pending = new Set(pendingIds ?? [])\n const sectionPending = pending.has(section.id)\n\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={`overflow-hidden rounded-card border bg-card shadow-sm ${isDragging ? 'opacity-50' : ''} ${sectionPending ? 'opacity-70' : ''}`}\n >\n <div className=\"flex items-center gap-2 border-b bg-muted/20 px-3 py-2\">\n <button\n {...attributes}\n {...listeners}\n aria-label={t('menu.manager.dragSection')}\n className=\"cursor-grab text-muted-foreground/50 hover:text-foreground active:cursor-grabbing\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={collapsed ? t('menu.manager.expand') : t('menu.manager.collapse')}\n >\n {collapsed ? <ChevronRight className=\"h-4 w-4\" /> : <ChevronDown className=\"h-4 w-4\" />}\n </button>\n\n {renaming ? (\n <input\n autoFocus\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => { setRenaming(false); if (draft.trim() && draft !== section.name) handlers.onRenameSection(section.id, draft.trim()) }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') { setDraft(section.name); setRenaming(false) }\n }}\n className=\"rounded border bg-card px-2 py-0.5 text-sm font-semibold focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => { setDraft(section.name); setRenaming(true) }}\n className=\"rounded px-1 py-0.5 text-sm font-semibold transition-colors hover:bg-muted\"\n >\n {section.name}\n </button>\n )}\n\n <span className=\"text-[11px] text-muted-foreground\">{t('menu.manager.itemsCount', { count: String(placements.length) })}</span>\n {sectionPending && <Loader2 className=\"h-3 w-3 animate-spin text-muted-foreground\" />}\n\n {scheduled && (\n <span\n className={`hidden rounded-full px-2 py-0.5 text-[10px] font-medium sm:inline ${servingNow ? 'bg-success-soft text-success-soft-foreground' : 'bg-muted text-muted-foreground'}`}\n title={describeAvailability(section.availability, locale, t('menu.schedule.always'))}\n >\n {describeAvailability(section.availability, locale, t('menu.schedule.always'))}\n </span>\n )}\n {!section.isActive && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t('menu.manager.sectionOff')}\n </span>\n )}\n\n <div className=\"ml-auto flex items-center gap-1\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => handlers.onAddItem(section.id)}>\n <Plus className=\"h-3.5 w-3.5\" /> {t('menu.manager.addItem')}\n </Button>\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\" aria-label={t('menu.manager.sectionActions')}>\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem onClick={() => handlers.onEditSection(section)}>\n <Pencil className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.editSection')}\n </DropdownItem>\n <DropdownSeparator />\n <DropdownItem className=\"text-destructive focus:text-destructive\" onClick={() => handlers.onDeleteSection(section)}>\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.deleteSection')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n </div>\n </div>\n\n {!collapsed && (\n placements.length === 0 ? (\n <button\n type=\"button\"\n onClick={() => handlers.onAddItem(section.id)}\n className=\"flex w-full flex-col items-center gap-1 border-2 border-dashed border-transparent py-6 text-center transition-colors hover:bg-muted/20\"\n >\n <UtensilsCrossed className=\"h-5 w-5 text-muted-foreground/40\" />\n <span className=\"text-xs text-muted-foreground\">{t('menu.manager.emptySection')}</span>\n </button>\n ) : (\n <div>\n {placements.map((placement) => (\n <ItemRow\n key={placement.id}\n placement={placement}\n item={itemsById.get(placement.itemId)}\n currency={currency}\n deliveryPricing={deliveryPricing}\n multiMenu={multiMenu}\n pending={pending.has(placement.id)}\n handlers={handlers}\n />\n ))}\n </div>\n )\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Menu Plugin — Pure TypeScript types\n//\n// The shape of the domain, in three levels: a MENU (there can be several — an\n// executive lunch, a weekend one, a delivery one), the SECTIONS inside it, and\n// the PLACEMENT of an item in a section. The item itself is a product: the same\n// dish can sit in three menus at three prices without being cloned.\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\nexport type MenuItemStatus = 'available' | 'sold_out' | 'hidden'\n\n/** Where a menu is served. A weekend menu that never reaches delivery is a\n * channel decision, not a separate menu. */\nexport type MenuChannel = 'pos' | 'delivery' | 'digital'\n\nexport const MENU_CHANNELS: MenuChannel[] = ['pos', 'delivery', 'digital']\n\n// ============================================================\n// AVAILABILITY\n// ============================================================\n\n/**\n * When a menu (or section) is being served. An empty rule means \"always\" —\n * the common case, and the one that must not cost the user a single click.\n *\n * `days` is 0=Sunday..6=Saturday, matching Date#getDay. A window whose `end` is\n * earlier than its `start` crosses midnight (22:00→02:00 is a late-night menu),\n * which is why the evaluation is not a naive string compare.\n */\nexport interface MenuAvailability {\n /** Weekdays it runs. Empty/undefined = every day. */\n days?: number[]\n /** \"HH:MM\", 24h. Both must be set for a window to apply. */\n start?: string\n end?: string\n /** Runs only inside this date range (ISO dates) — seasonal menus. */\n from?: string\n to?: string\n}\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** A menu — `plg_menu_menus`. */\nexport interface Menu {\n id: string\n name: string\n description?: string\n isActive: boolean\n sortOrder: number\n channels: MenuChannel[]\n availability: MenuAvailability\n /** Filled by the provider for the list header. */\n sectionCount?: number\n itemCount?: number\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\n/** A section inside a menu — `plg_menu_sections`. */\nexport interface MenuSection {\n id: string\n menuId: string\n name: string\n description?: string\n imageUrl?: string\n sortOrder: number\n isActive: boolean\n /** Sections can narrow the menu's window (sobremesas só à noite). */\n availability?: MenuAvailability\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\n/** An item's place in a section — `plg_menu_placements`. */\nexport interface MenuPlacement {\n id: string\n sectionId: string\n itemId: string\n sortOrder: number\n /** Price for THIS menu. Undefined = the item's own price. */\n priceOverride?: number\n isActive: boolean\n tenantId: string\n}\n\n/** Menu category — legacy flat grouping (public.categories, kind='menu_category').\n * Kept for providers that predate menus; the adapter maps it onto sections. */\nexport interface MenuCategory {\n id: string\n name: string\n parentId?: string\n icon?: string\n color?: string\n sortOrder: number\n isActive: boolean\n itemCount?: number\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\n/** Menu item — public.products + the plg_menu_items extension */\nexport interface MenuItem {\n id: string\n name: string\n description?: string\n price: number\n cost?: number\n currency: string\n sku?: string\n imageUrl?: string\n categoryId?: string\n categoryName?: string\n status: MenuItemStatus\n isActive: boolean\n // Extension fields\n prepTimeMinutes?: number\n allergens?: string[]\n dietaryTags?: string[]\n availableForPos: boolean\n availableForDelivery: boolean\n deliveryPrice?: number\n sortOrder: number\n isFeatured: boolean\n modifierGroupIds?: string[]\n metadata?: Record<string, unknown>\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface ModifierGroup {\n id: string\n name: string\n minSelections: number\n maxSelections: number\n isRequired: boolean\n sortOrder: number\n items: ModifierItem[]\n tenantId: string\n createdAt: string\n}\n\nexport interface ModifierItem {\n id: string\n groupId: string\n name: string\n priceAdjustment: number\n isActive: boolean\n sortOrder: number\n}\n\n// ============================================================\n// INPUT TYPES\n// ============================================================\n\nexport interface CreateMenuInput {\n name: string\n description?: string\n channels?: MenuChannel[]\n availability?: MenuAvailability\n isActive?: boolean\n sortOrder?: number\n}\n\nexport type UpdateMenuInput = Partial<CreateMenuInput>\n\nexport interface CreateSectionInput {\n menuId: string\n name: string\n description?: string\n imageUrl?: string\n sortOrder?: number\n isActive?: boolean\n availability?: MenuAvailability\n}\n\nexport type UpdateSectionInput = Partial<Omit<CreateSectionInput, 'menuId'>>\n\nexport interface PlaceItemInput {\n sectionId: string\n itemId: string\n sortOrder?: number\n priceOverride?: number\n isActive?: boolean\n}\n\nexport interface CreateMenuItemInput {\n name: string\n description?: string\n price: number\n cost?: number\n imageUrl?: string\n categoryId?: string\n status?: MenuItemStatus\n prepTimeMinutes?: number\n allergens?: string[]\n dietaryTags?: string[]\n availableForPos?: boolean\n availableForDelivery?: boolean\n deliveryPrice?: number\n isFeatured?: boolean\n modifierGroupIds?: string[]\n /** Drop it straight into a section — the create-and-place round trip. */\n sectionId?: string\n}\n\nexport interface UpdateMenuItemInput extends Omit<Partial<CreateMenuItemInput>, 'categoryId'> {\n /**\n * `null` CLEARS the category — which is how an item is unfiled, and the only\n * way to say it: `undefined` already means \"leave it alone\". Without this the\n * distinction is unsayable, and an item dragged out of a section had nowhere\n * to go.\n */\n categoryId?: string | null\n}\n\nexport interface CreateMenuCategoryInput {\n name: string\n parentId?: string\n icon?: string\n color?: string\n sortOrder?: number\n}\n\n// ============================================================\n// QUERY TYPES\n// ============================================================\n\nexport interface MenuItemQuery {\n categoryId?: string\n status?: MenuItemStatus | MenuItemStatus[]\n search?: string\n availableForPos?: boolean\n availableForDelivery?: boolean\n isFeatured?: boolean\n page?: number\n pageSize?: number\n}\n\nexport interface PaginatedResult<T> {\n data: T[]\n total: number\n}\n\n// ============================================================\n// AI IMPORT\n// ============================================================\n\n/** What the vision model gives back, after normalization. */\nexport interface ExtractedMenu {\n sections: ExtractedSection[]\n /** Which model read the photos — shown in the review header, and audited. */\n model?: string\n warnings?: string[]\n}\n\nexport interface ExtractedSection {\n name: string\n items: ExtractedItem[]\n}\n\nexport interface ExtractedItem {\n name: string\n price: number\n description?: string\n}\n\n/**\n * What was read off the photos, sitting ON the menu screen waiting to be\n * confirmed. Not a wizard's private state: the user edits these rows in place\n * with the same controls as a real item, and the assistant edits the same rows\n * through its tools — one draft, two hands.\n */\nexport interface MenuDraft {\n sections: DraftSection[]\n model?: string\n source: 'photo' | 'chat'\n}\n\nexport interface DraftSection {\n /** Addressing key for edits — never persisted. */\n key: string\n name: string\n /** Existing section to append to; undefined = create `name`. */\n targetSectionId?: string\n items: DraftItem[]\n}\n\nexport interface DraftItem {\n key: string\n name: string\n price: number\n description?: string\n}\n\n/** A reviewed extraction, ready to be written. */\nexport interface ImportPlan {\n menuId: string\n sections: Array<{\n /** Existing section to append to, or undefined to create `name`. */\n sectionId?: string\n name: string\n items: ExtractedItem[]\n }>\n}\n\nexport interface ImportResult {\n sectionsCreated: number\n itemsCreated: number\n failed: number\n}\n\n// ============================================================\n// AGGREGATION\n// ============================================================\n\nexport interface MenuSummary {\n totalItems: number\n availableItems: number\n soldOutItems: number\n hiddenItems: number\n categoryCount: number\n averagePrice: number\n featuredCount: number\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Switch, TimePicker } from '@fayz-ai/ui'\n\nimport type { MenuAvailability } from '../types'\nimport { isAlwaysAvailable, weekdayLabels } from '../lib/availability'\n\n// ---------------------------------------------------------------------------\n// When this menu is served.\n//\n// Starts closed on \"todo dia\", because most menus are, and a restaurant that\n// has no executive lunch should not have to look at a grid of weekdays. Turning\n// the switch on is what admits the complexity.\n// ---------------------------------------------------------------------------\n\nconst WEEKDAY_PRESETS: Array<{ id: string; days: number[] }> = [\n { id: 'menu.schedule.presetWeekdays', days: [1, 2, 3, 4, 5] },\n { id: 'menu.schedule.presetWeekend', days: [0, 6] },\n { id: 'menu.schedule.presetEveryDay', days: [0, 1, 2, 3, 4, 5, 6] },\n]\n\nexport function ScheduleEditor({ value, onChange, locale }: {\n value: MenuAvailability\n onChange: (next: MenuAvailability) => void\n locale: string\n}) {\n const t = useTranslation()\n const labels = weekdayLabels(locale)\n const restricted = !isAlwaysAvailable(value)\n const days = value.days ?? []\n\n const toggleDay = (day: number) => {\n const next = days.includes(day) ? days.filter((d) => d !== day) : [...days, day].sort((a, b) => a - b)\n onChange({ ...value, days: next })\n }\n\n return (\n <div className=\"space-y-3\">\n <Switch\n size=\"md\"\n checked={restricted}\n onCheckedChange={(checked) => onChange(checked ? { days: [1, 2, 3, 4, 5], start: '11:30', end: '15:00' } : {})}\n label={\n <span>\n <span className=\"text-sm font-medium\">{t('menu.schedule.restrict')}</span>\n <span className=\"block text-[11px] text-muted-foreground\">{t('menu.schedule.restrictHint')}</span>\n </span>\n }\n />\n\n {restricted && (\n <div className=\"space-y-3 rounded-xl border p-3\">\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.schedule.days')}\n </label>\n <div className=\"mt-1.5 flex flex-wrap gap-1.5\">\n {labels.map((label, day) => (\n <button\n key={day}\n type=\"button\"\n onClick={() => toggleDay(day)}\n className={`rounded-full px-2.5 py-1 text-xs font-medium capitalize transition-colors ${\n days.includes(day)\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n }`}\n >\n {label}\n </button>\n ))}\n </div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {WEEKDAY_PRESETS.map((preset) => (\n <button\n key={preset.id}\n type=\"button\"\n onClick={() => onChange({ ...value, days: preset.days })}\n className=\"text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n {t(preset.id)}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-end gap-3\">\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.schedule.from')}\n </label>\n <TimePicker value={value.start ?? '11:00'} onChange={(next) => onChange({ ...value, start: next })} />\n </div>\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.schedule.to')}\n </label>\n <TimePicker value={value.end ?? '15:00'} onChange={(next) => onChange({ ...value, end: next })} />\n </div>\n </div>\n {/* Said out loud because it is the one rule people get wrong when they\n type a bar's hours. */}\n <p className=\"text-[11px] text-muted-foreground\">{t('menu.schedule.overnightHint')}</p>\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Input, SheetBody, SheetFooter, Switch } from '@fayz-ai/ui'\nimport { RightRailPage } from '@fayz-ai/admin'\n\nimport type { Menu, MenuAvailability, MenuChannel } from '../types'\nimport { MENU_CHANNELS } from '../types'\nimport { ScheduleEditor } from './ScheduleEditor'\n\n// The menu's own card — in the right rail, beside the sections it governs.\n// Name, where it is served, when, and whether it is on air.\n\nconst CHANNEL_LABEL: Record<MenuChannel, string> = {\n pos: 'menu.channel.pos',\n delivery: 'menu.channel.delivery',\n digital: 'menu.channel.digital',\n}\n\nexport function MenuRailPage({ open, menu, locale, onClose, onSubmit }: {\n open: boolean\n /** Undefined = creating. */\n menu?: Menu\n locale: string\n onClose: () => void\n onSubmit: (values: {\n name: string\n description?: string\n channels: MenuChannel[]\n availability: MenuAvailability\n isActive: boolean\n }) => Promise<void>\n}) {\n const t = useTranslation()\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [channels, setChannels] = useState<MenuChannel[]>([...MENU_CHANNELS])\n const [availability, setAvailability] = useState<MenuAvailability>({})\n const [isActive, setIsActive] = useState(true)\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n if (!open) return\n setName(menu?.name ?? '')\n setDescription(menu?.description ?? '')\n setChannels(menu?.channels ?? [...MENU_CHANNELS])\n setAvailability(menu?.availability ?? {})\n setIsActive(menu?.isActive ?? true)\n setSaving(false)\n }, [open, menu])\n\n const toggleChannel = (channel: MenuChannel) => {\n setChannels((current) =>\n current.includes(channel) ? current.filter((c) => c !== channel) : [...current, channel])\n }\n\n const submit = async () => {\n if (!name.trim() || saving) return\n setSaving(true)\n try {\n await onSubmit({ name: name.trim(), description: description.trim() || undefined, channels, availability, isActive })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <RightRailPage\n title={menu ? t('menu.menuDialog.editTitle') : t('menu.menuDialog.newTitle')}\n open={open}\n onClose={onClose}\n width=\"max-w-md\"\n >\n <SheetBody className=\"space-y-4\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('menu.menuDialog.name')}</label>\n <Input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('menu.menuDialog.namePlaceholder')}\n onKeyDown={(e) => { if (e.key === 'Enter') void submit() }}\n />\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('menu.menuDialog.description')}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('menu.menuDialog.descriptionPlaceholder')}\n />\n </div>\n\n <div>\n <label className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t('menu.menuDialog.channels')}\n </label>\n <div className=\"mt-1.5 flex flex-wrap gap-1.5\">\n {MENU_CHANNELS.map((channel) => (\n <button\n key={channel}\n type=\"button\"\n onClick={() => toggleChannel(channel)}\n className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${\n channels.includes(channel)\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n }`}\n >\n {t(CHANNEL_LABEL[channel])}\n </button>\n ))}\n </div>\n </div>\n\n <ScheduleEditor value={availability} onChange={setAvailability} locale={locale} />\n\n <Switch\n size=\"md\"\n checked={isActive}\n onCheckedChange={setIsActive}\n label={\n <span>\n <span className=\"text-sm font-medium\">{t('menu.menuDialog.active')}</span>\n <span className=\"block text-[11px] text-muted-foreground\">{t('menu.menuDialog.activeHint')}</span>\n </span>\n }\n />\n </SheetBody>\n <SheetFooter className=\"justify-end\">\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>{t('menu.form.cancel')}</Button>\n <Button onClick={() => void submit()} disabled={!name.trim() || saving}>\n {saving ? t('menu.form.saving') : t('menu.form.save')}\n </Button>\n </SheetFooter>\n </RightRailPage>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n Button, CurrencyInput, ImageDrop, Input, SegmentedControl, SheetBody, SheetFooter, Switch,\n} from '@fayz-ai/ui'\nimport { RightRailPage } from '@fayz-ai/admin'\n\nimport type { MenuItem, MenuItemStatus, MenuSection } from '../types'\n\n// ---------------------------------------------------------------------------\n// The item, edited in the right rail — the same column the rest of the app\n// opens records in. A modal would darken the menu behind it, and this form's\n// whole job is to be filled in while looking at the section it belongs to.\n//\n// Same page for \"novo\" and \"editar\": a menu is edited far more often than it is\n// created, and two forms drift apart.\n// ---------------------------------------------------------------------------\n\nexport interface ItemFormValues {\n name: string\n description?: string\n price: number\n cost?: number\n deliveryPrice?: number\n prepTimeMinutes?: number\n imageUrl?: string\n status: MenuItemStatus\n availableForPos: boolean\n availableForDelivery: boolean\n isFeatured: boolean\n sectionId: string\n /** Price for THIS menu only. Undefined = use the item's price. */\n priceOverride?: number\n}\n\nexport function ItemRailPage({\n open, item, sections, sectionId, currency, deliveryPricing, multiMenu,\n priceOverride, onClose, onSubmit, onUploadImage,\n}: {\n open: boolean\n item?: MenuItem\n sections: MenuSection[]\n sectionId: string\n currency: { code: string; locale: string; symbol: string }\n deliveryPricing: boolean\n multiMenu: boolean\n priceOverride?: number\n onClose: () => void\n onSubmit: (values: ItemFormValues) => Promise<void>\n onUploadImage?: (file: File) => Promise<string | null>\n}) {\n const t = useTranslation()\n const [values, setValues] = useState<ItemFormValues>({\n name: '', price: 0, status: 'available',\n availableForPos: true, availableForDelivery: true, isFeatured: false, sectionId,\n })\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n if (!open) return\n setValues({\n name: item?.name ?? '',\n description: item?.description ?? '',\n price: item?.price ?? 0,\n cost: item?.cost,\n deliveryPrice: item?.deliveryPrice,\n prepTimeMinutes: item?.prepTimeMinutes,\n imageUrl: item?.imageUrl,\n status: item?.status ?? 'available',\n availableForPos: item?.availableForPos ?? true,\n availableForDelivery: item?.availableForDelivery ?? true,\n isFeatured: item?.isFeatured ?? false,\n sectionId,\n priceOverride,\n })\n setSaving(false)\n }, [open, item, sectionId, priceOverride])\n\n const patch = (next: Partial<ItemFormValues>) => setValues((current) => ({ ...current, ...next }))\n\n const submit = async () => {\n if (!values.name.trim() || saving) return\n setSaving(true)\n try {\n await onSubmit({ ...values, name: values.name.trim() })\n onClose()\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <RightRailPage\n title={item ? t('menu.itemForm.editTitle') : t('menu.itemForm.newTitle')}\n open={open}\n onClose={onClose}\n width=\"max-w-md\"\n >\n {/* One column, three questions in order: what the dish IS, what it\n COSTS, and where it SHOWS. The rail is ~380px wide — the two- and\n three-column grids this form was born with (it started life as a wide\n modal) pushed the photo and the price field off both edges. */}\n <SheetBody className=\"space-y-6\">\n <Group>\n <div className=\"flex items-start gap-3\">\n <div className=\"w-20 shrink-0\">\n <ImageDrop\n shape=\"square\"\n value={values.imageUrl}\n onUpload={onUploadImage ? async (file) => (await onUploadImage(file)) ?? '' : undefined}\n onChange={(url) => patch({ imageUrl: url })}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-medium text-foreground\">{t('menu.itemForm.photo')}</p>\n <p className=\"mt-0.5 text-[11px] leading-snug text-muted-foreground\">\n {t('menu.itemForm.photoHint')}\n </p>\n </div>\n </div>\n\n <Field label={t('menu.itemForm.name')}>\n <Input\n autoFocus\n value={values.name}\n onChange={(e) => patch({ name: e.target.value })}\n placeholder={t('menu.itemForm.namePlaceholder')}\n />\n </Field>\n\n <Field label={t('menu.itemForm.description')}>\n <Input\n value={values.description ?? ''}\n onChange={(e) => patch({ description: e.target.value })}\n placeholder={t('menu.itemForm.descriptionPlaceholder')}\n />\n </Field>\n </Group>\n\n <Group title={t('menu.itemForm.pricingGroup')}>\n {/* Two money fields fit side by side at this width; a third did not. */}\n <div className=\"grid grid-cols-2 gap-3\">\n <CurrencyInput\n label={t('menu.itemForm.price')}\n value={values.price}\n onChange={(price) => patch({ price })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n <CurrencyInput\n label={t('menu.itemForm.cost')}\n value={values.cost ?? 0}\n onChange={(cost) => patch({ cost })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n </div>\n\n {deliveryPricing && (\n <CurrencyInput\n label={t('menu.itemForm.deliveryPrice')}\n value={values.deliveryPrice ?? 0}\n onChange={(deliveryPrice) => patch({ deliveryPrice })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n )}\n\n {/* Per-menu price: only where more than one menu can disagree about it. */}\n {multiMenu && (\n <div className=\"rounded-xl border bg-muted/20 p-3\">\n <p className=\"text-xs font-medium text-foreground\">{t('menu.itemForm.priceOverride')}</p>\n <p className=\"mt-0.5 text-[11px] leading-snug text-muted-foreground\">\n {t('menu.itemForm.priceOverrideHint')}\n </p>\n <div className=\"mt-2 space-y-1.5\">\n <CurrencyInput\n value={values.priceOverride ?? 0}\n onChange={(next) => patch({ priceOverride: next })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n {values.priceOverride !== undefined && (\n <button\n type=\"button\"\n onClick={() => patch({ priceOverride: undefined })}\n className=\"text-[11px] text-muted-foreground underline-offset-2 transition-colors hover:text-foreground hover:underline\"\n >\n {t('menu.itemForm.clearOverride')}\n </button>\n )}\n </div>\n </div>\n )}\n </Group>\n\n <Group title={t('menu.itemForm.menuGroup')}>\n <Field label={t('menu.itemForm.section')}>\n <select\n value={values.sectionId}\n onChange={(e) => patch({ sectionId: e.target.value })}\n className=\"h-9 w-full rounded-md border border-input bg-background px-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n {sections.map((section) => (\n <option key={section.id} value={section.id}>{section.name}</option>\n ))}\n </select>\n </Field>\n\n <Field label={t('menu.itemForm.status')}>\n <SegmentedControl\n className=\"w-full\"\n value={values.status}\n onChange={(status) => patch({ status: status as MenuItemStatus })}\n options={[\n { value: 'available', label: t('menu.manager.available') },\n { value: 'sold_out', label: t('menu.manager.soldOut') },\n { value: 'hidden', label: t('menu.manager.hidden') },\n ]}\n />\n </Field>\n\n <Field label={t('menu.itemForm.prepTime')}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n value={values.prepTimeMinutes ?? ''}\n onChange={(e) => patch({ prepTimeMinutes: e.target.value ? Number(e.target.value) : undefined })}\n placeholder=\"0\"\n />\n </Field>\n\n {/* Rows, not a wrapped strip: three switches side by side broke into\n a ragged two-and-one at this width, and a switch whose label wraps\n stops reading as one control. */}\n <div className=\"divide-y rounded-xl border\">\n <ToggleRow\n label={t('menu.manager.pos')}\n hint={t('menu.itemForm.posHint')}\n checked={values.availableForPos}\n onChange={(v) => patch({ availableForPos: v })}\n />\n <ToggleRow\n label={t('menu.manager.delivery')}\n hint={t('menu.itemForm.deliveryHint')}\n checked={values.availableForDelivery}\n onChange={(v) => patch({ availableForDelivery: v })}\n />\n <ToggleRow\n label={t('menu.manager.featured')}\n hint={t('menu.itemForm.featuredHint')}\n checked={values.isFeatured}\n onChange={(v) => patch({ isFeatured: v })}\n />\n </div>\n </Group>\n </SheetBody>\n <SheetFooter className=\"justify-end\">\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>{t('menu.form.cancel')}</Button>\n <Button onClick={() => void submit()} disabled={!values.name.trim() || saving}>\n {saving ? t('menu.form.saving') : t('menu.form.save')}\n </Button>\n </SheetFooter>\n </RightRailPage>\n )\n}\n\n/** A label and its control, with the one gap this form uses between them. */\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">{label}</label>\n {children}\n </div>\n )\n}\n\n/** A run of fields that answer the same question, under one quiet heading. */\nfunction Group({ title, children }: { title?: string; children: React.ReactNode }) {\n return (\n <section className=\"space-y-3\">\n {title && (\n <h3 className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground\">{title}</h3>\n )}\n {children}\n </section>\n )\n}\n\n/** Where the dish shows up. The whole row is the target, not just the switch. */\nfunction ToggleRow({ label, hint, checked, onChange }: {\n label: string\n hint?: string\n checked: boolean\n onChange: (value: boolean) => void\n}) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onChange(!checked)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onChange(!checked)\n }\n }}\n className=\"flex min-h-11 cursor-pointer items-center gap-3 px-3 py-2 transition-colors hover:bg-muted/30\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm\">{label}</p>\n {hint && <p className=\"text-[11px] leading-snug text-muted-foreground\">{hint}</p>}\n </div>\n <Switch size=\"md\" checked={checked} onCheckedChange={onChange} aria-label={label} />\n </div>\n )\n}\n","import React from 'react'\nimport { Sparkles, Trash2, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, DraftCommitBar } from '@fayz-ai/ui'\n\nimport type { DraftItem, DraftSection, MenuDraft, MenuSection } from '../types'\n\n// ---------------------------------------------------------------------------\n// What the assistant read, sitting in the menu it will become.\n//\n// Dashed, not modal: the user sees the new dishes exactly where they will land,\n// next to the ones already there, and fixes a price by clicking it. The same\n// rows are what the assistant edits when the user says \"o pudim é 22\".\n// ---------------------------------------------------------------------------\n\nfunction DraftRow({ item, onChange, onRemove }: {\n item: DraftItem\n onChange: (patch: Partial<DraftItem>) => void\n onRemove: () => void\n}) {\n const t = useTranslation()\n return (\n <div className=\"flex items-center gap-2 border-b border-dashed px-3 py-1.5 last:border-0\">\n <input\n value={item.name}\n onChange={(e) => onChange({ name: e.target.value })}\n className=\"min-w-0 flex-1 rounded border border-transparent bg-transparent px-1 py-0.5 text-sm hover:border-border focus:border-border focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <input\n value={item.description ?? ''}\n onChange={(e) => onChange({ description: e.target.value })}\n placeholder={t('menu.itemForm.description')}\n className=\"hidden min-w-0 flex-1 rounded border border-transparent bg-transparent px-1 py-0.5 text-[11px] text-muted-foreground hover:border-border focus:border-border focus:outline-none focus:ring-2 focus:ring-ring sm:block\"\n />\n <input\n value={item.price}\n inputMode=\"decimal\"\n onChange={(e) => onChange({ price: Number(e.target.value.replace(',', '.')) || 0 })}\n className={`w-20 rounded border bg-card px-1.5 py-0.5 text-right text-sm tabular-nums focus:outline-none focus:ring-2 focus:ring-ring ${item.price === 0 ? 'border-warning text-warning' : ''}`}\n />\n <button\n onClick={onRemove}\n className=\"rounded p-1 text-muted-foreground hover:text-destructive\"\n aria-label={t('menu.import.dropItem')}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n\nexport function DraftSectionCard({ section, sections, onPatchSection, onRemoveSection, onPatchItem, onRemoveItem }: {\n section: DraftSection\n sections: MenuSection[]\n onPatchSection: (patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>) => void\n onRemoveSection: () => void\n onPatchItem: (itemKey: string, patch: Partial<DraftItem>) => void\n onRemoveItem: (itemKey: string) => void\n}) {\n const t = useTranslation()\n\n return (\n <div className=\"overflow-hidden rounded-card border-2 border-dashed border-primary/40 bg-primary/[0.03]\">\n <div className=\"flex flex-wrap items-center gap-2 border-b border-dashed border-primary/30 px-3 py-2\">\n <Sparkles className=\"h-3.5 w-3.5 text-primary\" />\n <input\n value={section.name}\n onChange={(e) => onPatchSection({ name: e.target.value })}\n className=\"rounded border border-transparent bg-transparent px-1 py-0.5 text-sm font-semibold hover:border-border focus:border-border focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <span className=\"text-[11px] text-muted-foreground\">\n {t('menu.manager.itemsCount', { count: String(section.items.length) })}\n </span>\n {/* The destination is a DECISION, so it reads as a labeled control on\n the decision side of the header — floating next to the name it\n looked like a lost button. */}\n <label className=\"ml-auto flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n {t('menu.import.destination')}\n <select\n value={section.targetSectionId ?? ''}\n onChange={(e) => onPatchSection({ targetSectionId: e.target.value || undefined })}\n className=\"h-7 rounded-md border bg-card px-2 text-xs text-foreground\"\n >\n <option value=\"\">{t('menu.import.createSection')}</option>\n {sections.map((s) => (\n <option key={s.id} value={s.id}>{s.name}</option>\n ))}\n </select>\n </label>\n <button\n onClick={onRemoveSection}\n className=\"rounded p-1 text-muted-foreground hover:text-destructive\"\n aria-label={t('menu.import.dropSection')}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n {/* Column labels, aligned to the same widths the rows use — a table the\n eye can scan, not three anonymous inputs per line. */}\n <div className=\"flex items-center gap-2 border-b border-dashed border-primary/20 px-3 py-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n <span className=\"min-w-0 flex-1 px-1\">{t('menu.itemForm.name')}</span>\n <span className=\"hidden min-w-0 flex-1 px-1 sm:block\">{t('menu.itemForm.description')}</span>\n <span className=\"w-20 px-1.5 text-right\">{t('menu.itemForm.price')}</span>\n <span aria-hidden className=\"w-[22px]\" />\n </div>\n <div>\n {section.items.map((item) => (\n <DraftRow\n key={item.key}\n item={item}\n onChange={(patch) => onPatchItem(item.key, patch)}\n onRemove={() => onRemoveItem(item.key)}\n />\n ))}\n </div>\n </div>\n )\n}\n\n/** The one decision bar for the whole draft — the shared primitive, wearing\n * the menu's words. */\nexport function DraftBar({ draft, saving, onCommit, onDiscard }: {\n draft: MenuDraft\n saving: boolean\n onCommit: () => void\n onDiscard: () => void\n}) {\n const t = useTranslation()\n const items = draft.sections.reduce((count, section) => count + section.items.length, 0)\n const missingPrice = draft.sections.reduce(\n (count, section) => count + section.items.filter((item) => item.price === 0).length, 0)\n\n return (\n <DraftCommitBar\n open\n icon={Sparkles}\n title={t('menu.import.draftCount', { items: String(items), sections: String(draft.sections.length) })}\n hint={missingPrice > 0\n ? t('menu.import.draftMissingPrice', { count: String(missingPrice) })\n : t('menu.import.draftHint')}\n discardLabel={t('menu.import.discard')}\n onDiscard={onDiscard}\n commitLabel={t('menu.import.commit', { count: String(items) })}\n onCommit={onCommit}\n busy={saving}\n />\n )\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Modal, ModalBody, ModalContent, ModalHeader, ModalTitle } from '@fayz-ai/ui'\n\nimport type { Menu, MenuItem, MenuPlacement, MenuSection } from '../types'\nimport { formatCurrency } from '../context'\nimport { describeAvailability, isServingAt } from '../lib/availability'\n\n// ---------------------------------------------------------------------------\n// The menu as the customer meets it: no toggles, no handles, no ids. Hidden\n// items and switched-off sections are gone rather than greyed — this is the\n// answer to \"o que aparece pra quem pede\", and a struck-through row would be\n// answering a different question.\n// ---------------------------------------------------------------------------\n\nexport function MenuPreview({ open, menu, sections, placements, itemsById, currency, locale, onClose }: {\n open: boolean\n menu?: Menu\n sections: MenuSection[]\n placements: MenuPlacement[]\n itemsById: Map<string, MenuItem>\n currency: { code: string; locale: string; symbol: string }\n locale: string\n onClose: () => void\n}) {\n const t = useTranslation()\n const serving = menu ? isServingAt(menu.availability) : true\n\n return (\n <Modal open={open} onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalContent size=\"xl\">\n <ModalHeader>\n <ModalTitle>{menu?.name ?? t('menu.preview.title')}</ModalTitle>\n <p className=\"text-xs text-muted-foreground\">\n {menu ? describeAvailability(menu.availability, locale, t('menu.schedule.always')) : ''}\n {menu && !serving && ` · ${t('menu.preview.notServingNow')}`}\n </p>\n </ModalHeader>\n <ModalBody className=\"space-y-6 py-2\">\n {sections\n .filter((section) => section.isActive)\n .map((section) => {\n const rows = placements\n .filter((p) => p.sectionId === section.id && p.isActive)\n .map((p) => ({ placement: p, item: itemsById.get(p.itemId) }))\n .filter((row) => row.item && row.item.status !== 'hidden')\n if (rows.length === 0) return null\n return (\n <section key={section.id}>\n <h3 className=\"border-b pb-1 text-sm font-semibold uppercase tracking-wider text-muted-foreground\">\n {section.name}\n </h3>\n {section.description && <p className=\"mt-1 text-xs text-muted-foreground\">{section.description}</p>}\n <ul className=\"mt-2 space-y-2\">\n {rows.map(({ placement, item }) => (\n <li key={placement.id} className=\"flex items-baseline gap-3\">\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-sm font-medium\">{item!.name}</span>\n {item!.status === 'sold_out' && (\n <span className=\"ml-2 text-[10px] uppercase text-destructive\">{t('menu.manager.soldOut')}</span>\n )}\n {item!.description && (\n <p className=\"text-xs text-muted-foreground\">{item!.description}</p>\n )}\n </div>\n {/* The dotted leader is what makes a list of dishes read\n as a menu instead of a table. */}\n <span className=\"hidden flex-1 translate-y-[-3px] border-b border-dotted border-muted-foreground/30 sm:block\" />\n <span className=\"text-sm font-medium tabular-nums\">\n {formatCurrency(placement.priceOverride ?? item!.price, currency)}\n </span>\n </li>\n ))}\n </ul>\n </section>\n )\n })}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { Copy, Eye, MoreVertical, Pencil, Plus, Power, Search, Sparkles, Trash2, UtensilsCrossed } from 'lucide-react'\nimport {\n DndContext, DragOverlay, PointerSensor, closestCenter, useSensor, useSensors,\n type DragEndEvent, type DragStartEvent,\n} from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, ConfirmDialog, Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger, toast, PageTabs } from '@fayz-ai/ui'\nimport { Hint, PageHeaderActions } from '@fayz-ai/ui'\nimport { askAI, requestChatUpload, useChatStore, PageActions } from '@fayz-ai/admin'\n\nimport { useMenuConfig, useMenuStore } from '../context'\nimport type { MenuItem, MenuPlacement, MenuSection, MenuItemStatus } from '../types'\nimport { describeAvailability, isAlwaysAvailable, isServingAt } from '../lib/availability'\nimport { useMenuAgentSurface } from '../lib/agent-surface'\nimport { SectionCard, type SectionHandlers } from '../components/SectionCard'\nimport { MenuRailPage } from '../components/MenuRailPage'\nimport { ItemRailPage, type ItemFormValues } from '../components/ItemRailPage'\nimport { DraftBar, DraftSectionCard } from '../components/DraftSectionCard'\nimport { MenuPreview } from '../components/MenuPreview'\n\n// ---------------------------------------------------------------------------\n// The menu, whole.\n//\n// Menus across the top (executivo, fim de semana), sections down the page, and\n// the dishes inside them — dragged, priced and switched in place. The AI import\n// is not a side door: it drops its reading INTO this screen as a draft, and the\n// assistant edits the same rows the user does.\n// ---------------------------------------------------------------------------\n\nexport function MenuManagerView() {\n const t = useTranslation()\n const { currency, modules } = useMenuConfig()\n\n const multiMenu = useMenuStore((s) => s.multiMenu)\n const menus = useMenuStore((s) => s.menus)\n const menusLoading = useMenuStore((s) => s.menusLoading)\n const activeMenuId = useMenuStore((s) => s.activeMenuId)\n const sections = useMenuStore((s) => s.sections)\n const placements = useMenuStore((s) => s.placements)\n const menuLoading = useMenuStore((s) => s.menuLoading)\n const menuItems = useMenuStore((s) => s.menuItems)\n const extracting = useMenuStore((s) => s.extracting)\n const draft = useMenuStore((s) => s.draft)\n const pendingIds = useMenuStore((s) => s.pendingIds)\n\n const fetchMenus = useMenuStore((s) => s.fetchMenus)\n const fetchMenuItems = useMenuStore((s) => s.fetchMenuItems)\n const openMenu = useMenuStore((s) => s.openMenu)\n const createMenu = useMenuStore((s) => s.createMenu)\n const updateMenu = useMenuStore((s) => s.updateMenu)\n const deleteMenu = useMenuStore((s) => s.deleteMenu)\n const duplicateMenu = useMenuStore((s) => s.duplicateMenu)\n const createSection = useMenuStore((s) => s.createSection)\n const updateSection = useMenuStore((s) => s.updateSection)\n const deleteSection = useMenuStore((s) => s.deleteSection)\n const reorderSections = useMenuStore((s) => s.reorderSections)\n const addItemToSection = useMenuStore((s) => s.addItemToSection)\n const removePlacement = useMenuStore((s) => s.removePlacement)\n const setPlacementPrice = useMenuStore((s) => s.setPlacementPrice)\n const reorderPlacements = useMenuStore((s) => s.reorderPlacements)\n const movePlacement = useMenuStore((s) => s.movePlacement)\n const updateMenuItem = useMenuStore((s) => s.updateMenuItem)\n const deleteMenuItem = useMenuStore((s) => s.deleteMenuItem)\n const duplicateMenuItem = useMenuStore((s) => s.duplicateMenuItem)\n const setItemStatus = useMenuStore((s) => s.setItemStatus)\n const toggleAvailability = useMenuStore((s) => s.toggleAvailability)\n const uploadImage = useMenuStore((s) => s.uploadImage)\n const updateDraftItem = useMenuStore((s) => s.updateDraftItem)\n const removeDraftItem = useMenuStore((s) => s.removeDraftItem)\n const updateDraftSection = useMenuStore((s) => s.updateDraftSection)\n const removeDraftSection = useMenuStore((s) => s.removeDraftSection)\n const discardDraft = useMenuStore((s) => s.discardDraft)\n const commitDraft = useMenuStore((s) => s.commitDraft)\n const stageDraft = useMenuStore((s) => s.stageDraft)\n\n const [search, setSearch] = useState('')\n const [menuEditor, setMenuEditor] = useState<{ open: boolean; editing?: boolean }>({ open: false })\n const [itemEditor, setItemEditor] = useState<{ open: boolean; item?: MenuItem; sectionId: string; placement?: MenuPlacement }>({ open: false, sectionId: '' })\n const [previewOpen, setPreviewOpen] = useState(false)\n const [confirm, setConfirm] = useState<{ kind: 'section' | 'item' | 'menu'; id: string; name: string } | null>(null)\n const [dragging, setDragging] = useState<string | null>(null)\n const [committing, setCommitting] = useState(false)\n\n // The photos go into the CONVERSATION, not to a dedicated extraction\n // backend: the card is just a friendly way to ask for the attachment. The\n // assistant reads the image like any chat attachment and stages what it saw\n // via stageMenuImport — one pipeline, no side door to break separately.\n const readPhotos = async (files: File[]) => {\n useChatStore.getState().queuePrompt(t('menu.import.photoSentPrompt'), files)\n }\n\n /** Puts the upload button in the conversation. */\n const askForPhotos = () => requestChatUpload({\n label: t('menu.import.uploadCta'),\n description: t('menu.import.uploadHint'),\n accept: 'image/*',\n multiple: true,\n capture: 'environment',\n onFiles: readPhotos,\n })\n\n // \"Inserir com IA\" hands the job to the ASSISTANT — it narrates and conducts\n // the review. The button itself is what RAISES the upload card, though: an\n // affordance the user was just promised must not depend on a model choosing\n // to call a tool. The tool stays for when the ask arrives in words instead.\n const startAiImport = () => {\n askForPhotos()\n askAI({\n prompt: t('menu.import.askPrompt'),\n hint: t('menu.import.askHint'),\n intro: {\n role: 'operations',\n persona: t('menu.import.askPersona'),\n pitch: t('menu.import.askPitch'),\n description: t('menu.import.askDescription'),\n suggestions: [\n { label: t('menu.import.askSuggestion.0') },\n { label: t('menu.import.askSuggestion.1') },\n { label: t('menu.import.askSuggestion.2') },\n ],\n },\n })\n }\n\n useEffect(() => {\n void fetchMenus()\n void fetchMenuItems({})\n }, [])\n\n const activeMenu = menus.find((m) => m.id === activeMenuId)\n const itemsById = useMemo(() => new Map(menuItems.map((item) => [item.id, item])), [menuItems])\n\n // Search narrows the ITEMS but keeps their sections, so what is left still\n // reads as a menu rather than a flat list of hits.\n const visible = useMemo(() => {\n const term = search.trim().toLowerCase()\n const matches = (placement: MenuPlacement) => {\n if (!term) return true\n const item = itemsById.get(placement.itemId)\n return !!item && (item.name.toLowerCase().includes(term) || (item.description ?? '').toLowerCase().includes(term))\n }\n const bySection = new Map<string, MenuPlacement[]>()\n for (const placement of [...placements].sort((a, b) => a.sortOrder - b.sortOrder)) {\n if (!matches(placement)) continue\n const list = bySection.get(placement.sectionId) ?? []\n list.push(placement)\n bySection.set(placement.sectionId, list)\n }\n const ordered = [...sections].sort((a, b) => a.sortOrder - b.sortOrder)\n return {\n sections: term ? ordered.filter((s) => (bySection.get(s.id)?.length ?? 0) > 0) : ordered,\n bySection,\n }\n }, [sections, placements, itemsById, search])\n\n const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 5 } }))\n\n const handleDragEnd = (event: DragEndEvent) => {\n setDragging(null)\n const { active, over } = event\n if (!over || active.id === over.id) return\n const type = active.data.current?.type\n\n if (type === 'section') {\n const ids = visible.sections.map((s) => s.id)\n const from = ids.indexOf(String(active.id))\n const to = ids.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n const next = [...ids]\n next.splice(to, 0, next.splice(from, 1)[0])\n void reorderSections(next)\n return\n }\n\n if (type === 'item') {\n const fromSection = String(active.data.current?.sectionId ?? '')\n const overType = over.data.current?.type\n const toSection = overType === 'section' ? String(over.id) : String(over.data.current?.sectionId ?? '')\n if (!toSection) return\n\n const target = (visible.bySection.get(toSection) ?? []).map((p) => p.id)\n if (fromSection === toSection) {\n const from = target.indexOf(String(active.id))\n const to = target.indexOf(String(over.id))\n if (from < 0 || to < 0) return\n const next = [...target]\n next.splice(to, 0, next.splice(from, 1)[0])\n void reorderPlacements(toSection, next)\n } else {\n const index = overType === 'section' ? target.length : Math.max(0, target.indexOf(String(over.id)))\n void movePlacement(String(active.id), toSection, index)\n }\n }\n }\n\n const handlers: SectionHandlers = {\n onRenameSection: (sectionId, name) => void updateSection(sectionId, { name }),\n onEditSection: (section) => void updateSection(section.id, { isActive: !section.isActive }),\n onDeleteSection: (section) => setConfirm({ kind: 'section', id: section.id, name: section.name }),\n onAddItem: (sectionId) => setItemEditor({ open: true, sectionId }),\n onEditItem: (item, placement) => setItemEditor({ open: true, item, sectionId: placement.sectionId, placement }),\n onDuplicateItem: (item, sectionId) => void duplicateMenuItem(item.id, sectionId),\n onRemoveFromMenu: (placement) => void removePlacement(placement.id),\n onDeleteItem: (item) => setConfirm({ kind: 'item', id: item.id, name: item.name }),\n onToggleItem: (itemId, field, value) => void toggleAvailability(itemId, field, value),\n onSetItemStatus: (itemId, status) => void setItemStatus(itemId, status as MenuItemStatus),\n onSetPlacementPrice: (placementId, price) => void setPlacementPrice(placementId, price),\n }\n\n // What the assistant can see and do on this screen — including driving the\n // photo import and fixing the draft it produced.\n useMenuAgentSurface({\n menu: activeMenu,\n menus,\n sections,\n placements,\n itemsById,\n draft,\n // The chat reads the photo now; the ask-for-photo card never depends on a\n // dedicated extraction backend.\n hasExtractor: true,\n actions: {\n createSection: (name) => createSection(name),\n renameSection: (sectionId, name) => updateSection(sectionId, { name }),\n reorderSections,\n createItem: (sectionId, input) => addItemToSection(sectionId, input),\n updateItem: (itemId, patch) => updateMenuItem(itemId, patch),\n setItemStatus,\n moveItem: movePlacement,\n createMenu: ({ name, days, start, end }) => createMenu({\n name,\n availability: days || start || end ? { days, start, end } : {},\n }),\n duplicateMenu,\n requestPhotos: askForPhotos,\n stageDraft,\n updateDraftItem,\n removeDraftItem,\n updateDraftSection,\n removeDraftSection,\n commitDraft: async () => {\n const result = await commitDraft()\n return result\n },\n discardDraft,\n },\n })\n\n const submitItem = async (values: ItemFormValues) => {\n const { sectionId, priceOverride, ...rest } = values\n if (itemEditor.item) {\n await updateMenuItem(itemEditor.item.id, rest)\n if (itemEditor.placement) {\n if (priceOverride !== itemEditor.placement.priceOverride) {\n await setPlacementPrice(itemEditor.placement.id, priceOverride)\n }\n if (sectionId !== itemEditor.placement.sectionId) {\n await movePlacement(itemEditor.placement.id, sectionId, 0)\n }\n }\n } else {\n await addItemToSection(sectionId, rest)\n }\n }\n\n const confirmDelete = async () => {\n if (!confirm) return\n if (confirm.kind === 'section') await deleteSection(confirm.id)\n if (confirm.kind === 'item') await deleteMenuItem(confirm.id)\n if (confirm.kind === 'menu') await deleteMenu(confirm.id)\n setConfirm(null)\n }\n\n const scheduleLabel = activeMenu\n ? describeAvailability(activeMenu.availability, currency.locale, t('menu.schedule.always'))\n : ''\n\n // O menu de ações PERTENCE a um cardápio, então mora na aba dele — no lugar\n // da bolinha de \"servindo agora\", que já é dita pela etiqueta abaixo quando\n // o cardápio tem horário. Solto à direita da faixa, o \"⋯\" não dizia de qual\n // dos cardápios ele falava.\n const menuActions = (menu: { id: string; name: string; isActive?: boolean }) => (\n <Dropdown>\n <DropdownTrigger asChild>\n <Hint label={t('menu.manager.menuActions')}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n // Do tamanho do texto da aba, não de um botão de barra: ele mora\n // DENTRO da aba, e um alvo de 24px com anel próprio brigava com o\n // sublinhado logo abaixo.\n className=\"-mr-1 h-5 w-5 rounded-full text-muted-foreground hover:text-foreground focus-visible:ring-1 focus-visible:ring-offset-0\"\n aria-label={`${t('menu.manager.menuActions')} — ${menu.name}`}\n >\n <MoreVertical className=\"h-3.5 w-3.5\" />\n </Button>\n </Hint>\n </DropdownTrigger>\n <DropdownContent align=\"start\">\n <DropdownItem onClick={() => setMenuEditor({ open: true, editing: true })}>\n <Pencil className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.editMenu')}\n </DropdownItem>\n <DropdownItem onClick={() => void duplicateMenu(menu.id, `${menu.name} (cópia)`)}>\n <Copy className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.duplicateMenu')}\n </DropdownItem>\n <DropdownItem onClick={() => void updateMenu(menu.id, { isActive: !menu.isActive })}>\n <Power className=\"mr-2 h-3.5 w-3.5\" />\n {menu.isActive ? t('menu.manager.deactivateMenu') : t('menu.manager.activateMenu')}\n </DropdownItem>\n <DropdownItem onClick={() => setPreviewOpen(true)}>\n <Eye className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.preview.action')}\n </DropdownItem>\n <DropdownSeparator />\n <DropdownItem\n className=\"text-destructive focus:text-destructive\"\n onClick={() => setConfirm({ kind: 'menu', id: menu.id, name: menu.name })}\n >\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" /> {t('menu.manager.deleteMenu')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Um botão, um caret — o contrato de ações do produto inteiro.\n \n Eram TRÊS de peso igual no cabeçalho (\"Inserir com IA\", \"Ver como\n fica\", \"Novo cardápio\"), que é o desenho que o resto do app abandonou:\n três botões lado a lado não dizem qual é o próximo passo. Inserir com\n IA é outra MANEIRA de cadastrar, então mora sob o botão de cadastrar,\n como as entradas de estoque moram sob \"Novo Produto\". E \"Ver como\n fica\" não é criar nada: desceu para \"Ações do cardápio\", junto com\n editar, duplicar e ativar. */}\n <PageHeaderActions>\n <PageActions\n actions={[\n ...(multiMenu ? [{\n id: 'new-menu',\n label: t('menu.manager.newMenu'),\n icon: Plus,\n intent: 'primary' as const,\n creates: true,\n onSelect: () => setMenuEditor({ open: true }),\n }] : []),\n {\n id: 'ai-import',\n label: t('menu.import.action'),\n description: t('menu.import.actionDesc'),\n icon: Sparkles,\n // Sem vários cardápios não há botão de criar para se esconder\n // atrás: aqui ELA é a maneira de cadastrar.\n intent: (multiMenu ? 'secondary' : 'primary') as 'secondary' | 'primary',\n creates: true,\n onSelect: () => startAiImport(),\n },\n ]}\n />\n </PageHeaderActions>\n\n {/* The menus themselves. A restaurant has more than one, and which one is\n open is the first thing this screen has to say.\n \n Drawn as the page's tab band, not as a strip of rounded chips. It is\n the same question every other screen asks at the top — which face of\n this module am I looking at — and it was the fifth different answer in\n the product (underline tabs in Financeiro, a grey pill in Pedidos, a\n bordered pair in Cozinha, bare tabs in Reservas, chips here). The\n serving dot survives as the tab's `badge`; the item count as `count`.\n \n `multiMenu` still gates it: one cardápio needs no chooser. */}\n {multiMenu && (\n <PageTabs\n className=\"mb-0\"\n aria-label={t('menu.manager.newMenu')}\n value={activeMenuId ?? menus[0]?.id ?? ''}\n onChange={(id) => void openMenu(id)}\n tabs={menus.map((menu) => {\n const isOpen = menu.id === (activeMenuId ?? menus[0]?.id)\n return {\n value: menu.id,\n label: menu.name,\n count: menu.itemCount ?? 0,\n // A bolinha continua marcando os cardápios que NÃO estão abertos\n // — é ali que ela responde uma pergunta (\"qual está servindo\n // agora?\"). No aberto, o lugar é do menu de ações dele.\n badge: isOpen ? undefined : (\n <span\n aria-hidden\n className={`ml-0.5 h-1.5 w-1.5 rounded-full ${\n menu.isActive && isServingAt(menu.availability) ? 'bg-success' : 'bg-muted-foreground/30'\n }`}\n />\n ),\n // Cardápio desligado: a aba inteira enfraquece. A etiqueta\n // \"desativado\" abaixo dizia isso em texto, longe do nome do\n // cardápio a que se referia.\n dim: !menu.isActive,\n trailing: isOpen ? menuActions(menu) : undefined,\n }\n })}\n />\n )}\n\n {/* Só o HORÁRIO fica aqui, e só quando existe um. Desativado não é mais\n uma etiqueta ao lado: é a aba do cardápio inteira, fraca — dito no\n lugar em que o nome dele está. */}\n {activeMenu && !isAlwaysAvailable(activeMenu.availability) && (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <span>{scheduleLabel}</span>\n <span className={`rounded-full px-2 py-0.5 text-[10px] font-medium ${\n isServingAt(activeMenu.availability) ? 'bg-success-soft text-success-soft-foreground' : 'bg-muted'\n }`}>\n {isServingAt(activeMenu.availability) ? t('menu.manager.servingNow') : t('menu.manager.notServing')}\n </span>\n </div>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative min-w-[12rem] flex-1\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('menu.manager.search')}\n className=\"w-full rounded-input border bg-card py-1.5 pl-8 pr-3 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => void createSection(t('menu.manager.newSectionName'))}>\n <Plus className=\"h-3.5 w-3.5\" /> {t('menu.manager.addSection')}\n </Button>\n </div>\n\n {menusLoading || menuLoading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-24 animate-pulse rounded-card border bg-muted/20\" />\n ))}\n </div>\n ) : visible.sections.length === 0 && !draft ? (\n <div className=\"flex flex-col items-center gap-2 rounded-card border-2 border-dashed py-14 text-center\">\n <UtensilsCrossed className=\"h-8 w-8 text-muted-foreground/30\" />\n <p className=\"text-base font-semibold\">{t('menu.manager.empty')}</p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">{t('menu.manager.emptyHint')}</p>\n <div className=\"mt-2 flex gap-2\">\n <Button variant=\"outline\" onClick={() => void createSection(t('menu.manager.newSectionName'))}>\n <Plus className=\"h-3.5 w-3.5\" /> {t('menu.manager.addSection')}\n </Button>\n <Button onClick={startAiImport}>\n <Sparkles className=\"h-3.5 w-3.5\" /> {t('menu.import.action')}\n </Button>\n </div>\n </div>\n ) : (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={(event: DragStartEvent) => setDragging(String(event.active.id))}\n onDragEnd={handleDragEnd}\n onDragCancel={() => setDragging(null)}\n >\n <SortableContext items={visible.sections.map((s) => s.id)} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-3\">\n {visible.sections.map((section) => {\n const rows = visible.bySection.get(section.id) ?? []\n return (\n <SortableContext key={section.id} items={rows.map((p) => p.id)} strategy={verticalListSortingStrategy}>\n <SectionCard\n section={section}\n placements={rows}\n itemsById={itemsById}\n currency={currency}\n locale={currency.locale}\n deliveryPricing={modules.deliveryPricing}\n multiMenu={multiMenu}\n pendingIds={pendingIds}\n handlers={handlers}\n />\n </SortableContext>\n )\n })}\n </div>\n </SortableContext>\n <DragOverlay>{dragging ? <div className=\"h-10 rounded-card border bg-card shadow-lg\" /> : null}</DragOverlay>\n </DndContext>\n )}\n\n {draft && (\n <div className=\"space-y-3 pt-1\">\n {draft.sections.map((section) => (\n <DraftSectionCard\n key={section.key}\n section={section}\n sections={sections}\n onPatchSection={(patch) => updateDraftSection(section.key, patch)}\n onRemoveSection={() => removeDraftSection(section.key)}\n onPatchItem={(itemKey, patch) => updateDraftItem(section.key, itemKey, patch)}\n onRemoveItem={(itemKey) => removeDraftItem(section.key, itemKey)}\n />\n ))}\n <DraftBar\n draft={draft}\n saving={committing}\n onDiscard={discardDraft}\n onCommit={async () => {\n setCommitting(true)\n try {\n const result = await commitDraft()\n toast.success(t('menu.import.done', {\n items: String(result.itemsCreated), sections: String(result.sectionsCreated),\n }))\n } finally {\n setCommitting(false)\n }\n }}\n />\n </div>\n )}\n\n <MenuRailPage\n open={menuEditor.open}\n menu={menuEditor.editing ? activeMenu : undefined}\n locale={currency.locale}\n onClose={() => setMenuEditor({ open: false })}\n onSubmit={async (values) => {\n if (menuEditor.editing && activeMenu) await updateMenu(activeMenu.id, values)\n else await createMenu(values)\n }}\n />\n\n <ItemRailPage\n open={itemEditor.open}\n item={itemEditor.item}\n sections={sections}\n sectionId={itemEditor.sectionId}\n currency={currency}\n deliveryPricing={modules.deliveryPricing}\n multiMenu={multiMenu}\n priceOverride={itemEditor.placement?.priceOverride}\n onClose={() => setItemEditor({ open: false, sectionId: '' })}\n onSubmit={submitItem}\n onUploadImage={(file) => uploadImage(file, 'item')}\n />\n\n <MenuPreview\n open={previewOpen}\n menu={activeMenu}\n sections={sections}\n placements={placements}\n itemsById={itemsById}\n currency={currency}\n locale={currency.locale}\n onClose={() => setPreviewOpen(false)}\n />\n\n <ConfirmDialog\n open={!!confirm}\n variant=\"destructive\"\n title={confirm ? t(`menu.confirm.${confirm.kind}Title`, { name: confirm.name }) : ''}\n description={confirm ? t(`menu.confirm.${confirm.kind}Desc`) : undefined}\n confirmLabel={t('menu.confirm.delete')}\n cancelLabel={t('menu.form.cancel')}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setConfirm(null)}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { MenuContextProvider, type ResolvedMenuConfig } from '../context'\nimport type { MenuDataProvider } from '../data/types'\nimport type { MenuUIState } from '../store'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\n\nimport { MenuManagerView } from './MenuManagerView'\n\nexport function MenuPage({ config, provider, store, registries }: {\n config: ResolvedMenuConfig\n provider: MenuDataProvider\n store: StoreApi<MenuUIState>\n registries?: PluginRegistryDef[]\n}) {\n return (\n <MenuContextProvider config={config} provider={provider} store={store}>\n <MenuManagerView />\n </MenuContextProvider>\n )\n}\n"]}
@@ -0,0 +1,14 @@
1
+ // src/lib/extract-parse.ts
2
+ function normalizeName(value) {
3
+ return value.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/\s+/g, " ").trim();
4
+ }
5
+ function countExtracted(menu) {
6
+ return {
7
+ sections: menu.sections.length,
8
+ items: menu.sections.reduce((count, section) => count + section.items.length, 0)
9
+ };
10
+ }
11
+
12
+ export { countExtracted, normalizeName };
13
+ //# sourceMappingURL=chunk-FVDAVCK4.js.map
14
+ //# sourceMappingURL=chunk-FVDAVCK4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/extract-parse.ts"],"names":[],"mappings":";AAgCO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAA,CACJ,SAAA,CAAU,KAAK,CAAA,CACf,QAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,WAAA,EAAY,CACZ,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,IAAA,EAAK;AACV;AAoDO,SAAS,eAAe,IAAA,EAA0D;AACvF,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAK,QAAA,CAAS,MAAA;AAAA,IACxB,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,KAAA,EAAO,OAAA,KAAY,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,CAAC;AAAA,GACjF;AACF","file":"chunk-FVDAVCK4.js","sourcesContent":["import type { ExtractedMenu, ExtractedSection, ExtractedItem } from '../types'\n\n// ---------------------------------------------------------------------------\n// Turning what a model read off a photo into something safe to write.\n//\n// The model is asked for JSON, and it mostly obliges — but a menu photographed\n// in four overlapping slices comes back with the same dish three times, prices\n// as \"R$ 29,90\", and the odd section with no items. None of that should reach\n// the review screen, let alone the database.\n// ---------------------------------------------------------------------------\n\n/** \"R$ 29,90\" → 29.9 · \"12\" → 12 · \"\" → 0. Never NaN. */\nexport function parsePrice(raw: unknown): number {\n if (typeof raw === 'number') return Number.isFinite(raw) ? Math.max(0, raw) : 0\n if (typeof raw !== 'string') return 0\n const cleaned = raw\n .replace(/[^\\d.,-]/g, '')\n .trim()\n if (!cleaned) return 0\n // pt-BR writes 1.234,56 and en-US writes 1,234.56 — the LAST separator is the\n // decimal one in both, which is enough to tell them apart.\n const lastComma = cleaned.lastIndexOf(',')\n const lastDot = cleaned.lastIndexOf('.')\n let normalized = cleaned\n if (lastComma > lastDot) normalized = cleaned.replace(/\\./g, '').replace(',', '.')\n else if (lastDot > lastComma) normalized = cleaned.replace(/,/g, '')\n else normalized = cleaned.replace(',', '.')\n const value = Number.parseFloat(normalized)\n return Number.isFinite(value) ? Math.max(0, value) : 0\n}\n\n/** Accent- and case-insensitive key for deduplication. */\nexport function normalizeName(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\n/**\n * Normalize + merge a raw model payload.\n * Sections with the same name merge; items merge on name+price, so the same\n * dish appearing in two overlapping photo slices lands once.\n */\nexport function normalizeExtraction(payload: unknown, fallbackSection = 'Geral'): ExtractedMenu {\n const raw = (payload ?? {}) as Record<string, unknown>\n const rawSections = (raw.sections ?? raw.categories ?? []) as unknown[]\n const merged = new Map<string, { name: string; items: Map<string, ExtractedItem> }>()\n\n for (const entry of Array.isArray(rawSections) ? rawSections : []) {\n const section = (entry ?? {}) as Record<string, unknown>\n const name = String(section.name ?? '').trim() || fallbackSection\n const key = normalizeName(name)\n if (!merged.has(key)) merged.set(key, { name, items: new Map() })\n const target = merged.get(key)!\n\n const rawItems = (section.items ?? []) as unknown[]\n for (const itemEntry of Array.isArray(rawItems) ? rawItems : []) {\n const item = (itemEntry ?? {}) as Record<string, unknown>\n const itemName = String(item.name ?? '').trim()\n if (!itemName) continue\n const price = parsePrice(item.price)\n const description = String(item.description ?? '').trim()\n const itemKey = `${normalizeName(itemName)}|${price.toFixed(2)}`\n if (target.items.has(itemKey)) continue\n target.items.set(itemKey, {\n name: itemName,\n price,\n description: description || undefined,\n })\n }\n }\n\n const sections: ExtractedSection[] = Array.from(merged.values())\n .map((section) => ({ name: section.name, items: Array.from(section.items.values()) }))\n .filter((section) => section.items.length > 0)\n\n const warnings: string[] = []\n const priceless = sections.reduce((count, s) => count + s.items.filter((i) => i.price === 0).length, 0)\n if (priceless > 0) warnings.push(`price_missing:${priceless}`)\n if (sections.length === 0) warnings.push('nothing_found')\n\n return {\n sections,\n model: typeof raw.model === 'string' ? raw.model : undefined,\n warnings,\n }\n}\n\nexport function countExtracted(menu: ExtractedMenu): { sections: number; items: number } {\n return {\n sections: menu.sections.length,\n items: menu.sections.reduce((count, section) => count + section.items.length, 0),\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DraftSectionCard.d.ts","sourceRoot":"","sources":["../../src/components/DraftSectionCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AA8C/E,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;IAClH,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,KAAK,IAAI,CAAA;IACxF,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;IACjE,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC,qBAmDA;AAED;wBACwB;AACxB,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAC/D,KAAK,EAAE,SAAS,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,qBAqBA"}
1
+ {"version":3,"file":"DraftSectionCard.d.ts","sourceRoot":"","sources":["../../src/components/DraftSectionCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AA8C/E,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;IAClH,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,KAAK,IAAI,CAAA;IACxF,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;IACjE,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC,qBA2DA;AAED;wBACwB;AACxB,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAC/D,KAAK,EAAE,SAAS,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,qBAqBA"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core';
2
2
  import type { EntityLookup } from '@fayz-ai/admin';
3
3
  import type { MenuDataProvider } from './data/types';
4
+ import { createSupabaseMenuProvider } from './data/supabase';
5
+ export { createSupabaseMenuProvider };
4
6
  export interface MenuPluginLabels {
5
7
  pageTitle: string;
6
8
  menuManager: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAiBpD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAmBD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,eAAe,CAAC,EAAE,OAAO,CAAA;KAC1B,CAAA;IACD,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B,cAAc,CAAC,EAAE,YAAY,CAAA;CAC9B;AAqBD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAqI5E;AAED,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAGnD,mBAAmB,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAK5D,OAAO,EAAE,0BAA0B,EAAE,CAAA;AAerC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAmBD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,eAAe,CAAC,EAAE,OAAO,CAAA;KAC1B,CAAA;IACD,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B,cAAc,CAAC,EAAE,YAAY,CAAA;CAC9B;AAqBD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAqI5E;AAED,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAGnD,mBAAmB,SAAS,CAAA"}