=== SeeOnWall – Wall Art Preview for WooCommerce ===
Contributors: mateuszdziurdziak
Tags: poster, wall art, art prints, product visualization, room visualizer
Requires at least: 6.6
Tested up to: 7.1
Requires PHP: 7.4
Requires Plugins: woocommerce
WC requires at least: 8.0
WC tested up to: 10.9
Stable tag: 1.16.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Shoppers see your posters at true size on a photo of their own wall, or in a room scene, before they buy. No app, no shopper account.

== Description ==

**"How big is it, really?"** is the question that stops a poster sale. SeeOnWall answers it on the
product page: shoppers photograph their own wall with the phone already in their hand and see your
print on it at true physical size — 30×40 looks like 30×40, next to their actual sofa, in their
actual light. No app, no shopper account, no AR-capable phone. Add the button once and it appears
on every poster you sell, now and in the future.

= What shoppers get =

* **True scale, not a mockup.** The wall is measured once, then the poster is drawn at its real
  size with perspective correction — comparing 50×70 against 70×100 is a click, not a guess.
* **Their wall, or a room scene.** Take a photo, upload one, or skip the photo and pick a stock
  room. Whichever is faster for them.
* **Every device, every browser.** Desktop, older phones, and in-app browsers like Instagram and
  Facebook. Start on desktop, scan a QR code, finish on the phone — the preview follows.
* **Frames, mats and sizes.** Frame widths and colours, a passe-partout, and every size you sell.
* **A preview worth sharing.** Shoppers download the image or send a link to the person whose
  opinion decides the purchase — and that link leads back to your product page.

= What you get =

* **Zero per-product setup.** The button reads each product's Dimensions field, and new products
  are picked up automatically. No theme surgery, no shortcode per item.
* **Placement and styling you control.** Nine positions on the product template, or the
  `[seeonwall_button]` shortcode. Label, colour and shape are settings, in nine shopper languages.
* **Analytics on every plan, Free included.** Sessions, views, shares and downloads, plus a
  per-poster breakdown: how many shoppers opened each artwork, and how many got it onto a wall.
* **A storefront that stays fast.** One small deferred script that never blocks your page, no
  tracking cookies, EU-hosted, and wall photos delete themselves after seven days.

**Requires WooCommerce** (8.0+) installed and active. Connecting takes one click — no signup, no
API key: the plugin proves it controls your domain and a free account is provisioned.

= External service: SeeOnWall =

This plugin is the client for **SeeOnWall**, a hosted service (https://seeonwall.com) that renders
the wall previews. The plugin does not visualize anything itself and is not usable without that
service, which is operated by the plugin author.

What the plugin sends: **on connect**, once, when you click **Connect** — your store's URL and the
connecting admin's email address, in exchange for a store token; the email is used only for
account notices and billing, never shown to shoppers or used for marketing. **On product pages**
of connected stores — the viewer script is loaded from `https://seeonwall.com/seeonwall.js`
(loaded, not bundled, because the preview is a live service kept current server-side) and passed
the product's image URL and physical dimensions. The plugin sends **no shopper data**.

What the service does with shopper data, once a shopper opens the preview: a **room-scene
template** uploads nothing at all. A **photo of the shopper's own wall** is stored in an EU
Cloudflare R2 bucket and analysed by Google Vertex AI (EU Data Boundary endpoint, europe-west1)
to detect the wall corners; it stays in the EU for its whole lifetime, is never used to train
models, and is deleted when the session expires after 7 days. Shoppers never create an account,
Cloudflare Turnstile guards uploads against bots, and a notice stating all of this is shown in
the viewer before the shopper uploads. Your WordPress admin also carries this text, ready to copy
into your own policy, under Settings → Privacy.

Terms of Use: https://seeonwall.com/terms · Privacy Policy: https://seeonwall.com/privacy ·
Sub-processors: https://seeonwall.com/subprocessors

= Reporting illegal content =

Content hosted by SeeOnWall that is unlawful — a poster image used without the rights holder's
permission, say — can be reported to abuse@seeonwall.com. The Article 16 EU Digital Services Act
notice-and-action procedure is at https://seeonwall.com/report

== Installation ==

1. Install through the WordPress plugins screen, or upload the files to
   `/wp-content/plugins/seeonwall-for-woocommerce`.
2. Activate it through the "Plugins" screen.
3. Go to WooCommerce → SeeOnWall and click **Connect to SeeOnWall**.

Step by step, with screenshots: https://seeonwall.com/wordpress-setup-guide

== Frequently Asked Questions ==

= Does this cost anything, and what are the limits? =

The plugin is free, and so is the plan it connects you to: a free account is provisioned on
connect, with no card and no expiry. Paid plans buy higher limits, remove the seeonwall.com
attribution from Basic up, add shopper session sharing from Premium up, and drop the monthly view
ceiling on Ultra. Each starts with a 14-day free trial, billed by SeeOnWall directly. Analytics
are on every plan, Free included.

WooCommerce → SeeOnWall shows a live meter for each limit under **Current usage**. Per hour, as
Free / Basic / Premium / Ultra: preview sessions 50 / 500 / 2,500 / 10,000 · photo uploads
20 / 200 / 1,000 / 2,000 · downloads and shares 25 / 250 / 1,000 / 2,000 · poster views
100 / 2,500 / 10,000 / 50,000, plus a monthly view budget of 500 / 5,000 / 25,000 / none. Hitting
a limit never breaks your store — the button still appears and opens, but shoppers who reach the
preview are asked to try again later. Details: https://seeonwall.com/docs

= Which product field sets the poster's physical size? =

WooCommerce's own Dimensions (Product data → Shipping → Width/Height), in your store's dimension
unit. On a variable product each variation's own Dimensions are used, and shoppers get a size
selector inside the preview listing every size you sell. A simple product sold in several sizes
can list them under Product data → SeeOnWall → Print sizes instead. Nothing to type twice.

= Which products show the button, and where does it appear? =

By default, every product with both a width and a height set — on a variable product, at least one
variation with dimensions. Product visibility can make this opt-in per product instead, and any single
product can be switched on or off under Product data → SeeOnWall (or in quick edit and bulk edit). The button
sits right after Add to cart by default; Storefront button offers nine positions on the standard
product template, or set the position to "Place it myself with a shortcode" and write
`[seeonwall_button]` exactly where your theme needs it.

= Which image does the button preview, and what if my photos are mockups? =

By default the product's image. Product data → SeeOnWall lets you pick a different one from the media
library or paste an image URL. If the photo shows the print framed or on a coloured background, mark
the **artwork area** on the same tab — drag a box around the print, with a one-click starting point —
so the preview shows the print at its true size rather than treating the whole mockup as the poster.
The tab also says whether the product shows the button and, if not, exactly why, and WooCommerce →
SeeOnWall → Products lists the whole catalogue by status. For whole catalogues,
the SeeOnWall preview / image / artwork area columns travel through WooCommerce's product CSV
export and import.

= Do previews show the poster in a frame? =

Only if you say so — by default the print is bare and the shopper can add, widen, recolour or
remove a frame. Framing sets a shop-wide default, or list the frames you actually sell in the
SeeOnWall dashboard and shoppers pick from those.

= Which editors, themes and page builders does it work with? =

**Product editor.** The SeeOnWall tab lives in the classic product editor's Product data box,
where every WooCommerce product setting lives. Under WooCommerce's block-based Product Editor
(a beta feature you switch on under WooCommerce → Settings → Advanced → Features) the tab is not
shown; the same per-product settings — button on/off, poster image, artwork area, print sizes —
are reachable from WooCommerce → SeeOnWall → Products, from quick edit and bulk edit on the
products list, and through the CSV columns. A native panel for the block-based editor is planned
for when that editor leaves beta.

**Themes and templates.** The button attaches to WooCommerce's standard product-template hooks,
so it appears on classic themes (Storefront and the like) and on block themes whose Single
Product template keeps the classic template block or the Add to Cart form block — which is how
Twenty Twenty-Five and other block themes ship. A Single Product template rebuilt from product
blocks in the Site Editor has no hooks for "after the price"; put the **SeeOnWall button** block
where you want it instead.

**Page builders.** Elementor gets a native **SeeOnWall button** widget (in the WooCommerce
category when Elementor Pro is present, otherwise under General). Divi, WPBakery, Bricks, Beaver
Builder, Oxygen and every other builder with a shortcode or code element take
`[seeonwall_button]` — set Position to "Place it myself with a shortcode" so no second button
appears. See https://seeonwall.com/docs#woocommerce-hooks

**Versions.** Tested in CI on every change against the two most recent WordPress and WooCommerce
majors — the PHP suite and the browser suite both boot a real WordPress + WooCommerce. The
plugin needs WordPress 6.6+ and WooCommerce 8.0+, and declares HPOS compatibility.

= Can a developer change the button's placement or markup? =

Yes. `seeonwall_button_hook`, `seeonwall_button_priority` and `seeonwall_button_html` filter the
placement and the markup, `seeonwall_poster_width_cm` / `seeonwall_poster_height_cm` override the
size per product, and `SeeOnWall_Storefront::mount_html( $product )` returns the markup for any
product. Reference: https://seeonwall.com/docs#woocommerce-hooks

== Screenshots ==

1. A true-to-scale wall preview with bookmarks and recently viewed posters.
2. The room-scene picker and QR flow.
3. The analytics dashboard.
4. The mobile wall preview.

== Source Code ==

The admin settings page is a small React + TypeScript app. The plugin ships its compiled, minified
output (`assets/js/settings.js`, `assets/css/settings.css`); the human-readable source is under
`src/`, with build instructions in `src/README.md`. Node.js + Vite (`npm install && npm run
build`). React and ReactDOM resolve at runtime to the copies WordPress ships.

== Translations ==

Ships German, Polish, Spanish, French, Italian and Portuguese for the PHP strings and the React
settings screen, following your WordPress admin language including variants such as de_AT, es_MX,
fr_CA, pt_BR and pt_AO. Portuguese is European Portuguese, with Brazilian and Angolan locales
resolving to it rather than to English. translate.wordpress.org translations take precedence.

== Changelog ==

= 1.16.0 =
* **New: a SeeOnWall tab on every product** — whether the button shows, which image the wall
  preview uses, and the artwork inside a mockup photo, with a status card that says why a
  product has no button and offers the fix. The real button is right there to test.
* **New:** pick the poster image from the media library; mark the artwork by dragging a box.
* **New:** list the print sizes of a simple product on the SeeOnWall tab; shoppers pick
  between them in the preview.
* **New: a SeeOnWall button block and an Elementor widget** for templates that don't fire the
  classic hooks.
* **New: a Products tab** under WooCommerce → SeeOnWall — every product with its status and
  the reason, filterable by status, with the button switch inline.
* **New:** switch a single product off; a SeeOnWall column, quick edit, bulk edit and CSV
  columns for whole catalogues.
* **Performance:** product pages never wait for seeonwall.com — the frame catalogue is
  refreshed by a background job, not inside a page render.
* **Security:** the settings page reaches the SeeOnWall backend through named routes, one per
  call, instead of a generic pass-through.
* No action needed. Existing custom fields keep working and appear in the tab.

Older releases are listed in changelog.txt, shipped alongside this file, and at
https://seeonwall.com/changelog

== Upgrade Notice ==

= 1.16.0 =
Adds a SeeOnWall tab to the product editor: button on/off, poster image from the media library,
a drag-to-mark artwork area, and a status card that says why a product has no button. Existing
custom fields keep working.
