semmet-angular 0.42.0 → 0.44.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 (218) hide show
  1. package/README.en.md +2 -315
  2. package/README.md +172 -264
  3. package/package.json +2 -2
  4. package/src/accordion/files/__name@dasherize__/__name@dasherize__.css.template +4 -41
  5. package/src/accordion/schema.json +19 -4
  6. package/src/alert/files/__name@dasherize__/__name@dasherize__.css.template +1 -25
  7. package/src/alert/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  8. package/src/alert/files/__name@dasherize__/__name@dasherize__.ts.template +4 -1
  9. package/src/alert/schema.json +19 -4
  10. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.css.template +3 -56
  11. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.html.template +6 -6
  12. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.ts.template +7 -1
  13. package/src/alert-dialog/schema.json +19 -4
  14. package/src/avatar/files/__name@dasherize__/__name@dasherize__.css.template +17 -0
  15. package/src/avatar/files/__name@dasherize__/__name@dasherize__.html.template +28 -0
  16. package/src/avatar/files/__name@dasherize__/__name@dasherize__.spec.ts.template +27 -0
  17. package/src/avatar/files/__name@dasherize__/__name@dasherize__.ts.template +35 -0
  18. package/src/avatar/index.d.ts +1 -0
  19. package/src/avatar/index.js +6 -0
  20. package/src/avatar/index.js.map +1 -0
  21. package/src/avatar/index.ts +3 -0
  22. package/src/avatar/schema.d.ts +1 -0
  23. package/src/avatar/schema.js +3 -0
  24. package/src/avatar/schema.js.map +1 -0
  25. package/src/avatar/schema.json +44 -0
  26. package/src/avatar/schema.ts +1 -0
  27. package/src/badge/files/__name@dasherize__/__name@dasherize__.css.template +0 -77
  28. package/src/badge/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  29. package/src/badge/schema.json +19 -4
  30. package/src/block/files/__name@dasherize__/__name@dasherize__.css.template +10 -81
  31. package/src/block/files/__name@dasherize__/__name@dasherize__.html.template +33 -25
  32. package/src/block/files/__name@dasherize__/__name@dasherize__.ts.template +41 -10
  33. package/src/block/schema.json +19 -4
  34. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.css.template +2 -23
  35. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  36. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.ts.template +9 -5
  37. package/src/breadcrumb/schema.json +19 -4
  38. package/src/button/files/__name@dasherize__/__name@dasherize__.css.template +2 -79
  39. package/src/button/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  40. package/src/button/schema.json +19 -4
  41. package/src/button-group/files/__name@dasherize__/__name@dasherize__.css.template +2 -70
  42. package/src/button-group/files/__name@dasherize__/__name@dasherize__.ts.template +1 -2
  43. package/src/button-group/schema.json +19 -4
  44. package/src/card/files/__name@dasherize__/__name@dasherize__.css.template +0 -67
  45. package/src/card/files/__name@dasherize__/__name@dasherize__.html.template +10 -55
  46. package/src/card/files/__name@dasherize__/__name@dasherize__.ts.template +2 -45
  47. package/src/card/schema.json +19 -4
  48. package/src/carousel/files/__name@dasherize__/__name@dasherize__.css.template +2 -32
  49. package/src/carousel/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  50. package/src/carousel/files/__name@dasherize__/__name@dasherize__.ts.template +4 -0
  51. package/src/carousel/schema.json +19 -4
  52. package/src/checkbox/files/__name@dasherize__/__name@dasherize__.css.template +5 -21
  53. package/src/checkbox/schema.json +19 -4
  54. package/src/close-button/files/__name@dasherize__/__name@dasherize__.css.template +9 -47
  55. package/src/close-button/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  56. package/src/close-button/schema.json +19 -4
  57. package/src/collection.json +21 -1
  58. package/src/combobox/files/__name@dasherize__/__name@dasherize__.css.template +4 -49
  59. package/src/combobox/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  60. package/src/combobox/files/__name@dasherize__/__name@dasherize__.ts.template +11 -8
  61. package/src/combobox/schema.json +19 -4
  62. package/src/dialog/files/__name@dasherize__/__name@dasherize__.css.template +3 -45
  63. package/src/dialog/files/__name@dasherize__/__name@dasherize__.html.template +5 -5
  64. package/src/dialog/files/__name@dasherize__/__name@dasherize__.ts.template +6 -1
  65. package/src/dialog/schema.json +19 -4
  66. package/src/disclosure/files/__name@dasherize__/__name@dasherize__.css.template +4 -36
  67. package/src/disclosure/schema.json +19 -4
  68. package/src/e2e/index.d.ts +2 -0
  69. package/src/e2e/index.js +90 -0
  70. package/src/e2e/index.js.map +1 -0
  71. package/src/e2e/index.ts +106 -0
  72. package/src/e2e/schema.d.ts +2 -0
  73. package/src/e2e/schema.js +3 -0
  74. package/src/e2e/schema.js.map +1 -0
  75. package/src/e2e/schema.json +9 -0
  76. package/src/e2e/schema.ts +1 -0
  77. package/src/form/files/__name@dasherize__/__name@dasherize__.css.template +1 -77
  78. package/src/form/files/__name@dasherize__/__name@dasherize__.html.template +7 -7
  79. package/src/form/files/__name@dasherize__/__name@dasherize__.ts.template +20 -7
  80. package/src/form/schema.json +19 -4
  81. package/src/input/files/__name@dasherize__/__name@dasherize__.css.template +2 -58
  82. package/src/input/schema.json +19 -4
  83. package/src/input-group/files/__name@dasherize__/__name@dasherize__.css.template +2 -68
  84. package/src/input-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -5
  85. package/src/input-group/files/__name@dasherize__/__name@dasherize__.ts.template +21 -6
  86. package/src/input-group/schema.json +19 -4
  87. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.css.template +0 -24
  88. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  89. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
  90. package/src/landmarks/schema.json +19 -4
  91. package/src/list-group/files/__name@dasherize__/__name@dasherize__.css.template +0 -123
  92. package/src/list-group/files/__name@dasherize__/__name@dasherize__.e2e-spec.ts.template +8 -9
  93. package/src/list-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -47
  94. package/src/list-group/files/__name@dasherize__/__name@dasherize__.spec.ts.template +46 -24
  95. package/src/list-group/files/__name@dasherize__/__name@dasherize__.ts.template +97 -39
  96. package/src/list-group/schema.json +19 -4
  97. package/src/listbox/files/__name@dasherize__/__name@dasherize__.css.template +3 -37
  98. package/src/listbox/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  99. package/src/listbox/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  100. package/src/listbox/schema.json +19 -4
  101. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.css.template +7 -47
  102. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  103. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.ts.template +10 -7
  104. package/src/menu-button/schema.json +19 -4
  105. package/src/meter/files/__name@dasherize__/__name@dasherize__.css.template +0 -12
  106. package/src/meter/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  107. package/src/meter/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  108. package/src/meter/schema.json +19 -4
  109. package/src/navbar/files/__name@dasherize__/__name@dasherize__.css.template +6 -62
  110. package/src/navbar/schema.json +19 -4
  111. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.css.template +6 -37
  112. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.html.template +7 -6
  113. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.ts.template +15 -1
  114. package/src/navigation-menu/schema.json +19 -4
  115. package/src/ng-add/index.d.ts +1 -1
  116. package/src/ng-add/index.js +2 -72
  117. package/src/ng-add/index.js.map +1 -1
  118. package/src/ng-add/index.ts +3 -86
  119. package/src/ng-add/schema.d.ts +0 -1
  120. package/src/ng-add/schema.json +0 -5
  121. package/src/ng-add/schema.ts +0 -1
  122. package/src/offcanvas/files/__name@dasherize__/__name@dasherize__.css.template +3 -70
  123. package/src/offcanvas/schema.json +19 -4
  124. package/src/pagination/files/__name@dasherize__/__name@dasherize__.css.template +2 -33
  125. package/src/pagination/files/__name@dasherize__/__name@dasherize__.html.template +6 -6
  126. package/src/pagination/files/__name@dasherize__/__name@dasherize__.ts.template +7 -1
  127. package/src/pagination/schema.json +19 -4
  128. package/src/popover/files/__name@dasherize__/__name@dasherize__.css.template +8 -69
  129. package/src/popover/schema.json +19 -4
  130. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.css.template +1 -31
  131. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  132. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  133. package/src/progress-bar/schema.json +19 -4
  134. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.css.template +4 -31
  135. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  136. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.ts.template +2 -1
  137. package/src/radio-group/schema.json +19 -4
  138. package/src/rating/files/__name@dasherize__/__name@dasherize__.css.template +17 -0
  139. package/src/rating/files/__name@dasherize__/__name@dasherize__.html.template +34 -0
  140. package/src/rating/files/__name@dasherize__/__name@dasherize__.spec.ts.template +38 -0
  141. package/src/rating/files/__name@dasherize__/__name@dasherize__.ts.template +75 -0
  142. package/src/rating/index.d.ts +1 -0
  143. package/src/rating/index.js +6 -0
  144. package/src/rating/index.js.map +1 -0
  145. package/src/rating/index.ts +3 -0
  146. package/src/rating/schema.d.ts +1 -0
  147. package/src/rating/schema.js +3 -0
  148. package/src/rating/schema.js.map +1 -0
  149. package/src/rating/schema.json +44 -0
  150. package/src/rating/schema.ts +1 -0
  151. package/src/select/files/__name@dasherize__/__name@dasherize__.css.template +4 -55
  152. package/src/select/schema.json +19 -4
  153. package/src/skeleton/files/__name@dasherize__/__name@dasherize__.css.template +2 -29
  154. package/src/skeleton/files/__name@dasherize__/__name@dasherize__.ts.template +1 -3
  155. package/src/skeleton/schema.json +19 -4
  156. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.css.template +2 -14
  157. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  158. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
  159. package/src/skip-link/schema.json +19 -4
  160. package/src/slider/files/__name@dasherize__/__name@dasherize__.css.template +6 -20
  161. package/src/slider/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  162. package/src/slider/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  163. package/src/slider/schema.json +19 -4
  164. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.css.template +6 -35
  165. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  166. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  167. package/src/spinbutton/schema.json +19 -4
  168. package/src/spinner/files/__name@dasherize__/__name@dasherize__.css.template +0 -43
  169. package/src/spinner/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  170. package/src/spinner/schema.json +19 -4
  171. package/src/steps/files/__name@dasherize__/__name@dasherize__.css.template +36 -0
  172. package/src/steps/files/__name@dasherize__/__name@dasherize__.html.template +44 -0
  173. package/src/steps/files/__name@dasherize__/__name@dasherize__.spec.ts.template +35 -0
  174. package/src/steps/files/__name@dasherize__/__name@dasherize__.ts.template +107 -0
  175. package/src/steps/index.d.ts +1 -0
  176. package/src/steps/index.js +6 -0
  177. package/src/steps/index.js.map +1 -0
  178. package/src/steps/index.ts +3 -0
  179. package/src/steps/schema.d.ts +1 -0
  180. package/src/steps/schema.js +3 -0
  181. package/src/steps/schema.js.map +1 -0
  182. package/src/steps/schema.json +44 -0
  183. package/src/steps/schema.ts +1 -0
  184. package/src/switch/files/__name@dasherize__/__name@dasherize__.css.template +7 -22
  185. package/src/switch/schema.json +19 -4
  186. package/src/table/files/__name@dasherize__/__name@dasherize__.css.template +0 -25
  187. package/src/table/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  188. package/src/table/files/__name@dasherize__/__name@dasherize__.ts.template +3 -0
  189. package/src/table/schema.json +19 -4
  190. package/src/tabs/files/__name@dasherize__/__name@dasherize__.css.template +5 -44
  191. package/src/tabs/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  192. package/src/tabs/files/__name@dasherize__/__name@dasherize__.ts.template +2 -0
  193. package/src/tabs/schema.json +19 -4
  194. package/src/textarea/files/__name@dasherize__/__name@dasherize__.css.template +2 -59
  195. package/src/textarea/schema.json +19 -4
  196. package/src/toast/files/__name@dasherize__/__name@dasherize__.css.template +1 -35
  197. package/src/toast/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  198. package/src/toast/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  199. package/src/toast/schema.json +19 -4
  200. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.css.template +2 -36
  201. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  202. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.ts.template +11 -8
  203. package/src/toolbar/schema.json +19 -4
  204. package/src/tooltip/files/__name@dasherize__/__name@dasherize__.css.template +1 -32
  205. package/src/tooltip/schema.json +19 -4
  206. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.css.template +5 -27
  207. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  208. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.ts.template +16 -13
  209. package/src/tree-view/schema.json +19 -4
  210. package/src/utils/generate-component.js +3 -1
  211. package/src/utils/generate-component.js.map +1 -1
  212. package/src/utils/generate-component.ts +3 -1
  213. package/src/utils/generate-composition.js +0 -1
  214. package/src/utils/generate-composition.js.map +1 -1
  215. package/src/utils/generate-composition.ts +0 -1
  216. package/src/utils/schema-types.d.ts +1 -0
  217. package/src/utils/schema-types.ts +1 -0
  218. package/README.pt-BR.md +0 -330
@@ -0,0 +1,107 @@
1
+ import { Component, ElementRef, booleanAttribute, computed, input, output, signal, viewChildren } from '@angular/core';
2
+
3
+ interface <%= classify(name) %>Step {
4
+ id: string;
5
+ label: string;
6
+ description?: string;
7
+ disabled?: boolean;
8
+ }
9
+
10
+ const DEFAULT_STEPS: readonly <%= classify(name) %>Step[] = [
11
+ { id: 'discover', label: 'Discover', description: 'Understand the current need.' },
12
+ { id: 'build', label: 'Build', description: 'Create the accessible UI.' },
13
+ { id: 'ship', label: 'Ship', description: 'Verify and deliver.' },
14
+ ];
15
+
16
+ let nextId = 0;
17
+
18
+ @Component({
19
+ selector: '<%= selector %>',
20
+ imports: [],
21
+ templateUrl: './<%= dasherize(name) %>.html',
22
+ styleUrl: './<%= dasherize(name) %>.css',
23
+ })
24
+ export class <%= classify(name) %> {
25
+ private readonly stepButtons = viewChildren<ElementRef<HTMLButtonElement>>('stepButton');
26
+
27
+ protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
28
+
29
+ readonly label = input('Progress steps');
30
+ readonly interactive = input(false, { transform: booleanAttribute });
31
+ readonly steps = input<readonly <%= classify(name) %>Step[]>(DEFAULT_STEPS);
32
+ readonly currentId = input<string | null>(null);
33
+ readonly stepChange = output<<%= classify(name) %>Step>();
34
+
35
+ protected readonly selectedId = signal(DEFAULT_STEPS[0]?.id ?? null);
36
+ protected readonly activeId = computed(() => this.currentId() ?? this.selectedId());
37
+
38
+ protected isCurrent(step: <%= classify(name) %>Step): boolean {
39
+ return this.activeId() === step.id;
40
+ }
41
+
42
+ protected select(step: <%= classify(name) %>Step): void {
43
+ if (!this.interactive() || step.disabled) {
44
+ return;
45
+ }
46
+
47
+ this.selectedId.set(step.id);
48
+ this.stepChange.emit(step);
49
+ }
50
+
51
+ protected navigate(event: KeyboardEvent, index: number): void {
52
+ if (!this.interactive()) {
53
+ return;
54
+ }
55
+
56
+ const steps = this.steps();
57
+ let nextIndex: number;
58
+
59
+ switch (event.key) {
60
+ case 'ArrowDown':
61
+ case 'ArrowRight':
62
+ nextIndex = this.findEnabledIndex(index, 1, steps);
63
+ break;
64
+ case 'ArrowUp':
65
+ case 'ArrowLeft':
66
+ nextIndex = this.findEnabledIndex(index, -1, steps);
67
+ break;
68
+ case 'Home':
69
+ nextIndex = steps.findIndex((step) => !step.disabled);
70
+ break;
71
+ case 'End':
72
+ nextIndex = -1;
73
+ for (let i = steps.length - 1; i >= 0; i--) {
74
+ if (!steps[i].disabled) {
75
+ nextIndex = i;
76
+ break;
77
+ }
78
+ }
79
+ break;
80
+ default:
81
+ return;
82
+ }
83
+
84
+ if (nextIndex < 0) {
85
+ return;
86
+ }
87
+
88
+ event.preventDefault();
89
+ this.select(steps[nextIndex]);
90
+ this.stepButtons()[nextIndex]?.nativeElement.focus();
91
+ }
92
+
93
+ private findEnabledIndex(index: number, direction: 1 | -1, steps: readonly <%= classify(name) %>Step[]): number {
94
+ if (steps.length === 0) {
95
+ return -1;
96
+ }
97
+
98
+ for (let offset = 1; offset <= steps.length; offset++) {
99
+ const nextIndex = (index + offset * direction + steps.length) % steps.length;
100
+ if (!steps[nextIndex].disabled) {
101
+ return nextIndex;
102
+ }
103
+ }
104
+
105
+ return -1;
106
+ }
107
+ }
@@ -0,0 +1 @@
1
+ export declare const steps: (options: import("./schema").Schema) => import("@angular-devkit/schematics").Rule;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.steps = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.steps = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,KAAK,GAAG,IAAA,iDAA4B,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createAriaComponentSchematic } from '../utils/generate-component';
2
+
3
+ export const steps = createAriaComponentSchematic({ includeSharedUnitTest: false });
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "$id": "SemmetAngularSteps",
4
+ "title": "Semmet Angular Steps Options Schema",
5
+ "type": "object",
6
+ "description": "Generates a standalone Angular Steps component for ordered progress, current-step semantics, and optional keyboard navigation.",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "description": "The name for the new component. Used to derive the class name, selector, and file names.",
12
+ "$default": {
13
+ "$source": "argv",
14
+ "index": 0
15
+ },
16
+ "x-prompt": "What name would you like to use for the steps component?"
17
+ },
18
+ "e2e": {
19
+ "type": "boolean",
20
+ "default": false,
21
+ "description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
22
+ },
23
+ "path": {
24
+ "type": "string",
25
+ "format": "path",
26
+ "$default": {
27
+ "$source": "workingDirectory"
28
+ },
29
+ "description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
30
+ "visible": false
31
+ },
32
+ "project": {
33
+ "type": "string",
34
+ "description": "The name of the project to add the component to.",
35
+ "$default": {
36
+ "$source": "projectName"
37
+ }
38
+ }
39
+ },
40
+ "required": [
41
+ "name",
42
+ "project"
43
+ ]
44
+ }
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -1,25 +1,14 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-outline: #71717a;
4
- --semmet-color-surface: #ffffff;
5
- --semmet-color-on-surface: #18181b;
6
- --semmet-space-md: 32px;
7
- --semmet-target-sm: 32px;
8
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
9
-
10
2
  display: inline-block;
11
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
12
- font-size: 0.9375rem;
13
3
  }
14
4
 
15
5
  [role='switch'] {
16
6
  position: relative;
17
7
  display: inline-flex;
18
8
  align-items: center;
19
- padding-left: var(--semmet-space-md);
20
- min-height: var(--semmet-target-sm);
9
+ padding-left: 2.75rem;
21
10
  font: inherit;
22
- color: var(--semmet-color-on-surface);
11
+ color: inherit;
23
12
  background: none;
24
13
  border: none;
25
14
  cursor: pointer;
@@ -34,10 +23,9 @@
34
23
  width: 2.25rem;
35
24
  height: 1.25rem;
36
25
  box-sizing: border-box;
37
- border: 2px solid var(--semmet-color-outline);
26
+ border: 2px solid currentColor;
38
27
  border-radius: 999px;
39
28
  background: transparent;
40
- transition: background-color var(--semmet-motion), border-color var(--semmet-motion);
41
29
  }
42
30
 
43
31
  [role='switch']::after {
@@ -49,22 +37,19 @@
49
37
  width: 0.85rem;
50
38
  height: 0.85rem;
51
39
  border-radius: 50%;
52
- background: var(--semmet-color-outline);
53
- transition: transform var(--semmet-motion), background-color var(--semmet-motion);
40
+ background: currentColor;
54
41
  }
55
42
 
56
43
  [role='switch'][aria-checked='true']::before {
57
- background: var(--semmet-color-primary);
58
- border-color: var(--semmet-color-primary);
44
+ background: currentColor;
59
45
  }
60
46
 
61
47
  [role='switch'][aria-checked='true']::after {
62
- background: var(--semmet-color-surface);
48
+ background: Canvas;
63
49
  transform: translateY(-50%) translateX(1rem);
64
50
  }
65
51
 
66
52
  [role='switch']:focus-visible {
67
- outline: 2px solid var(--semmet-color-primary);
53
+ outline: 2px solid currentColor;
68
54
  outline-offset: 2px;
69
- border-radius: 4px;
70
55
  }
@@ -9,21 +9,36 @@
9
9
  "name": {
10
10
  "type": "string",
11
11
  "description": "The name for the new component. Used to derive the class name, selector, and file names.",
12
- "$default": { "$source": "argv", "index": 0 },
12
+ "$default": {
13
+ "$source": "argv",
14
+ "index": 0
15
+ },
13
16
  "x-prompt": "What name would you like to use for the switch component?"
14
17
  },
18
+ "e2e": {
19
+ "type": "boolean",
20
+ "default": false,
21
+ "description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
22
+ },
15
23
  "path": {
16
24
  "type": "string",
17
25
  "format": "path",
18
- "$default": { "$source": "workingDirectory" },
26
+ "$default": {
27
+ "$source": "workingDirectory"
28
+ },
19
29
  "description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
20
30
  "visible": false
21
31
  },
22
32
  "project": {
23
33
  "type": "string",
24
34
  "description": "The name of the project to add the component to.",
25
- "$default": { "$source": "projectName" }
35
+ "$default": {
36
+ "$source": "projectName"
37
+ }
26
38
  }
27
39
  },
28
- "required": ["name", "project"]
40
+ "required": [
41
+ "name",
42
+ "project"
43
+ ]
29
44
  }
@@ -1,14 +1,5 @@
1
1
  :host {
2
- --semmet-color-outline: #d4d4d8;
3
- --semmet-color-on-surface: #18181b;
4
- --semmet-color-on-surface-variant: #52525b;
5
- --semmet-color-surface-variant: #f4f4f5;
6
- --semmet-space-2xs: 8px;
7
- --semmet-space-xs: 16px;
8
-
9
2
  display: block;
10
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
11
- font-size: 0.9375rem;
12
3
  }
13
4
 
14
5
  table {
@@ -18,25 +9,9 @@ table {
18
9
 
19
10
  caption {
20
11
  text-align: left;
21
- margin-bottom: var(--semmet-space-xs);
22
- font-weight: 500;
23
- color: var(--semmet-color-on-surface);
24
12
  }
25
13
 
26
14
  th,
27
15
  td {
28
16
  text-align: left;
29
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
30
- border-bottom: 1px solid var(--semmet-color-outline);
31
- }
32
-
33
- thead th {
34
- background: var(--semmet-color-surface-variant);
35
- color: var(--semmet-color-on-surface-variant);
36
- font-weight: 500;
37
- }
38
-
39
- tbody th {
40
- color: var(--semmet-color-on-surface);
41
- font-weight: 500;
42
17
  }
@@ -20,8 +20,8 @@ Import <%= classify(name) %> in that parent component.
20
20
  </caption>
21
21
  <thead>
22
22
  <tr>
23
- <th scope="col">Quarter</th>
24
- <th scope="col">Revenue</th>
23
+ <th scope="col">{{ quarterHeader() }}</th>
24
+ <th scope="col">{{ revenueHeader() }}</th>
25
25
  </tr>
26
26
  </thead>
27
27
  <tbody>
@@ -36,7 +36,7 @@ Import <%= classify(name) %> in that parent component.
36
36
  @if (emptyTemplate(); as emptySlot) {
37
37
  <ng-container [ngTemplateOutlet]="emptySlot.templateRef" />
38
38
  } @else {
39
- No results available.
39
+ {{ emptyLabel() }}
40
40
  }
41
41
  </td>
42
42
  </tr>
@@ -31,6 +31,9 @@ export class <%= classify(name) %> {
31
31
  protected readonly emptyTemplate = contentChild(<%= classify(name) %>Empty);
32
32
 
33
33
  readonly caption = input('Quarterly results');
34
+ readonly quarterHeader = input('Quarter');
35
+ readonly revenueHeader = input('Revenue');
36
+ readonly emptyLabel = input('No results available.');
34
37
  readonly rows = input<readonly <%= classify(name) %>Row[]>([
35
38
  { quarter: 'Q1', revenue: '$12,000' },
36
39
  { quarter: 'Q2', revenue: '$15,500' },
@@ -9,21 +9,36 @@
9
9
  "name": {
10
10
  "type": "string",
11
11
  "description": "The name for the new component. Used to derive the class name, selector, and file names.",
12
- "$default": { "$source": "argv", "index": 0 },
12
+ "$default": {
13
+ "$source": "argv",
14
+ "index": 0
15
+ },
13
16
  "x-prompt": "What name would you like to use for the table component?"
14
17
  },
18
+ "e2e": {
19
+ "type": "boolean",
20
+ "default": false,
21
+ "description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
22
+ },
15
23
  "path": {
16
24
  "type": "string",
17
25
  "format": "path",
18
- "$default": { "$source": "workingDirectory" },
26
+ "$default": {
27
+ "$source": "workingDirectory"
28
+ },
19
29
  "description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
20
30
  "visible": false
21
31
  },
22
32
  "project": {
23
33
  "type": "string",
24
34
  "description": "The name of the project to add the component to.",
25
- "$default": { "$source": "projectName" }
35
+ "$default": {
36
+ "$source": "projectName"
37
+ }
26
38
  }
27
39
  },
28
- "required": ["name", "project"]
40
+ "required": [
41
+ "name",
42
+ "project"
43
+ ]
29
44
  }
@@ -1,79 +1,40 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-outline: #d4d4d8;
4
- --semmet-color-on-surface: #18181b;
5
- --semmet-color-on-surface-variant: #52525b;
6
- --semmet-radius-sm: 8px;
7
- --semmet-space-3xs: 4px;
8
- --semmet-space-2xs: 8px;
9
- --semmet-space-xs: 16px;
10
- --semmet-space-sm: 24px;
11
- --semmet-target-lg: 48px;
12
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
13
-
14
2
  display: block;
15
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
16
- font-size: 0.9375rem;
17
- line-height: 1.5;
18
- color: var(--semmet-color-on-surface);
19
3
  }
20
4
 
21
5
  [role='tablist'] {
22
6
  display: flex;
23
- gap: var(--semmet-space-3xs);
24
- border-bottom: 1px solid var(--semmet-color-outline);
25
7
  }
26
8
 
27
9
  [role='tab'] {
28
10
  position: relative;
29
11
  font: inherit;
30
- font-weight: 500;
31
- color: var(--semmet-color-on-surface-variant);
32
12
  background: none;
33
13
  border: none;
34
- border-radius: var(--semmet-radius-sm) var(--semmet-radius-sm) 0 0;
35
- min-height: var(--semmet-target-lg);
36
- padding: var(--semmet-space-2xs) var(--semmet-space-sm);
37
14
  cursor: pointer;
38
- transition: background-color var(--semmet-motion), color var(--semmet-motion);
39
- }
40
-
41
- [role='tab']:hover {
42
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
43
15
  }
44
16
 
45
17
  [role='tab']:focus-visible {
46
- outline: 2px solid var(--semmet-color-primary);
18
+ outline: 2px solid currentColor;
47
19
  outline-offset: 2px;
48
20
  }
49
21
 
50
22
  [role='tab']::after {
51
23
  content: '';
52
24
  position: absolute;
53
- left: var(--semmet-space-2xs);
54
- right: var(--semmet-space-2xs);
25
+ left: 0;
26
+ right: 0;
55
27
  bottom: -1px;
56
28
  height: 2px;
57
- border-radius: 2px 2px 0 0;
58
- background: var(--semmet-color-primary);
29
+ background: currentColor;
59
30
  transform: scaleX(0);
60
- transition: transform var(--semmet-motion);
61
- }
62
-
63
- [role='tab'][aria-selected='true'] {
64
- color: var(--semmet-color-primary);
65
31
  }
66
32
 
67
33
  [role='tab'][aria-selected='true']::after {
68
34
  transform: scaleX(1);
69
35
  }
70
36
 
71
- [role='tabpanel'] {
72
- padding: var(--semmet-space-xs) var(--semmet-space-3xs);
73
- color: var(--semmet-color-on-surface-variant);
74
- }
75
-
76
37
  [role='tabpanel']:focus-visible {
77
- outline: 2px solid var(--semmet-color-primary);
38
+ outline: 2px solid currentColor;
78
39
  outline-offset: 2px;
79
40
  }
@@ -3,7 +3,7 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> and <%= classify(name) %>Item in that parent component.
5
5
 
6
- <<%= selector %>>
6
+ <<%= selector %> label="Tabs">
7
7
  <ng-template <%= camelize(name) %>Item id="profile" label="Profile" [selected]="true">
8
8
  <app-profile-panel />
9
9
  </ng-template>
@@ -15,7 +15,7 @@ Import <%= classify(name) %> and <%= classify(name) %>Item in that parent compon
15
15
 
16
16
  Set [preserveContent]="false" on <<%= selector %>> to destroy inactive tab content.
17
17
  -->
18
- <div role="tablist" aria-label="Tabs">
18
+ <div role="tablist" [attr.aria-label]="label()">
19
19
  @for (item of items(); track item.id(); let i = $index) {
20
20
  <button
21
21
  #tabButton
@@ -41,6 +41,8 @@ export class <%= classify(name) %> {
41
41
 
42
42
  protected readonly items = contentChildren(<%= classify(name) %>Item);
43
43
  protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
44
+
45
+ readonly label = input('Tabs');
44
46
  readonly preserveContent = input(true, { transform: booleanAttribute });
45
47
 
46
48
  private readonly renderedIds = signal<ReadonlySet<<%= classify(name) %>ItemId>>(new Set());
@@ -9,21 +9,36 @@
9
9
  "name": {
10
10
  "type": "string",
11
11
  "description": "The name for the new component. Used to derive the class name, selector, and file names.",
12
- "$default": { "$source": "argv", "index": 0 },
12
+ "$default": {
13
+ "$source": "argv",
14
+ "index": 0
15
+ },
13
16
  "x-prompt": "What name would you like to use for the tabs component?"
14
17
  },
18
+ "e2e": {
19
+ "type": "boolean",
20
+ "default": false,
21
+ "description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
22
+ },
15
23
  "path": {
16
24
  "type": "string",
17
25
  "format": "path",
18
- "$default": { "$source": "workingDirectory" },
26
+ "$default": {
27
+ "$source": "workingDirectory"
28
+ },
19
29
  "description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
20
30
  "visible": false
21
31
  },
22
32
  "project": {
23
33
  "type": "string",
24
34
  "description": "The name of the project to add the component to.",
25
- "$default": { "$source": "projectName" }
35
+ "$default": {
36
+ "$source": "projectName"
37
+ }
26
38
  }
27
39
  },
28
- "required": ["name", "project"]
40
+ "required": [
41
+ "name",
42
+ "project"
43
+ ]
29
44
  }
@@ -1,33 +1,9 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-danger: #b42318;
4
- --semmet-color-surface: #ffffff;
5
- --semmet-color-outline: #d4d4d8;
6
- --semmet-color-on-surface: #18181b;
7
- --semmet-color-on-surface-variant: #52525b;
8
- --semmet-color-disabled: #f4f4f5;
9
- --semmet-radius-sm: 8px;
10
- --semmet-space-2xs: 8px;
11
- --semmet-space-xs: 16px;
12
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
13
-
14
2
  display: block;
15
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
16
- font-size: 0.9375rem;
17
3
  }
18
4
 
19
5
  .semmet-field {
20
6
  display: grid;
21
- gap: var(--semmet-space-2xs);
22
- }
23
-
24
- label {
25
- font-weight: 500;
26
- color: var(--semmet-color-on-surface);
27
- }
28
-
29
- label span {
30
- color: var(--semmet-color-danger);
31
7
  }
32
8
 
33
9
  textarea {
@@ -35,63 +11,30 @@ textarea {
35
11
  min-height: 7rem;
36
12
  box-sizing: border-box;
37
13
  resize: vertical;
38
- border: 1px solid var(--semmet-color-outline);
39
- border-radius: var(--semmet-radius-sm);
40
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
41
14
  font: inherit;
42
- line-height: 1.5;
43
- color: var(--semmet-color-on-surface);
44
- background: var(--semmet-color-surface);
45
- transition:
46
- border-color var(--semmet-motion),
47
- box-shadow var(--semmet-motion),
48
- background-color var(--semmet-motion);
49
- }
50
-
51
- textarea::placeholder {
52
- color: var(--semmet-color-on-surface-variant);
53
- }
54
-
55
- textarea[aria-invalid='true'] {
56
- border-color: var(--semmet-color-danger);
57
15
  }
58
16
 
59
17
  textarea:disabled {
60
- color: var(--semmet-color-on-surface-variant);
61
- background: var(--semmet-color-disabled);
62
18
  cursor: not-allowed;
63
19
  }
64
20
 
65
21
  textarea:focus-visible {
66
- outline: 2px solid var(--semmet-color-primary);
67
- outline-offset: 1px;
68
- border-color: var(--semmet-color-primary);
22
+ outline: 2px solid currentColor;
23
+ outline-offset: 2px;
69
24
  }
70
25
 
71
26
  .semmet-field__meta {
72
27
  display: flex;
73
28
  align-items: flex-start;
74
29
  justify-content: space-between;
75
- gap: var(--semmet-space-xs);
76
30
  }
77
31
 
78
32
  .semmet-field__hint,
79
33
  .semmet-field__counter,
80
34
  .semmet-field__error {
81
35
  margin: 0;
82
- font-size: 0.8125rem;
83
- line-height: 1.4;
84
- }
85
-
86
- .semmet-field__hint,
87
- .semmet-field__counter {
88
- color: var(--semmet-color-on-surface-variant);
89
36
  }
90
37
 
91
38
  .semmet-field__counter {
92
39
  white-space: nowrap;
93
40
  }
94
-
95
- .semmet-field__error {
96
- color: var(--semmet-color-danger);
97
- }