semmet-angular 0.42.0 → 0.43.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 (202) hide show
  1. package/README.en.md +2 -315
  2. package/README.md +169 -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 +15 -0
  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/form/files/__name@dasherize__/__name@dasherize__.css.template +1 -77
  69. package/src/form/files/__name@dasherize__/__name@dasherize__.html.template +7 -7
  70. package/src/form/files/__name@dasherize__/__name@dasherize__.ts.template +20 -7
  71. package/src/form/schema.json +19 -4
  72. package/src/input/files/__name@dasherize__/__name@dasherize__.css.template +2 -58
  73. package/src/input/schema.json +19 -4
  74. package/src/input-group/files/__name@dasherize__/__name@dasherize__.css.template +2 -68
  75. package/src/input-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -5
  76. package/src/input-group/files/__name@dasherize__/__name@dasherize__.ts.template +21 -6
  77. package/src/input-group/schema.json +19 -4
  78. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.css.template +0 -24
  79. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  80. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
  81. package/src/landmarks/schema.json +19 -4
  82. package/src/list-group/files/__name@dasherize__/__name@dasherize__.css.template +0 -123
  83. package/src/list-group/files/__name@dasherize__/__name@dasherize__.e2e-spec.ts.template +8 -9
  84. package/src/list-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -47
  85. package/src/list-group/files/__name@dasherize__/__name@dasherize__.spec.ts.template +46 -24
  86. package/src/list-group/files/__name@dasherize__/__name@dasherize__.ts.template +97 -39
  87. package/src/list-group/schema.json +19 -4
  88. package/src/listbox/files/__name@dasherize__/__name@dasherize__.css.template +3 -37
  89. package/src/listbox/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  90. package/src/listbox/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  91. package/src/listbox/schema.json +19 -4
  92. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.css.template +7 -47
  93. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  94. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.ts.template +10 -7
  95. package/src/menu-button/schema.json +19 -4
  96. package/src/meter/files/__name@dasherize__/__name@dasherize__.css.template +0 -12
  97. package/src/meter/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  98. package/src/meter/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  99. package/src/meter/schema.json +19 -4
  100. package/src/navbar/files/__name@dasherize__/__name@dasherize__.css.template +6 -62
  101. package/src/navbar/schema.json +19 -4
  102. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.css.template +6 -37
  103. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.html.template +7 -6
  104. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.ts.template +15 -1
  105. package/src/navigation-menu/schema.json +19 -4
  106. package/src/offcanvas/files/__name@dasherize__/__name@dasherize__.css.template +3 -70
  107. package/src/offcanvas/schema.json +19 -4
  108. package/src/pagination/files/__name@dasherize__/__name@dasherize__.css.template +2 -33
  109. package/src/pagination/files/__name@dasherize__/__name@dasherize__.html.template +6 -6
  110. package/src/pagination/files/__name@dasherize__/__name@dasherize__.ts.template +7 -1
  111. package/src/pagination/schema.json +19 -4
  112. package/src/popover/files/__name@dasherize__/__name@dasherize__.css.template +8 -69
  113. package/src/popover/schema.json +19 -4
  114. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.css.template +1 -31
  115. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  116. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  117. package/src/progress-bar/schema.json +19 -4
  118. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.css.template +4 -31
  119. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  120. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.ts.template +2 -1
  121. package/src/radio-group/schema.json +19 -4
  122. package/src/rating/files/__name@dasherize__/__name@dasherize__.css.template +17 -0
  123. package/src/rating/files/__name@dasherize__/__name@dasherize__.html.template +34 -0
  124. package/src/rating/files/__name@dasherize__/__name@dasherize__.spec.ts.template +38 -0
  125. package/src/rating/files/__name@dasherize__/__name@dasherize__.ts.template +75 -0
  126. package/src/rating/index.d.ts +1 -0
  127. package/src/rating/index.js +6 -0
  128. package/src/rating/index.js.map +1 -0
  129. package/src/rating/index.ts +3 -0
  130. package/src/rating/schema.d.ts +1 -0
  131. package/src/rating/schema.js +3 -0
  132. package/src/rating/schema.js.map +1 -0
  133. package/src/rating/schema.json +44 -0
  134. package/src/rating/schema.ts +1 -0
  135. package/src/select/files/__name@dasherize__/__name@dasherize__.css.template +4 -55
  136. package/src/select/schema.json +19 -4
  137. package/src/skeleton/files/__name@dasherize__/__name@dasherize__.css.template +2 -29
  138. package/src/skeleton/files/__name@dasherize__/__name@dasherize__.ts.template +1 -3
  139. package/src/skeleton/schema.json +19 -4
  140. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.css.template +2 -14
  141. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  142. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
  143. package/src/skip-link/schema.json +19 -4
  144. package/src/slider/files/__name@dasherize__/__name@dasherize__.css.template +6 -20
  145. package/src/slider/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  146. package/src/slider/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  147. package/src/slider/schema.json +19 -4
  148. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.css.template +6 -35
  149. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  150. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  151. package/src/spinbutton/schema.json +19 -4
  152. package/src/spinner/files/__name@dasherize__/__name@dasherize__.css.template +0 -43
  153. package/src/spinner/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  154. package/src/spinner/schema.json +19 -4
  155. package/src/steps/files/__name@dasherize__/__name@dasherize__.css.template +36 -0
  156. package/src/steps/files/__name@dasherize__/__name@dasherize__.html.template +44 -0
  157. package/src/steps/files/__name@dasherize__/__name@dasherize__.spec.ts.template +35 -0
  158. package/src/steps/files/__name@dasherize__/__name@dasherize__.ts.template +107 -0
  159. package/src/steps/index.d.ts +1 -0
  160. package/src/steps/index.js +6 -0
  161. package/src/steps/index.js.map +1 -0
  162. package/src/steps/index.ts +3 -0
  163. package/src/steps/schema.d.ts +1 -0
  164. package/src/steps/schema.js +3 -0
  165. package/src/steps/schema.js.map +1 -0
  166. package/src/steps/schema.json +44 -0
  167. package/src/steps/schema.ts +1 -0
  168. package/src/switch/files/__name@dasherize__/__name@dasherize__.css.template +7 -22
  169. package/src/switch/schema.json +19 -4
  170. package/src/table/files/__name@dasherize__/__name@dasherize__.css.template +0 -25
  171. package/src/table/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  172. package/src/table/files/__name@dasherize__/__name@dasherize__.ts.template +3 -0
  173. package/src/table/schema.json +19 -4
  174. package/src/tabs/files/__name@dasherize__/__name@dasherize__.css.template +5 -44
  175. package/src/tabs/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  176. package/src/tabs/files/__name@dasherize__/__name@dasherize__.ts.template +2 -0
  177. package/src/tabs/schema.json +19 -4
  178. package/src/textarea/files/__name@dasherize__/__name@dasherize__.css.template +2 -59
  179. package/src/textarea/schema.json +19 -4
  180. package/src/toast/files/__name@dasherize__/__name@dasherize__.css.template +1 -35
  181. package/src/toast/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  182. package/src/toast/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  183. package/src/toast/schema.json +19 -4
  184. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.css.template +2 -36
  185. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  186. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.ts.template +11 -8
  187. package/src/toolbar/schema.json +19 -4
  188. package/src/tooltip/files/__name@dasherize__/__name@dasherize__.css.template +1 -32
  189. package/src/tooltip/schema.json +19 -4
  190. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.css.template +5 -27
  191. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  192. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.ts.template +16 -13
  193. package/src/tree-view/schema.json +19 -4
  194. package/src/utils/generate-component.js +3 -1
  195. package/src/utils/generate-component.js.map +1 -1
  196. package/src/utils/generate-component.ts +3 -1
  197. package/src/utils/generate-composition.js +0 -1
  198. package/src/utils/generate-composition.js.map +1 -1
  199. package/src/utils/generate-composition.ts +0 -1
  200. package/src/utils/schema-types.d.ts +1 -0
  201. package/src/utils/schema-types.ts +1 -0
  202. package/README.pt-BR.md +0 -330
@@ -1,56 +1,22 @@
1
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-radius-sm: 8px;
7
- --semmet-space-2xs: 8px;
8
- --semmet-space-xs: 16px;
9
- --semmet-target-md: 40px;
10
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
11
-
12
2
  display: block;
13
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
14
- font-size: 0.9375rem;
15
3
  }
16
4
 
17
5
  span {
18
6
  display: block;
19
- margin-bottom: var(--semmet-space-2xs);
20
- font-weight: 500;
21
- color: var(--semmet-color-on-surface);
22
7
  }
23
8
 
24
9
  ul {
25
10
  margin: 0;
26
- padding: var(--semmet-space-2xs);
11
+ padding: 0;
27
12
  list-style: none;
28
- border: 1px solid var(--semmet-color-outline);
29
- border-radius: var(--semmet-radius-sm);
30
- background: var(--semmet-color-surface);
31
- max-width: 16rem;
32
13
  }
33
14
 
34
15
  ul:focus-visible {
35
- outline: 2px solid var(--semmet-color-primary);
36
- outline-offset: 1px;
16
+ outline: 2px solid currentColor;
17
+ outline-offset: 2px;
37
18
  }
38
19
 
39
20
  [role='option'] {
40
- min-height: var(--semmet-target-md);
41
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
42
- border-radius: 6px;
43
- color: var(--semmet-color-on-surface);
44
21
  cursor: pointer;
45
- transition: background-color var(--semmet-motion);
46
- }
47
-
48
- [role='option'][aria-selected='true'] {
49
- background: color-mix(in srgb, var(--semmet-color-primary) 12%, transparent);
50
- color: var(--semmet-color-primary);
51
- font-weight: 500;
52
- }
53
-
54
- [role='option']:hover {
55
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
56
22
  }
@@ -3,9 +3,9 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> in that parent component.
5
5
 
6
- <<%= selector %> />
6
+ <<%= selector %> label="Choose an option" />
7
7
  -->
8
- <span [id]="instanceId + '-label'">Choose an option</span>
8
+ <span [id]="instanceId + '-label'">{{ label() }}</span>
9
9
  <ul
10
10
  role="listbox"
11
11
  [attr.aria-labelledby]="instanceId + '-label'"
@@ -1,4 +1,4 @@
1
- import { Component, computed, signal } from '@angular/core';
1
+ import { Component, computed, input, signal } from '@angular/core';
2
2
 
3
3
  interface <%= classify(name) %>Option {
4
4
  id: number;
@@ -22,6 +22,8 @@ export class <%= classify(name) %> {
22
22
 
23
23
  protected readonly activeIndex = signal(0);
24
24
 
25
+ readonly label = input('Choose an option');
26
+
25
27
  protected readonly activeDescendantId = computed(
26
28
  () => `${this.instanceId}-option-${this.options[this.activeIndex()].id}`
27
29
  );
@@ -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 listbox 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,46 +1,17 @@
1
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-sm: 8px;
8
- --semmet-radius-md: 12px;
9
- --semmet-space-3xs: 4px;
10
- --semmet-space-2xs: 8px;
11
- --semmet-space-xs: 16px;
12
- --semmet-target-md: 40px;
13
- --semmet-elevation-3: 0 8px 24px rgba(20, 24, 23, 0.18), 0 2px 8px rgba(20, 24, 23, 0.1);
14
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
15
-
16
2
  position: relative;
17
3
  display: inline-block;
18
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
19
- font-size: 0.9375rem;
20
4
  }
21
5
 
22
6
  button {
23
7
  display: flex;
24
8
  align-items: center;
25
- gap: var(--semmet-space-2xs);
26
- min-height: var(--semmet-target-md);
27
9
  font: inherit;
28
- font-weight: 500;
29
- color: var(--semmet-color-on-surface);
30
- background: var(--semmet-color-surface);
31
- border: 1px solid var(--semmet-color-outline);
32
- border-radius: var(--semmet-radius-sm);
33
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
34
10
  cursor: pointer;
35
- transition: background-color var(--semmet-motion);
36
- }
37
-
38
- button:hover {
39
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
40
11
  }
41
12
 
42
13
  button:focus-visible {
43
- outline: 2px solid var(--semmet-color-primary);
14
+ outline: 2px solid currentColor;
44
15
  outline-offset: 2px;
45
16
  }
46
17
 
@@ -48,10 +19,9 @@ button::after {
48
19
  content: '';
49
20
  width: 0.4rem;
50
21
  height: 0.4rem;
51
- border-right: 2px solid var(--semmet-color-on-surface-variant);
52
- border-bottom: 2px solid var(--semmet-color-on-surface-variant);
22
+ border-right: 2px solid currentColor;
23
+ border-bottom: 2px solid currentColor;
53
24
  transform: rotate(45deg);
54
- transition: transform var(--semmet-motion);
55
25
  }
56
26
 
57
27
  button[aria-expanded='true']::after {
@@ -61,28 +31,18 @@ button[aria-expanded='true']::after {
61
31
  ul {
62
32
  position: absolute;
63
33
  z-index: 1;
64
- top: calc(100% + var(--semmet-space-3xs));
34
+ top: 100%;
65
35
  left: 0;
66
- min-width: 10rem;
67
36
  margin: 0;
68
- padding: var(--semmet-space-2xs);
37
+ padding: 0;
69
38
  list-style: none;
70
- background: var(--semmet-color-surface);
71
- border-radius: var(--semmet-radius-md);
72
- box-shadow: var(--semmet-elevation-3);
73
39
  }
74
40
 
75
41
  [role='menuitem'] {
76
- min-height: var(--semmet-target-md);
77
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
78
- border-radius: 6px;
79
- color: var(--semmet-color-on-surface);
80
42
  cursor: pointer;
81
- transition: background-color var(--semmet-motion);
82
43
  }
83
44
 
84
- [role='menuitem']:hover,
85
45
  [role='menuitem']:focus-visible {
86
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
87
- outline: none;
46
+ outline: 2px solid currentColor;
47
+ outline-offset: 2px;
88
48
  }
@@ -3,7 +3,7 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> in that parent component.
5
5
 
6
- <<%= selector %> />
6
+ <<%= selector %> label="Options" [items]="menuItems" />
7
7
  -->
8
8
  <button
9
9
  #menuButton
@@ -15,7 +15,7 @@ Import <%= classify(name) %> in that parent component.
15
15
  (click)="toggle()"
16
16
  (keydown)="handleButtonKeydown($event)"
17
17
  >
18
- Options
18
+ {{ label() }}
19
19
  </button>
20
20
  <ul
21
21
  #menu
@@ -24,7 +24,7 @@ Import <%= classify(name) %> in that parent component.
24
24
  [attr.aria-labelledby]="instanceId + '-button'"
25
25
  [hidden]="!isOpen()"
26
26
  >
27
- @for (item of items; track item.id; let i = $index) {
27
+ @for (item of items(); track item.id; let i = $index) {
28
28
  <li role="none">
29
29
  <div
30
30
  #menuItem
@@ -1,10 +1,16 @@
1
- import { Component, ElementRef, Injector, afterNextRender, inject, signal, viewChild, viewChildren } from '@angular/core';
1
+ import { Component, ElementRef, Injector, afterNextRender, inject, input, signal, viewChild, viewChildren } from '@angular/core';
2
2
 
3
3
  interface <%= classify(name) %>Item {
4
4
  id: number;
5
5
  label: string;
6
6
  }
7
7
 
8
+ const DEFAULT_ITEMS: readonly <%= classify(name) %>Item[] = [
9
+ { id: 1, label: 'First option' },
10
+ { id: 2, label: 'Second option' },
11
+ { id: 3, label: 'Third option' },
12
+ ];
13
+
8
14
  let nextId = 0;
9
15
 
10
16
  @Component({
@@ -23,14 +29,11 @@ export class <%= classify(name) %> {
23
29
  private readonly menuItems = viewChildren<ElementRef<HTMLElement>>('menuItem');
24
30
 
25
31
  protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
26
- protected readonly items: <%= classify(name) %>Item[] = [
27
- { id: 1, label: 'First option' },
28
- { id: 2, label: 'Second option' },
29
- { id: 3, label: 'Third option' },
30
- ];
31
-
32
32
  protected readonly isOpen = signal(false);
33
33
 
34
+ readonly label = input('Options');
35
+ readonly items = input<readonly <%= classify(name) %>Item[]>(DEFAULT_ITEMS);
36
+
34
37
  protected toggle(): void {
35
38
  this.isOpen.set(true);
36
39
  this.focusFirstItem();
@@ -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 menu 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,23 +1,11 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-on-surface: #18181b;
4
- --semmet-space-2xs: 8px;
5
-
6
2
  display: block;
7
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
8
- font-size: 0.9375rem;
9
3
  }
10
4
 
11
5
  label {
12
6
  display: block;
13
- margin-bottom: var(--semmet-space-2xs);
14
- font-weight: 500;
15
- color: var(--semmet-color-on-surface);
16
7
  }
17
8
 
18
9
  meter {
19
10
  width: 100%;
20
- max-width: 20rem;
21
- height: 0.75rem;
22
- accent-color: var(--semmet-color-primary);
23
11
  }
@@ -3,9 +3,9 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> in that parent component.
5
5
 
6
- <<%= selector %> />
6
+ <<%= selector %> label="Disk usage" />
7
7
  -->
8
- <label [for]="instanceId">Disk usage</label>
8
+ <label [for]="instanceId">{{ label() }}</label>
9
9
  <meter [id]="instanceId" min="0" max="100" [value]="value()" low="50" high="90" optimum="0">
10
10
  {{ value() }}%
11
11
  </meter>
@@ -1,4 +1,4 @@
1
- import { Component, signal } from '@angular/core';
1
+ import { Component, input, signal } from '@angular/core';
2
2
 
3
3
  let nextId = 0;
4
4
 
@@ -11,4 +11,6 @@ let nextId = 0;
11
11
  export class <%= classify(name) %> {
12
12
  protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
13
13
  protected readonly value = signal(70);
14
+
15
+ readonly label = input('Disk usage');
14
16
  }
@@ -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 meter 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,40 +1,17 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-surface: #ffffff;
4
- --semmet-color-surface-muted: #f4f4f5;
5
- --semmet-color-outline: #d4d4d8;
6
- --semmet-color-on-surface: #27272a;
7
- --semmet-color-on-surface-variant: #71717a;
8
- --semmet-radius-md: 10px;
9
- --semmet-space-3xs: 4px;
10
- --semmet-space-2xs: 8px;
11
- --semmet-space-xs: 16px;
12
- --semmet-target-md: 40px;
13
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
14
-
15
2
  display: block;
16
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
17
3
  }
18
4
 
19
5
  .semmet-navbar {
20
6
  display: grid;
21
7
  grid-template-columns: 1fr auto;
22
8
  align-items: center;
23
- gap: var(--semmet-space-xs);
24
- padding: var(--semmet-space-2xs);
25
- border: 1px solid var(--semmet-color-outline);
26
- border-radius: var(--semmet-radius-md);
27
- color: var(--semmet-color-on-surface);
28
- background: var(--semmet-color-surface);
29
9
  }
30
10
 
31
11
  .semmet-navbar__brand {
32
12
  display: inline-flex;
33
13
  align-items: center;
34
- min-height: var(--semmet-target-md);
35
14
  color: inherit;
36
- font-size: 1.0625rem;
37
- font-weight: 800;
38
15
  text-decoration: none;
39
16
  }
40
17
 
@@ -43,13 +20,11 @@
43
20
  display: inline-flex;
44
21
  align-items: center;
45
22
  justify-content: center;
46
- width: var(--semmet-target-md);
47
- height: var(--semmet-target-md);
48
- border: 1px solid var(--semmet-color-outline);
49
- border-radius: var(--semmet-radius-md);
50
23
  color: inherit;
51
- background: var(--semmet-color-surface);
24
+ background: none;
25
+ border: 0;
52
26
  cursor: pointer;
27
+ font: inherit;
53
28
  }
54
29
 
55
30
  .semmet-navbar__toggle span,
@@ -58,7 +33,6 @@
58
33
  display: block;
59
34
  width: 1.125rem;
60
35
  height: 0.125rem;
61
- border-radius: 999px;
62
36
  background: currentColor;
63
37
  }
64
38
 
@@ -92,42 +66,21 @@
92
66
 
93
67
  .semmet-navbar__list {
94
68
  display: grid;
95
- gap: var(--semmet-space-3xs);
96
69
  margin: 0;
97
- padding: var(--semmet-space-2xs) 0 0;
70
+ padding: 0;
98
71
  list-style: none;
99
72
  }
100
73
 
101
74
  .semmet-navbar__actions {
102
75
  display: flex;
103
76
  flex-wrap: wrap;
104
- gap: var(--semmet-space-2xs);
105
- padding-top: var(--semmet-space-xs);
106
77
  }
107
78
 
108
79
  .semmet-navbar__link {
109
80
  display: flex;
110
81
  align-items: center;
111
- min-height: var(--semmet-target-md);
112
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
113
- border-radius: var(--semmet-radius-md);
114
- color: var(--semmet-color-on-surface-variant);
115
- font-weight: 650;
82
+ color: inherit;
116
83
  text-decoration: none;
117
- transition:
118
- background-color var(--semmet-motion),
119
- color var(--semmet-motion),
120
- opacity var(--semmet-motion);
121
- }
122
-
123
- .semmet-navbar__link:hover:not(.semmet-navbar__link--disabled) {
124
- color: var(--semmet-color-on-surface);
125
- background: var(--semmet-color-surface-muted);
126
- }
127
-
128
- .semmet-navbar__link--current {
129
- color: var(--semmet-color-on-surface);
130
- background: var(--semmet-color-surface-muted);
131
84
  }
132
85
 
133
86
  .semmet-navbar__link--disabled {
@@ -139,14 +92,13 @@
139
92
  .semmet-navbar__toggle:focus-visible,
140
93
  .semmet-navbar__link:focus-visible,
141
94
  .semmet-navbar__actions :is(a, button):focus-visible {
142
- outline: 2px solid var(--semmet-color-primary);
95
+ outline: 2px solid currentColor;
143
96
  outline-offset: 2px;
144
97
  }
145
98
 
146
99
  @media (min-width: 48rem) {
147
100
  .semmet-navbar {
148
101
  grid-template-columns: auto 1fr;
149
- padding-inline: var(--semmet-space-2xs);
150
102
  }
151
103
 
152
104
  .semmet-navbar__toggle {
@@ -156,20 +108,12 @@
156
108
  .semmet-navbar__menu {
157
109
  display: flex;
158
110
  align-items: center;
159
- justify-content: flex-end;
160
- gap: var(--semmet-space-xs);
161
111
  grid-column: auto;
162
112
  }
163
113
 
164
114
  .semmet-navbar__list {
165
115
  display: flex;
166
116
  align-items: center;
167
- justify-content: flex-end;
168
- gap: var(--semmet-space-3xs);
169
117
  padding: 0;
170
118
  }
171
-
172
- .semmet-navbar__actions {
173
- padding-top: 0;
174
- }
175
119
  }
@@ -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 navbar 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
  }