Files
rangerhq-buddy/CHANGELOG.md
T
ranger 0675c9f7d8 fix: wink is now a real CSS animation, no longer sticks (v0.1.3)
The v0.1.1 wink was rendered as a static SVG (left eye drawn as a
closed curve). Once the 5% random gate picked the wink tone, the
left eye stayed closed until the next page render — if the
dashboard sat idle, Buddy was stuck mid-wink indefinitely. David's
report: "the eye does not unblink."

v0.1.2's lower probability (30% → 5%) reduced how often you'd see
the stuck state, but didn't fix the underlying issue.

This release makes the wink a real transient animation:

- sprite.php no longer swaps the left eye for a closed path when
  tone is wink — both eyes are always open circles in the SVG
- buddy.css adds @keyframes buddyWink that briefly closes the
  left eye (scaleY 0.1) for ~250ms every 2.5s, applied only when
  the parent has the .buddy-sprite--wink class
- right eye keeps its normal 5s blink — the asymmetry is what
  makes it read as a wink rather than a synchronised blink
- mouth/cheeks/label still differ for wink tone (those are valid
  static state changes); only the eye behaviour moved to animation

Net effect: when the 5% chance fires, Buddy now actually winks
(closes, opens, closes, opens) instead of freezing one-eye-shut.
2026-05-26 08:08:56 +01:00

123 lines
7.1 KiB
Markdown

# Changelog
All notable changes to **Buddy** are documented here.
Format: [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/) — versioning: [SemVer](https://semver.org/).
---
## [Unreleased]
---
## [0.1.3] — 2026-05-27
### Fixed — Wink no longer gets stuck
The v0.1.1 wink was implemented as a static SVG render (left eye drawn as a closed curved line). Once the random 5% chance picked the `wink` tone, the page rendered with one eye closed and stayed that way until the next page reload — and 95% of subsequent reloads went back to a non-wink tone, but if the dashboard sat idle, Buddy was stuck mid-wink indefinitely. David reported it as *"buddy has the wink face but the eye does not unblink."*
v0.1.2's lower probability (30% → 5%) reduced how often you'd see the stuck state but did not fix the underlying issue.
v0.1.3 makes the wink a real CSS animation:
- **sprite.php** no longer renders the left eye as a closed path when tone is `wink` — both eyes are always open circles in the SVG.
- **buddy.css** has a new `@keyframes buddyWink` that briefly closes the left eye (`scaleY(0.1)`) for ~250 ms every 2.5 s. The right eye keeps its normal 5 s blink. That asymmetric pattern is what makes it read as a wink rather than a synchronised blink.
- The wink animation only runs when the parent has the `buddy-sprite--wink` class, which is still controlled by the same 5% probability gate from v0.1.2.
- The mouth (asymmetric smirk), cheek opacity (rosier), and mood label (`Cheeky 😉`) all still differ for the wink tone — those are valid static state changes. Only the eye behaviour moved from static-state to transient-animation.
Net effect: when the 5% chance fires, Buddy now actually winks (closes left eye, opens it, closes it, opens it, etc., every 2.5 s) instead of freezing one-eye-shut.
---
## [0.1.2] — 2026-05-26
### Tuned — Wink probability lowered from 30% to 5%
The wink Easter-egg added in v0.1.1 fired at 30% per page render
when Buddy's mood was ≥ 75. Default mood is 80, so most admin
visits hit the gate and ~30% of those flipped to wink. Stacked
across the main admin page + dashboard widget visible on the same
screen, Buddy ended up looking like he had one eye closed all the
time — "stuck" rather than "playful".
Dropped to 5%. Same wink visuals when it fires; just rare enough
to feel magical instead of constant. Refresh ~20 times when mood
is high and you'll catch one.
### Changed
- **`inc/state.php`**: `buddy_mood_label()` probability gate
`mt_rand( 1, 100 ) <= 30` changed to `<= 5`. Docstring updated
to reflect new ~5% rate.
- **Plugin version bumped**: header + `BUDDY_VERSION` constant
0.1.1 → 0.1.2.
- **About page** version-history card leads with v0.1.2; v0.1.1
demoted.
### Not changed
- Wink visuals (`inc/sprite.php`) — same closed-eye arc, smirk,
rosy cheeks when it fires. Just rarer.
- All other behavior identical to v0.1.1.
---
## [0.1.1] — 2026-05-25
### Added — Wink expression 😉
Buddy now has a fourth mood tone: **`wink`** — one eye closed, an
asymmetric smirk, and rosier cheeks. Rendered as a small variant
inside the existing inline-SVG sprite (still zero image files, no
new assets). When Buddy's overall mood is ≥ 75, there's a ~30%
chance on each page render that the wink replaces the standard
happy face. Refresh a few times when Buddy is content and you'll
catch it.
Why this commit exists: the v0.1.0 sprite had three tones
(happy / neutral / sad). Adding `wink` was the smallest possible
demo that the SVG expression engine is properly extensible — every
future mood/state/species can be added the same way. ~20 lines of
PHP, ~2 lines of CSS, no bundle weight, no dependencies.
### Changed
- **`inc/sprite.php`**: added `wink` to the allowed-tones list.
Left eye renders as a closed-eye curve (a small downward arc)
instead of the open circle. Right eye stays normal. Mouth shifts
to an asymmetric smirk curve. Cheek opacity bumped from 0.55 to
0.75 for extra cheekiness.
- **`inc/state.php`**: `buddy_mood_label()` now has a 30% chance of
returning the wink tone when the overall mood score is ≥ 75.
- **`assets/css/buddy.css`**: new `.buddy-widget__mood--wink` and
`.buddy-main__mood--wink` rules — warm amber pill matching the
cheeky vibe.
- **About page** version-history card leads with v0.1.1; v0.1.0
demoted to the previous entry.
- **Plugin version bumped**: header + `BUDDY_VERSION` constant
0.1.0 → 0.1.1.
---
## [0.1.0] — 2026-05-25
**Buddy is born.** First release of a new standalone WordPress plugin extracted-and-rebuilt from the tamagotchi feature that once lived inside A-WP-Notes v1.1.5 (now gracefully retired). Buddy stands on its own as a focused, charming companion plugin for the WordPress dashboard.
### Added — Phase A complete (pet exists)
- **Dashboard widget** at WP Admin → Dashboard showing the SVG character, the pet's name, a mood label ("Thriving" / "Content" / "Okay" / "Hungry" / "Distressed"), and four stat bars (Hunger / Happiness / Health / Energy).
- **Dedicated admin page** at WP Admin → Buddy → My Buddy showing the same data in a larger format with the pet's age and a placeholder note describing what's coming next.
- **About page** at WP Admin → Buddy → About with the side-by-side intro pattern, "What Buddy does" / "Who Buddy is for" / "Version history" cards, and a link to this CHANGELOG.md.
- **Settings page** at WP Admin → Buddy → Settings with a name-rename form and the Updates panel.
- **Per-user state storage** via `user_meta` (key: `buddy_state`). Each WP admin gets their own Buddy with its own name, species, and stats.
- **SVG sprite renderer** with three mood tones (happy / neutral / sad) and three sizes (sm / md / lg). Pure inline SVG with CSS keyframe animations (bobbing motion + periodic blinking). No GIFs, no sprite sheets, no image files for the character.
- **Self-hosted update checker** wired up to the Gitea repo from commit 1. Polls `/api/v1/repos/ranger/a-buddy/releases/latest` with a `/tags?limit=1` fallback. 12h success cache, 1h negative cache. UI surface lives on the Settings page.
- **Custom admin-menu icon** (`dashicons-pets`, a paw print) reinforcing the pet identity.
### Architecture (locked from day one)
- **Single-word brand name `Buddy`** — no "WP" prefix, no marketplace trademark hurdle.
- **Public GPL v2+ Gitea repo** at `ranger/a-buddy` on `git.davidtkeane.com`.
- **All persistent notice dismissals** to use `user_meta` + AJAX pattern (port from Logbook when first notice appears).
- **CSS-only animations, all assets local** — bundle stays small.
- **Single H1 per admin page**, no nested toggle boxes, no duplicate sections — Tier-1 discipline carried forward from Logbook.
### Not in this release (planned)
- Phase B — Feed / Play / Clean / Sleep interactions with cooldown timers.
- Phase C — WP-cron stat decay, "Buddy is hungry" dismissible admin notices.
- Phase D — Multiple species (dog, dragon, sprite), per-species personality phrases.
- Phase E — Site-health integration: pet stats react to `wp_get_site_health()` results, outdated plugins drain health, published posts feed hunger, cleared spam boosts happiness.
- Phase F — Pro tier with custom skins, multi-pet farm, social visits.