=== Vinyl Lettering Designer for WooCommerce ===
Contributors: printen
Tags: woocommerce, vinyl, lettering, stickers, product designer
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 7.4
Requires Plugins: woocommerce
Stable tag: 7.0.10
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Let customers design vinyl lettering in your WooCommerce store: live preview, real size in cm, instant pricing and a cut-ready SVG with every order.

== Description ==

Vinyl Lettering Designer adds a design tool to the WooCommerce products you choose. A customer types a text, picks a font, a material and a colour, sets the size in centimetres and sees the price change while they work. When they order, the design travels with the order line, so you can download the file you need to cut or print it.

Every customer-facing feature has its own switch in the settings. Nothing is locked, there is no licence key and the plugin does not contact the plugin author.

**For your customers**

* Live preview of the design with its real size in cm
* Price per piece that updates as the design changes, with a price breakdown and the next quantity discount
* Start screen with example projects, size by letter height, and a question whether the vinyl goes inside or outside the glass (the cut file is then mirrored)
* Several text layers, a built-in shape library and upload of your own SVG shapes
* Foil colour per text layer and per shape
* Font picker as a grid that previews the customer's own text, using fonts that are bundled with the plugin and served from your own site
* Real-size preview in a scene or on the customer's own photo
* Production check that warns when letters are smaller or lines thinner than the material allows, with one-click fixes
* Share a design by link or email, save designs, and "Design again" from an earlier order in the customer account
* Review step with install kit products, installation help links, photos of installed work that you add yourself, and review stars taken from the product's WooCommerce reviews
* Works on phones, with a full screen mode

**For your shop**

* Setup wizard: business type, material preset, prices and a demo product
* Materials and colours, with presets you can import and prices per dm2
* Pricing: price per area, minimum price, quantity discounts, a surcharge per extra foil colour and an optional rush percentage
* Printed stickers with a background colour or image and a laminate option (off by default; switch it on in the settings)
* Shipping day estimate in the designer, based on your order cut-off time
* Design templates that customers can start from, and a Designer style screen with a live preview to adjust the look of the designer
* Fonts: choose which bundled fonts are offered. Uploading your own font files is available in the admin and, if you switch it on, for customers
* Orders: the design is stored with the order line. Download a cutting file (SVG), a separate SVG per foil colour with registration marks, or a print file (PDF) for printed stickers
* The cart and the cart block show a preview of the design
* Compatible with WooCommerce High-Performance Order Storage and with the cart and checkout blocks
* Translation-ready; translations are delivered by WordPress.org (translate.wordpress.org), and WordPress picks the language

**For developers**

Filters and actions with the prefix `vlld_`, and a small JavaScript object (`window.VLLDDesigner`), let you extend the designer without changing the plugin's files.

== Installation ==

1. Install WooCommerce 8.0 or newer (WordPress 6.5 or newer).
2. Upload the plugin folder to `/wp-content/plugins/` or install it from the Plugins screen, then activate it.
3. Open **Vinyl Lettering** in the admin menu and follow the **Setup wizard**, or go through **Settings**, **Materials** and **Fonts** yourself.
4. Edit a WooCommerce product, open the **Vinyl lettering** tab in the product data and enable the designer. You can also place the designer on any page with the shortcode `[vlld_designer]`.
5. Open the product on your site and try a test order.

== Frequently Asked Questions ==

= Does it work with my theme? =

The designer is added to the product page by WooCommerce hooks and is designed to work with themes that follow the WooCommerce template structure. If your theme builds the product page differently, place the designer with the shortcode `[vlld_designer]`. If something looks wrong, test with a default theme first to see whether the theme is the cause.

= How does the customer set the size? =

The customer sets the letter height or the width and height in centimetres. The preview shows the real size and the price follows from the area and the material you set.

= What file do I get for cutting? =

Each order line with a design has a cutting file in SVG format. You download it from the order screen. When the design uses more than one foil colour you get one SVG per colour, with registration marks. The plugin does not talk to a cutting machine; open the SVG in the cutting software you already use.

= Can I place the designer on any page? =

Yes, with the shortcode `[vlld_designer product_id="123"]`. The shortcode shows one product. If you give a list (`products="1,2"`) only the first product is shown, because two designers on one page would share the same element IDs. On a product page the shortcode needs no attribute.

= Can I set a minimum order quantity? =

Yes: Settings, Pricing, "Min. Order Quantity". The designer, the cart and the checkout all enforce it, also for customers who changed the quantity in the cart.

= Does the designer show prices with or without VAT? =

It follows the WooCommerce setting "Display prices in the shop" (WooCommerce, Settings, Tax). The price panel in the designer shows the same amounts as the product page and the cart.

= Which characters do the bundled fonts support? =

All bundled fonts cover Basic Latin and Latin-1 (Western European languages). 12 of the 27 have practically nothing more (at most four extra characters): ComicSansMS, CourierNew, Garamond, Geneva, Georgia, Helvetica, Impact, Palatino, Tahoma, TimesNewRoman, TrebuchetMS and Verdana (the names of the font files). Two more, PermanentMarker and Satisfy, add only Š, Ž, Ł, Œ and Ÿ. The other 13 also have Latin Extended-A (for example ő, ł and ž). Cyrillic is available in 8 fonts (Arial, Caveat, GreatVibes, Lobster, Montserrat, Oswald, Pacifico and PlayfairDisplay), Greek only in Arial. If a customer types a character the chosen font does not have, the production check names the font and the missing characters and suggests another font. See FONT-LICENSES.txt for the list of font files.

= Why do some fonts have a well-known name plus another name, like "Arimo (Arial-compatible)"? =

The plugin does not contain Arial, Helvetica, Verdana or other fonts that belong to Microsoft, Apple or Monotype. The files with those names are free fonts with similar letter widths, under the SIL Open Font License or Apache License 2.0. The font picker shows the real font name with the font it stands in for. Designs and orders that were made with the old names keep working.

= Can customers upload their own fonts? =

Not by default. Switch on "Allow frontend font upload" in Settings if you want that. Uploaded fonts are checked for type and size. You can always upload fonts yourself on the Fonts screen if "Allow backend font upload" is on.

= Which fonts are included, and does the plugin use Google Fonts? =

The plugin bundles 27 open-licensed fonts (SIL Open Font License and Apache License 2.0) and serves them from your own site. No Google font is switched on by default, and bundled fonts never contact Google. Once an administrator enables a Google font on the Fonts screen, your server asks Google for the font file address, and the visitor's browser loads that font file from fonts.gstatic.com on pages with the designer, which sends the visitor's IP address to Google. See "External services" below.

= Can I turn features off? =

Yes. Every customer-facing feature has its own switch in Settings. A developer can also turn the designer off for a specific product with the filter `vlld_designer_allowed`.

= What happens to my data when I delete the plugin? =

By default only the scheduled tasks and temporary data are removed. Your settings, templates, fonts and saved designs stay. If you switch on "Delete all plugin data when the plugin is deleted" in Settings, Advanced, deleting the plugin also removes its settings, design templates, uploaded fonts, stored cutting files and cart previews, and the designs customers saved. Orders stay in WooCommerce.

= Does it work on multisite? =

The plugin is meant to be activated per site. When you delete it on a multisite network, the clean-up runs for every site in the network: the scheduled tasks and temporary data are always removed, and the rest only for sites where "Delete all plugin data when the plugin is deleted" is switched on.

= Is the plugin available in my language? =

The plugin is translation-ready (text domain `vinyl-lettering-designer`). Translations come from translate.wordpress.org and WordPress installs them automatically for the language of your site. Translations for Dutch, German, French, Spanish and Simplified Chinese exist and will be offered there; anyone can contribute a translation for another language.

= Where is the source code of the bundled scripts? =

See "Source code" below.

== Screenshots ==

1. The designer on a product page: text, font, material, colour and size with a live preview and price.
2. The start screen with example projects.
3. The review step with the price breakdown.
4. The setup wizard.
5. The Fonts screen in the admin.
6. An order line with the download buttons for the cutting file.

== Changelog ==

= 7.0.10 =
**Security hardening, new internal names, custom CSS moved to Additional CSS**

Please make a backup before you update. The update converts your data automatically on the first page load after the update.

Security
* Every admin action and every request that changes data checks its security token (nonce) and the user's permissions. Input is sanitized field by field; the add-to-cart form is no longer passed as a whole to other code.
* The public font list on the REST route only reads stored data and never contacts Google.
* The designer's own stylesheets and scripts are always loaded the WordPress way; the plugin prints no inline style or script blocks. The approximate HTML print file for old printed orders without a PDF is removed; the cut file (SVG) of those orders stays available.

New internal names
* All names the plugin uses in WordPress now start with `vlld` (options, order and product data, templates, scheduled tasks, scripts and styles). Settings, materials, design templates, saved designs, orders and carts are converted automatically, and design files and share links from before the update keep working.
* The shortcode is now `[vlld_designer]`. Pages and posts that use the old shortcode are updated automatically. Widgets and page builders that contain it are not changed: replace the shortcode there yourself.
* Developers: filters, actions, PHP functions and classes, constants, script handles, JavaScript objects and the REST namespace were renamed to the `vlld` prefix, without the old names as aliases. For example, the price filter is now `vlld_calculated_price`, the JavaScript objects are `window.VLLDPricing` and `window.VLLDDesigner`, and the REST namespace is `vlld/v1`. The third parameter of `vlld_cart_item_data` now holds only the fields your panel declares (key `fields` in `vlld_designer_panels`). Update add-ons and theme code before you update.

Custom CSS moved to Additional CSS
* The Designer style screen no longer has a field for custom CSS. CSS you saved there is moved to Additional CSS of your current theme (Appearance > Customize > Additional CSS, or Styles > Additional CSS in the Site Editor), between two comment lines that name the plugin. Additional CSS loads on every page of the site, not only on pages with the designer, so check that your rules only target the designer. If the move fails, a notice on the plugin's screens shows the CSS so you can paste it yourself; the plugin no longer applies it.

Translations
* Translations now come from translate.wordpress.org: the plugin no longer ships its own translation files and no longer loads them itself. WordPress installs the language of your site as soon as it is available there. Until then a shop in another language shows the designer and the admin in English.

Designer and admin
* Faster designer start: the production check runs in the background (a Web Worker) instead of blocking the page, the design preview image is made when the browser is idle, and the core scripts load as one file. When adding to the cart, the designer waits at most 1.5 seconds for the preview image and never uses an old one.
* Notices from the plugin appear only on its own screens and can be dismissed. Only problems that stop the plugin or a too old WooCommerce are also reported on the Plugins screen.

= 7.0.7 =
**Safer uploads, shop settings that are really enforced, a calmer designer**

Security
* Uploaded SVG shapes and saved cutting files are checked element by element: scripts, links, animations, embedded pages and event attributes are refused. Only a plain bitmap image is allowed inside an SVG.
* Template mode (editing a design template on the product page) only works for shop managers with a valid link. Customers can no longer load text or shapes through the URL.
* Colour surcharge and premium font fields that the designer never offered are ignored when they arrive with an order.
* Sharing a design by email has a limit per recipient and for the whole site. The REST routes are tightened and the unused webhooks route is removed.

Shop
* The rush order surcharge is now visible: a "Rush order" line in the cart and on the order, and RUSH in the production notes.
* The minimum order quantity (Settings, Pricing) is enforced in the designer, the cart and the checkout.
* Switching off printed stickers, the laminate option or mirroring is honoured on the server too, not only in the designer. A laminate price of 0 stays 0.
* Prices in the designer follow the WooCommerce tax display setting. A base price per dm² set on the product is used by the designer and by the cart. Older versions saved a base price of 5 on products without ever using it; the update removes those values, so products keep their material price until you set a new base price.
* Product pages that are served from a page cache keep working: the designer asks for a fresh security token when the old one has expired.
* Designs in a cart that a customer kept for days are no longer cleaned up while the cart is still active.
* Guests with a shop session get their own rate limit instead of sharing one with everyone behind the same IP address; without a session the IP address counts. The hourly limits start again at the start of every hour.
* The shortcode `[vinyl_sticker_tool]` loads its own scripts and styles and shows one product. The theme fallback only loads published, visible products.
* The shipping day is calculated in the shop's time zone, with the cut-off time and holidays.
* Installation instructions (Settings, Advanced) are shown on the order confirmation page.

Designer
* Typing in a text layer no longer overwrites the main text. Add to Cart always uses the main layer.
* Ctrl+Z and Ctrl+Y (also Ctrl+Shift+Z) work only inside the designer, no longer in other fields on the page.
* The layer panel updates when something changes instead of every two seconds, and the canvas redraws once per change. Resizing the window and dragging cause fewer redraws.
* Saved drafts no longer fill up the browser storage: a large background image is dropped from the saved copy with a message instead of losing the whole draft.
* "Clear" resets the whole design and all controls: vinyl, laminate, text and background.
* Error messages stay on screen with a Close button. If saving fails because the page was open for a long time, the designer refreshes its security token and tries once more.
* The production check names a font and the characters it has no glyph for, and suggests another font.
* The guided tour is a proper dialog: keyboard focus stays inside, Escape closes it, it respects reduced motion, and its steps only mention features your shop has switched on.
* The text field starts empty with a placeholder; the example text is only shown on the canvas.
* The font picker shows the real font name with the well-known name it replaces, for example "Arimo (Arial-compatible)". Saved designs keep working.

Admin
* The materials form saves its prices again (decimals work), and the setup wizard rounds to two decimals and shows its quote in your unit of measurement.
* Design templates keep their product links when you save, and the product list only offers products with the designer.
* Fonts: fonts uploaded in the admin are shop-wide, uploads by guests are removed after 30 days, the font folder gets a .htaccess that works on Apache 2.4 (Require), and valid font files are no longer rejected by an over-strict content check.
* Removed settings that did nothing: "OpenType font rendering" and a duplicate base price field. Quantity discounts accept decimals between 0 and 100.
* Sizes in the admin and in orders use the locale's number format. The default templates are only created once.

Performance
* The designer script is about 58% smaller (583 KB to 251 KB), the stylesheets about 25% (80 KB to 60 KB and 43 KB to 33 KB). All script and style files of the designer on a product page together went from about 1.2 MB to about 0.5 MB (333 KB to 135 KB compressed).
* The font engine (320 KB) loads only when a font uploaded as OTF or WOFF needs it, and the Paper.js file is no longer preloaded.
* Google font addresses are stored; a product page never waits for a call to Google.

Fonts, compatibility and readme
* Requires WordPress 6.5 and WooCommerce 8.0, and declares compatibility with the cart and checkout blocks.
* Corrected the font claims below (7.0.5) and added which characters each bundled font supports (see the FAQ).
* Corrected the changelogs of 7.0.2 and 7.0.4, and added the FAQ entries about the shortcode, the minimum order quantity and VAT display.

= 7.0.6 =
* Cart: the design preview now has a neutral background that contrasts with the foil, so white or light lettering is no longer invisible (white on white). Works in the classic cart, mini-cart, cart and checkout blocks and on the order page.

= 7.0.5 =
* Faster designer: the default font and the drawing library start loading with the page instead of after the script.
* Bundled fonts are about 33% smaller: characters outside Latin, Latin Extended, Greek, Cyrillic and Vietnamese were removed. A font only keeps the characters it already had, so 12 of the 27 fonts still cover only Basic Latin and Latin-1, plus at most four more characters (see the FAQ). Fonts with a Reserved Font Name are unchanged.
* Price panel: material lines and links now use the panel text colour, so they stay readable on every theme.

= 7.0.4 =
* Inches and millimetres: a size typed in inches stays exactly what you typed (3 in is 3.00 in, rounded to 0.01 in), millimetres show whole numbers, and the canvas labels match the size line.
* New setting "Unit of measurement" (Settings, General): centimetres, millimetres or inches. Before, the unit could only be chosen in the setup wizard.
* Cart, order and production file show sizes in the shop unit, with centimetres in brackets for inch and millimetre shops.
* Phones: the dimension labels at the left and right of the canvas stay inside the canvas, and they are no longer bold.
* Making a letter bigger to meet the minimum size now rounds up to the next size step, so the result no longer ends just below the minimum and gets refused.

= 7.0.3 =
* Google fonts you enable on the Fonts screen now appear in the designer. The visitor's browser loads them from fonts.gstatic.com, as described under External services. If you ticked only Google fonts, the designer now offers exactly those instead of the built-in set.
* Fonts screen: the default font list shows exactly the fonts the designer offers, and a notice explains the built-in set of 27 fonts when no font is ticked.
* If a Google font cannot be loaded, the designer switches to the default font and shows a short message.

= 7.0.2 =
* The start screen ("What are you making?") no longer blocks the designer: it is a compact row of suggestions with a Hide button, and it closes as soon as the customer starts designing.
* The canvas no longer flickers while it redraws, and it only redraws when its size really changes (for example not when a phone's address bar slides away).
* New setting "Canvas on phones" (Settings, General): stays visible at the top (default), scrolls with the page, or opens the full screen editor.
* More room for the options on phones, and a calmer "Where will it be applied?" choice.
* A saved draft is never lost: when you start something new while a draft exists, the draft is kept as "previous design", with a Continue link to switch back.
* Add to Cart, shipping line and "Email me this design" are easier to read and take less space.
* Add to Cart keeps white text: a mid-tone button colour is darkened slightly until it meets WCAG AA; only very light colours get dark text.
* The phone canvas also stays visible in themes that set overflow: hidden on the page wrapper (such as Storefront).

= 7.0.1 =
* "Fit inside an area" shows Max. width and Max. height, with the area and the resulting cut size below the fields.
* Italic text is measured on the actual letter shapes: cut size, price and cut file no longer include extra space from the slant.

= 7.0.0 =
**Free on WordPress.org: no licence layer, safer uninstall, Google Fonts only on request**

* Removed the licence layer: no licence page, no licence key, no daily licence check and no contact with a licence server. Every feature is available and has its own switch in the settings
* Settings that were switched off by the old licence are kept as saved; check Settings, General, Pricing (and Materials for printed stickers)
* Customer font upload ("Allow frontend font upload") is off unless you switch it on. Font upload on the admin Fonts screen follows "Allow backend font upload" in Settings, General
* The background colour and image choice for printed stickers follows "Background panel option" in Settings, General. Off means a white background panel with text
* Removed two unused price calculations: an admin-ajax price action and a REST price route. The cart uses the shared price formula
* New hooks and a JavaScript object for add-ons. The filter that allows the designer per product receives the product ID: return false and WooCommerce shows the theme's own price and add-to-cart button for that product
* Deleting the plugin now removes only what belongs to it. New setting "Delete all plugin data when the plugin is deleted" (Settings, Advanced, off by default); without it only scheduled tasks and temporary data are removed
* New installs no longer switch on any Google font. The Google Fonts list is fetched from Google only when you click "Refresh list from Google", and the template editor no longer loads a Google stylesheet unless a filter for external fonts allows it. Once you enable a Google font, visitors' browsers load that font file from fonts.gstatic.com on pages with the designer (see External services); bundled fonts are served from your own site
* The source of the design core and the font engine now ships in the plugin, with build instructions (see Source code)
* The licence options, the scheduled licence check and its temporary data are removed from the database on update. The licence data of 6.x is removed; going back to 6.x needs re-activation
* New folder and name: install 7.0.0, then deactivate (do not delete) the old Vinyl Sticker Tool plugin; your settings are kept. The two cannot run side by side
* Deleting the old plugin keeps its data unless its own remove-data option was switched on
* New Extensions page in the Vinyl Lettering menu, with one notice that you can dismiss. It shows only on the plugin's own screens

= 6.2.0 =
**Product experience**

* Start screen with example projects, size by letter height, inside or outside the glass (cut mirrored)
* Foil colour per text layer and shape, shape library, an optional surcharge per extra foil colour, and one cut file per colour with registration marks
* Font picker as a grid, price breakdown per piece, next quantity discount and the shipping day in the designer
* Material presets with colour codes, production check with one-click fixes, real-size preview in scenes or on your own photo
* Share, email and save designs, "Design again" in the customer account, full screen designer on phones
* Review step: install kit products, installation help, review stars, photos of installed work and a durability line
* Setup wizard, settings split into tabs, product settings in their own product data tab
* Translations in Dutch, German, French, Spanish and Simplified Chinese

== Upgrade Notice ==

= 7.0.10 =
Back up first. Internal names now start with vlld; settings, orders and pages with the shortcode are converted automatically. Custom CSS moves to Additional CSS. Translations come from translate.wordpress.org. Developers: hooks, classes and script handles were renamed.

= 7.0.7 =
Security and ordering fixes, a faster designer. Needs WordPress 6.5 and WooCommerce 8.0. Back up first. Coming from Vinyl Sticker Tool? Deactivate (do not delete) it; settings are kept. Licence data of 6.x is removed; going back to 6.x needs re-activation.

== External services ==

The plugin does not contact the plugin author and does not send customer data, order data or designs to any third party. Designs are made in the visitor's browser and stored on your own server. The only external service is Google, and only when you use Google Fonts.

**Google Fonts (fonts.googleapis.com)**

No Google font is enabled on a new install. If you enable a Google font on the Fonts screen (Vinyl Lettering, Fonts), your server asks fonts.googleapis.com for the address of that font file, and Google receives your server's IP address and the font family name. This happens when an administrator changes the enabled Google fonts and once a day in the background; the address is stored, so a page view never waits for Google. Bundled fonts and fonts you upload never contact Google. Once an administrator has enabled a Google font, the visitor's browser loads that font file from fonts.gstatic.com on pages with the designer. Google then receives the visitor's IP address and the usual browser request data. Bundled fonts are served from your own site and never contact Google; a shop that enables no Google font sends nothing to Google from its visitors. A developer can also use the filter `vlld_allow_external_fonts` (off by default). With it, the template editor and the product pages with the designer load a stylesheet from fonts.googleapis.com for the enabled Google fonts, and the page adds a preconnect to fonts.googleapis.com and fonts.gstatic.com; the visitor's browser then contacts Google for that stylesheet as well.

Google Fonts: Terms https://policies.google.com/terms, Privacy https://policies.google.com/privacy

**Google Web Fonts Developer API (www.googleapis.com)**

Only when an administrator saves their own Google API key on the Fonts screen and clicks "Refresh list from Google". The plugin then requests the list of font families from the Google Fonts API with that key. Google receives the key and your server's IP address. The list is stored for 30 days. Without a key, or without clicking, nothing is sent.

Google API Terms https://developers.google.com/terms, Privacy https://policies.google.com/privacy

**Font previews in the admin (fonts.googleapis.com)**

On the Fonts screen the previews of Google fonts load only after an administrator clicks "Load previews from Google Fonts". The administrator's browser then requests a stylesheet from fonts.googleapis.com and the font files from fonts.gstatic.com. Terms and privacy: see Google Fonts above.

== Source code ==

The plugin ships these scripts in a compiled form. Their readable source is included in the plugin folder, in `src/`:

* `assets/js/vinyl-core.iife.js` (the design core: text to cut paths, size, SVG and PDF output). Source: `src/vinyl-core/`. Build: `cd src`, `npm install`, `npm run build:core` (uses esbuild). Paper.js is not part of this file.
* `assets/js/vst-font-engine.bundle.js`. Source: `src/js/font-engine.js`. Build: `cd src`, `npm install`, `npm run build:font-engine` (webpack with Babel). It bundles opentype.js (MIT, https://github.com/opentypejs/opentype.js) and Maker.js (Apache License 2.0, https://github.com/microsoft/maker.js, which includes bezier-js, MIT). The versions are in `src/package.json`; the notices of two small helpers are in `assets/js/vst-font-engine.bundle.js.LICENSE.txt`.
* `assets/js/paper-core.min.js` is Paper.js 0.12.18 (MIT). Source: https://github.com/paperjs/paper.js. Its licence is in `assets/js/paper-core.LICENSE.txt`.
* `assets/js/frontend.min.js`, `assets/js/vst-core.min.js` (the pricing formula `assets/js/vst-pricing.js` plus the modules in `assets/js/core/`, in load order), `assets/css/vst.min.css` and `assets/css/vst-experience.min.css` are minified builds of `assets/js/frontend.js`, `assets/js/vst-pricing.js` with the modules in `assets/js/core/`, `assets/css/vst.css` and `assets/css/vst-experience.css`, which ship in the same folders as the readable source. Build: terser 5.51.2 for JavaScript (compress with 2 passes, mangle, licence comments kept) and csso 5.0.5 for CSS (whitespace and comments only: restructuring is switched off, so no rules or fallback declarations are merged or removed). Both are run by `npm run build` (`dev/minify.mjs`) in the development repository, which is not part of the plugin zip; the exact versions are pinned in its `package.json`. The stamp on the first line of each minified file ties it to its sources. No source maps are shipped.
* `assets/js/vst-font-engine.bundle.js` is only loaded when a font uploaded as OTF or WOFF needs it; the bundled fonts and the design core do not use it.

The fonts in `assets/fonts/` are listed with their licences in `assets/fonts/NOTICE.txt` and `FONT-LICENSES.txt`.
