Installation
MevvBlocks needs WordPress 6.0 or newer and PHP 8.1 or newer. There is no other dependency: no external library, no font from someone else’s server, no build step.
- Upload and activate the plugin.
- Open a page in the block editor and add the Kapsayıcı (container) block.
- Put the blocks you want inside it. You will find them in the Tasarım category.
- Manage the rest from the MevvBlocks menu in the admin sidebar.
- WooCommerce is optional. Installing it adds two blocks.
- MevvBridge is optional. If you came from Elementor, MevvBlocks is what makes those pages editable again.
- MevvLegal is optional. If it is present, the map block hands its embed to MevvLegal so the map is not loaded before the visitor consents.
Pro is a separate plugin installed alongside the free one, and it declares the free plugin as a hard requirement. Your licence key is entered on the Lisans screen. With Pro absent, MevvBlocks makes no request to our servers at all.
Style per screen size — the gap this closes
Core blocks accept one padding value, one minimum height, one column count. That value applies on every screen. If a section needs 100 pixels of padding on desktop and 40 on mobile, core cannot express it — and that single gap is the most common technical reason people install a page builder.
MevvBlocks stores three values instead of one — desktop, tablet, mobile. The thresholds are fixed:
- Masaüstü
- No media query — the base value.
- Tablet
- Applies at 1024 pixels and below.
- Mobil
- Applies at 767 pixels and below.
The same two numbers are used everywhere else in the plugin — the menu’s hamburger threshold, the grid’s column counts. A free pixel field was deliberately not offered: someone picking 900 would get a hamburger at 900 while their padding still changed at 1024, and two breakpoint systems mean layouts that disagree with themselves.
Values live in the block’s own attributes, inside post_content — not in a custom table and not in post meta. The CSS is produced on the server, at request time, and printed as a small style block next to the element it belongs to.
Why not save the CSS with the page? Because saved HTML can only carry one breakpoint. Rendering on request is what makes three values possible at all — and it is why a lapsed licence can never darken a published page: there is not a single licence check on that path.
Why the editor preview is approximate
This is worth being blunt about, because it is the one place where what you see is not what you get.
- The per-breakpoint CSS is generated by the server when the page is rendered. That code does not run in the editor.
- The blocks save no markup of their own — there is nothing stored for the editor to style.
- So the editor draws an approximation: structure, content, direction, column count and gaps. Your padding, minimum height, background image, border and every tablet or mobile value are not reflected there.
What the editor does show accurately is the global palette and the typography sets: those variables are injected into the editor as well, so colours and type in the editor match the front end.
When a block carries tablet or mobile values, the editor prints a notice listing which settings they are, so you know an approximate preview is hiding something. The final appearance is the front end — check there. A pixel-accurate editor preview is future work, and calling it done today would be a lie you would discover on your own site.
The blocks
Thirty blocks, or thirty-two with WooCommerce installed. All of them are in the free edition; no block is Pro-only. They live in the Tasarım category of the inserter.
- Layout and text
- Kapsayıcı, Başlık, Metin, Düğme, Ayırıcı, Görsel, Kısa Kod
- Presentation
- Referans, İkon, İkon Kutusu, İkon Listesi, Görsel Kutusu, Sosyal İkonlar, Telif Hakkı, Ekip Üyesi, Yıldız Derecelendirme, Fiyat Tablosu
- Interaction
- Kaydırıcı, Sekmeler, Akordiyon, Gezinme Menüsü, Arama Formu, Form, İçindekiler, Sosyal Paylaşım
- Data and time
- İçerik Izgarası, Geri Sayım, Sayaç, İlerleme Çubuğu, Harita
- WooCommerce
- Ürünler, Ürün Kategorileri — added only when WooCommerce is active
Motion effects are not a block: a Hareket panel is added to every MevvBlocks block instead.
Nothing here is hidden when JavaScript does not load. Tabs show all panels, the accordion is a native details element, the slider scrolls and its arrows are printed hidden until the script can make them work — showing a button that does nothing is showing a broken interface. Hidden content is inaccessible content.
Content grid and the loop builder
The İçerik Izgarası block queries posts, pages or products and lays them out. Pagination is plain links, so it works with JavaScript switched off.
- Ordering is a fixed list — date, modified, title, menu order, random — because the value reaches the database.
- Card headings run from h2 to h6. h1 is not offered: a grid of cards on a page that already has an h1 would break the heading order.
- One link per card. Making the image, the title and the “read more” all links means a screen reader announces the same target three times.
- The grid caches the post ids it found, never the rendered HTML, and the cache is invalidated by any post being saved — so “I published a post and it is not showing” cannot happen.
The loop builder lets you draw the card yourself instead of using the built-in one. You create a template of type Döngü kartı, build it out of ordinary blocks with dynamic bindings, and pick it in the grid’s settings.
While you edit a card template there is no post context, so dynamic bindings show their static fallbacks. And if the template is empty, deleted, left as a draft or refers back to itself, the grid falls back to the built-in card rather than printing nothing. Loop nesting is capped at two levels.
The form engine
Sixteen field types, with server-side validation. The form is the one part of a page that actually does something, so it works without JavaScript: a plain POST submission gets the same validation and the same messages as a scripted one.
- Field types
- Metin, e-posta, telefon, URL, sayı, tarih, saat, gizli alan, uzun metin, seçim, çoklu seçim, radyo, onay listesi, onay kutusu, rıza kutusu ve başlık. Pro adds a file upload field.
- Where submissions go
- Both to a table of their own and to email. The record is written first and the mail sent second, because mail delivery fails far more often than a database write.
- Reading them
- MevvBlocks → Form Gönderimleri. Pro adds a CSV export there.
- Notification email
- The sender is your site, never the visitor. Using the visitor’s address as the sender is the single most common reason form mail never arrives — SPF and DMARC reject it. Their address becomes the Reply-To instead.
Spam is handled by three layers and no CAPTCHA: a signature that does not depend on a session, a minimum fill time, and a honeypot field. A submission that fills the honeypot is silently accepted and discarded — showing an error would tell the bot it was caught, and the next attempt would skip that field.
Why a signature rather than a WordPress nonce? A nonce is tied to a session and a twelve-hour window. On a cached site the same HTML is served for hours or days, the nonce inside it has long expired, and the form silently stops working. That is the most common field failure of form plugins. The signature here is valid for seven days and does not depend on who is browsing.
The IP address of a submission is never stored in readable form — only a digest, salted with your own site’s key, so records from two different sites cannot be matched against each other.
Submission storage is not tied to the licence. If it were, the day a payment lapsed would be the day the customer started losing data.
Theme templates
Seven template types, built in the WordPress editor you already use — Başlık, Alt bilgi, Tekil içerik, Arşiv, Arama sonuçları, Bulunamadı (404) and Döngü kartı. A second editor would be one more thing to keep in step with WordPress core.
The type and the conditions sit in a plain sidebar box, not a React panel — a classic box also saves with JavaScript off, and it does not break when the editor API changes.
- Conditions
- Whole site, home page, post type, category, or a single piece of content. Leave them empty for the whole site.
- When several match
- The narrowest condition wins.
- Malformed conditions
- Discarded on save and stored empty, rather than kept as invalid text that would make the template silently never appear.
Header and footer templates are placed only on Astra and GeneratePress. If your theme has no recipe, they are not printed at all and the screen says so — attaching a header to a theme we cannot lift means two headers, guaranteed. Singular, archive, search and 404 templates keep working on any theme, because they replace the loop and leave the theme’s own header and footer in place.
A Döngü kartı template never places itself anywhere. A grid block chooses it.
Pattern library and block presets
Twenty ready-made patterns: sixteen sections and four full pages. They are registered as ordinary WordPress patterns, so you insert them the way you already know — the + button, the Desenler tab, then the MevvBlocks bölümleri or MevvBlocks sayfaları category.
No custom modal was written for this. Core’s inserter already gives preview, search, keyboard navigation and translation for free, and what it inserts is plain block markup — nothing to be locked into.
The patterns ship with no images. Pulling images from elsewhere is a copyright question, a privacy question, and it ties how your page looks to somebody else’s server staying up. The image blocks are in place with their alt text filled in; choose your own.
Block presets save a block’s appearance settings under a name and apply them to another block of the same type. Content is deliberately not saved — text, links, images and list items are stripped out, so applying a preset never overwrites what you wrote.
Patterns are not registered on the front end at all. Generating their markup on every page view was measured at 109 KB and 3,59 ms — paid for nothing, since nobody inserts a pattern while reading.
Popups
Built in the block editor like anything else; the triggers, conditions and frequency live in the same screen’s sidebar. Managed under MevvBlocks → Açılır Pencereler.
- Triggers
- On page load with a delay, at a scroll percentage, on exit intent, on a click matching a CSS selector, or after a period of active time. The activity timer stops while the tab is in the background.
- Conditions
- Whole site, home page, specific pages, post type or category; logged in, logged out or everyone; and per device.
- Frequency
- Every time, once per session, or once every N days.
- Appearance
- Position, width, whether the title shows, whether clicking outside closes it, and the opening animation.
The “do not show again” counter is kept in the visitor’s own browser, not on the server. Counting it server-side would mean minting a durable identity for every visitor just to avoid showing them a box twice.
Device targeting is decided by the browser, not by sniffing the user agent. A user agent cannot reliably tell a tablet from a phone, and behind a full-page cache it would serve the first visitor’s device to everyone. If no trigger is selected the popup falls back to page load; if no device is selected it falls back to all three — a popup that silently never appears is worse than one that appears too often.
The site palette
One screen for colours and typography, reachable both from the MevvBlocks menu and from Appearance, because that is where people look for it. Every entry shows its own variable name, and blocks refer to those names rather than to literal values.
That is what lets a page built before the switch pick up a new palette instead of losing its references — the variable names are kept the same ones your pages already use.
There is no delete. A colour or typography set can be left empty, but removing it would leave every block that referred to it pointing at nothing. Emptying is reversible; deleting a reference is not.
The accessibility audit
MevvBlocks → Erişilebilirlik scans your published pages, posts and templates and reports what each block left out: an image with no alt text, an empty heading, a button with no name or no target, a broken heading order, contrast that is too low.
The same audit is available as a sidebar panel while you are still editing, which is where a finding is cheapest to fix.
This is deliberately not an overlay. Layers that bolt an “accessibility menu” onto a page fix nothing: an image with no alt text still has none, and low-contrast text is still unreadable. Carrying the claim “this site is accessible” without it being true is a worse position than making no claim — sites using overlays have been sued over exactly that. This tool measures and tells you; the fixing is yours.
Contrast is only reported when both colours are actually known. Guessing at an inherited colour would produce warnings you cannot act on.
Free and Pro
The free edition is the whole product: all thirty blocks, theme templates, the grid and loop builder, the form engine with its submission store, the menu, search, popups, the pattern library, block presets, the global palette and the accessibility audit.
Pro adds editing capabilities, not output:
- Kırılım noktaları — the desktop / tablet / mobile tabs, with minimum height, content width, width and the four padding values per breakpoint.
- Özel CSS per block, where the token
selectorstands for that block itself. - Form extras — conditional fields, an automatic reply to the sender, a webhook, and a file upload field.
- CSV export of form submissions.
The breakpoint and custom-CSS panels appear today on the core blocks — Kapsayıcı, Başlık, Metin, Düğme, Ayırıcı, Görsel, Referans, İkon, İkon Kutusu, İkon Listesi, Kısa Kod, Form, Ürünler and Ürün Kategorileri. Several per-breakpoint controls are free wherever they exist: the grid’s tablet and mobile column counts, the menu’s hamburger threshold, the image box’s mobile position and the sticky-position device choice.
When a licence expires or is absent:
- Your site looks exactly the same. Every saved tablet and mobile value keeps being printed, and so does every per-block custom CSS rule. This is not a promise, it is an architectural rule: no file on the render path asks about the licence, and a test checks that on every release.
- Forms keep submitting, keep saving and keep sending mail.
- Existing popups keep showing.
- What you lose is the Pro panels in the editor — and only those.
If our servers are unreachable, an active licence keeps working for seven days. An installation that never verified successfully gets no grace at all: blocking our address is not a way to get Pro.
When something does not work
- “Form oturumu zaman aşımına uğradı”
- The cached copy of that page is older than seven days, or your site’s security keys were rotated. Purge the page cache.
- The form does not send mail
- Check the submission list first — the record is written before the mail, so if it is there the form worked and the delivery did not. Then check the recipient address and your site’s mail setup.
- The page looks right in the editor and wrong on the front end
- The editor preview is approximate by design; see above. The front end is the truth. If a block carries tablet or mobile values the editor prints a notice saying so.
- A block says it is invalid when I try to edit it
- Historically this happened to blocks registered on the server but missing from the editor script — they printed perfectly and only failed when opened for editing. A test now guards against it; if you still see it, report the block name.
- The countdown shows the wrong time
- The markup carries an absolute target instant, never “X seconds remaining”, so a cached page cannot freeze it. The block corrects itself against the server clock; if that request is blocked it falls back to the visitor’s own clock rather than failing.
- The header or footer template is not showing
- Your theme has no recipe. Only Astra and GeneratePress can be lifted; the screen warns you. The other template types work on any theme.
- Two headers appeared
- Both MevvBlocks and MevvBridge are producing one. MevvBlocks takes the slot first on purpose — leave the header to one of them.
- Containers are wider or narrower than set
- A theme rule is winning on specificity. Astra in particular styles its descendants strongly. This has been fixed for the measured cases by raising specificity rather than by using
!important; if you hit a new one, say which theme. - A published post is not appearing in a grid
- It should. The grid caches only the post ids and any post being saved invalidates it. If it persists, check that the post type and the ordering are what you expect.
Limits
- The editor preview is approximate. Structure and content are shown; the exact appearance is the front end.
- Header and footer templates only work on Astra and GeneratePress. Every other theme gets nothing, plus a warning — silence would be two headers.
- The map is an OpenStreetMap embed. One marker, no custom marker image, no map styling, no directions. No API key, no billing account, and no key sitting in your page source.
- No accessibility overlay. Measuring and reporting only.
- No CAPTCHA.
- No live search. A request per keystroke is a dependency and a rate-limit surface.
- The countdown uses the site’s time zone, not the visitor’s. A campaign ends at one moment worldwide.
- The menu offers two breakpoints, not a free pixel value, and has no fly-out or off-canvas mode — a sliding panel with focus management is what the popup block is for.
- Grid cards cannot be h1, and loop nesting stops at two levels.
- Dynamic content comes from a fixed list of sources. There is no “run this expression” field: that would hand code execution to anyone who can edit a page.
- Global colour and typography sets cannot be deleted, only emptied.
- Product cards are drawn by WooCommerce, not by us, so your theme and any third-party hooks keep working.
- The interface is Turkish. There is no translation file yet.
- Uninstalling does not remove the submissions table or the settings. Your block content stays readable either way — it is standard markup in
post_content.
No third-party JavaScript or CSS library is loaded, anywhere. Not for the slider, not for the accordion, not for motion, not for the map. Each of those would have cost between forty and a hundred kilobytes on every page that used it.