{"id":276027,"date":"2026-01-25T21:46:29","date_gmt":"2026-01-25T21:46:29","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/opentype-stylist\/"},"modified":"2026-09-29T13:50:33","modified_gmt":"2026-09-29T13:50:33","slug":"typography-stylist","status":"publish","type":"plugin","link":"https:\/\/ibo.wordpress.org\/plugins\/typography-stylist\/","author":23409562,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.3.0","stable_tag":"2.3.0","tested":"7.1.2","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Typography Stylist","header_author":"Matthew Cowan","header_description":"Add advanced OpenType features (ligatures, stylistic sets, swashes) to headlines with inline text selection and live preview.","assets_banners_color":"000000","last_updated":"2026-09-29 13:50:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/typography-stylist\/","header_author_uri":"https:\/\/mnc4.com","rating":0,"author_block_rating":0,"active_installs":10,"downloads":1561,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.3":{"tag":"1.1.3","author":"matthewneilcowan","date":"2026-01-25 21:45:54","revision":3446689},"1.1.4":{"tag":"1.1.4","author":"matthewneilcowan","date":"2026-01-26 20:08:05","revision":3447351},"1.1.5":{"tag":"1.1.5","author":"matthewneilcowan","date":"2026-01-29 13:38:17","revision":3449671},"1.1.6":{"tag":"1.1.6","author":"matthewneilcowan","date":"2026-02-05 14:52:05","revision":3454725},"1.1.7":{"tag":"1.1.7","author":"matthewneilcowan","date":"2026-02-08 18:23:34","revision":3456492},"1.1.8":{"tag":"1.1.8","author":"matthewneilcowan","date":"2026-02-08 18:41:29","revision":3456497},"1.1.9":{"tag":"1.1.9","author":"matthewneilcowan","date":"2026-02-11 16:20:32","revision":3459124},"1.2.0":{"tag":"1.2.0","author":"matthewneilcowan","date":"2026-02-23 14:54:44","revision":3467803},"1.2.1":{"tag":"1.2.1","author":"matthewneilcowan","date":"2026-02-23 14:55:35","revision":3467805},"1.2.2":{"tag":"1.2.2","author":"matthewneilcowan","date":"2026-05-29 20:12:09","revision":3554154},"2.0.0":{"tag":"2.0.0","author":"matthewneilcowan","date":"2026-06-22 15:51:12","revision":3582018},"2.0.1":{"tag":"2.0.1","author":"matthewneilcowan","date":"2026-06-22 21:39:03","revision":3582401},"2.1.1":{"tag":"2.1.1","author":"matthewneilcowan","date":"2026-07-23 17:10:10","revision":3620314},"2.1.2":{"tag":"2.1.2","author":"matthewneilcowan","date":"2026-07-24 19:36:14","revision":3621860},"2.2.0":{"tag":"2.2.0","author":"matthewneilcowan","date":"2026-07-27 15:30:25","revision":3624805},"2.2.1":{"tag":"2.2.1","author":"matthewneilcowan","date":"2026-07-28 16:01:33","revision":3626177},"2.2.2":{"tag":"2.2.2","author":"matthewneilcowan","date":"2026-07-30 13:46:21","revision":3628673},"2.2.3":{"tag":"2.2.3","author":"matthewneilcowan","date":"2026-08-04 18:34:25","revision":3634496},"2.3.0":{"tag":"2.3.0","author":"matthewneilcowan","date":"2026-09-29 13:50:33","revision":3719177}},"upgrade_notice":{"2.3.0":"<p>Adds built-in Paragraph Styles with a visual style browser, optional Glyphs and Paragraph Styles toolbar buttons, a no-reload settings page, and a round of screen-reader, keyboard and rendering fixes across both editors. No data migration.<\/p>","2.2.3":"<p>Adds per-selection relative size and vertical shift inside Fit-to-width blocks \u2014 shrink a glyph relative to its fitted line and nudge it up or down, while every line keeps filling the block width exactly.<\/p>","2.2.2":"<p>Adds fit-to-width sizing (each line fills the block width, zero frontend JS), scopes Quick Feature Toggle axis changes to the selected text, and fixes Font Library-registered fonts falling back to system fonts on the frontend.<\/p>","2.2.1":"<p>Fixes variable-font axes being mixed up between fonts uploaded in the same ZIP. If a font is showing the wrong axes, open Settings \u2192 Typography Stylist \u2192 Custom Fonts and use &quot;Detect Axes from Font File&quot; to repair it.<\/p>","2.2.0":"<p>Font Style (visual italic) controls, italic-aware previews and glyph browsing, and a major editor-reliability batch \u2014 selections, conversions, glyph alternates, and variable-font axes all behave predictably now.<\/p>","2.1.2":"<p>Newly added fonts now enable only the weights they actually ship, with a one-click auto-detect for existing fonts; also fixes Glyphs Panel browsing for variable fonts from font-only ZIPs.<\/p>","2.1.1":"<p>Re-release of the 2.1.0 feature set with corrected packaging \u2014 the 2.1.0 download never contained the new files. Update to get variable fonts, font-only ZIP uploads, and WordPress Font Library integration.<\/p>","2.1.0":"<p>Font kit uploads now accept ZIPs containing only font files (e.g. Google Fonts downloads) \u2014 the @font-face stylesheet is generated automatically from the fonts&#039; metadata. Adds WordPress Font Library integration (register uploaded fonts, adopt Library fonts in the editor), variable font support, and a <code>typost_force_enqueue_font_ids<\/code> filter for theme-driven font loading. Also fixes Adobe\/custom\/Library fonts not rendering inside the iframed block editor canvas. Existing content and settings are preserved.<\/p>","2.0.1":"<p>Fixes mixed-content blocking of locally-hosted fonts in the Glyphs Panel on HTTPS sites.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3620314,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3620314,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3620314,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3620314,"resolution":"772x250","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3719366,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Typography Stylist\",\"description\":\"Try OpenType features, the Glyphs Panel, and variable font controls in the block editor.\",\"author\":\"matthewneilcowan\",\"categories\":[\"typography\",\"editor\"]},\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"typography-stylist\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require_once '\\\/wordpress\\\/wp-load.php'; update_option('typost_auto_register_wp_fonts', false); $sources = array('style-script.ttf' => 'https:\\\/\\\/raw.githubusercontent.com\\\/google\\\/fonts\\\/main\\\/ofl\\\/stylescript\\\/StyleScript-Regular.ttf', 'eb-garamond.ttf' => 'https:\\\/\\\/raw.githubusercontent.com\\\/google\\\/fonts\\\/main\\\/ofl\\\/ebgaramond\\\/EBGaramond%5Bwght%5D.ttf', 'eb-garamond-italic.ttf' => 'https:\\\/\\\/raw.githubusercontent.com\\\/google\\\/fonts\\\/main\\\/ofl\\\/ebgaramond\\\/EBGaramond-Italic%5Bwght%5D.ttf', 'fraunces.ttf' => 'https:\\\/\\\/raw.githubusercontent.com\\\/google\\\/fonts\\\/main\\\/ofl\\\/fraunces\\\/Fraunces%5BSOFT%2CWONK%2Copsz%2Cwght%5D.ttf'); $zip_path = get_temp_dir() . 'typost-demo-fonts.zip'; $zip = new ZipArchive(); if (true === $zip->open($zip_path, ZipArchive::CREATE | ZipArchive::OVERWRITE)) { foreach ($sources as $fname => $url) { $resp = wp_remote_get($url, array('timeout' => 120)); if (!is_wp_error($resp) && 200 === (int) wp_remote_retrieve_response_code($resp)) { $zip->addFromString($fname, wp_remote_retrieve_body($resp)); } } $zip->close(); $typost = Typost::get_instance(); $entries = $typost->process_font_kit_zip(array('tmp_name' => $zip_path, 'name' => 'demo-fonts.zip', 'size' => filesize($zip_path), 'error' => 0, 'type' => 'application\\\/zip'), 'demo-fonts'); if (!is_wp_error($entries) && !empty($entries)) { $fonts = $typost->get_custom_fonts(); foreach ($entries as $entry) { $fonts[] = $entry; } update_option('typost_custom_fonts', $fonts); do_action('typost_font_uploaded', $entries); } }\"},{\"step\":\"runPHP\",\"code\":\"<?php require_once '\\\/wordpress\\\/wp-load.php'; wp_set_current_user(1); kses_remove_filters(); update_user_meta(1, 'wp_persisted_preferences', array('core\\\/edit-post' => array('welcomeGuide' => false), 'core' => array('welcomeGuide' => false), '_modified' => gmdate('c'))); $ids = array(); foreach ((array) get_option('typost_custom_fonts', array()) as $font) { if (isset($font['name'], $font['font_id'])) { $ids[$font['name']] = (int) $font['font_id']; } } $content = base64_decode('PCEtLSB3cDpncm91cCB7ImNsYXNzTmFtZSI6ImlzLXN0eWxlLXNlY3Rpb24tNSBhbGlnbmZ1bGwiLCJzdHlsZSI6eyJzcGFjaW5nIjp7InBhZGRpbmciOnsidG9wIjoidmFyOnByZXNldHxzcGFjaW5nfDQwIiwiYm90dG9tIjoidmFyOnByZXNldHxzcGFjaW5nfDQwIn0sIm1hcmdpbiI6eyJ0b3AiOiIwIiwiYm90dG9tIjoidmFyOnByZXNldHxzcGFjaW5nfDMwIn0sImJsb2NrR2FwIjoiMCJ9fSwibGF5b3V0Ijp7InR5cGUiOiJjb25zdHJhaW5lZCJ9fSAtLT4KPGRpdiBjbGFzcz0id3AtYmxvY2stZ3JvdXAgaXMtc3R5bGUtc2VjdGlvbi01IGFsaWduZnVsbCIgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOnZhcigtLXdwLS1wcmVzZXQtLXNwYWNpbmctLTMwKTtwYWRkaW5nLXRvcDp2YXIoLS13cC0tcHJlc2V0LS1zcGFjaW5nLS00MCk7cGFkZGluZy1ib3R0b206dmFyKC0td3AtLXByZXNldC0tc3BhY2luZy0tNDApIj48IS0tIHdwOnR5cG9zdC9ibG9jayB7ImNvbnRlbnQiOiJcdTAwM2NzcGFuIGRhdGEtZm9udC1pZD1cdTAwMjJfX1RZUE9TVF9GUkFfX1x1MDAyMiBkYXRhLWxpbmVoZWlnaHQ9XHUwMDIyMlx1MDAyMiBzdHlsZT1cdTAwMjJmb250LWZhbWlseTogdmFyKFx1MDAyZFx1MDAyZGZvbnQtX19UWVBPU1RfRlJBX18pOyBsaW5lLWhlaWdodDogMlx1MDAyMiBjbGFzcz1cdTAwMjJ0eXBvc3Qtc3R5bGVkXHUwMDIyXHUwMDNlWW91IGFyZSBpbnZpdGVkIHRvIHRoZSB3ZWRkaW5nIG9mXHUwMDNjL3NwYW5cdTAwM2VcdTAwM2Niclx1MDAzZVx1MDAzY3NwYW4gZGF0YS1mb250LWlkPVx1MDAyMl9fVFlQT1NUX1NUWV9fXHUwMDIyIGRhdGEtZm9udHdlaWdodD1cdTAwMjI0MDBcdTAwMjIgZGF0YS1mZWF0dXJlLXNldHRpbmdzPVx1MDAyMlx1MDAyNnF1b3Q7YWFsdFx1MDAyNnF1b3Q7IDdcdTAwMjIgc3R5bGU9XHUwMDIyZm9udC1mZWF0dXJlLXNldHRpbmdzOiBcdTAwMjZxdW90O2FhbHRcdTAwMjZxdW90OyA3OyBmb250LWZhbWlseTogdmFyKFx1MDAyZFx1MDAyZGZvbnQtX19UWVBPU1RfU1RZX18pOyBmb250LXdlaWdodDogNDAwO1x1MDAyMiBjbGFzcz1cdTAwMjJ0eXBvc3Qtc3R5bGVkXHUwMDIyXHUwMDNlQVx1MDAzYy9zcGFuXHUwMDNlXHUwMDNjc3BhbiBkYXRhLWZvbnQtaWQ9XHUwMDIyX19UWVBPU1RfU1RZX19cdTAwMjIgZGF0YS1mb250d2VpZ2h0PVx1MDAyMjQwMFx1MDAyMiBkYXRhLWZlYXR1cmUtc2V0dGluZ3M9XHUwMDIyXHUwMDI2cXVvdDthYWx0XHUwMDI2cXVvdDsgMTRcdTAwMjIgc3R5bGU9XHUwMDIyZm9udC1mZWF0dXJlLXNldHRpbmdzOiBcdTAwMjZxdW90O2FhbHRcdTAwMjZxdW90OyAxNDsgZm9udC1mYW1pbHk6IHZhcihcdTAwMmRcdTAwMmRmb250LV9fVFlQT1NUX1NUWV9fKTsgZm9udC13ZWlnaHQ6IDQwMDtcdTAwMjIgY2xhc3M9XHUwMDIydHlwb3N0LXN0eWxlZFx1MDAyMlx1MDAzZXBcdTAwM2Mvc3Bhblx1MDAzZVx1MDAzY3NwYW4gZGF0YS1mb250LWlkPVx1MDAyMl9fVFlQT1NUX1NUWV9fXHUwMDIyIHN0eWxlPVx1MDAyMmZvbnQtZmFtaWx5OiB2YXIoXHUwMDJkXHUwMDJkZm9udC1fX1RZUE9TVF9TVFlfXyk7XHUwMDIyIGNsYXNzPVx1MDAyMnR5cG9zdC1zdHlsZWRcdTAwMjJcdTAwM2VyaVx1MDAzYy9zcGFuXHUwMDNlXHUwMDNjc3BhbiBkYXRhLWZvbnQtaWQ9XHUwMDIyX19UWVBPU1RfU1RZX19cdTAwMjIgZGF0YS1mb250d2VpZ2h0PVx1MDAyMjQwMFx1MDAyMiBkYXRhLWZlYXR1cmUtc2V0dGluZ3M9XHUwMDIyXHUwMDI2cXVvdDthYWx0XHUwMDI2cXVvdDsgMlx1MDAyMiBzdHlsZT1cdTAwMjJmb250LWZlYXR1cmUtc2V0dGluZ3M6IFx1MDAyNnF1b3Q7YWFsdFx1MDAyNnF1b3Q7IDI7IGZvbnQtZmFtaWx5OiB2YXIoXHUwMDJkXHUwMDJkZm9udC1fX1RZUE9TVF9TVFlfXyk7IGZvbnQtd2VpZ2h0OiA0MDA7XHUwMDIyIGNsYXNzPVx1MDAyMnR5cG9zdC1zdHlsZWRcdTAwMjJcdTAwM2VsXHUwMDNjL3NwYW5cdTAwM2VcdTAwM2NzcGFuIGRhdGEtZm9udC1pZD1cdTAwMjJfX1RZUE9TVF9TVFlfX1x1MDAyMiBzdHlsZT1cdTAwMjJmb250LWZhbWlseTogdmFyKFx1MDAyZFx1MDAyZGZvbnQtX19UWVBPU1RfU1RZX18pO1x1MDAyMiBjbGFzcz1cdTAwMjJ0eXBvc3Qtc3R5bGVkXHUwMDIyXHUwMDNlIFx1MDAzYy9zcGFuXHUwMDNlXHUwMDNjc3BhbiBkYXRhLWZvbnQtaWQ9XHUwMDIyX19UWVBPU1RfU1RZX19cdTAwMjIgZGF0YS1mb250d2VpZ2h0PVx1MDAyMjQwMFx1MDAyMiBzdHlsZT1cdTAwMjJmb250LWZhbWlseTogdmFyKFx1MDAyZFx1MDAyZGZvbnQtX19UWVBPU1RfU1RZX18pOyBmb250LXdlaWdodDogNDAwOyBsaW5lLWhlaWdodDogMS41OyBsZXR0ZXItc3BhY2luZzogLTAuMTczZW07IGZvbnQtc2l6ZTogMC44NWVtOyB2ZXJ0aWNhbC1hbGlnbjogMC4yZW1cdTAwMjIgY2xhc3M9XHUwMDIydHlwb3N0LXN0eWxlZFx1MDAyMiBkYXRhLWxpbmVoZWlnaHQ9XHUwMDIyMS41XHUwMDIyIGRhdGEtbGV0dGVyc3BhY2luZz1cdTAwMjItMTczXHUwMDIyIGRhdGEtZml0c2NhbGU9XHUwMDIyMC44NVx1MDAyMiBkYXRhLWZpdHNoaWZ0PVx1MDAyMjAuMlx1MDAyMlx1MDAzZVx1MDAyNmFtcDtcdTAwM2Mvc3Bhblx1MDAzZVx1MDAzY3NwYW4gZGF0YS1mb250LWlkPVx1MDAyMl9fVFlQT1NUX1NUWV9fXHUwMDIyIGRhdGEtZm9udHdlaWdodD1cdTAwMjI0MDBcdTAwMjIgZGF0YS1sZXR0ZXJzcGFjaW5nPVx1MDAyMjUwXHUwMDIyIGRhdGEtZmVhdHVyZS1zZXR0aW5ncz1cdTAwMjJcdTAwMjZxdW90O2FhbHRcdTAwMjZxdW90OyA1XHUwMDIyIHN0eWxlPVx1MDAyMmZvbnQtZmVhdHVyZS1zZXR0aW5nczogXHUwMDI2cXVvdDthYWx0XHUwMDI2cXVvdDsgNTsgZm9udC1mYW1pbHk6IHZhcihcdTAwMmRcdTAwMmRmb250LV9fVFlQT1NUX1NUWV9fKTsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcdTAwMjIgY2xhc3M9XHUwMDIydHlwb3N0LXN0eWxlZFx1MDAyMlx1MDAzZVx1MDAyNm5ic3A7XHUwMDNjL3NwYW5cdTAwM2VcdTAwM2NzcGFuIGRhdGEtZm9udC1pZD1cdTAwMjJfX1RZUE9TVF9TVFlfX1x1MDAyMiBkYXRhLWZvbnR3ZWlnaHQ9XHUwMDIyNDAwXHUwMDIyIGRhdGEtbGV0dGVyc3BhY2luZz1cdTAwMjI1MFx1MDAyMiBkYXRhLWZlYXR1cmUtc2V0dGluZ3M9XHUwMDIyXHUwMDI2cXVvdDthYWx0XHUwMDI2cXVvdDsgNVx1MDAyMiBzdHlsZT1cdTAwMjJmb250LWZlYXR1cmUtc2V0dGluZ3M6IFx1MDAyNnF1b3Q7YWFsdFx1MDAyNnF1b3Q7IDU7IGZvbnQtZmFtaWx5OiB2YXIoXHUwMDJkXHUwMDJkZm9udC1fX1RZUE9TVF9TVFlfXyk7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XHUwMDIyIGNsYXNzPVx1MDAyMnR5cG9zdC1zdHlsZWRcdTAwMjJcdTAwM2VBXHUwMDNjL3NwYW5cdTAwM2VcdTAwM2NzcGFuIGRhdGEtZm9udC1pZD1cdTAwMjJfX1RZUE9TVF9TVFlfX1x1MDAyMiBzdHlsZT1cdTAwMjJmb250LWZhbWlseTogdmFyKFx1MDAyZFx1MDAyZGZvbnQtX19UWVBPU1RfU1RZX18pO1x1MDAyMiBjbGFzcz1cdTAwMjJ0eXBvc3Qtc3R5bGVkXHUwMDIyXHUwMDNlbmRcdTAwM2Mvc3Bhblx1MDAzZVx1MDAzY3NwYW4gZGF0YS1mZWF0dXJlcz1cdTAwMjJzd3NoXHUwMDIyIGRhdGEtZm9udC1pZD1cdTAwMjJfX1RZUE9TVF9TVFlfX1x1MDAyMiBkYXRhLWZvbnR3ZWlnaHQ9XHUwMDIyNDAwXHUwMDIyIHN0eWxlPVx1MDAyMmZvbnQtZmVhdHVyZS1zZXR0aW5nczogXHUwMDI2cXVvdDtzd3NoXHUwMDI2cXVvdDs7IGZvbnQtZmFtaWx5OiB2YXIoXHUwMDJkXHUwMDJkZm9udC1fX1RZUE9TVF9TVFlfXyk7IGZvbnQtd2VpZ2h0OiA0MDA7XHUwMDIyIGNsYXNzPVx1MDAyMnR5cG9zdC1zdHlsZWRcdTAwMjJcdTAwM2V5XHUwMDNjL3NwYW5cdTAwM2VcdTAwM2Niclx1MDAzZVx1MDAzY3NwYW4gZGF0YS1mb250LWlkPVx1MDAyMl9fVFlQT1NUX0ZSQV9fXHUwMDIyIHN0eWxlPVx1MDAyMmZvbnQtZmFtaWx5OiB2YXIoXHUwMDJkXHUwMDJkZm9udC1fX1RZUE9TVF9GUkFfXyk7IGxpbmUtaGVpZ2h0OiAzXHUwMDIyIGNsYXNzPVx1MDAyMnR5cG9zdC1zdHlsZWRcdTAwMjIgZGF0YS1saW5laGVpZ2h0PVx1MDAyMjNcdTAwMjJcdTAwM2VGZWJydWFyeSAzMSwgMjAyNyB8IFBhd25lZSwgSW5kaWFuYVx1MDAzYy9zcGFuXHUwMDNlIiwidGFnTmFtZSI6ImgxIiwiZm9udFNpemUiOiJmaXQiLCJmaXRMaW5lU2l6ZXMiOlswLjA2MzksMC4xOTAxLDAuMDU4M10sInRleHRBbGlnbiI6ImNlbnRlciIsImZvbnRWYXJpYXRpb25TZXR0aW5ncyI6Ilx1MDAyMndnaHRcdTAwMjIgNTAwIn0gLS0+CjxkaXYgY2xhc3M9IndwLWJsb2NrLXR5cG9zdCI+PGgxIGNsYXNzPSJ2aXN1YWxseS1oaWRkZW4iPllvdSBhcmUgaW52aXRlZCB0byB0aGUgd2VkZGluZyBvZiBBcHJpbCAmYW1wOyZuYnNwO0FuZHkgRmVicnVhcnkgMzEsIDIwMjcgfCBQYXduZWUsIEluZGlhbmE8L2gxPjxoMSBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZTpjbGFtcCgxNnB4LCAycmVtICsgM3Z3LCA2NHB4KTtmb250LXZhcmlhdGlvbi1zZXR0aW5nczomcXVvdDt3Z2h0JnF1b3Q7IDUwMDt0ZXh0LWFsaWduOmNlbnRlciIgY2xhc3M9InR5cG9zdC1zdHlsZWQgdHlwb3N0LWZpdCIgYXJpYS1oaWRkZW49InRydWUiPjxzcGFuIGNsYXNzPSJ0eXBvc3QtbGluZSIgc3R5bGU9ImZvbnQtc2l6ZTpjYWxjKDAuMDYzOSAqIDEwMGNxaSkiPjxzcGFuIGRhdGEtZm9udC1pZD0iX19UWVBPU1RfRlJBX18iIGRhdGEtbGluZWhlaWdodD0iMiIgc3R5bGU9ImZvbnQtZmFtaWx5OiB2YXIoLS1mb250LV9fVFlQT1NUX0ZSQV9fKTsgbGluZS1oZWlnaHQ6IDIiIGNsYXNzPSJ0eXBvc3Qtc3R5bGVkIj5Zb3UgYXJlIGludml0ZWQgdG8gdGhlIHdlZGRpbmcgb2Y8L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPSJ0eXBvc3QtbGluZSIgc3R5bGU9ImZvbnQtc2l6ZTpjYWxjKDAuMTkwMSAqIDEwMGNxaSkiPjxzcGFuIGRhdGEtZm9udC1pZD0iX19UWVBPU1RfU1RZX18iIGRhdGEtZm9udHdlaWdodD0iNDAwIiBkYXRhLWZlYXR1cmUtc2V0dGluZ3M9IiZxdW90O2FhbHQmcXVvdDsgNyIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczogJnF1b3Q7YWFsdCZxdW90OyA3OyBmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9TVFlfXyk7IGZvbnQtd2VpZ2h0OiA0MDA7IiBjbGFzcz0idHlwb3N0LXN0eWxlZCI+QTwvc3Bhbj48c3BhbiBkYXRhLWZvbnQtaWQ9Il9fVFlQT1NUX1NUWV9fIiBkYXRhLWZvbnR3ZWlnaHQ9IjQwMCIgZGF0YS1mZWF0dXJlLXNldHRpbmdzPSImcXVvdDthYWx0JnF1b3Q7IDE0IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOiAmcXVvdDthYWx0JnF1b3Q7IDE0OyBmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9TVFlfXyk7IGZvbnQtd2VpZ2h0OiA0MDA7IiBjbGFzcz0idHlwb3N0LXN0eWxlZCI+cDwvc3Bhbj48c3BhbiBkYXRhLWZvbnQtaWQ9Il9fVFlQT1NUX1NUWV9fIiBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtX19UWVBPU1RfU1RZX18pOyIgY2xhc3M9InR5cG9zdC1zdHlsZWQiPnJpPC9zcGFuPjxzcGFuIGRhdGEtZm9udC1pZD0iX19UWVBPU1RfU1RZX18iIGRhdGEtZm9udHdlaWdodD0iNDAwIiBkYXRhLWZlYXR1cmUtc2V0dGluZ3M9IiZxdW90O2FhbHQmcXVvdDsgMiIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczogJnF1b3Q7YWFsdCZxdW90OyAyOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9TVFlfXyk7IGZvbnQtd2VpZ2h0OiA0MDA7IiBjbGFzcz0idHlwb3N0LXN0eWxlZCI+bDwvc3Bhbj48c3BhbiBkYXRhLWZvbnQtaWQ9Il9fVFlQT1NUX1NUWV9fIiBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtX19UWVBPU1RfU1RZX18pOyIgY2xhc3M9InR5cG9zdC1zdHlsZWQiPiA8L3NwYW4+PHNwYW4gZGF0YS1mb250LWlkPSJfX1RZUE9TVF9TVFlfXyIgZGF0YS1mb250d2VpZ2h0PSI0MDAiIHN0eWxlPSJmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9TVFlfXyk7IGZvbnQtd2VpZ2h0OiA0MDA7IGxpbmUtaGVpZ2h0OiAxLjU7IGxldHRlci1zcGFjaW5nOiAtMC4xNzNlbTsgZm9udC1zaXplOiAwLjg1ZW07IHZlcnRpY2FsLWFsaWduOiAwLjJlbSIgY2xhc3M9InR5cG9zdC1zdHlsZWQiIGRhdGEtbGluZWhlaWdodD0iMS41IiBkYXRhLWxldHRlcnNwYWNpbmc9Ii0xNzMiIGRhdGEtZml0c2NhbGU9IjAuODUiIGRhdGEtZml0c2hpZnQ9IjAuMiI+JmFtcDs8L3NwYW4+PHNwYW4gZGF0YS1mb250LWlkPSJfX1RZUE9TVF9TVFlfXyIgZGF0YS1mb250d2VpZ2h0PSI0MDAiIGRhdGEtbGV0dGVyc3BhY2luZz0iNTAiIGRhdGEtZmVhdHVyZS1zZXR0aW5ncz0iJnF1b3Q7YWFsdCZxdW90OyA1IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOiAmcXVvdDthYWx0JnF1b3Q7IDU7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LV9fVFlQT1NUX1NUWV9fKTsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsiIGNsYXNzPSJ0eXBvc3Qtc3R5bGVkIj4mbmJzcDs8L3NwYW4+PHNwYW4gZGF0YS1mb250LWlkPSJfX1RZUE9TVF9TVFlfXyIgZGF0YS1mb250d2VpZ2h0PSI0MDAiIGRhdGEtbGV0dGVyc3BhY2luZz0iNTAiIGRhdGEtZmVhdHVyZS1zZXR0aW5ncz0iJnF1b3Q7YWFsdCZxdW90OyA1IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOiAmcXVvdDthYWx0JnF1b3Q7IDU7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LV9fVFlQT1NUX1NUWV9fKTsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsiIGNsYXNzPSJ0eXBvc3Qtc3R5bGVkIj5BPC9zcGFuPjxzcGFuIGRhdGEtZm9udC1pZD0iX19UWVBPU1RfU1RZX18iIHN0eWxlPSJmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9TVFlfXyk7IiBjbGFzcz0idHlwb3N0LXN0eWxlZCI+bmQ8L3NwYW4+PHNwYW4gZGF0YS1mZWF0dXJlcz0ic3dzaCIgZGF0YS1mb250LWlkPSJfX1RZUE9TVF9TVFlfXyIgZGF0YS1mb250d2VpZ2h0PSI0MDAiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6ICZxdW90O3N3c2gmcXVvdDs7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LV9fVFlQT1NUX1NUWV9fKTsgZm9udC13ZWlnaHQ6IDQwMDsiIGNsYXNzPSJ0eXBvc3Qtc3R5bGVkIj55PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz0idHlwb3N0LWxpbmUiIHN0eWxlPSJmb250LXNpemU6Y2FsYygwLjA1ODMgKiAxMDBjcWkpIj48c3BhbiBkYXRhLWZvbnQtaWQ9Il9fVFlQT1NUX0ZSQV9fIiBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtX19UWVBPU1RfRlJBX18pOyBsaW5lLWhlaWdodDogMyIgY2xhc3M9InR5cG9zdC1zdHlsZWQiIGRhdGEtbGluZWhlaWdodD0iMyI+RmVicnVhcnkgMzEsIDIwMjcgfCBQYXduZWUsIEluZGlhbmE8L3NwYW4+PC9zcGFuPjwvaDE+PC9kaXY+CjwhLS0gL3dwOnR5cG9zdC9ibG9jayAtLT48L2Rpdj4KPCEtLSAvd3A6Z3JvdXAgLS0+Cgo8IS0tIHdwOmhlYWRpbmcgLS0+CjxoMiBjbGFzcz0id3AtYmxvY2staGVhZGluZyI+PHNwYW4gZGF0YS1mZWF0dXJlcz0ic3dzaCIgZGF0YS1mb250PSJFQiBHYXJhbW9uZCIgZGF0YS1mb250LWlkPSJfX1RZUE9TVF9FQkdfXyIgZGF0YS1mb250d2VpZ2h0PSI3MDAiIGRhdGEtZmVhdHVyZS1zZXR0aW5ncz0iJnF1b3Q7YWFsdCZxdW90OyA3LCAmcXVvdDtzd3NoJnF1b3Q7IDEiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6ICZxdW90O2FhbHQmcXVvdDsgNywgJnF1b3Q7c3dzaCZxdW90OyAxOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9FQkdfXyk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc3R5bGU6IGl0YWxpYyIgZGF0YS1mb250c3R5bGU9Iml0YWxpYyIgY2xhc3M9InR5cG9zdC1zdHlsZWQiPkE8L3NwYW4+PHNwYW4gZGF0YS1mb250PSJFQiBHYXJhbW9uZCIgZGF0YS1mb250LWlkPSJfX1RZUE9TVF9FQkdfXyIgZGF0YS1mb250d2VpZ2h0PSI3MDAiIHN0eWxlPSJmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9FQkdfXyk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc3R5bGU6IGl0YWxpYyIgZGF0YS1mb250c3R5bGU9Iml0YWxpYyIgY2xhc3M9InR5cG9zdC1zdHlsZWQiPiA8L3NwYW4+PHNwYW4gZGF0YS1mb250LWlkPSJfX1RZUE9TVF9FQkdfXyIgZGF0YS1mb250d2VpZ2h0PSI3MDAiIHN0eWxlPSJmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9FQkdfXyk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc3R5bGU6IGl0YWxpYyIgZGF0YS1mb250c3R5bGU9Iml0YWxpYyIgY2xhc3M9InR5cG9zdC1zdHlsZWQiPkw8L3NwYW4+PHNwYW4gZGF0YS1mb250PSJFQiBHYXJhbW9uZCIgZGF0YS1mb250LWlkPSJfX1RZUE9TVF9FQkdfXyIgZGF0YS1mb250d2VpZ2h0PSI3MDAiIHN0eWxlPSJmb250LWZhbWlseTogdmFyKC0tZm9udC1fX1RZUE9TVF9FQkdfXyk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc3R5bGU6IGl0YWxpYyIgZGF0YS1mb250c3R5bGU9Iml0YWxpYyIgY2xhc3M9InR5cG9zdC1zdHlsZWQiPm92ZSA8L3NwYW4+PHNwYW4gZGF0YS1mZWF0dXJlLXNldHRpbmdzPSImcXVvdDthYWx0JnF1b3Q7IDYiIGRhdGEtZm9udC1pZD0iX19UWVBPU1RfRUJHX18iIGRhdGEtZm9udHdlaWdodD0iNzAwIiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOiAmcXVvdDthYWx0JnF1b3Q7IDY7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LV9fVFlQT1NUX0VCR19fKTsgZm9udC13ZWlnaHQ6IDcwMDsgZm9udC1zdHlsZTogaXRhbGljIiBkYXRhLWZvbnRzdHlsZT0iaXRhbGljIiBjbGFzcz0idHlwb3N0LXN0eWxlZCI+Uzwvc3Bhbj48c3BhbiBkYXRhLWZvbnQ9IkVCIEdhcmFtb25kIiBkYXRhLWZvbnQtaWQ9Il9fVFlQT1NUX0VCR19fIiBkYXRhLWZvbnR3ZWlnaHQ9IjcwMCIgc3R5bGU9ImZvbnQtZmFtaWx5OiB2YXIoLS1mb250LV9fVFlQT1NUX0VCR19fKTsgZm9udC13ZWlnaHQ6IDcwMDsgZm9udC1zdHlsZTogaXRhbGljIiBkYXRhLWZvbnRzdHlsZT0iaXRhbGljIiBjbGFzcz0idHlwb3N0LXN0eWxlZCI+dG9yeSBMaWtlIDwvc3Bhbj48c3BhbiBkYXRhLWZlYXR1cmUtc2V0dGluZ3M9IiZxdW90O2FhbHQmcXVvdDsgNiIgZGF0YS1mb250LWlkPSJfX1RZUE9TVF9FQkdfXyIgZGF0YS1mb250d2VpZ2h0PSI3MDAiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6ICZxdW90O2FhbHQmcXVvdDsgNjsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtX19UWVBPU1RfRUJHX18pOyBmb250LXdlaWdodDogNzAwOyBmb250LXN0eWxlOiBpdGFsaWMiIGRhdGEtZm9udHN0eWxlPSJpdGFsaWMiIGNsYXNzPSJ0eXBvc3Qtc3R5bGVkIj5OPC9zcGFuPjxzcGFuIGRhdGEtZm9udD0iRUIgR2FyYW1vbmQiIGRhdGEtZm9udC1pZD0iX19UWVBPU1RfRUJHX18iIGRhdGEtZm9udHdlaWdodD0iNzAwIiBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtX19UWVBPU1RfRUJHX18pOyBmb250LXdlaWdodDogNzAwOyBmb250LXN0eWxlOiBpdGFsaWMiIGRhdGEtZm9udHN0eWxlPSJpdGFsaWMiIGNsYXNzPSJ0eXBvc3Qtc3R5bGVkIj5vIE90aGVyPC9zcGFuPjxzcGFuIGRhdGEtZm9udD0iRUIgR2FyYW1vbmQiIGRhdGEtZm9udC1pZD0iX19UWVBPU1RfRUJHX18iIGRhdGEtZm9udHdlaWdodD0iNzAwIiBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtX19UWVBPU1RfRUJHX18pOyBmb250LXdlaWdodDogNzAwOyBmb250LXN0eWxlOiBpdGFsaWMiIGNsYXNzPSJ0eXBvc3Qtc3R5bGVkIj48L3NwYW4+PC9oMj4KPCEtLSAvd3A6aGVhZGluZyAtLT4KCjwhLS0gd3A6cGFyYWdyYXBoIC0tPgo8cD48c3BhbiBkYXRhLWZvbnQ9IkVCIEdhcmFtb25kIiBkYXRhLWZvbnQtaWQ9Il9fVFlQT1NUX0VCR19fIiBkYXRhLWZvbnR3ZWlnaHQ9IjQwMCIgc3R5bGU9ImZvbnQtZmFtaWx5OiB2YXIoLS1mb250LV9fVFlQT1NUX0VCR19fKTsgZm9udC13ZWlnaHQ6IDQwMCIgY2xhc3M9InR5cG9zdC1zdHlsZWQiPlRocmVlIG9wZW4tc291cmNlIGZhY2VzIGFyZSBwcmUtaW5zdGFsbGVkOiBTdHlsZSBTY3JpcHQgKDEyIHN0eWxpc3RpYyBzZXRzICsgc3dhc2hlcyksIEVCIEdhcmFtb25kIChzd2FzaCBpdGFsaWMgY2FwaXRhbHMsIHNtYWxsIGNhcHMsIGEgd2VpZ2h0IGF4aXMpLCBhbmQgRnJhdW5jZXMgKGN1c3RvbSBTT0ZUIGFuZCBXT05LIHZhcmlhYmxlIGF4ZXMgJm5kYXNoOyB0cnkgdGhlIHNsaWRlcnMpLiBWaXNpdCBTZXR0aW5ncyAmcmFycjsgVHlwb2dyYXBoeSBTdHlsaXN0IHRvIGV4cGxvcmUgdGhlIGNvbnRyb2wgcGFuZWwuPC9zcGFuPjwvcD4KPCEtLSAvd3A6cGFyYWdyYXBoIC0tPg=='); $content = strtr($content, array('__TYPOST_EBG__' => (string) (isset($ids['EB Garamond']) ? $ids['EB Garamond'] : 0), '__TYPOST_FRA__' => (string) (isset($ids['Fraunces']) ? $ids['Fraunces'] : 0), '__TYPOST_STY__' => (string) (isset($ids['Style Script']) ? $ids['Style Script'] : 0))); $post_id = wp_insert_post(array('import_id' => 1000, 'post_title' => 'Typography Stylist Demo', 'post_status' => 'publish', 'post_content' => '')); if ($post_id && ! is_wp_error($post_id)) { $GLOBALS['wpdb']->update($GLOBALS['wpdb']->posts, array('post_content' => $content), array('ID' => $post_id)); clean_post_cache($post_id); }\"},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Typography Stylist Demo\"}}],\"landingPage\":\"\\\/wp-admin\\\/post.php?post=1000&action=edit\"}"}},"all_blocks":{"typost\/block":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"typost\/block","title":"Typography Stylist","category":"text","icon":{"src":"<svg width='24' height='24' viewBox='0 0 256 256' xmlns='http:\/\/www.w3.org\/2000\/svg' aria-hidden='true' focusable='false'><path d='M69.46,29.28c40.23,0,70.02,34.14,93.94,34.14,10.22,0,15-3.91,15-9.79,0-8.05-8.92-12.18-8.92-23.27,0-9.13,7.39-16.53,17.83-16.53,11.31,0,19.79,10,19.79,21.96,0,22.83-19.14,42.19-49.8,42.19-8.7,0-17.61-1.52-26.31-3.91v98.07c0,12.39,3.26,14.13,17.18,15.22v9.13h-72.85v-9.13c13.92-1.09,17.18-2.83,17.18-15.22V62.55c-14.35-4.57-27.4-8.92-37.4-8.92-16.74,0-27.18,8.26-27.18,23.27,0,7.39,3.7,13.92,9.79,13.92,7.83,0,9.57-12.83,23.7-12.83,9.57,0,17.18,7.83,17.18,17.4,0,13.05-10.22,22.4-26.96,22.4-20.22,0-38.71-14.35-38.71-40.88,0-29.14,27.62-47.62,56.54-47.62Z' fill='currentColor'\/><path d='M240.81,191.72c0,22.4-17.83,48.06-54.15,48.06-26.31,0-47.19-12.61-47.19-35.23,0-15.44,13.7-29.14,32.18-29.14,15,0,25.66,10.87,25.66,21.53,0,8.26-4.78,13.92-12.83,13.92-14.13,0-8.7-16.96-19.79-16.96-6.31,0-9.57,4.78-9.57,10.66,0,14.79,14.35,22.62,26.53,22.62,20.01,0,28.92-14.79,28.92-27.62,0-41.32-65.45-32.4-65.45-73.72,0-19.79,18.27-32.84,41.97-32.84,14.57,0,23.05,4.35,29.57,8.92l2.61-5.65h8.05l6.52,35.44-8.05,2.39c-8.92-19.79-22.83-28.92-34.14-28.92-8.26,0-14.35,3.91-14.35,11.74,0,23.49,63.5,21.53,63.5,74.8Z' fill='currentColor'\/><\/svg>"},"description":"Advanced OpenType typography with full accessibility support. Block panel settings apply to the entire block; use Quick Features Toggle for individual selections.","keywords":["typography","opentype","ligatures","heading","accessibility"],"textdomain":"typography-stylist","supports":{"html":false,"align":["wide","full"],"anchor":true,"color":{"text":true,"background":true,"link":false},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":false,"lineHeight":true},"__experimentalTextAlign":true},"attributes":{"content":{"type":"string","default":""},"tagName":{"type":"string","default":"h2"},"features":{"type":"array","default":[]},"fontFamily":{"type":"string","default":""},"fontId":{"type":"number","default":0},"fontSize":{"type":"string","default":"inherit"},"fontSizeMin":{"type":"number","default":16},"fontSizePreferred":{"type":"number","default":32},"fontSizeMax":{"type":"number","default":64},"fitLineSizes":{"type":"array","default":[]},"fitMaxSize":{"type":"number","default":0},"fontWeight":{"type":"string","default":"400"},"fontStyle":{"type":"string","default":""},"letterSpacing":{"type":"number","default":0},"lineHeight":{"type":"number","default":0},"screenReaderClass":{"type":"string","default":"visually-hidden"},"textAlign":{"type":"string"},"styleClass":{"type":"string","default":""},"fontVariationSettings":{"type":"string","default":""},"layeredConfigId":{"type":"number","default":0},"animationConfigId":{"type":"number","default":0}},"editorScript":"file:.\/build\/index.js","editorStyle":"file:.\/editor.css","style":"file:.\/style.css","viewScript":"file:.\/view.js"}},"tagged_versions":["1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.1.8","1.1.9","1.2.0","1.2.1","1.2.2","2.0.0","2.0.1","2.1.1","2.1.2","2.2.0","2.2.1","2.2.2","2.2.3","2.3.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3621857,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3719177,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3719177,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3719177,"resolution":"4","location":"assets","locale":"","width":1440,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3719177,"resolution":"5","location":"assets","locale":"","width":1440,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3719177,"resolution":"6","location":"assets","locale":"","width":1440,"height":900},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3719177,"resolution":"7","location":"assets","locale":"","width":1440,"height":900},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3719177,"resolution":"8","location":"assets","locale":"","width":1440,"height":900},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3719177,"resolution":"9","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"The Glyphs Panel \u2014 browse a font's full character set, filtered here to a stylistic set's script alternates, and insert any glyph with a click","2":"The Paragraph Styles browser \u2014 each saved style shown in its own typeface, with the selected words as the sample text","3":"Inline editor on a heading block \u2014 toggling Swashes (swsh) with live preview, applied instantly to the selected text","4":"Quick Feature Toggles inside the Typography Stylist block \u2014 per-selection controls, here setting a different variable-font weight for one word","5":"Typography Stylist block with sidebar controls \u2014 a variable font's Weight axis slider replaces the discrete weight dropdown","6":"Per-font variable axis configuration \u2014 axes detected from the font file, with ranges and WordPress Font Library registration","7":"Font Features preview in the admin \u2014 every OpenType feature previewed with your own text in the selected font","8":"The unified font list \u2014 uploaded kits, Adobe Fonts, and WordPress Font Library fonts with Variable and registration badges","9":"The block's Accessibility panel \u2014 the screen-reader class behind the dual-heading pattern that keeps styled text accessible"}},"plugin_section":[],"plugin_tags":[268380,38623,254644,5126,273021],"plugin_category":[43],"plugin_contributors":[252841],"plugin_business_model":[],"class_list":["post-276027","plugin","type-plugin","status-publish","hentry","plugin_tags-glyphs","plugin_tags-ligatures","plugin_tags-opentype","plugin_tags-typography","plugin_tags-variable-fonts","plugin_category-customization","plugin_contributors-matthewneilcowan","plugin_committers-matthewneilcowan"],"banners":{"banner":"https:\/\/ps.w.org\/typography-stylist\/assets\/banner-772x250.png?rev=3620314","banner_2x":"https:\/\/ps.w.org\/typography-stylist\/assets\/banner-1544x500.png?rev=3620314","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/typography-stylist\/assets\/icon-128x128.png?rev=3620314","icon_2x":"https:\/\/ps.w.org\/typography-stylist\/assets\/icon-256x256.png?rev=3620314","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-1.png?rev=3621857","caption":"The Glyphs Panel \u2014 browse a font's full character set, filtered here to a stylistic set's script alternates, and insert any glyph with a click"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-2.png?rev=3719177","caption":"The Paragraph Styles browser \u2014 each saved style shown in its own typeface, with the selected words as the sample text"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-3.png?rev=3719177","caption":"Inline editor on a heading block \u2014 toggling Swashes (swsh) with live preview, applied instantly to the selected text"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-4.png?rev=3719177","caption":"Quick Feature Toggles inside the Typography Stylist block \u2014 per-selection controls, here setting a different variable-font weight for one word"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-5.png?rev=3719177","caption":"Typography Stylist block with sidebar controls \u2014 a variable font's Weight axis slider replaces the discrete weight dropdown"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-6.png?rev=3719177","caption":"Per-font variable axis configuration \u2014 axes detected from the font file, with ranges and WordPress Font Library registration"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-7.png?rev=3719177","caption":"Font Features preview in the admin \u2014 every OpenType feature previewed with your own text in the selected font"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-8.png?rev=3719177","caption":"The unified font list \u2014 uploaded kits, Adobe Fonts, and WordPress Font Library fonts with Variable and registration badges"},{"src":"https:\/\/ps.w.org\/typography-stylist\/assets\/screenshot-9.png?rev=3719177","caption":"The block's Accessibility panel \u2014 the screen-reader class behind the dual-heading pattern that keeps styled text accessible"}],"raw_content":"<!--section=description-->\n<p>Some of your fonts' best work is hidden.<\/p>\n\n<p>Professional fonts often contain swashes, stylistic sets, ligatures, and alternate characters. Unfortunately, using these features often resorts to manually inserting characters with inline spans, which is tedious, error-prone, and can cause issues with accessibility. Typography Stylist opens the full font cabinet, adding controls for these advanced features to the block editor with accessibility in mind, making it easy to use all the typographic features your fonts offer.<\/p>\n\n<p>If you set type in professional design tools, you know what these fonts can do. Typography Stylist brings that control to WordPress. You decide how your type looks, down to a single character. Pick the alternate you want for one letter, set a variable font to weight 435, and save the result as a paragraph style for the rest of the site, which you can later update everywhere at once. Typography Stylist also manages your fonts: upload webfont kits, connect Adobe Fonts, or use fonts from the WordPress Font Library.<\/p>\n\n<h4>Glyphs Panel<\/h4>\n\n<p>The Glyphs Panel shows every character in a font, like the Glyphs panel in Adobe Illustrator.<\/p>\n\n<ul>\n<li>Search by character, by codepoint (<code>U+XXXX<\/code>), or by glyph name.<\/li>\n<li>Filter by stylistic set, by OpenType feature, or by Unicode block.<\/li>\n<li>Select a letter in your text to see all of its alternates. Click an alternate to put it in place of the letter.<\/li>\n<li>Click any glyph to insert it into your text.<\/li>\n<li>Move through the grid with the keyboard. Screen readers announce each glyph.<\/li>\n<\/ul>\n\n<p>The panel reads the font in your browser, and it reads only the font's metadata. It does not extract glyph outlines, and it does not store font data on your server.<\/p>\n\n<h4>Paragraph Styles<\/h4>\n\n<p>A paragraph style is a named set of typography settings, like a paragraph style in Adobe InDesign. Save a style one time, then apply it to text in any heading, paragraph, or Typography Stylist block.<\/p>\n\n<ul>\n<li>A style holds the font, weight, italic, size, letter spacing, line height, OpenType features, and variable font axes. Fit-to-width sizes can also go into a style.<\/li>\n<li>\"Browse styles\u2026\" shows each style in its own typeface, with your selected words as the sample text. You can search the list, and group it by font family, by size type, or by recent use.<\/li>\n<li>Each style is one CSS class. Change a style and click \"Update Style\", and all text that uses the style changes.<\/li>\n<li>If the selected text already has its own settings, the editor asks before the style replaces them.<\/li>\n<li>\"Detach Style\" changes styled text back to independent settings.<\/li>\n<li>Rename and delete styles on the Paragraph Styles tab in Settings \u2192 Typography Stylist.<\/li>\n<\/ul>\n\n<h4>Granular typography control<\/h4>\n\n<p>Set the typography of a whole block, or of one word or one letter in it.<\/p>\n\n<ul>\n<li><strong>OpenType features:<\/strong> ligatures, swashes, stylistic sets ss01 to ss20, small capitals, figure styles, and more. The full list is below.<\/li>\n<li><strong>Variable fonts:<\/strong> the plugin reads the axes from the font file, and each axis gets a slider. You can set a weight of 435, not only 400 or 700. Custom axes also get sliders.<\/li>\n<li><strong>Size:<\/strong> a fixed size, a responsive size (a CSS <code>clamp()<\/code> between a minimum and a maximum), or fit-to-width.<\/li>\n<li><strong>Fit-to-width:<\/strong> each line of a Typography Stylist block fills the width of the block, as on a poster or a wedding invitation. In a fitted line, you can make one glyph smaller or move it up or down, and the line still fills the width.<\/li>\n<li><strong>Spacing and style:<\/strong> letter spacing, line height, weight, and italic.<\/li>\n<\/ul>\n\n<p>Your site's front end gets CSS only. The plugin adds no JavaScript to your pages.<\/p>\n\n<h4>Two ways to style text<\/h4>\n\n<ol>\n<li><strong>In a heading or paragraph block.<\/strong> Select the text, then click the Typography Stylist button (a swash \"T\") in the block toolbar. Use this for whole words and phrases.<\/li>\n<li><strong>In a Typography Stylist block.<\/strong> Use this block for letter-by-letter work. Set the options for the whole block in the sidebar. Select text in the block to change only that text.<\/li>\n<\/ol>\n\n<p>Two settings in Settings \u2192 Typography Stylist \u2192 Options add a Glyphs button and a Paragraph Styles button to the block toolbar. Both settings are off by default.<\/p>\n\n<h4>Accessibility<\/h4>\n\n<p>A style on part of a word puts the letters in separate elements. Some screen readers then read the word in pieces, or skip it. The Typography Stylist block prevents this. It writes two copies of your text:<\/p>\n\n<ul>\n<li>A plain heading for screen readers. It is hidden from view, and it keeps the document outline correct.<\/li>\n<li>A styled copy for the screen, with <code>aria-hidden=\"true\"<\/code>.<\/li>\n<\/ul>\n\n<p>If you style part of a word in a heading or paragraph block, a notice tells you about the risk. The notice offers a one-click conversion to a Typography Stylist block. Your change applies whether you convert or not. You can turn the notice off in Settings \u2192 Typography Stylist \u2192 Accessibility.<\/p>\n\n<p>The editor panels work with the keyboard and with screen readers.<\/p>\n\n<h4>Fonts<\/h4>\n\n<p>Use fonts from these sources:<\/p>\n\n<ul>\n<li>Webfont kits from MyFonts, Font Squirrel, and other providers. A ZIP with only font files also works. The plugin makes the @font-face CSS for you.<\/li>\n<li>Adobe Fonts projects.<\/li>\n<li>Fonts that your theme, another plugin, or a CDN already loads.<\/li>\n<li>Fonts in the WordPress Font Library (WordPress 6.5+). You can also add your uploaded fonts to the Font Library, and remove them again.<\/li>\n<\/ul>\n\n<p>By default, a font loads only on the pages that use it. This includes blog, category, and tag archives. When you delete a font, you can choose a replacement font, and content that used the deleted font shows the replacement.<\/p>\n\n<h4>Supported OpenType Features<\/h4>\n\n<p><strong>Ligatures:<\/strong>\n* Standard Ligatures (liga)\n* Discretionary Ligatures (dlig)\n* Contextual Alternates (calt)\n* Contextual Ligatures (clig)\n* Historical Ligatures (hlig)<\/p>\n\n<p><strong>Stylistic Sets:<\/strong>\n* ss01 through ss20<\/p>\n\n<p><strong>Swashes &amp; Alternates:<\/strong>\n* Swashes (swsh)\n* Contextual Swashes (cswh)\n* Stylistic Alternates (salt)\n* Titling (titl)\n* Historical Forms (hist)<\/p>\n\n<p><strong>Decorative:<\/strong>\n* Ornaments (ornm)<\/p>\n\n<p><strong>Numerals &amp; Figures:<\/strong>\n* Proportional Figures (pnum)\n* Tabular Figures (tnum)\n* Lining Figures (lnum)\n* Oldstyle Figures (onum)\n* Fractions (frac)\n* Slashed Zero (zero)<\/p>\n\n<p><strong>Capitals &amp; Case:<\/strong>\n* Small Capitals (smcp)\n* Capitals to Small Caps (c2sc)\n* Petite Capitals (pcap)\n* Case-Sensitive Forms (case)<\/p>\n\n<p><strong>Positional Forms:<\/strong>\n* Initial Forms (init)\n* Medial Forms (medi)\n* Terminal Forms (fina)\n* Isolated Forms (isol)<\/p>\n\n<p><strong>Superscript &amp; Ordinals:<\/strong>\n* Superscript (sups)\n* Subscript (subs)\n* Ordinals (ordn)<\/p>\n\n<p><strong>Other Features:<\/strong>\n* Kerning (kern)\n* Localized Forms (locl)\n* Randomize (rand)<\/p>\n\n<h4>Recommended Fonts<\/h4>\n\n<p>The OpenType features work only with fonts that contain them. Many script fonts and professional typefaces do. Some examples:<\/p>\n\n<ul>\n<li>Script fonts by Alejandro Paul, such as Inglesa, and Gratitude Script (with the wonderful Kathy Milici)<\/li>\n<li>Bookmania by Mark Simonson<\/li>\n<li>Orpheus, designed by Kevin King, Patrick Griffin, and Walter Tiemann, from Canada Type<\/li>\n<li>Elaina and other fonts by Laura Worthington<\/li>\n<li>Liza from Underware<\/li>\n<li>Memoriam by Patrick Griffin<\/li>\n<li>ITC Avant Garde, designed by Andr\u00e9 G\u00fcrtler, Christian Mengelt, Ed Benguiat, Erich Gschwind, Herb Lubalin, and others, from Monotype<\/li>\n<\/ul>\n\n<p>To see which features a font has, read its specimen or open it in the Glyphs Panel.<\/p>\n\n<h4>Bundled Third-Party Libraries<\/h4>\n\n<p>The Glyphs Panel reads font files in the browser with two open-source libraries. They are bundled unmodified in <code>glyphs-panel\/assets\/js\/vendor\/<\/code>. They load only when you open the Glyphs Panel, and they run in the browser. No font data goes to a server.<\/p>\n\n<ul>\n<li><strong>opentype.js<\/strong> v1.3.4: reads TTF, OTF, and WOFF font files. MIT License. Source: https:\/\/github.com\/opentypejs\/opentype.js<\/li>\n<li><strong>wawoff2<\/strong>: decompresses WOFF2 font files (a WebAssembly build of Google's woff2). MIT License. Source: https:\/\/github.com\/fontello\/wawoff2<\/li>\n<\/ul>\n\n<p>See BUILD.txt for build and source details.<\/p>\n\n<h4>Source, Docs &amp; Support<\/h4>\n\n<ul>\n<li><strong>Source code and issue tracker:<\/strong> <a href=\"https:\/\/github.com\/mattcowan\/typography-stylist-for-wordpress\">github.com\/mattcowan\/typography-stylist-for-wordpress<\/a><\/li>\n<li><strong>Developer documentation:<\/strong> the hooks reference (<a href=\"https:\/\/github.com\/mattcowan\/typography-stylist-for-wordpress\/blob\/main\/HOOKS.md\">HOOKS.md<\/a>) is on GitHub.<\/li>\n<li><strong>Beta builds:<\/strong> pre-release versions go to the GitHub Releases page before they go to WordPress.org.<\/li>\n<li><strong>Support:<\/strong> the <a href=\"https:\/\/wordpress.org\/support\/plugin\/typography-stylist\/\">WordPress.org support forum<\/a>, or GitHub issues for bugs.<\/li>\n<\/ul>\n\n<p>If you like the plugin, <a href=\"https:\/\/wordpress.org\/support\/plugin\/typography-stylist\/reviews\/#new-post\">a short review<\/a> helps other type lovers find it.<\/p>\n\n<h3>Technical Details<\/h3>\n\n<h4>Data Storage<\/h4>\n\n<p>Typography features are stored as inline styles and data attributes within post content. No additional database tables are created.<\/p>\n\n<h4>Extensibility<\/h4>\n\n<p>Developers can extend the plugin using WordPress hooks and filters \u2014 see <a href=\"https:\/\/github.com\/mattcowan\/typography-stylist-for-wordpress\/blob\/main\/HOOKS.md\">HOOKS.md on GitHub<\/a> for the full reference with examples. REST API endpoints are available at <code>\/wp-json\/typost\/v1\/<\/code>.<\/p>\n\n<h4>Source Code<\/h4>\n\n<p>This plugin includes both compiled\/minified files and their source code to meet WordPress security and transparency requirements.<\/p>\n\n<p><strong>Minified\/Compiled Files:<\/strong>\n* assets\/js\/<em>.min.js files have corresponding source files in assets\/js\/\n* assets\/css\/<\/em>.min.css files have corresponding source files in assets\/css\/\n* blocks\/typography-stylist\/build\/ files are compiled from blocks\/typography-stylist\/ source files<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Developed by Matthew Cowan.<\/p>\n\n<p>Special thanks to my wife for her support and inspiration, and to my dog, Sugar, for taking long walks with me between adding features.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/typography-stylist<\/code>, or install the plugin from the Plugins screen.<\/li>\n<li>Activate the plugin on the Plugins screen.<\/li>\n<li>Go to Settings \u2192 Typography Stylist to add your fonts and set the options.<\/li>\n<li>Open a post in the block editor. Select text in a heading, then click the Typography Stylist button in the block toolbar.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20special%20fonts%3F\"><h3>Do I need special fonts?<\/h3><\/dt>\n<dd><p>For OpenType features such as stylistic sets and swashes, the font must contain them. Many professional typefaces do. Many free fonts have few features or none. Letter spacing, line height, size, and weight work with any font. If a font does not have a feature, the feature has no effect.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20google%20fonts%3F\"><h3>Does this work with Google Fonts?<\/h3><\/dt>\n<dd><p>Yes. Some Google Fonts have OpenType features. Read the font's specimen page to see which ones.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20web%20fonts%3F\"><h3>Can I use my own web fonts?<\/h3><\/dt>\n<dd><p>Yes. You can add fonts in four ways:<\/p>\n\n<ol>\n<li><strong>Upload a webfont kit<\/strong> from MyFonts, Font Squirrel, or another provider on the Custom Fonts tab.<\/li>\n<li><strong>Connect Adobe Fonts<\/strong> (Typekit). Paste the embed code of your project.<\/li>\n<li><strong>Define a custom font<\/strong> that your theme, another plugin, or a CDN (such as Google Fonts) loads. The font then shows in the editor's font list.<\/li>\n<li><strong>Use a WordPress Font Library font<\/strong> (WordPress 6.5+) from the editor's font list.<\/li>\n<\/ol>\n\n<p>The plugin can also apply OpenType features to a font that your site already loads, without a selection in the font list. The previews on the settings page work only for fonts that you upload or connect through the plugin.<\/p><\/dd>\n<dt id=\"how%20do%20i%20upload%20a%20font%3F\"><h3>How do I upload a font?<\/h3><\/dt>\n<dd><ol>\n<li>Go to Settings \u2192 Typography Stylist \u2192 Custom Fonts.<\/li>\n<li>Click \"Choose ZIP File\" and select your webfont kit ZIP.<\/li>\n<li>Click \"Upload Font Kit\". The plugin reads the font names from the kit.<\/li>\n<\/ol>\n\n<p>Kits from MyFonts and Font Squirrel, and font downloads from Google Fonts, all work. The ZIP does not need a stylesheet. If the ZIP has only font files, the plugin reads each font's metadata and makes the @font-face CSS, with the weight range of a variable font. The server cannot read WOFF2 metadata. For a ZIP with only WOFF2 files, the plugin gets the family and the weight from the file names, and a warning asks you to check them.<\/p>\n\n<p>The plugin also finds the weights that each font has, and checks only those in \"Available Font Weights\". You can change the checkboxes at any time.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20adobe%20fonts%3F\"><h3>How do I add Adobe Fonts?<\/h3><\/dt>\n<dd><ol>\n<li>Go to Settings \u2192 Typography Stylist \u2192 Custom Fonts.<\/li>\n<li>Find the \"Adobe Fonts (Typekit)\" section.<\/li>\n<li>Enter a project name.<\/li>\n<li>Paste your Adobe Fonts embed code (the <code>&lt;script&gt;<\/code> tag).<\/li>\n<li>Optional: enter the font family names for the preview list.<\/li>\n<li>Click \"Add Adobe Fonts Project\".<\/li>\n<\/ol>\n\n<p>Make sure that your domain is authorized in your Adobe Fonts project settings. The fonts load from Adobe's servers.<\/p><\/dd>\n<dt id=\"how%20do%20i%20use%20a%20font%20that%20my%20theme%20already%20loads%3F\"><h3>How do I use a font that my theme already loads?<\/h3><\/dt>\n<dd><ol>\n<li>Go to Settings \u2192 Typography Stylist \u2192 Custom Fonts.<\/li>\n<li>Find the \"Custom Font Definitions\" section.<\/li>\n<li>Enter a display name for the font.<\/li>\n<li>Enter the exact CSS font-family value, for example <code>'Playfair Display', serif<\/code>.<\/li>\n<li>Optional: add fallback fonts, with commas between them.<\/li>\n<li>Click \"Add Custom Font\".<\/li>\n<\/ol>\n\n<p>The font shows in the block editor's font list. The settings page cannot preview features for it.<\/p><\/dd>\n<dt id=\"can%20i%20set%20fallback%20fonts%3F\"><h3>Can I set fallback fonts?<\/h3><\/dt>\n<dd><p>Yes. For each uploaded font, Adobe font, and custom font definition, you can set fallback fonts. The browser uses them if the main font does not load.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20content%20if%20i%20delete%20a%20font%3F\"><h3>What happens to my content if I delete a font?<\/h3><\/dt>\n<dd><p>When you delete a font, you can choose a replacement font. Content that used the deleted font then shows the replacement. You can manage these replacements on the Replacement Fonts tab. Use this when you change fonts for a rebrand.<\/p><\/dd>\n<dt id=\"how%20do%20paragraph%20styles%20work%3F\"><h3>How do paragraph styles work?<\/h3><\/dt>\n<dd><ol>\n<li>Set the typography of some text in either editor.<\/li>\n<li>Click \"Save Current Settings as Style\" and give the style a name.<\/li>\n<li>To use the style, select other text. In a heading or paragraph, click \"Browse styles\u2026\" and pick the style. In a Typography Stylist block, pick the style from the Paragraph Style list.<\/li>\n<\/ol>\n\n<p>To change a style everywhere, change the settings on text that uses it and click \"Update Style\". The style browser shows 24 styles at a time. Click \"Show more\" to see the next 24.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20accessible%3F\"><h3>Is this plugin accessible?<\/h3><\/dt>\n<dd><p>Yes. See the Accessibility section in the description for the two-copy pattern and the word-boundary notice. Settings \u2192 Typography Stylist \u2192 Accessibility has these options:<\/p>\n\n<ul>\n<li><strong>Inline Format: Add aria-label Attributes:<\/strong> add an <code>aria-label<\/code> to text that you style in a heading or paragraph block.<\/li>\n<li><strong>Disable Word Boundary Warning:<\/strong> turn off the notice about styles on part of a word.<\/li>\n<\/ul>\n\n<p>Each Typography Stylist block also has an Accessibility panel in its sidebar. There, choose the class that hides the plain heading: <code>visually-hidden<\/code>, <code>sr-only<\/code>, or your own class.<\/p><\/dd>\n<dt id=\"does%20the%20hidden%20heading%20cause%20a%20duplicate%20content%20problem%20for%20seo%3F\"><h3>Does the hidden heading cause a duplicate content problem for SEO?<\/h3><\/dt>\n<dd><p>No. Google's spam policies name \"text that's only accessible to screen readers and is intended to improve the experience for those using screen readers\" as hidden text that does not break their rules. The hidden heading and the styled copy contain the same text.<\/p><\/dd>\n<dt id=\"should%20i%20style%20text%20in%20a%20heading%20block%20or%20use%20the%20typography%20stylist%20block%3F\"><h3>Should I style text in a heading block or use the Typography Stylist block?<\/h3><\/dt>\n<dd><ul>\n<li>Use a <strong>heading or paragraph block<\/strong> to style whole words or phrases.<\/li>\n<li>Use a <strong>Typography Stylist block<\/strong> for letter-by-letter work, fit-to-width lines, or the most control over accessibility.<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20file%20types%20can%20i%20upload%3F\"><h3>What file types can I upload?<\/h3><\/dt>\n<dd><p>A ZIP file that contains:<\/p>\n\n<ul>\n<li>Font files: WOFF, WOFF2, TTF, OTF, or EOT.<\/li>\n<li>Optional: a CSS file with @font-face rules. The plugin uses it as it is.<\/li>\n<\/ul><\/dd>\n<dt id=\"is%20font%20upload%20secure%3F\"><h3>Is font upload secure?<\/h3><\/dt>\n<dd><p>The upload has these protections:<\/p>\n\n<ul>\n<li>File type validation<\/li>\n<li>Safe ZIP extraction, with protection against path traversal<\/li>\n<li>CSS sanitization<\/li>\n<li>A 10 MB size limit<\/li>\n<li>Storage in a directory with <code>.htaccess<\/code> protection<\/li>\n<\/ul><\/dd>\n<dt id=\"does%20this%20work%20with%20page%20builders%3F\"><h3>Does this work with page builders?<\/h3><\/dt>\n<dd><p>The plugin is for the WordPress block editor. It works in a page builder only if the page builder uses block editor rich text.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>The front end gets CSS only, with no JavaScript. A font loads only on the pages that use it. Font file size is the main cost, as with any web font. The JavaScript loads only in the block editor.<\/p><\/dd>\n<dt id=\"how%20do%20i%20know%20which%20features%20my%20font%20supports%3F\"><h3>How do I know which features my font supports?<\/h3><\/dt>\n<dd><p>Open the font in the Glyphs Panel. It lists the OpenType features that the font contains, and shows every glyph for each feature. You can also read the font's documentation.<\/p><\/dd>\n<dt id=\"do%20variable%20fonts%20work%3F\"><h3>Do variable fonts work?<\/h3><\/dt>\n<dd><p>Yes. When you upload a variable font, the plugin reads its axes from the font file: weight, width, slant, optical size, and any custom axis. Each axis gets a slider in both editors, and the output is standard <code>font-variation-settings<\/code> CSS. The server reads TTF and OTF files. For a kit with only WOFF2 files, click \"Detect Axes from Font File\" in the font's settings to read the axes in your browser, or enter the axes by hand.<\/p><\/dd>\n<dt id=\"what%20does%20%22register%20in%20the%20wordpress%20font%20library%22%20do%3F\"><h3>What does \"register in the WordPress Font Library\" do?<\/h3><\/dt>\n<dd><p>On WordPress 6.5+, the plugin adds new uploaded fonts to the WordPress Font Library automatically. You can turn this off in Options. To add older fonts, use the Custom Fonts tab, one font at a time or all together. WordPress can then use them like any Library font. In WordPress 7.1, the Font Library is at Appearance \u2192 Fonts. In earlier versions, open it from the Site Editor, in Styles \u2192 Typography. The font files stay where they are, and your existing content does not change. You can remove a font from the Library again. Adobe Fonts and custom font definitions stay in the plugin, because Adobe fonts load from Adobe's servers.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20beta%20versions%20or%20report%20bugs%3F\"><h3>Where can I get beta versions or report bugs?<\/h3><\/dt>\n<dd><p>Beta builds are pre-releases on the <a href=\"https:\/\/github.com\/mattcowan\/typography-stylist-for-wordpress\/releases\">GitHub Releases page<\/a>. Download the attached ZIP and install it from Plugins \u2192 Add New \u2192 Upload. Report bugs on the <a href=\"https:\/\/github.com\/mattcowan\/typography-stylist-for-wordpress\/issues\">GitHub issue tracker<\/a> or on the WordPress.org support forum.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.3.0<\/h4>\n\n<ul>\n<li><strong>NEW: Paragraph Styles are built in.<\/strong> Save the current typography as a named style and apply it anywhere. Styled text renders through a shared CSS class, so \"Update Style\" changes every use at once. Fit-to-width blocks save as styles too.<\/li>\n<li><strong>NEW: a visual style browser.<\/strong> \"Browse styles\u2026\" in the inline editor (and an optional block toolbar button) shows every style rendered in its own typeface, with your selected words as the sample. Search, group by font family, size mode or recently used, and move through the list with the keyboard.<\/li>\n<li><strong>NEW: optional Glyphs and Paragraph Styles buttons in the block toolbar, and a choice of what Enter does in a Typography Stylist block.<\/strong> All three settings are in Options. The toolbar buttons are off by default, and Enter keeps its line-break behavior until you change it.<\/li>\n<li><strong>Improved: the settings page updates in place.<\/strong> Uploading, adding, editing, deleting and registering fonts, and every settings form, no longer reload the page. Buttons keep keyboard focus while a request runs.<\/li>\n<li><strong>Improved: the font menus are searchable.<\/strong> Type any part of a font name to narrow the list, in the sidebar, the Quick Feature Toggles and the inline editor.<\/li>\n<li><strong>Improved: screen-reader and keyboard use of the editor panels.<\/strong> Dialog names are read first, every control is named, the panels have fewer Tab stops, focus stays inside an open panel, and contrast meets WCAG AA.<\/li>\n<li><strong>Fixed: styled text kept the wrong weight or font.<\/strong> A feature toggle no longer makes a bold heading light; text styled only by the theme keeps its weight; a Font Library font that is installed but not activated now prints its @font-face; a font installed in the Library appears in the pickers on the next editor load.<\/li>\n<li><strong>Fixed: conversion, nesting and sizing in the editors.<\/strong> \"Convert to Typography Stylist Block\" keeps the selection's styling on the selection only; the block reports when styling cannot nest deeper; the inline editor warns when responsive sizes are out of order; \"Responsive (fluid)\" applies at once in the Quick Feature Toggles.<\/li>\n<li><strong>Fixed: the Glyphs Panel<\/strong> swapped or duplicated the wrong glyph, opened on the wrong font for theme-styled text, and refused <code>U+XXXX<\/code> input.<\/li>\n<li><strong>Fixed: paragraph styles<\/strong> dropped italic, went stale after in-session saves, lost to theme heading CSS, and did not load fonts for class-only content.<\/li>\n<li>Full details are in changelog.txt.<\/li>\n<\/ul>\n\n<h4>2.2.3<\/h4>\n\n<ul>\n<li><strong>NEW: Relative size and vertical shift for selected text in Fit-to-width blocks.<\/strong> Select part of a fitted line \u2014 a single glyph like the ampersand in \"April &amp; Andy\" \u2014 and scale it down relative to the line's fitted size or nudge it up and down. Because the adjustments are relative, the line still fills the block width exactly at every screen size, and the frontend stays zero-JavaScript. The two new sliders appear in the Quick Feature Toggles when the block uses Fit to width sizing.<\/li>\n<li>Full details are in changelog.txt.<\/li>\n<\/ul>\n\n<h4>2.2.2<\/h4>\n\n<ul>\n<li><strong>NEW: Fit-to-width sizing.<\/strong> A third font-size mode on the Typography Stylist block: each line is sized so its text spans the full block width \u2014 the classic wedding-invitation\/poster look where a short line renders huge and a long line smaller, all flush to the same width. Editing is fully WYSIWYG: every line renders at its true fitted size while you type and style selections. Lines are measured with their real fonts, features, and letter spacing; the frontend stays zero-JavaScript (CSS container queries), with an optional maximum-size cap and a responsive fallback for older browsers. Existing blocks are untouched.<\/li>\n<li><strong>Fixed: variable-font axis sliders in the Quick Feature Toggles now change only the selected text<\/strong> instead of restyling the whole block (the sidebar sliders intentionally remain block-level), and an axis change no longer leaks into other Typography Stylist blocks on the page. The sliders also now read their starting values from your selection correctly in the iframed editor.<\/li>\n<li><strong>Fixed: fonts registered in the WP Font Library keep their webfont on the frontend.<\/strong> Registered-but-unactivated fonts previously fell back to a local or system font on the frontend while the editor looked correct; the plugin now prints its own @font-face whenever WordPress won't.<\/li>\n<li>Full details are in changelog.txt.<\/li>\n<\/ul>\n\n<h4>2.2.1<\/h4>\n\n<ul>\n<li><strong>Fixed: fonts uploaded together in one ZIP no longer share each other's variable-font axes.<\/strong> Axis detection scanned the whole kit directory, so every family in a multi-font ZIP inherited the axes of whichever file parsed first \u2014 Fraunces lost its optical size, SOFT, and WONK sliders when uploaded alongside a weight-only font, and non-variable fonts in the same ZIP gained a phantom weight slider. Detection is now scoped to each family's own font files. Fonts uploaded on their own were never affected.<\/li>\n<li><strong>Improved: \"Detect Axes from Font File\" repairs fonts in place.<\/strong> Use it on any font whose axes were mis-detected before this fix. It now falls back to reading the font on the server when the browser can't, so it works either way. It also states plainly that it replaces every axis row and discards hand-set values, and asks for confirmation before overwriting axes you have already defined \u2014 nothing is stored until you save.<\/li>\n<li>Changed: variable-font axis sliders now sit directly beneath the weight control in the inline editor and Quick Feature Toggles, matching the block sidebar.<\/li>\n<li>Full details are in changelog.txt.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li><strong>NEW: Font Style (visual italic) controls<\/strong> on all three editing surfaces \u2014 block-level, Quick Feature Toggles, and the inline editor. Deliberately style-only: it selects the font's italic face without adding emphasis semantics; the editor's own Italic button remains the way to emphasize text for screen readers.<\/li>\n<li><strong>Italic-aware previews and Glyphs Panel<\/strong> \u2014 feature previews render with the italic face when the selection is italic, and the Glyphs Panel now loads and displays the face variant actually rendering at your selection (no toggle; the selection decides). Italic-only glyph sets like EB Garamond's swash italic capitals are finally browsable.<\/li>\n<li><strong>Glyphs Panel opens to your selection<\/strong> \u2014 a selected letter pre-fills the alternates view; short combinations (\"Th\") show their exact ligature alternates.<\/li>\n<li><strong>A large editor-robustness batch<\/strong>: Quick Feature Toggle changes always land on the selected text; mixed-selection edits change only the setting you touched; converting a styled heading to a Typography Stylist block preserves every span; glyph alternates survive font and feature changes; variable-font axis sliders no longer alter untouched axes (and the QFT weight slider works); font changes clear stale axis values; multi-span font changes actually take effect; quote-bearing attribute values survive span splits; the span-nesting limit is enforced everywhere.<\/li>\n<li>Full details for every fix are in changelog.txt.<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li><strong>Automatic font-weight detection<\/strong> \u2014 newly added fonts (uploaded kits, Adobe Fonts, and Library fonts adopted in the editor) get their \"Available Font Weights\" pre-set to only the weights they actually ship, instead of all nine being enabled by default. A one-click \"Auto-detect weights for existing fonts\" button on the Custom Fonts tab covers fonts added before this release. Detection never narrows unless it is confident, and the checkboxes stay fully editable.<\/li>\n<li>Fixed: variable fonts uploaded as font-only ZIPs now glyph-browse correctly in the Glyphs Panel (the generated <code>format('truetype-variations')<\/code> hint was not recognized by the panel's file picker).<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Packaging: re-release of the 2.1.0 feature set under a fresh version number. The 2.1.0 tag's downloadable ZIP was cached against stale contents and never delivered the new files (Variable Fonts core integration, font metadata\/sources modules, WordPress Font Library integration); 2.1.1 ships them correctly. See the 2.1.0 entry below for the full list of changes included in this release.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li><strong>WordPress Font Library integration (WP 6.5+)<\/strong> \u2014 register uploaded fonts into the Font Library, per font or in bulk (opt-in and fully reversible), and use Library fonts straight from the editor font pickers. Existing content keeps rendering no matter what.<\/li>\n<li><strong>Variable font support<\/strong> \u2014 automatic axis detection on upload, a \"Detect Axes from Font File\" button, per-font axis configuration, and axis sliders in both editors.<\/li>\n<li><strong>Font-only ZIP uploads<\/strong> \u2014 kits containing just font files (e.g. a Google Fonts download) are now accepted; the @font-face stylesheet is generated automatically from the fonts' metadata.<\/li>\n<li><strong>New <code>typost_force_enqueue_font_ids<\/code> filter<\/strong> \u2014 themes and extensions can force specific fonts to load on every page.<\/li>\n<li>Plus many fixes and improvements across the Glyphs Panel, variable fonts, editor font loading, and admin accessibility (including a WCAG color-contrast audit of all admin color schemes) \u2014 the complete list is in changelog.txt.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Fixed: Mixed-content blocking of locally-hosted fonts in the Glyphs Panel \u2014 same-host <code>http:\/\/<\/code> font file URLs are now upgraded to <code>https:\/\/<\/code> before fetching, so fonts whose stored kit CSS contains absolute insecure URLs load correctly on HTTPS sites (cross-origin URLs are left untouched)<\/li>\n<\/ul>\n\n<p>Older releases are documented in changelog.txt (bundled with the plugin) and on the <a href=\"https:\/\/github.com\/mattcowan\/typography-stylist-for-wordpress\/releases\">GitHub Releases page<\/a>.<\/p>","raw_excerpt":"A Glyphs Panel, paragraph styles, and OpenType and variable font controls for the block editor. Expressive typography that stays accessible.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/276027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=276027"}],"author":[{"embeddable":true,"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/matthewneilcowan"}],"wp:attachment":[{"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=276027"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=276027"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=276027"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=276027"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=276027"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ibo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=276027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}