semmet-angular 0.3.0 → 0.5.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 (279) hide show
  1. package/README.md +47 -7
  2. package/package.json +1 -1
  3. package/src/alert/files/__name@dasherize__/__name@dasherize__.css.template +43 -0
  4. package/src/alert/files/__name@dasherize__/__name@dasherize__.html.template +7 -0
  5. package/src/alert/files/__name@dasherize__/__name@dasherize__.ts.template +18 -0
  6. package/src/alert/index.d.ts +1 -0
  7. package/src/alert/index.js +6 -0
  8. package/src/alert/index.js.map +1 -0
  9. package/src/alert/index.ts +3 -0
  10. package/src/alert/schema.d.ts +1 -0
  11. package/src/alert/schema.js +3 -0
  12. package/src/alert/schema.js.map +1 -0
  13. package/src/alert/schema.json +29 -0
  14. package/src/alert/schema.ts +1 -0
  15. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.css.template +82 -0
  16. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.html.template +20 -0
  17. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.ts.template +75 -0
  18. package/src/alert-dialog/index.d.ts +1 -0
  19. package/src/alert-dialog/index.js +6 -0
  20. package/src/alert-dialog/index.js.map +1 -0
  21. package/src/alert-dialog/index.ts +3 -0
  22. package/src/alert-dialog/schema.d.ts +1 -0
  23. package/src/alert-dialog/schema.js +3 -0
  24. package/src/alert-dialog/schema.js.map +1 -0
  25. package/src/alert-dialog/schema.json +29 -0
  26. package/src/alert-dialog/schema.ts +1 -0
  27. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.css.template +52 -0
  28. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.html.template +9 -0
  29. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.ts.template +20 -0
  30. package/src/breadcrumb/index.d.ts +1 -0
  31. package/src/breadcrumb/index.js +6 -0
  32. package/src/breadcrumb/index.js.map +1 -0
  33. package/src/breadcrumb/index.ts +3 -0
  34. package/src/breadcrumb/schema.d.ts +1 -0
  35. package/src/breadcrumb/schema.js +3 -0
  36. package/src/breadcrumb/schema.js.map +1 -0
  37. package/src/breadcrumb/schema.json +29 -0
  38. package/src/breadcrumb/schema.ts +1 -0
  39. package/src/card/files/__name@dasherize__/__name@dasherize__.css.template +49 -0
  40. package/src/card/files/__name@dasherize__/__name@dasherize__.html.template +6 -0
  41. package/src/card/files/__name@dasherize__/__name@dasherize__.ts.template +13 -0
  42. package/src/card/index.d.ts +1 -0
  43. package/src/card/index.js +6 -0
  44. package/src/card/index.js.map +1 -0
  45. package/src/card/index.ts +3 -0
  46. package/src/card/schema.d.ts +1 -0
  47. package/src/card/schema.js +3 -0
  48. package/src/card/schema.js.map +1 -0
  49. package/src/card/schema.json +29 -0
  50. package/src/card/schema.ts +1 -0
  51. package/src/carousel/files/__name@dasherize__/__name@dasherize__.css.template +58 -0
  52. package/src/carousel/files/__name@dasherize__/__name@dasherize__.html.template +10 -0
  53. package/src/carousel/files/__name@dasherize__/__name@dasherize__.ts.template +35 -0
  54. package/src/carousel/index.d.ts +1 -0
  55. package/src/carousel/index.js +6 -0
  56. package/src/carousel/index.js.map +1 -0
  57. package/src/carousel/index.ts +3 -0
  58. package/src/carousel/schema.d.ts +1 -0
  59. package/src/carousel/schema.js +3 -0
  60. package/src/carousel/schema.js.map +1 -0
  61. package/src/carousel/schema.json +29 -0
  62. package/src/carousel/schema.ts +1 -0
  63. package/src/checkbox/files/__name@dasherize__/__name@dasherize__.css.template +62 -0
  64. package/src/checkbox/files/__name@dasherize__/__name@dasherize__.html.template +11 -0
  65. package/src/checkbox/files/__name@dasherize__/__name@dasherize__.ts.template +25 -0
  66. package/src/checkbox/index.d.ts +1 -0
  67. package/src/checkbox/index.js +6 -0
  68. package/src/checkbox/index.js.map +1 -0
  69. package/src/checkbox/index.ts +3 -0
  70. package/src/checkbox/schema.d.ts +1 -0
  71. package/src/checkbox/schema.js +3 -0
  72. package/src/checkbox/schema.js.map +1 -0
  73. package/src/checkbox/schema.json +29 -0
  74. package/src/checkbox/schema.ts +1 -0
  75. package/src/collection.json +115 -0
  76. package/src/combobox/files/__name@dasherize__/__name@dasherize__.css.template +75 -0
  77. package/src/combobox/files/__name@dasherize__/__name@dasherize__.html.template +33 -0
  78. package/src/combobox/files/__name@dasherize__/__name@dasherize__.ts.template +93 -0
  79. package/src/combobox/index.d.ts +1 -0
  80. package/src/combobox/index.js +6 -0
  81. package/src/combobox/index.js.map +1 -0
  82. package/src/combobox/index.ts +3 -0
  83. package/src/combobox/schema.d.ts +1 -0
  84. package/src/combobox/schema.js +3 -0
  85. package/src/combobox/schema.js.map +1 -0
  86. package/src/combobox/schema.json +29 -0
  87. package/src/combobox/schema.ts +1 -0
  88. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.css.template +61 -0
  89. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.html.template +17 -0
  90. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.ts.template +9 -0
  91. package/src/landmarks/index.d.ts +1 -0
  92. package/src/landmarks/index.js +6 -0
  93. package/src/landmarks/index.js.map +1 -0
  94. package/src/landmarks/index.ts +3 -0
  95. package/src/landmarks/schema.d.ts +1 -0
  96. package/src/landmarks/schema.js +3 -0
  97. package/src/landmarks/schema.js.map +1 -0
  98. package/src/landmarks/schema.json +29 -0
  99. package/src/landmarks/schema.ts +1 -0
  100. package/src/listbox/files/__name@dasherize__/__name@dasherize__.css.template +52 -0
  101. package/src/listbox/files/__name@dasherize__/__name@dasherize__.html.template +20 -0
  102. package/src/listbox/files/__name@dasherize__/__name@dasherize__.ts.template +54 -0
  103. package/src/listbox/index.d.ts +1 -0
  104. package/src/listbox/index.js +6 -0
  105. package/src/listbox/index.js.map +1 -0
  106. package/src/listbox/index.ts +3 -0
  107. package/src/listbox/schema.d.ts +1 -0
  108. package/src/listbox/schema.js +3 -0
  109. package/src/listbox/schema.js.map +1 -0
  110. package/src/listbox/schema.json +29 -0
  111. package/src/listbox/schema.ts +1 -0
  112. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.css.template +82 -0
  113. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.html.template +34 -0
  114. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.ts.template +104 -0
  115. package/src/menu-button/index.d.ts +1 -0
  116. package/src/menu-button/index.js +6 -0
  117. package/src/menu-button/index.js.map +1 -0
  118. package/src/menu-button/index.ts +3 -0
  119. package/src/menu-button/schema.d.ts +1 -0
  120. package/src/menu-button/schema.js +3 -0
  121. package/src/menu-button/schema.js.map +1 -0
  122. package/src/menu-button/schema.json +29 -0
  123. package/src/menu-button/schema.ts +1 -0
  124. package/src/meter/files/__name@dasherize__/__name@dasherize__.css.template +22 -0
  125. package/src/meter/files/__name@dasherize__/__name@dasherize__.html.template +5 -0
  126. package/src/meter/files/__name@dasherize__/__name@dasherize__.ts.template +14 -0
  127. package/src/meter/index.d.ts +1 -0
  128. package/src/meter/index.js +6 -0
  129. package/src/meter/index.js.map +1 -0
  130. package/src/meter/index.ts +3 -0
  131. package/src/meter/schema.d.ts +1 -0
  132. package/src/meter/schema.js +3 -0
  133. package/src/meter/schema.js.map +1 -0
  134. package/src/meter/schema.json +29 -0
  135. package/src/meter/schema.ts +1 -0
  136. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.css.template +88 -0
  137. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.html.template +22 -0
  138. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.ts.template +18 -0
  139. package/src/navigation-menu/index.d.ts +1 -0
  140. package/src/navigation-menu/index.js +6 -0
  141. package/src/navigation-menu/index.js.map +1 -0
  142. package/src/navigation-menu/index.ts +3 -0
  143. package/src/navigation-menu/schema.d.ts +1 -0
  144. package/src/navigation-menu/schema.js +3 -0
  145. package/src/navigation-menu/schema.js.map +1 -0
  146. package/src/navigation-menu/schema.json +29 -0
  147. package/src/navigation-menu/schema.ts +1 -0
  148. package/src/pagination/files/__name@dasherize__/__name@dasherize__.css.template +63 -0
  149. package/src/pagination/files/__name@dasherize__/__name@dasherize__.html.template +26 -0
  150. package/src/pagination/files/__name@dasherize__/__name@dasherize__.ts.template +31 -0
  151. package/src/pagination/index.d.ts +1 -0
  152. package/src/pagination/index.js +6 -0
  153. package/src/pagination/index.js.map +1 -0
  154. package/src/pagination/index.ts +3 -0
  155. package/src/pagination/schema.d.ts +1 -0
  156. package/src/pagination/schema.js +3 -0
  157. package/src/pagination/schema.js.map +1 -0
  158. package/src/pagination/schema.json +29 -0
  159. package/src/pagination/schema.ts +1 -0
  160. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.css.template +53 -0
  161. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.html.template +6 -0
  162. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.ts.template +19 -0
  163. package/src/progress-bar/index.d.ts +1 -0
  164. package/src/progress-bar/index.js +6 -0
  165. package/src/progress-bar/index.js.map +1 -0
  166. package/src/progress-bar/index.ts +3 -0
  167. package/src/progress-bar/schema.d.ts +1 -0
  168. package/src/progress-bar/schema.js +3 -0
  169. package/src/progress-bar/schema.js.map +1 -0
  170. package/src/progress-bar/schema.json +29 -0
  171. package/src/progress-bar/schema.ts +1 -0
  172. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.css.template +66 -0
  173. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.html.template +16 -0
  174. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.ts.template +62 -0
  175. package/src/radio-group/index.d.ts +1 -0
  176. package/src/radio-group/index.js +6 -0
  177. package/src/radio-group/index.js.map +1 -0
  178. package/src/radio-group/index.ts +3 -0
  179. package/src/radio-group/schema.d.ts +1 -0
  180. package/src/radio-group/schema.js +3 -0
  181. package/src/radio-group/schema.js.map +1 -0
  182. package/src/radio-group/schema.json +29 -0
  183. package/src/radio-group/schema.ts +1 -0
  184. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.css.template +30 -0
  185. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.html.template +3 -0
  186. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.ts.template +9 -0
  187. package/src/skip-link/index.d.ts +1 -0
  188. package/src/skip-link/index.js +6 -0
  189. package/src/skip-link/index.js.map +1 -0
  190. package/src/skip-link/index.ts +3 -0
  191. package/src/skip-link/schema.d.ts +1 -0
  192. package/src/skip-link/schema.js +3 -0
  193. package/src/skip-link/schema.js.map +1 -0
  194. package/src/skip-link/schema.json +29 -0
  195. package/src/skip-link/schema.ts +1 -0
  196. package/src/slider/files/__name@dasherize__/__name@dasherize__.css.template +54 -0
  197. package/src/slider/files/__name@dasherize__/__name@dasherize__.html.template +16 -0
  198. package/src/slider/files/__name@dasherize__/__name@dasherize__.ts.template +79 -0
  199. package/src/slider/index.d.ts +1 -0
  200. package/src/slider/index.js +6 -0
  201. package/src/slider/index.js.map +1 -0
  202. package/src/slider/index.ts +3 -0
  203. package/src/slider/schema.d.ts +1 -0
  204. package/src/slider/schema.js +3 -0
  205. package/src/slider/schema.js.map +1 -0
  206. package/src/slider/schema.json +29 -0
  207. package/src/slider/schema.ts +1 -0
  208. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.css.template +64 -0
  209. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.html.template +19 -0
  210. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.ts.template +59 -0
  211. package/src/spinbutton/index.d.ts +1 -0
  212. package/src/spinbutton/index.js +6 -0
  213. package/src/spinbutton/index.js.map +1 -0
  214. package/src/spinbutton/index.ts +3 -0
  215. package/src/spinbutton/schema.d.ts +1 -0
  216. package/src/spinbutton/schema.js +3 -0
  217. package/src/spinbutton/schema.js.map +1 -0
  218. package/src/spinbutton/schema.json +29 -0
  219. package/src/spinbutton/schema.ts +1 -0
  220. package/src/switch/files/__name@dasherize__/__name@dasherize__.css.template +68 -0
  221. package/src/switch/files/__name@dasherize__/__name@dasherize__.html.template +4 -0
  222. package/src/switch/files/__name@dasherize__/__name@dasherize__.ts.template +18 -0
  223. package/src/switch/index.d.ts +1 -0
  224. package/src/switch/index.js +6 -0
  225. package/src/switch/index.js.map +1 -0
  226. package/src/switch/index.ts +3 -0
  227. package/src/switch/schema.d.ts +1 -0
  228. package/src/switch/schema.js +3 -0
  229. package/src/switch/schema.js.map +1 -0
  230. package/src/switch/schema.json +29 -0
  231. package/src/switch/schema.ts +1 -0
  232. package/src/table/files/__name@dasherize__/__name@dasherize__.css.template +40 -0
  233. package/src/table/files/__name@dasherize__/__name@dasherize__.html.template +18 -0
  234. package/src/table/files/__name@dasherize__/__name@dasherize__.ts.template +19 -0
  235. package/src/table/index.d.ts +1 -0
  236. package/src/table/index.js +6 -0
  237. package/src/table/index.js.map +1 -0
  238. package/src/table/index.ts +3 -0
  239. package/src/table/schema.d.ts +1 -0
  240. package/src/table/schema.js +3 -0
  241. package/src/table/schema.js.map +1 -0
  242. package/src/table/schema.json +29 -0
  243. package/src/table/schema.ts +1 -0
  244. package/src/toast/files/__name@dasherize__/__name@dasherize__.css.template +56 -0
  245. package/src/toast/files/__name@dasherize__/__name@dasherize__.html.template +9 -0
  246. package/src/toast/files/__name@dasherize__/__name@dasherize__.ts.template +33 -0
  247. package/src/toast/index.d.ts +1 -0
  248. package/src/toast/index.js +6 -0
  249. package/src/toast/index.js.map +1 -0
  250. package/src/toast/index.ts +3 -0
  251. package/src/toast/schema.d.ts +1 -0
  252. package/src/toast/schema.js +3 -0
  253. package/src/toast/schema.js.map +1 -0
  254. package/src/toast/schema.json +29 -0
  255. package/src/toast/schema.ts +1 -0
  256. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.css.template +48 -0
  257. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.html.template +15 -0
  258. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.ts.template +71 -0
  259. package/src/toolbar/index.d.ts +1 -0
  260. package/src/toolbar/index.js +6 -0
  261. package/src/toolbar/index.js.map +1 -0
  262. package/src/toolbar/index.ts +3 -0
  263. package/src/toolbar/schema.d.ts +1 -0
  264. package/src/toolbar/schema.js +3 -0
  265. package/src/toolbar/schema.js.map +1 -0
  266. package/src/toolbar/schema.json +29 -0
  267. package/src/toolbar/schema.ts +1 -0
  268. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.css.template +57 -0
  269. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.html.template +30 -0
  270. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.ts.template +140 -0
  271. package/src/tree-view/index.d.ts +1 -0
  272. package/src/tree-view/index.js +6 -0
  273. package/src/tree-view/index.js.map +1 -0
  274. package/src/tree-view/index.ts +3 -0
  275. package/src/tree-view/schema.d.ts +1 -0
  276. package/src/tree-view/schema.js +3 -0
  277. package/src/tree-view/schema.js.map +1 -0
  278. package/src/tree-view/schema.json +29 -0
  279. package/src/tree-view/schema.ts +1 -0
@@ -0,0 +1,16 @@
1
+ <!-- Semmet Angular: Slider — https://www.w3.org/WAI/ARIA/apg/patterns/slider/ -->
2
+ <label [id]="instanceId + '-label'">Volume</label>
3
+ <div #track class="track" (pointerdown)="handlePointerDown($event)" (pointermove)="handlePointerMove($event)">
4
+ <div class="fill" [style.width.%]="value()"></div>
5
+ <div
6
+ class="thumb"
7
+ role="slider"
8
+ tabindex="0"
9
+ [attr.aria-labelledby]="instanceId + '-label'"
10
+ [attr.aria-valuemin]="min"
11
+ [attr.aria-valuemax]="max"
12
+ [attr.aria-valuenow]="value()"
13
+ [style.left.%]="value()"
14
+ (keydown)="handleKeydown($event)"
15
+ ></div>
16
+ </div>
@@ -0,0 +1,79 @@
1
+ import { Component, ElementRef, signal, viewChild } from '@angular/core';
2
+
3
+ const MIN = 0;
4
+ const MAX = 100;
5
+ const STEP = 1;
6
+
7
+ let nextId = 0;
8
+
9
+ @Component({
10
+ selector: '<%= selector %>',
11
+ imports: [],
12
+ templateUrl: './<%= dasherize(name) %>.html',
13
+ styleUrl: './<%= dasherize(name) %>.css',
14
+ })
15
+ export class <%= classify(name) %> {
16
+ private readonly trackRef = viewChild<ElementRef<HTMLElement>>('track');
17
+
18
+ protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
19
+ protected readonly min = MIN;
20
+ protected readonly max = MAX;
21
+ protected readonly value = signal(50);
22
+
23
+ protected handleKeydown(event: KeyboardEvent): void {
24
+ switch (event.key) {
25
+ case 'ArrowRight':
26
+ case 'ArrowUp':
27
+ event.preventDefault();
28
+ this.setValue(this.value() + STEP);
29
+ break;
30
+ case 'ArrowLeft':
31
+ case 'ArrowDown':
32
+ event.preventDefault();
33
+ this.setValue(this.value() - STEP);
34
+ break;
35
+ case 'PageUp':
36
+ event.preventDefault();
37
+ this.setValue(this.value() + STEP * 10);
38
+ break;
39
+ case 'PageDown':
40
+ event.preventDefault();
41
+ this.setValue(this.value() - STEP * 10);
42
+ break;
43
+ case 'Home':
44
+ event.preventDefault();
45
+ this.setValue(this.min);
46
+ break;
47
+ case 'End':
48
+ event.preventDefault();
49
+ this.setValue(this.max);
50
+ break;
51
+ }
52
+ }
53
+
54
+ protected handlePointerDown(event: PointerEvent): void {
55
+ (event.target as HTMLElement).setPointerCapture(event.pointerId);
56
+ this.setValueFromPointer(event);
57
+ }
58
+
59
+ protected handlePointerMove(event: PointerEvent): void {
60
+ if (event.buttons !== 1) {
61
+ return;
62
+ }
63
+ this.setValueFromPointer(event);
64
+ }
65
+
66
+ private setValueFromPointer(event: PointerEvent): void {
67
+ const track = this.trackRef()?.nativeElement;
68
+ if (!track) {
69
+ return;
70
+ }
71
+ const rect = track.getBoundingClientRect();
72
+ const ratio = Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width));
73
+ this.setValue(Math.round(this.min + ratio * (this.max - this.min)));
74
+ }
75
+
76
+ private setValue(next: number): void {
77
+ this.value.set(Math.min(this.max, Math.max(this.min, next)));
78
+ }
79
+ }
@@ -0,0 +1 @@
1
+ export declare const slider: (options: import("./schema").Schema) => import("@angular-devkit/schematics").Rule;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.slider = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.slider = (0, generate_component_1.createAriaComponentSchematic)();
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,MAAM,GAAG,IAAA,iDAA4B,GAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createAriaComponentSchematic } from '../utils/generate-component';
2
+
3
+ export const slider = createAriaComponentSchematic();
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "$id": "SemmetAngularSlider",
4
+ "title": "Semmet Angular Slider Options Schema",
5
+ "type": "object",
6
+ "description": "Generates a standalone Angular Slider component (keyboard + pointer drag support) following the W3C ARIA Authoring Practices Guide.",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "description": "The name for the new component. Used to derive the class name, selector, and file names.",
12
+ "$default": { "$source": "argv", "index": 0 },
13
+ "x-prompt": "What name would you like to use for the slider component?"
14
+ },
15
+ "path": {
16
+ "type": "string",
17
+ "format": "path",
18
+ "$default": { "$source": "workingDirectory" },
19
+ "description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
20
+ "visible": false
21
+ },
22
+ "project": {
23
+ "type": "string",
24
+ "description": "The name of the project to add the component to.",
25
+ "$default": { "$source": "projectName" }
26
+ }
27
+ },
28
+ "required": ["name", "project"]
29
+ }
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,64 @@
1
+ :host {
2
+ --semmet-color-primary: #0d7a72;
3
+ --semmet-color-outline: #d7dedd;
4
+ --semmet-color-on-surface: #1b201f;
5
+ --semmet-radius-sm: 8px;
6
+ --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
7
+
8
+ display: inline-block;
9
+ font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
10
+ font-size: 0.9375rem;
11
+ }
12
+
13
+ label {
14
+ display: block;
15
+ margin-bottom: 0.5rem;
16
+ font-weight: 500;
17
+ color: var(--semmet-color-on-surface);
18
+ }
19
+
20
+ .stepper {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ border: 1px solid var(--semmet-color-outline);
24
+ border-radius: var(--semmet-radius-sm);
25
+ overflow: hidden;
26
+ }
27
+
28
+ button {
29
+ font: inherit;
30
+ font-size: 1.125rem;
31
+ color: var(--semmet-color-on-surface);
32
+ background: none;
33
+ border: none;
34
+ width: 2.25rem;
35
+ height: 2.25rem;
36
+ cursor: pointer;
37
+ transition: background-color var(--semmet-motion);
38
+ }
39
+
40
+ button:hover {
41
+ background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
42
+ }
43
+
44
+ button:focus-visible {
45
+ outline: 2px solid var(--semmet-color-primary);
46
+ outline-offset: -2px;
47
+ }
48
+
49
+ input {
50
+ width: 3rem;
51
+ height: 2.25rem;
52
+ border: none;
53
+ border-left: 1px solid var(--semmet-color-outline);
54
+ border-right: 1px solid var(--semmet-color-outline);
55
+ text-align: center;
56
+ font: inherit;
57
+ color: var(--semmet-color-on-surface);
58
+ box-sizing: border-box;
59
+ }
60
+
61
+ input:focus-visible {
62
+ outline: 2px solid var(--semmet-color-primary);
63
+ outline-offset: -2px;
64
+ }
@@ -0,0 +1,19 @@
1
+ <!-- Semmet Angular: Spinbutton — https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/ -->
2
+ <label [id]="instanceId + '-label'" [for]="instanceId + '-input'">Quantity</label>
3
+ <div class="stepper">
4
+ <button type="button" (click)="decrement()" aria-label="Decrease quantity">−</button>
5
+ <input
6
+ type="text"
7
+ inputmode="numeric"
8
+ role="spinbutton"
9
+ [id]="instanceId + '-input'"
10
+ [attr.aria-labelledby]="instanceId + '-label'"
11
+ [attr.aria-valuemin]="min"
12
+ [attr.aria-valuemax]="max"
13
+ [attr.aria-valuenow]="value()"
14
+ [value]="value()"
15
+ (keydown)="handleKeydown($event)"
16
+ (change)="handleInput($event)"
17
+ />
18
+ <button type="button" (click)="increment()" aria-label="Increase quantity">+</button>
19
+ </div>
@@ -0,0 +1,59 @@
1
+ import { Component, signal } from '@angular/core';
2
+
3
+ const MIN = 0;
4
+ const MAX = 99;
5
+
6
+ let nextId = 0;
7
+
8
+ @Component({
9
+ selector: '<%= selector %>',
10
+ imports: [],
11
+ templateUrl: './<%= dasherize(name) %>.html',
12
+ styleUrl: './<%= dasherize(name) %>.css',
13
+ })
14
+ export class <%= classify(name) %> {
15
+ protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
16
+ protected readonly min = MIN;
17
+ protected readonly max = MAX;
18
+ protected readonly value = signal(1);
19
+
20
+ protected increment(): void {
21
+ this.setValue(this.value() + 1);
22
+ }
23
+
24
+ protected decrement(): void {
25
+ this.setValue(this.value() - 1);
26
+ }
27
+
28
+ protected handleKeydown(event: KeyboardEvent): void {
29
+ switch (event.key) {
30
+ case 'ArrowUp':
31
+ event.preventDefault();
32
+ this.increment();
33
+ break;
34
+ case 'ArrowDown':
35
+ event.preventDefault();
36
+ this.decrement();
37
+ break;
38
+ case 'Home':
39
+ event.preventDefault();
40
+ this.setValue(this.min);
41
+ break;
42
+ case 'End':
43
+ event.preventDefault();
44
+ this.setValue(this.max);
45
+ break;
46
+ }
47
+ }
48
+
49
+ protected handleInput(event: Event): void {
50
+ const raw = Number((event.target as HTMLInputElement).value);
51
+ if (!Number.isNaN(raw)) {
52
+ this.setValue(raw);
53
+ }
54
+ }
55
+
56
+ private setValue(next: number): void {
57
+ this.value.set(Math.min(this.max, Math.max(this.min, next)));
58
+ }
59
+ }
@@ -0,0 +1 @@
1
+ export declare const spinbutton: (options: import("./schema").Schema) => import("@angular-devkit/schematics").Rule;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.spinbutton = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.spinbutton = (0, generate_component_1.createAriaComponentSchematic)();
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,UAAU,GAAG,IAAA,iDAA4B,GAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createAriaComponentSchematic } from '../utils/generate-component';
2
+
3
+ export const spinbutton = createAriaComponentSchematic();
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "$id": "SemmetAngularSpinbutton",
4
+ "title": "Semmet Angular Spinbutton Options Schema",
5
+ "type": "object",
6
+ "description": "Generates a standalone Angular Spinbutton component (numeric stepper) following the W3C ARIA Authoring Practices Guide.",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "description": "The name for the new component. Used to derive the class name, selector, and file names.",
12
+ "$default": { "$source": "argv", "index": 0 },
13
+ "x-prompt": "What name would you like to use for the spinbutton component?"
14
+ },
15
+ "path": {
16
+ "type": "string",
17
+ "format": "path",
18
+ "$default": { "$source": "workingDirectory" },
19
+ "description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
20
+ "visible": false
21
+ },
22
+ "project": {
23
+ "type": "string",
24
+ "description": "The name of the project to add the component to.",
25
+ "$default": { "$source": "projectName" }
26
+ }
27
+ },
28
+ "required": ["name", "project"]
29
+ }
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,68 @@
1
+ :host {
2
+ --semmet-color-primary: #0d7a72;
3
+ --semmet-color-outline: #8a9793;
4
+ --semmet-color-surface: #ffffff;
5
+ --semmet-color-on-surface: #1b201f;
6
+ --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
7
+
8
+ display: inline-block;
9
+ font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
10
+ font-size: 0.9375rem;
11
+ }
12
+
13
+ [role='switch'] {
14
+ position: relative;
15
+ display: inline-flex;
16
+ align-items: center;
17
+ padding-left: 2.75rem;
18
+ min-height: 1.5rem;
19
+ font: inherit;
20
+ color: var(--semmet-color-on-surface);
21
+ background: none;
22
+ border: none;
23
+ cursor: pointer;
24
+ }
25
+
26
+ [role='switch']::before {
27
+ content: '';
28
+ position: absolute;
29
+ left: 0;
30
+ top: 50%;
31
+ transform: translateY(-50%);
32
+ width: 2.25rem;
33
+ height: 1.25rem;
34
+ box-sizing: border-box;
35
+ border: 2px solid var(--semmet-color-outline);
36
+ border-radius: 999px;
37
+ background: transparent;
38
+ transition: background-color var(--semmet-motion), border-color var(--semmet-motion);
39
+ }
40
+
41
+ [role='switch']::after {
42
+ content: '';
43
+ position: absolute;
44
+ left: 0.2rem;
45
+ top: 50%;
46
+ transform: translateY(-50%);
47
+ width: 0.85rem;
48
+ height: 0.85rem;
49
+ border-radius: 50%;
50
+ background: var(--semmet-color-outline);
51
+ transition: transform var(--semmet-motion), background-color var(--semmet-motion);
52
+ }
53
+
54
+ [role='switch'][aria-checked='true']::before {
55
+ background: var(--semmet-color-primary);
56
+ border-color: var(--semmet-color-primary);
57
+ }
58
+
59
+ [role='switch'][aria-checked='true']::after {
60
+ background: var(--semmet-color-surface);
61
+ transform: translateY(-50%) translateX(1rem);
62
+ }
63
+
64
+ [role='switch']:focus-visible {
65
+ outline: 2px solid var(--semmet-color-primary);
66
+ outline-offset: 2px;
67
+ border-radius: 4px;
68
+ }
@@ -0,0 +1,4 @@
1
+ <!-- Semmet Angular: Switch — https://www.w3.org/WAI/ARIA/apg/patterns/switch/ -->
2
+ <button type="button" role="switch" [attr.aria-checked]="checked()" [id]="instanceId" (click)="toggle()">
3
+ Enable notifications
4
+ </button>
@@ -0,0 +1,18 @@
1
+ import { Component, signal } from '@angular/core';
2
+
3
+ let nextId = 0;
4
+
5
+ @Component({
6
+ selector: '<%= selector %>',
7
+ imports: [],
8
+ templateUrl: './<%= dasherize(name) %>.html',
9
+ styleUrl: './<%= dasherize(name) %>.css',
10
+ })
11
+ export class <%= classify(name) %> {
12
+ protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
13
+ protected readonly checked = signal(false);
14
+
15
+ protected toggle(): void {
16
+ this.checked.update((value) => !value);
17
+ }
18
+ }
@@ -0,0 +1 @@
1
+ export declare const switchSchematic: (options: import("./schema").Schema) => import("@angular-devkit/schematics").Rule;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.switchSchematic = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.switchSchematic = (0, generate_component_1.createAriaComponentSchematic)();
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,eAAe,GAAG,IAAA,iDAA4B,GAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createAriaComponentSchematic } from '../utils/generate-component';
2
+
3
+ export const switchSchematic = createAriaComponentSchematic();
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "$id": "SemmetAngularSwitch",
4
+ "title": "Semmet Angular Switch Options Schema",
5
+ "type": "object",
6
+ "description": "Generates a standalone Angular Switch component (signal-based boolean toggle) following the W3C ARIA Authoring Practices Guide.",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "description": "The name for the new component. Used to derive the class name, selector, and file names.",
12
+ "$default": { "$source": "argv", "index": 0 },
13
+ "x-prompt": "What name would you like to use for the switch component?"
14
+ },
15
+ "path": {
16
+ "type": "string",
17
+ "format": "path",
18
+ "$default": { "$source": "workingDirectory" },
19
+ "description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
20
+ "visible": false
21
+ },
22
+ "project": {
23
+ "type": "string",
24
+ "description": "The name of the project to add the component to.",
25
+ "$default": { "$source": "projectName" }
26
+ }
27
+ },
28
+ "required": ["name", "project"]
29
+ }
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,40 @@
1
+ :host {
2
+ --semmet-color-outline: #d7dedd;
3
+ --semmet-color-on-surface: #1b201f;
4
+ --semmet-color-on-surface-variant: #576260;
5
+ --semmet-color-surface-variant: #f2f6f5;
6
+
7
+ display: block;
8
+ font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
9
+ font-size: 0.9375rem;
10
+ }
11
+
12
+ table {
13
+ width: 100%;
14
+ border-collapse: collapse;
15
+ }
16
+
17
+ caption {
18
+ text-align: left;
19
+ margin-bottom: 0.75rem;
20
+ font-weight: 500;
21
+ color: var(--semmet-color-on-surface);
22
+ }
23
+
24
+ th,
25
+ td {
26
+ text-align: left;
27
+ padding: 0.625rem 0.75rem;
28
+ border-bottom: 1px solid var(--semmet-color-outline);
29
+ }
30
+
31
+ thead th {
32
+ background: var(--semmet-color-surface-variant);
33
+ color: var(--semmet-color-on-surface-variant);
34
+ font-weight: 500;
35
+ }
36
+
37
+ tbody th {
38
+ color: var(--semmet-color-on-surface);
39
+ font-weight: 500;
40
+ }
@@ -0,0 +1,18 @@
1
+ <!-- Semmet Angular: Table — https://www.w3.org/WAI/ARIA/apg/patterns/table/ -->
2
+ <table>
3
+ <caption>Quarterly results</caption>
4
+ <thead>
5
+ <tr>
6
+ <th scope="col">Quarter</th>
7
+ <th scope="col">Revenue</th>
8
+ </tr>
9
+ </thead>
10
+ <tbody>
11
+ @for (row of rows; track row.quarter) {
12
+ <tr>
13
+ <th scope="row">{{ row.quarter }}</th>
14
+ <td>{{ row.revenue }}</td>
15
+ </tr>
16
+ }
17
+ </tbody>
18
+ </table>
@@ -0,0 +1,19 @@
1
+ import { Component } from '@angular/core';
2
+
3
+ interface <%= classify(name) %>Row {
4
+ quarter: string;
5
+ revenue: string;
6
+ }
7
+
8
+ @Component({
9
+ selector: '<%= selector %>',
10
+ imports: [],
11
+ templateUrl: './<%= dasherize(name) %>.html',
12
+ styleUrl: './<%= dasherize(name) %>.css',
13
+ })
14
+ export class <%= classify(name) %> {
15
+ protected readonly rows: <%= classify(name) %>Row[] = [
16
+ { quarter: 'Q1', revenue: '$12,000' },
17
+ { quarter: 'Q2', revenue: '$15,500' },
18
+ ];
19
+ }
@@ -0,0 +1 @@
1
+ export declare const table: (options: import("./schema").Schema) => import("@angular-devkit/schematics").Rule;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.table = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.table = (0, generate_component_1.createAriaComponentSchematic)();
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAAA,oEAA2E;AAE9D,QAAA,KAAK,GAAG,IAAA,iDAA4B,GAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createAriaComponentSchematic } from '../utils/generate-component';
2
+
3
+ export const table = createAriaComponentSchematic();
@@ -0,0 +1 @@
1
+ export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":""}