@fayz-ai/plugin-menu 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/MenuPage-2LLWRJGN.js +1785 -0
  2. package/dist/MenuPage-2LLWRJGN.js.map +1 -0
  3. package/dist/chunk-C6W53TML.js +65 -0
  4. package/dist/chunk-C6W53TML.js.map +1 -0
  5. package/dist/components/DraftSectionCard.d.ts +18 -0
  6. package/dist/components/DraftSectionCard.d.ts.map +1 -0
  7. package/dist/components/ItemRailPage.d.ts +36 -0
  8. package/dist/components/ItemRailPage.d.ts.map +1 -0
  9. package/dist/components/MenuPreview.d.ts +17 -0
  10. package/dist/components/MenuPreview.d.ts.map +1 -0
  11. package/dist/components/MenuRailPage.d.ts +17 -0
  12. package/dist/components/MenuRailPage.d.ts.map +1 -0
  13. package/dist/components/ScheduleEditor.d.ts +8 -0
  14. package/dist/components/ScheduleEditor.d.ts.map +1 -0
  15. package/dist/components/SectionCard.d.ts +32 -0
  16. package/dist/components/SectionCard.d.ts.map +1 -0
  17. package/dist/data/legacy-adapter.d.ts +4 -0
  18. package/dist/data/legacy-adapter.d.ts.map +1 -0
  19. package/dist/data/mock.d.ts +2 -2
  20. package/dist/data/mock.d.ts.map +1 -1
  21. package/dist/data/registries.d.ts.map +1 -1
  22. package/dist/data/supabase.d.ts +7 -0
  23. package/dist/data/supabase.d.ts.map +1 -0
  24. package/dist/data/tables.d.ts +17 -0
  25. package/dist/data/tables.d.ts.map +1 -0
  26. package/dist/data/types.d.ts +36 -2
  27. package/dist/data/types.d.ts.map +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2150 -356
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/agent-surface.d.ts +46 -0
  32. package/dist/lib/agent-surface.d.ts.map +1 -0
  33. package/dist/lib/availability.d.ts +16 -0
  34. package/dist/lib/availability.d.ts.map +1 -0
  35. package/dist/lib/extract-parse.d.ts +16 -0
  36. package/dist/lib/extract-parse.d.ts.map +1 -0
  37. package/dist/lib/extract-transport.d.ts +10 -0
  38. package/dist/lib/extract-transport.d.ts.map +1 -0
  39. package/dist/lib/images.d.ts +7 -0
  40. package/dist/lib/images.d.ts.map +1 -0
  41. package/dist/locales/en.d.ts.map +1 -1
  42. package/dist/locales/pt-BR.d.ts.map +1 -1
  43. package/dist/migrations/index.d.ts +8 -0
  44. package/dist/migrations/index.d.ts.map +1 -0
  45. package/dist/store.d.ts +46 -10
  46. package/dist/store.d.ts.map +1 -1
  47. package/dist/types.d.ts +151 -2
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/views/MenuManagerView.d.ts.map +1 -1
  50. package/package.json +12 -6
  51. package/dist/MenuPage-ZNKKQJKD.js +0 -523
  52. package/dist/MenuPage-ZNKKQJKD.js.map +0 -1
@@ -0,0 +1,46 @@
1
+ import type { DraftItem, DraftSection, ImportResult, Menu, MenuDraft, MenuItem, MenuItemStatus, MenuPlacement, MenuSection } from '../types';
2
+ export interface MenuAgentSurfaceDeps {
3
+ menu?: Menu;
4
+ menus: Menu[];
5
+ sections: MenuSection[];
6
+ placements: MenuPlacement[];
7
+ itemsById: Map<string, MenuItem>;
8
+ /** What the photos produced, still uncommitted. Both hands edit it. */
9
+ draft: MenuDraft | null;
10
+ /** False when no extraction backend is configured — the tool then says so. */
11
+ hasExtractor: boolean;
12
+ actions: {
13
+ createSection: (name: string) => Promise<MenuSection | null>;
14
+ renameSection: (sectionId: string, name: string) => Promise<void> | void;
15
+ reorderSections: (orderedIds: string[]) => Promise<void>;
16
+ createItem: (sectionId: string, input: {
17
+ name: string;
18
+ price: number;
19
+ description?: string;
20
+ }) => Promise<MenuItem | null>;
21
+ updateItem: (itemId: string, patch: {
22
+ name?: string;
23
+ price?: number;
24
+ description?: string;
25
+ }) => Promise<void>;
26
+ setItemStatus: (itemId: string, status: MenuItemStatus) => Promise<void>;
27
+ moveItem: (placementId: string, toSectionId: string, toIndex: number) => Promise<void>;
28
+ createMenu: (input: {
29
+ name: string;
30
+ days?: number[];
31
+ start?: string;
32
+ end?: string;
33
+ }) => Promise<Menu>;
34
+ duplicateMenu: (menuId: string, name: string) => Promise<Menu>;
35
+ /** Puts the upload button in the conversation and reads what comes back. */
36
+ requestPhotos: () => void;
37
+ updateDraftItem: (sectionKey: string, itemKey: string, patch: Partial<DraftItem>) => void;
38
+ removeDraftItem: (sectionKey: string, itemKey: string) => void;
39
+ updateDraftSection: (sectionKey: string, patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>) => void;
40
+ removeDraftSection: (sectionKey: string) => void;
41
+ commitDraft: () => Promise<ImportResult>;
42
+ discardDraft: () => void;
43
+ };
44
+ }
45
+ export declare function useMenuAgentSurface(deps: MenuAgentSurfaceDeps): void;
46
+ //# sourceMappingURL=agent-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-surface.d.ts","sourceRoot":"","sources":["../../src/lib/agent-surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { MenuAvailability } from '../types';
2
+ /** "11:30" → 690. Returns null for anything that is not HH:MM. */
3
+ export declare function parseTime(value: string | undefined): number | null;
4
+ export declare function isAlwaysAvailable(availability: MenuAvailability | undefined): boolean;
5
+ /** Does the rule allow the given moment? */
6
+ export declare function isServingAt(availability: MenuAvailability | undefined, at?: Date): boolean;
7
+ /** Minutes until the rule next opens — used to say "abre às 11:30". */
8
+ export declare function minutesUntilOpen(availability: MenuAvailability | undefined, at?: Date): number | null;
9
+ /** Short weekday names in the app's locale, Sunday first (matches Date#getDay). */
10
+ export declare function weekdayLabels(locale: string): string[];
11
+ /**
12
+ * One line describing when it runs: "Seg a Sex · 11:30–15:00".
13
+ * `alwaysLabel` is passed in because this package has no i18n of its own here.
14
+ */
15
+ export declare function describeAvailability(availability: MenuAvailability | undefined, locale: string, alwaysLabel: string): string;
16
+ //# sourceMappingURL=availability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"availability.d.ts","sourceRoot":"","sources":["../../src/lib/availability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAahD,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQlE;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAIrF;AAED,4CAA4C;AAC5C,wBAAgB,WAAW,CAAC,YAAY,EAAE,gBAAgB,GAAG,SAAS,EAAE,EAAE,GAAE,IAAiB,GAAG,OAAO,CAyBtG;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,GAAG,SAAS,EAAE,EAAE,GAAE,IAAiB,GAAG,MAAM,GAAG,IAAI,CAMjH;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,gBAAgB,GAAG,SAAS,EAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,MAAM,CAqBR"}
@@ -0,0 +1,16 @@
1
+ import type { ExtractedMenu } from '../types';
2
+ /** "R$ 29,90" → 29.9 · "12" → 12 · "" → 0. Never NaN. */
3
+ export declare function parsePrice(raw: unknown): number;
4
+ /** Accent- and case-insensitive key for deduplication. */
5
+ export declare function normalizeName(value: string): string;
6
+ /**
7
+ * Normalize + merge a raw model payload.
8
+ * Sections with the same name merge; items merge on name+price, so the same
9
+ * dish appearing in two overlapping photo slices lands once.
10
+ */
11
+ export declare function normalizeExtraction(payload: unknown, fallbackSection?: string): ExtractedMenu;
12
+ export declare function countExtracted(menu: ExtractedMenu): {
13
+ sections: number;
14
+ items: number;
15
+ };
16
+ //# sourceMappingURL=extract-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-parse.d.ts","sourceRoot":"","sources":["../../src/lib/extract-parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,UAAU,CAAA;AAW9E,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAiB/C;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,SAAU,GAAG,aAAa,CA2C9F;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKvF"}
@@ -0,0 +1,10 @@
1
+ import type { ExtractedMenu } from '../types';
2
+ export type MenuExtractFn = (images: string[], hint?: string) => Promise<ExtractedMenu>;
3
+ export interface MenuExtractOptions {
4
+ /** Host override — an app that already owns an extraction endpoint. */
5
+ extract?: MenuExtractFn;
6
+ /** Edge function name (default `menu-extract`). */
7
+ functionName?: string;
8
+ }
9
+ export declare function resolveMenuExtractor(options?: MenuExtractOptions): MenuExtractFn | null;
10
+ //# sourceMappingURL=extract-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-transport.d.ts","sourceRoot":"","sources":["../../src/lib/extract-transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAe7C,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;AAEvF,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,aAAa,GAAG,IAAI,CAmBvF"}
@@ -0,0 +1,7 @@
1
+ export interface DownscaleOptions {
2
+ maxDimension?: number;
3
+ quality?: number;
4
+ }
5
+ export declare function downscaleImage(file: File, options?: DownscaleOptions): Promise<string>;
6
+ export declare function fileToDataUrl(file: File): Promise<string>;
7
+ //# sourceMappingURL=images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/lib/images.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5F;AAmBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+DrC,CAAA"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoJrC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+DvC,CAAA"}
1
+ {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoJvC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export declare const MIGRATION_001_MENU_BASE = "-- Menu Plugin: base tables.\n--\n-- Three levels, because a restaurant does not have \"a menu\": it has a lunch\n-- menu, a weekend menu and a delivery menu, and the same dish appears in more\n-- than one of them at more than one price.\n-- plg_menu_menus \u2014 the menu itself, with when and where it is served\n-- plg_menu_sections \u2014 ordered sections inside a menu\n-- plg_menu_placements \u2014 an item's seat in a section (order + price override)\n-- Items stay in public.products (the spine); plg_menu_items carries only what\n-- is menu-specific about a product.\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_menus (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n description text,\n is_active boolean NOT NULL DEFAULT true,\n sort_order integer NOT NULL DEFAULT 0,\n -- Where it shows: pos | delivery | digital.\n channels text[] NOT NULL DEFAULT ARRAY['pos','delivery','digital']::text[],\n -- { days:[0..6], start:'HH:MM', end:'HH:MM', from:'YYYY-MM-DD', to:'YYYY-MM-DD' }\n -- An empty object means \"always\", which is the common case.\n availability jsonb NOT NULL DEFAULT '{}'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_menus ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_menus_tenant ON public.plg_menu_menus(tenant_id, sort_order);\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_sections (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n menu_id uuid NOT NULL REFERENCES public.plg_menu_menus(id) ON DELETE CASCADE,\n name text NOT NULL,\n description text,\n image_url text,\n sort_order integer NOT NULL DEFAULT 0,\n is_active boolean NOT NULL DEFAULT true,\n availability jsonb NOT NULL DEFAULT '{}'::jsonb,\n -- Set when the section was adopted from a legacy flat category, so the\n -- backfill can run twice without doubling the sections.\n legacy_category_id uuid,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_sections ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_sections_menu ON public.plg_menu_sections(menu_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_plg_menu_sections_tenant ON public.plg_menu_sections(tenant_id);\nCREATE UNIQUE INDEX IF NOT EXISTS uq_plg_menu_sections_legacy ON public.plg_menu_sections(menu_id, legacy_category_id)\n WHERE legacy_category_id IS NOT NULL;\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_placements (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n section_id uuid NOT NULL REFERENCES public.plg_menu_sections(id) ON DELETE CASCADE,\n item_id uuid NOT NULL REFERENCES public.products(id) ON DELETE CASCADE,\n sort_order integer NOT NULL DEFAULT 0,\n price_override numeric(14,2),\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_placements ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_placements_section ON public.plg_menu_placements(section_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_plg_menu_placements_item ON public.plg_menu_placements(item_id);\nCREATE UNIQUE INDEX IF NOT EXISTS uq_plg_menu_placements_seat ON public.plg_menu_placements(section_id, item_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_items (\n product_id uuid PRIMARY KEY REFERENCES public.products(id) ON DELETE CASCADE,\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n status text NOT NULL DEFAULT 'available',\n available_for_pos boolean NOT NULL DEFAULT true,\n available_for_delivery boolean NOT NULL DEFAULT true,\n delivery_price numeric(14,2),\n prep_time_minutes integer,\n allergens text[] NOT NULL DEFAULT ARRAY[]::text[],\n dietary_tags text[] NOT NULL DEFAULT ARRAY[]::text[],\n is_featured boolean NOT NULL DEFAULT false,\n sort_order integer NOT NULL DEFAULT 0,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_items ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_items_tenant ON public.plg_menu_items(tenant_id);\n\n-- Modifier groups (add-ons): declared by the plugin's registries, owned here.\nCREATE TABLE IF NOT EXISTS public.plg_menu_modifier_groups (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n min_selections integer NOT NULL DEFAULT 0,\n max_selections integer NOT NULL DEFAULT 1,\n is_required boolean NOT NULL DEFAULT false,\n sort_order integer NOT NULL DEFAULT 0,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_modifier_groups ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_modifier_groups_tenant ON public.plg_menu_modifier_groups(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_modifiers (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n group_id uuid NOT NULL REFERENCES public.plg_menu_modifier_groups(id) ON DELETE CASCADE,\n name text NOT NULL,\n price_adjustment numeric(14,2) NOT NULL DEFAULT 0,\n is_active boolean NOT NULL DEFAULT true,\n sort_order integer NOT NULL DEFAULT 0,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_modifiers ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_modifiers_group ON public.plg_menu_modifiers(group_id, sort_order);\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_item_modifier_groups (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n product_id uuid NOT NULL REFERENCES public.products(id) ON DELETE CASCADE,\n group_id uuid NOT NULL REFERENCES public.plg_menu_modifier_groups(id) ON DELETE CASCADE,\n sort_order integer NOT NULL DEFAULT 0\n);\nALTER TABLE public.plg_menu_item_modifier_groups ENABLE ROW LEVEL SECURITY;\nCREATE UNIQUE INDEX IF NOT EXISTS uq_plg_menu_item_modifier_groups ON public.plg_menu_item_modifier_groups(product_id, group_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_allergens (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n icon text,\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_allergens ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_allergens_tenant ON public.plg_menu_allergens(tenant_id);\n\nCREATE TABLE IF NOT EXISTS public.plg_menu_dietary_tags (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n color text,\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_menu_dietary_tags ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_menu_dietary_tags_tenant ON public.plg_menu_dietary_tags(tenant_id);\n\n-- Canonical per-tenant RLS + grants for every table above.\nDO $$\nDECLARE t text;\nBEGIN\n FOR t IN SELECT unnest(ARRAY[\n 'plg_menu_menus','plg_menu_sections','plg_menu_placements','plg_menu_items',\n 'plg_menu_modifier_groups','plg_menu_modifiers','plg_menu_item_modifier_groups',\n 'plg_menu_allergens','plg_menu_dietary_tags'\n ])\n LOOP\n EXECUTE format('ALTER TABLE public.%I ENABLE ROW LEVEL SECURITY', t);\n EXECUTE format('GRANT SELECT, INSERT, UPDATE, DELETE ON public.%I TO authenticated', t);\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_select') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_select', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_insert') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_insert', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_update') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_update', t);\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname='public' AND tablename=t AND policyname=t||'_delete') THEN\n EXECUTE format('CREATE POLICY %I ON public.%I FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()))', t||'_delete', t);\n END IF;\n END LOOP;\nEND $$;\n";
2
+ export declare const MIGRATION_002_MENU_BACKFILL = "-- Menu Plugin: adopt whatever menu already exists in the pool.\n--\n-- Pools that ran the incubator version of this plugin have a flat world:\n-- categories in public.categories (kind='menu_category'), item flags in a\n-- public.menu_items extension, and no menus at all. Rather than ask the\n-- restaurant to type its menu again, the first menu is BUILT from that data:\n-- one \"Card\u00E1pio principal\" per tenant, its sections are the old categories, and\n-- every product already sitting in a category takes its seat.\n--\n-- Every step is guarded twice: by the existence of the legacy object (a fresh\n-- pool has none of it) and by a NOT EXISTS on the target, so re-applying does\n-- nothing. The legacy tables are never written to or dropped \u2014 an app still\n-- reading them keeps working.\n\nDO $$\nDECLARE\n has_categories boolean := to_regclass('public.categories') IS NOT NULL;\n has_legacy_items boolean := to_regclass('public.menu_items') IS NOT NULL;\n has_products boolean := to_regclass('public.products') IS NOT NULL;\n has_category_kind boolean := EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_schema='public' AND table_name='categories' AND column_name='kind'\n );\n has_product_category boolean := EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_schema='public' AND table_name='products' AND column_name='category_id'\n );\nBEGIN\n -- 1. One default menu per tenant that has menu categories or menu items.\n IF has_categories AND has_category_kind THEN\n EXECUTE $sql$\n INSERT INTO public.plg_menu_menus (tenant_id, name, description, sort_order)\n SELECT DISTINCT c.tenant_id, 'Card\u00E1pio principal', NULL, 0\n FROM public.categories c\n WHERE c.kind = 'menu_category'\n AND c.tenant_id IS NOT NULL\n AND NOT EXISTS (SELECT 1 FROM public.plg_menu_menus m WHERE m.tenant_id = c.tenant_id)\n $sql$;\n END IF;\n\n IF has_legacy_items THEN\n EXECUTE $sql$\n INSERT INTO public.plg_menu_menus (tenant_id, name, description, sort_order)\n SELECT DISTINCT mi.tenant_id, 'Card\u00E1pio principal', NULL, 0\n FROM public.menu_items mi\n WHERE mi.tenant_id IS NOT NULL\n AND NOT EXISTS (SELECT 1 FROM public.plg_menu_menus m WHERE m.tenant_id = mi.tenant_id)\n $sql$;\n END IF;\n\n -- 2. Sections from the flat categories, keeping name and order.\n IF has_categories AND has_category_kind THEN\n EXECUTE $sql$\n INSERT INTO public.plg_menu_sections (tenant_id, menu_id, name, sort_order, is_active, legacy_category_id)\n SELECT c.tenant_id, m.id, c.name,\n COALESCE(NULLIF(c.sort_order, 0), row_number() OVER (PARTITION BY c.tenant_id ORDER BY c.sort_order, c.name)),\n COALESCE(c.is_active, true), c.id\n FROM public.categories c\n JOIN public.plg_menu_menus m\n ON m.tenant_id = c.tenant_id AND m.sort_order = 0\n WHERE c.kind = 'menu_category'\n AND NOT EXISTS (\n SELECT 1 FROM public.plg_menu_sections s\n WHERE s.menu_id = m.id AND s.legacy_category_id = c.id\n )\n $sql$;\n END IF;\n\n -- 3. Seat every product that already belongs to one of those categories.\n IF has_products AND has_product_category AND has_categories AND has_category_kind THEN\n EXECUTE $sql$\n INSERT INTO public.plg_menu_placements (tenant_id, section_id, item_id, sort_order)\n SELECT p.tenant_id, s.id, p.id,\n row_number() OVER (PARTITION BY s.id ORDER BY p.name)\n FROM public.products p\n JOIN public.plg_menu_sections s ON s.legacy_category_id = p.category_id AND s.tenant_id = p.tenant_id\n WHERE NOT EXISTS (\n SELECT 1 FROM public.plg_menu_placements pl\n WHERE pl.section_id = s.id AND pl.item_id = p.id\n )\n $sql$;\n END IF;\n\n -- 4. Carry the menu-specific item flags over from the legacy extension.\n IF has_legacy_items THEN\n EXECUTE $sql$\n INSERT INTO public.plg_menu_items (\n product_id, tenant_id, status, available_for_pos, available_for_delivery,\n delivery_price, prep_time_minutes, allergens, dietary_tags, is_featured, sort_order\n )\n SELECT mi.product_id, mi.tenant_id,\n COALESCE(mi.status, 'available'),\n COALESCE(mi.available_for_pos, true),\n COALESCE(mi.available_for_delivery, true),\n mi.delivery_price, mi.prep_time_minutes,\n COALESCE(mi.allergens, ARRAY[]::text[]),\n COALESCE(mi.dietary_tags, ARRAY[]::text[]),\n COALESCE(mi.is_featured, false),\n COALESCE(mi.sort_order, 0)\n FROM public.menu_items mi\n WHERE mi.tenant_id IS NOT NULL\n ON CONFLICT (product_id) DO NOTHING\n $sql$;\n END IF;\nEND $$;\n\n-- Seed the allergen / dietary registries once per tenant that has a menu.\nINSERT INTO public.plg_menu_allergens (tenant_id, name, icon)\nSELECT m.tenant_id, v.name, v.icon\nFROM (SELECT DISTINCT tenant_id FROM public.plg_menu_menus) m\nCROSS JOIN (VALUES\n ('Gl\u00FAten', 'Wheat'), ('Lactose', 'Milk'), ('Ovos', 'Egg'),\n ('Amendoim', 'Nut'), ('Frutos do mar', 'Fish'), ('Soja', 'Bean')\n) AS v(name, icon)\nWHERE NOT EXISTS (\n SELECT 1 FROM public.plg_menu_allergens a WHERE a.tenant_id = m.tenant_id AND a.name = v.name\n);\n\nINSERT INTO public.plg_menu_dietary_tags (tenant_id, name, color)\nSELECT m.tenant_id, v.name, v.color\nFROM (SELECT DISTINCT tenant_id FROM public.plg_menu_menus) m\nCROSS JOIN (VALUES\n ('Vegetariano', 'green'), ('Vegano', 'emerald'), ('Sem gl\u00FAten', 'amber')\n) AS v(name, color)\nWHERE NOT EXISTS (\n SELECT 1 FROM public.plg_menu_dietary_tags d WHERE d.tenant_id = m.tenant_id AND d.name = v.name\n);\n";
3
+ export declare const MIGRATION_003_MENU_STORAGE = "-- Menu Plugin: bucket for item, section and import photos.\n--\n-- Public on read: these images are the menu the customer looks at, and a signed\n-- URL per dish would mean re-signing the whole menu on every render. Writing is\n-- the guarded half \u2014 only a member of the tenant whose folder it is.\n-- Path grammar: {tenant_id}/{item|section|menu|import}/{uuid}.{ext}\n\nINSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types)\nVALUES (\n 'menu-images',\n 'menu-images',\n true,\n 8388608, -- 8 MB: a phone photo of a menu page, already compressed by the client\n ARRAY['image/jpeg','image/png','image/webp','image/heic','image/heif']\n)\nON CONFLICT (id) DO UPDATE SET\n public = EXCLUDED.public,\n file_size_limit = EXCLUDED.file_size_limit,\n allowed_mime_types = EXCLUDED.allowed_mime_types;\n\nDROP POLICY IF EXISTS plg_menu_images_read ON storage.objects;\nDROP POLICY IF EXISTS plg_menu_images_insert ON storage.objects;\nDROP POLICY IF EXISTS plg_menu_images_update ON storage.objects;\nDROP POLICY IF EXISTS plg_menu_images_delete ON storage.objects;\n\nCREATE POLICY plg_menu_images_read ON storage.objects\n FOR SELECT TO anon, authenticated\n USING (bucket_id = 'menu-images');\n\nCREATE POLICY plg_menu_images_insert ON storage.objects\n FOR INSERT TO authenticated\n WITH CHECK (\n bucket_id = 'menu-images'\n AND (storage.foldername(name))[1] IN (SELECT public.user_tenant_ids()::text)\n );\n\nCREATE POLICY plg_menu_images_update ON storage.objects\n FOR UPDATE TO authenticated\n USING (\n bucket_id = 'menu-images'\n AND (storage.foldername(name))[1] IN (SELECT public.user_tenant_ids()::text)\n );\n\nCREATE POLICY plg_menu_images_delete ON storage.objects\n FOR DELETE TO authenticated\n USING (\n bucket_id = 'menu-images'\n AND (storage.foldername(name))[1] IN (SELECT public.user_tenant_ids()::text)\n );\n";
4
+ export declare const MIGRATIONS: Array<{
5
+ id: string;
6
+ sql: string;
7
+ }>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,s/RA0KnC,CAAA;AAED,eAAO,MAAM,2BAA2B,qnLA+HvC,CAAA;AAED,eAAO,MAAM,0BAA0B,g4DAiDtC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAIzD,CAAA"}
package/dist/store.d.ts CHANGED
@@ -1,9 +1,18 @@
1
1
  import { type StoreApi } from 'zustand/vanilla';
2
2
  import type { MenuDataProvider } from './data/types';
3
- import type { MenuCategory, MenuItem, ModifierGroup, MenuSummary, MenuItemQuery, CreateMenuItemInput, UpdateMenuItemInput, CreateMenuCategoryInput } from './types';
3
+ import type { Menu, MenuSection, MenuPlacement, MenuItem, ModifierGroup, CreateMenuInput, UpdateMenuInput, CreateSectionInput, UpdateSectionInput, CreateMenuItemInput, UpdateMenuItemInput, MenuItemQuery, MenuSummary, MenuItemStatus, ImportPlan, ImportResult, MenuDraft, DraftItem, DraftSection } from './types';
4
+ import type { MenuExtractFn } from './lib/extract-transport';
4
5
  export interface MenuUIState {
5
- categories: MenuCategory[];
6
- categoriesLoading: boolean;
6
+ /** False when the host provider only knows a flat list of categories. */
7
+ multiMenu: boolean;
8
+ menus: Menu[];
9
+ menusLoading: boolean;
10
+ activeMenuId: string | null;
11
+ sections: MenuSection[];
12
+ placements: MenuPlacement[];
13
+ menuLoading: boolean;
14
+ /** Rows already on screen whose write has not landed yet. */
15
+ pendingIds: string[];
7
16
  menuItems: MenuItem[];
8
17
  menuItemsTotal: number;
9
18
  menuItemsLoading: boolean;
@@ -12,15 +21,42 @@ export interface MenuUIState {
12
21
  modifiersLoading: boolean;
13
22
  summary: MenuSummary | null;
14
23
  summaryLoading: boolean;
15
- fetchCategories(): Promise<void>;
16
- fetchMenuItems(query: MenuItemQuery): Promise<void>;
24
+ fetchMenus(): Promise<void>;
25
+ openMenu(menuId: string): Promise<void>;
26
+ fetchMenuContent(menuId: string): Promise<void>;
27
+ fetchMenuItems(query?: MenuItemQuery): Promise<void>;
17
28
  fetchModifierGroups(): Promise<void>;
18
29
  fetchSummary(): Promise<void>;
19
- createMenuItem(input: CreateMenuItemInput): Promise<MenuItem>;
20
- updateMenuItem(id: string, data: UpdateMenuItemInput): Promise<MenuItem>;
30
+ createMenu(input: CreateMenuInput): Promise<Menu>;
31
+ updateMenu(id: string, data: UpdateMenuInput): Promise<void>;
32
+ deleteMenu(id: string): Promise<void>;
33
+ duplicateMenu(id: string, name: string): Promise<Menu>;
34
+ createSection(name: string, extra?: Partial<CreateSectionInput>): Promise<MenuSection | null>;
35
+ updateSection(id: string, data: UpdateSectionInput): Promise<void>;
36
+ deleteSection(id: string): Promise<void>;
37
+ reorderSections(orderedIds: string[]): Promise<void>;
38
+ addItemToSection(sectionId: string, input: CreateMenuItemInput): Promise<MenuItem | null>;
39
+ placeExistingItem(sectionId: string, itemId: string): Promise<void>;
40
+ removePlacement(placementId: string): Promise<void>;
41
+ setPlacementPrice(placementId: string, price: number | undefined): Promise<void>;
42
+ reorderPlacements(sectionId: string, orderedIds: string[]): Promise<void>;
43
+ movePlacement(placementId: string, toSectionId: string, toIndex: number): Promise<void>;
44
+ updateMenuItem(id: string, data: UpdateMenuItemInput): Promise<void>;
21
45
  deleteMenuItem(id: string): Promise<void>;
22
- toggleAvailability(id: string, field: string, value: any): Promise<void>;
23
- createCategory(input: CreateMenuCategoryInput): Promise<MenuCategory>;
46
+ duplicateMenuItem(id: string, sectionId?: string): Promise<void>;
47
+ setItemStatus(id: string, status: MenuItemStatus): Promise<void>;
48
+ toggleAvailability(id: string, field: 'availableForPos' | 'availableForDelivery' | 'isFeatured', value: boolean): Promise<void>;
49
+ uploadImage(file: File, kind: 'item' | 'section' | 'menu' | 'import'): Promise<string | null>;
50
+ extracting: boolean;
51
+ draft: MenuDraft | null;
52
+ runExtraction(images: string[], extract: MenuExtractFn): Promise<void>;
53
+ updateDraftItem(sectionKey: string, itemKey: string, patch: Partial<DraftItem>): void;
54
+ removeDraftItem(sectionKey: string, itemKey: string): void;
55
+ updateDraftSection(sectionKey: string, patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>): void;
56
+ removeDraftSection(sectionKey: string): void;
57
+ discardDraft(): void;
58
+ commitDraft(): Promise<ImportResult>;
59
+ applyImportPlan(plan: ImportPlan): Promise<ImportResult>;
24
60
  }
25
- export declare function createMenuStore(provider: MenuDataProvider): StoreApi<MenuUIState>;
61
+ export declare function createMenuStore(rawProvider: MenuDataProvider): StoreApi<MenuUIState>;
26
62
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EACV,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAClD,aAAa,EACb,mBAAmB,EAAE,mBAAmB,EAAE,uBAAuB,EAClE,MAAM,SAAS,CAAA;AAMhB,MAAM,WAAW,WAAW;IAE1B,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,iBAAiB,EAAE,OAAO,CAAA;IAE1B,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;IACzB,aAAa,EAAE,aAAa,CAAA;IAE5B,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,gBAAgB,EAAE,OAAO,CAAA;IAEzB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,cAAc,EAAE,OAAO,CAAA;IAGvB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7D,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxE,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,cAAc,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACtE;AAMD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,QAAQ,CAAC,WAAW,CAAC,CAkHjF"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,5 +1,70 @@
1
1
  export type MenuItemStatus = 'available' | 'sold_out' | 'hidden';
2
- /** Menu category — maps to public.categories (kind='menu_category') */
2
+ /** Where a menu is served. A weekend menu that never reaches delivery is a
3
+ * channel decision, not a separate menu. */
4
+ export type MenuChannel = 'pos' | 'delivery' | 'digital';
5
+ export declare const MENU_CHANNELS: MenuChannel[];
6
+ /**
7
+ * When a menu (or section) is being served. An empty rule means "always" —
8
+ * the common case, and the one that must not cost the user a single click.
9
+ *
10
+ * `days` is 0=Sunday..6=Saturday, matching Date#getDay. A window whose `end` is
11
+ * earlier than its `start` crosses midnight (22:00→02:00 is a late-night menu),
12
+ * which is why the evaluation is not a naive string compare.
13
+ */
14
+ export interface MenuAvailability {
15
+ /** Weekdays it runs. Empty/undefined = every day. */
16
+ days?: number[];
17
+ /** "HH:MM", 24h. Both must be set for a window to apply. */
18
+ start?: string;
19
+ end?: string;
20
+ /** Runs only inside this date range (ISO dates) — seasonal menus. */
21
+ from?: string;
22
+ to?: string;
23
+ }
24
+ /** A menu — `plg_menu_menus`. */
25
+ export interface Menu {
26
+ id: string;
27
+ name: string;
28
+ description?: string;
29
+ isActive: boolean;
30
+ sortOrder: number;
31
+ channels: MenuChannel[];
32
+ availability: MenuAvailability;
33
+ /** Filled by the provider for the list header. */
34
+ sectionCount?: number;
35
+ itemCount?: number;
36
+ tenantId: string;
37
+ createdAt: string;
38
+ updatedAt: string;
39
+ }
40
+ /** A section inside a menu — `plg_menu_sections`. */
41
+ export interface MenuSection {
42
+ id: string;
43
+ menuId: string;
44
+ name: string;
45
+ description?: string;
46
+ imageUrl?: string;
47
+ sortOrder: number;
48
+ isActive: boolean;
49
+ /** Sections can narrow the menu's window (sobremesas só à noite). */
50
+ availability?: MenuAvailability;
51
+ tenantId: string;
52
+ createdAt: string;
53
+ updatedAt: string;
54
+ }
55
+ /** An item's place in a section — `plg_menu_placements`. */
56
+ export interface MenuPlacement {
57
+ id: string;
58
+ sectionId: string;
59
+ itemId: string;
60
+ sortOrder: number;
61
+ /** Price for THIS menu. Undefined = the item's own price. */
62
+ priceOverride?: number;
63
+ isActive: boolean;
64
+ tenantId: string;
65
+ }
66
+ /** Menu category — legacy flat grouping (public.categories, kind='menu_category').
67
+ * Kept for providers that predate menus; the adapter maps it onto sections. */
3
68
  export interface MenuCategory {
4
69
  id: string;
5
70
  name: string;
@@ -13,7 +78,7 @@ export interface MenuCategory {
13
78
  createdAt: string;
14
79
  updatedAt: string;
15
80
  }
16
- /** Menu item — public.products + public.menu_items extension */
81
+ /** Menu item — public.products + the plg_menu_items extension */
17
82
  export interface MenuItem {
18
83
  id: string;
19
84
  name: string;
@@ -60,6 +125,32 @@ export interface ModifierItem {
60
125
  isActive: boolean;
61
126
  sortOrder: number;
62
127
  }
128
+ export interface CreateMenuInput {
129
+ name: string;
130
+ description?: string;
131
+ channels?: MenuChannel[];
132
+ availability?: MenuAvailability;
133
+ isActive?: boolean;
134
+ sortOrder?: number;
135
+ }
136
+ export type UpdateMenuInput = Partial<CreateMenuInput>;
137
+ export interface CreateSectionInput {
138
+ menuId: string;
139
+ name: string;
140
+ description?: string;
141
+ imageUrl?: string;
142
+ sortOrder?: number;
143
+ isActive?: boolean;
144
+ availability?: MenuAvailability;
145
+ }
146
+ export type UpdateSectionInput = Partial<Omit<CreateSectionInput, 'menuId'>>;
147
+ export interface PlaceItemInput {
148
+ sectionId: string;
149
+ itemId: string;
150
+ sortOrder?: number;
151
+ priceOverride?: number;
152
+ isActive?: boolean;
153
+ }
63
154
  export interface CreateMenuItemInput {
64
155
  name: string;
65
156
  description?: string;
@@ -76,6 +167,8 @@ export interface CreateMenuItemInput {
76
167
  deliveryPrice?: number;
77
168
  isFeatured?: boolean;
78
169
  modifierGroupIds?: string[];
170
+ /** Drop it straight into a section — the create-and-place round trip. */
171
+ sectionId?: string;
79
172
  }
80
173
  export interface UpdateMenuItemInput extends Partial<CreateMenuItemInput> {
81
174
  }
@@ -100,6 +193,62 @@ export interface PaginatedResult<T> {
100
193
  data: T[];
101
194
  total: number;
102
195
  }
196
+ /** What the vision model gives back, after normalization. */
197
+ export interface ExtractedMenu {
198
+ sections: ExtractedSection[];
199
+ /** Which model read the photos — shown in the review header, and audited. */
200
+ model?: string;
201
+ warnings?: string[];
202
+ }
203
+ export interface ExtractedSection {
204
+ name: string;
205
+ items: ExtractedItem[];
206
+ }
207
+ export interface ExtractedItem {
208
+ name: string;
209
+ price: number;
210
+ description?: string;
211
+ }
212
+ /**
213
+ * What was read off the photos, sitting ON the menu screen waiting to be
214
+ * confirmed. Not a wizard's private state: the user edits these rows in place
215
+ * with the same controls as a real item, and the assistant edits the same rows
216
+ * through its tools — one draft, two hands.
217
+ */
218
+ export interface MenuDraft {
219
+ sections: DraftSection[];
220
+ model?: string;
221
+ source: 'photo' | 'chat';
222
+ }
223
+ export interface DraftSection {
224
+ /** Addressing key for edits — never persisted. */
225
+ key: string;
226
+ name: string;
227
+ /** Existing section to append to; undefined = create `name`. */
228
+ targetSectionId?: string;
229
+ items: DraftItem[];
230
+ }
231
+ export interface DraftItem {
232
+ key: string;
233
+ name: string;
234
+ price: number;
235
+ description?: string;
236
+ }
237
+ /** A reviewed extraction, ready to be written. */
238
+ export interface ImportPlan {
239
+ menuId: string;
240
+ sections: Array<{
241
+ /** Existing section to append to, or undefined to create `name`. */
242
+ sectionId?: string;
243
+ name: string;
244
+ items: ExtractedItem[];
245
+ }>;
246
+ }
247
+ export interface ImportResult {
248
+ sectionsCreated: number;
249
+ itemsCreated: number;
250
+ failed: number;
251
+ }
103
252
  export interface MenuSummary {
104
253
  totalItems: number;
105
254
  availableItems: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuManagerView.d.ts","sourceRoot":"","sources":["../../src/views/MenuManagerView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAA;AAgc3D,wBAAgB,eAAe,sBAqP9B"}
1
+ {"version":3,"file":"MenuManagerView.d.ts","sourceRoot":"","sources":["../../src/views/MenuManagerView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAA;AAiC3D,wBAAgB,eAAe,sBAse9B"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "fayz": {
4
4
  "status": "beta"
5
5
  },
6
- "version": "0.9.4",
6
+ "version": "0.10.0",
7
7
  "description": "Fayz SDK — plugin-menu plugin",
8
8
  "type": "module",
9
9
  "sideEffects": false,
@@ -27,10 +27,13 @@
27
27
  "sonner": "^2.0.7"
28
28
  },
29
29
  "dependencies": {
30
- "@fayz-ai/core": "^0.14.0",
31
- "@fayz-ai/sdk": "^0.12.0",
32
- "@fayz-ai/admin": "^0.14.0",
33
- "@fayz-ai/ui": "^0.14.0"
30
+ "@dnd-kit/core": "^6.3.1",
31
+ "@dnd-kit/sortable": "^10.0.0",
32
+ "@dnd-kit/utilities": "^3.2.2",
33
+ "@fayz-ai/core": "^0.15.0",
34
+ "@fayz-ai/sdk": "^0.15.0",
35
+ "@fayz-ai/admin": "^0.15.0",
36
+ "@fayz-ai/ui": "^0.15.0"
34
37
  },
35
38
  "devDependencies": {
36
39
  "@types/react": "^18.3.0",
@@ -39,7 +42,10 @@
39
42
  "typescript": "^5.5.0",
40
43
  "zustand": "^4.5.0",
41
44
  "lucide-react": "^0.400.0",
42
- "sonner": "^2.0.7"
45
+ "sonner": "^2.0.7",
46
+ "@dnd-kit/core": "^6.3.1",
47
+ "@dnd-kit/sortable": "^10.0.0",
48
+ "@dnd-kit/utilities": "^3.2.2"
43
49
  },
44
50
  "license": "MIT",
45
51
  "keywords": [