=== Dine on Tap ===
Contributors: accessinfocus
Tags: restaurant menu, qr code, accessible, digital menu, wcag
Requires at least: 6.2
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 3.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Accessibility-first QR code menu for restaurants, built to WCAG AA by accessibility consultants. Guests scan; staff manage on mobile.

== Description ==

Dine on Tap is a digital menu platform for restaurants, bars, cafes, and hotels. Guests scan a QR code to browse your menu on their phone — no app required. Staff manage everything from a PIN-protected mobile dashboard.

Built from the ground up to meet WCAG AA accessibility standards, including keyboard navigation, screen reader support, dark mode, and high contrast mode.

Dine on Tap is free and fully functional on its own, including DeepL auto-translation (you supply your own DeepL API key). Tableside service requests with staff push notifications are available through the optional Dine on Tap Plus add-on.

**Menu Management**

* Create and manage categorized menu items with prices, descriptions, and images
* Three display templates: item-image, category-image, and text-only
* Category hierarchy with parent/child relationships
* Portion sizes with customizable units (g, ml, oz, pcs, servings)
* Item image layout options: left, right, or top
* Category image layout options: left, right, or alternating
* Hero banner section with customizable overlay, title, and subtitle
* Theme customization: colors, fonts, spacing, and style presets
* Carousel pagination on desktop (768px+) with previous/next navigation for categories with many items
* Drag-free reorder system for items and categories

**Daily Specials & Scheduling**

* Scheduled categories for time-limited menus (Breakfast, Lunch, Happy Hour, etc.)
* Day-of-week scheduling with start and end times
* Featured items with special pricing (diamond badge)
* Popular and Recommended badges for highlighting items
* Item visibility toggle for managing daily availability
* Automatic sold-out reset at a configurable hour each day

**Allergens & Dietary Info**

* EU 14 built-in allergens with emoji indicators
* Allergen filter on the frontend — guests filter the menu by dietary needs
* Combined search and allergen filtering for precise menu browsing
* Nutrition/calorie info per item
* Enable only the allergens your venue uses

**Multilingual Support**

* Bilingual menus with language toggle on the frontend
* Auto-translation via DeepL API (you supply your own DeepL API key)
* RTL language support (Arabic, Hebrew, Persian)
* Frontend label customization for any language
* Full i18n support with .po/.mo translation files

**QR Codes**

* Generate QR codes with customizable size and error correction
* Download as a PNG image

**Staff Dashboard**

* PIN-protected mobile-friendly dashboard on the frontend
* Manage item availability, badges, and daily specials
* Edit items, categories, and scheduled categories
* Collapsible translation fields with auto-translate and save

**Tableside Service Requests** (Dine on Tap Plus add-on)

* Built-in request types: Bring the Bill, Bring Cutlery, Bring Extra Plates, Clean Table, Need Assistance
* Custom request types with emoji icons
* Payment method selection (card/cash) on bill requests
* Free-text messages from guests
* Operating hours scheduling
* Rate limiting to prevent spam
* Email and push notification alerts for staff

**Multi-Currency Pricing**

* 107 currencies across all regions
* Main currency plus optional secondary currency
* Automatic currency symbol display

**Accessibility (WCAG AA)**

* Keyboard navigation for all interactive elements
* Visible focus indicators on every control
* Screen reader optimized with proper ARIA attributes and live announcements
* Translatable aria-labels for all navigation controls
* Dark mode with full contrast compliance
* High contrast mode support (Windows, macOS)
* Touch-friendly button sizes for mobile
* Responsive design from 320px to desktop
* WCAG color contrast checker built into settings

**Business Type Presets**

* Restaurant, Bar/Pub, Cafe/Coffee Shop, Hotel Room Service
* Customizable labels for items, descriptions, and portions

**Shortcodes**

* `[dineontap_menu]` — Display the full menu on any page or post
* `[dineontap_manager]` — PIN-protected staff dashboard

For more information, visit [accessinfocus.com/software/dine-on-tap/](https://accessinfocus.com/software/dine-on-tap/).

== Installation ==

1. In WordPress admin, go to Plugins > Add New and search for "Dine on Tap"
2. Click Install Now, then Activate
3. Navigate to Dine on Tap in the admin sidebar
4. Add your menu items and categories
5. Add the `[dineontap_menu]` shortcode to a page to display your menu

No license key or account is required. To add tableside service requests with staff push notifications, install the separate Dine on Tap Plus add-on from [accessinfocus.com/software/dine-on-tap/](https://accessinfocus.com/software/dine-on-tap/) and enter your key on the Plus License screen.

== Frequently Asked Questions ==

= How do I display the menu on my website? =

Add the shortcode `[dineontap_menu]` to any page or post. The full menu with all visible categories and items will be displayed.

= How do I set up the staff dashboard? =

Go to Dine on Tap > Manager tab in the admin and set a PIN. Then add the `[dineontap_manager]` shortcode to a page. Staff access the dashboard by entering the PIN on that page.

= Is Dine on Tap free? =

Yes. The full menu, QR codes, allergens, scheduled specials, the staff dashboard, bilingual menus, and DeepL auto-translation (you supply your own API key) are all free with no account or license key. A separate Dine on Tap Plus add-on adds tableside service requests and staff push notifications. A license key is only needed for the Plus add-on, available at [accessinfocus.com/software/dine-on-tap/](https://accessinfocus.com/software/dine-on-tap/).

= Can I use multiple languages on my menu? =

Yes. The free plugin supports a primary and a secondary language with manual translations and a language toggle on the frontend, plus DeepL auto-translation (you supply your own DeepL API key) to add more languages automatically.

= How do scheduled categories work? =

Scheduled categories appear automatically based on time of day and day of week. Create a scheduled category (e.g., "Lunch Menu"), set start/end times and active days, then add items to it.

= What display templates are available? =

Three templates: **item-image** (images next to each menu item), **category-image** (one image per category section), and **text-only** (no images). Choose in Settings > General > Display Template.

= Does the plugin support multiple currencies? =

Yes. Choose a main currency and optionally a secondary currency from 107 supported currencies. Prices display in both currencies on the frontend.

= How do tableside service requests work? =

Guests tap a "Request Service" button on the menu page to send requests like "Bring the Bill" or "Need Assistance". Staff receive push notifications and manage requests from the dashboard.

= Is the plugin accessible? =

Yes. Dine on Tap is built to WCAG AA standards with keyboard navigation, screen reader support, visible focus indicators, dark mode, and high contrast mode. A built-in contrast checker helps you verify your color choices.

= How do QR codes work? =

Go to the QR Code tab, enter your menu page URL, choose a size and error correction level, then click Generate. You can then download the QR code as a PNG image.

== Changelog ==

= 3.0.0 =
* First release on the WordPress.org plugin directory — free and fully functional, with no license key or account required.
* Removed all license/tier gating. Every included feature works out of the box.
* Shortcodes renamed to `[dineontap_menu]` and `[dineontap_manager]`. If you are upgrading from an earlier (non-WordPress.org) version, update the shortcodes on your pages.
* DeepL auto-translation is now included for free (you supply your own DeepL API key).
* Tableside service requests and staff push notifications are now provided by the separate Dine on Tap Plus add-on.
* Removed the custom CSS editor. Theme colors, fonts, spacing, and style presets remain in Settings.
* QR codes export as PNG images (the PDF export was removed).
* Updated Alpine.js to 3.15.12.
* Existing settings are migrated automatically on upgrade.

= 2.23.3 =
* Manager dashboard content area: neutral paper-beige background (`#f7f3ea`) replaces the previous yellow-tinted cream
* Manager CRUD tables (Menu Items / Categories / Scheduled): strip client-theme vertical cell borders so the intended horizontal-separator list-view shows through
* Manager CRUD tables: Image column is now centered (header + thumbnail/placeholder) instead of left-hugging the cell edge
* Manager CRUD tables: row actions use `flex-wrap + gap` so the Delete button no longer glues to the buttons above when the column wraps to a second line
* Menu Items table: Price cell uses `white-space: nowrap` so "18.85 EUR" stays on a single line when the column narrows
* Fix "Cannot modify header information — headers already sent" PHP warning when the trust-cookie session restore fires after template output has begun; the session cookie refresh now waits for a later request instead of breaking the page

= 2.23.2 =
* Category title bar: reduced vertical padding (12 → 8px) and desktop heading size (2rem → 1.5rem) for a more compact header; `!important` dropped on desktop so client themes can override
* Manager dashboard: Menu Items tab now shows the main currency symbol next to each price (matches the Status tab behaviour); admin Items tables also updated
* Category carousel on desktop: converted from 1-item sliding window to true pagination with a "P. X of Y" indicator (short, translatable); last page clamps its window so it still shows a full row of items; screen-reader announcement uses the full word "Page X of Y"
* Manager dashboard content area: locked warm off-white background (`#fffbeb`) so client themes can't bleed a dark wrapper through the dashboard

= 2.23.1 =
* Menu item spacing now applies identically on mobile and desktop (removed the 1.5× desktop multiplier) so the admin setting behaves predictably per client
* Fixed Bulgarian translations: un-fuzzied 14 auto-suggested entries that were being excluded from the compiled .mo, and manually corrected 10 more (notably the "Hide/Show %s from menu" visibility-toggle aria-labels, which were falling back to English in VoiceOver)

= 2.23.0 =
* Menu item visibility toggle: per-item eye icon (show/hide) in admin and manager dashboards, with dimmed row + strikethrough for hidden items. Accessible (24×24 / 44×44 hit target, aria-pressed, shape + color redundancy)
* New setting "Visible categories on mobile" (3-15, default 8) — controls the Jump-to-Section overflow threshold and pill count before the "Show all" button
* Manager dashboard now defaults to Menu Items and remembers the last-viewed tab per browser
* VoiceOver focus now reliably lands on the category title after tapping a Jump-to-Section pill (waits for scrollend)
* Category title bar vertical padding reduced from 24px to 12px on desktop; theme-proof with !important
* Items-list gap locked against theme overrides so the admin "Item Spacing" setting wins everywhere
* Manager dashboard locked to a consistent light palette across client themes; dark mode still auto-activates on OS preference with expanded coverage (login, buttons, badges, iOS banner, Status view)
* Fixed mobile overflow items not actually hiding when some themes override the [hidden] attribute
* Custom CSS editor gated behind an extra collapsible warning step inside the Advanced section
* Fixed misleading Custom CSS helper text that implied two shortcodes existed
* Updated Bulgarian translations

= 2.22.0 =
* Size & Price Variations: menu items can now have multiple size/price options (e.g. 170ml, 500ml, 1000ml)
* Variations displayed inline on frontend with portion + price per row
* Collapsible variations section in admin and manager dashboard item forms
* Variations duplicated when items are duplicated, cleaned up on delete

= 2.21.4 =
* Fix Bulgarian translations not displaying for strings containing quotes
* Update license tier prices: Core €49.99, Plus €99.99
* Complete Bulgarian translations for all admin panel strings

= 2.21.2 =
* Default secondary currency to unticked on fresh installs
* Hide additional price field in edit items when secondary currency is disabled
* Fix manager dashboard secondary currency check using correct option
* Remove pre-seeded default categories on fresh install
* Remove 6 obsolete translation strings from .pot and .po files

= 2.21.1 =
* Fix activation error on fresh installs caused by legacy order table migrations
* GitHub Actions workflow for building clean plugin ZIP on release

= 2.21.0 =
* Carousel pagination for menu categories on desktop (768px+) with previous/next navigation
* Table number announcement on menu when scanned from table-specific QR codes
* Translatable aria-labels for carousel navigation buttons (Show previous items, Show next items)
* Translatable screen reader announcement for carousel item range
* New customizable labels: showPreviousItems, showNextItems, showingItemsRange
* Labels added to Navigation & Accessibility admin section for translation
* Updated .pot and .po/.mo translation files with new strings
* Bulgarian translations for all new accessibility labels

= 2.20.0 =
* Removed modifier groups and order-related legacy code
* Fixed Alpine.js component initialization (manager dashboard items now load correctly)
* Fixed Content Security Policy for Alpine.js compatibility
* Collapsible translation fields in item and category edit forms
* Renamed Availability tab to Status
* Fixed duplicate aria-label on item options
* Warm amber color palette for the manager dashboard
* Clearer badge icons: diamond (featured), trend arrow (popular), heart (recommended)
* WCAG AA contrast fixes for light and dark modes
* Dark mode support for CRUD modals, tables, cards, and dropdowns
* Updated plugin description
* Removed stale order/cart translation strings

= 2.18.2 =
* Accessibility improvements: focus traps, ARIA attributes, touch targets
* WCAG 1.4.10 reflow fixes for 200% and 400% zoom
* Dark mode contrast improvements for badges and allergen filters
* iOS VoiceOver modal escape fix
* Sold-out auto-reset cron implementation
* Automatic plugin updates with version guard

= 2.16.0 =
* Tiered licensing system: Core and Plus plans
* Feature gating by license tier
* Push notification settings reorganization

= 2.15.0 =
* Multi-location support for restaurant chains
* Per-location table counts and QR codes
* Location filtering in admin and manager dashboard

= 2.14.0 =
* Category hierarchy with parent/child relationships
* Category descriptions

= 2.13.0 =
* Push notifications via Web Push (VAPID)
* Tableside service request module

= 2.12.0 =
* PIN-protected staff dashboard
* Manager app with mobile-friendly views

= 2.10.0 =
* Quick toggle panel for scheduled categories
* Item hide/show for daily specials
* Reorder items within scheduled menus

= 2.9.0 =
* Category and item image support with layout options
* Split layout with sticky image column on desktop

= 2.8.0 =
* Scheduled categories with time and day-of-week support
* Hero banner section
* Multi-currency expansion to 107 currencies

= 2.7.0 =
* External CSS/JS architecture
* WCAG contrast checker in settings
* Business type presets

== Third-Party Libraries ==

This plugin bundles the following third-party libraries. All are GPL-compatible.

* **PHP QR Code** — used to generate QR code images.
  License: GNU Lesser General Public License v3 (LGPL-3.0).
  Source: http://phpqrcode.sourceforge.net/
  Location: includes/phpqrcode.php

* **Alpine.js** (version 3.15.12) — lightweight JavaScript framework used by the staff dashboard.
  License: MIT.
  Source: https://github.com/alpinejs/alpine
  Location: assets/js/alpine.min.js

== External Services ==

The free Dine on Tap plugin does not contact any external service on its own. It has no analytics, no license check, and no automatic phone-home.

The only optional outbound connection is DeepL auto-translation. If a site administrator enters their own DeepL API key and clicks translate, the menu text to be translated plus its source and target languages are sent to DeepL. No customer, order, or personal data is ever sent.
DeepL privacy policy: https://www.deepl.com/en/privacy
DeepL terms: https://www.deepl.com/en/pro-license

Web Push staff notifications, which also use an external browser push service, are provided only by the separate Dine on Tap Plus add-on and are documented there.

== Upgrade Notice ==

= 3.0.0 =
Now free on WordPress.org. Shortcodes are renamed to [dineontap_menu] and [dineontap_manager] — update your pages if upgrading from an earlier version. Licensing is removed; tableside service requests and push notifications moved to the Dine on Tap Plus add-on. Settings migrate automatically.

= 2.21.4 =
Fix Bulgarian translations for strings with quotes, updated license pricing.

= 2.21.3 =
Updated license pricing and complete Bulgarian admin translations.

= 2.21.2 =
Fresh install improvements: untick secondary currency by default, no pre-seeded categories, cleaned up obsolete translation strings.

= 2.21.1 =
Fixes activation error on fresh installs. Adds automated release ZIP workflow.

= 2.21.0 =
Adds desktop carousel pagination for large menu categories, table number announcements from table-specific QR codes, and translatable accessibility labels for carousel navigation.

= 2.20.0 =
Major cleanup release. Removes legacy ordering and modifier code. Fixes manager dashboard item display. Adds warm amber theme, collapsible translation fields, and WCAG AA dark mode compliance.
