---
title: "Crazy Highlights 'n Doodles | Hand-Drawn YOOtheme Pro add-ons"
description: Add hand-drawn highlights, doodles, arrows, stickers, masks and more to YOOtheme Pro. Create unique designs with a real marker feel.
url: https://www.yoozecase.com/crazy-highlights-n-doodles
---

# Crazy Highlights 'n Doodles

Mark my words!

**Latest Version**

1.0.0

**Release date**

08 August 2026

**Made for**

Joomla, Wordpress

**Price**

€25.00 (incl. 6 months of updates)

[🛒 Get it for Joomla 👍](https://shop.yoozecase.com/checkout/buy/aa75d2c6-18f3-45ae-9555-2ca3b76a4e28)

[🛒 Get it for WordPress👍](https://shop.yoozecase.com/checkout/buy/6096479a-aead-4480-b072-918f89fdbac3)

[Demo page](https://www.yoozecase.com/crazy-highlights-n-doodles-demo)

Hand-drawn highlights, circles, arrows and doodles that scribble in as you scroll.

![Crazy Highlights N Doodles](https://www.yoozecase.com/files/crazy-highlights-n-doodles.png)

---

## Description

Bring a hand-drawn feel to your YOOtheme Pro website with Crazy Highlights 'n Doodles. Add realistic marker strokes, doodles, arrows, stickers and creative accents that make your content feel unique and personal.&nbsp

Create playful designs with flowing highlights, handwritten notes, custom shapes, image masks, animations and theme-aware colours. No code needed, just pick your style and start drawing.

---

#### Top voted

';
 }
 html += '

';
 if (oc.title) {
 html += '

##### ' + escapeHtml(oc.title) + '

';
 }
 if (oc.text) {
 html += '

' + escapeHtml(oc.text).replace(/\n/g, '
') + '

';
 }
 html += '

';
 }

 // Auto winner(s) - top N from the already vote-sorted features
 if (mode === 'auto_winner' || mode === 'both') {
 var n = oc.winnerCount | 0;
 if (n ';
 for (var i = 0; i ' +
 (w.image_url ? '

![](https://www.yoozecase.com/' + escapeHtml(w.image_url) + ')

' : '') +
 '' + (i + 1) + '' +
 '' + escapeHtml(w.title) + '' +
 '' + getIcon(this.cfg.voteIcon) + ' ' + (w.votes | 0) + '' +
 '';
 }
 html += '';
 }
 }

 if (html === '') {
 this.elOutcome.hidden = true;
 return;
 }
 this.elOutcome.innerHTML = html;
 this.elOutcome.hidden = false;
 };

 /**
 * Roadmap view (v3.2.0): renders the items as status columns, in the
 * canonical status order from cfg.statuses. Each column is an  inside
 * the existing .yc-fb-list ';
 }
 return html;
 };

 Board.prototype.renderItem = function (f, index) {
 var disabled = this.cfg.isClosed ? 'disabled' : '';
 var voted = f.voted ? ' yc-voted' : '';
 var descHtml = f.description
 ? '

' + escapeHtml(f.description).replace(/\n/g, '
') + '

'
 : '';
 var thumbHtml = f.image_url
 ? '

![](https://www.yoozecase.com/' + escapeHtml(f.image_url) + ')

'
 : '';

 // Status workflow (v3.0.0): badge for any non-default status. The
 // roadmap view (v3.2.0) skips the badge - the column already
 // communicates the status, a badge would be redundant noise.
 var st = (f.status || 'open');
 var labels = this.cfg.statusLabels || {};
 var statusBadge = (!this.isRoadmap && st && st !== 'open' && labels[st])
 ? '' + escapeHtml(labels[st]) + ''
 : '';

 // Design themes (v3.1.0): arena / neon / pixel render extra per-item
 // furniture - rank number, avatar (image or initials), a "leader" pill
 // on rank 1, and a "votes" label. Classic/colour themes are untouched.
 var t = this.cfg.theme || 'light';
 var themed = (t === 'arena' || t === 'neon' || t === 'pixel');
 var rank = (typeof index === 'number') ? (index + 1) : 0;
 var rankHtml = '', leaderHtml = '', avatarHtml = '', votesLabel = '';
 if (themed) {
 rankHtml = '' + pad2(rank) + '';
 if (rank === 1) {
 leaderHtml = '' + escapeHtml(this.cfg.leaderLabel || 'Leader') + '';
 }
 if (f.image_url) {
 avatarHtml = '

![](https://www.yoozecase.com/' + escapeHtml(f.image_url) + ')

';
 } else {
 avatarHtml = '

' + escapeHtml(initialsOf(f.title)) + '

';
 }
 votesLabel = '' + escapeHtml(this.cfg.votesLabel || 'votes') + '';
 }

 // Moderation overlay: subtle corner buttons, only when canModerate.
 // Buttons appear on hover/focus (styled in CSS). Even in customizer
 // preview we render them when canModerate is true so the moderator
 // can see what visitors with moderation rights will see.
 var modHtml = '';
 if (this.cfg.canModerate) {
 var parts = [];
 var hideTitle = escapeHtml(this.t('hideTitle', 'Hide this feature'));
 var deleteTitle = escapeHtml(this.t('deleteTitle', 'Delete this feature'));
 if (this.cfg.allowSoftHide) {
 parts.push(
 ''
 );
 }
 if (this.cfg.allowHardDelete) {
 parts.push(
 ''
 );
 }
 if (parts.length || (this.cfg.statuses && this.cfg.statuses.length)) {
 var sParts = parts.slice();
 if (this.cfg.statuses && this.cfg.statuses.length) {
 var opts = '';
 for (var si = 0; si ' + escapeHtml(sl) + '';
 }
 var setStatus = escapeHtml(this.t('setStatus', 'Set status'));
 sParts.push(
 ''
 );
 }
 modHtml = '';
 }
 }

 var mediaHtml = themed ? avatarHtml : thumbHtml;
 return (
 '' +
 leaderHtml +
 rankHtml +
 '' +
 mediaHtml +
 '

' +
 '

##### ' + escapeHtml(f.title) + '

' +
 statusBadge +
 descHtml +
 '

' +
 modHtml +
 ''
 );
 };

 /**
 * Detects whether a JSON response looks like a CSRF/token rejection.
 * Two cases:
 * 1. com_ajax-level rejection (Joomla's auto-token-check on POST): top
 * level message contains the JINVALID_TOKEN_NOTICE text and HTTP
 * status is typically 403.
 * 2. Plugin-level rejection from requireToken(): payload.error === "Invalid token".
 */
 Board.prototype.isTokenError = function (status, raw, payload) {
 if (status === 403) return true;
 var hay = '';
 try { hay = JSON.stringify(raw || {}) + '|' + JSON.stringify(payload || {}); } catch (e) {}
 return /invalid (security )?token/i.test(hay);
 };

 /**
 * Fetch a fresh CSRF token from the server. Updates this.cfg.csrfToken so
 * the next call (and any future calls in this Board's lifetime) use the
 * correct one. Cache-bust with a timestamp so no upstream CDN caches the
 * response.
 */
 Board.prototype.fetchFreshToken = function () {
 var self = this;
 var url = this.cfg.ajaxUrl + '&task=token&_=' + Date.now();
 return fetch(url, {
 method: 'GET',
 credentials: 'same-origin',
 headers: { 'Accept': 'application/json', 'Cache-Control': 'no-cache' }
 })
 .then(function (r) { return r.json(); })
 .then(function (data) {
 var p = self.unwrapAjax(data);
 if (p && p.ok === true && typeof p.token === 'string' && p.token.length >= 16) {
 self.cfg.csrfToken = p.token;
 return p.token;
 }
 throw new Error('No fresh token in response');
 });
 };

 /**
 * Generic POST-with-token helper. Builds FormData from a plain object,
 * adds the current token, posts. On 403 / token-error response, fetches a
 * fresh token and retries exactly once.
 *
 * @param {string} task The task name (appended to URL and body)
 * @param {object} fields Key-value form fields (no token)
 * @return {Promise

## Changelog

---

v1.2.0
 Breaking 09/08/2026

Added

- **Custom CSS on every element.** A new Advanced tab with one field for your
- **The licence key now travels with the update request.** On Joomla it goes

Changed

- `tools/test-render.php` renders all 26 elements under both platform guards
- `tools/test-css.php` covers the custom CSS field: scoping, `&`, media

Fixed

- **The licence panel now scrolls its answer into view** on both platforms.

v1.1.0
 Breaking 09/08/2026

Added

- **Licence screen on WordPress**, at Settings > Crazy Highlights 'n Doodles,
- The WordPress build now ships **six languages**. The licence screen is
- A daily background check refreshes the licence verdict. It only calls out
- Removing the plugin now releases the licence, so the customer gets the

Changed

- One cache-busting value for every asset (YC.14). `marker.css` and `anim.js`

v1.0.0
 Breaking 08/08/2026

Added

- **WordPress update check.** The plugin answers WordPress' update filter and
- `BUILDINFO.txt` build fingerprint (build id, timestamp, content checksum) in

Changed

- Update-feed entries are tagged `stable` (they were `beta` during 0.x).
- The package README and this changelog are brought up to date; they had

Fixed

- The WordPress `Update URI` header pointed to a slug without the "n"

v0.50.1
 04/08/2026

Added

- `tools/feed.py` generates the update-feed blocks from the built zip's

Fixed

- The install message and log lines reported an old version number: the

v0.50.0
 04/08/2026

Added

- **Tone field (Playful/Refined) on all 26 elements.** Refined switches off the
- Two new Crazy Quote shapes: a disc with the quote mark cut out (the

v0.49.0
 04/08/2026

Added

- Caption on nine more elements: check, heart, hand, sparkle, sticker,

v0.48.2
 04/08/2026

Security

- The licence status task on the public `com_ajax` endpoint skipped the

v0.48.1
 04/08/2026

Fixed

- The Wipe reveal never appeared: its initial `clip-path` made the element
- The Draw reveal animated its line inside a fully transparent wrapper: the

v0.48.0
 04/08/2026

Added

- Caption on Crazy Arrow: a short text past the tip, handwritten (bundled

Changed

- The element-picker group names now carry the product name

v0.47.0
 04/08/2026

Added

- **First WordPress release.** The 26 elements, media and fonts now live in one

Changed

- All code is licensed GPL-2.0-or-later, per the 2026-08-02 licensing policy.

Fixed

- All 26 element templates carried a Joomla-only access guard (`_JEXEC`), which
- The WordPress archive now wraps its files in the plugin-slug folder, so the
