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
@@ -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
- }
@@ -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 textarea 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,30 +1,10 @@
1
1
  :host {
2
- --semmet-color-on-surface: #18181b;
3
- --semmet-color-inverse-surface: #27272a;
4
- --semmet-color-inverse-on-surface: #ffffff;
5
- --semmet-radius-sm: 8px;
6
- --semmet-space-3xs: 4px;
7
- --semmet-space-2xs: 8px;
8
- --semmet-space-xs: 16px;
9
- --semmet-space-sm: 24px;
10
- --semmet-target-md: 40px;
11
- --semmet-elevation-3: 0 8px 24px rgba(20, 24, 23, 0.18), 0 2px 8px rgba(20, 24, 23, 0.1);
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
  button {
20
6
  font: inherit;
21
- font-weight: 500;
22
- color: var(--semmet-color-on-surface);
23
7
  background: none;
24
- border: 1px solid currentColor;
25
- border-radius: var(--semmet-radius-sm);
26
- min-height: var(--semmet-target-md);
27
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
28
8
  cursor: pointer;
29
9
  }
30
10
 
@@ -36,27 +16,13 @@ button:focus-visible {
36
16
  [role='status'] {
37
17
  position: fixed;
38
18
  left: 50%;
39
- bottom: var(--semmet-space-sm);
19
+ bottom: 0;
40
20
  transform: translateX(-50%);
41
21
  display: flex;
42
22
  align-items: center;
43
- gap: var(--semmet-space-xs);
44
- padding: var(--semmet-space-xs);
45
- color: var(--semmet-color-inverse-on-surface);
46
- background: var(--semmet-color-inverse-surface);
47
- border-radius: var(--semmet-radius-sm);
48
- box-shadow: var(--semmet-elevation-3);
49
23
  }
50
24
 
51
25
  [role='status'] button {
52
- font-size: 1.125rem;
53
- line-height: 1;
54
26
  color: inherit;
55
27
  border: none;
56
- padding: var(--semmet-space-3xs) var(--semmet-space-2xs);
57
- transition: background-color var(--semmet-motion);
58
- }
59
-
60
- [role='status'] button:hover {
61
- background: color-mix(in srgb, var(--semmet-color-inverse-on-surface) 20%, transparent);
62
28
  }
@@ -3,13 +3,13 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> in that parent component.
5
5
 
6
- <<%= selector %> />
6
+ <<%= selector %> triggerLabel="Save" message="Your changes have been saved." />
7
7
  -->
8
- <button type="button" (click)="show()">Save</button>
8
+ <button type="button" (click)="show()">{{ triggerLabel() }}</button>
9
9
 
10
10
  @if (visible()) {
11
11
  <div role="status" [id]="instanceId">
12
- <span>Your changes have been saved.</span>
13
- <button type="button" (click)="dismiss()" aria-label="Dismiss">×</button>
12
+ <span>{{ message() }}</span>
13
+ <button type="button" (click)="dismiss()" [attr.aria-label]="dismissLabel()">×</button>
14
14
  </div>
15
15
  }
@@ -1,4 +1,4 @@
1
- import { Component, DestroyRef, inject, signal } from '@angular/core';
1
+ import { Component, DestroyRef, inject, input, signal } from '@angular/core';
2
2
 
3
3
  const AUTO_DISMISS_MS = 5000;
4
4
 
@@ -16,6 +16,10 @@ export class <%= classify(name) %> {
16
16
  protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
17
17
  protected readonly visible = signal(false);
18
18
 
19
+ readonly triggerLabel = input('Save');
20
+ readonly message = input('Your changes have been saved.');
21
+ readonly dismissLabel = input('Dismiss');
22
+
19
23
  constructor() {
20
24
  inject(DestroyRef).onDestroy(() => clearTimeout(this.dismissTimeout));
21
25
  }
@@ -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 toast 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,53 +1,19 @@
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-sm: 8px;
8
- --semmet-space-3xs: 4px;
9
- --semmet-space-2xs: 8px;
10
- --semmet-space-xs: 16px;
11
- --semmet-target-md: 40px;
12
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
13
-
14
2
  display: inline-block;
15
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
16
- font-size: 0.9375rem;
17
3
  }
18
4
 
19
5
  [role='toolbar'] {
20
6
  display: inline-flex;
21
- gap: var(--semmet-space-3xs);
22
- padding: var(--semmet-space-3xs);
23
- background: var(--semmet-color-surface);
24
- border: 1px solid var(--semmet-color-outline);
25
- border-radius: var(--semmet-radius-sm);
26
7
  }
27
8
 
28
9
  button {
29
10
  font: inherit;
30
- font-weight: 500;
31
- color: var(--semmet-color-on-surface);
32
11
  background: none;
33
12
  border: none;
34
- border-radius: 6px;
35
- min-height: var(--semmet-target-md);
36
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
37
13
  cursor: pointer;
38
- transition: background-color var(--semmet-motion), color var(--semmet-motion);
39
- }
40
-
41
- button:hover {
42
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
43
14
  }
44
15
 
45
16
  button:focus-visible {
46
- outline: 2px solid var(--semmet-color-primary);
47
- outline-offset: -2px;
48
- }
49
-
50
- button[aria-pressed='true'] {
51
- background: var(--semmet-color-primary);
52
- color: var(--semmet-color-on-primary);
17
+ outline: 2px solid currentColor;
18
+ outline-offset: 2px;
53
19
  }
@@ -3,10 +3,10 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> in that parent component.
5
5
 
6
- <<%= selector %> />
6
+ <<%= selector %> label="Text formatting" [actions]="formattingActions" />
7
7
  -->
8
- <div role="toolbar" aria-label="Text formatting">
9
- @for (action of actions; track action.id; let i = $index) {
8
+ <div role="toolbar" [attr.aria-label]="label()">
9
+ @for (action of actions(); track action.id; let i = $index) {
10
10
  <button
11
11
  #toolbarButton
12
12
  type="button"
@@ -1,10 +1,16 @@
1
- import { Component, ElementRef, signal, viewChildren } from '@angular/core';
1
+ import { Component, ElementRef, input, signal, viewChildren } from '@angular/core';
2
2
 
3
3
  interface <%= classify(name) %>Action {
4
4
  id: number;
5
5
  label: string;
6
6
  }
7
7
 
8
+ const DEFAULT_ACTIONS: readonly <%= classify(name) %>Action[] = [
9
+ { id: 1, label: 'Bold' },
10
+ { id: 2, label: 'Italic' },
11
+ { id: 3, label: 'Underline' },
12
+ ];
13
+
8
14
  @Component({
9
15
  selector: '<%= selector %>',
10
16
  imports: [],
@@ -14,13 +20,10 @@ interface <%= classify(name) %>Action {
14
20
  export class <%= classify(name) %> {
15
21
  private readonly buttons = viewChildren<ElementRef<HTMLButtonElement>>('toolbarButton');
16
22
 
17
- protected readonly actions: <%= classify(name) %>Action[] = [
18
- { id: 1, label: 'Bold' },
19
- { id: 2, label: 'Italic' },
20
- { id: 3, label: 'Underline' },
21
- ];
23
+ readonly label = input('Text formatting');
24
+ readonly actions = input<readonly <%= classify(name) %>Action[]>(DEFAULT_ACTIONS);
22
25
 
23
- protected readonly activeId = signal(this.actions[0].id);
26
+ protected readonly activeId = signal(DEFAULT_ACTIONS[0].id);
24
27
 
25
28
  private readonly pressedIds = signal<ReadonlySet<number>>(new Set());
26
29
 
@@ -65,7 +68,7 @@ export class <%= classify(name) %> {
65
68
  }
66
69
 
67
70
  event.preventDefault();
68
- this.activeId.set(this.actions[nextIndex].id);
71
+ this.activeId.set(this.actions()[nextIndex].id);
69
72
  items[nextIndex].nativeElement.focus();
70
73
  }
71
74
  }
@@ -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 toolbar 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,39 +1,16 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-inverse-surface: #27272a;
4
- --semmet-color-inverse-on-surface: #ffffff;
5
- --semmet-radius-sm: 6px;
6
- --semmet-space-2xs: 8px;
7
- --semmet-space-xs: 16px;
8
- --semmet-target-md: 40px;
9
- --semmet-elevation-1: 0 1px 2px rgba(20, 24, 23, 0.1), 0 1px 1px rgba(20, 24, 23, 0.06);
10
- --semmet-motion: 120ms cubic-bezier(0.2, 0, 0, 1);
11
-
12
2
  position: relative;
13
3
  display: inline-block;
14
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
15
- font-size: 0.9375rem;
16
4
  }
17
5
 
18
6
  button {
19
7
  font: inherit;
20
- font-weight: 500;
21
- color: var(--semmet-color-primary);
22
8
  background: none;
23
- border: 1px solid currentColor;
24
- border-radius: var(--semmet-radius-sm);
25
- min-height: var(--semmet-target-md);
26
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
27
9
  cursor: pointer;
28
- transition: background-color var(--semmet-motion);
29
- }
30
-
31
- button:hover {
32
- background: color-mix(in srgb, var(--semmet-color-primary) 8%, transparent);
33
10
  }
34
11
 
35
12
  button:focus-visible {
36
- outline: 2px solid var(--semmet-color-primary);
13
+ outline: 2px solid currentColor;
37
14
  outline-offset: 2px;
38
15
  }
39
16
 
@@ -41,13 +18,5 @@ button:focus-visible {
41
18
  position: absolute;
42
19
  bottom: 100%;
43
20
  left: 0;
44
- margin-bottom: var(--semmet-space-2xs);
45
- padding: var(--semmet-space-2xs);
46
- border-radius: var(--semmet-radius-sm);
47
- background: var(--semmet-color-inverse-surface);
48
- color: var(--semmet-color-inverse-on-surface);
49
- font-size: 0.8125rem;
50
- line-height: 1.4;
51
21
  white-space: nowrap;
52
- box-shadow: var(--semmet-elevation-1);
53
22
  }
@@ -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 tooltip 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,17 +1,5 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-on-surface: #18181b;
4
- --semmet-color-on-surface-variant: #52525b;
5
- --semmet-radius-sm: 6px;
6
- --semmet-space-2xs: 8px;
7
- --semmet-space-sm: 24px;
8
- --semmet-target-md: 40px;
9
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
10
-
11
2
  display: block;
12
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
13
- font-size: 0.9375rem;
14
- color: var(--semmet-color-on-surface);
15
3
  }
16
4
 
17
5
  [role='tree'],
@@ -22,27 +10,18 @@
22
10
  }
23
11
 
24
12
  [role='group'] {
25
- padding-left: var(--semmet-space-sm);
13
+ padding-left: 1rem;
26
14
  }
27
15
 
28
16
  [role='treeitem'] {
29
17
  display: flex;
30
18
  align-items: center;
31
- gap: var(--semmet-space-2xs);
32
- min-height: var(--semmet-target-md);
33
- padding: var(--semmet-space-2xs);
34
- border-radius: var(--semmet-radius-sm);
35
19
  cursor: pointer;
36
- transition: background-color var(--semmet-motion);
37
- }
38
-
39
- [role='treeitem']:hover {
40
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
41
20
  }
42
21
 
43
22
  [role='treeitem']:focus-visible {
44
- outline: 2px solid var(--semmet-color-primary);
45
- outline-offset: -2px;
23
+ outline: 2px solid currentColor;
24
+ outline-offset: 2px;
46
25
  }
47
26
 
48
27
  [role='treeitem'][aria-expanded]::before {
@@ -50,10 +29,9 @@
50
29
  width: 0.4rem;
51
30
  height: 0.4rem;
52
31
  flex-shrink: 0;
53
- border-right: 2px solid var(--semmet-color-on-surface-variant);
54
- border-bottom: 2px solid var(--semmet-color-on-surface-variant);
32
+ border-right: 2px solid currentColor;
33
+ border-bottom: 2px solid currentColor;
55
34
  transform: rotate(-45deg);
56
- transition: transform var(--semmet-motion);
57
35
  }
58
36
 
59
37
  [role='treeitem'][aria-expanded='true']::before {
@@ -3,10 +3,10 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> in that parent component.
5
5
 
6
- <<%= selector %> />
6
+ <<%= selector %> label="Files" [tree]="fileTree" />
7
7
  -->
8
- <ul role="tree" aria-label="Files">
9
- @for (root of tree; track root.id) {
8
+ <ul role="tree" [attr.aria-label]="label()">
9
+ @for (root of tree(); track root.id) {
10
10
  <li
11
11
  #treeItem
12
12
  role="treeitem"