From e0a4618ec0fa47a5597fcdd1d477c09f9472cdf5 Mon Sep 17 00:00:00 2001 From: dopoto Date: Thu, 5 Jun 2025 10:59:10 +0300 Subject: [PATCH 1/7] pck --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3adbbc1..e1a1c95 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "next-menu", - "version": "0.0.71", + "version": "0.0.72", "private": true, "type": "module", "scripts": { From 80311601a1fb4273c04876b66cf08983d1416cb2 Mon Sep 17 00:00:00 2001 From: dopoto Date: Thu, 5 Jun 2025 11:05:25 +0300 Subject: [PATCH 2/7] fix my --- src/middleware.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index 1772556..bbae72e 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -75,16 +75,6 @@ export default clerkMiddleware( } } - // For auth-protected routes, ensure we have a last location cookie - if (isAuthProtectedRoute(req)) { - const machineId = req.cookies.get(CookieKey.CurrentLocationId)?.value; - if (!machineId) { - const anonResponse = NextResponse.next(); - anonResponse.cookies.set(CookieKey.MachineId, crypto.randomUUID(), cookieOptions); - return anonResponse; - } - } - // For public routes, ensure we have a machineId cookie if (!isAuthProtectedRoute(req)) { const machineId = req.cookies.get(CookieKey.MachineId); From fffa5dfcea41e37363fd20edf79e5f87c84fd999 Mon Sep 17 00:00:00 2001 From: dopoto Date: Thu, 5 Jun 2025 13:42:52 +0300 Subject: [PATCH 3/7] landing --- TODO.md | 5 +++- .../(landing)/_components/LandingFeatures.tsx | 30 +++++++++---------- src/app/(landing)/_components/LandingHero.tsx | 14 +++++---- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/TODO.md b/TODO.md index 6452813..a2914db 100644 --- a/TODO.md +++ b/TODO.md @@ -21,4 +21,7 @@ Storybook snapshot testing + pipeline integration Zod 4 Shadcn registry GLobal open orders checker in Admin -> show toast, count badge over open orders menu icon -Server actions errors - show friendly error message in modal / parallel route - \ No newline at end of file +Server actions errors - show friendly error message in modal / parallel route - +language switch in menu - non-free tiers +360 view? +pricing - nm scans a month \ No newline at end of file diff --git a/src/app/(landing)/_components/LandingFeatures.tsx b/src/app/(landing)/_components/LandingFeatures.tsx index 3d6c7c7..4ec38ea 100644 --- a/src/app/(landing)/_components/LandingFeatures.tsx +++ b/src/app/(landing)/_components/LandingFeatures.tsx @@ -1,4 +1,4 @@ -import { Airplay, Clock, Globe, ScanQrCode, Users, Utensils } from 'lucide-react'; +import { Airplay, ChartPieIcon, Clock, Globe, HandCoinsIcon, PiggyBankIcon, ScanQrCode, Users, Utensils } from 'lucide-react'; import React from 'react'; import { LandingSectionTitle } from '~/app/(landing)/_components/LandingSectionTitle'; import { sections } from '~/domain/landing-content'; @@ -12,35 +12,35 @@ export interface Feature { export const LandingFeatures: React.FC = () => { const features: Feature[] = [ { - title: 'Step into the QR age', - description: 'Create and manage QR-powered menus for your customers', + title: `Your own site - on us`, + description: `Once you set up your menus, you get a public link that hosts them - always online, ready to be shared, no web hosting required.`, icon: , }, { - title: 'Handle take-out orders with ease', - description: 'Nunc eget tincidunt libero. Pellentesque fringilla congue nisi id lobortis.', + title: 'Always in sync', + description: `Publish updates to your menu items and prices any time - they're instantly reflected in your menus.`, icon: , }, { - title: 'Set up and manage kiosk screens', - description: 'Mauris turpis lectus, finibus eget gravida a, sollicitudin sit amet risus.', + title: 'No app required', + description: 'Customers that scan your QR codes are taken to your public menu page, that simply works on any mobile device.', icon: , }, { - title: 'See open orders in real time, anytime', - description: 'Donec ac lobortis enim, id pellentesque massa. Nulla quis enim ut elit consequat malesuada.', + title: 'Fully-automated ordering system', + description: `In interactive mode, guests can order items directly from your menu and can see instant updates for items marked as received at the table by your staff.`, icon: , }, { - title: 'Team Collaboration', - description: 'Quisque tincidunt aliquam malesuada. Maecenas maximus purus ac metus congue viverra. ', - icon: , + title: 'No hidden costs', + description: 'No purchases of expensive terminals or app installs are required. Your guests and your staff only need a device with a browser - be it a phone, a tablet, a laptop or a desktop PC.', + icon: , }, { - title: 'Global Accessibility', + title: 'In-depth reports', description: - 'Suspendisse tincidunt diam non risus venenatis, ac efficitur velit sodales. Aenean blandit consequat elit in pellentesque.', - icon: , + `How many guests opened your menus? What's your best selling menu item? What is never ordered? Easy - learn all these and much more from our reports page, included in all price plans!`, + icon: , }, ]; diff --git a/src/app/(landing)/_components/LandingHero.tsx b/src/app/(landing)/_components/LandingHero.tsx index 38614cc..947d2ce 100644 --- a/src/app/(landing)/_components/LandingHero.tsx +++ b/src/app/(landing)/_components/LandingHero.tsx @@ -8,14 +8,16 @@ export const LandingHero: React.FC = () => {
-

- Lorem ipsum your - dolor today! +

+ QR menus, + now super-powered!

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vel sem leo. Nunc eget - tincidunt libero. Pellentesque fringilla congue nisi id lobortis. Nullam pharetra orci eros, - id interdum ipsum sagittis ac. + TheMenu is the ultimate QR code menu platform for restaurants, + bars, cafes, food trucks and hotels. +

+

+ Ready to start accepting orders for dine-in, takeaway and delivery?

Date: Thu, 5 Jun 2025 13:52:12 +0300 Subject: [PATCH 4/7] contetn --- TODO.md | 3 ++- src/domain/price-tier-flags.ts | 18 +++++++++++++++--- src/domain/price-tiers.ts | 18 +++++++++++++----- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/TODO.md b/TODO.md index a2914db..e73af00 100644 --- a/TODO.md +++ b/TODO.md @@ -24,4 +24,5 @@ GLobal open orders checker in Admin -> show toast, count badge over open orders Server actions errors - show friendly error message in modal / parallel route - language switch in menu - non-free tiers 360 view? -pricing - nm scans a month \ No newline at end of file +pricing - nm scans a month +info icon on Price card \ No newline at end of file diff --git a/src/domain/price-tier-flags.ts b/src/domain/price-tier-flags.ts index 39c70f6..3899eee 100644 --- a/src/domain/price-tier-flags.ts +++ b/src/domain/price-tier-flags.ts @@ -1,6 +1,7 @@ import { z } from 'zod'; +import { MENU_MODES } from '~/domain/menu-modes'; -export const PriceTierFlagIdSchema = z.union([z.literal('reports'), z.literal('publicSite')]); +export const PriceTierFlagIdSchema = z.union([z.literal('reports'), z.literal('publicSite'), z.literal('nonInteractiveMode'), z.literal('interactiveMode')]); export type PriceTierFlagId = z.infer; @@ -22,8 +23,7 @@ export const priceTierFlags: Record = { id: 'reports', resourceSingularName: 'report', resourcePluralName: 'reports', - description: - 'Visualize, filter and process in-depth data - visitors, orders, menu items break-downs and much more.', + description: 'Visualize, filter and process in-depth data - visitors, orders, menu items break-downs and much more.', }, publicSite: { id: 'publicSite', @@ -31,4 +31,16 @@ export const priceTierFlags: Record = { resourcePluralName: 'public site', description: 'A public-facing professional-looking web site that your customers can use to browse your menus.', }, + nonInteractiveMode: { + id: 'nonInteractiveMode', + resourceSingularName: 'non-interactive mode', + resourcePluralName: 'non-interactive mode', + description: MENU_MODES.noninteractive.description + }, + interactiveMode: { + id: 'interactiveMode', + resourceSingularName: 'interactive mode', + resourcePluralName: 'interactive mode', + description: MENU_MODES.interactive.description + } }; diff --git a/src/domain/price-tiers.ts b/src/domain/price-tiers.ts index c329739..e828a73 100644 --- a/src/domain/price-tiers.ts +++ b/src/domain/price-tiers.ts @@ -49,6 +49,8 @@ export const priceTiers: Record = { flags: [ { id: 'reports', isEnabled: true }, { id: 'publicSite', isEnabled: true }, + { id: 'nonInteractiveMode', isEnabled: true }, + { id: 'interactiveMode', isEnabled: true }, ], }, start2: { @@ -57,7 +59,7 @@ export const priceTiers: Record = { description: 'Takes two minutes to get started', monthlyUsdPrice: 0, yearlyUsdPrice: 0, - isPublic: true, + isPublic: false, isPopular: false, features: [ { id: 'locations', quota: 1 }, @@ -67,6 +69,8 @@ export const priceTiers: Record = { flags: [ { id: 'reports', isEnabled: true }, { id: 'publicSite', isEnabled: true }, + { id: 'nonInteractiveMode', isEnabled: true }, + { id: 'interactiveMode', isEnabled: true }, ], }, pro: { @@ -80,12 +84,14 @@ export const priceTiers: Record = { isPopular: true, features: [ { id: 'locations', quota: 1 }, - { id: 'menus', quota: 1 }, - { id: 'menuItems', quota: 0 }, + { id: 'menus', quota: 10 }, + { id: 'menuItems', quota: 100 }, ], flags: [ { id: 'reports', isEnabled: false }, { id: 'publicSite', isEnabled: true }, + { id: 'nonInteractiveMode', isEnabled: true }, + { id: 'interactiveMode', isEnabled: true }, ], }, enterprise: { @@ -99,12 +105,14 @@ export const priceTiers: Record = { isPopular: false, features: [ { id: 'locations', quota: 1 }, - { id: 'menus', quota: 100 }, - { id: 'menuItems', quota: 14 }, + { id: 'menus', quota: 50 }, + { id: 'menuItems', quota: 1000 }, ], flags: [ { id: 'reports', isEnabled: true }, { id: 'publicSite', isEnabled: true }, + { id: 'nonInteractiveMode', isEnabled: true }, + { id: 'interactiveMode', isEnabled: true }, ], }, custom1: { From 3236393571ba695d37679f10ea107cb0998e02f9 Mon Sep 17 00:00:00 2001 From: dopoto Date: Thu, 5 Jun 2025 13:54:51 +0300 Subject: [PATCH 5/7] prett --- .../(landing)/_components/LandingFeatures.tsx | 11 ++++++----- src/app/(landing)/_components/LandingHero.tsx | 4 ++-- src/domain/price-tier-flags.ts | 16 +++++++++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/app/(landing)/_components/LandingFeatures.tsx b/src/app/(landing)/_components/LandingFeatures.tsx index 4ec38ea..2b1030b 100644 --- a/src/app/(landing)/_components/LandingFeatures.tsx +++ b/src/app/(landing)/_components/LandingFeatures.tsx @@ -1,4 +1,4 @@ -import { Airplay, ChartPieIcon, Clock, Globe, HandCoinsIcon, PiggyBankIcon, ScanQrCode, Users, Utensils } from 'lucide-react'; +import { Airplay, ChartPieIcon, Clock, PiggyBankIcon, ScanQrCode, Utensils } from 'lucide-react'; import React from 'react'; import { LandingSectionTitle } from '~/app/(landing)/_components/LandingSectionTitle'; import { sections } from '~/domain/landing-content'; @@ -23,7 +23,8 @@ export const LandingFeatures: React.FC = () => { }, { title: 'No app required', - description: 'Customers that scan your QR codes are taken to your public menu page, that simply works on any mobile device.', + description: + 'Customers that scan your QR codes are taken to your public menu page, that simply works on any mobile device.', icon: , }, { @@ -33,13 +34,13 @@ export const LandingFeatures: React.FC = () => { }, { title: 'No hidden costs', - description: 'No purchases of expensive terminals or app installs are required. Your guests and your staff only need a device with a browser - be it a phone, a tablet, a laptop or a desktop PC.', + description: + 'No purchases of expensive terminals or app installs are required. Your guests and your staff only need a device with a browser - be it a phone, a tablet, a laptop or a desktop PC.', icon: , }, { title: 'In-depth reports', - description: - `How many guests opened your menus? What's your best selling menu item? What is never ordered? Easy - learn all these and much more from our reports page, included in all price plans!`, + description: `How many guests opened your menus? What's your best selling menu item? What is never ordered? Easy - learn all these and much more from our reports page, included in all price plans!`, icon: , }, ]; diff --git a/src/app/(landing)/_components/LandingHero.tsx b/src/app/(landing)/_components/LandingHero.tsx index 947d2ce..4cbdf35 100644 --- a/src/app/(landing)/_components/LandingHero.tsx +++ b/src/app/(landing)/_components/LandingHero.tsx @@ -13,8 +13,8 @@ export const LandingHero: React.FC = () => { now super-powered!

- TheMenu is the ultimate QR code menu platform for restaurants, - bars, cafes, food trucks and hotels. + TheMenu is the ultimate QR code menu platform for restaurants, bars, cafes, food trucks and + hotels.

Ready to start accepting orders for dine-in, takeaway and delivery? diff --git a/src/domain/price-tier-flags.ts b/src/domain/price-tier-flags.ts index 3899eee..c6f0b0c 100644 --- a/src/domain/price-tier-flags.ts +++ b/src/domain/price-tier-flags.ts @@ -1,7 +1,12 @@ import { z } from 'zod'; import { MENU_MODES } from '~/domain/menu-modes'; -export const PriceTierFlagIdSchema = z.union([z.literal('reports'), z.literal('publicSite'), z.literal('nonInteractiveMode'), z.literal('interactiveMode')]); +export const PriceTierFlagIdSchema = z.union([ + z.literal('reports'), + z.literal('publicSite'), + z.literal('nonInteractiveMode'), + z.literal('interactiveMode'), +]); export type PriceTierFlagId = z.infer; @@ -23,7 +28,8 @@ export const priceTierFlags: Record = { id: 'reports', resourceSingularName: 'report', resourcePluralName: 'reports', - description: 'Visualize, filter and process in-depth data - visitors, orders, menu items break-downs and much more.', + description: + 'Visualize, filter and process in-depth data - visitors, orders, menu items break-downs and much more.', }, publicSite: { id: 'publicSite', @@ -35,12 +41,12 @@ export const priceTierFlags: Record = { id: 'nonInteractiveMode', resourceSingularName: 'non-interactive mode', resourcePluralName: 'non-interactive mode', - description: MENU_MODES.noninteractive.description + description: MENU_MODES.noninteractive.description, }, interactiveMode: { id: 'interactiveMode', resourceSingularName: 'interactive mode', resourcePluralName: 'interactive mode', - description: MENU_MODES.interactive.description - } + description: MENU_MODES.interactive.description, + }, }; From 9ce830139fb2834c9d1a776e6e2e6365854c3741 Mon Sep 17 00:00:00 2001 From: dopoto Date: Thu, 5 Jun 2025 13:57:57 +0300 Subject: [PATCH 6/7] btn --- src/app/(landing)/_components/LandingHero.tsx | 2 +- src/components/GetStartedCta.tsx | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/app/(landing)/_components/LandingHero.tsx b/src/app/(landing)/_components/LandingHero.tsx index 4cbdf35..5a07b0b 100644 --- a/src/app/(landing)/_components/LandingHero.tsx +++ b/src/app/(landing)/_components/LandingHero.tsx @@ -10,7 +10,7 @@ export const LandingHero: React.FC = () => {

QR menus, - now super-powered! + super-powered!

TheMenu is the ultimate QR code menu platform for restaurants, bars, cafes, food trucks and diff --git a/src/components/GetStartedCta.tsx b/src/components/GetStartedCta.tsx index 8e3613a..3833f6e 100644 --- a/src/components/GetStartedCta.tsx +++ b/src/components/GetStartedCta.tsx @@ -36,16 +36,15 @@ function SignedInCta(props: { tier?: PriceTierId; secondaryText?: string; varian const isOnThisTier = userTier != null && userTier === props.tier; if (isOnThisTier) { - return null; - // return ( - //

- // - // - // - //
- // ); + return ( +
+ + + +
+ ); } return ( From bcaf035cf5a2ebcbaa67621c95419f8e362d241b Mon Sep 17 00:00:00 2001 From: dopoto Date: Thu, 5 Jun 2025 13:59:52 +0300 Subject: [PATCH 7/7] ln --- src/app/(landing)/_components/LandingHero.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(landing)/_components/LandingHero.tsx b/src/app/(landing)/_components/LandingHero.tsx index 5a07b0b..dcfa399 100644 --- a/src/app/(landing)/_components/LandingHero.tsx +++ b/src/app/(landing)/_components/LandingHero.tsx @@ -10,7 +10,7 @@ export const LandingHero: React.FC = () => {

QR menus, - super-powered! + super-powered!

TheMenu is the ultimate QR code menu platform for restaurants, bars, cafes, food trucks and