{"id":161446,"date":"2022-08-18T03:49:21","date_gmt":"2022-08-18T03:49:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/blocksify\/"},"modified":"2026-08-19T03:28:38","modified_gmt":"2026-08-19T03:28:38","slug":"blocksify","status":"publish","type":"plugin","link":"https:\/\/bho.wordpress.org\/plugins\/blocksify\/","author":15992414,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"1.2.0","tested":"7.0.4","requires":"6.8","requires_php":"7.4","requires_plugins":null,"header_name":"Blocksify \u2013 Gutenberg Blocks & Page Builder for the Block Editor","header_author":"PressMaximum","header_description":"Add more blocks with advanced settings for Gutenberg - Blocks Editor.","assets_banners_color":"c7ffda","last_updated":"2026-08-19 03:28:38","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/pressmaximum.com\/blocksify","header_author_uri":"https:\/\/pressmaximum.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":2138,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.0":{"tag":"0.2.0","author":"pressmaximum","date":"2026-05-28 15:22:20"},"0.2.1":{"tag":"0.2.1","author":"pressmaximum","date":"2026-05-29 19:35:47"},"0.3.0":{"tag":"0.3.0","author":"pressmaximum","date":"2026-06-03 16:46:45"},"1.0.0":{"tag":"1.0.0","author":"pressmaximum","date":"2026-07-29 08:31:46"},"1.1.0":{"tag":"1.1.0","author":"pressmaximum","date":"2026-08-09 20:52:19"},"1.1.1":{"tag":"1.1.1","author":"pressmaximum","date":"2026-08-12 17:45:31"},"1.2.0":{"tag":"1.2.0","author":"pressmaximum","date":"2026-08-19 03:28:38"}},"upgrade_notice":{"1.1.0":"<p>Container links, background hover zoom, Dynamic Template widths, and Product Gallery variation sets. Two inspector changes: Product Add to Cart now defaults to the Stepper quantity selector, and its variation linking is always on. Saved blocks keep their existing settings.<\/p>","0.3.0":"<p>New Design Library, Icon List block, Heading inserter, and a major Tabs responsive overhaul. Re-validate custom themes before updating.<\/p>","0.2.1":"<p>Editor polish plus Image and Content Loop enhancements. Safe minor update.<\/p>","0.2.0":"<p>First pre-release. Re-validate custom themes and integrations before updating.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3554123,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3554123,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3554123,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3554123,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"blocksify\/accordion":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/accordion","version":"1.0.0","title":"Accordion","category":"blocksify","description":"Stacked expandable panels. Each item self-renders header + body; multi or single expand mode.","textdomain":"blocksify","keywords":["accordion","toggle","collapse","faq","expand","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"5\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><rect x=\"3\" y=\"11\" width=\"18\" height=\"5\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><rect x=\"3\" y=\"18\" width=\"18\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"7\" y1=\"6.5\" x2=\"13\" y2=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"7\" y1=\"13.5\" x2=\"13\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><\/svg>","supports":{"html":false,"anchor":true,"className":false,"color":false,"align":false,"interactivity":true},"providesContext":{"blocksify\/accordion\/uid":"uid","blocksify\/accordion\/allowMultiple":"allowMultiple","blocksify\/accordion\/defaultOpenItem":"defaultOpenItem","blocksify\/accordion\/indicatorType":"indicatorType","blocksify\/accordion\/indicatorPosition":"indicatorPosition","blocksify\/accordion\/titleTag":"titleTag","blocksify\/accordion\/titleAlign":"titleAlign","blocksify\/accordion\/titleDisplay":"titleDisplay","blocksify\/accordion\/showIcon":"showIcon"},"allowedBlocks":["blocksify\/accordion-item"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"allowMultiple":{"type":"boolean","default":true,"description":"Whether more than one item may be open at once. This must be a real JSON boolean: the check is a strict identity test, so the STRING \"true\" resolves to single-expand, the opposite of what it reads like."},"defaultOpenItem":{"type":["number","null"],"default":1,"description":"Which item is open on load, matched against a child's index. The numbering is ONE-BASED, so the first item is 1, not 0. null means no item starts open, and so does any number outside the child range \u2014 0, a negative, or a value greater than the number of children all silently open nothing. Only honoured while allowMultiple is false."},"titleTag":{"type":"string","default":"h4","enum":["h1","h2","h3","h4","h5","h6","div","span","p"],"description":"Heading element wrapping each item title. Anything outside this set falls back to h4."},"titleAlign":{"type":"string","default":"","enum":["","left","center","right"],"description":"Horizontal alignment of the item title. Empty means no alignment is emitted; anything outside this set behaves the same as empty."},"titleDisplay":{"type":"string","default":"wrapped","enum":["wrapped","truncated"],"description":"Whether a long title wraps onto more lines or is truncated to one. Anything outside this set falls back to wrapped. The Tablet \/ Mobile variants accept the same enum plus the empty string, which means \"no override on this device\"."},"titleDisplayTablet":{"type":"string","default":"","enum":["","wrapped","truncated"]},"titleDisplayMobile":{"type":"string","default":"","enum":["","wrapped","truncated"]},"indicatorType":{"type":"string","default":"plus-minus","enum":["plus-minus","chevron","arrow","none"],"description":"Open\/closed affordance drawn on each header. Anything outside this set falls back to plus-minus."},"indicatorPosition":{"type":"string","default":"right","enum":["left","right"],"description":"Which side of the header the indicator sits on. Anything outside this set falls back to right."},"indicatorSize":{"type":["object","null"],"default":null},"indicatorStyling":{"type":"object","default":{}},"indicatorActiveStyling":{"type":"object","default":{}},"itemWrapperStyling":{"type":"object","default":{"border":{"base":{"mode":"linked","unit":"px","width":1,"style":"solid","color":"color-mix(in srgb, currentcolor 15%, transparent)"}},"borderRadius":{"base":{"mode":"linked","value":0.5,"unit":"rem"}}}},"itemActiveStyling":{"type":"object","default":{"border":{"base":{"mode":"linked","unit":"px","width":1,"style":"solid","color":"color-mix(in srgb, currentcolor 35%, transparent)"}}}},"itemInnerStyling":{"type":"object","default":{"padding":{"base":{"mode":"per-side","top":{"token":"none"},"right":{"token":"sm"},"bottom":{"token":"sm"},"left":{"token":"sm"}}}}},"titleStyling":{"type":"object","default":{"padding":{"base":{"mode":"per-side","top":{"token":"xs"},"right":{"token":"sm"},"bottom":{"token":"xs"},"left":{"token":"sm"}}}}},"titleActiveStyling":{"type":"object","default":{}},"showIcon":{"type":"boolean","default":false},"iconPosition":{"type":"string","default":"","enum":["","left","right"],"description":"Which side of the item title the per-item icon sits on. Empty means no placement is emitted; anything outside this set behaves the same as empty. The name is overloaded across blocks: blocksify\/button and blocksify\/form-submit spell the same idea before \/ after, and blocksify\/tabs and blocksify\/icon-list accept left \/ right \/ top."},"iconGap":{"type":["object","null"],"default":null},"iconWidth":{"type":["object","null"],"default":null},"iconBorderRadius":{"type":["object","null"],"default":null},"iconStyling":{"type":"object","default":{}},"itemGap":{"type":["object","null"],"default":{"token":"xs"}},"itemGapTablet":{"type":["object","null"]},"itemGapMobile":{"type":["object","null"]}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-accordion-editor.css","viewScriptModule":"file:.\/view.js","render":"file:.\/render.php"},"blocksify\/icon":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/icon","version":"1.0.0","title":"Icon","category":"blocksify","description":"A block for adding an icon with link and custom styles.","textdomain":"blocksify","keywords":["icon","svg","lucide","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linejoin=\"round\"><polygon points=\"12 3 14.5 9 21 9.5 16 14 17.5 21 12 17.5 6.5 21 8 14 3 9.5 9.5 9\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"color":false,"reusable":true},"usesContext":["blocksify\/innerBlock"],"blocksifySupports":{"color":{"text":true,"background":true},"background":{"image":true,"gradient":true},"spacing":{"padding":true,"margin":true},"border":{"border":true,"radius":true,"shadow":true},"size":true,"overflow":true,"position":true,"zindex":true,"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"url":{"type":"string"},"linkTarget":{"type":"string"},"rel":{"type":"string"},"tagName":{"type":"string","default":"div"},"icon":{"type":["object","null"],"default":{"source":"lucide","name":"atom","strokeWidth":2}},"size":{"type":["object","null"],"default":{"width":{"value":80,"unit":"px"}}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-icon-editor.css","render":"file:.\/render.php"},"blocksify\/gallery":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/gallery","version":"1.0.0","title":"Image Gallery","category":"blocksify","description":"Display a set of images in grid, masonry, collage, product-showcase or slider layouts, with a built-in lightbox.","textdomain":"blocksify","keywords":["gallery","images","grid","masonry","slider","carousel","photos","lightbox","product","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"2.30 2.30 19.89 19.89\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M16.375 4.5H4.625a.125.125 0 0 0-.125.125v8.254l2.859-1.54a.75.75 0 0 1 .68-.016l2.384 1.142l2.89-2.074a.75.75 0 0 1 .874 0l2.313 1.66V4.625a.125.125 0 0 0-.125-.125m.125 9.398l-2.75-1.975l-2.813 2.02a.75.75 0 0 1-.76.067l-2.444-1.17L4.5 14.583v1.792c0 .069.056.125.125.125h11.75a.125.125 0 0 0 .125-.125zM4.625 3C3.728 3 3 3.728 3 4.625v11.75C3 17.273 3.728 18 4.625 18h11.75c.898 0 1.625-.727 1.625-1.625V4.625C18 3.728 17.273 3 16.375 3zM20 8v11c0 .69-.31 1-.999 1H6v1.5h13.001c1.52 0 2.499-.982 2.499-2.5V8z\" clip-rule=\"evenodd\"><\/path><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"customClassName":true,"color":false,"reusable":true},"blocksifySupports":{"spacing":{"padding":true,"margin":true},"border":{"border":true,"radius":true,"shadow":true},"size":true,"overflow":true,"position":true,"zindex":true,"visibility":true},"usesContext":["postId","postType"],"attributes":{"uid":{"type":"string","default":""},"source":{"type":"string","default":"static"},"binding":{"type":["object","null"],"default":null},"images":{"type":"array","default":[],"description":"Gallery items, in display order. Every entry must be an OBJECT \u2014 a bare attachment ID like 1536 is skipped without a trace, and the gallery renders one image short with nothing anywhere saying why. The two useful shapes are {\"id\": 1536} (the attachment is looked up server-side and the whole img, including srcset, is built for you) and {\"url\": \"https:\/\/\u2026\"} (an external image). Either key alone is enough; an entry carrying neither is skipped. Optional per-entry keys, all flat strings\/numbers, never nested bags: alt, caption, full, thumbnail, width, height, srcset, sizes, thumbnailWidth, thumbnailHeight, thumbnailSrcset, thumbnailSizes. The ELEMENT shape is deliberately NOT declared as an `items` sub-schema: core validates an array by short-circuiting on the FIRST bad element and the failure is per-ATTRIBUTE, so one malformed entry would fall back to the [] default and wipe the WHOLE gallery, well-formed entries included. blocksify\/validate-content is the layer that reports a bad entry, at write time, without that blast radius \u2014 gallery_image_not_object names the offending index for a non-object entry and gallery_image_no_source for one carrying neither id nor url."},"saleBadge":{"type":"object","default":{"enabled":true,"showPercent":false,"label":"","position":"tl"}},"layout":{"type":"string","default":"grid","enum":["grid","masonry","collage","showcase","slider"],"description":"Gallery layout. Anything outside this set silently falls back to grid, which also changes the wrapper tag (ul for every layout except slider and showcase, which use div) and drops the Swiper runtime the slider and showcase layouts need."},"heightMode":{"type":"string","default":"aspect","enum":["fill","aspect"],"description":"Whether tiles fill the available height or keep an aspect ratio. Anything outside this set falls back to aspect."},"imageFit":{"type":"string","default":"cover","enum":["cover","contain"],"description":"CSS object-fit applied to each tile image. Anything outside this set falls back to cover."},"imageSizeSlug":{"type":"string","default":"large"},"thumbnailSizeSlug":{"type":"string","default":"thumbnail"},"columns":{"type":"number","default":3},"columnsTablet":{"type":["number","null"]},"columnsMobile":{"type":["number","null"]},"gap":{"type":["object","null"],"default":{"token":"sm"}},"gapTablet":{"type":["object","null"]},"gapMobile":{"type":["object","null"]},"aspectRatio":{"type":["string","null"],"default":null},"captions":{"type":"string","default":"none","enum":["none","below","overlay"],"description":"Where an item's caption renders. Anything outside this set falls back to none, so the authored captions never appear."},"linkTo":{"type":"string","default":"none","enum":["none","media"],"description":"Whether each tile links to its full-size file. Anything outside this set behaves as none."},"lightbox":{"type":"boolean","default":true},"lightboxFeatures":{"type":"object","default":{}},"collage":{"type":"object","default":{}},"showcase":{"type":"object","default":{}},"slider":{"type":"object","default":{}},"imageStyling":{"type":"object","default":{}},"captionStyling":{"type":"object","default":{}},"arrowStyling":{"type":"object","default":{}},"dotStyling":{"type":"object","default":{}},"thumbStyling":{"type":"object","default":{}},"thumbArrowStyling":{"type":"object","default":{}},"viewallStyling":{"type":"object","default":{}},"badgeStyling":{"type":"object","default":{}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-gallery-editor.css","render":"file:.\/render.php"},"blocksify\/container":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/container","version":"1.5.3","title":"Container","category":"blocksify","description":"Flex container with direction-aware layout. Holds any inner blocks.","textdomain":"blocksify","keywords":["container","column","col","cell","wrapper","group","div","box","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M2 9V6H5\" stroke=\"currentColor\" stroke-width=\"1.25\" fill=\"none\"\/><path d=\"M19 6H22V9\" stroke=\"currentColor\" stroke-width=\"1.25\" fill=\"none\"\/><path d=\"M22 15V18H19\" stroke=\"currentColor\" stroke-width=\"1.25\" fill=\"none\"\/><path d=\"M5 18H2V15\" stroke=\"currentColor\" stroke-width=\"1.25\" fill=\"none\"\/><line x1=\"7\" y1=\"6\" x2=\"17\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-dasharray=\"2 2\"\/><line x1=\"22\" y1=\"11\" x2=\"22\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-dasharray=\"2 2\"\/><line x1=\"7\" y1=\"18\" x2=\"17\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-dasharray=\"2 2\"\/><line x1=\"2\" y1=\"11\" x2=\"2\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-dasharray=\"2 2\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"reusable":false,"color":false},"blocksifySupports":["color","background","typography","spacing","border","size","overflow","position","zindex","visibility","animation"],"providesContext":{"blocksify\/innerBlock":"uid"},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"link":{"type":["object","null"],"default":null},"flexDirection":{"type":"string","default":"column","enum":["row","row-reverse","column","column-reverse"],"description":"Main axis of the flex container. Decides which gap does the spacing: a column direction stacks children vertically, so rowGap is the separator and columnGap is inert; a row direction lays them out horizontally, so columnGap is the separator and rowGap only applies once flexWrap wraps to a second line. As on every keyword attribute here, the Tablet \/ Mobile variants accept the same enum plus null, the clear sentinel that stops the Mobile-to-Tablet-to-Desktop cascade at that device; null is listed in those enums because WordPress validates the enum against the stored value even when the type union admits null, and an enum that omitted it would make the render-time schema check discard the override."},"flexDirectionTablet":{"type":["string","null"],"enum":["row","row-reverse","column","column-reverse",null]},"flexDirectionMobile":{"type":["string","null"],"enum":["row","row-reverse","column","column-reverse",null]},"justifyContent":{"type":"string","enum":["flex-start","center","flex-end","space-between"],"description":"Main-axis distribution (CSS justify-content). Runs along flexDirection: vertical on a column, horizontal on a row. Unset means the CSS initial value (flex-start)."},"justifyContentTablet":{"type":["string","null"],"enum":["flex-start","center","flex-end","space-between",null]},"justifyContentMobile":{"type":["string","null"],"enum":["flex-start","center","flex-end","space-between",null]},"alignItems":{"type":"string","enum":["flex-start","center","flex-end","stretch"],"description":"Cross-axis alignment of the children (CSS align-items). On the default column direction this is what horizontally centers stacked children \u2014 use it, not textAlign, which only moves inline content inside each child box."},"alignItemsTablet":{"type":["string","null"],"enum":["flex-start","center","flex-end","stretch",null]},"alignItemsMobile":{"type":["string","null"],"enum":["flex-start","center","flex-end","stretch",null]},"flexWrap":{"type":"string","enum":["nowrap","wrap","wrap-reverse"],"description":"Whether children may wrap onto more lines (CSS flex-wrap). Unset behaves as nowrap. Only a wrapping row direction produces the second line that rowGap separates. The Inspector offers nowrap \/ wrap; wrap-reverse is emit-supported for authored markup."},"flexWrapTablet":{"type":["string","null"],"enum":["nowrap","wrap","wrap-reverse",null]},"flexWrapMobile":{"type":["string","null"],"enum":["nowrap","wrap","wrap-reverse",null]},"rowGap":{"type":["object","null"],"default":{"token":"sm"},"description":"Vertical rhythm between children \u2014 emits CSS row-gap. Bag shape: { \"token\": \"sm\" } to reference a spacing token, or { \"value\": 48, \"unit\": \"px\" } for a literal. Absent falls back to this default (the sm spacing token), which is why an unset Container already breathes; set it rather than faking spacing with negative margins on the children."},"rowGapTablet":{"type":["object","null"]},"rowGapMobile":{"type":["object","null"]},"columnGap":{"type":["object","null"],"description":"Horizontal gap between children \u2014 emits CSS column-gap. Same bag shape as rowGap. Inert on the default column direction (no horizontal separator exists there); set flexDirection to a row value first. Absent emits nothing."},"columnGapTablet":{"type":["object","null"]},"columnGapMobile":{"type":["object","null"]},"tagName":{"type":"string","default":"div","enum":["div","section","article","header","footer","main","aside","nav"],"description":"Wrapper HTML element. Anything outside this set falls back to div at render time."}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-container-editor.css","render":"file:.\/render.php"},"blocksify\/product-meta":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/product-meta","version":"1.0.0","title":"Product Meta","category":"blocksify-woocommerce","description":"The current product's meta \u2014 SKU, categories, and tags, from WooCommerce.","textdomain":"blocksify","keywords":["woocommerce","product","meta","sku","categories","tags","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1.5\"\/><circle cx=\"8\" cy=\"10\" r=\"1.75\"\/><path d=\"M12 10h6M12 14h6M6 15h4\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":true,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"showSku":{"type":"boolean","default":true},"showCategories":{"type":"boolean","default":true},"showTags":{"type":"boolean","default":true},"layout":{"type":"string","default":"stacked"},"link":{"type":"boolean","default":true},"separator":{"type":"string","default":", "},"rowsGap":{"type":["object","null"],"default":null},"rowsGapTablet":{"type":["object","null"],"default":null},"rowsGapMobile":{"type":["object","null"],"default":null},"contentGap":{"type":["object","null"],"default":null},"contentGapTablet":{"type":["object","null"],"default":null},"contentGapMobile":{"type":["object","null"],"default":null},"labelStyling":{"type":"object","default":{}},"valueStyling":{"type":"object","default":{}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-product-meta-editor.css","style":"file:.\/blocksify-product-meta.css","render":"file:.\/render.php"},"blocksify\/form-radio":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-radio","version":"1.0.0","title":"Radio Field","category":"blocksify","description":"A radio button group for a Blocksify form.","textdomain":"blocksify","keywords":["form","field","radio","choice"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><circle cx=\"7\" cy=\"8\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><circle cx=\"7\" cy=\"8\" r=\"1.25\" fill=\"currentColor\"\/><line x1=\"12\" y1=\"8\" x2=\"21\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><circle cx=\"7\" cy=\"16\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"12\" y1=\"16\" x2=\"21\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false},"attributes":{"uid":{"type":"string","default":""},"name":{"type":"string","default":""},"label":{"type":"string","default":""},"hideLabel":{"type":"boolean","default":false},"required":{"type":"boolean","default":false},"requiredText":{"type":"string","default":""},"helpText":{"type":"string","default":""},"options":{"type":"array","default":[],"description":"Choices, in display order. Every entry is an OBJECT and exactly two keys are read: {\"label\": \"Support\", \"value\": \"support\"}. value is optional \u2014 omit it and it is derived from the label with sanitize_title() \u2014 and a lone value becomes its own label, but an entry that is not an object, or that carries neither, is skipped without a trace and the field renders with one fewer choice. A bare string is NOT an option, and a key that merely looks right (text, title, name) is read by nothing. The ELEMENT shape is deliberately NOT declared as an `items` sub-schema: core fails an array on the FIRST bad element and discards the whole ATTRIBUTE, so one malformed entry would wipe every choice. blocksify\/validate-content reports the bad entry instead \u2014 form_option_not_object and form_option_no_label, each naming the index."},"sensitive":{"type":"boolean","default":false}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form-submit":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-submit","version":"1.0.0","title":"Submit Button","category":"blocksify","description":"The submit button for a Blocksify form.","textdomain":"blocksify","keywords":["form","submit","button","send"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"9\" width=\"16\" height=\"6\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><path d=\"M10 12h4m0 0-1.5-1.5M14 12l-1.5 1.5\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":true,"reusable":false,"multiple":false},"attributes":{"uid":{"type":"string","default":""},"label":{"type":"string","default":""},"icon":{"type":["object","null"]},"iconPosition":{"type":"string","default":"after"},"iconStyling":{"type":"object"}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form","version":"1.0.0","title":"Form","category":"blocksify","description":"A form whose fields are stored once and synced across every page that shows it.","textdomain":"blocksify","keywords":["form","contact","fields","input","newsletter","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 48 48\" fill=\"currentColor\"><g transform=\"matrix(1.227 0 0 1.227 -5.133 -5.133)\"><path d=\"M19 25.5a4.5 4.5 0 1 1-9 0a4.5 4.5 0 0 1 9 0m-2.5 0a2 2 0 1 0-4 0a2 2 0 0 0 4 0M10 15.25c0-.69.56-1.25 1.25-1.25h20.5a1.25 1.25 0 1 1 0 2.5h-20.5c-.69 0-1.25-.56-1.25-1.25m12.25 9.25a1.25 1.25 0 1 0 0 2.5h9.5a1.25 1.25 0 1 0 0-2.5z\"\/><path d=\"M10.75 5A5.75 5.75 0 0 0 5 10.75v21.5A5.75 5.75 0 0 0 10.75 38h21.5A5.75 5.75 0 0 0 38 32.25v-21.5A5.75 5.75 0 0 0 32.25 5zM7.5 10.75a3.25 3.25 0 0 1 3.25-3.25h21.5a3.25 3.25 0 0 1 3.25 3.25v21.5c0 .456-.094.89-.264 1.285A3.24 3.24 0 0 1 32.25 35.5h-21.5a3.24 3.24 0 0 1-2.999-1.995A3.2 3.2 0 0 1 7.5 32.25z\"\/><path d=\"M15.25 42.5a5.74 5.74 0 0 1-4.747-2.504q.123.004.247.004h21.5A7.75 7.75 0 0 0 40 32.25v-21.5q0-.123-.004-.247A5.74 5.74 0 0 1 42.5 15.25v17c0 5.66-4.59 10.25-10.25 10.25z\"\/><\/g><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"reusable":false,"interactivity":true},"providesContext":{"blocksify\/formId":"formId"},"attributes":{"uid":{"type":"string","default":""},"formId":{"type":"integer","default":0}},"viewScriptModule":"file:.\/view.js","editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-form-editor.css","render":"file:.\/render.php"},"blocksify\/form-checkbox":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-checkbox","version":"1.0.0","title":"Checkbox Field","category":"blocksify","description":"A multi-select checkbox group for a Blocksify form.","textdomain":"blocksify","keywords":["form","field","checkbox","multi","choice"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><polyline points=\"5.5,8 7,9.5 9,6.5\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><line x1=\"13\" y1=\"8\" x2=\"21\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><rect x=\"4\" y=\"13\" width=\"6\" height=\"6\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"13\" y1=\"16\" x2=\"21\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false},"attributes":{"uid":{"type":"string","default":""},"name":{"type":"string","default":""},"label":{"type":"string","default":""},"hideLabel":{"type":"boolean","default":false},"required":{"type":"boolean","default":false},"requiredText":{"type":"string","default":""},"helpText":{"type":"string","default":""},"options":{"type":"array","default":[],"description":"Choices, in display order. Every entry is an OBJECT and exactly two keys are read: {\"label\": \"Support\", \"value\": \"support\"}. value is optional \u2014 omit it and it is derived from the label with sanitize_title() \u2014 and a lone value becomes its own label, but an entry that is not an object, or that carries neither, is skipped without a trace and the field renders with one fewer choice. A bare string is NOT an option, and a key that merely looks right (text, title, name) is read by nothing. The ELEMENT shape is deliberately NOT declared as an `items` sub-schema: core fails an array on the FIRST bad element and discards the whole ATTRIBUTE, so one malformed entry would wipe every choice. blocksify\/validate-content reports the bad entry instead \u2014 form_option_not_object and form_option_no_label, each naming the index."},"sensitive":{"type":"boolean","default":false}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form-accept":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-accept","version":"1.0.0","title":"Accept Field","category":"blocksify","description":"A single consent checkbox for a Blocksify form (e.g. accept terms).","textdomain":"blocksify","keywords":["form","field","accept","consent","terms","checkbox"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"8\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><polyline points=\"5,12 7.5,14.5 11,9\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><line x1=\"14\" y1=\"12\" x2=\"21\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false},"attributes":{"uid":{"type":"string","default":""},"name":{"type":"string","default":""},"label":{"type":"string","default":""},"required":{"type":"boolean","default":true},"requiredText":{"type":"string","default":""},"helpText":{"type":"string","default":""},"sensitive":{"type":"boolean","default":false}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form-textarea":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-textarea","version":"1.0.0","title":"Textarea Field","category":"blocksify","description":"A multi-line text area for a Blocksify form.","textdomain":"blocksify","keywords":["form","field","textarea","multiline"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"7\" y1=\"9\" x2=\"17\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><line x1=\"7\" y1=\"15\" x2=\"13\" y2=\"15\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false},"attributes":{"uid":{"type":"string","default":""},"name":{"type":"string","default":""},"label":{"type":"string","default":""},"hideLabel":{"type":"boolean","default":false},"placeholder":{"type":"string","default":""},"required":{"type":"boolean","default":false},"requiredText":{"type":"string","default":""},"helpText":{"type":"string","default":""},"defaultValue":{"type":"string","default":""},"rows":{"type":"number","default":4},"sensitive":{"type":"boolean","default":false}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form-select":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-select","version":"1.0.0","title":"Select Field","category":"blocksify","description":"A dropdown select field for a Blocksify form.","textdomain":"blocksify","keywords":["form","field","select","dropdown"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><polyline points=\"15,10 17,12 15,14\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false},"attributes":{"uid":{"type":"string","default":""},"name":{"type":"string","default":""},"label":{"type":"string","default":""},"hideLabel":{"type":"boolean","default":false},"placeholder":{"type":"string","default":""},"required":{"type":"boolean","default":false},"requiredText":{"type":"string","default":""},"helpText":{"type":"string","default":""},"defaultValue":{"type":"string","default":""},"options":{"type":"array","default":[],"description":"Choices, in display order. Every entry is an OBJECT and exactly two keys are read: {\"label\": \"Support\", \"value\": \"support\"}. value is optional \u2014 omit it and it is derived from the label with sanitize_title() \u2014 and a lone value becomes its own label, but an entry that is not an object, or that carries neither, is skipped without a trace and the field renders with one fewer choice. A bare string is NOT an option, and a key that merely looks right (text, title, name) is read by nothing. The ELEMENT shape is deliberately NOT declared as an `items` sub-schema: core fails an array on the FIRST bad element and discards the whole ATTRIBUTE, so one malformed entry would wipe every choice. blocksify\/validate-content reports the bad entry instead \u2014 form_option_not_object and form_option_no_label, each naming the index."},"sensitive":{"type":"boolean","default":false}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form-email":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-email","version":"1.0.0","title":"Email Field","category":"blocksify","description":"An email address field for a Blocksify form.","textdomain":"blocksify","keywords":["form","field","email","input"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><path d=\"M3 9.5l9 5 9-5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false},"attributes":{"uid":{"type":"string","default":""},"name":{"type":"string","default":""},"label":{"type":"string","default":""},"hideLabel":{"type":"boolean","default":false},"placeholder":{"type":"string","default":""},"required":{"type":"boolean","default":false},"requiredText":{"type":"string","default":""},"helpText":{"type":"string","default":""},"defaultValue":{"type":"string","default":""},"sensitive":{"type":"boolean","default":false}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form-text":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-text","version":"1.0.0","title":"Text Field","category":"blocksify","description":"A single-line text field for a Blocksify form.","textdomain":"blocksify","keywords":["form","field","text","input"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"6\" y1=\"12\" x2=\"6\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false},"attributes":{"uid":{"type":"string","default":""},"name":{"type":"string","default":""},"label":{"type":"string","default":""},"hideLabel":{"type":"boolean","default":false},"placeholder":{"type":"string","default":""},"required":{"type":"boolean","default":false},"requiredText":{"type":"string","default":""},"helpText":{"type":"string","default":""},"defaultValue":{"type":"string","default":""},"sensitive":{"type":"boolean","default":false}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/form-recaptcha":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/form-recaptcha","version":"1.0.0","title":"reCAPTCHA Field","category":"blocksify","description":"A Google reCAPTCHA v2 challenge for a Blocksify form (spam protection). Set your keys in Blocksify \u2192 Settings \u2192 Integration.","textdomain":"blocksify","keywords":["form","field","recaptcha","captcha","spam","google"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M12 3l7 2.5v5.5c0 4.2-2.9 7.4-7 8.5-4.1-1.1-7-4.3-7-8.5V5.5L12 3z\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linejoin=\"round\"\/><polyline points=\"8.5,12 11,14.5 15.5,9.5\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>","ancestor":["blocksify\/form"],"usesContext":["blocksify\/formId"],"supports":{"html":false,"anchor":false,"align":false,"className":false,"reusable":false,"multiple":false},"attributes":{"uid":{"type":"string","default":""}},"editorScript":"file:.\/index.js","render":"file:.\/render.php"},"blocksify\/product-reviews":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/product-reviews","version":"1.0.0","title":"Product Reviews","category":"blocksify-woocommerce","description":"The current product's reviews and review form, without WooCommerce tab navigation.","textdomain":"blocksify","keywords":["woocommerce","product","reviews","comments","rating","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 14a4 4 0 0 1-4 4H9l-5 3v-3a4 4 0 0 1-2-3.46V7a4 4 0 0 1 4-4h11a4 4 0 0 1 4 4z\"\/><path d=\"m8 11 1.15-2.33L11.7 8.3l-1.85 1.8.44 2.55L8 11.45l-2.29 1.2.44-2.55L4.3 8.3l2.55.37z\"\/><path d=\"M13 8h4M13 12h4\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":true,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"spacing":true,"size":true,"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-product-reviews-editor.css","render":"file:.\/render.php"},"blocksify\/content-loop":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/content-loop","version":"0.1.0","title":"Content Loop","category":"blocksify","description":"Zone-based content loop. Build cards from a layout of media + header + body + footer zones with overlay slots.","textdomain":"blocksify","icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 4h8v6H3V4zm0 8h8v8H3v-8zm10-8h8v8h-8V4zm0 10h8v6h-8v-6z\"\/><\/svg>","keywords":["content","loop","posts","card","grid","blog","news","blocksify"],"supports":{"html":false,"anchor":true,"align":["wide","full"],"className":false,"color":false,"reusable":true,"interactivity":true},"blocksifySupports":["spacing","visibility","animation"],"blocksifyAnimationTargets":[{"id":"root","label":"Loop Wrap"},{"id":"card","label":"Card","selector":".bsy-card"},{"id":"media","label":"Media","selector":".bsy-card__media"}],"attributes":{"uid":{"type":"string","default":""},"queryEntity":{"type":"string","default":"posts","description":"Which kind of thing the loop iterates, and therefore WHICH HALF of queryParams is read: \"posts\" reads the post keys, \"terms\" reads the taxonomy-term keys. The two key sets are disjoint \u2014 a posts key written on a terms loop (or the reverse) is inert. Free ships posts and terms; the list is extensible through the blocksify_cl_entities filter, so this is deliberately NOT a closed enum. An unrecognised value falls back to posts."},"queryParams":{"type":"object","default":{"postType":"post","perPage":6,"excludeCurrent":true},"description":"The query. Unrecognised keys are NEVER rejected and never warned about at render time \u2014 they are simply never read, so a plausible-looking wrong key (categories, cat, s, orderby, post__in, sticky) silently widens the loop to every post on the site. Check spelling against the properties below; blocksify\/validate-content flags keys that are not in this list. THE DEFAULT IS NOT DEEP-MERGED: writing queryParams at all replaces the whole default object, so restate postType, perPage and excludeCurrent every time (postType and perPage are re-seeded internally, but excludeCurrent is not and silently becomes false). Empty string, null and empty array values are skipped before they reach a handler. Which properties apply depends on queryEntity, noted per property below. Ignored entirely when querySource is \"inherit\".","properties":{"preset":{"type":["string","null"],"description":"Both entities. Reserved key, written and cleared by the editor's Query Preset picker, never by hand \u2014 it holds the slug of a preset registered through the blocksify.cl.query.presets filter. No handler reads it at render: the preset's own registrar seeds the real query keys alongside it, and this key only records WHICH preset is active so the editor can show it and detect hand overrides on top of it. An unregistered slug is inert rather than an error."},"postType":{"type":["string","array","null"],"description":"posts entity. Post-type slug, default \"post\". Passed through sanitize_key with NO registered-post-type check, so a typo yields an empty result set rather than an error. An array is tolerated but only its first entry is used."},"perPage":{"type":["integer","null"],"description":"posts entity. Items per page, default 6. Clamped to 1-100."},"page":{"type":["integer","null"],"description":"posts entity. Starting page. Only survives on URL page 1 with no offset \u2014 otherwise the URL-derived page wins and this is discarded. Prefer offset."},"offset":{"type":["integer","null"],"description":"posts entity. Items to skip, floored at 0. Stacks on top of the page-derived offset."},"order":{"type":["string","null"],"description":"posts entity. Sort direction. Only a case-insensitive \"asc\" is recognised; EVERY other value, including a misspelling, resolves to DESC. (On the terms entity the same key defaults the other way: anything but \"desc\" resolves to ASC.)"},"orderBy":{"type":["string","array","object","null"],"description":"posts entity, camelCase B. Sort field, passed to WP_Query unvalidated: date, modified, title, slug, id, author, menu_order, comment_count, rand. The all-lowercase \"orderby\" is a DIFFERENT key that this entity never reads \u2014 it belongs to the terms entity. An array is silently dropped. Setting \"rand\" discards order. An OBJECT is the Pro \"sort by custom field\" shape ({ metaKey, type }); its inner keys are deliberately left undescribed because Pro owns and may extend them, and a wrong guess here would reject the whole queryParams object. With Pro inactive the object is skipped and the loop falls back to WP's default date order."},"search":{"type":["string","null"],"description":"posts entity. Keyword search. The WP_Query name \"s\" is NOT read here."},"status":{"type":["string","array","null"],"description":"posts entity. Post status. Intersected against the PUBLIC statuses only, so non-public values such as draft, pending and private are discarded and the query falls back to publish."},"after":{"type":["string","null"],"description":"posts entity. Lower date bound, anything strtotime understands (\"-30 days\", \"today\", an ISO date). A compact \"-30d\" form is also accepted."},"before":{"type":["string","null"],"description":"posts entity. Upper date bound, same grammar as after."},"featuredOnly":{"type":["boolean","null"],"description":"posts entity. Restrict to posts that have a featured image."},"excludeCurrent":{"type":["boolean","null"],"description":"posts entity. Drop the post being viewed from the results. Only has an effect on a singular view. Defaults to FALSE whenever you write queryParams yourself \u2014 restate it."},"stickyPosts":{"type":["string","null"],"description":"posts entity. How sticky posts are treated: include (default), exclude, only, or ignore. An unrecognised value behaves as include."},"author":{"type":["array","null"],"description":"posts entity. Author IDs to include.","items":{"type":["integer","string"]}},"authorExclude":{"type":["array","null"],"description":"posts entity. Author IDs to exclude.","items":{"type":["integer","string"]}},"include":{"type":["array","null"],"description":"posts entity. Post IDs to restrict to. The WP_Query name \"post__in\" is NOT read here.","items":{"type":["integer","string"]}},"exclude":{"type":["array","null"],"description":"posts entity. Post IDs to drop.","items":{"type":["integer","string"]}},"parent":{"type":["array","integer","null"],"description":"posts entity: an ARRAY of parent post IDs. terms entity: a single parent term ID."},"parentExclude":{"type":["array","null"],"description":"posts entity. Parent post IDs to drop.","items":{"type":["integer","string"]}},"taxRelation":{"type":["string","null"],"description":"posts entity. How the taxQuery \/ taxQueryExclude clauses combine: \"OR\" (case-insensitive) or anything else, which means AND. Only applied once there are two or more clauses."},"taxQuery":{"type":["array","null"],"description":"posts entity. Taxonomy filters to INCLUDE. This is the only way to filter by category or tag \u2014 \"categories\" and \"cat\" are not read and leave the loop unfiltered. A row may also carry \"rest\" (the taxonomy's REST base, e.g. \"categories\" for \"category\"). The editor writes it and uses it to key the preview fetch; the server render ignores it. It is optional when authoring by hand \u2014 omitting it costs nothing at render.","items":{"type":["object","null"],"properties":{"taxonomy":{"type":["string","null"],"description":"Taxonomy slug, e.g. category or post_tag. Required \u2014 a row without it is dropped and the loop silently widens."},"terms":{"type":["array","null"],"description":"Term IDs. INTEGER IDs ONLY \u2014 a slug is run through absint, becomes 0, is filtered out, and the whole row is then dropped, leaving the loop unfiltered. There is no \"field\" option: the lookup field is hard-coded to term_id, so writing field: \"slug\" changes nothing. Resolve slugs to IDs first. May be empty only for the EXISTS \/ NOT EXISTS operators.","items":{"type":["integer","string","null"]}},"operator":{"type":["string","null"],"description":"One of IN (the default here), NOT IN, AND, EXISTS, NOT EXISTS, upper-cased before matching. An unrecognised value falls back to IN."},"includeChildren":{"type":["boolean","null"],"description":"Whether child terms match too, default true. camelCase \u2014 the snake_case include_children is not read."}}}},"taxQueryExclude":{"type":["array","null"],"description":"posts entity. Taxonomy filters to EXCLUDE. Same row shape as taxQuery, except the default operator is NOT IN. Merged with taxQuery into one clause set joined by taxRelation.","items":{"type":["object","null"],"properties":{"taxonomy":{"type":["string","null"]},"terms":{"type":["array","null"],"items":{"type":["integer","string","null"]}},"operator":{"type":["string","null"]},"includeChildren":{"type":["boolean","null"]}}}},"metaQuery":{"type":["array","object","null"],"description":"posts entity. Custom-field clauses. Pro-only: Free ships the catalog stub so the key survives a storage round-trip, but registers NO handler, so on Free the key is read by nothing and filters nothing \u2014 a loop that relies on it returns every post. Repeatable, so the editor stores it as an ARRAY of clause rows; a SINGLE clause written as a bare object is also accepted, because Pro's handler wraps one clause map into a list rather than rejecting it, and a schema narrower than the handler would throw the whole queryParams away. The row shape is owned by Pro and deliberately left undeclared here: guessing it wrong would make WordPress reject the whole queryParams object at render, which costs the post type, the taxonomy filters and the page size too."},"taxonomy":{"type":["string","null"],"description":"terms entity. Taxonomy to list terms from, default \"category\"."},"number":{"type":["integer","null"],"description":"terms entity. Terms per page, default 6, clamped to 1-100. This is the terms-entity spelling of perPage."},"orderby":{"type":["string","null"],"description":"terms entity, ALL LOWERCASE. One of name (default), count, term_id or slug; anything else leaves the ordering untouched. The posts entity uses the camelCase orderBy instead."},"hideEmpty":{"type":["boolean","null"],"description":"terms entity. Skip terms with no posts, default true."}}},"querySource":{"type":"string","default":"inline","description":"Where the query comes from: \"inline\" uses this block's queryParams, \"inherit\" ignores queryParams entirely and re-uses the page's main query (archive \/ search \/ taxonomy templates). The list is extensible \u2014 Blocksify Pro registers a saved-query source \u2014 so this is deliberately NOT a closed enum; an unrecognised slug that no filter answers for falls back to inline."},"inheritPostType":{"type":"string","default":""},"integrationSettings":{"type":"object","default":{}},"layoutType":{"type":"string","default":"grid","enum":["grid","list","carousel","masonry"],"description":"How the results are laid out. Anything outside this set falls back to grid \u2014 which also changes the wrapper class and skips the view.js runtime that the non-grid layouts need."},"cardLayout":{"type":"string","default":"stacked","enum":["stacked","row"],"description":"Card internal layout: stacked puts the media above the text, row puts it beside. Anything outside this set falls back to stacked."},"cardLink":{"type":"string","default":"default","enum":["default","card-wrap"],"description":"Which part of a card is clickable: default links only the title, card-wrap makes the whole card a link. Anything outside this set behaves as default."},"columns":{"type":"number","default":3},"columnsTablet":{"type":"number","default":2},"columnsMobile":{"type":"number","default":1},"gap":{"type":["object","null"],"default":null},"gapTablet":{"type":["object","null"]},"gapMobile":{"type":["object","null"]},"rowGap":{"type":["object","null"],"default":null},"rowGapTablet":{"type":["object","null"]},"rowGapMobile":{"type":["object","null"]},"paginationItems":{"type":"array","default":[{"id":"nav","value":{"style":"numbers","siblingCount":1}}]},"paginationItemStyling":{"type":"object","default":{"nav":{"padding":{"base":{"mode":"per-side","top":{"value":0.4,"unit":"em"},"right":{"value":0.75,"unit":"em"},"bottom":{"value":0.4,"unit":"em"},"left":{"value":0.75,"unit":"em"}}},"borderRadius":{"base":{"mode":"linked","value":0.25,"unit":"rem"}},"fontSize":{"base":{"value":90,"unit":"%"}},"backgroundColor":{"base":"color-mix(in srgb, currentcolor 10%, transparent)","hover":"color-mix(in srgb, currentcolor 17%, transparent)"}}}},"paginationItemIndicatorStyling":{"type":"object","default":{}},"paginationStyling":{"type":"object","default":{}},"paginationUrlState":{"type":"string","default":"none","enum":["none","push","replace"],"description":"Whether paging writes the page number into the address bar. none keeps the widget stateless and ignores a stale page parameter entirely. Anything outside this set behaves as none."},"paginationUrlKey":{"type":"string","default":""},"emptyStateText":{"type":"string","default":""},"layout":{"type":"object","default":{"media":{"image":{"type":"image","value":{"size":"medium_large","aspectRatio":"16\/9","link":true,"objectFit":"cover","hoverEffect":"zoom-in"}},"overlays":{},"bgOverlay":{"color":"#000000","opacity":9}},"header":[{"type":"category","value":{"link":true},"styling":{"padding":{"base":{"mode":"per-side","top":{"value":0.125,"unit":"em"},"right":{"value":0.5,"unit":"em"},"bottom":{"value":0.125,"unit":"em"},"left":{"value":0.5,"unit":"em"}}},"borderRadius":{"base":{"mode":"linked","value":0.2,"unit":"rem"}},"fontSize":{"base":{"value":90,"unit":"%"}},"backgroundColor":{"base":"color-mix(in srgb, currentcolor 10%, transparent)","hover":"color-mix(in srgb, currentcolor 17%, transparent)"}},"side":"L"}],"body":[{"type":"title","value":{"tag":"h2","link":true}},{"type":"description","value":{"length":20,"lengthUnit":"words"}}],"footer":[{"type":"author","value":{"link":false,"avatar":false,"avatarSize":20,"icon":{"source":"lucide","name":"circle-user-round","strokeWidth":2}},"styling":{"flexDirection":{"base":"row"},"alignItems":{"base":"center"}},"side":"L"},{"type":"date","value":{"link":false,"icon":{"source":"lucide","name":"calendar-days","strokeWidth":2}},"side":"L"}],"footerStyling":{"flexDirection":{"base":"row"},"columnGap":{"base":{"token":"xs"}}}}}},"viewScriptModule":"file:.\/view-router.js","editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-content-loop-editor.css","render":"file:.\/render.php"},"blocksify\/button":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/button","version":"1.0.0","title":"Button","category":"blocksify","description":"A customizable button block.","textdomain":"blocksify","keywords":["button","link","cta","action","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"10\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"color":false,"reusable":true},"usesContext":["blocksify\/innerBlock","postId","postType"],"blocksifySupports":{"color":{"text":true,"background":true},"background":{"gradient":true},"typography":true,"spacing":{"padding":true,"margin":true},"border":{"border":true,"radius":true,"shadow":true},"size":true,"overflow":true,"position":true,"zindex":true,"visibility":true},"attributes":{"uid":{"type":"string","default":""},"content":{"type":"string","source":"html","selector":".bsy-button","default":""},"url":{"type":"string"},"linkTarget":{"type":"string"},"rel":{"type":"string"},"tagName":{"type":"string","default":"a","enum":["a","button","div","span"],"description":"Rendered HTML element. Anything outside this set falls back to a at render time."},"preset":{"type":"string","default":"fill"},"contentType":{"type":"string","default":"text","enum":["text","html","blocks"],"description":"Where the button label comes from: text and html read the content attribute, blocks renders the inner blocks instead. Anything outside this set is treated as text at render time."},"styleClass":{"type":"string","default":""},"icon":{"type":["object","null"]},"iconPosition":{"type":"string","default":"before","enum":["before","after"],"description":"Which side of the label the icon sits on. The vocabulary is before \/ after \u2014 NOT left \/ right. Anything outside this set falls back to before, so \"right\" silently places the icon on the LEFT, the opposite of the intent. Note the name is overloaded across blocks: blocksify\/tabs and blocksify\/icon-list spell the same idea left \/ right \/ top, and blocksify\/accordion spells it left \/ right."},"padding":{"type":["object","null"],"default":{"top":{"value":1,"unit":"rem"},"right":{"value":1.5,"unit":"rem"},"bottom":{"value":1,"unit":"rem"},"left":{"value":1.5,"unit":"rem"},"mode":"linked"}},"borderRadius":{"type":["object","null"],"default":{"value":6,"unit":"px","mode":"linked"}},"dynamic":{"type":["object","null"],"default":null}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-button-editor.css","render":"file:.\/render.php"},"blocksify\/icon-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/icon-list","version":"1.0.0","title":"Icon List","category":"blocksify","description":"A list of icon + text items (vertical or horizontal), with per-element (item \/ icon \/ text) styling.","textdomain":"blocksify","keywords":["icon","list","features","checklist","social","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 6h12M8 12h8M8 18h12M3.5 6h.01M3.5 12h.01M3.5 18h.01\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"color":false,"reusable":true},"allowedBlocks":["blocksify\/icon-list-item"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"flexDirection":{"type":"string","default":"column","enum":["row","row-reverse","column","column-reverse"],"description":"Main axis of the list container (CSS flex-direction). Same vocabulary and same emitter as blocksify\/container. As on every keyword attribute here, the Tablet \/ Mobile variants accept the same enum plus null, the clear sentinel that stops the Mobile-to-Tablet-to-Desktop cascade at that device; null is listed in those enums because WordPress validates the enum against the stored value even when the type union admits null, and an enum that omitted it would make the render-time schema check discard the override."},"flexDirectionTablet":{"type":["string","null"],"enum":["row","row-reverse","column","column-reverse",null]},"flexDirectionMobile":{"type":["string","null"],"enum":["row","row-reverse","column","column-reverse",null]},"justifyContent":{"type":"string","enum":["flex-start","center","flex-end","space-between"],"description":"Main-axis distribution (CSS justify-content). Unset means the CSS initial value (flex-start); a value outside this set emits no declaration at all."},"justifyContentTablet":{"type":["string","null"],"enum":["flex-start","center","flex-end","space-between",null]},"justifyContentMobile":{"type":["string","null"],"enum":["flex-start","center","flex-end","space-between",null]},"alignItems":{"type":"string","enum":["flex-start","center","flex-end","stretch"],"description":"Cross-axis alignment of the list items (CSS align-items). A value outside this set emits no declaration at all. This is NOT iconVerticalAlignment, which aligns the icon against its own item's text."},"alignItemsTablet":{"type":["string","null"],"enum":["flex-start","center","flex-end","stretch",null]},"alignItemsMobile":{"type":["string","null"],"enum":["flex-start","center","flex-end","stretch",null]},"flexWrap":{"type":"string","enum":["nowrap","wrap","wrap-reverse"],"description":"Whether items may wrap onto more lines (CSS flex-wrap). Unset behaves as nowrap; a value outside this set emits no declaration at all."},"flexWrapTablet":{"type":["string","null"],"enum":["nowrap","wrap","wrap-reverse",null]},"flexWrapMobile":{"type":["string","null"],"enum":["nowrap","wrap","wrap-reverse",null]},"rowGap":{"type":["object","null"],"default":{"token":"2xs"}},"rowGapTablet":{"type":["object","null"]},"rowGapMobile":{"type":["object","null"]},"columnGap":{"type":["object","null"]},"columnGapTablet":{"type":["object","null"]},"columnGapMobile":{"type":["object","null"]},"iconPosition":{"type":"string","default":"left","enum":["left","right","top"],"description":"Where the icon sits relative to its item's text. Anything outside this set falls back to left. The name is overloaded across blocks: blocksify\/button and blocksify\/form-submit spell the same idea before \/ after, and blocksify\/accordion accepts only left \/ right."},"iconVerticalAlignment":{"type":"string","default":"center","enum":["top","bottom","center"],"description":"Vertical alignment of the icon against its item's text, emitted as align-items: top maps to flex-start, bottom to flex-end, center to center. The vocabulary is these three keywords, NOT the CSS values they emit \u2014 \"flex-start\" is outside the set and silently falls back to center. Ignored entirely unless iconPosition is left or right."},"iconSize":{"type":["object","null"],"default":{"token":"sm"}},"iconSizeTablet":{"type":["object","null"]},"iconSizeMobile":{"type":["object","null"]},"iconGap":{"type":["object","null"],"default":{"token":"2xs"}},"iconGapTablet":{"type":["object","null"]},"iconGapMobile":{"type":["object","null"]},"itemStyling":{"type":"object","default":{}},"iconStyling":{"type":"object","default":{}},"textStyling":{"type":"object","default":{}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-icon-list-editor.css","render":"file:.\/render.php"},"blocksify\/image":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/image","version":"1.0.0","title":"Image","category":"blocksify","description":"Display an image with caption, link, duotone, and per-instance styling.","textdomain":"blocksify","keywords":["image","photo","picture","media","figure","blocksify"],"usesContext":["postId","postType"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"3.09 2.59 18.82 18.82\" fill=\"currentColor\"><path d=\"M9.145 6.935a1.625 1.625 0 0 0 0 3.25h.01a1.625 1.625 0 0 0 0-3.25z\"\/><path d=\"M3.75 5.5A2.25 2.25 0 0 1 6 3.25h13a2.25 2.25 0 0 1 2.25 2.25v13A2.25 2.25 0 0 1 19 20.75H6a2.25 2.25 0 0 1-2.25-2.25zM6 4.75a.75.75 0 0 0-.75.75v10.08l1.451-1.9a2.25 2.25 0 0 1 3.584.01L11.5 15.3a.75.75 0 0 0 1.293-.168l1.978-4.847c.667-1.635 2.872-1.9 3.906-.468l1.073 1.484V5.5a.75.75 0 0 0-.75-.75zM5.25 18.5c0 .414.336.75.75.75h13a.75.75 0 0 0 .75-.75v-4.64l-2.288-3.164a.75.75 0 0 0-1.302.156l-1.978 4.846c-.66 1.616-2.827 1.899-3.879.506l-1.215-1.61a.75.75 0 0 0-1.195-.003l-2.492 3.264a.8.8 0 0 1-.151.148z\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"color":false,"reusable":true,"filter":{"duotone":"img, .components-placeholder"}},"blocksifySupports":{"spacing":{"padding":true,"margin":true},"border":{"border":true,"radius":true,"shadow":true},"size":true,"overflow":true,"position":true,"zindex":true,"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"id":{"type":["number","null"],"default":null,"description":"Attachment ID. OPTIONAL and NOT sufficient on its own: it only adds the wp-image-{id} class and resolves the media link target. render.php never looks an ID up to find the image itself, so a block carrying id with no url emits an empty wrapper and no img at all. Always set url. (Note the opposite convention on blocksify\/gallery, whose images items DO resolve from id alone.)"},"url":{"type":["string","null"],"default":null,"description":"Image src. REQUIRED \u2014 this is the only attribute that makes the block render an img. An empty or missing url emits an empty wrapper element and nothing else. Resolve the URL first (blocksify\/list-media or blocksify\/sideload-media return one) rather than relying on id."},"alt":{"type":["string","null"],"default":null},"caption":{"type":"string","default":""},"sizeSlug":{"type":"string","default":"large"},"width":{"type":["number","null"],"default":null},"height":{"type":["number","null"],"default":null},"aspectRatio":{"type":["string","null"],"default":null},"objectFit":{"type":["string","null"],"default":null},"objectPosition":{"type":["string","null"],"default":null},"imageAlignment":{"type":"string","default":"","enum":["","left","center","right"],"description":"Horizontal placement of the image inside its wrapper. Empty means no alignment class is emitted; anything outside this set behaves the same as empty."},"tagName":{"type":"string","default":"figure","enum":["figure","div"],"description":"Wrapper HTML element. Anything outside this set falls back to figure at render time."},"linkTo":{"type":"string","default":"none","enum":["none","media","custom"],"description":"What the image links to: none, media (the attachment file, resolved from id) or custom (the url_link attribute \u2014 note that key is snake_case and is NOT the same as url, which holds the image itself). Anything outside this set falls back to none."},"url_link":{"type":["string","null"],"default":null},"linkTarget":{"type":["string","null"],"default":null},"rel":{"type":["string","null"],"default":null},"loading":{"type":"string","default":"lazy","enum":["lazy","eager"],"description":"Native img loading attribute. Anything outside this set falls back to lazy."},"dynamic":{"type":["object","null"],"default":null}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-image-editor.css","render":"file:.\/render.php"},"blocksify\/product-price":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/product-price","version":"1.0.0","title":"Product Price","category":"blocksify-woocommerce","description":"The current product's price, from WooCommerce.","textdomain":"blocksify","keywords":["woocommerce","product","price","wc","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3v18\"\/><path d=\"M17 6.5H9.5a3 3 0 0 0 0 6h5a3 3 0 0 1 0 6H7\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":true,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"salePriceGap":{"type":["object","null"],"default":null},"salePriceGapTablet":{"type":["object","null"],"default":null},"salePriceGapMobile":{"type":["object","null"],"default":null},"regularPriceStyling":{"type":"object","default":{}},"salePriceStyling":{"type":"object","default":{}},"rangePriceStyling":{"type":"object","default":{}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-product-price-editor.css","style":"file:.\/blocksify-product-price.css","render":"file:.\/render.php"},"blocksify\/product-rating":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/product-rating","version":"1.0.0","title":"Product Rating","category":"blocksify-woocommerce","description":"The current product's star rating, from WooCommerce.","textdomain":"blocksify","keywords":["woocommerce","product","rating","stars","review","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m12 3 2.9 5.9 6.5.94-4.7 4.58 1.11 6.48L12 17.85l-5.81 3.05L7.3 14.42 2.6 9.84l6.5-.94z\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":true,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"showCount":{"type":"boolean","default":true},"starsStyling":{"type":"object","default":{}},"labelStyling":{"type":"object","default":{}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-product-rating-editor.css","render":"file:.\/render.php"},"blocksify\/product-additional-information":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/product-additional-information","version":"1.0.0","title":"Product Additional Information","category":"blocksify-woocommerce","description":"The current product's additional information content, without WooCommerce tab navigation.","textdomain":"blocksify","keywords":["woocommerce","product","additional information","attributes","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"1.5\"\/><path d=\"M3 9h18M9 4v16M6 13h.01M6 16h.01M12 13h6M12 16h4\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":true,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"spacing":true,"size":true,"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-product-additional-information-editor.css","render":"file:.\/render.php"},"blocksify\/product-add-to-cart":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/product-add-to-cart","version":"1.1.2","title":"Product Add to Cart","category":"blocksify-woocommerce","description":"The current product's add-to-cart button, from WooCommerce.","textdomain":"blocksify","keywords":["woocommerce","product","add to cart","buy","button","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 4h2l2.4 12.2a1 1 0 0 0 1 .8h8.7a1 1 0 0 0 1-.78L21 8H6\"\/><circle cx=\"9\" cy=\"20\" r=\"1.25\"\/><circle cx=\"18\" cy=\"20\" r=\"1.25\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":true,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"quantitySelectorStyle":{"type":"string","default":"stepper"},"openMiniCartOnSuccess":{"type":"boolean","default":true},"showStockStatus":{"type":"boolean","default":true},"showPrice":{"type":"boolean","default":true},"showVariationDescription":{"type":"boolean","default":true},"purchaseLayout":{"type":"string","default":"inline"},"purchaseLayoutTablet":{"type":["string","null"]},"purchaseLayoutMobile":{"type":["string","null"]},"formStyling":{"type":"object","default":{}},"labelStyling":{"type":"object","default":{}},"selectStyling":{"type":"object","default":{}},"buttonStyling":{"type":"object","default":{}},"inputStyling":{"type":"object","default":{}},"checkboxStyling":{"type":"object","default":{}},"clearLinkStyling":{"type":"object","default":{}},"priceStyling":{"type":"object","default":{}},"regularPriceStyling":{"type":"object","default":{}},"inStockStyling":{"type":"object","default":{}},"outOfStockStyling":{"type":"object","default":{}},"backorderStyling":{"type":"object","default":{}},"messageStyling":{"type":"object","default":{}}},"editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","editorStyle":"file:.\/blocksify-product-add-to-cart-editor.css","style":"file:.\/blocksify-product-add-to-cart.css","render":"file:.\/render.php"},"blocksify\/product-stock":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/product-stock","version":"1.0.0","title":"Product Stock","category":"blocksify-woocommerce","description":"The current product's stock availability, from WooCommerce.","textdomain":"blocksify","keywords":["woocommerce","product","stock","availability","inventory","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7 12 3l9 4-9 4z\"\/><path d=\"M3 7v10l9 4 9-4V7\"\/><path d=\"M12 11v10\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":true,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"display":{"type":"string","default":"status"},"hideWhenInStock":{"type":"boolean","default":false},"textInStock":{"type":"string","default":""},"textOutOfStock":{"type":"string","default":""},"textOnBackorder":{"type":"string","default":""},"textQuantity":{"type":"string","default":""},"inStockStyling":{"type":"object","default":{}},"outOfStockStyling":{"type":"object","default":{}},"backorderStyling":{"type":"object","default":{}},"quantityStyling":{"type":"object","default":{}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-product-stock-editor.css","style":"file:.\/blocksify-product-stock.css","render":"file:.\/render.php"},"blocksify\/section":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/section","version":"1.3.0","title":"Section","category":"blocksify","description":"A performance-first grid section. Responsive columns with per-device control.","textdomain":"blocksify","icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M1 5h22v14H1V5zm1.5 1.5v11h19v-11h-19z\"\/><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\"\/><\/svg>","keywords":["section","grid","row","columns","cols","layout","container","wrapper","group","flex","blocksify"],"supports":{"html":false,"anchor":true,"align":["wide","full"],"className":false,"color":false},"blocksifySupports":["color","background","typography","spacing","border","size","overflow","position","zindex","visibility","animation"],"providesContext":{"blocksify\/innerBlock":"uid"},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"contentWidth":{"type":"string","default":"theme","enum":["theme","custom","full","edge"],"description":"How wide the inner content area is and whether it keeps a gutter. theme = the align-driven theme content width; custom = the maxWidth bag; full = 100% of the Section, gutter kept; edge = 100% with the gutter dropped. full and edge describe an inner that has broken out of the theme column, so they only apply on a Section aligned wide or full \u2014 stored on an unaligned Section they read back as theme. Not responsive: one mode for all devices."},"count":{"type":"number","default":2,"description":"How many child items the Section lays out, 1-6. Also the number of equal grid tracks when fr is omitted, so count on its own is enough to get N columns."},"countTablet":{"type":"number"},"countMobile":{"type":"number","default":1},"fr":{"type":"array","description":"Grid track ratios, e.g. [2,1] or [1,1.5,1] \u2014 fractional values are allowed. Omit it to get count equal tracks; it has no default precisely so that an omitted fr means \"follow count\" rather than a stale [1,1]. A shorter fr than count is a deliberate reshape (items flow into fewer tracks), which is why fr is never padded to count."},"frTablet":{"type":"array"},"frMobile":{"type":"array"},"span":{"type":["string","null"],"default":null,"enum":["first","last",null],"description":"Column-span reshape for an odd child out: first makes a leading child span two columns, last makes a trailing one span two. Omit the key, or set null, for no reshape \u2014 null is the clear sentinel here and on the device variants, and is accepted alongside the enum values."},"spanTablet":{"type":["string","null"],"enum":["first","last",null]},"spanMobile":{"type":["string","null"],"enum":["first","last",null]},"reverseItems":{"type":"boolean","default":false},"reverseItemsTablet":{"type":"boolean"},"reverseItemsMobile":{"type":"boolean"},"gap":{"type":["object","null"],"default":{"value":1.5,"unit":"rem"},"description":"Gap between COLUMNS of the grid \u2014 despite the bare name this is the horizontal axis only; the vertical axis is rowGap. The two are emitted together as the `gap: <row> <column>` shorthand. Bag shape: { \"token\": \"sm\" } or { \"value\": 1.5, \"unit\": \"rem\" }."},"gapTablet":{"type":["object","null"]},"gapMobile":{"type":["object","null"]},"rowGap":{"type":["object","null"],"default":{"value":1.5,"unit":"rem"},"description":"Gap between grid ROWS \u2014 the vertical axis, paired with `gap` for the horizontal one. Same bag shape."},"rowGapTablet":{"type":["object","null"]},"rowGapMobile":{"type":["object","null"]},"contentVerticalAlign":{"type":"string","enum":["start","center","end","stretch"],"description":"Where the whole content box sits inside the Section's own height. The Section wrapper becomes a vertical flex container and the inner grid is placed in it, so this only moves anything when the Section is TALLER than its content \u2014 give it a height or minHeight via the size trait first, otherwise the wrapper hugs the content and every value looks the same. This is not per-column alignment: the inner stays a grid and each Container keeps its own sizing. start\/center\/end place the intrinsic-height content box at the top\/middle\/bottom; stretch grows it to fill the available height instead."},"contentVerticalAlignTablet":{"type":["string","null"],"enum":["start","center","end","stretch"],"description":"Tablet override for contentVerticalAlign. null clears the override so the value inherits from the desktop base (FOUNDATION 5.4)."},"contentVerticalAlignMobile":{"type":["string","null"],"enum":["start","center","end","stretch"],"description":"Mobile override for contentVerticalAlign. null clears the override so the value inherits from tablet, then desktop (FOUNDATION 5.4)."},"maxWidth":{"type":["object","null"]},"maxWidthTablet":{"type":["object","null"]},"maxWidthMobile":{"type":["object","null"]},"tagName":{"type":"string","default":"section","enum":["div","section","article","header","footer","main","aside","nav"],"description":"Wrapper HTML element. Anything outside this set falls back to section at render time."},"dynamic":{"type":["object","null"],"default":null},"renderWhen":{"type":"string","default":"","description":"Render condition id. Empty = always render. A non-empty value is gated server-side by Blocksify_Render_Conditions before the children render; the editor always shows the block."}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-section-editor.css","render":"file:.\/render.php"},"blocksify\/tabs":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/tabs","version":"1.0.0","title":"Tabs","category":"blocksify","description":"Accessible tabbed content with per-tab icons, subtitles, and Interactivity-API switching.","textdomain":"blocksify","keywords":["tabs","tab","accordion","navigation","interactive","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M3 7H9V11H3V7Z\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><path d=\"M11 7H21V11H11V7Z\" stroke=\"currentColor\" stroke-width=\"1.25\" opacity=\"0.45\"\/><rect x=\"3\" y=\"13\" width=\"18\" height=\"7\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"color":false,"reusable":true,"interactivity":true},"usesContext":["blocksify\/innerBlock","postId","postType"],"providesContext":{"blocksify\/innerBlock":"uid","blocksify\/tabs\/activeIndex":"activeIndex","blocksify\/tabs\/tabPosition":"tabPosition","blocksify\/tabs\/showSubtitle":"showSubtitle","blocksify\/tabs\/showIcon":"showIcon"},"allowedBlocks":["blocksify\/tab"],"blocksifySupports":{"visibility":true},"attributes":{"uid":{"type":"string","default":""},"styleClass":{"type":"string","default":""},"source":{"type":"string","default":"content"},"hideEmptyTabs":{"type":"boolean","default":true,"description":"Search source only. Drop tabs whose post type has no results for the current search term \u2014 tab and panel both. Off, empty tabs render with a 0 badge and open to the loop's own empty state."},"excludedTypes":{"type":"array","default":[],"description":"Search source only. Post type slugs the author hid from the tab strip. Visibility only \u2014 it cannot add or rename a type. A hidden type's panel stays in the content, just unrendered."},"preset":{"type":"string","default":"default"},"tabPosition":{"type":"string","default":"top","enum":["top","right","bottom","left"],"description":"Which edge of the panels the tablist sits on. Anything outside this set falls back to top. The Tablet \/ Mobile variants accept the same enum plus the empty string, which means \"no override on this device\"."},"tabPositionTablet":{"type":"string","enum":["","top","right","bottom","left"]},"tabPositionMobile":{"type":"string","enum":["","top","right","bottom","left"]},"tablistWidth":{"type":["object","null"],"default":null},"tablistWidthTablet":{"type":["object","null"]},"tablistWidthMobile":{"type":["object","null"]},"tabGap":{"type":["object","null"],"default":{"token":"sm"}},"tabGapTablet":{"type":["object","null"]},"tabGapMobile":{"type":["object","null"]},"tabSpacing":{"type":["object","null"],"default":null},"tabSpacingTablet":{"type":["object","null"]},"tabSpacingMobile":{"type":["object","null"]},"tabOverflow":{"type":"string","default":"scroll","enum":["scroll","wrap","carousel","stack"],"description":"How the tablist handles more tabs than fit. Anything outside this set falls back to scroll. The Tablet \/ Mobile variants accept the same enum plus the empty string, which means \"no override on this device\"."},"tabOverflowTablet":{"type":"string","enum":["","scroll","wrap","carousel","stack"]},"tabOverflowMobile":{"type":"string","enum":["","scroll","wrap","carousel","stack"]},"tabWidth":{"type":"string","default":"auto","enum":["auto","equal","justified"],"description":"How tab buttons share the tablist width. Anything outside this set falls back to auto. The Tablet \/ Mobile variants accept the same enum plus the empty string, which means \"no override on this device\"."},"tabWidthTablet":{"type":"string","enum":["","auto","equal","justified"]},"tabWidthMobile":{"type":"string","enum":["","auto","equal","justified"]},"tabAlign":{"type":"string","default":"start","enum":["start","center","end"],"description":"Alignment of the tab buttons within the tablist. Anything outside this set falls back to start. The Tablet \/ Mobile variants accept the same enum plus the empty string, which means \"no override on this device\"."},"tabAlignTablet":{"type":"string","enum":["","start","center","end"]},"tabAlignMobile":{"type":"string","enum":["","start","center","end"]},"activeIndex":{"type":"number","default":0},"defaultActiveIndex":{"type":"number","default":0},"tabCount":{"type":"number","default":0},"titles":{"type":"array","default":[],"description":"Per-tab metadata, one entry per child blocksify\/tab, in child order. This is where every tab LABEL lives \u2014 the child block carries only the panel content, so a tabs block whose titles list is missing, short or misshapen renders a tablist of empty, unclickable buttons. Entries pair with children positionally. Every entry must be an object { uid, label, subtitle, icon, anchor }; a bare string is not a label and renders nothing. uid is the entry's own identity, 8 lowercase alphanumeric characters \u2014 it is NOT the child tab's uid and never has to match one. label is the visible tab text and accepts inline formatting HTML; without it the tab button renders empty. subtitle is a secondary label, rendered only while showSubtitle is true. icon is an icon bag { source, name, strokeWidth } or null, rendered only while showIcon is true \u2014 a bare icon NAME string is not an icon bag and renders nothing. anchor is an optional HTML id for the tab button. Neither the ELEMENT shape nor the per-field shapes are declared as sub-schemas, and that is deliberate. render.php degrades per entry and per field \u2014 a non-object entry costs that one tab its label, a non-object icon becomes no icon, a non-string label is cast \u2014 whereas any schema narrower than that makes WordPress discard the ENTIRE titles array: core validates an array by short-circuiting on the FIRST bad element and the failure is per-ATTRIBUTE, so one malformed entry falls back to the [] default and strips every tab's label, including the well-formed ones. An `items` type list is that mistake one level up from a per-field sub-schema, and it is the more tempting one, because it looks like it only describes the entry. blocksify\/validate-content is the layer that reports a malformed entry or field, at write time, without that blast radius \u2014 tabs_title_not_object names the offending index."},"showIcon":{"type":"boolean","default":false},"showSubtitle":{"type":"boolean","default":false},"subtitleOnActive":{"type":"boolean","default":false},"iconPosition":{"type":"string","default":"left","enum":["left","right","top"],"description":"Where a tab's icon sits relative to its label. Anything outside this set falls back to left. The name is overloaded across blocks: blocksify\/button and blocksify\/form-submit spell the same idea before \/ after, and blocksify\/accordion accepts only left \/ right. The Tablet \/ Mobile variants accept the same enum plus the empty string, which means \"no override on this device\"."},"iconPositionTablet":{"type":"string","enum":["","left","right","top"]},"iconPositionMobile":{"type":"string","enum":["","left","right","top"]},"iconVerticalAlignment":{"type":"string","default":"center","enum":["top","bottom","center"],"description":"Vertical alignment of a tab's icon against its label, emitted as align-items: top maps to flex-start, bottom to flex-end, center to center. The vocabulary is these three keywords, NOT the CSS values they emit \u2014 \"flex-start\" is outside the set and silently falls back to center."},"iconVerticalAlignmentTablet":{"type":"string","enum":["","top","bottom","center"]},"iconVerticalAlignmentMobile":{"type":"string","enum":["","top","bottom","center"]},"iconSize":{"type":["object","null"],"default":{"value":1.5,"unit":"em"}},"iconSizeTablet":{"type":["object","null"]},"iconSizeMobile":{"type":["object","null"]},"iconGap":{"type":["object","null"],"default":null},"iconGapTablet":{"type":["object","null"]},"iconGapMobile":{"type":["object","null"]},"tablistStyling":{"type":"object","default":{}},"tabStyling":{"type":"object","default":{}},"tabActiveStyling":{"type":"object","default":{"backgroundColor":{"base":"color-mix(in srgb, currentcolor 10%, transparent)"},"borderRadius":{"base":{"mode":"linked","value":5,"unit":"px"}}}},"tabContentStyling":{"type":"object","default":{}},"subtitleStyling":{"type":"object","default":{}},"iconStyling":{"type":"object","default":{}},"iconActiveStyling":{"type":"object","default":{}}},"viewScriptModule":"file:.\/view.js","editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-tabs-editor.css","render":"file:.\/render.php"},"blocksify\/marquee":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/marquee","version":"1.0.0","title":"Marquee","category":"blocksify","description":"A horizontally scrolling marquee of text, image and icon items. CSS-only animation with pause-on-hover and edge fade.","textdomain":"blocksify","keywords":["marquee","scroll","ticker","logos","brands","carousel","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6.5\" y=\"7\" width=\"6\" height=\"10\" rx=\"1\"\/><rect x=\"14.5\" y=\"7\" width=\"6\" height=\"10\" rx=\"1\"\/><path d=\"M22.5 9.5v5\"\/><path d=\"M4 9.5H2.5M4.5 12H2M4 14.5H2.5\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":["wide","full"],"className":false,"color":false,"reusable":true},"blocksifySupports":{"spacing":true,"background":{"color":true},"color":{"background":true},"border":true,"visibility":true},"attributes":{"uid":{"type":"string","default":""},"items":{"type":"array","default":[],"description":"Marquee content, in display order. Every entry is a two-key ENVELOPE {\"id\": variant, \"value\": {\u2026}} and the payload keys live INSIDE value, one level down \u2014 the flat spelling {\"type\":\"text\",\"text\":\"Hello\"} reads perfectly well, is read by nothing, and renders zero HTML while the block still emits its per-instance CSS. id is the variant discriminator: text reads value.text, image reads value.media.url, icon reads value.icon; an absent or unrecognised id resolves to text, silently. Every variant also takes the optional link keys url \/ linkTarget \/ rel and an align override. The ELEMENT shape is deliberately NOT declared as an `items` sub-schema: core fails an array on the FIRST bad element and discards the whole ATTRIBUTE, so one malformed entry would wipe every item. blocksify\/validate-content reports the bad entry instead \u2014 marquee_item_not_object and marquee_item_renders_nothing, each naming the index."},"speed":{"type":"number","default":1.2},"reverse":{"type":"boolean","default":false},"pauseOnHover":{"type":"boolean","default":true},"edgeFade":{"type":"boolean","default":true},"edgeFadeWidth":{"type":["object","null"],"default":{"value":150,"unit":"px"}},"repeat":{"type":"number","default":3},"alignItems":{"type":"string","default":"center"},"gap":{"type":["object","null"],"default":{"token":"lg"}},"gapTablet":{"type":["object","null"]},"gapMobile":{"type":["object","null"]},"itemStyling":{"type":"object","default":{"padding":{"base":{"top":{"token":"xs"},"right":{"token":"xs"},"bottom":{"token":"xs"},"left":{"token":"xs"}}}}},"mediaStyling":{"type":"object","default":{}},"iconStyling":{"type":"object","default":{}},"textStyling":{"type":"object","default":{"fontSize":{"base":{"token":"2xl"}}}}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-marquee-editor.css","render":"file:.\/render.php"},"blocksify\/text":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/text","version":"1.0.0","title":"Text","category":"blocksify","description":"A paragraph of rich text.","textdomain":"blocksify","keywords":["text","heading","paragraph","title","h1","h2","h3","h4","h5","h6","p","blocksify"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"3\" y1=\"10\" x2=\"17\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"3\" y1=\"14\" x2=\"19\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"3\" y1=\"18\" x2=\"14\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><\/svg>","supports":{"html":false,"anchor":true,"align":false,"className":false,"color":false,"reusable":true},"usesContext":["postId","postType"],"blocksifySupports":{"typography":true,"color":true,"spacing":true,"border":true,"size":true,"overflow":true,"position":true,"zindex":true,"visibility":true},"attributes":{"uid":{"type":"string","default":""},"content":{"type":"string","source":"html","selector":"h1,h2,h3,h4,h5,h6,p,div,span","default":""},"tagName":{"type":"string","default":"p","enum":["h1","h2","h3","h4","h5","h6","p","div","span"],"description":"Rendered HTML element. Anything outside this set falls back to p at render time \u2014 blockquote, cite, figcaption, q and strong are NOT supported and render as a plain paragraph. A native post_content binding overrides the choice and forces div."},"styleClass":{"type":"string","default":""},"dynamic":{"type":["object","null"],"default":null},"indent":{"type":["object","null"]},"indentTablet":{"type":["object","null"]},"indentMobile":{"type":["object","null"]},"itemsGap":{"type":["object","null"],"default":null},"itemsGapTablet":{"type":["object","null"],"default":null},"itemsGapMobile":{"type":["object","null"],"default":null}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-text-editor.css","render":"file:.\/render.php"},"blocksify\/icon-list-item":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/icon-list-item","version":"1.0.0","title":"Icon List Item","category":"blocksify","description":"A single icon + text row inside an Icon List.","textdomain":"blocksify","parent":["blocksify\/icon-list"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 12h13M3.5 12h.01\"\/><\/svg>","supports":{"html":false,"anchor":false,"align":false,"className":false,"customClassName":false,"color":false,"reusable":false,"inserter":true},"attributes":{"icon":{"type":["object","null"],"default":{"source":"lucide","name":"check","strokeWidth":2}},"text":{"type":"string","default":""},"url":{"type":"string","default":""},"linkTarget":{"type":"string","default":""},"rel":{"type":"string","default":""}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-icon-list-item-editor.css","render":"file:.\/render.php"},"blocksify\/accordion-item":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/accordion-item","version":"1.0.0","title":"Accordion Item","category":"blocksify","description":"One panel inside an Accordion. Contains a header (title + icon + indicator) + body (user content).","textdomain":"blocksify","icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"6\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><rect x=\"3\" y=\"13\" width=\"18\" height=\"6\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"7\" y1=\"8\" x2=\"15\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><\/svg>","parent":["blocksify\/accordion"],"usesContext":["blocksify\/accordion\/uid","blocksify\/accordion\/allowMultiple","blocksify\/accordion\/defaultOpenItem","blocksify\/accordion\/indicatorType","blocksify\/accordion\/indicatorPosition","blocksify\/accordion\/titleTag","blocksify\/accordion\/titleAlign","blocksify\/accordion\/showIcon"],"supports":{"html":false,"anchor":true,"className":false,"color":false,"reusable":false,"renaming":false,"inserter":false,"interactivity":true},"providesContext":{"blocksify\/innerBlock":"index"},"attributes":{"title":{"type":"string","default":""},"icon":{"type":["object","null"],"default":null},"index":{"type":"number","default":1,"description":"This item's identity within its accordion. It must be a ONE-BASED position that is unique among siblings: 1, 2, 3, \u2026 in child order. The server does NOT derive it from position \u2014 it uses the stored value verbatim \u2014 so two siblings sharing an index share one open\/closed state (they toggle together, defeating single-expand mode) and emit duplicate header\/body element ids, which breaks the aria-controls and aria-labelledby pairing. The editor renumbers siblings automatically; machine-written markup must number them itself. The parent's defaultOpenItem is matched against this value."},"tagName":{"type":"string","default":"div","enum":["div","section","article","header","footer","main","aside","nav"],"description":"Wrapper HTML element. Anything outside this set falls back to div at render time."}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-accordion-item-editor.css","render":"file:.\/render.php"},"blocksify\/tab":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"blocksify\/tab","version":"1.0.0","title":"Tab","category":"blocksify","description":"A single panel inside a Tabs block.","textdomain":"blocksify","parent":["blocksify\/tabs"],"icon":"<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><line x1=\"3\" y1=\"11\" x2=\"21\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.25\"\/><\/svg>","supports":{"html":false,"anchor":false,"align":false,"customClassName":false,"className":false,"color":false,"reusable":false,"renaming":false,"inserter":false,"lock":false,"interactivity":true},"usesContext":["blocksify\/innerBlock","blocksify\/tabs\/activeIndex"],"providesContext":{"blocksify\/innerBlock":"uid"},"blocksifySupports":{"color":true,"background":{"image":true,"gradient":true},"typography":true,"spacing":true,"border":true,"size":true,"overflow":true},"attributes":{"uid":{"type":"string","default":""},"className":{"type":"string","default":""},"postType":{"type":"string","default":""},"labelOverride":{"type":"string","default":"","description":"Search source only. Display-only rename for this panel's tab. The binding stays postType, so renaming never re-points the panel; empty falls back to the post type's plural label."}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/blocksify-tab-editor.css","render":"file:.\/render.php"}},"tagged_versions":["0.2.0","0.2.1","0.3.0","1.0.0","1.1.0","1.1.1","1.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[148857,4121,148076,1084,247],"plugin_category":[46],"plugin_contributors":[159080],"plugin_business_model":[],"class_list":["post-161446","plugin","type-plugin","status-publish","hentry","plugin_tags-block-editor","plugin_tags-blocks","plugin_tags-gutenberg","plugin_tags-page-builder","plugin_tags-performance","plugin_category-editor-and-writing","plugin_contributors-pressmaximum","plugin_committers-pressmaximum"],"banners":{"banner":"https:\/\/ps.w.org\/blocksify\/assets\/banner-772x250.png?rev=3554123","banner_2x":"https:\/\/ps.w.org\/blocksify\/assets\/banner-1544x500.png?rev=3554123","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/blocksify\/assets\/icon-128x128.gif?rev=3554123","icon_2x":"https:\/\/ps.w.org\/blocksify\/assets\/icon-256x256.gif?rev=3554123","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Blocksify is a performance-first Gutenberg block library by PressMaximum. Build responsive layouts, dynamic content, forms, and WooCommerce templates while loading only the assets each page needs.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>32 block types in 1.1.0<\/strong> \u2014 20 top-level blocks plus 12 supporting child and field types, grouped below.<\/li>\n<li><strong>Layout and content<\/strong> \u2014 Section, Container, Content Loop, Gallery, Accordion, Tabs, Icon List, Marquee, and essential content blocks; structural child blocks are included in the total.<\/li>\n<li><strong>Form set<\/strong> \u2014 Form plus nine field types for inputs, choices, consent, reCAPTCHA, and submission, with validation, spam protection, email actions, styled messages, and redirects.<\/li>\n<li><strong>WooCommerce set<\/strong> \u2014 seven dedicated product blocks for price, rating, meta, stock, add-to-cart, additional information, and reviews when WooCommerce is active, plus Product Gallery and Product Tabs integrations and product-loop presets.<\/li>\n<li><strong>Reusable design workflow<\/strong> \u2014 Style Classes, Hover Mode, condition-aware template previews, Dynamic Data, and a live Design Library with one-click media import.<\/li>\n<li><strong>10-trait styling system<\/strong> \u2014 color, background, spacing, border and shadow, size, overflow, position, z-index, visibility, and typography, with consistent controls and built-in presets where appropriate.<\/li>\n<li><strong>Global design tokens<\/strong> \u2014 custom color and gradient palettes, built-in spacing and font-size scales, and a shadow library, emitted as reusable CSS variables at <code>:root<\/code>.<\/li>\n<li><strong>Responsive controls<\/strong> \u2014 desktop, tablet, mobile, and hover layers with predictable cascading.<\/li>\n<li><strong>Lean frontend<\/strong> \u2014 per-block asset loading, one pooled per-page stylesheet, vanilla CSS, no jQuery, and no frontend JavaScript for layout blocks.<\/li>\n<li><strong>Update-friendly rendering<\/strong> \u2014 runtime-rendered block markup can evolve without WordPress block-validation errors in saved posts.<\/li>\n<\/ul>\n\n<h4>Status<\/h4>\n\n<p>Current stable release: 1.1.0. Feedback is welcome at <a href=\"https:\/\/pressmaximum.com\/blocksify\">https:\/\/pressmaximum.com\/blocksify<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>blocksify<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Open the <strong>Blocksify<\/strong> admin page from the WordPress sidebar to configure performance settings.<\/li>\n<li>Insert any Blocksify block from the block inserter (under the <strong>Blocksify<\/strong> category).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20configure%20blocksify%20settings%3F\"><h3>Where do I configure Blocksify settings?<\/h3><\/dt>\n<dd><p>Open the <strong>Blocksify<\/strong> admin page from the WordPress sidebar. Performance and version-control options live under the <strong>Settings<\/strong> tab.<\/p><\/dd>\n<dt id=\"does%20blocksify%20work%20with%20my%20theme%3F\"><h3>Does Blocksify work with my theme?<\/h3><\/dt>\n<dd><p>Blocksify works with any block-compatible theme. Twenty Twenty-Five is the recommended baseline.<\/p><\/dd>\n<dt id=\"is%20there%20a%20recommended%20theme%20to%20pair%20with%20blocksify%3F\"><h3>Is there a recommended theme to pair with Blocksify?<\/h3><\/dt>\n<dd><p>Yes \u2014 <a href=\"https:\/\/pressmaximum.com\/customify\">Customify<\/a>, by PressMaximum (same team). It's designed as the companion theme for Blocksify, with matching token defaults and a tuned block-editor canvas.<\/p><\/dd>\n<dt id=\"how%20do%20i%20report%20a%20bug%20or%20request%20a%20feature%3F\"><h3>How do I report a bug or request a feature?<\/h3><\/dt>\n<dd><p>Open an issue at <a href=\"https:\/\/pressmaximum.com\/blocksify\">https:\/\/pressmaximum.com\/blocksify<\/a>. Blocksify 1.1.0 is the current stable release, and feedback is very welcome.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<p><em>Release Date - August 19, 2026<\/em><\/p>\n\n<ul>\n<li>New: AI page authoring \u2014 Blocksify now publishes its blocks through the WordPress Abilities API, so a connected AI assistant can discover every block, check its markup before saving, preview the result, and build or edit whole pages for you.<\/li>\n<li>New: Settings \u2192 AI connection card \u2014 create an application password in one click and copy ready-made connection details for your AI client.<\/li>\n<li>New: Tabs \u2014 a Search Tabs variation for building tabbed search interfaces.<\/li>\n<li>New: Content Loop can override the post type it inherits on archive templates.<\/li>\n<li>Improved: Locked dashboard tabs now show what is coming and where to upgrade, instead of an empty panel.<\/li>\n<li>Fix: Tabs and Accordion panels are visible on load before JavaScript runs, so their content is no longer briefly hidden.<\/li>\n<li>Fix: Dynamic Template archive conditions no longer match search result pages.<\/li>\n<li>Fix: Dynamic Template previews render WordPress core blocks against the sample entry instead of leaving them blank.<\/li>\n<li>Fix: Animated blocks no longer flash into view on first page load.<\/li>\n<li>Fix: The rollback screen opens inside wp-admin and runs without leaving the page.<\/li>\n<li>Fix: A Content Loop's \"no results\" content is no longer rendered twice.<\/li>\n<li>Fix: Palette color names now resolve to the theme color on every styling control, instead of being written into the stylesheet as an invalid value.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<p><em>Release Date - August 13, 2026<\/em><\/p>\n\n<ul>\n<li>New: Section Content width \u2014 one setting replaces the From Theme toggle and the Gutter toggle. Choose From Theme, Custom, Full width (content fills the section, gutter kept), or Edge to edge (content fills the section with no gutter, so images touch the browser edges).<\/li>\n<li>New: Section alignment is now also available in the Layout panel, next to Content width, using the same names as the block toolbar.<\/li>\n<li>Fix: Dynamic Templates take their content width from the column the theme actually gave them, so full-width and wide sections line up with the rest of the page on themes that expose no content-width value. Previously they fell back to a fixed 1200px that matched no theme.<\/li>\n<li>Fix: Turning off a section's gutter no longer discards a custom content width \u2014 the section kept its custom value on screen but rendered at the theme width.<\/li>\n<li>Fix: Product Loop no longer prints the theme's own product card inside its cards on themes that take over the WooCommerce loop hooks, which produced duplicate titles, prices, and buttons, plus sale badges stacked in one corner.<\/li>\n<li>Fix: The icon-only Add to cart button stays a circle on themes that add vertical padding to buttons.<\/li>\n<li>Changed: The Section \"Item Order\" setting is now called \"Column Order\", matching Column Gap and Row Gap beside it.<\/li>\n<li>Changed: The separate Section Gutter control was folded into Content width \u2014 pick Edge to edge for no gutter.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<p><em>Release Date - August 10, 2026<\/em><\/p>\n\n<ul>\n<li>New: Container Link \u2014 turn a whole Container into a link, with overlay or wrapper render modes, custom attributes, <code>nofollow<\/code> \/ <code>sponsored<\/code> \/ new-tab options, and screen reader text.<\/li>\n<li>New: Background hover zoom \u2014 scale a background image on hover, on both Section and Container, with no extra markup and no JavaScript.<\/li>\n<li>New: Section Gutter \u2014 a responsive control for the space between the section edge and its content.<\/li>\n<li>New: Dynamic Templates can set their content width to Full, Theme, or a custom value in px, rem, em, or %.<\/li>\n<li>New: Duplicate a Dynamic Template from the Templates dashboard; the copy keeps every template setting and appears directly under the original.<\/li>\n<li>New: Post Content is available as a Dynamic Data field on the Text block, rendered as formatted rich content, alongside Product Content for WooCommerce.<\/li>\n<li>New: Product Gallery swaps the entire image set \u2014 main image, thumbnails, and lightbox \u2014 when a variation has its own gallery, including galleries added by additional-variation-image plugins.<\/li>\n<li>New: Form styling adds hidden-but-accessible labels, placeholder typography and color, wrapper and submit layout and position controls, submit CSS classes, and z-index.<\/li>\n<li>New: Product Add to Cart adds a responsive inline or stacked purchase layout plus margin controls for the label, quantity, and button.<\/li>\n<li>Improved: The Image block splits horizontal and vertical sizing between the wrapper and the image, and handles dynamic images, attachment metadata, full-size media links, focal points, and caption alignment more predictably.<\/li>\n<li>Improved: The Gallery inspector was reorganized around a single Settings panel with a larger layout picker and clearer badge controls, and the WooCommerce variation is now named Product Gallery.<\/li>\n<li>Improved: Gallery navigation is more accessible and no longer flashes chrome it will immediately hide.<\/li>\n<li>Improved: Product Add to Cart consolidates its inspector into one Settings panel, always keeps linked product blocks in sync with the chosen variation, and defaults the quantity selector to Stepper.<\/li>\n<li>Improved: Content Loop presets can name their own inspector panel, so a Product Loop reads \"Product presets\" instead of the generic label.<\/li>\n<li>Improved: The Product Loop item-hooks toggle was removed from the inspector; saved blocks keep their behavior and the <code>blocksify_woo_loop_item_hooks<\/code> filter remains available.<\/li>\n<li>Improved: The Design Library imports pattern media in batches and rewrites media URLs across every background field.<\/li>\n<li>Improved: Editor block labels use the WordPress system font stack.<\/li>\n<li>Improved: The package published to WordPress.org no longer contains developer tooling.<\/li>\n<li>Fixed: The dashboard Forms tab showed a \"Coming soon\" placeholder on every production install instead of the Forms management screen.<\/li>\n<li>Fixed: Background parallax and zoom never ran on the frontend when a Container owned the background layer.<\/li>\n<li>Fixed: A semi-transparent background overlay could paint over text, and a background image could swallow clicks on links inside the block.<\/li>\n<li>Fixed: A Content Loop set to inherit the archive query listed unrelated posts when the archive itself matched nothing.<\/li>\n<li>Fixed: Content Loop paging links and requests targeted the wrong site on subdirectory and domain-mapped multisite installs.<\/li>\n<li>Fixed: Page CSS could go stale after editing widgets, changing widget areas, publishing in the Customizer, or saving shared blocks.<\/li>\n<li>Fixed: The shadow color picker closed as soon as the alpha value changed.<\/li>\n<li>Fixed: Margin previews in the editor did not always match the published page.<\/li>\n<li>Fixed: Dynamic post content previews rendered without their CSS on singular and referenced-post templates.<\/li>\n<li>Fixed: Theme content and wide widths now match between the Dynamic Template editor and the frontend, including WooCommerce single-product templates.<\/li>\n<li>Fixed: The gallery lightbox opened underneath the WordPress admin bar, and its thumbnails showed a stray red border.<\/li>\n<li>Fixed: Galleries with a single image no longer render arrows, dots, or a one-tile thumbnail strip.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p><em>Release Date - July 29, 2026<\/em><\/p>\n\n<ul>\n<li>New: Complete Form block system with text, textarea, email, select, radio, checkbox, consent, reCAPTCHA, and submit fields, plus help text for every field.<\/li>\n<li>New: Form submissions include validation, honeypot protection, email actions, configurable success and error messages, per-message styling, and optional redirects.<\/li>\n<li>New: Gallery block with responsive slider layouts, dynamic image sources, and responsive image sizes.<\/li>\n<li>New: Marquee block for continuously scrolling content.<\/li>\n<li>New: WooCommerce blocks for Product Price, Rating, Meta, Stock, Add to Cart, Media, Tabs, Additional Information, and Reviews.<\/li>\n<li>New: Product Loop hook controls and contextual Content Loop presets for related products, cross-sells, and up-sells.<\/li>\n<li>New: Style Classes let you create and reuse named styling classes across your site.<\/li>\n<li>New: Hover Mode lets you preview and adjust hover styles directly in the editor.<\/li>\n<li>Improved: Template Builder previews are scoped to each condition, with fallback previews and locking for a more reliable editing experience.<\/li>\n<li>Improved: Dynamic Data can bind term, author, archive, and search objects, reacts to editor context changes, and supports dynamic background images.<\/li>\n<li>Improved: Design Library now uses a live catalog with media import and is enabled by default.<\/li>\n<li>Improved: Text blocks add eight pure-CSS highlight styles, reveal-on-scroll animation with speed control, and toolbar text alignment.<\/li>\n<li>Improved: Tabs add per-device responsive settings, stack and carousel overflow modes, and adjustable tab spacing.<\/li>\n<li>Improved: This 1.0 hardening release validates saved CSS values, units, and token names; keeps restricted Content Loop posts private; limits form management to administrators; and keeps reCAPTCHA and Mailchimp secrets server-side.<\/li>\n<li>Improved: Uninstall cleanup now removes plugin data, with an opt-in setting to also remove saved forms, style classes, and templates.<\/li>\n<li>Improved: WordPress 6.8 or newer is now required for a consistent, supported editing experience.<\/li>\n<li>Fixed: Seven editor controls that previously had no effect now work correctly on published pages.<\/li>\n<li>Fixed: Section background clipping and single-column overflow, Button hover colors, empty Image captions, WooCommerce variation labels and stock visibility, and Content Loop overlay opacity.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<p><em>Release Date - June 3, 2026<\/em><\/p>\n\n<ul>\n<li>New: Design Library \u2014 browse curated patterns from a live cloud catalog and insert them with automatic media import.<\/li>\n<li>New: Editor Enhancements settings panel \u2014 choose where the Design Library launcher appears (toolbar \/ sidebar \/ hidden).<\/li>\n<li>New: Icon List block.<\/li>\n<li>New: Heading inserter tile \u2014 quick-insert H1\u2013H6 (variation of the Text block).<\/li>\n<li>New: text-align control in the Text block toolbar.<\/li>\n<li>Improved: Tabs block \u2014 per-device responsive settings (icon, width, align, spacing, overflow), stack overflow mode, smoother subtitle transitions.<\/li>\n<li>Improved: Content Loop block \u2014 better defaults, sticky footer option, Link element overhaul.<\/li>\n<li>Improved: Button block \u2014 theme-adaptive colors and unified hover state.<\/li>\n<li>Fixed: removed misleading wide\/full align options from Tabs and Accordion (they didn't actually work).<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<p><em>Release Date - May 29, 2026<\/em><\/p>\n\n<ul>\n<li>New: Image block hover effects and overlay scrim.<\/li>\n<li>New: WordPress-core aspect ratios and refreshed defaults for Image and Content Loop.<\/li>\n<li>New: Rollback \u2014 a new dashboard setting to revert to a previous plugin version.<\/li>\n<li>Improved: Background panel \u2014 Scroll Effect and Overlay refinements; Background Color moved into the Color panel.<\/li>\n<li>Improved: smaller, cleaner block icons in the inserter.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<p><em>Release Date - May 26, 2026<\/em><\/p>\n\n<ul>\n<li>NEW: Section block<\/li>\n<li>NEW: Container block<\/li>\n<li>NEW: Text block<\/li>\n<li>NEW: Button block<\/li>\n<li>NEW: Icon block<\/li>\n<li>NEW: Image block<\/li>\n<li>NEW: Content Loop block<\/li>\n<li>NEW: Accordion block<\/li>\n<li>NEW: Tabs block<\/li>\n<li>NEW: Global Colors<\/li>\n<li>NEW: Global Gradients<\/li>\n<li>NEW: Global Shadows<\/li>\n<li>NEW: Global Spacing<\/li>\n<li>NEW: Global Font Size<\/li>\n<\/ul>","raw_excerpt":"Performance-first block library for WordPress. Build pages that load fast, look great, and stay yours.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/161446","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=161446"}],"author":[{"embeddable":true,"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pressmaximum"}],"wp:attachment":[{"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=161446"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=161446"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=161446"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=161446"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=161446"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bho.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=161446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}