Vanquish Upload Files for WooCommerce - Changelog
=================================================

The complete version history. The readme shows only the most recent versions.

= 2.7.4 =
* Fix (with Vanquish Attach Me 1.8.0 or later): a proof the shop withdrew showed as "Waiting" on the admin order page and as "To approve" to the customer and in the emails. It now reads "Withdrawn" for the shop only, and the customer no longer sees its state.

= 2.7.3 =
* Fix: with another plugin that reads the scheduled tasks early (Really Simple Security, among others), version 2.7.2 stopped the whole site with a fatal error.
* Security: on the order details and Thank you pages, files can be added to a guest's order only from that order's page.
* Fix: when "Replace" was refused (the order changed status, or the file was approved meanwhile), the new file was added next to the old one in a field of one file.
* Fix (Premium): with WooCommerce Table Rate Shipping 3.x calculating per order, an upload field limited to its shipping method never showed in the cart and checkout. The field editor offers its rates one by one again; a rule saved with the whole method keeps all its rates ticked.
* Fix: a "translation loaded too early" notice when another plugin read the scheduled tasks before WordPress was ready.

= 2.7.2 =
* Fix: after uploading the file of a required upload field of one file, the Add to cart button stayed disabled; the "Place order" button of the classic checkout and the warning when leaving the page could still ask for the file. A regression of 2.7.1.
* New: moving from the CodeCanyon version, your own translation of the old plugin (Loco Translate, or a language it did not come with) is used for the texts that did not change, while this plugin has no translation of its own for them. Nothing is copied or changed, and the old plugin does not need to stay installed. See the FAQ "Will my translations of the old plugin carry over?".

= 2.7.1 =
* New: a "Replace" button on an upload field of one file, next to Delete: the customer chooses a new file and it takes the place of the old one, which is removed only once the new one has arrived. On the product, cart and checkout pages always; on the order details and Thank you pages with the rules of Delete ("The customer can delete the files" and the order statuses ticked; with file approval, only a rejected file), and the new file waits for approval again.
* Fix (Premium): in the "Shipping method" visibility rule, the rates of Table Rate Shipping by Bolder Elements and of WooCommerce Table Rate Shipping were never matched on the order details and Thank you pages, and those of WooCommerce Table Rate Shipping calculated per item, line or class not even in the cart and checkout: the upload field stayed hidden.
* Fix: a PHP 8.1+ deprecation notice ("Implicit conversion from float ... to int loses precision") wherever a length of audio or video was shown.
* Translations: the customer texts of the emails and the states of the proofs in German, Spanish, French, Italian, Polish and Portuguese (Brazil).
* Tweak: in the field editor, the section titles stand out from the options. In the General tab, "Rules" is now "Rules and permissions", with the switches to let the customer delete and download the files (they were in "Extras", now "More options").
* Templates changed: upload-form/field.php, order/field.php.

= 2.7.0 =
* New: a new look for the uploaded files in the emails. In WooCommerce's order emails (under each product), in the files block of the shop's "New order" email, in the "new files" notice and in the approval email, every file is a row: its thumbnail or the label of its type, its name (the download link, when the reader may download it), type, pages or length, size and quantity, its approval status and the shop's note. Past 8 files per field, a link to the order. Thumbnails for files kept on your server, on Dropbox and on Google Drive.
* New: the "new files" notice says whether the files came with the order, from the order page or with a quote request, and has the customer's details and a button to the order.
* New: the approval email lists only the files whose status changed, with the shop's note, and links to the order.
* New: plain-text emails get a list of the files, one per line, instead of raw HTML.
* New (with Vanquish Attach Me Premium): the state of each file's proof in the emails.
* Fix: the approval email was not sent at all when one of the fields changed in the same save had its notification turned off.
* Fix: the approval email could show the statuses from before the save.
* Fix: with several recipients of the "new files" notice, the second one got the first one's attachments.
* Fix: on stores that renumber their orders, the order link in the "new files" notice and the order number in the approval email's subject used the order's internal id.
* Tweak: in the field editor, the "Files in the "New order" email" section is now "New order email".
* Templates changed: emails/order-item-uploads.php, emails/admin-new-order-files.php.

= 2.6.1 =
* Fix: the title stored with an upload listed every value of every attribute of the product (for a variation, of its variable product): "Upload your file (PD-6 Material: ..., Color: Black, Graphite, Light grey, ...)". It now names the product, with the attributes only for a simple product when "Display the simple product name with attributes" is on.
* Fix: the uploads summary, the files under the cart items, the admin order page and the quote list show the upload field's title, also for uploads made before this version.
* Templates changed: upload-form/upload-form.php, order/upload-form.php.

= 2.6.0 =
* New: "Send a proof" with Vanquish Attach Me (its Premium, version 1.6.3 or later): a button on each uploaded file on the admin order page opens Attach Me's proof form already filled in, and the state of the proof (to approve, approved, changes requested) is shown next to the file, for the shop and for the customer.
* New: when Attach Me Premium is not installed, one line in the order's "Uploaded files" box presents it; it can be closed for good.
* Fix: the costs of the uploaded files are shown with the shop's decimals and separators ("$1.50", not "$1.5").

= 2.5.0 =
* New: a new look for the uploaded files in the shop. Under each product of the classic cart and checkout, and in the Request a Quote list (Premium), every file is a tile of the same size - an image with its preview, a PDF or any other file with a label of its type - with its size, quantity and cost; past 7 files the others fold into a "+N" tile. Click an image to see it full size in a lightbox.
* New: the summary box (Settings > Appearance) shows the files product by product, then field by field, as tiles. It now comes after the products: after the products table of the classic cart, above the payment of the classic checkout, after the whole block cart and checkout (full width, or under the Upload files block when you placed it in the checkout), and after the order table of the Thank you and order details pages, where each file shows its approval status, the shop's note and a download button. It used to show the files of only one of two products whose upload fields had the same title.
* New: a new look for the upload area. One box per field, with what it accepts on one line; a drop zone that becomes "Add more files" after an upload; the chosen files with a - / + quantity (Premium); one progress bar for the whole field, with the amount sent; the uploaded files as tiles, with delete and download. "Delete uploaded file(s)" is now readable on the block cart and checkout, where it was light text on light grey.
* New (Premium): on the quote's page of Request a Quote, the files are shown as on the order pages.
* Improvement: on the product, cart and checkout pages, deleting a file asks for a confirmation first, as on the order pages.
* Fix: after deleting the last file of an upload field and uploading another, the new file could take the page count of the deleted one (PDF page costs).
* Fix: on the block cart, removing a product left its upload fields on screen until the page was reloaded.
* Tweak: the settings "Thumbnails of the chosen files: size" and "fit" are gone: each chosen file now has a thumbnail of fixed size.
* Templates changed: upload-form/upload-form.php, upload-form/field.php, order/upload-form.php, order/field.php. If your theme has a copy of them, compare it with the new ones (an old copy of upload-form.php still prints the old summary box as well).

= 2.4.0 =
* New (Premium): works with Vanquish Request a Quote for WooCommerce (1.0.3 or newer). The files a customer uploads on the product page go with the product into the quote list, are shown under it there (Request a Quote 1.0.4 or newer) and reach the quote when the request is sent, with the same check of required uploads as the checkout. "Add to quote" waits for the required uploads like "Add to cart", a product that can only be quoted gets the upload area next to its quote button, and "Request a quote for this cart" takes the files of the cart. The customer sees the files on the quote's page, and you on the quote's page in the admin, as for an order.
* Fix: on the classic cart page the file previews and the extra cost lines sat beside the product name instead of under it.
* Fix: no more "WC_Order_Item_Product::offsetSet is deprecated" notice on order pages and in order emails with upload fields, and no empty upload area container in order emails.
* Fix: Settings > Appearance > Several fields per row - with a page switched off, the next page's switch no longer moves into its row.
* Tweak: links to the plugin's page on vanquishplugins.com, and to Request a Quote and Order Approval among the other Vanquish plugins.

= 2.3.0 =
* New: a new look for the uploaded files on the admin order page. Under each order item, every file is a tile of the same size - an image with its preview, a PDF or any other file with a label of its type - with its size and quantity; in the "Uploaded files" box, one compact row per file.
* New: click an image, under an item or in the box, to see it full size in a lightbox, together with the other images of the same upload field (arrow keys, Download). Images stored on Dropbox, Amazon S3 or Google Drive (Premium) open there too.
* Improvement: deleting a file from the "Uploaded files" box no longer reloads the page, so the approvals, notes and other order changes not saved yet are kept. "Delete file(s)" now deletes all the files of an upload field at once, after a confirmation, instead of waiting for the order Update.
* Improvement (Premium): approve or reject a file with one click, change the decision later, undo it before saving, and write the note to the customer right under the file. A yellow line says how many changes are waiting for the order Update button.
* Tweak: the Upload block of the block editor uses the new icon colour.
* Templates changed: admin/order-item-uploads.php. If your theme has a copy of it, compare it with the new one.

= 2.2.0 =
* New (Premium): Compress images. In the Media tab of an upload field, uploaded images can be stored as lighter JPEG files: compressed at the quality you choose (85% by default) and, when you set a longest side, reduced to it - never enlarged, and never heavier than the upload. Photos are turned upright and their metadata (camera, date, GPS position) removed; colour profile and DPI are kept. JPEG photos only by default: "Convert other formats to JPG" adds PNG, WebP, BMP and TIFF, with transparent parts filled with white. Off by default, and best left off if you print the files.
* Tweak: a new header for the upload field editor. The ID and the visibility summary sit in one line above the title, the title reads as plain text until you click it, and the tabs, each with an icon, form the bottom edge of the same card.
* Tweak: messages no longer sit between the tabs and the settings of the upload field editor. A note explaining a tab is shown under the tabs, with that tab only; a one-time notice sits at the top of the tab it is about and can be closed for good - the WPML one is now in the Translations tab.

= 2.1.2 =
* Fix (Premium): with "Separate cart items", the checkout could refuse the order with "requires a minimum of 1 file(s) and a maximum of N file(s)" although the customer had uploaded the files. It happened when the files were uploaded on the product page before the product became a separate cart item, for example when the setting was turned on while customers were shopping.
* Tweak: when a product in the cart no longer matches the "Separate cart items" settings and is removed, the notice now names the product and asks the customer to add it to the cart again, in place of "Invalid item(s) were removed from your cart.".

= 2.1.1 =
* Security (Premium): the Google Drive OAuth file, which holds your Google client secret, no longer stays in the Media Library, where it sat in a public folder. Its content is kept in the plugin settings and the file is deleted: right after you choose it in Settings, or, if you already had it, the first time Google Drive is used. Only shop managers and administrators can upload .json files to the Media Library now.
* Fix: on the product page, the extra costs in the totals counted again the costs of the upload fields shown before.
* Fix (Premium): "Product price × number of files", and an extra cost added to the item price, could be applied twice when another plugin recalculated the cart.
* Tweak: "Place the upload area with a shortcode" now says it applies to the classic cart and checkout only; on the block ones, place the Upload fields block.

= 2.1.0 =
* New: a Settings page with four tabs - General, Appearance, Texts, Separate cart items - in place of the Options, Texts and Repeatable products entries. The settings are grouped in sections with clearer names and help texts, written from what each setting really does. Nothing you have set changes. The plugin menu is now Upload fields, Settings and, in Premium, Cleaner.
* Fix: a product could disappear from a customer's cart, with the notice that its uploaded files had expired, when the files that ANOTHER visitor had uploaded for the same product expired.
* Fix: the first save of the settings could empty the summary box and put the upload fields side by side, on sites that had never saved those settings before.
* Fix: "Show the copies of each file in the cart" (it was "Show the quantity for each upload in the item cart table") had no effect.
* Fix: the files of visitors who had not ordered were deleted after 20 minutes of inactivity, not the 34 the settings showed, until the settings were saved.
* Fix: with "Warn before leaving the page: Only the first time", the OK of any popup of the plugin - a refused file type, for example - turned the warning off.
* Fix: with protected file links on, the file that blocks direct access to an order's folder grew at every page view. It is now written once, with the rule for Apache 2.4 too.
* Fix: the text before the number of repeated products (Texts tab) is used on the order pages and in the emails too, not only in the cart; the customer's note is shown in the emails under every file, not only under images.
* Fix: image previews - square photos were stretched when the two preview sizes differed, and a preview size of 0 hid the file icons. With "Keep the small copies" on, GIF and BMP files had no preview, and the copies were not made again after a size change.
* Fix (Premium): the "Quantity box for each file" switch of an upload field changed only the emails; it now hides the quantity box on the pages too.
* Fix (Premium): with "Crop the photo: On the server" and no Imagick on the server, the customer was left waiting with no buttons. The photo is cropped in the browser then, and the settings say so.
* Fix (Premium): on PHP 8, the email telling the shop that a file could not be sent to Amazon S3 or Dropbox failed with an error, so it never arrived.
* Fix: "Your own button colours" did not reach the PDF Preview button, and the DPI limits were shown in "px".
* Tweak: settings that had no effect are gone from the page (crop area width and height, distance between upload buttons). "How image previews are made" and "Keep the small copies" are now in the free version too; the crop editor settings, the PDF preview, the price per number of files and the layout of the upload form shortcode are shown with Premium only, where they work.
* Tweak: "Place the upload area with a shortcode" (it was "Disable standard upload-field management") is Premium, like the shortcodes it needs: without an active licence it is not applied, so the upload fields are shown again.
* Templates changed: upload-form/field.php, order/field.php, emails/order-item-uploads.php. If your theme has copies of them, compare them with the new ones.

= 2.0.3 =
* Security: the uploads details sheet of an order can now be opened only by shop managers and administrators. Please update.
* Removed: the "Uploaded files" panel in the vendor dashboards of Dokan and DC Multivendor (WC Marketplace). Neither had been maintained for years: the DC Multivendor one no longer ran with current versions of that plugin (now MultiVendorX), and the Dokan one did not show the files of orders split between several vendors. The uploaded files remain available to the shop on the WooCommerce order page.
* Tweak: unused images, scripts and stylesheets removed from the plugin.

= 2.0.2 =
* Fix: on stores using High-Performance Order Storage, a bulk action added to the orders list by another plugin could end on a blank page instead of going back to the list. The plugin's own "Delete uploads" bulk action dropped the address the list returns to for every action that was not its own. "Delete uploads" itself was not affected.

= 2.0.1 =
* Fix: without an active Premium licence - with the free version, or after a licence had expired - an upload field kept obeying the Premium visibility conditions set on it (user role, payment method, shipping method, order status, time), while the section that sets them is no longer in the configurator: a field hidden by one of those conditions stayed hidden, with no way to show it again. The conditions now apply only with an active licence. They are not deleted: they apply again as soon as Premium is active.
* Fix (Premium): the "Time" visibility condition now works on the order details and Thank you pages. "Hide some time after the order" did the opposite of what it says: the upload field was hidden on the product, cart and checkout pages, before any order existed, and was never hidden afterwards. It is now shown until the order is placed, and hidden once that time has passed since the order. "Hide after a date" hid the field on the product, cart and checkout pages only: it now hides it on the order pages too.
* New (Premium): "Hide after a date", in the Time visibility condition, can have a year. With a year the upload field stays hidden after that date; with "every year", as before, it is hidden from that date until the end of the year and comes back on 1 January.

= 2.0.0 =
* New: the upload field configurator has a new interface. Your upload fields are listed on the left - search them, drag them to change their order - and the one you pick opens on the right, with its settings in tabs: General, Visibility, Media, Price & discount, Notifications and, on a site with more than one language, Translations. Each setting has a plain name and a line that says what it does, and a "Search a setting" box finds a setting whichever tab it is in. No setting has been removed: the upload fields you have configured are read and saved as they were.
* New: the configurator says at the top what needs your attention - an upload field that accepts a file type WordPress refuses or a file size above your upload limit, disk space running low - with a link to the field or to the option to change.
* Improvement: the "Change" links of the Upload limits panel open the Options page at the option they are about, and highlight it.
* New (Premium): automatic cleanup. In the Cleaner, "Repeat every day" turns the cleanup you have set up - the files of the orders older than 3 months, 6 months, 1 year or 2 years, with the order statuses you choose - into a rule that runs by itself every night. A box at the top of the page says what the rule does, when it runs next and what the last run deleted, and removes it. The first run is the night after the rule is created.
* Improvement (Premium): the Cleaner works in three steps. It says how many orders match and asks you to confirm before it deletes anything, shows how far it has got, and when the server stops answering it says where it stopped and goes on from there. When the page opens only the closed order statuses - completed, cancelled, refunded, failed - are ticked: they used to be all ticked, orders in progress included.
* Fix (Premium): "Show the price per MB or KB in the cart", in the extra cost per file size, could not be switched off: it came back on at every save.
* Fix: on a site with more than one language, saving the translations of an upload field stored the texts of the main language as the translation of the fields that had none yet, so those fields no longer followed a later change to the main text.
* Fix (Premium): the "Time" visibility rule could not be set to the 31st of a month.
* Fix (Premium): in the "Shipping method" visibility rule, the methods of Table Rate Shipping by Bolder Elements did not stay ticked: they were shown unticked when the configurator was opened again, and lost at the next save.
* Improvement: two bundled libraries the plugin no longer needs - a date picker and a lightbox - have been removed.

= 1.12.2 =
* Fix: saving the upload field configurator without an active Premium licence - with the free version, or after a licence had expired - could store the image crop editor and its options, the low print resolution warning and the HEIC photo conversion as enabled on every upload field. Nothing changed while there was no licence, but those settings were found switched on once a Premium licence became active. If you have recently upgraded to Premium or renewed your licence, open the Media tab of your upload fields and switch off what you did not choose.

= 1.12.1 =
* Fix (Premium): since 1.12.0 an upload field that accepts several files did not work on the product, cart, checkout and shortcode pages: the browser's own "Browse" button appeared under the upload area, and choosing files did nothing - no list of files, no upload button. Fields that accept one file, and the order details and Thank you pages, were not affected. If you copied `upload-form/field.php` into your theme from 1.12.0, copy it again from this version.
* Fix: on the block-based Cart and Checkout, after uploaded files had been deleted once, the delete buttons of the files uploaded afterwards did nothing until the page was reloaded.
* Improvement: on the pages that are not reloaded after an upload - block-based Cart and Checkout, product page, shortcodes - the upload fields are now refreshed once after each upload, instead of once for every upload made since the page was opened.

= 1.12.0 =
* Fix: required uploads are now checked on the block-based Checkout too. Only the classic checkout refused an order with a required upload missing; the block Checkout placed it anyway. It now stops the order with the same messages.
* Fix (Premium): an upload field restricted to products with a given attribute value, and set as required, is now required at the add to cart and at the checkout. It was shown, but never required.
* Fix: an upload field shown for every product variation, placed after a field that is not, saw the variable product instead of the variation in the cart's separate upload area and in the shortcodes: a field restricted to one attribute value appeared for every variation, and its uploads were saved without the variation, so the order details page did not show them in that field.
* Fix: opening the Thank you page of an older order through its link could attach the files currently in the visitor's cart to that order. Files are now attached from that page only for the customer who placed the order: their own order when signed in, or a guest order placed in the last hour or from the same browser session.
* Fix: on the order details and Thank you pages, an upload field shown once for the whole order printed its title twice and an extra box that was never closed, which also squeezed the fields after it.
* Fix: after deleting the file of an upload field shown once for the whole cart, the shortcode page now refreshes the upload area instead of still showing the deleted file.
* Improvement: the upload field templates (`upload-form/upload-form.php`, `upload-form/field.php`, `order/upload-form.php`, `order/field.php`) are much shorter: the field's settings and its visibility rules are now computed by the plugin and shared by every page. If you have copies of these templates in your theme, the plugin's admin pages tell you that they are older than its own.

= 1.11.0 =
* Fix (Premium): an upload field that accepts several files and is shown once for the whole cart or order ("Upload per product" turned off) now shows its minimum and maximum number of files under the upload button, as the fields shown for each product always did.
* Improvement: the markup of a single upload field has a template of its own - `upload-form/field.php` for the product, cart, checkout and shortcode pages, `order/field.php` for the order details and Thank you pages - used both by the fields shown once and by the fields shown for each product. To change how a field looks, copy just that file into your theme instead of the whole upload form. Copies of `upload-form.php` made for earlier versions keep working; the plugin's admin pages tell you they are older than its templates.

= 1.10.0 =
* Improvement: the templates are reorganized in a `templates` folder, by area and with clearer names - `upload-form/upload-form.php` (product, cart, checkout and shortcode), `order/upload-form.php`, `emails/...`, `admin/...`, `global/...`. To customize one, copy it into a `vanquish-upload-files` folder of your theme, keeping its sub-folder. Copies made for earlier versions, in the theme's `wcuf` folder under the old file names, keep working.
* New: the plugin's admin pages list the template copies in your theme that are older than the plugin's templates, or that still use the old file names, so you know which ones to bring up to date.
* Improvement: the upload form of the shortcodes and the server settings error message can now be customized from the theme, like the other templates.
* Fix: a customized crop editor script placed in a child theme was loaded from the parent theme's folder, where it is not.
* Improvement: in the list of the files just selected, the "Upload selected files" button now comes before "Clear selection".

= 1.9.1 =
* Fix: spelling mistakes in ten of the messages customers see while uploading - "Deleting, please wait...", "Are you sure you want to delete the file?", "Too many files", the invalid image, file size and upload error messages, among others. Their German, Spanish, French, Italian, Polish and Brazilian Portuguese translations are rewritten as well, and French apostrophes no longer disappear from them.
* Improvement: the boxes of the uploaded and selected files shrink to fit narrow spaces - a narrow cart table column, a sidebar - instead of spilling over the next column. Wherever there is room they look as before.
* Improvement: on the cart, checkout, order details and shortcode pages, an upload field with the width set in Options - Style ("Display multiple upload fields per row") now shrinks when its column is narrower than that width, and a field at full width no longer reaches past the right edge of its column - which on some themes caused a horizontal scrollbar on phones.
* Improvement: inside a row of the product table (cart, checkout, order details), an upload field always takes the full width of its cell. "Display multiple upload fields per row" now applies only to the separate upload area and the shortcode, where there is room to lay fields side by side.

= 1.9.0 =
* New (Premium): iPhone photos (HEIC). A switch in the Media tab of the upload field converts HEIC and HEIF photos - the format of iPhones and of some Android phones, which most browsers cannot read and WordPress refuses - to JPEG in the customer's browser, as soon as they are chosen. Preview, crop editor and size checks then work as with any JPEG, and the photo keeps its EXIF data (date, camera, DPI). The customer sees a progress bar, with texts you can edit in the Texts menu, and the conversion library is downloaded only when a HEIC photo is actually chosen. Photos picked from an iPhone gallery usually arrive as JPEG already, converted by iOS itself: HEIC files come mostly from computers, where photos were copied from a phone. The upload field configurator warns you when a field converts HEIC photos but does not accept .jpg.
* Improvement: the Texts menu is divided into sections - upload area, messages, errors and warnings, required uploads, images, totals area, shop and cart - and the texts that belong together sit side by side.

= 1.8.3 =
* New: "Additional allowed file types", in Options - Advanced stuff. WordPress refuses any file type outside its own list - EPS and AI artwork, among others - even when an upload field lists it. Extensions added here are accepted for the plugin's uploads only, never in the Media Library. Common print and design formats are recognised (eps, ai, ps, cdr, indd, idml, dxf, dwg, stl, heic, heif), and formats that could run code (php, html, js, svg, exe and similar) are never accepted. The upload field configurator now warns you when a field lists a file type WordPress would refuse.
* Improvement: a file refused because of its type now tells the customer so ("This file type is not allowed", editable in the Texts menu) instead of showing the generic upload error.
* Improvement: on themes that lay out the quantity and the add to cart button as a single row (The7, among others), the product page upload area now takes a full-width line of its own instead of being squeezed beside the button.
* Improvement: the save bar of the settings pages stays at the bottom of the window also when the page is short.
* Improvement: the warning popup has a close button, and closes with the Esc key too.

= 1.8.2 =
* Fix: on the product page the plugin could make visible an add to cart button that the theme or another plugin keeps hidden on purpose - for example an Elementor widget hidden on desktop or on mobile - so the button appeared twice. It now shows again, or enables again, only the buttons it hid or disabled itself while a required upload is missing, and never re-enables a button disabled by someone else.
* Improvement: the save button of the Options, Texts and Repeatable products pages and of the upload field configurator now stays in sight at the bottom of the window while you scroll, with an "Unsaved changes" note when something has been changed.

= 1.8.1 =
* New (Premium): a "Suggest a feature" page in the plugin menu, between Account and Support Forum. It shows your license key and the email of your purchase, ready to copy, and opens the suggestion form on our support site.
* Improvement: Freemius SDK updated to 2.13.5.

= 1.8.0 =
* Security: the "Max file size" of an upload field is now enforced by the server as well. Until now only the browser checked it, so a request built by hand could send a file of any size, a piece at a time.
* New (Premium): upload protection, in Options - Advanced stuff. An upload limit per visitor (3 GB per hour by default, counted by IP address) and a minimum free disk space (1 GB by default) below which uploads are refused, so nobody can fill your server's disk through the upload fields. The customer sees a message you can word in the Texts menu, and every refusal is written to the Debug log. Shop managers are never limited.
* New: an "Upload limits" panel at the top of the upload field configurator - the server's upload limits, the temp files clear interval, the free disk space and, in Premium, the upload protection - with a warning when an upload field accepts more than a visitor may upload in an hour.
* New: custom colours for the buttons of the upload area - background and text, normal and on mouse over - in Style (General). Off by default, so nothing changes until you switch it on.
* Improvement: "Options" is now the last entry of the plugin menu.

= 1.7.0 =
* New (Premium): show or hide an upload field by product tag and by brand, next to categories, products and attribute values. Brands appear when the site has them (WooCommerce 9.6 or later).
* New (Premium): a file name pattern in Options. Uploaded files are renamed when they are saved to the order, from placeholders such as {order_number}, {sku}, {product_name}, {field_title} and {file_number} - for example 1234-TSHIRT-Logo-2.png - so the files of an order are recognisable once downloaded. Leave it empty to keep the customer's file names. A renamed file never overwrites another one with the same name.
* Improvement (Premium): the Product restriction section of the upload field configurator is simpler. The five-choice list becomes three buttons - every product, only the products below, every product except the ones below - and "including subcategories" is now a switch under the categories. Existing rules are kept as they are.
* Fix (Premium): saving the upload field configurator without an active licence emptied the category, product and attribute lists of a Product restriction rule, so the rule matched nothing once the licence was active again.

= 1.6.3 =
* New: a "Visual editor" button next to every upload field setting that accepts HTML - the description, the text shown after an upload, the text field description and the disclaimer, in the field and in the Translations tab. It opens the WordPress editor in a window, with bold, links, lists and alignment, and writes the result back into the field when you click Apply. The HTML stays editable by hand in the field as before.
* Fix: on the page of a product sold individually, removing that product from the mini cart left the upload fields set up for a copy of the product that was no longer in the cart, so a file uploaded right after seemed to vanish. The page now reloads itself when that product leaves the cart, without resending the add-to-cart form.

= 1.6.2 =
* Improvement (Premium): the libraries bundled for Dropbox, Amazon S3 and Google Drive now live under the plugin's own namespace. Many plugins ship the same HTTP library (Guzzle) in their own version, and until now whichever copy loaded first was used by everyone - which could break cloud uploads, or another plugin, depending on the order plugins were loaded in. Each copy is now private, so neither can replace the other. The libraries are also updated to current versions of their HTTP components, which removes known security advisories from them.
* Fix: the summary box on the Cart and Checkout pages could list the files of a product that had already been removed from the cart, and wrote two PHP warnings to the log every time it was shown.

= 1.6.1 =
* Fix: on themes with their own cart template, the cart page could stop with a critical error on PHP 8 ("Cannot access offset of type string on string" in Cart.php). Some cart templates hand different data to the hook the plugin uses to show the uploads under each product; the plugin now finds the cart item by itself, and leaves that row alone instead of failing when it cannot. Reported by a customer.
* Fix (Premium): with Dropbox storage, PHP versions from 7.4 to 8.1 stopped with "Composer detected issues in your platform: Your Composer dependencies require a PHP version >= 8.2.0". The Dropbox library bundled with the plugin had been built for PHP 8.2; it is now built for PHP 7.4, the plugin's minimum, like the Google Drive and Amazon S3 ones, and on current versions of its dependencies. Reported by a customer.
* For sites using WPML: the upload field texts, translated in the plugin's own Translations tab since 1.3.17, are now removed from WPML String Translation, where they had been kept only as a safety copy. Before removing them the plugin copies over once more whatever String Translation still holds that the Translations tab does not have, and it never replaces a text written in the Translations tab. It happens once, the first time an administrator opens an admin page after updating.
* Fix: for sites using WPML, two kinds of translation had not been carried over to the Translations tab in 1.3.17 and are now recovered by the step above: the label of the upload field's text field, and every text of languages whose WPML code is longer than two letters, such as Brazilian Portuguese (pt-br). The label's translation had never been shown on the site at all.
* Removed the "Show warning alert on Upload files configurator page" option, which no longer had any effect.
* Minor wording improvements in the upload field configurator.

= 1.6.0 =
* New: on the Order details and Thank you pages, the upload fields of each product can now be shown in a separate area instead of inside the order items table, as was already possible on the Cart and Checkout pages. Turn on "Display the upload fields in a separate area" under Options - Fields positioning - Order details / Thank you page. On themes that leave little room to the product column of that table, the upload fields no longer have to squeeze into it, and the order receipt is no longer interrupted by them. Off by default, so nothing changes until you choose. Requested by a customer.
* New: the upload area of the Order details and Thank you pages can be placed after the customer details, i.e. after the billing and shipping addresses at the very end of the order receipt.
* The Fields positioning options are now grouped by page - Product page, Cart, Checkout, Order details / Thank you page - and each position setting says what it places: the order upload fields always, the product upload fields when they are shown in a separate area.

= 1.5.2 =
* Fix: deleting an order permanently now deletes its uploaded files as well. On stores using WooCommerce's High-Performance Order Storage an order is no longer a WordPress post, so the clean-up never ran and the files stayed on the server - with audio files that can add up to gigabytes. Moving an order to the Trash still keeps its files, so that it can be restored. Reported by a customer.
* When uploads are deleted - from the order list, the order screen, the Cleaner or by deleting the order - the folders they leave empty are now removed straight away, instead of waiting for the hourly clean-up.
* The Debug log now records each file deleted, and says so when a file could not be deleted and is still on disk.
* Fix: in the order screen, long file names no longer run over the image thumbnails beside them and the Quantity line below, and the audio player in the Uploaded files box no longer spills out of it. Reported by a customer.
* The Uploaded files box in the order screen now uses the same WordPress admin blue as the rest of the plugin's screens: its file names, links and buttons had stayed purple.

= 1.5.1 =
* Fix: when an upload starts, the page now scrolls to its progress bar if the bar is out of sight. The bar sits at the top of the upload field, so with several files already listed under it an upload started from the bottom of the field ran far above the part of the page being looked at, with no sign that anything was happening. When the bar is already on screen the page does not move. Reported by a customer.

= 1.5.0 =
* New: a light or dark colour scheme for the upload boxes, under Options - Style (General). The boxes around uploaded files, the list of selected files and the totals have a background of their own; on a site with a dark theme, choose Dark and they blend in with the page instead of standing out as light panels. The audio player and the quantity field inside them follow the scheme too. Light is the default, so nothing changes until you choose. Requested by a customer.
* Audio and video files in the list of uploaded files now have a box as wide as the list. At the width of an image thumbnail the audio player was so compressed that its seek bar was a few pixels long, too short to move to another point of the track, and long file names wrapped over several lines. Images keep their grid of thumbnails. Reported by a customer.

= 1.4.1 =
* Fix: on a dark theme, the file names in the upload boxes were almost invisible - light text on a light box. Those boxes have a light background of their own but took the text colour from the theme; they now set it too, as do the totals box and the quantity field. Nothing changes on light themes. Reported by a customer.
* The button under the list of files a customer has just selected now reads "Clear selection" instead of "Delete uploaded file(s)": it only empties the selection, and nothing has been uploaded yet at that point. It has its own entry in the Texts menu. If you had changed the old text, give this one your wording too.
* Improved (Premium): with multiple files per field, the "Upload selected files" button above the list is now shown only when the list is too long for the one below it to be on screen at the same time. On a short list the two looked like the same interface appearing twice.

= 1.4.0 =
* Fix: files uploaded on the product page could be deleted before the customer had bought anything, when a payment button sits on that page - WooCommerce PayPal Payments is the one it was found with. To show the right price, such a button puts the product in a cart and takes it out again every time the product form changes, and the plugin took that for the customer removing the product from their cart: it deleted the uploads, files included. An audio file stopped playing after a second, an image could no longer be downloaded, and the order arrived with nothing attached. Removing a product from the cart still deletes its uploads, exactly as before. Reported by a customer.
* Fix: an order could end up without its files when it was paid through a button on the product page, or when a theme or page builder had replaced the Thank You page. Both association methods wait for one WooCommerce event each, and those flows skip them. The files are now also attached when the customer reaches the Thank You page, before the page itself is drawn, whatever it then shows - and only when the order has no files yet.
* The Debug log now also records when uploads are deleted because their product left the cart, and no longer reports a failure when a Thank You page is simply reloaded after the files were attached.

= 1.3.21 =
* New: a Debug log option, under Options - Advanced stuff. When uploaded files do not reach an order, it records what happened along the way: when each file was saved, which order events WooCommerce fired and in what kind of request, whether the customer's uploads were still reachable at each one, and whether they were attached. It is written to WooCommerce - Status - Logs, so it can be read and downloaded from the admin, with nothing to change in wp-config.php. Off by default.
* The messages about attaching files to an order, added in 1.3.19, now go to that log instead of the PHP debug log.

= 1.3.20 =
* New: the thumbnails in the list of files a customer has just selected can now all be shown at the same size, lining up as an even grid. Until now each one kept its own proportions, so a portrait photo made a tall thumbnail and a landscape photo a short one. Set a size in pixels under Options - Style (General), and choose whether the thumbnail fills the square or shows the whole photo with space at the sides - the second is the one to pick when customers upload portraits of people. Leave the size at 0 to keep things exactly as they are. Requested by a customer.
* A long file name in that list no longer pushes its entry taller than the ones beside it: names are now shown on at most two lines, with an ellipsis. Camera file names are long enough that this was the normal case, and it left the list looking uneven even when the thumbnails were not.

= 1.3.19 =
* When WP_DEBUG is enabled, the plugin now writes to the debug log what happened when an order was placed: whether the uploads were attached to it, and if not, why. Until now that step was silent in every case, so an association that failed and one that was never attempted looked exactly the same - an order with no files and an empty log. If files are not reaching your orders, this is the first place to look.

= 1.3.18 =
* Fix (Premium): the image crop editor could end up taller than the browser window, leaving its buttons below the fold and a scrollbar down the side of the page - most noticeably with portrait photos. It now takes the height that is actually left on screen, and on a short screen it stops shrinking at a size that is still usable to crop in. Reported by a customer.

= 1.3.17 =
* New: the texts of an upload field - title, description, disclaimer and the others - are now translated from the field itself, in a new Translations tab with one box per language. They used to be editable only through WPML String Translation, which meant that without WPML they could not be translated at all; they now work with Polylang too, or with nothing but WordPress.
* If you use WPML, your existing translations are moved over by themselves, the first time you open the admin. Nothing is removed from WPML: the old strings stay where they are, they are simply no longer what the site reads.
* Fix: the discount description of an upload field could be translated, but the translation was never used and the original showed in every language.
* The settings that accept HTML are now shown in a monospace font, with the spell checker off.

= 1.3.16 =
* New (Premium): an optional warning when an image has too few pixels for the size it is meant to be printed at. In the crop editor it updates live, as the customer moves the crop area, so it reacts to what is actually being selected; on fields without the crop editor it is shown once, on the whole image. It never blocks the upload. Switch it on in the Media tab of the upload field, and word it from the Texts menu.
* The upload field configurator now says where its texts are translated when WPML is installed, with a link to the right page.

= 1.3.15 =
* Fix (Premium): in the image crop editor, a crop size with the width set and the height left at zero gave a square crop area instead of a freely resizable one.
* Fix (Premium): the labelled buttons of the image crop editor now have white text, like the icon buttons beside them.

= 1.3.14 =
* Fix: uploads could fail on servers where PHP accepts less than 10 MB per request, because the plugin compared PHP's upload limits as text instead of as sizes and picked the wrong one.
* Fix: the delete confirmation added in 1.3.13 is now translated into German, Spanish, French, Italian, Polish and Portuguese.

= 1.3.13 =
* Improvement: customers are now asked to confirm before deleting a file from their order, on the Order details and Thank you pages. Administrators have always been asked; customers, who are the ones likely to reach for the wrong file, were not. Files that have just been uploaded and do not belong to the order yet are still removed without a question, since undoing one costs nothing but uploading it again. Suggested by a user.

= 1.3.12 =
* Fix (Premium): files were not reaching Google Drive on PHP 7.4. The connection worked and the folders were created, but the transfer of the file itself failed and the file stayed on the server. The cause was a conflict between plugins rather than anything in your settings: a component the plugin uses reported an internal deprecation notice through a function shared by every plugin on the site, and if another plugin had already supplied a newer version of that function, built for PHP 8.1, the call failed on PHP 7.4. The plugin no longer depends on that shared function during an upload. Reported by a user.
* Fix: on order pages with an uploaded file, two PHP notices per file were written to the debug log on every page load. Nothing was broken by them, but a log full of noise makes real problems harder to see.

= 1.3.11 =
* Fix (Premium): Google Drive did not work on PHP 7.4, although the plugin requires PHP 7.4 and advertises Google Drive as a premium feature. The Google library the plugin carries had been built for PHP 8.1, so renewing the connection to Drive ended the request with a fatal error on any site running 7.4. The library is now built for PHP 7.4, as it always should have been. Reported by a user.
* Fix (Premium): connecting to Google Drive could stop working and leave nothing behind but a fatal error in the log. Several causes at once: the stored connection was thrown away whenever the Auth code was changed - which is what anyone does to try and fix a Drive problem - and it was not saved at all when Google answered without a refresh token, which is what happens when an account authorises the plugin a second time. On top of that, the JSON file downloaded from the current Google Cloud console no longer contains the redirect address the connection needs, so a correctly configured account failed too. Reported by a user.
* Improvement (Premium): the plugin now asks Google only for the files it creates itself, rather than for access to your whole Drive. Existing connections are unaffected and keep working; a new connection gets the narrower permission, and Google no longer shows the "unverified app" warning while setting it up. The setup guide has been shortened accordingly.
* Fix (Premium): when a cloud service could not be reached, the upload ended in a fatal error instead of doing what it was written to do - keep the file on the server and email the shop administrator. Affected Google Drive, Dropbox and Amazon S3 alike.
* Improvement (Premium): the Google credentials of your shop are no longer sent to the authorisation page as part of the web address, where web servers record them in their logs. They travel in the body of the request instead.
* Fix: the Download / View button appeared in English in German, Spanish, French, Polish and Portuguese after its label was shortened in 1.3.10.

= 1.3.10 =
* Fix (Premium): the number of pages of a PDF was counted wrongly, in two different ways. On files written in the modern compressed format the count came out as one whatever the document; on the others it could be taken from the table of bookmarks instead of the page tree, so a fourteen-page document was charged as six. Reported by a user.
* Fix: PDF files never showed a thumbnail. The attribute naming the file to draw was being removed from the markup before it reached the browser.
* Fix: activating the premium version while the free one was still active ended in "The plugin could not be activated because it triggered a fatal error", with nothing written to the log. The two copies now notice each other and the notice says which one to deactivate. Reported by a user.
* Improvement: the Download and Preview buttons under an uploaded file are now the same kind of control, the same size, and each on its own line. In the block-based Cart and Checkout the download control used to render as a plain link rather than a button.

= 1.3.9 =
* Security (Premium): the PDF preview no longer depends on the bundled flipbook library. That library carried its own copy of the PDF rendering engine, dating from 2019, which a published advisory covers: opening a specially crafted PDF could run JavaScript in the context of your site. The files this plugin previews arrive from strangers and are opened by you, so the component has been replaced with the current, maintained PDF.js viewer. Two further precautions come with it - the part that executes JavaScript embedded in a PDF is not shipped at all, and the setting that would enable it is switched off. Thumbnails were never affected: they already used a current version.
* Improvement (Premium): the preview now opens the whole document, with page navigation, text search, zoom and printing. The page-turning animation is gone, and everything it let you do you can still do.
* Fix (Premium): PDFs written in the modern format - anything from PDF 1.5 onwards, which is most of what current software produces - could be counted as having zero pages. With page detection enabled that became a quantity of zero, and the customer could not add the product to the cart at all, with nothing on screen explaining why. Reported by a user.
* Fix: every upload of every type was read into memory in full to look for PDF pages, even when no page count was needed, and even in the free version where the setting that uses it does not exist.
* Improvement: 4.7 MB of debugging files were being shipped to every site and no longer are.

= 1.3.8 =
* Improvement (Premium): on the upload fields screen, the visibility summary is now a column of its own, and it says which way the rule points. A field restricted to a few categories and a field hidden from those same categories used to show the same list of names; the summary now states whether the names are where the field appears or where it does not, and colours them to match. A rule that selects nothing at all now says so, instead of reading as no restriction. Product ids moved from the list into a tooltip, so the summary reads as names.
* Improvement (Premium): the Edit link on that summary opens the field options straight at the Product/Category restriction section, instead of leaving you to find it.
* Fix: the two "Add new Upload Field" buttons on the same screen were styled differently.

= 1.3.7 =
* Fix: the plugin no longer fills the WordPress debug log with a "translation loading was triggered too early" notice. Nothing was broken by it, but the line was written for every admin page and for every file a customer uploaded, which on a busy store buries whatever you were actually trying to read in the log.
* Housekeeping: the declared "WooCommerce tested up to" version now names the release the plugin was really tested against, instead of a number set far in the future.

= 1.3.6 =
* Security: deleting an uploaded file, or editing the note attached to it, now requires proof that the request comes from the order it belongs to. The plugin accepts the shop manager, the signed-in customer who placed the order, or a visitor holding that order's own link - the same check WooCommerce uses for the order links it sends by email. Until now these actions only verified that the request had been made from a page of the site, which every visitor can obtain, so files attached to someone else's order could be removed or altered. Thanks to Brian for reporting this privately. Updating is recommended for every store.

= 1.3.5 =
* Fix: uploads are now verified from end to end. The plugin checks that every part of a file really reached the server and was written to disk, that the reassembled file is exactly the size the browser sent, and it confirms each step explicitly instead of assuming it worked. Before this, a part lost on the way - to a firewall, a proxy, a full disk - could go unnoticed and produce a damaged file with no warning shown to the customer, and a file the plugin had itself refused could end the upload in silence. Retrying a file also used to add the new attempt on top of the incomplete one; it now starts the file cleanly.

= 1.3.4 =
* Fix: on sites that merge, combine or defer JavaScript, the upload area could fail to appear on the product page. It was most visible on variable products, where choosing a variation left an empty gap where the upload field should be. The plugin relied on one of WordPress's own script libraries being loaded before its own; when an optimisation plugin changed that order, the plugin's script stopped at its first line and nothing after it ran, uploads included. The plugin now works whether that library is there or not, and no longer needs it.

= 1.3.3 =
* New (Premium): an "Activate License" page in the plugin menu, shown when the Premium version is installed but no licence has been activated yet. Until now the only way in was a link on the Plugins screen, which is easy to walk past - and if it was missed, the settings kept showing "Upgrade to Pro" to someone who had already paid. The page disappears by itself once a licence is active. The free version is not affected.

= 1.3.2 =
* Fix (Premium): a PHP fatal error - "Call to undefined function vanupfi_fs()" - when WordPress is loaded through WP-CLI or with WooCommerce not active. Server control panels such as Plesk WP Toolkit use WP-CLI for updates, backups and cache resets, so those tasks failed while the site itself kept working normally, which made it easy to miss. The free version was never affected.

= 1.3.1 =
* New: an "Activate Premium" page, in the plugin menu and linked from the Plugins screen, explaining how to move to Premium after buying it. The free version published on WordPress.org does not contain the premium code at all, so it has no licence field and a key would have nothing to unlock - Premium is a separate download instead. That is easy to miss once you have paid, so the page walks through signing in to your Freemius account, downloading the Premium .zip and installing it, and confirms that your upload fields, your options and the files already uploaded on existing orders are all kept.

= 1.3.0 =
* Change: extra costs per uploaded file, extra costs per second of audio or video, and the order sub-total discount now apply only while a Premium licence is active. They are Premium features, and the free version does not show the screen on which they could be seen or turned off - so a shop whose licence had lapsed kept charging customers, or kept handing out the discount, on the strength of a setting nobody could reach any more. If that describes your shop, those charges stop with this update. Nothing is deleted: every amount and option is kept exactly as it was and starts applying again as soon as Premium is active.
* Fix: saving the upload field configurator without an active licence no longer erases the Premium settings of your upload fields. Those sections are not displayed without a licence, so saving the page - even just to change a field title - was storing them as switched off, and the crop settings, visibility rules, size and DPI limits and every cost amount were lost for good; renewing did not bring them back. They are now left untouched.
* New: if upload charges are configured while no licence is active, the plugin now says so once in the WordPress admin, so the change is explained instead of silent.

= 1.2.0 =
* New (Premium): extra costs can now be charged based on the size of the uploaded file. Set a price per MB (or per KB), optionally with an amount that is not charged and a cap beyond which nothing more is added. Available in the upload field configurator, under "Price, fee & discount". The charge applies only while a Premium licence is active; if the licence lapses the charge stops instead of continuing with no way to adjust or remove it, and the configuration is kept for when Premium is active again.
* Fix: in the classic cart and checkout, the "Total extra costs" line could show zero. It is now taken from the same calculation that produces the cart fees, so it no longer depends on where the upload area is positioned on the page.
* Fix: the extra cost per second was shown next to each file but was not counted in the Totals area. Charged amounts were always correct; only that summary line was incomplete.
* Improvement: the plugin admin screens now use the WordPress admin colour scheme.

= 1.1.0 =
* Fix: on the free version, an upload field restricted to selected products or categories (a setting that comes from the Premium visibility rules, typically after migrating from a Premium install) stayed hidden on every other product, with no way to change it. Such fields are now shown on all products. The original restriction is preserved and applies again automatically as soon as Premium is active.

= 1.0.17 =
* Minor improvements.

= 1.0.16 =
* Minor improvements.

= 1.0.15 =
* Fix: resolved a PHP 8 fatal error on the product/cart/checkout and order pages that could occur when the "Info to report in the Totals area" option had no value saved. Array-type options are now always handled safely.
* Fix: the uploaded-files summary box now renders the file list correctly (with names, previews and download links) instead of showing raw HTML text.
* Hardening: the summary box display setting is treated defensively to avoid any edge-case error.

= 1.0.14 =
* Fix: resolved a PHP 8 fatal error on the product page (and cart/checkout) that could occur when the "Disable standard upload-field management" option had no value saved. The option is now always treated as a list, so the pages render correctly.

= 1.0.13 =
* Fix: on WordPress 6.7+, activating the plugin could break front-end product pages (a "translation loaded too early" notice printed into the page). The admin settings screens are no longer built on front-end requests, which resolves this and also speeds up front-end page loads.
* Internal: removed a small piece of unused, unreachable code.

= 1.0.12 =
* Fix: leftover pieces of interrupted uploads were not being cleaned up from the temporary folder. They are now removed once they are more than two hours old.
* Fix: the temporary-file cleanup can no longer remove a file that a shopper has already uploaded and is still using during the same visit.
* Improvement: the clean-up of uploads whose product was removed from the cart no longer runs as a side effect of the cart fee calculation, which makes it predictable and removes a class of edge cases around order completion.
* Internal: removed a leftover admin endpoint (and its unused scripts) from the days when the plugin asked to restore the classic Cart/Checkout templates. Blocks have been supported since 1.0.4.

= 1.0.11 =
* Fix: the upload-form shortcodes are now always registered, so WordPress no longer prints the raw `[vanupfi_...]` tag on the storefront when the Premium code is not active. Store administrators see a short explanation instead; visitors see nothing.
* Improvement: the legacy `[wcuf_...]` shortcodes from the CodeCanyon version now work as aliases of the current `[vanupfi_...]` ones, so migrated sites do not need to edit their product content.

= 1.0.10 =
* Fix: uploaded files could be lost (neither moved to the destination folder nor attached to the order) when placing an order through the classic/shortcode checkout while the "Checkout - Files to order association method" option was set to the "Thank you page" value. Files are now correctly associated across all checkout types.
* Fix: resolved a PHP 8 fatal error ("Unsupported operand types") that could occur on some configurations while rendering the frontend styles.
* Improvement: more robust parsing of the server PHP size limits (post_max_size / upload_max_filesize) and general dead-code cleanup.

= 1.0.9 =
* Internal: updated the HTTP library (Guzzle) bundled with the premium cloud-storage integrations to v7, to prevent version conflicts with other plugins. No functional changes to the free version.

= 1.0.8 =
* Internal: Updated the Freemius SDK to the latest version.

= 1.0.7 =
* Internal: PSR-4 SPL autoloader for the plugin classes; bootstrap simplified and dead code removed. No functional or user-facing changes.

= 1.0.6 =
* Fixed: in the free version the upload area did not appear on the Cart block; it now loads correctly.

= 1.0.5 =
* Fixed: on some block-based (FSE) themes the upload area did not appear on the Cart block; the upload fields now load correctly there. The Checkout block was unaffected.

= 1.0.4 =
* WooCommerce Cart/Checkout blocks: upload fields now work with the block-based cart and checkout, in addition to the classic (shortcode) templates.

= 1.0.3 =
* Internal refactor: introduced PSR-4 namespacing and dropped the legacy class-name prefixes. No functional or user-facing changes.

= 1.0.2 =
* First public release on WordPress.org.
