@ethlete/core 5.0.0-next.3 → 5.0.0-next.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,309 @@
1
1
  # @ethlete/core
2
2
 
3
+ ## 5.0.0-next.31
4
+
5
+ ### Minor Changes
6
+
7
+ - [#3030](https://github.com/ethlete-io/ethdk/pull/3030) [`1a6849f`](https://github.com/ethlete-io/ethdk/commit/1a6849fa37e8f6907d08766846a50d3d9de8211b) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add the `unsavedChanges` family for guarding forms against accidental discard, and a close-veto seam in the overlay runtime that powers it.
8
+ - `createUnsavedChangesTracker` — snapshots a default value, tracks whether the watched form/value differs from it (deep-equal snapshot semantics, not signal-forms `dirty()`), and normalizes an async `confirm` (value / Promise / Observable) to a `Promise<boolean>`. Signal-forms `FieldTree` is the first-class source; `Signal<FieldTree | null>` (late/async forms), `AbstractControl` (migration), and `WritableSignal` (escape hatch) are also supported. Includes `refreshDefaultValue` (re-baseline after a save-and-keep-open) and `restoreDefaultValue`.
9
+ - `createUnsavedChangesGuard` — the router/manual flavor, adding a `canDeactivate` bridge for Angular route guards.
10
+ - Overlay runtime: `overlayRef.registerCloseGuard(guard)` (synchronous veto for pending closes, returns an unregister fn) and `overlayRef.forceClose(result?, source?)` (commit a close bypassing guards). `reference-detached` closes always bypass guards. This is the seam `createOverlayUnsavedChangesGuard` in `@ethlete/components` builds on.
11
+
12
+ ### Patch Changes
13
+
14
+ - [#3030](https://github.com/ethlete-io/ethdk/pull/3030) [`4d70fb1`](https://github.com/ethlete-io/ethdk/commit/4d70fb1fd173e7e9d25031551f752196abb6f94e) Thanks [@github-actions](https://github.com/apps/github-actions)! - `etAutoSurface` now elevates correctly for content rendered inside an overlay. Projected/portaled content keeps the injector of where it was _declared_ (the trigger location), not the pane it renders into, so an `etAutoSurface` inside a select body, menu, date-picker, etc. resolved its parent surface from the outer trigger context and came out one elevation too low — the same level as the overlay's own panel instead of one above it.
15
+
16
+ `AutoSurfaceDirective` now also consults the root surface-context tracker (which records the innermost open overlay's surface across the portal boundary) and takes whichever parent surface sits higher. Overlay panels that are themselves the overlay's surface (menu, select/date/cascader panels, tooltip, toggletip) opt out via the new `AutoSurfaceDirective.ignoreOverlaySurfaceContext()` so they keep adopting their overlay's elevation rather than stacking above it — their rendered surface is unchanged.
17
+
18
+ - [`eee0451`](https://github.com/ethlete-io/ethdk/commit/eee0451642bfbce97991e539b938fc7c4c84e846) Thanks [@TomTomB](https://github.com/TomTomB)! - `ColorInteractiveDirective`: a readonly control (`aria-readonly="true"`) now keeps its resting accent — hover/active/focus no longer retint it, matching the view-only intent (previously a readonly switch still showed a press color shift).
19
+
20
+ - [#3030](https://github.com/ethlete-io/ethdk/pull/3030) [`008fca5`](https://github.com/ethlete-io/ethdk/commit/008fca57ad434e6d996b1af21f95c55902f74dcd) Thanks [@github-actions](https://github.com/apps/github-actions)! - `ColorInteractiveHasFocusDirective` (`[etColorInteractiveHasFocus]`) now resolves the theme's **base** accent while a descendant is `:focus-visible`, instead of the `-focus` variant. A container merely mirroring a child's focus (e.g. a form field's frame) should read as the plain accent color; the `-focus` variant remains reserved for an element that is itself focused (`[etColorInteractive]:focus-visible`). Effect: focused form fields now paint their focus border/label in the base accent rather than the focus-adjusted shade.
21
+
22
+ ## 5.0.0-next.30
23
+
24
+ ### Patch Changes
25
+
26
+ - [#3028](https://github.com/ethlete-io/ethdk/pull/3028) [`d8f50c5`](https://github.com/ethlete-io/ethdk/commit/d8f50c530b976390a8e655f3b1a4c0b9eaaae6ab) Thanks [@github-actions](https://github.com/apps/github-actions)! - Hover styles across all interactive components (buttons, chips, form controls, selects, cascader, menu, tabs, calendar, time picker, notification) no longer stick after tapping on touch devices — including the `etColorInteractive`/`etSurfaceInteractive` hover token resolution (guarded by `@media (hover: hover)`).
27
+
28
+ ## 5.0.0-next.29
29
+
30
+ ### Minor Changes
31
+
32
+ - [`2fca323`](https://github.com/ethlete-io/ethdk/commit/2fca323a6beac0299b8e0ec6724fffd4149ad7cd) Thanks [@TomTomB](https://github.com/TomTomB)! - `injectAnimatedBlockSize` can now animate the inline axis too via the new `axes` option (`['block' | 'inline']`, static or signal-based; default `['block']` as before). Used by the cascader panel to grow/shrink its width as columns drill in and out.
33
+
34
+ - [`4b7cf51`](https://github.com/ethlete-io/ethdk/commit/4b7cf51a6f68cdaf364169945586fedc5621cad6) Thanks [@TomTomB](https://github.com/TomTomB)! - Theme generators: pick the default theme at generation time — `--defaultTheme=<name>` on `tailwind-4-color-theme` and `--defaultLightTheme=<name>` / `--defaultDarkTheme=<name>` on `tailwind-4-surface-theme` override any `isDefault` flags in the definitions, so apps sharing one theme definition set (e.g. in a monorepo) can each generate a different default.
35
+
36
+ ### Patch Changes
37
+
38
+ - [`ddb3413`](https://github.com/ethlete-io/ethdk/commit/ddb3413c2673a4f2f513598a208f376b36b7535b) Thanks [@TomTomB](https://github.com/TomTomB)! - Grid items can now be moved with touch: `[etDragHandle]` sets `touch-action: none` on its host while enabled (the browser was claiming touch pointermoves for scrolling and cancelling the gesture), and read-only grids keep normal touch scrolling.
39
+
40
+ - [`06377b6`](https://github.com/ethlete-io/ethdk/commit/06377b6312fd32c7d1f497816fa91a655bf72d19) Thanks [@TomTomB](https://github.com/TomTomB)! - Overlay: a color theme provided on the app root component (e.g. `ProvideColorDirective` via `hostDirectives` plus `forceColor()`) now propagates into overlays even when they are opened without a `viewContainerRef`, and updates reactively while the overlay is open.
41
+
42
+ ## 5.0.0-next.28
43
+
44
+ ### Minor Changes
45
+
46
+ - [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`9431073`](https://github.com/ethlete-io/ethdk/commit/9431073bb693aa10bbb84d5196597cb2c4b7463f) Thanks [@github-actions](https://github.com/apps/github-actions)! - Overlays and menus now open on insecure origins (plain-HTTP pages on a LAN IP, not just `localhost`/HTTPS). Id generation used `crypto.randomUUID()`, which is `undefined` outside a secure context, so opening any dialog, sheet, anchored overlay or menu threw and only the backdrop appeared. A new `randomId()` helper in `@ethlete/core` uses `crypto.randomUUID()` when available and falls back to `getRandomValues` otherwise.
47
+
48
+ - [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`9431073`](https://github.com/ethlete-io/ethdk/commit/9431073bb693aa10bbb84d5196597cb2c4b7463f) Thanks [@github-actions](https://github.com/apps/github-actions)! - Rich text editor: the link flow is now a responsive popover (arrow-anchored on wider screens, a keyboard-pinned top sheet on touch) to edit a link's text and URL, with an open-in-new-tab toggle — replacing the browser `prompt()`. New-tab links persist through the Markdown value as raw HTML (`<a target="_blank" rel="noopener noreferrer">`); ordinary links stay `[text](url)`. `htmlToMarkdown` / `markdownToHtml` in `@ethlete/core` now round-trip `target="_blank"` anchors (sanitized href + forced `rel`). After applying a link the caret moves just past it, with a trailing space added when the link ends the line.
49
+
50
+ ### Patch Changes
51
+
52
+ - [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`49591f4`](https://github.com/ethlete-io/ethdk/commit/49591f4e529552fde07ef88b9754bf7c0cd91a3b) Thanks [@github-actions](https://github.com/apps/github-actions)! - `injectAnimatedBlockSize`: growing panels (menu, select) no longer flash at their final size for one frame before the resize animation plays — the animation now starts inside the `ResizeObserver` callback, before the browser paints the new layout.
53
+
54
+ - [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`d262f59`](https://github.com/ethlete-io/ethdk/commit/d262f596a4f0e3dda315447d0173cba301237c01) Thanks [@github-actions](https://github.com/apps/github-actions)! - `htmlToMarkdown`: boundary whitespace inside bold/italic/strikethrough now serializes outside the delimiters (`<strong> x</strong>` → ` **x**` instead of the invalid `** x**`).
55
+
56
+ - [#3022](https://github.com/ethlete-io/ethdk/pull/3022) [`00b7c33`](https://github.com/ethlete-io/ethdk/commit/00b7c337e5ae0ac1bfc7186237b1ac2879eb018d) Thanks [@github-actions](https://github.com/apps/github-actions)! - Theming: overlay panes (menu, select) now resolve their color context through passive providers and apply it before the first painted frame.
57
+ - `ProvideColorDirective` gains `resolvedColor` — the color that actually applies at the provider's location, falling through passive providers like the CSS cascade does. `syncWithProvider` uses it, so a passive in-between provider (e.g. a form field's) no longer erases the theme inside a detached overlay pane.
58
+ - The menu and select panels install the context sync during construction instead of in an effect, eliminating a wrong-theme flash during the enter animation.
59
+
60
+ ## 5.0.0-next.27
61
+
62
+ ### Minor Changes
63
+
64
+ - [#3019](https://github.com/ethlete-io/ethdk/pull/3019) [`1d7aaca`](https://github.com/ethlete-io/ethdk/commit/1d7aacaec10f3d3d7278733ebf5d834e8a89b1f7) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add `injectAnimatedBlockSize` — a core util that smoothly animates an element's `block-size` as its
65
+ content resizes (baseline captured on first render so the initial layout never plays as a
66
+ grow-from-0, interruption-safe, respects `prefers-reduced-motion`). `et-menu` and the rich text
67
+ editor's trigger popup now share it, giving a more consistent, smoother resize.
68
+
69
+ - [`c829986`](https://github.com/ethlete-io/ethdk/commit/c82998628a487effe34d2061811f3cee0fa4f7bc) Thanks [@TomTomB](https://github.com/TomTomB)! - Add clipboard utilities: `copyToClipboard(text)` writes text to the clipboard (async Clipboard API with an `execCommand('copy')` fallback) and resolves to a success boolean, `readFromClipboard()` resolves to the clipboard text or `null`. Both are SSR-safe and never throw.
70
+
71
+ - [`c829986`](https://github.com/ethlete-io/ethdk/commit/c82998628a487effe34d2061811f3cee0fa4f7bc) Thanks [@TomTomB](https://github.com/TomTomB)! - Markdown: GFM table column alignment round-trips — `markdownToHtml` applies `:---` / `:---:` / `---:` separators as `text-align` on every cell of the column, and `htmlToMarkdown` serializes the header cells' `text-align` back into the separator line.
72
+
73
+ - [`c829986`](https://github.com/ethlete-io/ethdk/commit/c82998628a487effe34d2061811f3cee0fa4f7bc) Thanks [@TomTomB](https://github.com/TomTomB)! - Markdown: `markdownToHtml` now escapes raw HTML in text (only the deliberate `<u>` / aligned-block passthroughs render, with aligned blocks reduced to a safe inline vocabulary) and rejects script-running URL schemes in links/images. Round-trip fixes and additions:
74
+ - Soft line breaks (`<br>`) survive in paragraphs and block quotes, and degrade to a space in table cells and list items instead of being dropped.
75
+ - Whitespace-flanked delimiters stay literal (`2 * 3 * 4` is no longer italicized), and `_emphasis_` is now supported without firing inside snake_case words.
76
+ - `<div>` boundaries in converted HTML act as paragraph boundaries.
77
+
78
+ ### Patch Changes
79
+
80
+ - [#3019](https://github.com/ethlete-io/ethdk/pull/3019) [`c68d2b2`](https://github.com/ethlete-io/ethdk/commit/c68d2b2e2e64316bb67bf58ec16d3aad9bd84f34) Thanks [@github-actions](https://github.com/apps/github-actions)! - Rich text editor: added an opt-in **alignment** tool. Provide `provideRichTextEditorAlignmentTool()` and include `'align'` in the editor's `tools` to get a block-alignment menu (left / center / right / justify) that also works inside table cells. The button reflects the caret's current alignment live. Alignment has no Markdown form, so it persists as a native `text-align` style and round-trips as raw HTML.
81
+
82
+ `@ethlete/core`: `markdownToHtml`/`htmlToMarkdown` now round-trip block elements carrying a `text-align` style (preserved verbatim as native HTML).
83
+
84
+ - [#3019](https://github.com/ethlete-io/ethdk/pull/3019) [`af660e3`](https://github.com/ethlete-io/ethdk/commit/af660e346204d18ad39cc700c8698bb897fba339) Thanks [@github-actions](https://github.com/apps/github-actions)! - Rich text editor: added **inline code** and **underline** formatting tools (in the static and selection toolbars, and the default toolbar). Inline code round-trips as `` `code` ``; underline is preserved as native `<u>` since Markdown has no underline form.
85
+
86
+ `@ethlete/core`: `htmlToMarkdown`/`markdownToHtml` now round-trip `<u>` (underline) instead of dropping it.
87
+
88
+ - [#3019](https://github.com/ethlete-io/ethdk/pull/3019) [`c68d2b2`](https://github.com/ethlete-io/ethdk/commit/c68d2b2e2e64316bb67bf58ec16d3aad9bd84f34) Thanks [@github-actions](https://github.com/apps/github-actions)! - Rich text editor: list items can now be nested. **Tab** nests the current item under the previous one, **Shift+Tab** lifts it out one level, and **Enter**/**Backspace** on an empty item step out one level at a time (leaving the list entirely only at the top level). Marker styles cycle by depth (disc → circle → square, and decimal → lower-alpha → lower-roman).
89
+
90
+ `@ethlete/core`: `markdownToHtml`/`htmlToMarkdown` now round-trip **nested** lists (two-space indentation per level), instead of flattening them.
91
+
92
+ - [#3019](https://github.com/ethlete-io/ethdk/pull/3019) [`af660e3`](https://github.com/ethlete-io/ethdk/commit/af660e346204d18ad39cc700c8698bb897fba339) Thanks [@github-actions](https://github.com/apps/github-actions)! - Rich text editor: the toolbar is now configurable. A new `tools` input takes an ordered list of tool tokens (`'bold' | 'italic' | 'strike' | 'heading' | 'bulletedList' | 'numberedList' | 'link' | 'divider'`), and `provideRichTextEditorTools(...)` sets the default for a scope. The block style is now picked from a `heading` menu (Normal / Heading 1–3) shown first in the toolbar, and toolbar buttons are larger and squarer.
93
+
94
+ Form field: read-only text controls (`et-input`, `et-rich-text-editor`) now keep their normal box but drop all interactive affordances — no hover/focus border change, default cursor — so read-only reads as view-only content, distinct from disabled.
95
+
96
+ Icon button: added an `--et-icon-button-border-radius` custom property so an ancestor context (e.g. a toolbar) can square off the otherwise fully-round button.
97
+
98
+ Overlay (`@ethlete/core`): anchored overlay positions accept an optional `boundary`, so an anchored pane (e.g. the editor's selection toolbar) can be kept inside a region and flip instead of overflowing it.
99
+
100
+ ## 5.0.0-next.26
101
+
102
+ ### Minor Changes
103
+
104
+ - [#3018](https://github.com/ethlete-io/ethdk/pull/3018) [`5d26649`](https://github.com/ethlete-io/ethdk/commit/5d266491805f5f0af4a5912a08beab02dafb629b) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add an `initials` util and `InitialsPipe` (`| initials`) that extract uppercased initials from a name, capped at a configurable number of characters (defaults to 2).
105
+
106
+ - [#3018](https://github.com/ethlete-io/ethdk/pull/3018) [`5d26649`](https://github.com/ethlete-io/ethdk/commit/5d266491805f5f0af4a5912a08beab02dafb629b) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add a `slugify` util and `SlugifyPipe` (`| slugify`) that convert a string into a URL-friendly slug — diacritics stripped, lowercased, non-alphanumeric runs collapsed to single hyphens.
107
+
108
+ ## 5.0.0-next.25
109
+
110
+ ### Patch Changes
111
+
112
+ - [#3017](https://github.com/ethlete-io/ethdk/pull/3017) [`83853d6`](https://github.com/ethlete-io/ethdk/commit/83853d6138bc7d0a481b5b982c2a7137b9cc65e6) Thanks [@github-actions](https://github.com/apps/github-actions)! - Overlay: anchored overlays with `autoCloseIfReferenceHidden` now close instantly when their anchor is removed, instead of jumping to the viewport corner and animating out from there.
113
+
114
+ ## 5.0.0-next.24
115
+
116
+ ### Minor Changes
117
+
118
+ - [#3016](https://github.com/ethlete-io/ethdk/pull/3016) [`2f18e43`](https://github.com/ethlete-io/ethdk/commit/2f18e4344759dbbcd17ba0dbeca138f1f7043cdf) Thanks [@github-actions](https://github.com/apps/github-actions)! - Anchored overlays: the `shift` option now also accepts `{ crossAxis?: boolean }` in addition to a boolean. With `crossAxis: true`, an overlay that fits on neither side of its reference is shifted along the placement's cross axis to stay inside the viewport (it may then overlap the reference) instead of overflowing off-screen.
119
+
120
+ Menus enable this by default: a nested submenu near the viewport edge first flips to the other side and, when neither side fits, slides over its parent menu — matching native OS menu behavior — instead of being cut off by the viewport.
121
+
122
+ The `size` middleware (`autoResize`) now runs after `shift` instead of before it, so `--et-overlay-max-width` / `--et-overlay-max-height` are measured from the pane's shifted position. Previously a cross-axis-shifted pane had its max size capped to the unshifted leftover space, squeezing e.g. a submenu to a sliver instead of letting it keep its width while overlapping its parent.
123
+
124
+ ### Patch Changes
125
+
126
+ - [#3016](https://github.com/ethlete-io/ethdk/pull/3016) [`2f18e43`](https://github.com/ethlete-io/ethdk/commit/2f18e4344759dbbcd17ba0dbeca138f1f7043cdf) Thanks [@github-actions](https://github.com/apps/github-actions)! - Animations: fix overlays getting stuck in the DOM in an invisible but click-blocking state when their leave transition never reported completion.
127
+
128
+ When several anchored overlays close at once (e.g. clicking an item inside a nested menu closes the whole menu tree), destroying an ancestor pane shifts the anchored position of a still-leaving descendant. The browser then cancels and restarts the running transition, so its end event arrives either flagged as cancelled or under a stale transition id — and the animated lifecycle waited forever for an event that could no longer arrive, leaving the pane orphaned at `opacity: 0` while still intercepting pointer events. The lifecycle now treats the transition as settled once no animation is running anymore, matching the fallback the interrupted-transition path already had, so the overlay is torn down reliably.
129
+
130
+ - [#3016](https://github.com/ethlete-io/ethdk/pull/3016) [`3b359e5`](https://github.com/ethlete-io/ethdk/commit/3b359e52c5efa1cd9b0e79216fc578525aafa8e8) Thanks [@github-actions](https://github.com/apps/github-actions)! - Tailwind surface & color theme generators: fix the dynamic `--color-*-surface-*` /
131
+ `--color-*-theme-*` variables not resolving per scope. They were emitted only inside
132
+ `@theme`, which lands on `:root`, so `rgb(var(--<runtime>-surface-background))` resolved
133
+ once against the root surface and inherited that concrete color into descendants. As a
134
+ result `bg-<prefix>-surface-*` / `bg-<prefix>-theme-*` utilities ignored nested
135
+ `.<runtime>-surface--*` / `.<runtime>-color--*` scopes (e.g. an elevated surface would
136
+ still paint the root background). The dynamic colors are now also re-declared on each
137
+ surface/color selector in the alias block, so the utilities resolve against the nearest
138
+ scope while still being generated from `@theme`.
139
+
140
+ ## 5.0.0-next.23
141
+
142
+ ### Major Changes
143
+
144
+ - [`11ce5e1`](https://github.com/ethlete-io/ethdk/commit/11ce5e1795249a6b975dab2eab7e8e2a9c9bc979) Thanks [@TomTomB](https://github.com/TomTomB)! - Overlay: replace the `inputBindings` / `outputBindings` config objects with a
145
+ single `bindings` array using Angular's native binding API. Bind overlay
146
+ component inputs, outputs, and two-way models with `inputBinding`,
147
+ `outputBinding`, and `twoWayBinding` from `@angular/core`.
148
+
149
+ ## 5.0.0-next.22
150
+
151
+ ### Minor Changes
152
+
153
+ - [`ea1eb65`](https://github.com/ethlete-io/ethdk/commit/ea1eb656b4f1144602830a3cd27a521ca50a9d06) Thanks [@TomTomB](https://github.com/TomTomB)! - Theming: add `AutoSurfaceDirective` (`etAutoSurface`), which resolves the surface
154
+ theme one elevation above its parent (or an explicitly provided) surface context
155
+ and applies it through a host `ProvideSurfaceDirective`. Meant to be used as a
156
+ host directive on components that render inside a detached overlay pane, where
157
+ surface context can't cascade through the DOM.
158
+
159
+ Tooltip and toggletip now use `AutoSurfaceDirective` as a host directive instead
160
+ of duplicating the auto-surface resolution logic. No change to their rendered
161
+ surface.
162
+
163
+ ## 5.0.0-next.21
164
+
165
+ ### Minor Changes
166
+
167
+ - [#3013](https://github.com/ethlete-io/ethdk/pull/3013) [`3f2eaad`](https://github.com/ethlete-io/ethdk/commit/3f2eaadf324bc6962a78efd2be1b7935106cc423) Thanks [@github-actions](https://github.com/apps/github-actions)! - Enrich the drag and resize gesture events:
168
+ - `DragHandleDirective`'s `dragStarted` output now emits a `DragStartEvent` with the `clientX` / `clientY` of the initial pointerdown (previously it emitted `void`).
169
+ - `DragMoveEvent` now includes `totalDx` / `totalDy`, the cumulative delta from the pointerdown position, alongside the per-step deltas.
170
+ - `ResizeMoveEvent` now includes `clientX` / `clientY`.
171
+
172
+ These give consumers absolute pointer information without having to accumulate the per-step deltas themselves.
173
+
174
+ - [#3013](https://github.com/ethlete-io/ethdk/pull/3013) [`3f2eaad`](https://github.com/ethlete-io/ethdk/commit/3f2eaadf324bc6962a78efd2be1b7935106cc423) Thanks [@github-actions](https://github.com/apps/github-actions)! - Overlay: anchored positioning now accepts a `VirtualElement` (from `@floating-ui/dom`) as the `referenceElement`, not just an `HTMLElement`. This makes it possible to anchor an overlay to an arbitrary point or region — for example positioning a context menu at the pointer. When a virtual reference is used, `mirrorWidth` and origin-element based behaviors gracefully fall back since there is no real element to measure.
175
+
176
+ - [#3013](https://github.com/ethlete-io/ethdk/pull/3013) [`3f2eaad`](https://github.com/ethlete-io/ethdk/commit/3f2eaadf324bc6962a78efd2be1b7935106cc423) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add `injectPrefersReducedMotion`, a signal that reflects the `(prefers-reduced-motion: reduce)` media query so components can opt out of animations for users who prefer reduced motion.
177
+
178
+ ### Patch Changes
179
+
180
+ - [`4e9f2b4`](https://github.com/ethlete-io/ethdk/commit/4e9f2b4d12335fafef192350aef8ffc584996a91) Thanks [@TomTomB](https://github.com/TomTomB)! - Remove the now-redundant `changeDetection: ChangeDetectionStrategy.OnPush` declaration (and its `ChangeDetectionStrategy` import) from all components. OnPush is the default change detection strategy since Angular 22, so this is a no-op cleanup with no behavioral change.
181
+
182
+ ## 5.0.0-next.20
183
+
184
+ ### Minor Changes
185
+
186
+ - [#3007](https://github.com/ethlete-io/ethdk/pull/3007) [`74974ff`](https://github.com/ethlete-io/ethdk/commit/74974ff36e64b80c750358441d8f5e8647557bdc) Thanks [@github-actions](https://github.com/apps/github-actions)! - Support satisfies for theme definitions
187
+
188
+ - [#3007](https://github.com/ethlete-io/ethdk/pull/3007) [`6539c72`](https://github.com/ethlete-io/ethdk/commit/6539c727c6d56ed9add30fa41039a0880d5c5121) Thanks [@github-actions](https://github.com/apps/github-actions)! - Gave surface theming the same treatment as color theming:
189
+ - Added an augmentable `EthleteSurfaceThemeNameRegistry` (mirroring `EthleteColorThemeNameRegistry`), so `etProvideSurface` and `provideSurfaceThemesWithTailwind4` can be narrowed to your app's actual surface theme names instead of a plain `string`.
190
+ - `tailwind-4-surface-theme` now also generates a `.d.ts` (next to the CSS output by default, or at a custom `typesOutputPath`) that augments the registry automatically.
191
+ - Fixed `tailwind-4-surface-theme` failing to parse individual surface theme objects written with `satisfies X` instead of `as const`, matching the same fix in `tailwind-4-color-theme`.
192
+ - Added a `runtimePrefix` option to `tailwind-4-surface-theme`, decoupling the Tailwind utility surface prefix from the runtime theme-swap prefix used by `ProvideSurfaceDirective`/`etProvideSurface` (the `.et-surface--<name>` selectors and `--et-surface-*` CSS variables) - the same fix already applied to `tailwind-4-color-theme`. Defaults to `prefix`, so existing usages are unaffected.
193
+
194
+ - [#3007](https://github.com/ethlete-io/ethdk/pull/3007) [`6539c72`](https://github.com/ethlete-io/ethdk/commit/6539c727c6d56ed9add30fa41039a0880d5c5121) Thanks [@github-actions](https://github.com/apps/github-actions)! - `tailwind-4-color-theme` now also generates a `.d.ts` file (next to the CSS output by default, or at a custom `typesOutputPath`) that augments `EthleteColorThemeNameRegistry` with your theme names. Previously this had to be hand-written; now it's kept in sync automatically whenever you regenerate. Also fixed the generator failing to parse individual theme objects written with `satisfies X` instead of `as const` (e.g. `export const RED = { ... } satisfies ColorTheme;`).
195
+
196
+ ### Patch Changes
197
+
198
+ - [#3009](https://github.com/ethlete-io/ethdk/pull/3009) [`9a029a5`](https://github.com/ethlete-io/ethdk/commit/9a029a551b5e2d8d30cba5382384dcbd47565f66) Thanks [@TomTomB](https://github.com/TomTomB)! - Fix `setupScrollRestoration` scrolling to top only after the new route had already painted under zoneless change detection, causing a visible jump from the previous scroll offset on tall pages. It is now driven synchronously off `router.events` (`NavigationEnd` / `NavigationSkipped`) instead of going through signal interop plus `debounceTime`, so `scrollTop = 0` lands before the first paint of the new route. All existing behavior (query param triggers, fragment scrolling, `routerDisableScrollTop`) is unchanged.
199
+
200
+ ## 5.0.0-next.19
201
+
202
+ ### Minor Changes
203
+
204
+ - [#3006](https://github.com/ethlete-io/ethdk/pull/3006) [`f6b9c10`](https://github.com/ethlete-io/ethdk/commit/f6b9c10b9702722d55a8a815ad9539a92c65e20a) Thanks [@TomTomB](https://github.com/TomTomB)! - Add `runtimePrefix` option to the `tailwind-4-color-theme` generator. This decouples the Tailwind utility color prefix (`prefix`, e.g. `bg-fut-primary`) from the runtime theme-swap prefix used by `ProvideColorDirective`/`etProvideColor` (the `.et-color--<name>` selectors and `--et-color-primary` CSS variables). Previously both were driven by the same `prefix` value, which broke consumers whose Tailwind utility naming convention differs from their runtime theme-switching convention. `runtimePrefix` defaults to `prefix`, so existing usages are unaffected.
205
+
206
+ ### Patch Changes
207
+
208
+ - [#3003](https://github.com/ethlete-io/ethdk/pull/3003) [`e7f482b`](https://github.com/ethlete-io/ethdk/commit/e7f482bc170b27374c03cd84b1a5df23ceda9bf6) Thanks [@github-actions](https://github.com/apps/github-actions)! - Fix markdown headings not being parsed when directly followed by a list or paragraph without a blank line
209
+
210
+ ## 5.0.0-next.18
211
+
212
+ ### Patch Changes
213
+
214
+ - [`d7c4fbe`](https://github.com/ethlete-io/ethdk/commit/d7c4fbe23359ebf68e4f769ac6eda05ce01f90c8) Thanks [@TomTomB](https://github.com/TomTomB)! - Fix broken heading support in markdown utils
215
+
216
+ ## 5.0.0-next.17
217
+
218
+ ### Minor Changes
219
+
220
+ - [`edea44b`](https://github.com/ethlete-io/ethdk/commit/edea44bf1c494420f02b545202f4b24db9a6395c) Thanks [@TomTomB](https://github.com/TomTomB)! - Update to angular 22
221
+
222
+ ## 5.0.0-next.16
223
+
224
+ ### Minor Changes
225
+
226
+ - [#2999](https://github.com/ethlete-io/ethdk/pull/2999) [`0232803`](https://github.com/ethlete-io/ethdk/commit/0232803afcee04ddc5d8c6ab57a8e920a908e1ac) Thanks [@github-actions](https://github.com/apps/github-actions)! - Update overlay runtime to support stategies
227
+
228
+ ## 5.0.0-next.15
229
+
230
+ ### Patch Changes
231
+
232
+ - [#2995](https://github.com/ethlete-io/ethdk/pull/2995) [`05da5f2`](https://github.com/ethlete-io/ethdk/commit/05da5f2c9ac78907f8be5003690332eea1f99ff8) Thanks [@github-actions](https://github.com/apps/github-actions)! - Fix `injectRoute`, `injectUrl` and the `injectRouterState` based signals (`injectPathParams`, `injectQueryParams`, `injectRouteData`, etc.) returning the previous route when read synchronously inside a component constructor during navigation. They now read the already committed router state instead of waiting for the `NavigationEnd` event.
233
+
234
+ ## 5.0.0-next.14
235
+
236
+ ### Minor Changes
237
+
238
+ - [`7dcbb8e`](https://github.com/ethlete-io/ethdk/commit/7dcbb8e3f3823728bc370fb89d1a89ee831e779b) Thanks [@TomTomB](https://github.com/TomTomB)! - Add utils for converting between markdown and html
239
+
240
+ ## 5.0.0-next.13
241
+
242
+ ### Patch Changes
243
+
244
+ - [`8f77e78`](https://github.com/ethlete-io/ethdk/commit/8f77e78d39a8fa91b9ccb8e038e9b3f62a9f1b94) Thanks [@TomTomB](https://github.com/TomTomB)! - Fix theme class name generation for legacy tailwind 3 themes
245
+
246
+ ## 5.0.0-next.12
247
+
248
+ ### Patch Changes
249
+
250
+ - [`b73a127`](https://github.com/ethlete-io/ethdk/commit/b73a127002a06e3aa0c4e7e977b1ad1f3e04e7e6) Thanks [@TomTomB](https://github.com/TomTomB)! - Bump yet again, final one for sure, pinky promise
251
+
252
+ ## 5.0.0-beta.11
253
+
254
+ ### Patch Changes
255
+
256
+ - [`ddb5d09`](https://github.com/ethlete-io/ethdk/commit/ddb5d09e4bc56e18cc8c228aa78a200441e7a766) Thanks [@TomTomB](https://github.com/TomTomB)! - Bump to beta
257
+
258
+ - Updated dependencies [[`ddb5d09`](https://github.com/ethlete-io/ethdk/commit/ddb5d09e4bc56e18cc8c228aa78a200441e7a766)]:
259
+ - @ethlete/types@2.0.0-beta.4
260
+
261
+ ## 5.0.0-next.10
262
+
263
+ ### Patch Changes
264
+
265
+ - [`a690217`](https://github.com/ethlete-io/ethdk/commit/a6902172efd9bd1956a16237e79acbfbd816d946) Thanks [@TomTomB](https://github.com/TomTomB)! - Version bump only
266
+
267
+ ## 5.0.0-next.9
268
+
269
+ ### Minor Changes
270
+
271
+ - [`5d1d3ac`](https://github.com/ethlete-io/ethdk/commit/5d1d3accbd4a7657bc50cdc0653a7ca24fe761e2) Thanks [@TomTomB](https://github.com/TomTomB)! - Add overlay runtime
272
+
273
+ - [`5d1d3ac`](https://github.com/ethlete-io/ethdk/commit/5d1d3accbd4a7657bc50cdc0653a7ca24fe761e2) Thanks [@TomTomB](https://github.com/TomTomB)! - Cleanup surface and color theming
274
+
275
+ ## 5.0.0-next.8
276
+
277
+ ### Minor Changes
278
+
279
+ - [#2958](https://github.com/ethlete-io/ethdk/pull/2958) [`8ecdfc0`](https://github.com/ethlete-io/ethdk/commit/8ecdfc00d785b0b535601b5d95ca7e2cd55455b6) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add surface theming support alongside color theming
280
+
281
+ ## 5.0.0-next.7
282
+
283
+ ### Patch Changes
284
+
285
+ - [`5ef2e15`](https://github.com/ethlete-io/ethdk/commit/5ef2e15369fcc1939a1a4b157960280571e14b55) Thanks [@TomTomB](https://github.com/TomTomB)! - Version bump for internal api changes
286
+
287
+ ## 5.0.0-next.6
288
+
289
+ ### Minor Changes
290
+
291
+ - [#2926](https://github.com/ethlete-io/ethdk/pull/2926) [`26966e3`](https://github.com/ethlete-io/ethdk/commit/26966e316e58694ef898f60cab7f5fd8a8d34381) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add user consent provider for bridging the gap to cookie banners
292
+
293
+ ## 5.0.0-next.5
294
+
295
+ ### Minor Changes
296
+
297
+ - [`9c59877`](https://github.com/ethlete-io/ethdk/commit/9c5987733133b9baa18b53eb5190f64c1ef010ba) Thanks [@TomTomB](https://github.com/TomTomB)! - Add scroll observer directives
298
+
299
+ - [#2925](https://github.com/ethlete-io/ethdk/pull/2925) [`9a029e6`](https://github.com/ethlete-io/ethdk/commit/9a029e62c0e23b870e7972e19b3f7c1d2358ef95) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add `breakpointTransformBase`, `boolBreakpointTransform`, `numberBreakpointTransform` and `typedBreakpointTransform` for creating inputs that react to breakpoint changes if configured as such
300
+
301
+ ## 5.0.0-next.4
302
+
303
+ ### Patch Changes
304
+
305
+ - [#2923](https://github.com/ethlete-io/ethdk/pull/2923) [`5c5fc57`](https://github.com/ethlete-io/ethdk/commit/5c5fc57e2e45b5fd78f0d20bacf0ec310cc84e2b) Thanks [@github-actions](https://github.com/apps/github-actions)! - Support inferring mime types from data uris
306
+
3
307
  ## 5.0.0-next.3
4
308
 
5
309
  ### Patch Changes
package/README.md CHANGED
@@ -1,7 +1,33 @@
1
- # core
1
+ # @ethlete/core
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ Angular framework primitives for the Ethlete SDK — signal-based DOM observation, the surface/color theming systems, the animation and overlay engines, and a toolbox of directives, pipes and utilities. Component-less; every other `@ethlete/*` UI library builds on it.
4
4
 
5
- ## Running unit tests
5
+ ## Installation
6
6
 
7
- Run `nx test core` to execute the unit tests.
7
+ ```bash
8
+ yarn add @ethlete/core
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { injectCurrentBreakpoint, signalHostElementDimensions } from '@ethlete/core';
15
+
16
+ @Component({
17
+ /* … */
18
+ })
19
+ export class ExampleComponent {
20
+ breakpoint = injectCurrentBreakpoint();
21
+ dimensions = signalHostElementDimensions();
22
+ }
23
+ ```
24
+
25
+ ## Documentation
26
+
27
+ Full guides on the docs site:
28
+
29
+ - [Overview](https://ethlete-sdk-docs.web.app/core/)
30
+ - [Element signals](https://ethlete-sdk-docs.web.app/core/element-signals) & [signal utilities](https://ethlete-sdk-docs.web.app/core/signal-utils)
31
+ - [Theming](https://ethlete-sdk-docs.web.app/core/theming)
32
+ - [Animations](https://ethlete-sdk-docs.web.app/core/animations) & [overlay runtime](https://ethlete-sdk-docs.web.app/core/overlay-runtime)
33
+ - [Providers](https://ethlete-sdk-docs.web.app/core/providers), [SEO](https://ethlete-sdk-docs.web.app/core/seo) & [utilities](https://ethlete-sdk-docs.web.app/core/utilities)