* feat(repo)!: upgrade nx to 22 and angular to 21
Upgrade the workspace to Nx 22.7.5 and Angular 21.2.16, and widen the
published peer dependency ranges to support Angular 21 and 22 while
dropping Angular 20.
- nx and @nx/* to 22.7.5; @angular/* to 21.2.16 (framework) and 21.2.14
(cli, build, devkit, cdk, ssr)
- brain, helm and trpc @angular/* peers to ">=21.0.0 <23.0.0"; the helm
embla-carousel-angular peer uses the same range
- @spartan-ng/cli minimums raised to >=21 and @schematics/angular to
21.2.14; the private tools lib aligned to nx 22 / angular 21
- analog 2.6.0, ng-packagr 21, angular-eslint 21, storybook 10, jest 30,
@testing-library/angular 19 and related tooling
- replace the calendar select host-listener $event with a typed output
subscription; constrain the ai-chat-link directive to anchors
- drive the menubar e2e arrow keys via native keydown and disable
Chromium throttling; hold cypress at 14 (15 breaks realPress specs)
BREAKING CHANGE: Angular 20 is no longer supported. spartan/ui now
supports Angular 21 and 22.
* ci: lower unit test parallelism to fit the runner memory
The docs app's vitest + Analog suite peaks at a few GB; running it
alongside two other test projects under --parallel=3 exhausted the
GitHub runner memory and the worker was OOM-killed with no output.
Run at most two test projects concurrently.
* fix(trpc): drop invalid environment providers from the test env module
The Nx 22 migration wrapped provideZoneChangeDetection() in an @NgModule,
but EnvironmentProviders are not valid in @NgModule providers and Angular
21 throws NG0207 at runtime. Restore the plain initTestEnvironment setup
(matching the docs app); the explicit zone provider is unnecessary.
* ci: run the docs app test suite in isolation
Bundling the docs app's vitest + Analog suite into the parallel test run
made it fail in CI while it passes on its own, and the interleaved output
hid the cause. Run the other projects in parallel, then the docs app as a
separate step.
* fix(nx): point test cache inputs at the real jest preset file
The test targets' cache inputs referenced jest.preset.js, but the
workspace preset is jest.preset.cjs, so the input never matched and a
preset change would not invalidate the cache. Fix both the
@nx/vitest:test target (added by the Nx 22 migration) and the existing
@nx/jest:jest target.
* ci: log exit code and retry the docs app test suite once
The docs app's vitest + Analog suite intermittently crashes in CI right
after loading Angular's testing modules, with no error output. Log the
exit code to classify the crash (128+signal indicates a native crash)
and retry once so a flaky crash does not fail the run while the root
cause is investigated.
* ci: clarify docs app test retry after pinpointing the flaky crash
The crash is in app.spec.ts: booting the full app shell (Header/Footer
and their deep import graph) intermittently crashes the vitest worker
during the Analog transform in CI (exit 1, no output, not reproducible
locally). It happens before any test runs, so a vitest per-test retry
cannot help; re-running the suite once does.
* chore(repo): hold analog at 2.1.3 and drop unit-test ci workarounds
Analog 2.6.0 intermittently crashed the docs app's vitest worker in CI
(a flaky transform of the app shell), so keep analog at the nx-migration's
tested 2.1.3, revert the marked bumps that 2.6.0 required, and restore the
ai-chat-link directive selector. Also restore the original unit test ci
step, dropping the parallel, isolation and retry workarounds added while
chasing that crash.
BrnCalendarPreviousButton and BrnCalendarNextButton failed to navigate
months when the focused date's day didn't exist in the target month
(e.g., March 29 → February in a non-leap year).
The date adapter's subtract/add with { months: 1 } passes the current
day to JavaScript's Date constructor, which silently overflows invalid
days — new Date(2026, 1, 29) becomes March 1 instead of February 28,
causing the calendar to appear stuck on the same month.
Applied the same fix already used in BrnCalendarCellButton (keyboard
navigation): go to start of month first, then subtract/add 1 month,
and clamp the day to the last day of the target month.
Also renamed the incorrectly named focusPreviousMonth() method in
BrnCalendarNextButton to focusNextMonth().
Closes#1291
* feat(select): refactor select brain/helm
* refactor(select): comment out select
* feat(select): add more examples
* feat(select): add placeholder input to hlmSelectValue
* feat(select): add placeholder text for select value and custom placeholder
* feat(select): add select values
* feat(select): add select-value-template
* feat(select): handle scroll up/down elements
* feat(pagination): use hlm-select
* feat: update snapshot
* fix: lint
* fix(select): update hidden access
* feat(select): update on ai review
* feat(select): add migration and healthcheck
* feat(select): set active item on open, either first or the selected value
* for multiple the last value
* feat(select): make scroll up/down smoother and add showScroll to select content
* feat(calendar): change selectof for month/year select
* feat(select): remove unused importAlias from select migration
* feat(select): dogfeed migration
* fix(select): use placeholder from brn-select
* feat(select): improve keyboard navigations
* open on enter
* select active item on tab
* feat(select): more dogfeeding of the migration, fix placeholder replacement
* fix(select): healthcheck test, as BrnSelectImports is removed w/ brnSelect migration
* fix: lint
* feat(select): improve a11y and update tests
* feat(select): update snapshot
* fix(select): allow empty string to be resolved
* feat(calendar): use linkedSignal for focusedDate, replace @HostListener with host
* feat(calendar): split exports into calendar, multi and range modes
* feat(calendar): use only one BrnCalendarImports
* feat: remove standalone property from various directives and components in the Helm UI library
* feat: enable strictStandalone option in Angular compiler settings
* feat(calendar): remove date selection on selected click
* feat(calendar): add brn-calendar-multi and hlm-calendar-multi for multi mode
* feat(calendar): add minSelection and maxSelection inputs
* limit deselect and reset selection when max is reached
* feat(date-picker): add hlm-date-picker-multi
* docs(calendar): cleanup multi examples