@origostudio/origo-design 0.0.37 → 0.0.39

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.
Files changed (137) hide show
  1. package/CHANGELOG.md +3 -2
  2. package/dist/packages/angular-renderer/CHANGELOG.md +21 -0
  3. package/dist/packages/angular-renderer/package.json +7 -6
  4. package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.d.ts +2 -0
  5. package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.js +11 -0
  6. package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.js.map +1 -1
  7. package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.js.map +1 -1
  8. package/dist/packages/angular-renderer/src/components/primitives/chip/chip.component.js.map +1 -1
  9. package/dist/packages/angular-renderer/src/components/primitives/switch/switch.component.js.map +1 -1
  10. package/dist/packages/angular-renderer/src/devtools/devtools-bridge.js +2 -0
  11. package/dist/packages/angular-renderer/src/devtools/devtools-bridge.js.map +1 -1
  12. package/dist/packages/angular-renderer/src/index.d.ts +1 -0
  13. package/dist/packages/angular-renderer/src/index.js +1 -0
  14. package/dist/packages/angular-renderer/src/index.js.map +1 -1
  15. package/dist/packages/angular-renderer/src/lib/primitives.provider.js +26 -20
  16. package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
  17. package/dist/packages/cli/CHANGELOG.md +8 -0
  18. package/dist/packages/cli/package.json +2 -2
  19. package/dist/packages/cli/package.json.bak +2 -2
  20. package/dist/packages/core/CHANGELOG.md +14 -0
  21. package/dist/packages/core/package.json +2 -2
  22. package/dist/packages/core/package.json.bak +2 -2
  23. package/dist/packages/design-tokens/CHANGELOG.md +8 -0
  24. package/dist/packages/design-tokens/package.json +1 -1
  25. package/dist/packages/playground/browser/{chunk-iSLqhP12.js → chunk-B1z-uVFi.js} +1 -1
  26. package/dist/packages/playground/browser/{chunk-BxusNwwt.js → chunk-BGZXpmBQ.js} +1 -1
  27. package/dist/packages/playground/browser/{chunk-B0HlAWSR.js → chunk-ByrswSrM.js} +1 -1
  28. package/dist/packages/playground/browser/{chunk-rK1aqCb7.js → chunk-CFbPXTNr.js} +1 -1
  29. package/dist/packages/playground/browser/{chunk-Dd9ht4SU.js → chunk-CSecAR9q.js} +1 -1
  30. package/dist/packages/playground/browser/{chunk-BkTn1FbH.js → chunk-D-8Zr5zg.js} +1 -1
  31. package/dist/packages/playground/browser/{chunk-DbylCYBP.js → chunk-D2kcCG-o.js} +1 -1
  32. package/dist/packages/playground/browser/{chunk-zg5PqW0l.js → chunk-DQx5lQqG.js} +1 -1
  33. package/dist/packages/playground/browser/{chunk-DXxUFvGw.js → chunk-Dac2dp5T.js} +1 -1
  34. package/dist/packages/playground/browser/{chunk-CXHFI87Z.js → chunk-DiZkmwKl.js} +1 -1
  35. package/dist/packages/playground/browser/{chunk-BI1AmKI_.js → chunk-DwU-a89u.js} +1 -1
  36. package/dist/packages/playground/browser/{chunk-D2bm1B8y.js → chunk-JF8ksHJn.js} +1 -1
  37. package/dist/packages/playground/browser/{chunk-ZeGfaGFy.js → chunk-_TRKH8kG.js} +1 -1
  38. package/dist/packages/playground/browser/{chunk-DT7GQcHj.js → chunk-e5kB8V0v.js} +1 -1
  39. package/dist/packages/playground/browser/{chunk-94bHXqp1.js → chunk-zJLityDb.js} +1 -1
  40. package/dist/packages/playground/browser/index.html +1 -1
  41. package/dist/packages/playground/browser/main-33XWGVNC.js +731 -0
  42. package/eslint.config.js +2 -1
  43. package/generate_prompts.ps1 +10 -0
  44. package/package.json +3 -2
  45. package/packages/angular-renderer/CHANGELOG.md +21 -0
  46. package/packages/angular-renderer/package.json +7 -6
  47. package/packages/angular-renderer/playwright/.cache/assets/adapter-iYml3Kk6.js +121 -0
  48. package/packages/angular-renderer/playwright/.cache/assets/adapter-iYml3Kk6.js.map +1 -0
  49. package/packages/angular-renderer/playwright/.cache/assets/breadcrumbs.component-DqZwZwH1.js +200 -0
  50. package/packages/angular-renderer/playwright/.cache/assets/breadcrumbs.component-DqZwZwH1.js.map +1 -0
  51. package/packages/angular-renderer/playwright/.cache/assets/button.component-Dnc1mP3D.js +112 -0
  52. package/packages/angular-renderer/playwright/.cache/assets/button.component-Dnc1mP3D.js.map +1 -0
  53. package/packages/angular-renderer/playwright/.cache/assets/card.component-0WWaDbUV.js +180 -0
  54. package/packages/angular-renderer/playwright/.cache/assets/card.component-0WWaDbUV.js.map +1 -0
  55. package/packages/angular-renderer/playwright/.cache/assets/checkbox.component-JGpevUFG.js +150 -0
  56. package/packages/angular-renderer/playwright/.cache/assets/checkbox.component-JGpevUFG.js.map +1 -0
  57. package/packages/angular-renderer/playwright/.cache/assets/chip.component-DHGk3h8k.js +121 -0
  58. package/packages/angular-renderer/playwright/.cache/assets/chip.component-DHGk3h8k.js.map +1 -0
  59. package/packages/angular-renderer/playwright/.cache/assets/data-grid.component-DDZZ4enP.js +352 -0
  60. package/packages/angular-renderer/playwright/.cache/assets/data-grid.component-DDZZ4enP.js.map +1 -0
  61. package/packages/angular-renderer/playwright/.cache/assets/experience-adapter.service-CJxHLpWN.js +38 -0
  62. package/packages/angular-renderer/playwright/.cache/assets/experience-adapter.service-CJxHLpWN.js.map +1 -0
  63. package/packages/angular-renderer/playwright/.cache/assets/form-field.component-DZA0NfB7.js +184 -0
  64. package/packages/angular-renderer/playwright/.cache/assets/form-field.component-DZA0NfB7.js.map +1 -0
  65. package/packages/angular-renderer/playwright/.cache/assets/hbox.component-D5YHn6Vu.js +125 -0
  66. package/packages/angular-renderer/playwright/.cache/assets/hbox.component-D5YHn6Vu.js.map +1 -0
  67. package/packages/angular-renderer/playwright/.cache/assets/index-DRoHZv2r.js +92806 -0
  68. package/packages/angular-renderer/playwright/.cache/assets/index-DRoHZv2r.js.map +1 -0
  69. package/packages/angular-renderer/playwright/.cache/assets/label.component-DDKtYvrS.js +105 -0
  70. package/packages/angular-renderer/playwright/.cache/assets/label.component-DDKtYvrS.js.map +1 -0
  71. package/packages/angular-renderer/playwright/.cache/assets/list.component-DSP5wzI4.js +195 -0
  72. package/packages/angular-renderer/playwright/.cache/assets/list.component-DSP5wzI4.js.map +1 -0
  73. package/packages/angular-renderer/playwright/.cache/assets/radio-group.component-BzVciXZu.js +171 -0
  74. package/packages/angular-renderer/playwright/.cache/assets/radio-group.component-BzVciXZu.js.map +1 -0
  75. package/packages/angular-renderer/playwright/.cache/assets/select.component-BC_aoLNt.js +180 -0
  76. package/packages/angular-renderer/playwright/.cache/assets/select.component-BC_aoLNt.js.map +1 -0
  77. package/packages/angular-renderer/playwright/.cache/assets/sidebar.component-CY_vKSCu.js +217 -0
  78. package/packages/angular-renderer/playwright/.cache/assets/sidebar.component-CY_vKSCu.js.map +1 -0
  79. package/packages/angular-renderer/playwright/.cache/assets/switch.component-BtfhJxLp.js +144 -0
  80. package/packages/angular-renderer/playwright/.cache/assets/switch.component-BtfhJxLp.js.map +1 -0
  81. package/packages/angular-renderer/playwright/.cache/assets/tabs.component-DGcKkhH_.js +218 -0
  82. package/packages/angular-renderer/playwright/.cache/assets/tabs.component-DGcKkhH_.js.map +1 -0
  83. package/packages/angular-renderer/playwright/.cache/assets/text-input.component-IyHHKpW-.js +121 -0
  84. package/packages/angular-renderer/playwright/.cache/assets/text-input.component-IyHHKpW-.js.map +1 -0
  85. package/packages/angular-renderer/playwright/.cache/assets/textarea.component-Bpvh81yV.js +141 -0
  86. package/packages/angular-renderer/playwright/.cache/assets/textarea.component-Bpvh81yV.js.map +1 -0
  87. package/packages/angular-renderer/playwright/.cache/assets/vbox.component-DRe59FUF.js +127 -0
  88. package/packages/angular-renderer/playwright/.cache/assets/vbox.component-DRe59FUF.js.map +1 -0
  89. package/packages/angular-renderer/playwright/.cache/index.html +11 -0
  90. package/packages/angular-renderer/playwright/.cache/metainfo.json +5416 -0
  91. package/packages/angular-renderer/playwright/index.html +11 -0
  92. package/packages/angular-renderer/playwright/index.ts +1 -0
  93. package/packages/angular-renderer/playwright-ct.config.ts +13 -3
  94. package/packages/angular-renderer/src/adapters/web/experience-adapter.service.ts +15 -1
  95. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.pw.ts +37 -0
  96. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.ts +0 -1
  97. package/packages/angular-renderer/src/components/primitives/button/button.component.pw.ts +17 -4
  98. package/packages/angular-renderer/src/components/primitives/card/card.component.pw.ts +32 -0
  99. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.pw.ts +38 -0
  100. package/packages/angular-renderer/src/components/primitives/chip/chip.component.pw.ts +56 -0
  101. package/packages/angular-renderer/src/components/primitives/chip/chip.component.ts +1 -1
  102. package/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.pw.ts +37 -0
  103. package/packages/angular-renderer/src/components/primitives/form-field/form-field.component.pw.ts +38 -0
  104. package/packages/angular-renderer/src/components/primitives/hbox/hbox.component.pw.ts +32 -0
  105. package/packages/angular-renderer/src/components/primitives/label/label.component.pw.ts +32 -0
  106. package/packages/angular-renderer/src/components/primitives/list/list.component.pw.ts +37 -0
  107. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.pw.ts +38 -0
  108. package/packages/angular-renderer/src/components/primitives/select/select.component.pw.ts +32 -0
  109. package/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.pw.ts +37 -0
  110. package/packages/angular-renderer/src/components/primitives/switch/switch.component.pw.ts +62 -0
  111. package/packages/angular-renderer/src/components/primitives/switch/switch.component.ts +1 -1
  112. package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.pw.ts +37 -0
  113. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.pw.ts +16 -7
  114. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.pw.ts +38 -0
  115. package/packages/angular-renderer/src/components/primitives/vbox/vbox.component.pw.ts +17 -4
  116. package/packages/angular-renderer/src/devtools/devtools-bridge.ts +2 -0
  117. package/packages/angular-renderer/src/index.ts +1 -0
  118. package/packages/angular-renderer/src/lib/primitives.provider.ts +29 -21
  119. package/packages/cli/CHANGELOG.md +8 -0
  120. package/packages/cli/package.json +2 -2
  121. package/packages/core/CHANGELOG.md +14 -0
  122. package/packages/core/package.json +2 -2
  123. package/packages/design-tokens/CHANGELOG.md +8 -0
  124. package/packages/design-tokens/package.json +1 -1
  125. package/packages/devtools/CHANGELOG.md +8 -0
  126. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
  127. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  128. package/packages/devtools/package.json +1 -1
  129. package/packages/playground/CHANGELOG.md +14 -0
  130. package/packages/playground/netlify.toml +6 -0
  131. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
  132. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  133. package/packages/playground/package.json +3 -3
  134. package/packages/playground/src/app/app.config.ts +6 -1
  135. package/packages/playground/src/preview/preview-root.component.ts +173 -12
  136. package/dist/packages/playground/browser/main-BBGOLU74.js +0 -711
  137. package/packages/angular-renderer/src/components/primitives/primitives.a11y.pw.ts +0 -382
@@ -0,0 +1,11 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Playwright Component Test</title>
6
+ </head>
7
+ <body>
8
+ <div id="root"></div>
9
+ <script type="module" src="./index.ts"></script>
10
+ </body>
11
+ </html>
@@ -0,0 +1 @@
1
+ import 'zone.js';
@@ -1,16 +1,26 @@
1
- import { defineConfig, devices } from '@playwright/experimental-ct-angular';
1
+ import { resolve } from 'path';
2
+ import angular from '@analogjs/vite-plugin-angular';
3
+ import { defineConfig, devices } from '@jscutlery/playwright-ct-angular';
4
+
5
+ const tsconfigPath = resolve(__dirname, 'tsconfig.pw.json');
6
+ if (!require('fs').existsSync(tsconfigPath)) {
7
+ throw new Error('tsconfig.pw.json not found at ' + tsconfigPath);
8
+ }
2
9
 
3
10
  export default defineConfig({
4
11
  testDir: './src',
5
12
  testMatch: /.*\.pw\.ts/,
6
13
  snapshotDir: './__snapshots__',
7
- timeout: 10 * 1000,
8
- fullyParallel: true,
14
+ timeout: 30 * 1000,
15
+ fullyParallel: !process.env['CI'],
9
16
  forbidOnly: !!process.env['CI'],
10
17
  retries: process.env['CI'] ? 2 : 0,
11
18
  workers: process.env['CI'] ? 1 : undefined,
12
19
  reporter: 'html',
13
20
  use: {
21
+ ctViteConfig: {
22
+ plugins: [angular({ tsconfig: tsconfigPath })],
23
+ },
14
24
  trace: 'on-first-retry',
15
25
  ctPort: 3100,
16
26
  },
@@ -1,7 +1,13 @@
1
- import { Injectable } from '@angular/core';
1
+ import { Injectable, signal } from '@angular/core';
2
2
 
3
3
  @Injectable({ providedIn: 'root' })
4
4
  export class WebExperienceAdapterService {
5
+ private _state = signal<Record<string, Record<string, unknown>>>({});
6
+
7
+ getState(nodeId: string, property: string): unknown {
8
+ return this._state()[nodeId]?.[property];
9
+ }
10
+
5
11
  dispatchCapability(nodeId: string, actionName: string, payload?: unknown): void {
6
12
  // In Phase 1, this provides the stateless translation boundary (AD-15).
7
13
  // Real dispatching logic to the core BADL engine would be wired here.
@@ -17,5 +23,13 @@ export class WebExperienceAdapterService {
17
23
  `[ExperienceAdapter] Updated state for node '${nodeId}', property '${property}'`,
18
24
  value
19
25
  );
26
+
27
+ this._state.update(state => ({
28
+ ...state,
29
+ [nodeId]: {
30
+ ...state[nodeId],
31
+ [property]: value,
32
+ },
33
+ }));
20
34
  }
21
35
  }
@@ -0,0 +1,37 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { BreadcrumbsComponent, BreadcrumbsProps } from './breadcrumbs.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('BreadcrumbsComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(BreadcrumbsComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'breadcrumbs',
16
+ props: {
17
+ columns: [{ key: 'name', label: 'Name' }],
18
+ rows: [{ name: 'Test' }],
19
+ items: [{ label: 'Item 1', id: '1', href: '/' }],
20
+ tabs: [{ label: 'Tab 1', id: 'tab-1' }],
21
+ },
22
+ } as InteractionContract<BreadcrumbsProps>,
23
+ },
24
+ });
25
+
26
+ const accessibilityScanResults = await new AxeBuilder({ page })
27
+ .disableRules([
28
+ 'document-title',
29
+ 'html-has-lang',
30
+ 'landmark-one-main',
31
+ 'page-has-heading-one',
32
+ 'region',
33
+ ])
34
+ .analyze();
35
+ expect(accessibilityScanResults.violations).toEqual([]);
36
+ });
37
+ });
@@ -5,7 +5,6 @@ import {
5
5
  computed,
6
6
  ViewEncapsulation,
7
7
  inject,
8
- SecurityContext,
9
8
  } from '@angular/core';
10
9
  import { DomSanitizer } from '@angular/platform-browser';
11
10
  import { InteractionContract } from '@origo/core';
@@ -1,5 +1,6 @@
1
- import { test, expect } from '@playwright/experimental-ct-angular';
2
- import { ButtonComponent } from './button.component';
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { ButtonComponent, ButtonProps } from './button.component';
3
+ import { InteractionContract } from '@origo/core';
3
4
  import AxeBuilder from '@axe-core/playwright';
4
5
 
5
6
  test.describe('ButtonComponent Accessibility', () => {
@@ -9,11 +10,23 @@ test.describe('ButtonComponent Accessibility', () => {
9
10
  }) => {
10
11
  await mount(ButtonComponent, {
11
12
  props: {
12
- contract: { id: '3', type: 'button', props: { label: 'Submit' } } as never,
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'button',
16
+ props: { label: 'Submit' },
17
+ } as InteractionContract<ButtonProps>,
13
18
  },
14
19
  });
15
20
 
16
- const accessibilityScanResults = await new AxeBuilder({ page }).analyze();
21
+ const accessibilityScanResults = await new AxeBuilder({ page })
22
+ .disableRules([
23
+ 'document-title',
24
+ 'html-has-lang',
25
+ 'landmark-one-main',
26
+ 'page-has-heading-one',
27
+ 'region',
28
+ ])
29
+ .analyze();
17
30
  expect(accessibilityScanResults.violations).toEqual([]);
18
31
  });
19
32
  });
@@ -0,0 +1,32 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { CardComponent, CardProps } from './card.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('CardComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(CardComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'card',
16
+ props: {},
17
+ } as InteractionContract<CardProps>,
18
+ },
19
+ });
20
+
21
+ const accessibilityScanResults = await new AxeBuilder({ page })
22
+ .disableRules([
23
+ 'document-title',
24
+ 'html-has-lang',
25
+ 'landmark-one-main',
26
+ 'page-has-heading-one',
27
+ 'region',
28
+ ])
29
+ .analyze();
30
+ expect(accessibilityScanResults.violations).toEqual([]);
31
+ });
32
+ });
@@ -0,0 +1,38 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { CheckboxComponent, CheckboxProps } from './checkbox.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('CheckboxComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(CheckboxComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'checkbox',
16
+ props: {
17
+ label: 'Test Label',
18
+ placeholder: 'Test',
19
+ 'aria-label': 'Test',
20
+ options: [{ label: 'Option 1', value: '1' }],
21
+ items: [{ label: 'Item 1' }],
22
+ },
23
+ } as InteractionContract<CheckboxProps>,
24
+ },
25
+ });
26
+
27
+ const accessibilityScanResults = await new AxeBuilder({ page })
28
+ .disableRules([
29
+ 'document-title',
30
+ 'html-has-lang',
31
+ 'landmark-one-main',
32
+ 'page-has-heading-one',
33
+ 'region',
34
+ ])
35
+ .analyze();
36
+ expect(accessibilityScanResults.violations).toEqual([]);
37
+ });
38
+ });
@@ -0,0 +1,56 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { ChipComponent, ChipProps } from './chip.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('ChipComponent Accessibility', () => {
7
+ test('should be accessible (default)', async ({ mount, page }) => {
8
+ await mount(ChipComponent, {
9
+ props: {
10
+ contract: {
11
+ id: 'test-id',
12
+ type: 'chip',
13
+ props: { label: 'Submit' },
14
+ } as InteractionContract<ChipProps>,
15
+ },
16
+ });
17
+
18
+ const accessibilityScanResults = await new AxeBuilder({ page })
19
+ .disableRules([
20
+ 'document-title',
21
+ 'html-has-lang',
22
+ 'landmark-one-main',
23
+ 'page-has-heading-one',
24
+ 'region',
25
+ ])
26
+ .analyze();
27
+ expect(accessibilityScanResults.violations).toEqual([]);
28
+ });
29
+ });
30
+
31
+ test('Chip selected state accessibility', async ({ mount, page }) => {
32
+ await mount(ChipComponent, {
33
+ props: {
34
+ contract: {
35
+ id: 'test-id',
36
+ type: 'chip',
37
+ props: { selected: true, label: 'Test' },
38
+ } as InteractionContract<ChipProps>,
39
+ },
40
+ });
41
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze();
42
+ expect(accessibilityScanResults.violations).toEqual([]);
43
+ });
44
+ test('Chip disabled state accessibility', async ({ mount, page }) => {
45
+ await mount(ChipComponent, {
46
+ props: {
47
+ contract: {
48
+ id: 'test-id',
49
+ type: 'chip',
50
+ props: { disabled: true, label: 'Test' },
51
+ } as InteractionContract<ChipProps>,
52
+ },
53
+ });
54
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze();
55
+ expect(accessibilityScanResults.violations).toEqual([]);
56
+ });
@@ -64,7 +64,7 @@ export class ChipComponent implements OrigoAdapter<ChipProps> {
64
64
  effect(() => {
65
65
  const props = this.contract().props;
66
66
  const coerced = props
67
- ? coerceContractProps<Record<string, any>>(props, ChipComponent.contractSchema)
67
+ ? coerceContractProps<Record<string, unknown>>(props, ChipComponent.contractSchema)
68
68
  : {};
69
69
  const contractVal =
70
70
  coerced['selected'] !== undefined ? !!coerced['selected'] : this.selected();
@@ -0,0 +1,37 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { DataGridComponent, DataGridProps } from './data-grid.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('DataGridComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(DataGridComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'dataGrid',
16
+ props: {
17
+ columns: [{ key: 'name', label: 'Name' }],
18
+ rows: [{ name: 'Test' }],
19
+ items: [{ label: 'Item 1', id: '1', href: '/' }],
20
+ tabs: [{ label: 'Tab 1', id: 'tab-1' }],
21
+ },
22
+ } as InteractionContract<DataGridProps>,
23
+ },
24
+ });
25
+
26
+ const accessibilityScanResults = await new AxeBuilder({ page })
27
+ .disableRules([
28
+ 'document-title',
29
+ 'html-has-lang',
30
+ 'landmark-one-main',
31
+ 'page-has-heading-one',
32
+ 'region',
33
+ ])
34
+ .analyze();
35
+ expect(accessibilityScanResults.violations).toEqual([]);
36
+ });
37
+ });
@@ -0,0 +1,38 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { FormFieldComponent, FormFieldProps } from './form-field.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('FormFieldComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(FormFieldComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'formField',
16
+ props: {
17
+ label: 'Test Label',
18
+ placeholder: 'Test',
19
+ 'aria-label': 'Test',
20
+ options: [{ label: 'Option 1', value: '1' }],
21
+ items: [{ label: 'Item 1' }],
22
+ },
23
+ } as InteractionContract<FormFieldProps>,
24
+ },
25
+ });
26
+
27
+ const accessibilityScanResults = await new AxeBuilder({ page })
28
+ .disableRules([
29
+ 'document-title',
30
+ 'html-has-lang',
31
+ 'landmark-one-main',
32
+ 'page-has-heading-one',
33
+ 'region',
34
+ ])
35
+ .analyze();
36
+ expect(accessibilityScanResults.violations).toEqual([]);
37
+ });
38
+ });
@@ -0,0 +1,32 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { HBoxComponent, HBoxProps } from './hbox.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('HBoxComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(HBoxComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'hbox',
16
+ props: {},
17
+ } as InteractionContract<HBoxProps>,
18
+ },
19
+ });
20
+
21
+ const accessibilityScanResults = await new AxeBuilder({ page })
22
+ .disableRules([
23
+ 'document-title',
24
+ 'html-has-lang',
25
+ 'landmark-one-main',
26
+ 'page-has-heading-one',
27
+ 'region',
28
+ ])
29
+ .analyze();
30
+ expect(accessibilityScanResults.violations).toEqual([]);
31
+ });
32
+ });
@@ -0,0 +1,32 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { LabelComponent, LabelProps } from './label.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('LabelComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(LabelComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'label',
16
+ props: {},
17
+ } as InteractionContract<LabelProps>,
18
+ },
19
+ });
20
+
21
+ const accessibilityScanResults = await new AxeBuilder({ page })
22
+ .disableRules([
23
+ 'document-title',
24
+ 'html-has-lang',
25
+ 'landmark-one-main',
26
+ 'page-has-heading-one',
27
+ 'region',
28
+ ])
29
+ .analyze();
30
+ expect(accessibilityScanResults.violations).toEqual([]);
31
+ });
32
+ });
@@ -0,0 +1,37 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { ListComponent, ListProps } from './list.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('ListComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(ListComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'list',
16
+ props: {
17
+ columns: [{ key: 'name', label: 'Name' }],
18
+ rows: [{ name: 'Test' }],
19
+ items: [{ label: 'Item 1', id: '1', href: '/' }],
20
+ tabs: [{ label: 'Tab 1', id: 'tab-1' }],
21
+ },
22
+ } as InteractionContract<ListProps>,
23
+ },
24
+ });
25
+
26
+ const accessibilityScanResults = await new AxeBuilder({ page })
27
+ .disableRules([
28
+ 'document-title',
29
+ 'html-has-lang',
30
+ 'landmark-one-main',
31
+ 'page-has-heading-one',
32
+ 'region',
33
+ ])
34
+ .analyze();
35
+ expect(accessibilityScanResults.violations).toEqual([]);
36
+ });
37
+ });
@@ -0,0 +1,38 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { RadioGroupComponent, RadioGroupProps } from './radio-group.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('RadioGroupComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(RadioGroupComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'radioGroup',
16
+ props: {
17
+ label: 'Test Label',
18
+ placeholder: 'Test',
19
+ 'aria-label': 'Test',
20
+ options: [{ label: 'Option 1', value: '1' }],
21
+ items: [{ label: 'Item 1' }],
22
+ },
23
+ } as InteractionContract<RadioGroupProps>,
24
+ },
25
+ });
26
+
27
+ const accessibilityScanResults = await new AxeBuilder({ page })
28
+ .disableRules([
29
+ 'document-title',
30
+ 'html-has-lang',
31
+ 'landmark-one-main',
32
+ 'page-has-heading-one',
33
+ 'region',
34
+ ])
35
+ .analyze();
36
+ expect(accessibilityScanResults.violations).toEqual([]);
37
+ });
38
+ });
@@ -0,0 +1,32 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { SelectComponent, SelectProps } from './select.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('SelectComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(SelectComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'select',
16
+ props: { options: [{ label: 'Opt 1', value: '1' }] },
17
+ } as InteractionContract<SelectProps>,
18
+ },
19
+ });
20
+
21
+ const accessibilityScanResults = await new AxeBuilder({ page })
22
+ .disableRules([
23
+ 'document-title',
24
+ 'html-has-lang',
25
+ 'landmark-one-main',
26
+ 'page-has-heading-one',
27
+ 'region',
28
+ ])
29
+ .analyze();
30
+ expect(accessibilityScanResults.violations).toEqual([]);
31
+ });
32
+ });
@@ -0,0 +1,37 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { SidebarComponent, SidebarProps } from './sidebar.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('SidebarComponent Accessibility', () => {
7
+ test('should not have any automatically detectable accessibility issues', async ({
8
+ mount,
9
+ page,
10
+ }) => {
11
+ await mount(SidebarComponent, {
12
+ props: {
13
+ contract: {
14
+ id: 'test-id',
15
+ type: 'sidebar',
16
+ props: {
17
+ columns: [{ key: 'name', label: 'Name' }],
18
+ rows: [{ name: 'Test' }],
19
+ items: [{ label: 'Item 1', id: '1', href: '/' }],
20
+ tabs: [{ label: 'Tab 1', id: 'tab-1' }],
21
+ },
22
+ } as InteractionContract<SidebarProps>,
23
+ },
24
+ });
25
+
26
+ const accessibilityScanResults = await new AxeBuilder({ page })
27
+ .disableRules([
28
+ 'document-title',
29
+ 'html-has-lang',
30
+ 'landmark-one-main',
31
+ 'page-has-heading-one',
32
+ 'region',
33
+ ])
34
+ .analyze();
35
+ expect(accessibilityScanResults.violations).toEqual([]);
36
+ });
37
+ });
@@ -0,0 +1,62 @@
1
+ import { test, expect } from '@jscutlery/playwright-ct-angular';
2
+ import { SwitchComponent, SwitchProps } from './switch.component';
3
+ import { InteractionContract } from '@origo/core';
4
+ import AxeBuilder from '@axe-core/playwright';
5
+
6
+ test.describe('SwitchComponent Accessibility', () => {
7
+ test('should be accessible (default)', async ({ mount, page }) => {
8
+ await mount(SwitchComponent, {
9
+ props: {
10
+ contract: {
11
+ id: 'test-id',
12
+ type: 'switch',
13
+ props: {
14
+ label: 'Test Label',
15
+ placeholder: 'Test',
16
+ 'aria-label': 'Test',
17
+ options: [{ label: 'Option 1', value: '1' }],
18
+ items: [{ label: 'Item 1' }],
19
+ },
20
+ } as InteractionContract<SwitchProps>,
21
+ },
22
+ });
23
+
24
+ const accessibilityScanResults = await new AxeBuilder({ page })
25
+ .disableRules([
26
+ 'document-title',
27
+ 'html-has-lang',
28
+ 'landmark-one-main',
29
+ 'page-has-heading-one',
30
+ 'region',
31
+ ])
32
+ .analyze();
33
+ expect(accessibilityScanResults.violations).toEqual([]);
34
+ });
35
+ });
36
+
37
+ test('Switch checked state accessibility', async ({ mount, page }) => {
38
+ await mount(SwitchComponent, {
39
+ props: {
40
+ contract: {
41
+ id: 'test-id',
42
+ type: 'switch',
43
+ props: { checked: true, label: 'Test' },
44
+ } as InteractionContract<SwitchProps>,
45
+ },
46
+ });
47
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze();
48
+ expect(accessibilityScanResults.violations).toEqual([]);
49
+ });
50
+ test('Switch disabled state accessibility', async ({ mount, page }) => {
51
+ await mount(SwitchComponent, {
52
+ props: {
53
+ contract: {
54
+ id: 'test-id',
55
+ type: 'switch',
56
+ props: { disabled: true, label: 'Test' },
57
+ } as InteractionContract<SwitchProps>,
58
+ },
59
+ });
60
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze();
61
+ expect(accessibilityScanResults.violations).toEqual([]);
62
+ });
@@ -64,7 +64,7 @@ export class SwitchComponent implements OrigoAdapter<SwitchProps> {
64
64
  effect(() => {
65
65
  const props = this.contract().props;
66
66
  const coerced = props
67
- ? coerceContractProps<Record<string, any>>(props, SwitchComponent.contractSchema)
67
+ ? coerceContractProps<Record<string, unknown>>(props, SwitchComponent.contractSchema)
68
68
  : {};
69
69
  const contractVal = coerced['checked'] !== undefined ? !!coerced['checked'] : this.checked();
70
70
  untracked(() => {