Skip to main content

CHANGELOG.md

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.2] - 2026-05-10

### Added

- The install task now also adds the playback socket to your
  endpoint (after the existing `Phoenix.LiveView.Socket`
  declaration) and writes `config :demo_director, pubsub: <OtpApp>.PubSub`
  into `config/dev.exs`. The post-install notice shrinks from three
  manual steps to one (the overlay-component HEEx edit), which stays
  manual on purpose because root layouts aren't AST-editable.
  Both new edits are idempotent — the task searches for an existing
  `DemoDirector.PlaybackSocket` socket declaration / `:demo_director`
  config block before adding.
- Selector resolver in the runtime now falls back to
  `document.querySelector` when a string isn't found via
  `data-demo-id`. Lets demos target existing semantic ids
  (`#vitals`), classes (`.btn-primary`), or any other CSS selector
  the host app already has, without forcing ad-hoc `data-demo-id`
  annotations. `data-demo-id` lookup is still tried first, so the
  recommended idiom is unchanged.
- `fillTyped` now dispatches a synthetic `keyup` event per character
  alongside the existing `input` event. Hosts that listen via
  `phx-keyup` (rather than `phx-change`) now react to typed input
  during demo playback.
- Demos listing page is now reachable at the bare mount path (e.g.
  `/dev/demo-director`) in addition to the original `<mount>/demos`.
  Both URLs render the same listing.
- Listing-page styling switched to a purple palette (Elixir-ish
  lavender on deep purple). The Play button stays red for contrast.
  The demo overlay (subtitle bar, highlight ring) is intentionally
  unchanged — it stays neutral so it works visually on any host
  app's color scheme.

### Fixed

- `mix igniter.install demo_director` crashed with
  `FunctionClauseError in Rewrite.update!/2` while seeding `AGENTS.md`
  / `CLAUDE.md`. The install task's updater callback returned a raw
  string instead of the `Rewrite.Source` that
  `Igniter.create_or_update_file/4` expects from its 4th argument.
  Updates the source's `:content` via `Rewrite.Source.update/3`.
- The router edit was not idempotent: re-running the install task
  appended a duplicate `if Application.compile_env(:my_app, :dev_routes)`
  block on every run. The task now searches for an existing
  `import DemoDirector.Router` call before adding, mirroring the
  pattern used by the Tidewave installer.
- Subtitle bar's text was bidi-flipped on hosts with
  `<html dir="rtl">` — English content's punctuation could land on
  the wrong side. Subtitle node now carries `dir="auto"` so its
  visual direction is determined by the first strong character of
  the subtitle text itself, regardless of the host page's direction.

### Documentation

- README's "Add to your Phoenix app" section notes that
  `demo_director` assumes the host app has a working Phoenix
  LiveView setup; the installer does not bootstrap LiveView from
  scratch.
- The README's manual wire-up step for the overlay component now
  explains why that step stays manual (HEEx isn't AST-editable like
  Elixir, so editing root layouts programmatically would be
  string-level surgery on a frequently-customized file) and notes
  that the component is prod-safe to leave unconditionally inside
  `<body>` (it returns empty markup when no mount path is
  registered). The install task's post-install notice carries the
  same explanation in shorter form.

## [0.1.1] - 2026-05-10

### Changed

- Reworded package description / README tagline to lead with what the
  package does ("Narrated, highlighted, animated demos for Phoenix
  LiveView") before the workflow tagline.
- Added Hex.pm and HexDocs badges to the README.

## [0.1.0] - 2026-05-10

### Added

- Helper API: `subtitle/1`, `highlight/1`, `fill/2`, `fill_typed/3`,
  `click/1`, `wait/1`. Each emits a JS string the agent passes to
  `browser_eval` (or that gets saved into a `.exs` script).
- HEEx integration via `demo_id/1` for stable selectors through LiveView
  patches.
- Overlay component (`demo_director_overlay`) rendering a
  word-by-word-revealed subtitle bar and a target-tracking highlight ring.
- Router macro (`demo_director "/director"`) mounting:
  - static assets (CSS + JS) at `<mount>/demo_director.{css,js}`
  - a web demos browser at `<mount>/demos` listing every saved demo
  - a per-demo JSON endpoint at `<mount>/demos/<name>.js`
  - a playback POST endpoint at `<mount>/play` (localhost-only)
- Phoenix channel + socket (`DemoDirector.PlaybackSocket`) that
  relays demo JS broadcasts to every connected overlay.
- `mix demo_director.play <name>` task that POSTs a saved demo's JS
  to the running dev server. Reads `# @start_at "/path"` metadata from
  the demo file and navigates the browser there before running.
- Igniter-based install task (`mix igniter.install demo_director`)
  that wires the router macro and seeds AGENTS.md / CLAUDE.md with the
  agent contract.