{"id":371313,"date":"2026-09-20T09:39:48","date_gmt":"2026-09-20T09:39:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/image-icons\/"},"modified":"2026-09-20T09:57:42","modified_gmt":"2026-09-20T09:57:42","slug":"sobol-image-icons","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/sobol-image-icons\/","author":23566626,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.1.2","requires":"6.6","requires_php":"7.4","requires_plugins":null,"header_name":"Sobol Image Icons","header_author":"Lukasz Sobolewski","header_description":"Turn any image into a single-colour icon that follows your text colour, in text, on a button, or on its own.","assets_banners_color":"fac8b3","last_updated":"2026-09-20 09:57:42","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/lsobolew\/sobol-image-icons","header_author_uri":"https:\/\/github.com\/lsobolew","rating":0,"author_block_rating":0,"active_installs":0,"downloads":69,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"lsobolew","date":"2026-09-20 09:57:42","revision":3704092}},"upgrade_notice":{"0.1.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3704082,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3704082,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3704082,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3704082,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3704082,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"sobol-image-icons\/icon":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"sobol-image-icons\/icon","version":"0.1.0","title":"Image Icon","category":"media","icon":"art","description":"Render any image as a single-colour icon that follows the text colour.","keywords":["icon","mask","svg","arrow"],"textdomain":"sobol-image-icons","attributes":{"url":{"type":"string","default":""},"mediaId":{"type":"number","default":0},"label":{"type":"string","default":""},"size":{"type":"string","default":"1em"},"ratio":{"type":"string","default":""},"align":{"type":"string","default":""},"original":{"type":"boolean","default":false},"presetColor":{"type":"string","default":""},"customColor":{"type":"string","default":""},"href":{"type":"string","default":""},"linkTarget":{"type":"string","default":""},"rel":{"type":"string","default":""}},"supports":{"html":false,"anchor":true,"spacing":{"margin":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"}},"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3704082,"resolution":"1","location":"assets","locale":"","width":1484,"height":532},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3704082,"resolution":"2","location":"assets","locale":"","width":938,"height":1398},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3704082,"resolution":"3","location":"assets","locale":"","width":1798,"height":1524},"screenshot-4.gif":{"filename":"screenshot-4.gif","revision":3704082,"resolution":"4","location":"assets","locale":"","width":878,"height":496},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3704082,"resolution":"5","location":"assets","locale":"","width":1218,"height":380}},"screenshots":{"1":"One icon file, four text colours. The shape comes from the image and the colour from the text.","2":"An icon dropped into a sentence, with its settings open on the icon itself.","3":"The Icon panel on the native WordPress Button block.","4":"Idle and hover animations, with their own timings.","5":"The same mark drawn in its own colours, with \"Keep the original colours\" switched on."}},"plugin_section":[],"plugin_tags":[1220,485,497,498,2904],"plugin_category":[50],"plugin_contributors":[281681],"plugin_business_model":[],"class_list":["post-371313","plugin","type-plugin","status-publish","hentry","plugin_tags-block","plugin_tags-button","plugin_tags-icon","plugin_tags-icons","plugin_tags-svg","plugin_category-media","plugin_contributors-lsobolew","plugin_committers-lsobolew"],"banners":{"banner":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/banner-772x250.png?rev=3704082","banner_2x":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/banner-1544x500.png?rev=3704082","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/icon.svg?rev=3704082","icon":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/icon.svg?rev=3704082","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/screenshot-1.png?rev=3704082","caption":"One icon file, four text colours. The shape comes from the image and the colour from the text."},{"src":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/screenshot-2.png?rev=3704082","caption":"An icon dropped into a sentence, with its settings open on the icon itself."},{"src":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/screenshot-3.png?rev=3704082","caption":"The Icon panel on the native WordPress Button block."},{"src":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/screenshot-4.gif?rev=3704082","caption":"Idle and hover animations, with their own timings."},{"src":"https:\/\/ps.w.org\/sobol-image-icons\/assets\/screenshot-5.png?rev=3704082","caption":"The same mark drawn in its own colours, with \"Keep the original colours\" switched on."}],"raw_content":"<!--section=description-->\n<p>Sobol Image Icons renders an image as a CSS mask instead of as a picture. The shape comes from the file,\nthe colour comes from your text. Change the text colour and the icon changes with it.<\/p>\n\n<p>One arrow file then works on a dark button, a light background and a coloured heading, without\nexporting three versions of it.<\/p>\n\n<p><strong>You do not need an icon set.<\/strong> Most icon plugins hand you somebody else's library and stop there.\nThis one uses the images you already have. Drop your own arrow, your own logo mark, a shape a\ndesigner sent you - anything in the media library becomes an icon that matches your palette.<\/p>\n\n<h4>Three places to put one<\/h4>\n\n<p><strong>In a sentence.<\/strong> Pick the icon button in the editor toolbar and drop an icon into running text:\n\"Read more \u2192\". It scales with the font size, sits where you tell it to against the line, and takes\nthe colour of the words around it, the way a glyph would. Select it again and its settings open on\nthe icon itself - swap the image, resize it, set alternative text, or give it a colour of its own\nfrom your theme palette.<\/p>\n\n<p><strong>On a button.<\/strong> The native WordPress Button block gains an <strong>Icon<\/strong> panel. The plugin does not\nreplace the Button with one of its own, so block styles, colour settings, theme.json styling, the\nwidth controls and link handling all keep working exactly as before. Choose the side, the size and\nthe gap; the icon takes the button's proportions from the file, so a tall or wide mark is not\nsquashed into a square.<\/p>\n\n<p><strong>On its own.<\/strong> A dedicated block for an icon that stands by itself: size, colour from the theme\npalette, left\/centre\/right placement, an optional link, and the same option to keep the file's own\ncolours. Useful when the icon is the point rather than an ornament on something else - centred\nabove a heading, say.<\/p>\n\n<h4>Animation, when it earns its place<\/h4>\n\n<p>Two independent settings, because they do different jobs.<\/p>\n\n<p>An <strong>idle animation<\/strong> runs on its own to draw the eye - bounce, wiggle, pulse or spin - and you set\nhow often it plays. The movement is packed into the start of each interval and the icon rests for\nthe remainder, so \"every four seconds\" means an occasional flick of attention rather than something\nthat never stops moving.<\/p>\n\n<p>A <strong>hover animation<\/strong> plays while somebody is on the button and takes over from the idle one:\nslide, rotate, spin, grow, bounce or wiggle, at a speed you choose. It runs for keyboard users too,\nwhen the button is focused, so the affordance is not reserved for people using a mouse.<\/p>\n\n<p>Both are pure CSS, and both stop entirely for anybody whose system asks for reduced motion.<\/p>\n\n<h4>It works for your authors, not only for administrators<\/h4>\n\n<p>This is the part that usually goes wrong elsewhere.<\/p>\n\n<p>WordPress strips <code>mask-image<\/code> from inline styles for every user without the <code>unfiltered_html<\/code>\ncapability - that is authors and contributors on a single site, and everybody except the super\nadmin on multisite. A plugin that writes the mask straight into the markup therefore works\nperfectly while you build the site and breaks for the people who actually write the posts, often\nonly noticed on a client's site weeks later.<\/p>\n\n<p>Sobol Image Icons carries the mask in a CSS custom property, which survives the filtering, and resolves\nit in its own stylesheet. The test suite asserts it on every release, including a test that fails\nif anyone moves a mask declaration back into the markup.<\/p>\n\n<h4>Details that matter<\/h4>\n\n<ul>\n<li><strong>Any image the site accepts.<\/strong> PNG, WebP, AVIF, GIF and more - the editor shows the list your\nsite actually allows, rather than promising formats it will refuse. Transparency is what defines\nthe shape, so a file with a transparent background gives the best result.<\/li>\n<li><strong>Keep the original colours<\/strong> when you want the file drawn as it is - a brand mark, say - while\nthe size, placement and animation carry on working.<\/li>\n<li><strong>Sizes in em, rem, px or vw<\/strong>, defaulting to <code>em<\/code> so an icon beside text scales with that text.<\/li>\n<li><strong>No JavaScript on the front end.<\/strong> The icon is a mask, a custom property and <code>currentColor<\/code>.<\/li>\n<li><strong>Nothing left behind.<\/strong> The plugin stores a single option and removes it when you delete it.<\/li>\n<\/ul>\n\n<h4>Accessibility<\/h4>\n\n<p>An icon with alternative text is announced to screen readers. Leave it empty and the icon is\nmarked decorative and skipped, which is what you want when it sits beside text that already says\nthe same thing. Animations respect <code>prefers-reduced-motion<\/code>, and hover effects are reachable from\nthe keyboard.<\/p>\n\n<h3>Source code<\/h3>\n\n<p>Everything in this plugin is human-readable except <code>build\/icon\/index.js<\/code>, which is compiled and\nminified from TypeScript.<\/p>\n\n<p>The source it was built from is at https:\/\/github.com\/lsobolew\/sobol-image-icons, tagged <code>v0.1.0<\/code> for\nthis release. The block sources are in <code>plugins\/sobol-image-icons\/blocks\/<\/code>, and the build is reproduced\nwith:<\/p>\n\n<pre><code>npm ci &amp;&amp; npm run build in `plugins\/sobol-image-icons\/`\n<\/code><\/pre>\n\n<p>That writes <code>build\/<\/code> from <code>blocks\/<\/code> using the configuration in the same directory - no other step,\nand nothing fetched at build time beyond the locked dependencies.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> or install it from the Plugins screen.<\/li>\n<li>Activate it.<\/li>\n<li>Add the <strong>Sobol Image Icons<\/strong> block, put one inside a sentence with the toolbar's icon button, or open\na Button block and look for the <strong>Icon<\/strong> panel.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20font%20awesome%20or%20another%20icon%20set%3F\"><h3>Do I need Font Awesome or another icon set?<\/h3><\/dt>\n<dd><p>No, and that is rather the point. Sobol Image Icons works with what is already in your media library, so\nyou can use your own marks and keep your own visual identity instead of adopting a library\neverybody else is using too.<\/p><\/dd>\n<dt id=\"why%20does%20my%20icon%20come%20out%20all%20one%20colour%3F\"><h3>Why does my icon come out all one colour?<\/h3><\/dt>\n<dd><p>Because the image is used as a mask: only its shape is read, and the colour comes from the text.\nThat is what lets one file work anywhere. If you want the file drawn in its own colours instead,\nswitch on <strong>Keep the original colours<\/strong>.<\/p><\/dd>\n<dt id=\"can%20i%20use%20a%20multi-coloured%20logo%3F\"><h3>Can I use a multi-coloured logo?<\/h3><\/dt>\n<dd><p>As a mask it will be flattened to a single colour. Either turn on <strong>Keep the original colours<\/strong>, or\nuse the Image block for artwork that needs its own palette.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20svg%3F\"><h3>Does it work with SVG?<\/h3><\/dt>\n<dd><p>Yes, if your site accepts SVG uploads. WordPress refuses them by default, because an SVG is markup\nand can carry a script. A plugin that adds SVG support safely - by sanitising the file on upload -\nmakes them available here automatically, and the editor's own list of formats updates to match.<\/p><\/dd>\n<dt id=\"will%20an%20animation%20annoy%20my%20visitors%3F\"><h3>Will an animation annoy my visitors?<\/h3><\/dt>\n<dd><p>It can, which is why idle animation is off by default and its interval is yours to set. Anybody\nwhose system asks for reduced motion sees no animation at all.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20the%20site%20down%3F\"><h3>Does it slow the site down?<\/h3><\/dt>\n<dd><p>There is no front-end JavaScript, and the stylesheet loads only on pages that actually contain an\nicon or one of the blocks that can hold one.<\/p><\/dd>\n<dt id=\"will%20the%20icon%20still%20show%20on%20old%20browsers%3F\"><h3>Will the icon still show on old browsers?<\/h3><\/dt>\n<dd><p>CSS masks are supported by every current browser. A browser too old for them shows no icon rather\nthan a broken layout.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release: inline icons in any rich text, an Icon panel on the native Button block, and a\nblock for an icon on its own. Idle and hover animations, colour from the theme palette, and a\nmask that survives KSES for authors and contributors.<\/li>\n<\/ul>","raw_excerpt":"Turn any image in your media library into a single-colour icon that follows your text colour. Use it in text, on a button, or on its own.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/371313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=371313"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lsobolew"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=371313"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=371313"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=371313"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=371313"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=371313"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=371313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}