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,25 +1,10 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-surface: #ffffff;
4
- --semmet-color-on-surface: #18181b;
5
- --semmet-radius-sm: 8px;
6
- --semmet-radius-md: 12px;
7
- --semmet-space-3xs: 4px;
8
- --semmet-space-2xs: 8px;
9
- --semmet-space-xs: 16px;
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
  nav > ul {
20
6
  display: flex;
21
7
  align-items: center;
22
- gap: var(--semmet-space-3xs);
23
8
  margin: 0;
24
9
  padding: 0;
25
10
  list-style: none;
@@ -33,28 +18,17 @@ a,
33
18
  button {
34
19
  display: inline-flex;
35
20
  align-items: center;
36
- gap: var(--semmet-space-2xs);
37
- min-height: var(--semmet-target-md);
38
21
  font: inherit;
39
- font-weight: 500;
40
- color: var(--semmet-color-on-surface);
22
+ color: inherit;
41
23
  background: none;
42
24
  border: none;
43
- border-radius: var(--semmet-radius-sm);
44
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
45
25
  cursor: pointer;
46
26
  text-decoration: none;
47
- transition: background-color var(--semmet-motion);
48
- }
49
-
50
- a:hover,
51
- button:hover {
52
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
53
27
  }
54
28
 
55
29
  a:focus-visible,
56
30
  button:focus-visible {
57
- outline: 2px solid var(--semmet-color-primary);
31
+ outline: 2px solid currentColor;
58
32
  outline-offset: 2px;
59
33
  }
60
34
 
@@ -62,10 +36,9 @@ button::after {
62
36
  content: '';
63
37
  width: 0.4rem;
64
38
  height: 0.4rem;
65
- border-right: 2px solid var(--semmet-color-on-surface);
66
- border-bottom: 2px solid var(--semmet-color-on-surface);
39
+ border-right: 2px solid currentColor;
40
+ border-bottom: 2px solid currentColor;
67
41
  transform: rotate(45deg);
68
- transition: transform var(--semmet-motion);
69
42
  }
70
43
 
71
44
  button[aria-expanded='true']::after {
@@ -77,13 +50,9 @@ nav > ul ul {
77
50
  z-index: 1;
78
51
  top: 100%;
79
52
  left: 0;
80
- min-width: 12rem;
81
- margin: var(--semmet-space-3xs) 0 0;
82
- padding: var(--semmet-space-2xs);
53
+ margin: 0;
54
+ padding: 0;
83
55
  list-style: none;
84
- background: var(--semmet-color-surface);
85
- border-radius: var(--semmet-radius-md);
86
- box-shadow: var(--semmet-elevation-3);
87
56
  }
88
57
 
89
58
  nav > ul ul li a {
@@ -3,12 +3,12 @@
3
3
  Usage from a parent component template:
4
4
  Import <%= classify(name) %> in that parent component.
5
5
 
6
- <<%= selector %> />
6
+ <<%= selector %> label="Main" />
7
7
  -->
8
8
  <!-- Deliberately avoids the ARIA menu/menuitem roles — APG reserves those for app-style menus. -->
9
- <nav aria-label="Main">
9
+ <nav [attr.aria-label]="label()">
10
10
  <ul>
11
- <li><a href="/">Home</a></li>
11
+ <li><a [href]="homeHref()">{{ homeLabel() }}</a></li>
12
12
  <li>
13
13
  <button
14
14
  type="button"
@@ -17,11 +17,12 @@ Import <%= classify(name) %> in that parent component.
17
17
  [id]="instanceId + '-button'"
18
18
  (click)="toggleSubmenu()"
19
19
  >
20
- Products
20
+ {{ submenuLabel() }}
21
21
  </button>
22
22
  <ul [id]="instanceId + '-submenu'" [attr.aria-labelledby]="instanceId + '-button'" [hidden]="!expanded()">
23
- <li><a href="/products/first">First product</a></li>
24
- <li><a href="/products/second">Second product</a></li>
23
+ @for (link of submenuLinks(); track link.href) {
24
+ <li><a [href]="link.href">{{ link.label }}</a></li>
25
+ }
25
26
  </ul>
26
27
  </li>
27
28
  </ul>
@@ -1,4 +1,9 @@
1
- import { Component, signal } from '@angular/core';
1
+ import { Component, input, signal } from '@angular/core';
2
+
3
+ interface <%= classify(name) %>Link {
4
+ label: string;
5
+ href: string;
6
+ }
2
7
 
3
8
  let nextId = 0;
4
9
 
@@ -12,6 +17,15 @@ export class <%= classify(name) %> {
12
17
  protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
13
18
  protected readonly expanded = signal(false);
14
19
 
20
+ readonly label = input('Main');
21
+ readonly homeLabel = input('Home');
22
+ readonly homeHref = input('/');
23
+ readonly submenuLabel = input('Products');
24
+ readonly submenuLinks = input<readonly <%= classify(name) %>Link[]>([
25
+ { label: 'First product', href: '/products/first' },
26
+ { label: 'Second product', href: '/products/second' },
27
+ ]);
28
+
15
29
  protected toggleSubmenu(): void {
16
30
  this.expanded.update((value) => !value);
17
31
  }
@@ -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 navigation menu 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,38 +1,15 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-on-primary: #ffffff;
4
- --semmet-color-surface: #ffffff;
5
- --semmet-color-backdrop: rgba(24, 24, 27, 0.44);
6
- --semmet-color-outline: #d4d4d8;
7
- --semmet-color-on-surface: #27272a;
8
- --semmet-color-on-surface-variant: #71717a;
9
- --semmet-radius-md: 10px;
10
- --semmet-space-2xs: 8px;
11
- --semmet-space-xs: 16px;
12
- --semmet-space-sm: 24px;
13
- --semmet-target-md: 40px;
14
- --semmet-elevation-3: 0 20px 48px rgba(20, 24, 23, 0.22), 0 8px 20px rgba(20, 24, 23, 0.14);
15
- --semmet-motion: 220ms 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-offcanvas__trigger {
22
- min-height: var(--semmet-target-md);
23
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
24
- border: 1px solid transparent;
25
- border-radius: var(--semmet-radius-md);
26
- color: var(--semmet-color-on-primary);
27
- background: var(--semmet-color-primary);
28
6
  font: inherit;
29
- font-weight: 650;
30
7
  cursor: pointer;
31
8
  }
32
9
 
33
10
  .semmet-offcanvas__trigger:focus-visible,
34
11
  .semmet-offcanvas__close:focus-visible {
35
- outline: 2px solid var(--semmet-color-primary);
12
+ outline: 2px solid currentColor;
36
13
  outline-offset: 2px;
37
14
  }
38
15
 
@@ -40,7 +17,6 @@
40
17
  position: fixed;
41
18
  inset: 0;
42
19
  z-index: 1000;
43
- background: var(--semmet-color-backdrop);
44
20
  }
45
21
 
46
22
  .semmet-offcanvas__panel {
@@ -48,10 +24,6 @@
48
24
  z-index: 1001;
49
25
  display: grid;
50
26
  grid-template-rows: auto 1fr;
51
- color: var(--semmet-color-on-surface);
52
- background: var(--semmet-color-surface);
53
- box-shadow: var(--semmet-elevation-3);
54
- animation: semmet-offcanvas-enter var(--semmet-motion);
55
27
  }
56
28
 
57
29
  .semmet-offcanvas__panel--start,
@@ -88,9 +60,6 @@
88
60
  display: flex;
89
61
  align-items: start;
90
62
  justify-content: space-between;
91
- gap: var(--semmet-space-xs);
92
- padding: var(--semmet-space-sm);
93
- border-block-end: 1px solid var(--semmet-color-outline);
94
63
  }
95
64
 
96
65
  .semmet-offcanvas__title,
@@ -99,36 +68,20 @@
99
68
  margin: 0;
100
69
  }
101
70
 
102
- .semmet-offcanvas__title {
103
- font-size: 1.125rem;
104
- line-height: 1.25;
105
- }
106
-
107
- .semmet-offcanvas__description {
108
- margin-block-start: var(--semmet-space-2xs);
109
- color: var(--semmet-color-on-surface-variant);
110
- line-height: 1.4;
111
- }
112
-
113
71
  .semmet-offcanvas__close {
114
72
  position: relative;
115
73
  display: inline-flex;
116
74
  align-items: center;
117
75
  justify-content: center;
118
76
  flex: 0 0 auto;
119
- width: var(--semmet-target-md);
120
- height: var(--semmet-target-md);
77
+ width: 2rem;
78
+ height: 2rem;
121
79
  border: 0;
122
- border-radius: 999px;
123
80
  color: inherit;
124
81
  background: transparent;
125
82
  cursor: pointer;
126
83
  }
127
84
 
128
- .semmet-offcanvas__close:hover {
129
- background: #f4f4f5;
130
- }
131
-
132
85
  .semmet-offcanvas__close span,
133
86
  .semmet-offcanvas__close span::before,
134
87
  .semmet-offcanvas__close span::after {
@@ -146,7 +99,6 @@
146
99
  position: absolute;
147
100
  top: 50%;
148
101
  left: 0;
149
- border-radius: 999px;
150
102
  background: currentColor;
151
103
  content: '';
152
104
  }
@@ -162,23 +114,4 @@
162
114
  .semmet-offcanvas__body {
163
115
  min-height: 0;
164
116
  overflow: auto;
165
- padding: var(--semmet-space-sm);
166
- }
167
-
168
- .semmet-offcanvas__placeholder {
169
- color: var(--semmet-color-on-surface-variant);
170
- line-height: 1.5;
171
- }
172
-
173
- @keyframes semmet-offcanvas-enter {
174
- from {
175
- opacity: 0;
176
- transform: translateX(1rem);
177
- }
178
- }
179
-
180
- @media (prefers-reduced-motion: reduce) {
181
- .semmet-offcanvas__panel {
182
- animation-duration: 1ms;
183
- }
184
117
  }
@@ -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 offcanvas 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,10 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-on-primary: #ffffff;
4
- --semmet-color-on-surface: #18181b;
5
- --semmet-color-on-surface-variant: #52525b;
6
- --semmet-radius-sm: 8px;
7
- --semmet-space-3xs: 4px;
8
- --semmet-space-2xs: 8px;
9
- --semmet-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
  ul {
18
6
  display: flex;
19
7
  align-items: center;
20
- gap: var(--semmet-space-3xs);
21
8
  margin: 0;
22
9
  padding: 0;
23
10
  list-style: none;
@@ -28,39 +15,21 @@ button {
28
15
  display: inline-flex;
29
16
  align-items: center;
30
17
  justify-content: center;
31
- min-width: var(--semmet-target-md);
32
- min-height: var(--semmet-target-md);
33
- padding: 0 var(--semmet-space-2xs);
34
18
  font: inherit;
35
- font-weight: 500;
36
- color: var(--semmet-color-on-surface);
19
+ color: inherit;
37
20
  background: none;
38
- border: 1px solid transparent;
39
- border-radius: var(--semmet-radius-sm);
40
21
  text-decoration: none;
41
22
  cursor: pointer;
42
23
  box-sizing: border-box;
43
- transition: background-color var(--semmet-motion), color var(--semmet-motion);
44
- }
45
-
46
- a:hover,
47
- button:not(:disabled):hover {
48
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
49
24
  }
50
25
 
51
26
  a:focus-visible,
52
27
  button:focus-visible {
53
- outline: 2px solid var(--semmet-color-primary);
28
+ outline: 2px solid currentColor;
54
29
  outline-offset: 2px;
55
30
  }
56
31
 
57
- a[aria-current='page'] {
58
- background: var(--semmet-color-primary);
59
- color: var(--semmet-color-on-primary);
60
- }
61
-
62
32
  button:disabled {
63
- color: var(--semmet-color-on-surface-variant);
64
33
  opacity: 0.5;
65
34
  cursor: not-allowed;
66
35
  }
@@ -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 %> label="Search results pages" />
7
7
  -->
8
- <nav aria-label="Pagination">
8
+ <nav [attr.aria-label]="label()">
9
9
  <ul>
10
10
  <li>
11
- <button type="button" [disabled]="!hasPrevious()" (click)="goToPrevious()" aria-label="Previous page">
12
- Previous
11
+ <button type="button" [disabled]="!hasPrevious()" (click)="goToPrevious()" [attr.aria-label]="previousAriaLabel()">
12
+ {{ previousLabel() }}
13
13
  </button>
14
14
  </li>
15
15
  @for (page of pages; track page) {
@@ -24,8 +24,8 @@ Import <%= classify(name) %> in that parent component.
24
24
  </li>
25
25
  }
26
26
  <li>
27
- <button type="button" [disabled]="!hasNext()" (click)="goToNext()" aria-label="Next page">
28
- Next
27
+ <button type="button" [disabled]="!hasNext()" (click)="goToNext()" [attr.aria-label]="nextAriaLabel()">
28
+ {{ nextLabel() }}
29
29
  </button>
30
30
  </li>
31
31
  </ul>
@@ -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
  @Component({
4
4
  selector: '<%= selector %>',
@@ -7,6 +7,12 @@ import { Component, computed, signal } from '@angular/core';
7
7
  styleUrl: './<%= dasherize(name) %>.css',
8
8
  })
9
9
  export class <%= classify(name) %> {
10
+ readonly label = input('Pagination');
11
+ readonly previousLabel = input('Previous');
12
+ readonly previousAriaLabel = input('Previous page');
13
+ readonly nextLabel = input('Next');
14
+ readonly nextAriaLabel = input('Next page');
15
+
10
16
  protected readonly pages = [1, 2, 3, 4, 5];
11
17
  protected readonly currentPage = signal(1);
12
18
 
@@ -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 pagination 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,78 +1,47 @@
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-color-on-surface-variant: #71717a;
9
- --semmet-radius-md: 10px;
10
- --semmet-space-2xs: 8px;
11
- --semmet-space-xs: 16px;
12
- --semmet-space-md: 32px;
13
- --semmet-target-sm: 32px;
14
- --semmet-target-md: 40px;
15
- --semmet-elevation-2: 0 12px 28px rgba(20, 24, 23, 0.16), 0 4px 12px rgba(20, 24, 23, 0.1);
16
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
17
-
18
2
  position: relative;
19
3
  display: inline-block;
20
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
21
4
  }
22
5
 
23
6
  .semmet-popover__trigger {
24
- min-height: var(--semmet-target-md);
25
- padding: var(--semmet-space-2xs) var(--semmet-space-xs);
26
- border: 1px solid var(--semmet-color-outline);
27
- border-radius: var(--semmet-radius-md);
28
- color: var(--semmet-color-on-surface);
29
- background: var(--semmet-color-surface);
30
7
  font: inherit;
31
- font-weight: 650;
32
8
  cursor: pointer;
33
9
  }
34
10
 
35
11
  .semmet-popover__trigger:focus-visible,
36
12
  .semmet-popover__close:focus-visible,
37
13
  .semmet-popover__panel:focus-visible {
38
- outline: 2px solid var(--semmet-color-primary);
14
+ outline: 2px solid currentColor;
39
15
  outline-offset: 2px;
40
16
  }
41
17
 
42
18
  .semmet-popover__panel {
43
19
  position: absolute;
44
20
  z-index: 20;
45
- width: min(20rem, calc(100vw - var(--semmet-space-md)));
46
- padding: var(--semmet-space-xs);
47
- border: 1px solid var(--semmet-color-outline);
48
- border-radius: var(--semmet-radius-md);
49
- color: var(--semmet-color-on-surface);
50
- background: var(--semmet-color-surface);
51
- box-shadow: var(--semmet-elevation-2);
52
- animation: semmet-popover-enter var(--semmet-motion);
21
+ max-width: 100vw;
53
22
  }
54
23
 
55
24
  .semmet-popover__panel--top {
56
25
  left: 50%;
57
- bottom: calc(100% + var(--semmet-space-2xs));
26
+ bottom: 100%;
58
27
  transform: translateX(-50%);
59
28
  }
60
29
 
61
30
  .semmet-popover__panel--right {
62
31
  top: 50%;
63
- left: calc(100% + var(--semmet-space-2xs));
32
+ left: 100%;
64
33
  transform: translateY(-50%);
65
34
  }
66
35
 
67
36
  .semmet-popover__panel--bottom {
68
- top: calc(100% + var(--semmet-space-2xs));
37
+ top: 100%;
69
38
  left: 50%;
70
39
  transform: translateX(-50%);
71
40
  }
72
41
 
73
42
  .semmet-popover__panel--left {
74
43
  top: 50%;
75
- right: calc(100% + var(--semmet-space-2xs));
44
+ right: 100%;
76
45
  transform: translateY(-50%);
77
46
  }
78
47
 
@@ -80,7 +49,6 @@
80
49
  display: flex;
81
50
  align-items: start;
82
51
  justify-content: space-between;
83
- gap: var(--semmet-space-xs);
84
52
  }
85
53
 
86
54
  .semmet-popover__title,
@@ -88,36 +56,20 @@
88
56
  margin: 0;
89
57
  }
90
58
 
91
- .semmet-popover__title {
92
- font-size: 1rem;
93
- line-height: 1.3;
94
- }
95
-
96
- .semmet-popover__body {
97
- margin-block-start: var(--semmet-space-2xs);
98
- color: var(--semmet-color-on-surface-variant);
99
- line-height: 1.5;
100
- }
101
-
102
59
  .semmet-popover__close {
103
60
  position: relative;
104
61
  display: inline-flex;
105
62
  align-items: center;
106
63
  justify-content: center;
107
64
  flex: 0 0 auto;
108
- width: var(--semmet-target-sm);
109
- height: var(--semmet-target-sm);
65
+ width: 2rem;
66
+ height: 2rem;
110
67
  border: 0;
111
- border-radius: 999px;
112
68
  color: inherit;
113
69
  background: transparent;
114
70
  cursor: pointer;
115
71
  }
116
72
 
117
- .semmet-popover__close:hover {
118
- background: var(--semmet-color-surface-muted);
119
- }
120
-
121
73
  .semmet-popover__close span,
122
74
  .semmet-popover__close span::before,
123
75
  .semmet-popover__close span::after {
@@ -135,7 +87,6 @@
135
87
  position: absolute;
136
88
  top: 50%;
137
89
  left: 0;
138
- border-radius: 999px;
139
90
  background: currentColor;
140
91
  content: '';
141
92
  }
@@ -147,15 +98,3 @@
147
98
  .semmet-popover__close span::after {
148
99
  transform: rotate(-45deg);
149
100
  }
150
-
151
- @keyframes semmet-popover-enter {
152
- from {
153
- opacity: 0;
154
- }
155
- }
156
-
157
- @media (prefers-reduced-motion: reduce) {
158
- .semmet-popover__panel {
159
- animation-duration: 1ms;
160
- }
161
- }