semmet-angular 0.22.0 → 0.24.0
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/README.md +6 -0
- package/package.json +1 -1
- package/src/accordion/files/__name@dasherize__/__name@dasherize__.spec.ts.template +124 -0
- package/src/accordion/index.js +1 -1
- package/src/accordion/index.js.map +1 -1
- package/src/accordion/index.ts +1 -1
- package/src/alert/files/__name@dasherize__/__name@dasherize__.spec.ts.template +27 -0
- package/src/alert/index.js +1 -1
- package/src/alert/index.js.map +1 -1
- package/src/alert/index.ts +1 -1
- package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.spec.ts.template +66 -0
- package/src/alert-dialog/index.js +1 -1
- package/src/alert-dialog/index.js.map +1 -1
- package/src/alert-dialog/index.ts +1 -1
- package/src/button/files/__name@dasherize__/__name@dasherize__.spec.ts.template +69 -0
- package/src/button/index.js +1 -1
- package/src/button/index.js.map +1 -1
- package/src/button/index.ts +1 -1
- package/src/button-group/files/__name@dasherize__/__name@dasherize__.spec.ts.template +70 -0
- package/src/button-group/index.js +1 -1
- package/src/button-group/index.js.map +1 -1
- package/src/button-group/index.ts +1 -1
- package/src/carousel/files/__name@dasherize__/__name@dasherize__.spec.ts.template +69 -0
- package/src/carousel/index.js +1 -1
- package/src/carousel/index.js.map +1 -1
- package/src/carousel/index.ts +1 -1
- package/src/checkbox/files/__name@dasherize__/__name@dasherize__.spec.ts.template +41 -0
- package/src/checkbox/index.js +1 -1
- package/src/checkbox/index.js.map +1 -1
- package/src/checkbox/index.ts +1 -1
- package/src/close-button/files/__name@dasherize__/__name@dasherize__.spec.ts.template +64 -0
- package/src/close-button/index.js +1 -1
- package/src/close-button/index.js.map +1 -1
- package/src/close-button/index.ts +1 -1
- package/src/combobox/files/__name@dasherize__/__name@dasherize__.spec.ts.template +79 -0
- package/src/combobox/index.js +1 -1
- package/src/combobox/index.js.map +1 -1
- package/src/combobox/index.ts +1 -1
- package/src/dialog/files/__name@dasherize__/__name@dasherize__.spec.ts.template +68 -0
- package/src/dialog/index.js +1 -1
- package/src/dialog/index.js.map +1 -1
- package/src/dialog/index.ts +1 -1
- package/src/disclosure/files/__name@dasherize__/__name@dasherize__.spec.ts.template +67 -0
- package/src/disclosure/index.js +1 -1
- package/src/disclosure/index.js.map +1 -1
- package/src/disclosure/index.ts +1 -1
- package/src/input/files/__name@dasherize__/__name@dasherize__.spec.ts.template +56 -0
- package/src/input/index.js +1 -1
- package/src/input/index.js.map +1 -1
- package/src/input/index.ts +1 -1
- package/src/list-group/files/__name@dasherize__/__name@dasherize__.spec.ts.template +66 -0
- package/src/list-group/index.js +1 -1
- package/src/list-group/index.js.map +1 -1
- package/src/list-group/index.ts +1 -1
- package/src/listbox/files/__name@dasherize__/__name@dasherize__.spec.ts.template +50 -0
- package/src/listbox/index.js +1 -1
- package/src/listbox/index.js.map +1 -1
- package/src/listbox/index.ts +1 -1
- package/src/menu-button/files/__name@dasherize__/__name@dasherize__.spec.ts.template +64 -0
- package/src/menu-button/index.js +1 -1
- package/src/menu-button/index.js.map +1 -1
- package/src/menu-button/index.ts +1 -1
- package/src/navbar/files/__name@dasherize__/__name@dasherize__.spec.ts.template +74 -0
- package/src/navbar/index.js +1 -1
- package/src/navbar/index.js.map +1 -1
- package/src/navbar/index.ts +1 -1
- package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.spec.ts.template +51 -0
- package/src/navigation-menu/index.js +1 -1
- package/src/navigation-menu/index.js.map +1 -1
- package/src/navigation-menu/index.ts +1 -1
- package/src/offcanvas/files/__name@dasherize__/__name@dasherize__.spec.ts.template +70 -0
- package/src/offcanvas/index.js +1 -1
- package/src/offcanvas/index.js.map +1 -1
- package/src/offcanvas/index.ts +1 -1
- package/src/pagination/files/__name@dasherize__/__name@dasherize__.spec.ts.template +41 -0
- package/src/pagination/index.js +1 -1
- package/src/pagination/index.js.map +1 -1
- package/src/pagination/index.ts +1 -1
- package/src/popover/files/__name@dasherize__/__name@dasherize__.spec.ts.template +69 -0
- package/src/popover/index.js +1 -1
- package/src/popover/index.js.map +1 -1
- package/src/popover/index.ts +1 -1
- package/src/radio-group/files/__name@dasherize__/__name@dasherize__.spec.ts.template +47 -0
- package/src/radio-group/index.js +1 -1
- package/src/radio-group/index.js.map +1 -1
- package/src/radio-group/index.ts +1 -1
- package/src/select/files/__name@dasherize__/__name@dasherize__.spec.ts.template +54 -0
- package/src/select/index.js +1 -1
- package/src/select/index.js.map +1 -1
- package/src/select/index.ts +1 -1
- package/src/slider/files/__name@dasherize__/__name@dasherize__.spec.ts.template +61 -0
- package/src/slider/index.js +1 -1
- package/src/slider/index.js.map +1 -1
- package/src/slider/index.ts +1 -1
- package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.spec.ts.template +74 -0
- package/src/spinbutton/index.js +1 -1
- package/src/spinbutton/index.js.map +1 -1
- package/src/spinbutton/index.ts +1 -1
- package/src/switch/files/__name@dasherize__/__name@dasherize__.spec.ts.template +35 -0
- package/src/switch/index.js +1 -1
- package/src/switch/index.js.map +1 -1
- package/src/switch/index.ts +1 -1
- package/src/tabs/files/__name@dasherize__/__name@dasherize__.spec.ts.template +113 -0
- package/src/tabs/index.js +1 -1
- package/src/tabs/index.js.map +1 -1
- package/src/tabs/index.ts +1 -1
- package/src/textarea/files/__name@dasherize__/__name@dasherize__.spec.ts.template +59 -0
- package/src/textarea/index.js +1 -1
- package/src/textarea/index.js.map +1 -1
- package/src/textarea/index.ts +1 -1
- package/src/toast/files/__name@dasherize__/__name@dasherize__.spec.ts.template +48 -0
- package/src/toast/index.js +1 -1
- package/src/toast/index.js.map +1 -1
- package/src/toast/index.ts +1 -1
- package/src/toolbar/files/__name@dasherize__/__name@dasherize__.spec.ts.template +45 -0
- package/src/toolbar/index.js +1 -1
- package/src/toolbar/index.js.map +1 -1
- package/src/toolbar/index.ts +1 -1
- package/src/tooltip/files/__name@dasherize__/__name@dasherize__.spec.ts.template +56 -0
- package/src/tooltip/index.js +1 -1
- package/src/tooltip/index.js.map +1 -1
- package/src/tooltip/index.ts +1 -1
- package/src/tree-view/files/__name@dasherize__/__name@dasherize__.spec.ts.template +84 -0
- package/src/tree-view/index.js +1 -1
- package/src/tree-view/index.js.map +1 -1
- package/src/tree-view/index.ts +1 -1
- package/src/utils/component-test-files/__name@dasherize__/__name@dasherize__.spec.ts.template +15 -1
- package/src/utils/generate-component.d.ts +6 -1
- package/src/utils/generate-component.js +21 -6
- package/src/utils/generate-component.js.map +1 -1
- package/src/utils/generate-component.ts +28 -7
package/src/menu-button/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.menuButton = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.menuButton = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.menuButton = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,UAAU,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,UAAU,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/menu-button/index.ts
CHANGED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
3
|
+
|
|
4
|
+
import { <%= classify(name) %>, <%= classify(name) %>Actions } from './<%= dasherize(name) %>';
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
imports: [<%= classify(name) %>, <%= classify(name) %>Actions],
|
|
8
|
+
template: `
|
|
9
|
+
<<%= selector %>
|
|
10
|
+
brand="Acme"
|
|
11
|
+
label="Main navigation"
|
|
12
|
+
[items]="items"
|
|
13
|
+
>
|
|
14
|
+
<ng-template <%= camelize(name) %>Actions>
|
|
15
|
+
<a href="/account">Account</a>
|
|
16
|
+
</ng-template>
|
|
17
|
+
</<%= selector %>>
|
|
18
|
+
`,
|
|
19
|
+
})
|
|
20
|
+
class HostComponent {
|
|
21
|
+
readonly items = [
|
|
22
|
+
{ label: 'Home', href: '/', current: true },
|
|
23
|
+
{ label: 'Projects', href: '/projects' },
|
|
24
|
+
{ label: 'Disabled', href: '/disabled', disabled: true },
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe('<%= classify(name) %>', () => {
|
|
29
|
+
let fixture: ComponentFixture<HostComponent>;
|
|
30
|
+
let host: HTMLElement;
|
|
31
|
+
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
await TestBed.configureTestingModule({
|
|
34
|
+
imports: [HostComponent],
|
|
35
|
+
}).compileComponents();
|
|
36
|
+
|
|
37
|
+
fixture = TestBed.createComponent(HostComponent);
|
|
38
|
+
fixture.detectChanges();
|
|
39
|
+
host = fixture.nativeElement as HTMLElement;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('renders semantic navigation with current and disabled links', () => {
|
|
43
|
+
const nav = host.querySelector<HTMLElement>('nav');
|
|
44
|
+
const links = Array.from(host.querySelectorAll<HTMLAnchorElement>('.semmet-navbar__link'));
|
|
45
|
+
|
|
46
|
+
expect(nav?.getAttribute('aria-label')).toBe('Main navigation');
|
|
47
|
+
expect(host.querySelector('.semmet-navbar__brand')?.textContent?.trim()).toBe('Acme');
|
|
48
|
+
expect(links[0].getAttribute('aria-current')).toBe('page');
|
|
49
|
+
expect(links[2].getAttribute('aria-disabled')).toBe('true');
|
|
50
|
+
expect(links[2].getAttribute('href')).toBeNull();
|
|
51
|
+
expect(host.textContent).toContain('Account');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('toggles responsive menu state and closes when a link is activated', () => {
|
|
55
|
+
const toggle = host.querySelector<HTMLButtonElement>('.semmet-navbar__toggle');
|
|
56
|
+
const menu = host.querySelector<HTMLElement>('.semmet-navbar__menu');
|
|
57
|
+
const projectsLink = Array.from(host.querySelectorAll<HTMLAnchorElement>('.semmet-navbar__link'))[1];
|
|
58
|
+
|
|
59
|
+
expect(toggle?.getAttribute('aria-expanded')).toBe('false');
|
|
60
|
+
expect(menu?.classList.contains('semmet-navbar__menu--open')).toBe(false);
|
|
61
|
+
|
|
62
|
+
toggle?.click();
|
|
63
|
+
fixture.detectChanges();
|
|
64
|
+
|
|
65
|
+
expect(toggle?.getAttribute('aria-expanded')).toBe('true');
|
|
66
|
+
expect(menu?.classList.contains('semmet-navbar__menu--open')).toBe(true);
|
|
67
|
+
|
|
68
|
+
projectsLink.click();
|
|
69
|
+
fixture.detectChanges();
|
|
70
|
+
|
|
71
|
+
expect(toggle?.getAttribute('aria-expanded')).toBe('false');
|
|
72
|
+
expect(menu?.classList.contains('semmet-navbar__menu--open')).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
});
|
package/src/navbar/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.navbar = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.navbar = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.navbar = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/src/navbar/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,MAAM,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,MAAM,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/navbar/index.ts
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
3
|
+
|
|
4
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
imports: [<%= classify(name) %>],
|
|
8
|
+
template: `<<%= selector %> />`,
|
|
9
|
+
})
|
|
10
|
+
class HostComponent {}
|
|
11
|
+
|
|
12
|
+
describe('<%= classify(name) %>', () => {
|
|
13
|
+
let fixture: ComponentFixture<HostComponent>;
|
|
14
|
+
let host: HTMLElement;
|
|
15
|
+
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
await TestBed.configureTestingModule({
|
|
18
|
+
imports: [HostComponent],
|
|
19
|
+
}).compileComponents();
|
|
20
|
+
|
|
21
|
+
fixture = TestBed.createComponent(HostComponent);
|
|
22
|
+
fixture.detectChanges();
|
|
23
|
+
host = fixture.nativeElement as HTMLElement;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('renders semantic navigation without app menu roles', () => {
|
|
27
|
+
const nav = host.querySelector<HTMLElement>('nav');
|
|
28
|
+
const links = Array.from(host.querySelectorAll<HTMLAnchorElement>('a'));
|
|
29
|
+
|
|
30
|
+
expect(nav?.getAttribute('aria-label')).toBe('Main');
|
|
31
|
+
expect(host.querySelector('[role="menu"]')).toBeNull();
|
|
32
|
+
expect(host.querySelector('[role="menuitem"]')).toBeNull();
|
|
33
|
+
expect(links.map((link) => link.textContent?.trim())).toEqual(['Home', 'First product', 'Second product']);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('toggles submenu visibility and ARIA state', () => {
|
|
37
|
+
const button = host.querySelector<HTMLButtonElement>('button');
|
|
38
|
+
const submenu = host.querySelector<HTMLUListElement>('ul ul');
|
|
39
|
+
|
|
40
|
+
expect(button?.getAttribute('aria-expanded')).toBe('false');
|
|
41
|
+
expect(button?.getAttribute('aria-controls')).toBe(submenu?.id);
|
|
42
|
+
expect(submenu?.getAttribute('aria-labelledby')).toBe(button?.id);
|
|
43
|
+
expect(submenu?.hidden).toBe(true);
|
|
44
|
+
|
|
45
|
+
button?.click();
|
|
46
|
+
fixture.detectChanges();
|
|
47
|
+
|
|
48
|
+
expect(button?.getAttribute('aria-expanded')).toBe('true');
|
|
49
|
+
expect(submenu?.hidden).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.navigationMenu = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.navigationMenu = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.navigationMenu = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,cAAc,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,cAAc,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
3
|
+
|
|
4
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
imports: [<%= classify(name) %>],
|
|
8
|
+
template: `
|
|
9
|
+
<<%= selector %> triggerLabel="Open filters" title="Filters" description="Refine results">
|
|
10
|
+
<button type="button">Apply filters</button>
|
|
11
|
+
</<%= selector %>>
|
|
12
|
+
`,
|
|
13
|
+
})
|
|
14
|
+
class HostComponent {}
|
|
15
|
+
|
|
16
|
+
describe('<%= classify(name) %>', () => {
|
|
17
|
+
let fixture: ComponentFixture<HostComponent>;
|
|
18
|
+
let host: HTMLElement;
|
|
19
|
+
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
await TestBed.configureTestingModule({
|
|
22
|
+
imports: [HostComponent],
|
|
23
|
+
}).compileComponents();
|
|
24
|
+
|
|
25
|
+
fixture = TestBed.createComponent(HostComponent);
|
|
26
|
+
fixture.detectChanges();
|
|
27
|
+
host = fixture.nativeElement as HTMLElement;
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('renders a closed trigger wired to the panel id', () => {
|
|
31
|
+
const trigger = host.querySelector<HTMLButtonElement>('.semmet-offcanvas__trigger');
|
|
32
|
+
|
|
33
|
+
expect(trigger?.textContent?.trim()).toBe('Open filters');
|
|
34
|
+
expect(trigger?.getAttribute('aria-controls')).toBeTruthy();
|
|
35
|
+
expect(trigger?.getAttribute('aria-expanded')).toBe('false');
|
|
36
|
+
expect(host.querySelector('[role="dialog"]')).toBeNull();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('opens as a modal dialog and closes with Escape, backdrop, and close button', () => {
|
|
40
|
+
const trigger = host.querySelector<HTMLButtonElement>('.semmet-offcanvas__trigger');
|
|
41
|
+
|
|
42
|
+
trigger?.click();
|
|
43
|
+
fixture.detectChanges();
|
|
44
|
+
|
|
45
|
+
let panel = host.querySelector<HTMLElement>('[role="dialog"]');
|
|
46
|
+
expect(trigger?.getAttribute('aria-expanded')).toBe('true');
|
|
47
|
+
expect(panel?.getAttribute('aria-modal')).toBe('true');
|
|
48
|
+
expect(panel?.getAttribute('aria-labelledby')).toBeTruthy();
|
|
49
|
+
expect(panel?.getAttribute('aria-describedby')).toBeTruthy();
|
|
50
|
+
expect(panel?.textContent).toContain('Filters');
|
|
51
|
+
expect(panel?.textContent).toContain('Apply filters');
|
|
52
|
+
|
|
53
|
+
panel?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
|
|
54
|
+
fixture.detectChanges();
|
|
55
|
+
expect(host.querySelector('[role="dialog"]')).toBeNull();
|
|
56
|
+
|
|
57
|
+
trigger?.click();
|
|
58
|
+
fixture.detectChanges();
|
|
59
|
+
host.querySelector<HTMLElement>('.semmet-offcanvas__backdrop')?.click();
|
|
60
|
+
fixture.detectChanges();
|
|
61
|
+
expect(host.querySelector('[role="dialog"]')).toBeNull();
|
|
62
|
+
|
|
63
|
+
trigger?.click();
|
|
64
|
+
fixture.detectChanges();
|
|
65
|
+
panel = host.querySelector<HTMLElement>('[role="dialog"]');
|
|
66
|
+
panel?.querySelector<HTMLButtonElement>('.semmet-offcanvas__close')?.click();
|
|
67
|
+
fixture.detectChanges();
|
|
68
|
+
expect(host.querySelector('[role="dialog"]')).toBeNull();
|
|
69
|
+
});
|
|
70
|
+
});
|
package/src/offcanvas/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.offcanvas = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.offcanvas = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.offcanvas = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,SAAS,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,SAAS,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/offcanvas/index.ts
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
2
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
3
|
+
|
|
4
|
+
describe('<%= classify(name) %>', () => {
|
|
5
|
+
let fixture: ComponentFixture<<%= classify(name) %>>;
|
|
6
|
+
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
await TestBed.configureTestingModule({ imports: [<%= classify(name) %>] }).compileComponents();
|
|
9
|
+
fixture = TestBed.createComponent(<%= classify(name) %>);
|
|
10
|
+
fixture.detectChanges();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
function buttons(): HTMLButtonElement[] {
|
|
14
|
+
return Array.from(fixture.nativeElement.querySelectorAll('button'));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function links(): HTMLAnchorElement[] {
|
|
18
|
+
return Array.from(fixture.nativeElement.querySelectorAll('a'));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
it('renders navigation with current page state', () => {
|
|
22
|
+
expect(fixture.nativeElement.querySelector('nav').getAttribute('aria-label')).toBe('Pagination');
|
|
23
|
+
expect(buttons()[0].disabled).toBe(true);
|
|
24
|
+
expect(links()[0].getAttribute('aria-current')).toBe('page');
|
|
25
|
+
expect(buttons()[1].disabled).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('changes current page from page links and next/previous buttons', () => {
|
|
29
|
+
links()[2].click();
|
|
30
|
+
fixture.detectChanges();
|
|
31
|
+
expect(links()[2].getAttribute('aria-current')).toBe('page');
|
|
32
|
+
|
|
33
|
+
buttons()[0].click();
|
|
34
|
+
fixture.detectChanges();
|
|
35
|
+
expect(links()[1].getAttribute('aria-current')).toBe('page');
|
|
36
|
+
|
|
37
|
+
buttons()[1].click();
|
|
38
|
+
fixture.detectChanges();
|
|
39
|
+
expect(links()[2].getAttribute('aria-current')).toBe('page');
|
|
40
|
+
});
|
|
41
|
+
});
|
package/src/pagination/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.pagination = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.pagination = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.pagination = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,UAAU,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,UAAU,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/pagination/index.ts
CHANGED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
3
|
+
import { By } from '@angular/platform-browser';
|
|
4
|
+
|
|
5
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
6
|
+
|
|
7
|
+
@Component({
|
|
8
|
+
imports: [<%= classify(name) %>],
|
|
9
|
+
template: `
|
|
10
|
+
<<%= selector %> triggerLabel="Details" title="Extra details" content="Context text">
|
|
11
|
+
<a href="/help">Help link</a>
|
|
12
|
+
</<%= selector %>>
|
|
13
|
+
`,
|
|
14
|
+
})
|
|
15
|
+
class HostComponent {}
|
|
16
|
+
|
|
17
|
+
describe('<%= classify(name) %>', () => {
|
|
18
|
+
let fixture: ComponentFixture<HostComponent>;
|
|
19
|
+
let host: HTMLElement;
|
|
20
|
+
|
|
21
|
+
beforeEach(async () => {
|
|
22
|
+
await TestBed.configureTestingModule({
|
|
23
|
+
imports: [HostComponent],
|
|
24
|
+
}).compileComponents();
|
|
25
|
+
|
|
26
|
+
fixture = TestBed.createComponent(HostComponent);
|
|
27
|
+
fixture.detectChanges();
|
|
28
|
+
host = fixture.nativeElement as HTMLElement;
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('renders a closed disclosure trigger for non-modal dialog content', () => {
|
|
32
|
+
const trigger = host.querySelector<HTMLButtonElement>('.semmet-popover__trigger');
|
|
33
|
+
|
|
34
|
+
expect(trigger?.textContent?.trim()).toBe('Details');
|
|
35
|
+
expect(trigger?.getAttribute('aria-haspopup')).toBe('dialog');
|
|
36
|
+
expect(trigger?.getAttribute('aria-expanded')).toBe('false');
|
|
37
|
+
expect(host.querySelector('[role="dialog"]')).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('opens and closes the popover from trigger, close button, and Escape', () => {
|
|
41
|
+
const triggerDebug = fixture.debugElement.query(By.css('.semmet-popover__trigger'));
|
|
42
|
+
const trigger = triggerDebug.nativeElement as HTMLButtonElement;
|
|
43
|
+
|
|
44
|
+
trigger.click();
|
|
45
|
+
fixture.detectChanges();
|
|
46
|
+
|
|
47
|
+
let panel = host.querySelector<HTMLElement>('[role="dialog"]');
|
|
48
|
+
expect(trigger.getAttribute('aria-expanded')).toBe('true');
|
|
49
|
+
expect(trigger.getAttribute('aria-controls')).toBe(panel?.id);
|
|
50
|
+
expect(panel?.getAttribute('aria-labelledby')).toBeTruthy();
|
|
51
|
+
expect(panel?.textContent).toContain('Extra details');
|
|
52
|
+
expect(panel?.textContent).toContain('Help link');
|
|
53
|
+
|
|
54
|
+
panel?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
|
|
55
|
+
fixture.detectChanges();
|
|
56
|
+
|
|
57
|
+
expect(trigger.getAttribute('aria-expanded')).toBe('false');
|
|
58
|
+
expect(host.querySelector('[role="dialog"]')).toBeNull();
|
|
59
|
+
|
|
60
|
+
trigger.click();
|
|
61
|
+
fixture.detectChanges();
|
|
62
|
+
|
|
63
|
+
panel = host.querySelector<HTMLElement>('[role="dialog"]');
|
|
64
|
+
panel?.querySelector<HTMLButtonElement>('.semmet-popover__close')?.click();
|
|
65
|
+
fixture.detectChanges();
|
|
66
|
+
|
|
67
|
+
expect(host.querySelector('[role="dialog"]')).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
});
|
package/src/popover/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.popover = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.popover = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.popover = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/src/popover/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,OAAO,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,OAAO,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/popover/index.ts
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
2
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
3
|
+
|
|
4
|
+
describe('<%= classify(name) %>', () => {
|
|
5
|
+
let fixture: ComponentFixture<<%= classify(name) %>>;
|
|
6
|
+
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
await TestBed.configureTestingModule({ imports: [<%= classify(name) %>] }).compileComponents();
|
|
9
|
+
fixture = TestBed.createComponent(<%= classify(name) %>);
|
|
10
|
+
fixture.detectChanges();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
function radios(): HTMLElement[] {
|
|
14
|
+
return Array.from(fixture.nativeElement.querySelectorAll('[role="radio"]'));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
it('renders a labelled radiogroup with one selected item', () => {
|
|
18
|
+
const group = fixture.nativeElement.querySelector('[role="radiogroup"]');
|
|
19
|
+
const [monthly, yearly] = radios();
|
|
20
|
+
|
|
21
|
+
expect(group.getAttribute('aria-labelledby')).toBeTruthy();
|
|
22
|
+
expect(monthly.textContent?.trim()).toBe('Monthly');
|
|
23
|
+
expect(monthly.getAttribute('aria-checked')).toBe('true');
|
|
24
|
+
expect(monthly.tabIndex).toBe(0);
|
|
25
|
+
expect(yearly.getAttribute('aria-checked')).toBe('false');
|
|
26
|
+
expect(yearly.tabIndex).toBe(-1);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('selects an option on click', () => {
|
|
30
|
+
const [, yearly] = radios();
|
|
31
|
+
yearly.click();
|
|
32
|
+
fixture.detectChanges();
|
|
33
|
+
|
|
34
|
+
expect(yearly.getAttribute('aria-checked')).toBe('true');
|
|
35
|
+
expect(yearly.tabIndex).toBe(0);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('moves focus and selection with arrow keys', () => {
|
|
39
|
+
const [monthly, yearly] = radios();
|
|
40
|
+
monthly.focus();
|
|
41
|
+
monthly.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }));
|
|
42
|
+
fixture.detectChanges();
|
|
43
|
+
|
|
44
|
+
expect(document.activeElement).toBe(yearly);
|
|
45
|
+
expect(yearly.getAttribute('aria-checked')).toBe('true');
|
|
46
|
+
});
|
|
47
|
+
});
|
package/src/radio-group/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.radioGroup = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.radioGroup = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.radioGroup = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,UAAU,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,UAAU,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/radio-group/index.ts
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
3
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
4
|
+
|
|
5
|
+
@Component({
|
|
6
|
+
imports: [<%= classify(name) %>],
|
|
7
|
+
template: `
|
|
8
|
+
<<%= selector %>
|
|
9
|
+
label="Area"
|
|
10
|
+
hint="Choose a team."
|
|
11
|
+
errorMessage="Area is required."
|
|
12
|
+
[required]="true"
|
|
13
|
+
[(value)]="area"
|
|
14
|
+
/>
|
|
15
|
+
`,
|
|
16
|
+
})
|
|
17
|
+
class HostComponent {
|
|
18
|
+
area = '';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('<%= classify(name) %>', () => {
|
|
22
|
+
let fixture: ComponentFixture<HostComponent>;
|
|
23
|
+
|
|
24
|
+
beforeEach(async () => {
|
|
25
|
+
await TestBed.configureTestingModule({ imports: [HostComponent] }).compileComponents();
|
|
26
|
+
fixture = TestBed.createComponent(HostComponent);
|
|
27
|
+
fixture.detectChanges();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
function select(): HTMLSelectElement {
|
|
31
|
+
return fixture.nativeElement.querySelector('select');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
it('wires native select semantics with hint and error', () => {
|
|
35
|
+
const label = fixture.nativeElement.querySelector('label');
|
|
36
|
+
const hint = fixture.nativeElement.querySelector('.semmet-select__hint');
|
|
37
|
+
const error = fixture.nativeElement.querySelector('.semmet-select__error');
|
|
38
|
+
|
|
39
|
+
expect(label.textContent).toContain('Area');
|
|
40
|
+
expect(label.getAttribute('for')).toBe(select().id);
|
|
41
|
+
expect(select().required).toBe(true);
|
|
42
|
+
expect(select().getAttribute('aria-invalid')).toBe('true');
|
|
43
|
+
expect(select().getAttribute('aria-describedby')).toContain(hint.id);
|
|
44
|
+
expect(select().getAttribute('aria-describedby')).toContain(error.id);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('updates the bound value on change', () => {
|
|
48
|
+
select().value = 'engineering';
|
|
49
|
+
select().dispatchEvent(new Event('change', { bubbles: true }));
|
|
50
|
+
fixture.detectChanges();
|
|
51
|
+
|
|
52
|
+
expect(fixture.componentInstance.area).toBe('engineering');
|
|
53
|
+
});
|
|
54
|
+
});
|
package/src/select/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.select = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.select = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.select = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/src/select/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,MAAM,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,MAAM,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/select/index.ts
CHANGED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
3
|
+
import { By } from '@angular/platform-browser';
|
|
4
|
+
|
|
5
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
6
|
+
|
|
7
|
+
@Component({
|
|
8
|
+
imports: [<%= classify(name) %>],
|
|
9
|
+
template: `<<%= selector %> />`,
|
|
10
|
+
})
|
|
11
|
+
class HostComponent {}
|
|
12
|
+
|
|
13
|
+
describe('<%= classify(name) %>', () => {
|
|
14
|
+
let fixture: ComponentFixture<HostComponent>;
|
|
15
|
+
let host: HTMLElement;
|
|
16
|
+
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
await TestBed.configureTestingModule({
|
|
19
|
+
imports: [HostComponent],
|
|
20
|
+
}).compileComponents();
|
|
21
|
+
|
|
22
|
+
fixture = TestBed.createComponent(HostComponent);
|
|
23
|
+
fixture.detectChanges();
|
|
24
|
+
host = fixture.nativeElement as HTMLElement;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('renders slider semantics with label and value bounds', () => {
|
|
28
|
+
const slider = host.querySelector<HTMLElement>('[role="slider"]');
|
|
29
|
+
|
|
30
|
+
expect(slider).toBeTruthy();
|
|
31
|
+
expect(slider?.getAttribute('aria-labelledby')).toBeTruthy();
|
|
32
|
+
expect(slider?.getAttribute('aria-valuemin')).toBe('0');
|
|
33
|
+
expect(slider?.getAttribute('aria-valuemax')).toBe('100');
|
|
34
|
+
expect(slider?.getAttribute('aria-valuenow')).toBe('50');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('updates value with keyboard commands and clamps to bounds', () => {
|
|
38
|
+
const sliderDebug = fixture.debugElement.query(By.css('[role="slider"]'));
|
|
39
|
+
const slider = sliderDebug.nativeElement as HTMLElement;
|
|
40
|
+
|
|
41
|
+
sliderDebug.triggerEventHandler('keydown', new KeyboardEvent('keydown', { key: 'ArrowRight' }));
|
|
42
|
+
fixture.detectChanges();
|
|
43
|
+
expect(slider.getAttribute('aria-valuenow')).toBe('51');
|
|
44
|
+
|
|
45
|
+
sliderDebug.triggerEventHandler('keydown', new KeyboardEvent('keydown', { key: 'PageDown' }));
|
|
46
|
+
fixture.detectChanges();
|
|
47
|
+
expect(slider.getAttribute('aria-valuenow')).toBe('41');
|
|
48
|
+
|
|
49
|
+
sliderDebug.triggerEventHandler('keydown', new KeyboardEvent('keydown', { key: 'Home' }));
|
|
50
|
+
fixture.detectChanges();
|
|
51
|
+
expect(slider.getAttribute('aria-valuenow')).toBe('0');
|
|
52
|
+
|
|
53
|
+
sliderDebug.triggerEventHandler('keydown', new KeyboardEvent('keydown', { key: 'ArrowLeft' }));
|
|
54
|
+
fixture.detectChanges();
|
|
55
|
+
expect(slider.getAttribute('aria-valuenow')).toBe('0');
|
|
56
|
+
|
|
57
|
+
sliderDebug.triggerEventHandler('keydown', new KeyboardEvent('keydown', { key: 'End' }));
|
|
58
|
+
fixture.detectChanges();
|
|
59
|
+
expect(slider.getAttribute('aria-valuenow')).toBe('100');
|
|
60
|
+
});
|
|
61
|
+
});
|
package/src/slider/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.slider = void 0;
|
|
4
4
|
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
-
exports.slider = (0, generate_component_1.createAriaComponentSchematic)();
|
|
5
|
+
exports.slider = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/src/slider/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,MAAM,GAAG,IAAA,iDAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,MAAM,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
package/src/slider/index.ts
CHANGED