@kouji-ui/core 0.0.3 → 0.0.4

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.
@@ -1,13 +1,13 @@
1
1
 
2
- > @kouji-ui/core@0.0.3 build /home/runner/work/kouji-ui/kouji-ui/packages/core
2
+ > @kouji-ui/core@0.0.4 build /home/runner/work/kouji-ui/kouji-ui/packages/core
3
3
  > ng-packagr -p ng-package.json
4
4
 
5
5
  Building Angular Package
6
6
 
7
7
  ------------------------------------------------------------------------------
8
+ - Compiling with Angular sources in partial compilation mode.
8
9
  Building entry point '@kouji-ui/core'
9
10
  ------------------------------------------------------------------------------
10
- - Compiling with Angular sources in partial compilation mode.
11
11
  ✔ Compiling with Angular sources in partial compilation mode.
12
12
  ✔ Generating FESM and DTS bundles
13
13
  - Copying assets
@@ -23,5 +23,5 @@ Built Angular Package
23
23
  - to: /home/runner/work/kouji-ui/kouji-ui/dist/kj-core
24
24
  ------------------------------------------------------------------------------
25
25
 
26
- Build at: 2026-05-04T21:22:08.979Z - Time: 4682ms
26
+ Build at: 2026-05-04T22:25:26.490Z - Time: 5957ms
27
27
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @kouji-ui/core
2
2
 
3
+ ## 0.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 202d9de: CI fix: husky pre-push hook now skips in CI environments (`$CI` or `$GITHUB_ACTIONS` set). Prevents the Changesets action's automated push from being blocked by the changeset-status gate. No runtime effect on the published package.
8
+ - dc0fe0f: Test-only fix: rewrite `KjToastService` test suite to use `TestBed.inject()` so `inject(KJ_TOAST_STRATEGY)` resolves through Angular DI (was crashing with `new KjToastService()` outside an injection context). No runtime change.
9
+ - d6b40e1: Internal lint cleanup — replace `any` casts in select option storage with typed `HTMLElement & { __kjOptionValue?: unknown }` and convert ternary statement to if/else in overlay toggle. No public API or behavior change.
10
+
3
11
  ## 0.0.3
4
12
 
5
13
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kouji-ui/core",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Headless Angular 21 UI primitives — directives over CDK with WCAG 2.1 AAA semantics and zero CSS.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,4 +1,4 @@
1
- import { render, fireEvent } from '@testing-library/angular';
1
+ import { render } from '@testing-library/angular';
2
2
  import { axe, toHaveNoViolations } from 'jest-axe';
3
3
  import { KjButton } from './button';
4
4
 
@@ -75,7 +75,7 @@ describe('KjDialogTrigger', () => {
75
75
  });
76
76
 
77
77
  it('closes dialog on overlay click (close on backdrop enabled by default)', async () => {
78
- const { getByRole, getByText } = await render(
78
+ const { getByRole } = await render(
79
79
  `<button [kjDialogTrigger]="dlg">Open</button>
80
80
  <ng-template #dlg>
81
81
  <div kjDialogOverlay>
@@ -1,7 +1,7 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { FormControl, ReactiveFormsModule } from '@angular/forms';
3
- import { render, fireEvent } from '@testing-library/angular';
4
- import { axe, toHaveNoViolations } from 'jest-axe';
3
+ import { render } from '@testing-library/angular';
4
+ import { toHaveNoViolations } from 'jest-axe';
5
5
  import { KjFormControl } from './form-control';
6
6
 
7
7
  expect.extend(toHaveNoViolations);
@@ -14,7 +14,7 @@ expect.extend(toHaveNoViolations);
14
14
  class TestHostComponent {
15
15
  ctrl = new FormControl('');
16
16
  formCtrl!: KjFormControl;
17
- onInput(e: Event): void {
17
+ onInput(_e: Event): void {
18
18
  // will be wired by the directive consumer pattern
19
19
  }
20
20
  onBlur(): void {}
@@ -1,4 +1,4 @@
1
- import { Component, TemplateRef, ViewChild, ViewContainerRef, inject } from '@angular/core';
1
+ import { Component, TemplateRef, ViewChild, ViewContainerRef, inject, OnInit } from '@angular/core';
2
2
  import { render } from '@testing-library/angular';
3
3
  import { KjOverlayService, KjOverlayRef } from './overlay';
4
4
 
@@ -17,7 +17,7 @@ describe('KjOverlayService', () => {
17
17
  standalone: true,
18
18
  template: '<ng-template #tpl><div>overlay content</div></ng-template>',
19
19
  })
20
- class TestComponent {
20
+ class TestComponent implements OnInit {
21
21
  @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
22
22
  readonly svc = inject(KjOverlayService);
23
23
  readonly vcr = inject(ViewContainerRef);
@@ -34,7 +34,7 @@ describe('KjOverlayService', () => {
34
34
  standalone: true,
35
35
  template: '<ng-template #tpl><div>overlay</div></ng-template>',
36
36
  })
37
- class TestComponent {
37
+ class TestComponent implements OnInit {
38
38
  @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
39
39
  readonly svc = inject(KjOverlayService);
40
40
  readonly vcr = inject(ViewContainerRef);
@@ -53,7 +53,7 @@ describe('KjOverlayService', () => {
53
53
  standalone: true,
54
54
  template: '<ng-template #tpl><div>overlay</div></ng-template>',
55
55
  })
56
- class TestComponent {
56
+ class TestComponent implements OnInit {
57
57
  @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
58
58
  readonly svc = inject(KjOverlayService);
59
59
  readonly vcr = inject(ViewContainerRef);
@@ -73,7 +73,7 @@ describe('KjOverlayService', () => {
73
73
  standalone: true,
74
74
  template: '<ng-template #tpl><div>overlay</div></ng-template>',
75
75
  })
76
- class TestComponent {
76
+ class TestComponent implements OnInit {
77
77
  @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
78
78
  readonly svc = inject(KjOverlayService);
79
79
  readonly vcr = inject(ViewContainerRef);
@@ -41,7 +41,11 @@ export class KjOverlayRef {
41
41
 
42
42
  /** Toggles the overlay between open and closed states. */
43
43
  toggle(): void {
44
- this.isOpen() ? this.close() : this.open();
44
+ if (this.isOpen()) {
45
+ this.close();
46
+ } else {
47
+ this.open();
48
+ }
45
49
  }
46
50
 
47
51
  /**
@@ -188,7 +188,7 @@ export class KjSelectContent {
188
188
  this.el.nativeElement.querySelectorAll('[kjOption]')
189
189
  ) as HTMLElement[]).map((el, i) => ({
190
190
  el,
191
- value: (el as any).__kjOptionValue,
191
+ value: (el as HTMLElement & { __kjOptionValue?: unknown }).__kjOptionValue,
192
192
  id: el.id || `kj-option-${i}`,
193
193
  }));
194
194
  }
@@ -234,7 +234,7 @@ export class KjOption {
234
234
 
235
235
  constructor() {
236
236
  effect(() => {
237
- (this.el.nativeElement as any).__kjOptionValue = this.kjOptionValue();
237
+ (this.el.nativeElement as HTMLElement & { __kjOptionValue?: unknown }).__kjOptionValue = this.kjOptionValue();
238
238
  });
239
239
  afterNextRender(() => {
240
240
  if (!this.el.nativeElement.id) {
@@ -1,6 +1,6 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { ColumnDef } from '@tanstack/angular-table';
3
- import { render, fireEvent } from '@testing-library/angular';
3
+ import { render } from '@testing-library/angular';
4
4
  import { axe, toHaveNoViolations } from 'jest-axe';
5
5
  import { KjTable, KjTableHeader } from './table';
6
6
 
@@ -1,8 +1,8 @@
1
- import { render, fireEvent } from '@testing-library/angular';
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { render } from '@testing-library/angular';
2
3
  import { axe, toHaveNoViolations } from 'jest-axe';
3
4
  import { KjToast, KjToastViewport } from './toast';
4
5
  import { KjToastService } from './toast.service';
5
- import { Component, inject } from '@angular/core';
6
6
 
7
7
  expect.extend(toHaveNoViolations);
8
8
 
@@ -47,43 +47,44 @@ describe('KjToastViewport', () => {
47
47
  });
48
48
 
49
49
  describe('KjToastService', () => {
50
- it('show(message) adds a toast', async () => {
51
- const svc = new KjToastService();
50
+ let svc: KjToastService;
51
+
52
+ beforeEach(() => {
53
+ TestBed.configureTestingModule({});
54
+ svc = TestBed.inject(KjToastService);
55
+ });
56
+
57
+ it('show(message) adds a toast', () => {
52
58
  expect(svc.toasts().length).toBe(0);
53
59
  svc.show('Hello', { duration: 0 });
54
60
  expect(svc.toasts().length).toBe(1);
55
61
  expect(svc.toasts()[0].message).toBe('Hello');
56
62
  });
57
63
 
58
- it('dismiss() removes a toast', async () => {
59
- const svc = new KjToastService();
64
+ it('dismiss() removes a toast', () => {
60
65
  const id = svc.show('Test', { duration: 0 });
61
66
  svc.dismiss(id);
62
67
  expect(svc.toasts().length).toBe(0);
63
68
  });
64
69
 
65
- it('success() sets variant=success', async () => {
66
- const svc = new KjToastService();
70
+ it('success() sets variant=success', () => {
67
71
  svc.success('Done', { duration: 0 });
68
72
  expect(svc.toasts()[0].variant).toBe('success');
69
73
  });
70
74
 
71
- it('error() sets variant=destructive', async () => {
72
- const svc = new KjToastService();
75
+ it('error() sets variant=destructive', () => {
73
76
  svc.error('Fail', { duration: 0 });
74
77
  expect(svc.toasts()[0].variant).toBe('destructive');
75
78
  });
76
79
 
77
- it('dismissAll() clears all toasts', async () => {
78
- const svc = new KjToastService();
80
+ it('dismissAll() clears all toasts', () => {
79
81
  svc.show('A', { duration: 0 });
80
82
  svc.show('B', { duration: 0 });
81
83
  svc.dismissAll();
82
84
  expect(svc.toasts().length).toBe(0);
83
85
  });
84
86
 
85
- it('contextFor() exposes a bound dismiss callback', async () => {
86
- const svc = new KjToastService();
87
+ it('contextFor() exposes a bound dismiss callback', () => {
87
88
  const id = svc.show('Hello', { duration: 0 });
88
89
  const ctx = svc.contextFor(svc.toasts()[0]);
89
90
  expect(ctx.id).toBe(id);
@@ -2,7 +2,7 @@ import {
2
2
  DestroyRef, Directive, ElementRef, TemplateRef,
3
3
  afterNextRender, computed, inject, input, signal,
4
4
  } from '@angular/core';
5
- import { KjToastContext, KjToastService, KjToastTemplateContext, KjToastVariant } from './toast.service';
5
+ import { KjToastService, KjToastTemplateContext, KjToastVariant } from './toast.service';
6
6
  import { KJ_TOAST_STRATEGY } from './toast.strategy';
7
7
  import { KjToastPositionX, KjToastPositionY } from './toast.types';
8
8