Blog

The Rename, The Bridge, The Click — Liveflux Evolves

The Rename, The Bridge, The Click — Liveflux Evolves

Today I chased a tiny annoyance and came back with a cleaner language for my livewire-like UI.

Funny how small changes carry big vibes.


Chapter 1 — A Standalone Package

First, I gave the runtime its own home. Tools deserve a place where they can grow without the clutter of the app.

  • Module: github.com/dracory/liveflux
  • Install: go get github.com/dracory/liveflux
  • Import: import "github.com/dracory/liveflux"

Quick use, the kind you paste at 1 a.m. with a grin:

// Mount placeholder
ph := liveflux.PlaceholderByAlias("counter", map[string]string{"theme":"dark"})

// SSR render (HB tag or HTML)
tag := liveflux.SSR(counter.New(app))
html := liveflux.SSRHTML(counter.New(app))

// Client script (once)
w.Write([]byte(liveflux.Script()))

Chapter 2 — Names That Fit

Words matter. I retired the old data-lw-* and embraced data-flux-* across the stack. One name, many surfaces.

  • Components now wrap with data-flux-root="1".
  • Placeholders render with data-flux-mount="1", data-flux-component="…", and data-flux-param-*.
  • Actions are expressed with data-flux-action.
  • Redirects can signal via data-flux-redirect.

One vocabulary across Go, JS, and docs. Less friction, more flow.


Chapter 3 — Shortcuts That Don’t Break Rules

Typing should feel light. I added a shorter alias for when I’m moving fast: the client now understands both full and short forms.

  • Full: data-flux-*
  • Short: flux-*

Supported in the runtime:

  • js/handlers.js: [data-flux-root] or [flux-root], and actions from data-flux-action or flux-action.
  • js/mount.js: placeholders with data-flux-mount="1" or flux-mount="1"; component from data-flux-component or flux-component.
  • js/util.js: params from both data-flux-param-* and flux-param-*.

Short where you type, explicit where you read. It stays legible tomorrow morning.


Chapter 4 — Examples That Teach

Examples are how future‑me learns from present‑me. I tuned the counter to speak the new language so it teaches the right thing by default.

  • File: examples/counter/counter.go
  • Buttons: data-flux-action="inc|dec|reset"

Docs got a sweep:

  • README.md reflects data-flux-* (root, mount, component, params).
  • Comparison docs updated to reference data-flux-action and data-flux-mount.

Chapter 5 — One Root, Less Friction

The real unlock was a tiny helper: c.Root(content).

I stopped hand‑wrapping every component with attributes and hidden fields. Instead, I returned the content through a single door and let the helper do the ceremony:

// examples/counter/counter.go
return c.Root(content)

Under the hood it adds the wrapper I always need:

  • data-flux-root="1"
  • hidden component and id inputs

The result? Fewer decisions, fewer typos, fewer lines. Buttons with data-flux-action just work, forms post the right identity, and the client finds the root every time. Streamlined and easy.


Chapter 6 — Why This Matters

  • Consistency: fewer mismatches between examples, docs, and runtime.
  • Ergonomics: short flux-* is easy to write; full data-flux-* stays HTML‑idiomatic.
  • Migration path: both forms work, so upgrades are painless.

It’s not a big feature; it’s a smoother path. And smooth paths get walked more often.

The Co‑Pilot — Cascade + GPT‑5‑Class Help

I didn’t do this alone. Cascade (GPT‑5‑class) kept the edits sharp and the thread intact: proposing precise diffs, sweeping docs without trampling style, and catching spots where old prefixes lingered. It nudged better names (Root, data-flux-*), guarded clean code habits (no mid‑file imports), and let me move fast without breaking the rhythm.


Today’s Diff — At a Glance

  • Liveflux runtime:
    • js/handlers.js — supports [flux-action] + [flux-root] in addition to the data- forms.
    • js/mount.js — mounts placeholders from flux-mount="1" and reads flux-component.
    • js/util.js — reads both data-flux-param-* and flux-param-*.
  • Examples & docs:
    • examples/counter/counter.go — updated to data-flux-action.
    • README.md and comparison docs — switched to data-flux-*.
  • App code (this repo):
    • Components and modals updated to data-flux-root, data-flux-action, data-flux-redirect.

What’s Next

  • No more legacy data-lw-*. Going forward, only data-flux-* (and the short flux-*) are accepted.
  • Configurable attribute names via client options, for advanced embedding scenarios.
  • A tiny lint/check to flag regressions to data-lw-* in templates.

I changed a prefix and got a better story. The clicks still landed. The vibe stayed crisp.