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
@@ -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 button 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,29 +1,9 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-on-primary: #ffffff;
4
- --semmet-color-surface: #ffffff;
5
- --semmet-color-surface-muted: #f4f4f5;
6
- --semmet-color-outline: #d4d4d8;
7
- --semmet-color-on-surface: #27272a;
8
- --semmet-radius-sm: 8px;
9
- --semmet-space-2xs: 8px;
10
- --semmet-space-xs: 16px;
11
- --semmet-space-sm: 24px;
12
- --semmet-target-sm: 32px;
13
- --semmet-target-md: 40px;
14
- --semmet-target-lg: 48px;
15
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
16
-
17
2
  display: inline-block;
18
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
19
3
  }
20
4
 
21
5
  .semmet-button-group {
22
6
  display: inline-flex;
23
- border: 1px solid var(--semmet-color-outline);
24
- border-radius: var(--semmet-radius-sm);
25
- overflow: hidden;
26
- background: var(--semmet-color-surface);
27
7
  }
28
8
 
29
9
  .semmet-button-group--vertical {
@@ -34,56 +14,8 @@
34
14
  display: inline-flex;
35
15
  align-items: center;
36
16
  justify-content: center;
37
- min-width: 2.75rem;
38
- border: 0;
39
- border-inline-end: 1px solid var(--semmet-color-outline);
40
- color: var(--semmet-color-on-surface);
41
- background: var(--semmet-color-surface);
42
17
  font: inherit;
43
- font-weight: 650;
44
- line-height: 1.2;
45
- white-space: nowrap;
46
18
  cursor: pointer;
47
- transition:
48
- background-color var(--semmet-motion),
49
- color var(--semmet-motion),
50
- opacity var(--semmet-motion);
51
- }
52
-
53
- .semmet-button-group--vertical .semmet-button-group__button {
54
- border-inline-end: 0;
55
- border-block-end: 1px solid var(--semmet-color-outline);
56
- }
57
-
58
- .semmet-button-group__button:last-child {
59
- border-inline-end: 0;
60
- border-block-end: 0;
61
- }
62
-
63
- .semmet-button-group--sm .semmet-button-group__button {
64
- min-height: var(--semmet-target-sm);
65
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
66
- font-size: 0.875rem;
67
- }
68
-
69
- .semmet-button-group--md .semmet-button-group__button {
70
- min-height: var(--semmet-target-md);
71
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
72
- }
73
-
74
- .semmet-button-group--lg .semmet-button-group__button {
75
- min-height: var(--semmet-target-lg);
76
- padding: var(--semmet-space-xs) var(--semmet-space-sm);
77
- font-size: 1rem;
78
- }
79
-
80
- .semmet-button-group__button:hover:not(:disabled) {
81
- background: var(--semmet-color-surface-muted);
82
- }
83
-
84
- .semmet-button-group__button--pressed {
85
- color: var(--semmet-color-on-primary);
86
- background: var(--semmet-color-primary);
87
19
  }
88
20
 
89
21
  .semmet-button-group__button:disabled {
@@ -94,6 +26,6 @@
94
26
  .semmet-button-group__button:focus-visible {
95
27
  position: relative;
96
28
  z-index: 1;
97
- outline: 2px solid var(--semmet-color-primary);
98
- outline-offset: -2px;
29
+ outline: 2px solid currentColor;
30
+ outline-offset: 2px;
99
31
  }
@@ -3,7 +3,6 @@ import { Component, Directive, TemplateRef, booleanAttribute, computed, contentC
3
3
 
4
4
  type <%= classify(name) %>Orientation = 'horizontal' | 'vertical';
5
5
  type <%= classify(name) %>SelectionMode = 'none' | 'single' | 'multiple';
6
- type <%= classify(name) %>Size = 'sm' | 'md' | 'lg';
7
6
 
8
7
  export interface <%= classify(name) %>Item {
9
8
  id: string;
@@ -41,7 +40,7 @@ export class <%= classify(name) %> {
41
40
  readonly label = input('View options');
42
41
  readonly orientation = input<<%= classify(name) %>Orientation>('horizontal');
43
42
  readonly selectionMode = input<<%= classify(name) %>SelectionMode>('single');
44
- readonly size = input<<%= classify(name) %>Size>('md');
43
+ readonly size = input<string>('md');
45
44
  readonly disabled = input(false, { transform: booleanAttribute });
46
45
  readonly items = input<readonly <%= classify(name) %>Item[]>(DEFAULT_ITEMS);
47
46
  readonly selectedIds = model<readonly string[]>(DEFAULT_SELECTED_IDS);
@@ -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 button group 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,67 +0,0 @@
1
- :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-surface: #ffffff;
4
- --semmet-color-outline: #d4d4d8;
5
- --semmet-color-on-surface: #18181b;
6
- --semmet-color-on-surface-variant: #52525b;
7
- --semmet-radius-md: 12px;
8
- --semmet-space-2xs: 8px;
9
- --semmet-space-xs: 16px;
10
- --semmet-space-sm: 24px;
11
-
12
- display: block;
13
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
14
- font-size: 0.9375rem;
15
- }
16
-
17
- article {
18
- overflow: hidden;
19
- background: var(--semmet-color-surface);
20
- border: 1px solid var(--semmet-color-outline);
21
- border-radius: var(--semmet-radius-md);
22
- }
23
-
24
- h3 {
25
- margin: var(--semmet-space-sm) var(--semmet-space-sm) var(--semmet-space-2xs);
26
- font-size: 1.0625rem;
27
- font-weight: 500;
28
- color: var(--semmet-color-on-surface);
29
- }
30
-
31
- p {
32
- margin: 0;
33
- }
34
-
35
- .semmet-card__media :is(img, video, svg) {
36
- display: block;
37
- width: 100%;
38
- height: auto;
39
- }
40
-
41
- .semmet-card__description {
42
- margin: 0 var(--semmet-space-sm) var(--semmet-space-xs);
43
- color: var(--semmet-color-on-surface-variant);
44
- }
45
-
46
- .semmet-card__actions {
47
- display: flex;
48
- flex-wrap: wrap;
49
- gap: var(--semmet-space-xs);
50
- margin: 0 var(--semmet-space-sm) var(--semmet-space-sm);
51
- }
52
-
53
- a {
54
- color: var(--semmet-color-primary);
55
- font-weight: 500;
56
- text-decoration: none;
57
- border-radius: 4px;
58
- }
59
-
60
- a:hover {
61
- text-decoration: underline;
62
- }
63
-
64
- a:focus-visible {
65
- outline: 2px solid var(--semmet-color-primary);
66
- outline-offset: 2px;
67
- }
@@ -1,62 +1,17 @@
1
- <!-- Semmet Angular: Card https://www.w3.org/WAI/tutorials/page-structure/headings/ -->
1
+ <!-- Semmet Angular: Card - semantic article with a required accessible heading anchor. -->
2
2
  <!--
3
3
  Usage from a parent component template:
4
- Import <%= classify(name) %> and any slot directives you use in that parent component.
5
-
6
- <<%= selector %> title="Accessible components" description="Generate Angular components with ARIA." />
4
+ Import <%= classify(name) %> in that parent component.
7
5
 
8
6
  <<%= selector %>>
9
- <ng-template <%= camelize(name) %>Media>
10
- <img src="..." alt="..." />
11
- </ng-template>
12
-
13
- <ng-template <%= camelize(name) %>Title>
14
- Accessible components
15
- </ng-template>
16
-
17
- <ng-template <%= camelize(name) %>Description>
18
- Generate Angular components with ARIA, keyboard behavior and signals.
19
- </ng-template>
20
-
21
- <ng-template <%= camelize(name) %>Actions>
22
- <a href="/docs">Read docs</a>
23
- </ng-template>
7
+ <h3 <%= camelize(name) %>Heading>Accessible components</h3>
8
+ <p>Generate Angular components with ARIA, keyboard behavior and signals.</p>
9
+ <a href="/docs">Read docs</a>
24
10
  </<%= selector %>>
25
11
  -->
26
- <article [attr.aria-labelledby]="labelledBy()">
27
- @if (media(); as mediaSlot) {
28
- <div class="semmet-card__media">
29
- <ng-container [ngTemplateOutlet]="mediaSlot.templateRef" />
30
- </div>
31
- }
32
-
33
- @if (hasTitle()) {
34
- <h3 [id]="instanceId + '-title'">
35
- @if (titleTemplate(); as titleSlot) {
36
- <ng-container [ngTemplateOutlet]="titleSlot.templateRef" />
37
- } @else {
38
- {{ title() }}
39
- }
40
- </h3>
41
- }
42
-
43
- @if (hasDescription()) {
44
- <div class="semmet-card__description">
45
- @if (descriptionTemplate(); as descriptionSlot) {
46
- <ng-container [ngTemplateOutlet]="descriptionSlot.templateRef" />
47
- } @else {
48
- <p>{{ description() }}</p>
49
- }
50
- </div>
51
- }
52
-
53
- @if (hasActions()) {
54
- <div class="semmet-card__actions">
55
- @if (actions(); as actionsSlot) {
56
- <ng-container [ngTemplateOutlet]="actionsSlot.templateRef" />
57
- } @else {
58
- <a [href]="linkHref()">{{ linkLabel() }}</a>
59
- }
60
- </div>
61
- }
12
+ <article [attr.aria-labelledby]="instanceId + '-heading'">
13
+ <div [id]="instanceId + '-heading'">
14
+ <ng-content select="[<%= camelize(name) %>Heading]" />
15
+ </div>
16
+ <ng-content />
62
17
  </article>
@@ -1,56 +1,13 @@
1
- import { NgTemplateOutlet } from '@angular/common';
2
- import { Component, Directive, TemplateRef, computed, contentChild, inject, input } from '@angular/core';
1
+ import { Component } from '@angular/core';
3
2
 
4
3
  let nextId = 0;
5
4
 
6
- @Directive({
7
- selector: 'ng-template[<%= camelize(name) %>Media]',
8
- })
9
- export class <%= classify(name) %>Media {
10
- readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);
11
- }
12
-
13
- @Directive({
14
- selector: 'ng-template[<%= camelize(name) %>Title]',
15
- })
16
- export class <%= classify(name) %>Title {
17
- readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);
18
- }
19
-
20
- @Directive({
21
- selector: 'ng-template[<%= camelize(name) %>Description]',
22
- })
23
- export class <%= classify(name) %>Description {
24
- readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);
25
- }
26
-
27
- @Directive({
28
- selector: 'ng-template[<%= camelize(name) %>Actions]',
29
- })
30
- export class <%= classify(name) %>Actions {
31
- readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);
32
- }
33
-
34
5
  @Component({
35
6
  selector: '<%= selector %>',
36
- imports: [NgTemplateOutlet],
7
+ imports: [],
37
8
  templateUrl: './<%= dasherize(name) %>.html',
38
9
  styleUrl: './<%= dasherize(name) %>.css',
39
10
  })
40
11
  export class <%= classify(name) %> {
41
- protected readonly media = contentChild(<%= classify(name) %>Media);
42
- protected readonly titleTemplate = contentChild(<%= classify(name) %>Title);
43
- protected readonly descriptionTemplate = contentChild(<%= classify(name) %>Description);
44
- protected readonly actions = contentChild(<%= classify(name) %>Actions);
45
12
  protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
46
-
47
- readonly title = input('Card title');
48
- readonly description = input('Card description text.');
49
- readonly linkHref = input('#');
50
- readonly linkLabel = input('Learn more');
51
-
52
- protected readonly hasTitle = computed(() => Boolean(this.titleTemplate()) || this.title().trim().length > 0);
53
- protected readonly labelledBy = computed(() => this.hasTitle() ? `${this.instanceId}-title` : null);
54
- protected readonly hasDescription = computed(() => Boolean(this.descriptionTemplate()) || this.description().trim().length > 0);
55
- protected readonly hasActions = computed(() => Boolean(this.actions()) || this.linkLabel().trim().length > 0);
56
13
  }
@@ -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 card 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,18 +1,5 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-on-primary: #ffffff;
4
- --semmet-color-surface: #ffffff;
5
- --semmet-color-outline: #d4d4d8;
6
- --semmet-color-on-surface: #18181b;
7
- --semmet-radius-md: 12px;
8
- --semmet-space-xs: 16px;
9
- --semmet-space-sm: 24px;
10
- --semmet-target-md: 40px;
11
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
12
-
13
2
  display: block;
14
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
15
- font-size: 0.9375rem;
16
3
  }
17
4
 
18
5
  section {
@@ -20,7 +7,6 @@ section {
20
7
  display: grid;
21
8
  grid-template-columns: auto minmax(0, 1fr) auto;
22
9
  align-items: center;
23
- gap: var(--semmet-space-xs);
24
10
  }
25
11
 
26
12
  [aria-live] {
@@ -29,29 +15,13 @@ section {
29
15
  display: flex;
30
16
  align-items: center;
31
17
  justify-content: center;
32
- padding: var(--semmet-space-sm);
33
- color: var(--semmet-color-on-surface);
34
- background: var(--semmet-color-surface);
35
- border: 1px solid var(--semmet-color-outline);
36
- border-radius: var(--semmet-radius-md);
37
18
  text-align: center;
38
19
  }
39
20
 
40
21
  button {
41
22
  flex-shrink: 0;
42
- width: var(--semmet-target-md);
43
- height: var(--semmet-target-md);
44
- font-size: 1.25rem;
45
- color: var(--semmet-color-on-primary);
46
- background: var(--semmet-color-primary);
47
- border: none;
48
- border-radius: 50%;
23
+ font: inherit;
49
24
  cursor: pointer;
50
- transition: background-color var(--semmet-motion);
51
- }
52
-
53
- button:hover {
54
- background: color-mix(in srgb, var(--semmet-color-primary) 88%, black);
55
25
  }
56
26
 
57
27
  button:disabled {
@@ -60,6 +30,6 @@ button:disabled {
60
30
  }
61
31
 
62
32
  button:focus-visible {
63
- outline: 2px solid var(--semmet-color-primary);
33
+ outline: 2px solid currentColor;
64
34
  outline-offset: 2px;
65
35
  }
@@ -3,7 +3,7 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> and <%= classify(name) %>Slide in that parent component.
5
5
 
6
- <<%= selector %>>
6
+ <<%= selector %> label="Featured items">
7
7
  <ng-template <%= camelize(name) %>Slide id="intro" label="Introduction">
8
8
  <app-intro-slide />
9
9
  </ng-template>
@@ -15,8 +15,8 @@ Import <%= classify(name) %> and <%= classify(name) %>Slide in that parent compo
15
15
 
16
16
  Set [preserveContent]="false" on <<%= selector %>> to destroy inactive slide content.
17
17
  -->
18
- <section aria-roledescription="carousel" aria-label="Featured items">
19
- <button type="button" [disabled]="slides().length <= 1" (click)="previous()" aria-label="Previous slide">‹</button>
18
+ <section aria-roledescription="carousel" [attr.aria-label]="label()">
19
+ <button type="button" [disabled]="slides().length <= 1" (click)="previous()" [attr.aria-label]="previousLabel()">‹</button>
20
20
  <div aria-live="polite">
21
21
  @for (slide of slides(); track slide.id(); let i = $index) {
22
22
  <div
@@ -30,5 +30,5 @@ Set [preserveContent]="false" on <<%= selector %>> to destroy inactive slide con
30
30
  </div>
31
31
  }
32
32
  </div>
33
- <button type="button" [disabled]="slides().length <= 1" (click)="next()" aria-label="Next slide">›</button>
33
+ <button type="button" [disabled]="slides().length <= 1" (click)="next()" [attr.aria-label]="nextLabel()">›</button>
34
34
  </section>
@@ -35,6 +35,10 @@ export class <%= classify(name) %>Slide {
35
35
  export class <%= classify(name) %> {
36
36
  protected readonly slides = contentChildren(<%= classify(name) %>Slide);
37
37
  protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
38
+
39
+ readonly label = input('Featured items');
40
+ readonly previousLabel = input('Previous slide');
41
+ readonly nextLabel = input('Next slide');
38
42
  readonly preserveContent = input(true, { transform: booleanAttribute });
39
43
 
40
44
  protected readonly activeIndex = signal(0);
@@ -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 carousel 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,24 +1,12 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-on-primary: #ffffff;
4
- --semmet-color-outline: #71717a;
5
- --semmet-color-on-surface: #18181b;
6
- --semmet-space-sm: 24px;
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='checkbox'] {
16
6
  position: relative;
17
7
  display: inline-flex;
18
8
  align-items: center;
19
- padding-left: var(--semmet-space-sm);
20
- min-height: var(--semmet-target-sm);
21
- color: var(--semmet-color-on-surface);
9
+ padding-left: 1.5rem;
22
10
  cursor: pointer;
23
11
  user-select: none;
24
12
  }
@@ -30,15 +18,12 @@
30
18
  width: 1.125rem;
31
19
  height: 1.125rem;
32
20
  box-sizing: border-box;
33
- border: 2px solid var(--semmet-color-outline);
34
- border-radius: 4px;
21
+ border: 2px solid currentColor;
35
22
  background: transparent;
36
- transition: background-color var(--semmet-motion), border-color var(--semmet-motion);
37
23
  }
38
24
 
39
25
  [role='checkbox'][aria-checked='true']::before {
40
- background: var(--semmet-color-primary);
41
- border-color: var(--semmet-color-primary);
26
+ background: currentColor;
42
27
  }
43
28
 
44
29
  [role='checkbox']::after {
@@ -54,11 +39,10 @@
54
39
  }
55
40
 
56
41
  [role='checkbox'][aria-checked='true']::after {
57
- border-color: var(--semmet-color-on-primary);
42
+ border-color: Canvas;
58
43
  }
59
44
 
60
45
  [role='checkbox']:focus-visible {
61
- outline: 2px solid var(--semmet-color-primary);
46
+ outline: 2px solid currentColor;
62
47
  outline-offset: 2px;
63
- border-radius: 4px;
64
48
  }