v0.6.3 (May 7, 2026)
Fixed
- Slot event targeting — events rendered inside a component's
<slot>now target that component, matching Hologram'sdefaultTargetbehaviour. Previously slot events always dispatched to the page. mount/2state sync — when a mounted component is updated via its cid (e.g. from a slot event),session.pagenow stays in sync with the bookkeeping copy so re-renders reflect the updated state.
v0.6.2 (May 5, 2026)
Added
assert_disabled/2/refute_disabled/2— assert whether an input (found by label text) is disabled.assert_readonly/2/refute_readonly/2— assert whether an input (found by label text) is readonly.
v0.6.1 (May 1, 2026)
Fixed
- Chained actions and commands now respect
action.target/command.target. Previouslynext_actionandnext_commandset during a component action always reused the original target, ignoringtarget: "page"or explicit component cids.
v0.6.0 (Apr 30, 2026)
Added
- Implicit component targeting — event handlers (
$click,$change,$submit, etc.) inside a stateful component's template now automatically target that component. Matches Hologram'sdefaultTargetbehaviour so explicittarget:is only needed when dispatching across component boundaries. - Component init action draining —
next_actionset during a component'sinit/3is now drained after page render andmount/2, matching page-level init drain behaviour.
v0.5.0 (Apr 26, 2026)
Breaking
visit now takes a %Hologram.Session{} as its first arg. This allows for
setting cookie and session data.
Added
use Mirage.Page— extension module that imports Mirage and sets up an ExUnitsetupblock providing%{server: %Hologram.Server{}}in test context.use Mirage.Component— extension module that imports Mirage andsigil_HOLOfor component-level tests.- Init lifecycle drain —
visit/3now drainsnext_command,next_action(recursive), andnext_pageset duringinit/3, matching Hologram's runtime behaviour. fill_in_hidden/3— fill in a hidden input by itsnameattribute. Validates the input is actually hidden and not disabled or readonly. Triggers$changeon both the input and its enclosing form.
v0.0.7 (Apr 21, 2026)
Fixed
- Server state now persists across client-side navigation (link clicks and action redirects no longer reset the server).
- Shorthand event syntax now supports
target:option (e.g.$click={:my_action, target: "cid"}).
Changed
assert_hasandrefute_hasnow trim whitespace (including newlines) when comparing:textand:valueoptions.
v0.0.6 (Apr 21, 2026)
Changed
- Form-level
$changenow receives all named field values in the event data, matching Hologram's runtime behaviour. - Form
$submitnow includes all named field values in the event data (e.g. hidden inputs, filled text fields, checked radios). open_browser's:wrapis now used to control the minimal layout wrapped around components.:centeris now used to center the component in the viewport.
Added
filled_inputsbookkeeping — tracks values set viafill_inso form data collection works even for inputs without avaluebinding in the template.
v0.0.5 (Apr 20, 2026)
Added
:countoption forassert_has: assert exact number of matching elements (e.g.assert_has(session, "li", count: 3)).:labeloption forassert_hasandrefute_has: filter elements by their associated<label>text (e.g.assert_has(session, "input", label: "Email", value: "foo@bar.com")).click/click_buttonnow finds submit buttons outside a<form>that reference it via the HTMLformattribute.open_browsernow centres mounted components by default. Disable per-call withopen_browser(session, wrap: false)or globally withconfig :mirage, open_browser: [wrap: false].
Fixes
~HOLOsigil was not being exported fromMirage.
v0.0.4 (Apr 20, 2026)
Added
assert_page/3— optional keyword list of expected params to assert against after navigation.
Changed
mount/2redesigned around~HOLOtemplates. Props, cid, and slot content are declared in markup; context is the only argument tomount. Accepts a single{Namespace, key: value}tuple or a list of tuples for multiple namespaces.visit/2now takes a keyword list instead of a map.
v0.0.3 (Apr 18, 2026)
Added
:atoption forassert_hasandrefute_has— match by 1-based position among all elements matching the selector.- Option validation — all functions that accept options now raise
ArgumentErrorfor unknown keys (viaKeyword.validate!/2). open_browser/1wraps mounted components in a bare HTML layout with your app's stylesheets.
v0.0.2 (Apr 18, 2026)
Added
mount/4— mount a component in isolation for testing, without a page or layout. Accepts:propsand:contextoptions; context values populatefrom_contextprops.reload/1— revisit the current page with the current params, resetting all client-side state.within_section/4— accepts an optional CSS selector argument to scope to elements other than<section>(e.g.div[role=article]).- Target support — event attributes with
target: "cid"now dispatch actions and commands to stateful child components identified by theircid.
Changed
fill_in,choose,check,uncheck,select, andselect_textnow raise when the matched input is hidden (hiddenattribute ortype="hidden"), disabled, or readonly.
v0.0.1 (Apr 18, 2026)
Initial release.