') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - EssentialBlocks/price-table-block · GitHub
Skip to content

Repository files navigation

Price Table Block

Instantly create a beautiful pricing menu for your eCommerce website.

Price Table Block is a WordPress Gutenberg block that lets you build fully customizable pricing tables — plans, prices, feature lists, ribbons and call-to-action buttons — from the block editor, without writing any CSS.

Features

  • Completely customizable — content, pricing, feature lists, colors, spacing and typography.
  • Super light-weight — no extra resources loaded, optimized for fast loading and instant live editing.
  • Native block editor experience — full inspector controls with responsive (desktop/tablet/mobile) settings.
  • Dedicated support — via the plugin support forum.

Requirements

MinimumTested up to
WordPress6.07.0
PHP7.48.5

Installation

From WordPress admin

  1. Go to Plugins → Add New and search for Pricing Table.
  2. Install and activate.
  3. Add the Pricing Table block from the block inserter in the editor.

Manually

  1. Upload the price-table-block folder to /wp-content/plugins/.
  2. Activate the plugin through the Plugins menu in WordPress.
  3. Follow the documentation.

Development

Clone with submodules — controls/ and lib/style-handler/ are git submodules and the plugin does not build (or run) without them:

git clone --recurse-submodules git@github.com:EssentialBlocks/price-table-block.git
# already cloned?
git submodule update --init --recursive

The block is built with @wordpress/scripts.

npm install
npm run start # development build with watch
npm run build # production build into dist/
npm run format:js # format JavaScript
npm run lint:js # lint JavaScript
npm run lint:css # lint styles

Source lives in src/, shared controls in controls/, the PHP entry point is price-table-block.php, and compiled assets are written to dist/.

dist/ is a committed build artifact

dist/ is committed to the repository. npm run build at the repo root emits dist/index.js and dist/style.css; the remaining files — dist/modules.js, dist/frontend.js, dist/modules.css, dist/style-modules.css — come from a second build inside the controls/ submodule.

The pinned controls commit matches the committed dist/modules.js. Do not bump the controls submodule without rebuilding and committing the dist/ output, or the release will ship a stale bundle against newer source.

Release

.github/workflows/deploy.yml deploys to WordPress.org on any pushed tag. It runs on Node 14 and needs the EB_PAT, SVN_USERNAME and SVN_PASSWORD repository secrets.

Branches

BranchPurpose
masterStable, released code. Default branch.
latestStaging for the next release.
devActive development. Open pull requests against this branch.

Contributing

Issues and pull requests are welcome at EssentialBlocks/price-table-block. Please branch off dev and target dev with your pull request.

Contributors

Support & Documentation

License

Licensed under the GNU General Public License v3.0 or later.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages