ng-comps 1.0.2 → 2.0.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.
Files changed (197) hide show
  1. package/fesm2022/ng-comps.mjs +4254 -0
  2. package/package.json +54 -58
  3. package/src/styles.css +54 -0
  4. package/types/ng-comps.d.ts +1348 -0
  5. package/.editorconfig +0 -17
  6. package/.github/copilot-instructions.md +0 -55
  7. package/.github/workflows/ci.yml +0 -29
  8. package/.prettierrc +0 -12
  9. package/.storybook/main.ts +0 -21
  10. package/.storybook/preview.ts +0 -27
  11. package/.storybook/tsconfig.doc.json +0 -10
  12. package/.storybook/tsconfig.json +0 -15
  13. package/.storybook/typings.d.ts +0 -4
  14. package/.vscode/extensions.json +0 -4
  15. package/.vscode/launch.json +0 -20
  16. package/.vscode/mcp.json +0 -9
  17. package/.vscode/tasks.json +0 -42
  18. package/ACCESSIBILITY.md +0 -127
  19. package/angular.json +0 -106
  20. package/documentation.json +0 -13394
  21. package/ng-package.json +0 -27
  22. package/public/favicon.ico +0 -0
  23. package/scripts/prepare-package.mjs +0 -80
  24. package/src/app/a11y/accessibility.utils.ts +0 -35
  25. package/src/app/a11y/index.ts +0 -6
  26. package/src/app/accessibility/ng-comps.a11y.spec.ts +0 -108
  27. package/src/app/app.config.ts +0 -11
  28. package/src/app/app.css +0 -107
  29. package/src/app/app.html +0 -48
  30. package/src/app/app.routes.ts +0 -3
  31. package/src/app/app.spec.ts +0 -23
  32. package/src/app/app.ts +0 -10
  33. package/src/app/components/accordion/index.ts +0 -2
  34. package/src/app/components/accordion/mf-accordion.component.css +0 -38
  35. package/src/app/components/accordion/mf-accordion.component.spec.ts +0 -48
  36. package/src/app/components/accordion/mf-accordion.component.ts +0 -53
  37. package/src/app/components/alert/index.ts +0 -2
  38. package/src/app/components/alert/mf-alert.component.css +0 -100
  39. package/src/app/components/alert/mf-alert.component.spec.ts +0 -59
  40. package/src/app/components/alert/mf-alert.component.ts +0 -68
  41. package/src/app/components/autocomplete/index.ts +0 -5
  42. package/src/app/components/autocomplete/mf-autocomplete.component.css +0 -105
  43. package/src/app/components/autocomplete/mf-autocomplete.component.spec.ts +0 -116
  44. package/src/app/components/autocomplete/mf-autocomplete.component.ts +0 -307
  45. package/src/app/components/avatar/index.ts +0 -2
  46. package/src/app/components/avatar/mf-avatar.component.css +0 -27
  47. package/src/app/components/avatar/mf-avatar.component.spec.ts +0 -49
  48. package/src/app/components/avatar/mf-avatar.component.ts +0 -99
  49. package/src/app/components/badge/index.ts +0 -2
  50. package/src/app/components/badge/mf-badge.component.css +0 -32
  51. package/src/app/components/badge/mf-badge.component.spec.ts +0 -40
  52. package/src/app/components/badge/mf-badge.component.ts +0 -105
  53. package/src/app/components/breadcrumb/index.ts +0 -2
  54. package/src/app/components/breadcrumb/mf-breadcrumb.component.css +0 -61
  55. package/src/app/components/breadcrumb/mf-breadcrumb.component.spec.ts +0 -61
  56. package/src/app/components/breadcrumb/mf-breadcrumb.component.ts +0 -75
  57. package/src/app/components/button/index.ts +0 -2
  58. package/src/app/components/button/mf-button.component.css +0 -136
  59. package/src/app/components/button/mf-button.component.ts +0 -174
  60. package/src/app/components/card/index.ts +0 -2
  61. package/src/app/components/card/mf-card.component.css +0 -82
  62. package/src/app/components/card/mf-card.component.ts +0 -59
  63. package/src/app/components/checkbox/index.ts +0 -1
  64. package/src/app/components/checkbox/mf-checkbox.component.css +0 -75
  65. package/src/app/components/checkbox/mf-checkbox.component.ts +0 -187
  66. package/src/app/components/chip/index.ts +0 -2
  67. package/src/app/components/chip/mf-chip.component.css +0 -69
  68. package/src/app/components/chip/mf-chip.component.spec.ts +0 -47
  69. package/src/app/components/chip/mf-chip.component.ts +0 -77
  70. package/src/app/components/datepicker/index.ts +0 -2
  71. package/src/app/components/datepicker/mf-datepicker.component.css +0 -102
  72. package/src/app/components/datepicker/mf-datepicker.component.spec.ts +0 -69
  73. package/src/app/components/datepicker/mf-datepicker.component.ts +0 -233
  74. package/src/app/components/dialog/index.ts +0 -3
  75. package/src/app/components/dialog/mf-dialog.component.css +0 -73
  76. package/src/app/components/dialog/mf-dialog.component.ts +0 -160
  77. package/src/app/components/dialog/mf-dialog.service.spec.ts +0 -61
  78. package/src/app/components/dialog/mf-dialog.service.ts +0 -52
  79. package/src/app/components/divider/index.ts +0 -2
  80. package/src/app/components/divider/mf-divider.component.css +0 -38
  81. package/src/app/components/divider/mf-divider.component.spec.ts +0 -40
  82. package/src/app/components/divider/mf-divider.component.ts +0 -44
  83. package/src/app/components/form-field/index.ts +0 -1
  84. package/src/app/components/form-field/mf-form-field.component.css +0 -51
  85. package/src/app/components/form-field/mf-form-field.component.ts +0 -74
  86. package/src/app/components/grid-list/index.ts +0 -2
  87. package/src/app/components/grid-list/mf-grid-list.component.css +0 -47
  88. package/src/app/components/grid-list/mf-grid-list.component.spec.ts +0 -57
  89. package/src/app/components/grid-list/mf-grid-list.component.ts +0 -68
  90. package/src/app/components/icon/index.ts +0 -2
  91. package/src/app/components/icon/mf-icon.component.css +0 -56
  92. package/src/app/components/icon/mf-icon.component.ts +0 -41
  93. package/src/app/components/input/index.ts +0 -2
  94. package/src/app/components/input/mf-input.component.css +0 -105
  95. package/src/app/components/input/mf-input.component.ts +0 -217
  96. package/src/app/components/menu/index.ts +0 -2
  97. package/src/app/components/menu/mf-menu.component.css +0 -31
  98. package/src/app/components/menu/mf-menu.component.spec.ts +0 -49
  99. package/src/app/components/menu/mf-menu.component.ts +0 -66
  100. package/src/app/components/paginator/index.ts +0 -1
  101. package/src/app/components/paginator/mf-paginator.component.css +0 -32
  102. package/src/app/components/paginator/mf-paginator.component.spec.ts +0 -44
  103. package/src/app/components/paginator/mf-paginator.component.ts +0 -52
  104. package/src/app/components/progress-bar/index.ts +0 -2
  105. package/src/app/components/progress-bar/mf-progress-bar.component.css +0 -53
  106. package/src/app/components/progress-bar/mf-progress-bar.component.spec.ts +0 -65
  107. package/src/app/components/progress-bar/mf-progress-bar.component.ts +0 -79
  108. package/src/app/components/progress-spinner/index.ts +0 -2
  109. package/src/app/components/progress-spinner/mf-progress-spinner.component.css +0 -38
  110. package/src/app/components/progress-spinner/mf-progress-spinner.component.spec.ts +0 -59
  111. package/src/app/components/progress-spinner/mf-progress-spinner.component.ts +0 -81
  112. package/src/app/components/radio-button/index.ts +0 -2
  113. package/src/app/components/radio-button/mf-radio-button.component.css +0 -86
  114. package/src/app/components/radio-button/mf-radio-button.component.spec.ts +0 -55
  115. package/src/app/components/radio-button/mf-radio-button.component.ts +0 -219
  116. package/src/app/components/select/index.ts +0 -2
  117. package/src/app/components/select/mf-select.component.css +0 -121
  118. package/src/app/components/select/mf-select.component.spec.ts +0 -108
  119. package/src/app/components/select/mf-select.component.ts +0 -252
  120. package/src/app/components/sidenav/index.ts +0 -2
  121. package/src/app/components/sidenav/mf-sidenav.component.css +0 -168
  122. package/src/app/components/sidenav/mf-sidenav.component.spec.ts +0 -57
  123. package/src/app/components/sidenav/mf-sidenav.component.ts +0 -126
  124. package/src/app/components/slide-toggle/index.ts +0 -1
  125. package/src/app/components/slide-toggle/mf-slide-toggle.component.css +0 -42
  126. package/src/app/components/slide-toggle/mf-slide-toggle.component.spec.ts +0 -43
  127. package/src/app/components/slide-toggle/mf-slide-toggle.component.ts +0 -188
  128. package/src/app/components/snackbar/index.ts +0 -2
  129. package/src/app/components/snackbar/mf-snackbar.service.css +0 -31
  130. package/src/app/components/snackbar/mf-snackbar.service.spec.ts +0 -81
  131. package/src/app/components/snackbar/mf-snackbar.service.ts +0 -77
  132. package/src/app/components/table/index.ts +0 -2
  133. package/src/app/components/table/mf-table.component.css +0 -68
  134. package/src/app/components/table/mf-table.component.spec.ts +0 -76
  135. package/src/app/components/table/mf-table.component.ts +0 -117
  136. package/src/app/components/tabs/index.ts +0 -2
  137. package/src/app/components/tabs/mf-tabs.component.css +0 -31
  138. package/src/app/components/tabs/mf-tabs.component.spec.ts +0 -50
  139. package/src/app/components/tabs/mf-tabs.component.ts +0 -62
  140. package/src/app/components/textarea/index.ts +0 -2
  141. package/src/app/components/textarea/mf-textarea.component.css +0 -48
  142. package/src/app/components/textarea/mf-textarea.component.spec.ts +0 -55
  143. package/src/app/components/textarea/mf-textarea.component.ts +0 -227
  144. package/src/app/components/toolbar/index.ts +0 -2
  145. package/src/app/components/toolbar/mf-toolbar.component.css +0 -77
  146. package/src/app/components/toolbar/mf-toolbar.component.ts +0 -56
  147. package/src/app/components/tooltip/index.ts +0 -3
  148. package/src/app/components/tooltip/mf-tooltip.component.css +0 -7
  149. package/src/app/components/tooltip/mf-tooltip.component.spec.ts +0 -37
  150. package/src/app/components/tooltip/mf-tooltip.component.ts +0 -47
  151. package/src/app/components/tooltip/mf-tooltip.directive.ts +0 -22
  152. package/src/index.html +0 -18
  153. package/src/main.ts +0 -6
  154. package/src/public-api.ts +0 -31
  155. package/src/stories/About.mdx +0 -72
  156. package/src/stories/Accessibility.mdx +0 -59
  157. package/src/stories/Welcome.mdx +0 -26
  158. package/src/stories/assets/accessibility.png +0 -0
  159. package/src/stories/assets/accessibility.svg +0 -1
  160. package/src/stories/assets/addon-library.png +0 -0
  161. package/src/stories/assets/assets.png +0 -0
  162. package/src/stories/assets/avif-test-image.avif +0 -0
  163. package/src/stories/assets/context.png +0 -0
  164. package/src/stories/assets/discord.svg +0 -1
  165. package/src/stories/assets/docs.png +0 -0
  166. package/src/stories/assets/figma-plugin.png +0 -0
  167. package/src/stories/assets/github.svg +0 -1
  168. package/src/stories/assets/share.png +0 -0
  169. package/src/stories/assets/styling.png +0 -0
  170. package/src/stories/assets/testing.png +0 -0
  171. package/src/stories/assets/theming.png +0 -0
  172. package/src/stories/assets/tutorials.svg +0 -1
  173. package/src/stories/assets/youtube.svg +0 -1
  174. package/src/stories/mf-a11y-contracts.stories.ts +0 -472
  175. package/src/stories/mf-autocomplete.stories.ts +0 -194
  176. package/src/stories/mf-button.stories.ts +0 -152
  177. package/src/stories/mf-card.stories.ts +0 -147
  178. package/src/stories/mf-checkbox.stories.ts +0 -88
  179. package/src/stories/mf-datepicker.stories.ts +0 -118
  180. package/src/stories/mf-dialog.stories.ts +0 -159
  181. package/src/stories/mf-form-field.stories.ts +0 -108
  182. package/src/stories/mf-grid-list.stories.ts +0 -104
  183. package/src/stories/mf-icon.stories.ts +0 -133
  184. package/src/stories/mf-input.stories.ts +0 -158
  185. package/src/stories/mf-menu.stories.ts +0 -71
  186. package/src/stories/mf-progress-bar.stories.ts +0 -119
  187. package/src/stories/mf-progress-spinner.stories.ts +0 -124
  188. package/src/stories/mf-radio-button.stories.ts +0 -111
  189. package/src/stories/mf-select.stories.ts +0 -184
  190. package/src/stories/mf-sidenav.stories.ts +0 -331
  191. package/src/stories/mf-table.stories.ts +0 -80
  192. package/src/stories/mf-toolbar.stories.ts +0 -112
  193. package/src/stories/user.ts +0 -3
  194. package/tsconfig.app.json +0 -15
  195. package/tsconfig.json +0 -33
  196. package/tsconfig.spec.json +0 -15
  197. package/vercel.json +0 -6
package/.editorconfig DELETED
@@ -1,17 +0,0 @@
1
- # Editor configuration, see https://editorconfig.org
2
- root = true
3
-
4
- [*]
5
- charset = utf-8
6
- indent_style = space
7
- indent_size = 2
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
10
-
11
- [*.ts]
12
- quote_type = single
13
- ij_typescript_use_double_quotes = false
14
-
15
- [*.md]
16
- max_line_length = off
17
- trim_trailing_whitespace = false
@@ -1,55 +0,0 @@
1
-
2
- You are an expert in TypeScript, Angular, and scalable web application development. You write functional, maintainable, performant, and accessible code following Angular and TypeScript best practices.
3
-
4
- ## TypeScript Best Practices
5
-
6
- - Use strict type checking
7
- - Prefer type inference when the type is obvious
8
- - Avoid the `any` type; use `unknown` when type is uncertain
9
-
10
- ## Angular Best Practices
11
-
12
- - Always use standalone components over NgModules
13
- - Must NOT set `standalone: true` inside Angular decorators. It's the default in Angular v20+.
14
- - Use signals for state management
15
- - Implement lazy loading for feature routes
16
- - Do NOT use the `@HostBinding` and `@HostListener` decorators. Put host bindings inside the `host` object of the `@Component` or `@Directive` decorator instead
17
- - Use `NgOptimizedImage` for all static images.
18
- - `NgOptimizedImage` does not work for inline base64 images.
19
-
20
- ## Accessibility Requirements
21
-
22
- - It MUST pass all AXE checks.
23
- - It MUST follow all WCAG AA minimums, including focus management, color contrast, and ARIA attributes.
24
-
25
- ### Components
26
-
27
- - Keep components small and focused on a single responsibility
28
- - Use `input()` and `output()` functions instead of decorators
29
- - Use `computed()` for derived state
30
- - Set `changeDetection: ChangeDetectionStrategy.OnPush` in `@Component` decorator
31
- - Prefer inline templates for small components
32
- - Prefer Reactive forms instead of Template-driven ones
33
- - Do NOT use `ngClass`, use `class` bindings instead
34
- - Do NOT use `ngStyle`, use `style` bindings instead
35
- - When using external templates/styles, use paths relative to the component TS file.
36
-
37
- ## State Management
38
-
39
- - Use signals for local component state
40
- - Use `computed()` for derived state
41
- - Keep state transformations pure and predictable
42
- - Do NOT use `mutate` on signals, use `update` or `set` instead
43
-
44
- ## Templates
45
-
46
- - Keep templates simple and avoid complex logic
47
- - Use native control flow (`@if`, `@for`, `@switch`) instead of `*ngIf`, `*ngFor`, `*ngSwitch`
48
- - Use the async pipe to handle observables
49
- - Do not assume globals like (`new Date()`) are available.
50
-
51
- ## Services
52
-
53
- - Design services around a single responsibility
54
- - Use the `providedIn: 'root'` option for singleton services
55
- - Use the `inject()` function instead of constructor injection
@@ -1,29 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- - master
8
- - 'codex/**'
9
- pull_request:
10
-
11
- jobs:
12
- validate:
13
- runs-on: ubuntu-latest
14
-
15
- steps:
16
- - name: Checkout
17
- uses: actions/checkout@v4
18
-
19
- - name: Setup Node
20
- uses: actions/setup-node@v4
21
- with:
22
- node-version: 22
23
- cache: npm
24
-
25
- - name: Install
26
- run: npm ci
27
-
28
- - name: Validate Library
29
- run: npm run ci
package/.prettierrc DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "printWidth": 100,
3
- "singleQuote": true,
4
- "overrides": [
5
- {
6
- "files": "*.html",
7
- "options": {
8
- "parser": "angular"
9
- }
10
- }
11
- ]
12
- }
@@ -1,21 +0,0 @@
1
- import type { StorybookConfig } from '@storybook/angular';
2
-
3
- const config: StorybookConfig = {
4
- "stories": [
5
- "../src/**/*.mdx",
6
- "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"
7
- ],
8
- "addons": [
9
- "@storybook/addon-a11y",
10
- "@storybook/addon-docs"
11
- ],
12
- "framework": "@storybook/angular",
13
- "previewHead": (head) => `
14
- ${head}
15
- <link rel="preconnect" href="https://fonts.googleapis.com">
16
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
17
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Sora:wght@500;700&display=swap">
18
- <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
19
- `,
20
- };
21
- export default config;
@@ -1,27 +0,0 @@
1
- import { setCompodocJson } from '@storybook/addon-docs/angular';
2
- import type { Preview } from '@storybook/angular';
3
- import { applicationConfig } from '@storybook/angular';
4
- import { provideAnimations } from '@angular/platform-browser/animations';
5
- import { importProvidersFrom } from '@angular/core';
6
- import { MatIconModule } from '@angular/material/icon';
7
- import docJson from '../documentation.json';
8
-
9
- setCompodocJson(docJson);
10
-
11
- const preview: Preview = {
12
- decorators: [
13
- applicationConfig({
14
- providers: [provideAnimations(), importProvidersFrom(MatIconModule)],
15
- }),
16
- ],
17
- parameters: {
18
- controls: {
19
- matchers: {
20
- color: /(background|color)$/i,
21
- date: /Date$/i,
22
- },
23
- },
24
- },
25
- };
26
-
27
- export default preview;
@@ -1,10 +0,0 @@
1
- // This tsconfig is used by Compodoc to generate the documentation for the project.
2
- // If Compodoc is not used, this file can be deleted.
3
- {
4
- "extends": "./tsconfig.json",
5
- // Exclude all files that are not needed for documentation generation.
6
- "exclude": ["../src/test.ts", "../src/**/*.spec.ts", "../src/**/*.stories.ts"],
7
- // Please make sure to include all files from which Compodoc should generate documentation.
8
- "include": ["../src/**/*"],
9
- "files": ["./typings.d.ts"]
10
- }
@@ -1,15 +0,0 @@
1
- {
2
- "extends": "../tsconfig.app.json",
3
- "compilerOptions": {
4
- "types": ["node"],
5
- "allowSyntheticDefaultImports": true,
6
- "resolveJsonModule": true
7
- },
8
- "exclude": ["../src/test.ts", "../src/**/*.spec.ts"],
9
- "include": [
10
- "../src/**/*.stories.*",
11
- "../src/app/components/**/*.ts",
12
- "./preview.ts"
13
- ],
14
- "files": ["./typings.d.ts"]
15
- }
@@ -1,4 +0,0 @@
1
- declare module '*.md' {
2
- const content: string;
3
- export default content;
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
3
- "recommendations": ["angular.ng-template"]
4
- }
@@ -1,20 +0,0 @@
1
- {
2
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
3
- "version": "0.2.0",
4
- "configurations": [
5
- {
6
- "name": "ng serve",
7
- "type": "chrome",
8
- "request": "launch",
9
- "preLaunchTask": "npm: start",
10
- "url": "http://localhost:4200/"
11
- },
12
- {
13
- "name": "ng test",
14
- "type": "chrome",
15
- "request": "launch",
16
- "preLaunchTask": "npm: test",
17
- "url": "http://localhost:9876/debug.html"
18
- }
19
- ]
20
- }
package/.vscode/mcp.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- // For more information, visit: https://angular.dev/ai/mcp
3
- "servers": {
4
- "angular-cli": {
5
- "command": "npx",
6
- "args": ["-y", "@angular/cli", "mcp"]
7
- }
8
- }
9
- }
@@ -1,42 +0,0 @@
1
- {
2
- // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
3
- "version": "2.0.0",
4
- "tasks": [
5
- {
6
- "type": "npm",
7
- "script": "start",
8
- "isBackground": true,
9
- "problemMatcher": {
10
- "owner": "typescript",
11
- "pattern": "$tsc",
12
- "background": {
13
- "activeOnStart": true,
14
- "beginsPattern": {
15
- "regexp": "Changes detected"
16
- },
17
- "endsPattern": {
18
- "regexp": "bundle generation (complete|failed)"
19
- }
20
- }
21
- }
22
- },
23
- {
24
- "type": "npm",
25
- "script": "test",
26
- "isBackground": true,
27
- "problemMatcher": {
28
- "owner": "typescript",
29
- "pattern": "$tsc",
30
- "background": {
31
- "activeOnStart": true,
32
- "beginsPattern": {
33
- "regexp": "Changes detected"
34
- },
35
- "endsPattern": {
36
- "regexp": "bundle generation (complete|failed)"
37
- }
38
- }
39
- }
40
- }
41
- ]
42
- }
package/ACCESSIBILITY.md DELETED
@@ -1,127 +0,0 @@
1
- # Accessibility Contract for ng-comps v1
2
-
3
- ## Positioning
4
-
5
- `ng-comps` v1 is built to make accessible implementation the default path for Angular teams using Angular Material under a branded component layer.
6
-
7
- Repository goals:
8
-
9
- - implement against WCAG 2.2 AA at component level
10
- - keep contractual evidence aligned to EN 301 549 v3.2.1 / WCAG 2.1 AA until the next EN revision is formally published
11
- - document known limits so procurement claims stay technically defensible
12
-
13
- The library can support accessibility conformance. It cannot guarantee application-level conformance on its own.
14
-
15
- ## Public Contract
16
-
17
- Consumers must follow these rules:
18
-
19
- 1. Every interactive component must expose an accessible name through visible text, `label`, `ariaLabel`, or `ariaLabelledby`.
20
- 2. Placeholders are supplementary hints, never the only label.
21
- 3. Icon-only actions must provide an explicit accessible label.
22
- 4. Focus must remain visible. Consumers must not remove outlines without an equivalent replacement.
23
- 5. Dialogs, menus, selects, datepickers, and sidenavs must use the provided accessible APIs and patterns.
24
- 6. Table row interactions must be explicit buttons or links inside cells. Whole-row click targets are not part of the default contract.
25
- 7. Theme overrides must preserve contrast and focus ring visibility.
26
-
27
- ## What the Library Now Enforces
28
-
29
- - shared accessible-name contract on interactive form controls
30
- - `ControlValueAccessor` support for core form inputs
31
- - `aria-describedby` wiring for hints, counters, and errors
32
- - `aria-invalid` reflection for explicit and form-driven errors
33
- - visible global `:focus-visible` styling
34
- - safer dialog opening through `MfDialogService`
35
- - explicit row actions in `MfTableComponent`
36
- - snackbar politeness and announcement support
37
- - tooltip directive support on the real host element via `mfTooltip`
38
-
39
- ## Component Notes
40
-
41
- ### Buttons and triggers
42
-
43
- - `MfButtonComponent` supports icon-only mode, but icon-only usage requires `ariaLabel` or `ariaLabelledby`.
44
- - `MfMenuComponent` exposes a labelled trigger and relies on Angular Material keyboard navigation for menu items.
45
-
46
- ### Form controls
47
-
48
- - `MfInputComponent`
49
- - `MfTextareaComponent`
50
- - `MfSelectComponent`
51
- - `MfAutocompleteComponent`
52
- - `MfDatepickerComponent`
53
- - `MfCheckboxComponent`
54
- - `MfRadioButtonComponent`
55
- - `MfSlideToggleComponent`
56
-
57
- These components support Angular forms integration, descriptive relationships, and explicit error announcements.
58
-
59
- ### Overlays
60
-
61
- - `MfDialogService` applies safe defaults for role, autofocus, restore focus, and panel class.
62
- - `MfDialogComponent` requires a visible title or explicit accessible name.
63
- - `MfDatepickerComponent`, `MfSelectComponent`, and `MfAutocompleteComponent` inherit keyboard interaction from Angular Material and are documented with keyboard contract stories in Storybook.
64
-
65
- ### Data and status
66
-
67
- - `MfTableComponent` uses explicit action controls instead of clickable rows.
68
- - `MfProgressBarComponent` and `MfProgressSpinnerComponent` require accessible labels for informative usage.
69
- - `MfBadgeComponent` distinguishes decorative usage from informative usage through `description`.
70
- - `MfAvatarComponent` distinguishes decorative usage from informative usage through `decorative`.
71
-
72
- ## Automated Validation in This Repo
73
-
74
- Local commands:
75
-
76
- ```bash
77
- npm run build:lib
78
- npm run test:ci
79
- npm run build-storybook
80
- npm run ci
81
- ```
82
-
83
- Automated coverage currently includes:
84
-
85
- - unit tests
86
- - DOM-level accessibility checks with `axe-core`
87
- - regression checks for accessibility-oriented API defaults
88
- - Storybook static build for documentation and contract stories
89
-
90
- ## Manual Validation Matrix
91
-
92
- This repository still requires manual validation before any formal claim:
93
-
94
- - keyboard-only navigation
95
- - 200% zoom
96
- - reflow equivalent to 320 CSS px width
97
- - NVDA on Windows
98
- - VoiceOver on macOS
99
- - visible focus review
100
- - contrast review after any token override
101
-
102
- ## Known Limitations
103
-
104
- - Application conformance still depends on consumer content, routing, state changes, and custom wrappers.
105
- - If consumers override tokens or Angular Material theme values, they must re-run contrast checks.
106
- - `MfTooltipComponent` is retained for compatibility, but the preferred API in v1 is the `mfTooltip` directive on the host element.
107
- - Repeated row actions in tables should provide contextual `rowActionAriaLabel` values for best screen reader output.
108
- - Screen reader verification remains mandatory for procurement-grade evidence.
109
-
110
- ## VPAT-Oriented Evidence Base
111
-
112
- This repository now includes:
113
-
114
- - component-level accessibility defaults
115
- - automated checks that run in CI
116
- - Storybook contract stories for critical interaction patterns
117
- - explicit documentation of correct usage, anti-patterns, and limitations
118
-
119
- That is a usable base for a VPAT process, but not a completed VPAT by itself.
120
-
121
- ## Normative References
122
-
123
- - W3C WCAG overview: https://www.w3.org/WAI/standards-guidelines/wcag/
124
- - EN 301 549 working repository: https://labs.etsi.org/rep/HF/en301549
125
- - ETSI download/status entry referenced in procurement notes: https://portal.etsi.org/webapp/ewp/copy_file.asp?wki_id=64282
126
-
127
- As verified on 2026-03-27, W3C states that EN 301 549 currently uses WCAG 2.1 and encourages use of WCAG 2.2, while the EN 301 549 working repository describes the v4.1.0 draft as being in formal approval flow rather than a published replacement.
package/angular.json DELETED
@@ -1,106 +0,0 @@
1
- {
2
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3
- "version": 1,
4
- "cli": {
5
- "packageManager": "npm",
6
- "analytics": "186cd70a-0821-4a2c-a822-a3d7739f41eb"
7
- },
8
- "newProjectRoot": "projects",
9
- "projects": {
10
- "ng-comps": {
11
- "projectType": "application",
12
- "schematics": {},
13
- "root": "",
14
- "sourceRoot": "src",
15
- "prefix": "app",
16
- "architect": {
17
- "build": {
18
- "builder": "@angular/build:application",
19
- "options": {
20
- "outputPath": "dist/ng-comps-demo",
21
- "browser": "src/main.ts",
22
- "tsConfig": "tsconfig.app.json",
23
- "assets": [
24
- {
25
- "glob": "**/*",
26
- "input": "public"
27
- }
28
- ],
29
- "styles": [
30
- "src/theme/material-theme.scss",
31
- "src/styles.css"
32
- ]
33
- },
34
- "configurations": {
35
- "production": {
36
- "budgets": [
37
- {
38
- "type": "initial",
39
- "maximumWarning": "500kB",
40
- "maximumError": "1MB"
41
- },
42
- {
43
- "type": "anyComponentStyle",
44
- "maximumWarning": "4kB",
45
- "maximumError": "8kB"
46
- }
47
- ],
48
- "outputHashing": "all"
49
- },
50
- "development": {
51
- "optimization": false,
52
- "extractLicenses": false,
53
- "sourceMap": true
54
- }
55
- },
56
- "defaultConfiguration": "production"
57
- },
58
- "serve": {
59
- "builder": "@angular/build:dev-server",
60
- "configurations": {
61
- "production": {
62
- "buildTarget": "ng-comps:build:production"
63
- },
64
- "development": {
65
- "buildTarget": "ng-comps:build:development"
66
- }
67
- },
68
- "defaultConfiguration": "development"
69
- },
70
- "test": {
71
- "builder": "@angular/build:unit-test"
72
- },
73
- "storybook": {
74
- "builder": "@storybook/angular:start-storybook",
75
- "options": {
76
- "configDir": ".storybook",
77
- "browserTarget": "ng-comps:build",
78
- "compodoc": true,
79
- "compodocArgs": [
80
- "-e",
81
- "json",
82
- "-d",
83
- "."
84
- ],
85
- "port": 6006
86
- }
87
- },
88
- "build-storybook": {
89
- "builder": "@storybook/angular:build-storybook",
90
- "options": {
91
- "configDir": ".storybook",
92
- "browserTarget": "ng-comps:build",
93
- "compodoc": true,
94
- "compodocArgs": [
95
- "-e",
96
- "json",
97
- "-d",
98
- "."
99
- ],
100
- "outputDir": "storybook-static"
101
- }
102
- }
103
- }
104
- }
105
- }
106
- }