0.8.0 — the option that hides elements from the client also hides them from the agent
Nothing added, nothing removed. Every ability description, the plugin header, the README and UPSTREAM.md were re-measured against Oxygen 6.2.0-beta.5 + Breakdance Elements for Oxygen 1.1.0.beta.1, WordPress 7.1, PHP 8.2.29 and corrected. Three of the pack's stated reasons for existing turned out to be fixed upstream, one was flatly wrong, and one new coupling was found.
Fixed
- The pack claimed
oxygen_builder_hidden_elementsdoes not affect MCP. It does. The plugin header, the README andbdox/element-visibility's description all said the option controls the editor panel only.admin/settings-page/tabs/elements.phphangsfilter_builder_elements()on thebreakdance_builder_elementsfilter at priority 10, andmcp/schemas/elements.phpruns the MCP element list through that same filter. Measured: addingEssentialElements\Buttonto the option tookoxygen-get-element-slugsfrom 164 to 163 and madeget-element-schemasrefuse it; removing it restored 164. Rule that follows, now stated in three places: build first, hide last. bdox/builder-hidden-elementsreported a number that never moves. It returnedbuilder_panelfromcount(get_elements_for_builder()), which maps over every registered classname and only feeds the filtered list toaddPanelRules— measured 165 both before and after hiding an element. Replaced withmcp_visible_countandhidden_from_mcp, so the ability now reports both sources of truth: the stored option and what MCP can actually address.- The "empty list is repopulated on the next request" claim was wrong. Measured: an empty
builder_hidden_elementspersists across requests.addDefaultHiddenElements()is called fromhandleVersionChange()and the setup wizard, so the re-fill happens on the next Oxygen update, not the next request. The non-empty placeholder is still correct — the reason changed, not the behaviour. - The element counts in the header and README were from beta.2 (162 / 149). Re-measured: 186 registered, 151 MCP-visible without the pack, 164 with it.
BREAKDANCE_MCP_HIDDEN_ELEMENTSnow holds 14 entries and no longer bansSection,HeadingorIcon— those three are hidden purely by the WP option.
Changed
bdox/merge-css-selectorno longer claims to be the only route to!important. Oxygen fixed that in 6.2.0:css-to-properties.phpdiverts every!importantdeclaration intocustom_csswith the flag intact, before the typed converters run. Measured on beta.5 —.probe{color:#ff0000 !important;padding:8px}stored padding as a typed property andcustom_cssas:selector {\n color: #f00 !important;\n}. The ability stays for the two things still broken: the importer replaces a selector's whole property map per breakpoint (measured — amargin-only import wiped bothpaddingandcustom_css), and it lowercases custom-property names (--myVarstored as--myvarwhilevar(--myVar)keeps its case, so the reference dies and the import reports success).bdox/patch-global-settingslost its main reason and kept a smaller one.set-global-settingsdeep-merges since beta.5 (breakdance_mcp_deep_merge_settings) — measured, atypography.base_font_size-only call leftcolors.paletteandtypography.body_fontintact. What it still cannot do is write a key on an object closed withadditionalProperties: false:buttons.primary.background_hovergoes through,buttons.primary.typography.color_hoveris rejected — andelements/macros/atom-v1-button-css.twigreads exactly that key. The description now says so instead of advertising the merge.bdox/get-global-settingsstays, with the real failure. Soflyy fixed the empty-settings case ({"settings":{}}instead of an error), so on a blank site the built-in reader works. On a real one it still returns nothing:output[settings][buttons][primary][corner_radius][unit] is not of type object,null. Observed on a production site and reproduced on the beta.5 lab install with the same stored value. The output schema wantscorner_radiusbreakpoint-keyed; the builder stores it flat as{number, unit, style}— and stores it breakpoint-keyed underbutton_presets[].styles, so the same control is persisted two different ways.bdox/regenerate-cssnarrowed its claim. Still no cache-regeneration tool among the 49 the beta.5 server exposes, but Oxygen's own save paths do regenerate (data/save.php:121callsgenerateCacheForPost();save_global_settings()andsave_selectors()callgenerateCacheForGlobalSettings()). The ability is for data changed outside those paths, and for a stale compiled cache.bdox/element-visibilitywas rewritten to report three lists, not two counts.banned_by_oxygen(the constant),hidden_in_elements_panel(the WP option),restored_by_this_pack, plusstill_hidden_from_mcpand an explicit warning about the shared filter. It also stopped comparing element slugs against classnames, which made the oldhidden_from_mcpmeaningless.- The two
add_filtercalls stay, with the deletion condition written into the code. They exist only because the fundamentals are supposed to replace these elements — and on BEFO 1.1.0.beta.1 the fundamentals do not exist:class_exists()isfalseforFText,FImage,FRichText,FTextLink,FSvgIcon2,FHtmlCodeandEssentialElements\ContainerLink. The nativeOxygenElementsfallbacks exist but have no Design tab — measured viaoxygen-get-element-schemas:EssentialElements\{Section,Heading,Text,Image2,Button}exposedesign,OxygenElements\{Container,Text,Image}do not. The header now names the re-measure condition: after BEFO ≥ 1.1.0.beta.3, checkclass_exists('EssentialElements\FText')and whether its schema has adesignsection; only if both hold do the filters get deleted. bdox/set-imagere-measured, unchanged. Thewpmediacontrol still schemasmediaas{id, url, alt}withadditionalProperties: false, and bothOxygenElements\ImageandEssentialElements\Image2still resolvesrcascontent.image.media.sizes[size].url.typography.css.twiglines 114 and 126 still lack| join(' '), sotext-decoration-linestill compiles to the literalArray. Recorded in UPSTREAM.md as still open.
The cost of the restore is now written down
Previously unstated: restoring on breakdance_builder_elements also unhides those 13 elements in the builder's Add panel, because get_elements_for_builder() hands the same filtered array to FilteredGets\addPanelRules(), which sets alwaysHide on whatever is missing from it. Measured — pack active: Section, Div, Heading report no alwaysHide; pack filter removed: all three do. Two consequences, now documented in the plugin header, the README and bdox/builder-hidden-elements:
- While the pack is active the client sees those elements too, which removes exactly the simplification Oxygen was going for.
- A human who hides one of the 13 in Oxygen → Settings → Elements is silently overruled: the pack restores at priority 20, after the settings page subtracts at priority 10.
Restoring "for MCP only" was considered and rejected. The panel and MCP go through different functions but share one filter, and the filter carries no caller context, so the only discriminator is the admin-ajax action name — a string Oxygen may rename, after which the guard silently stops matching. Instead, the existing bdox_pack_restored_elements filter is documented as the lever: add_filter( 'bdox_pack_restored_elements', '__return_empty_array' ) at handover. Handover order, which is not the build order: build → hide → narrow (or deactivate). Hiding while the pack still restores does nothing.