Laminar v0.13.0
Laminar & Airstream are now published directly for Scala 3. This required an internal refactoring of Airstream to satisfy Scala 3's stricter variance checks.
No breaking changes unless you extended / subclassed Airstream observable types.
News
New video: First Zymposium – Building an App with ZIO (and Laminar).
New tutorial: Hands-on Laminar, including form validation and integration with ScalaCSS and Monocle.
New project: kitlangton/zio-app – Quickly create apps with ZIO and Laminar
Kit published the first alpha of Animus, an animation library for Laminar.
Laminar Changes
Build: Laminar and Airstream are now published directly for Scala 3.0.0-RC3 and RC2 (update: and now Scala 3.0.0). The codebase is shared between Scala 2 and Scala 3.
New:
EventSource
,SignalSource
,Source
, andSink
type aliases are now available in when importingcom.raquo.laminar.api.L._
Airstream Changes
API: Refactor the class hierarchy to support stricter variance checks in Scala 3 (thanks, @yurique!)
Migration: If you manually extend Airstream traits
EventStream
,Signal
, orObservable
, you should now extendWritableEventStream
,WritableSignal
, andWritableObservable
instead.Other than that, everything should work as before.
API: Allow third party packages to extend Observable types
- Migration: We changed access modifiers on some members. If you are already extending Airstream observables, read the new docs section.
Waypoint Changes
Build: Upgrade to URL DSL 0.4.0
New: Base path and fragment matching
You can now match routes like
/#/note/123
instead of/note/123
by providingbasePath = Route.fragmentBasePath
toRoute
constructors. This lets you build a routing frontend without the cooperation of the backend.You can also use hash routing on a
file://
URL now (see e.g. laminar-examples)
New: Basic route helpers to match URL fragments (text after #)
- Routes like
(root / "page" / endOfSegments) withFragment
let you capture the whole fragment as one String
- Routes like
Fix: When initializing the router, do not update the initial URL to the canonical URL of the initial page
Keep the original URL with whatever extraneous query params it might have, to give any third party tools you might be using a chance to look at them
Migration: If you are relying on previous behaviour, call
router.replaceState(router.$currentPage.now())
on page load (after initializing the router) to accomplish the same in the new version.
Fix: Respond to
hashChange
events properly
Thank You
Laminar & Airstream development is sponsored by people like you.
GOLD sponsors supporting this release:
Thank you for supporting me! ❤️