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,29 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "$id": "SemmetAngularTable",
4
+ "title": "Semmet Angular Table Options Schema",
5
+ "type": "object",
6
+ "description": "Generates a standalone Angular accessible data table component (caption, scoped headers), 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 table 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,56 @@
1
+ :host {
2
+ --semmet-color-on-surface: #1b201f;
3
+ --semmet-color-inverse-surface: #2f3736;
4
+ --semmet-color-inverse-on-surface: #ffffff;
5
+ --semmet-radius-sm: 8px;
6
+ --semmet-elevation-3: 0 8px 24px rgba(20, 24, 23, 0.18), 0 2px 8px rgba(20, 24, 23, 0.1);
7
+ --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
8
+
9
+ display: block;
10
+ font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
11
+ font-size: 0.9375rem;
12
+ }
13
+
14
+ button {
15
+ font: inherit;
16
+ font-weight: 500;
17
+ color: var(--semmet-color-on-surface);
18
+ background: none;
19
+ border: 1px solid currentColor;
20
+ border-radius: var(--semmet-radius-sm);
21
+ padding: 0.5rem 1rem;
22
+ cursor: pointer;
23
+ }
24
+
25
+ button:focus-visible {
26
+ outline: 2px solid currentColor;
27
+ outline-offset: 2px;
28
+ }
29
+
30
+ [role='status'] {
31
+ position: fixed;
32
+ left: 50%;
33
+ bottom: 1.5rem;
34
+ transform: translateX(-50%);
35
+ display: flex;
36
+ align-items: center;
37
+ gap: 1rem;
38
+ padding: 0.75rem 1rem;
39
+ color: var(--semmet-color-inverse-on-surface);
40
+ background: var(--semmet-color-inverse-surface);
41
+ border-radius: var(--semmet-radius-sm);
42
+ box-shadow: var(--semmet-elevation-3);
43
+ }
44
+
45
+ [role='status'] button {
46
+ font-size: 1.125rem;
47
+ line-height: 1;
48
+ color: inherit;
49
+ border: none;
50
+ padding: 0.125rem 0.375rem;
51
+ transition: background-color var(--semmet-motion);
52
+ }
53
+
54
+ [role='status'] button:hover {
55
+ background: color-mix(in srgb, var(--semmet-color-inverse-on-surface) 20%, transparent);
56
+ }
@@ -0,0 +1,9 @@
1
+ <!-- Semmet Angular: Toast / Notification — https://www.w3.org/TR/wai-aria-1.2/#status -->
2
+ <button type="button" (click)="show()">Save</button>
3
+
4
+ @if (visible()) {
5
+ <div role="status" [id]="instanceId">
6
+ <span>Your changes have been saved.</span>
7
+ <button type="button" (click)="dismiss()" aria-label="Dismiss">×</button>
8
+ </div>
9
+ }
@@ -0,0 +1,33 @@
1
+ import { Component, DestroyRef, inject, signal } from '@angular/core';
2
+
3
+ const AUTO_DISMISS_MS = 5000;
4
+
5
+ let nextId = 0;
6
+
7
+ @Component({
8
+ selector: '<%= selector %>',
9
+ imports: [],
10
+ templateUrl: './<%= dasherize(name) %>.html',
11
+ styleUrl: './<%= dasherize(name) %>.css',
12
+ })
13
+ export class <%= classify(name) %> {
14
+ private dismissTimeout: ReturnType<typeof setTimeout> | undefined;
15
+
16
+ protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
17
+ protected readonly visible = signal(false);
18
+
19
+ constructor() {
20
+ inject(DestroyRef).onDestroy(() => clearTimeout(this.dismissTimeout));
21
+ }
22
+
23
+ protected show(): void {
24
+ this.visible.set(true);
25
+ clearTimeout(this.dismissTimeout);
26
+ this.dismissTimeout = setTimeout(() => this.visible.set(false), AUTO_DISMISS_MS);
27
+ }
28
+
29
+ protected dismiss(): void {
30
+ clearTimeout(this.dismissTimeout);
31
+ this.visible.set(false);
32
+ }
33
+ }
@@ -0,0 +1 @@
1
+ export declare const toast: (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.toast = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.toast = (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 toast = 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": "SemmetAngularToast",
4
+ "title": "Semmet Angular Toast Options Schema",
5
+ "type": "object",
6
+ "description": "Generates a standalone Angular Toast/Notification component (auto-dismissing polite live region) per WAI-ARIA status role guidance.",
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 toast 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,48 @@
1
+ :host {
2
+ --semmet-color-primary: #0d7a72;
3
+ --semmet-color-on-primary: #ffffff;
4
+ --semmet-color-surface: #ffffff;
5
+ --semmet-color-outline: #d7dedd;
6
+ --semmet-color-on-surface: #1b201f;
7
+ --semmet-radius-sm: 8px;
8
+ --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
9
+
10
+ display: inline-block;
11
+ font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
12
+ font-size: 0.9375rem;
13
+ }
14
+
15
+ [role='toolbar'] {
16
+ display: inline-flex;
17
+ gap: 0.25rem;
18
+ padding: 0.25rem;
19
+ background: var(--semmet-color-surface);
20
+ border: 1px solid var(--semmet-color-outline);
21
+ border-radius: var(--semmet-radius-sm);
22
+ }
23
+
24
+ button {
25
+ font: inherit;
26
+ font-weight: 500;
27
+ color: var(--semmet-color-on-surface);
28
+ background: none;
29
+ border: none;
30
+ border-radius: 6px;
31
+ padding: 0.5rem 0.75rem;
32
+ cursor: pointer;
33
+ transition: background-color var(--semmet-motion), color var(--semmet-motion);
34
+ }
35
+
36
+ button:hover {
37
+ background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
38
+ }
39
+
40
+ button:focus-visible {
41
+ outline: 2px solid var(--semmet-color-primary);
42
+ outline-offset: -2px;
43
+ }
44
+
45
+ button[aria-pressed='true'] {
46
+ background: var(--semmet-color-primary);
47
+ color: var(--semmet-color-on-primary);
48
+ }
@@ -0,0 +1,15 @@
1
+ <!-- Semmet Angular: Toolbar — https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/ -->
2
+ <div role="toolbar" aria-label="Text formatting">
3
+ @for (action of actions; track action.id; let i = $index) {
4
+ <button
5
+ #toolbarButton
6
+ type="button"
7
+ [attr.aria-pressed]="isPressed(action.id)"
8
+ [tabIndex]="activeId() === action.id ? 0 : -1"
9
+ (click)="toggle(action.id)"
10
+ (keydown)="navigateToolbar($event, i)"
11
+ >
12
+ {{ action.label }}
13
+ </button>
14
+ }
15
+ </div>
@@ -0,0 +1,71 @@
1
+ import { Component, ElementRef, signal, viewChildren } from '@angular/core';
2
+
3
+ interface <%= classify(name) %>Action {
4
+ id: number;
5
+ label: 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
+ private readonly buttons = viewChildren<ElementRef<HTMLButtonElement>>('toolbarButton');
16
+
17
+ protected readonly actions: <%= classify(name) %>Action[] = [
18
+ { id: 1, label: 'Bold' },
19
+ { id: 2, label: 'Italic' },
20
+ { id: 3, label: 'Underline' },
21
+ ];
22
+
23
+ protected readonly activeId = signal(this.actions[0].id);
24
+
25
+ private readonly pressedIds = signal<ReadonlySet<number>>(new Set());
26
+
27
+ protected isPressed(id: number): boolean {
28
+ return this.pressedIds().has(id);
29
+ }
30
+
31
+ protected toggle(id: number): void {
32
+ this.activeId.set(id);
33
+ const next = new Set(this.pressedIds());
34
+ if (next.has(id)) {
35
+ next.delete(id);
36
+ } else {
37
+ next.add(id);
38
+ }
39
+ this.pressedIds.set(next);
40
+ }
41
+
42
+ // Left/Right/Home/End move focus across toolbar buttons with roving tabindex (APG toolbar pattern).
43
+ protected navigateToolbar(event: KeyboardEvent, index: number): void {
44
+ const items = this.buttons();
45
+ if (items.length === 0) {
46
+ return;
47
+ }
48
+
49
+ let nextIndex: number;
50
+ switch (event.key) {
51
+ case 'ArrowRight':
52
+ nextIndex = (index + 1) % items.length;
53
+ break;
54
+ case 'ArrowLeft':
55
+ nextIndex = (index - 1 + items.length) % items.length;
56
+ break;
57
+ case 'Home':
58
+ nextIndex = 0;
59
+ break;
60
+ case 'End':
61
+ nextIndex = items.length - 1;
62
+ break;
63
+ default:
64
+ return;
65
+ }
66
+
67
+ event.preventDefault();
68
+ this.activeId.set(this.actions[nextIndex].id);
69
+ items[nextIndex].nativeElement.focus();
70
+ }
71
+ }
@@ -0,0 +1 @@
1
+ export declare const toolbar: (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.toolbar = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.toolbar = (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,OAAO,GAAG,IAAA,iDAA4B,GAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createAriaComponentSchematic } from '../utils/generate-component';
2
+
3
+ export const toolbar = 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": "SemmetAngularToolbar",
4
+ "title": "Semmet Angular Toolbar Options Schema",
5
+ "type": "object",
6
+ "description": "Generates a standalone Angular Toolbar component with roving-tabindex keyboard navigation, 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 toolbar 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,57 @@
1
+ :host {
2
+ --semmet-color-primary: #0d7a72;
3
+ --semmet-color-on-surface: #1b201f;
4
+ --semmet-color-on-surface-variant: #576260;
5
+ --semmet-radius-sm: 6px;
6
+ --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
7
+
8
+ display: block;
9
+ font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
10
+ font-size: 0.9375rem;
11
+ color: var(--semmet-color-on-surface);
12
+ }
13
+
14
+ [role='tree'],
15
+ [role='group'] {
16
+ margin: 0;
17
+ padding: 0;
18
+ list-style: none;
19
+ }
20
+
21
+ [role='group'] {
22
+ padding-left: 1.25rem;
23
+ }
24
+
25
+ [role='treeitem'] {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: 0.4rem;
29
+ padding: 0.4rem 0.5rem;
30
+ border-radius: var(--semmet-radius-sm);
31
+ cursor: pointer;
32
+ transition: background-color var(--semmet-motion);
33
+ }
34
+
35
+ [role='treeitem']:hover {
36
+ background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
37
+ }
38
+
39
+ [role='treeitem']:focus-visible {
40
+ outline: 2px solid var(--semmet-color-primary);
41
+ outline-offset: -2px;
42
+ }
43
+
44
+ [role='treeitem'][aria-expanded]::before {
45
+ content: '';
46
+ width: 0.4rem;
47
+ height: 0.4rem;
48
+ flex-shrink: 0;
49
+ border-right: 2px solid var(--semmet-color-on-surface-variant);
50
+ border-bottom: 2px solid var(--semmet-color-on-surface-variant);
51
+ transform: rotate(-45deg);
52
+ transition: transform var(--semmet-motion);
53
+ }
54
+
55
+ [role='treeitem'][aria-expanded='true']::before {
56
+ transform: rotate(45deg);
57
+ }
@@ -0,0 +1,30 @@
1
+ <!-- Semmet Angular: Tree View — https://www.w3.org/WAI/ARIA/apg/patterns/treeview/ -->
2
+ <ul role="tree" aria-label="Files">
3
+ @for (root of tree; track root.id) {
4
+ <li
5
+ #treeItem
6
+ role="treeitem"
7
+ [attr.aria-expanded]="hasChildren(root) ? isExpanded(root.id) : null"
8
+ [tabIndex]="activeId() === root.id ? 0 : -1"
9
+ (click)="activateItem(root)"
10
+ (keydown)="handleKeydown($event, root.id)"
11
+ >
12
+ {{ root.label }}
13
+ @if (hasChildren(root) && isExpanded(root.id)) {
14
+ <ul role="group">
15
+ @for (child of root.children; track child.id) {
16
+ <li
17
+ #treeItem
18
+ role="treeitem"
19
+ [tabIndex]="activeId() === child.id ? 0 : -1"
20
+ (click)="activateItem(child)"
21
+ (keydown)="handleKeydown($event, child.id)"
22
+ >
23
+ {{ child.label }}
24
+ </li>
25
+ }
26
+ </ul>
27
+ }
28
+ </li>
29
+ }
30
+ </ul>
@@ -0,0 +1,140 @@
1
+ import { Component, ElementRef, computed, signal, viewChildren } from '@angular/core';
2
+
3
+ interface <%= classify(name) %>Node {
4
+ id: number;
5
+ label: string;
6
+ children?: <%= classify(name) %>Node[];
7
+ }
8
+
9
+ interface VisibleNode {
10
+ node: <%= classify(name) %>Node;
11
+ parentId: number | null;
12
+ }
13
+
14
+ @Component({
15
+ selector: '<%= selector %>',
16
+ imports: [],
17
+ templateUrl: './<%= dasherize(name) %>.html',
18
+ styleUrl: './<%= dasherize(name) %>.css',
19
+ })
20
+ export class <%= classify(name) %> {
21
+ private readonly treeItems = viewChildren<ElementRef<HTMLElement>>('treeItem');
22
+
23
+ protected readonly tree: <%= classify(name) %>Node[] = [
24
+ {
25
+ id: 1,
26
+ label: 'Documents',
27
+ children: [
28
+ { id: 2, label: 'Resume.pdf' },
29
+ { id: 3, label: 'Cover Letter.docx' },
30
+ ],
31
+ },
32
+ ];
33
+
34
+ private readonly expandedIds = signal<ReadonlySet<number>>(new Set([1]));
35
+ protected readonly activeId = signal(1);
36
+
37
+ protected readonly visibleNodes = computed<VisibleNode[]>(() => {
38
+ const result: VisibleNode[] = [];
39
+ const walk = (nodes: <%= classify(name) %>Node[], parentId: number | null): void => {
40
+ for (const node of nodes) {
41
+ result.push({ node, parentId });
42
+ if (node.children && this.expandedIds().has(node.id)) {
43
+ walk(node.children, node.id);
44
+ }
45
+ }
46
+ };
47
+ walk(this.tree, null);
48
+ return result;
49
+ });
50
+
51
+ protected isExpanded(id: number): boolean {
52
+ return this.expandedIds().has(id);
53
+ }
54
+
55
+ protected hasChildren(node: <%= classify(name) %>Node): boolean {
56
+ return !!node.children && node.children.length > 0;
57
+ }
58
+
59
+ protected toggle(id: number): void {
60
+ const next = new Set(this.expandedIds());
61
+ if (next.has(id)) {
62
+ next.delete(id);
63
+ } else {
64
+ next.add(id);
65
+ }
66
+ this.expandedIds.set(next);
67
+ }
68
+
69
+ protected activateItem(node: <%= classify(name) %>Node): void {
70
+ this.focusItem(node.id);
71
+ if (this.hasChildren(node)) {
72
+ this.toggle(node.id);
73
+ }
74
+ }
75
+
76
+ // Up/Down move between visible nodes; Right expands or moves into children; Left collapses
77
+ // or moves to the parent; Home/End jump to the first/last visible node (APG tree keyboard support).
78
+ protected handleKeydown(event: KeyboardEvent, id: number): void {
79
+ const visible = this.visibleNodes();
80
+ const index = visible.findIndex((entry) => entry.node.id === id);
81
+ if (index === -1) {
82
+ return;
83
+ }
84
+ const current = visible[index];
85
+
86
+ switch (event.key) {
87
+ case 'ArrowDown':
88
+ event.preventDefault();
89
+ if (index < visible.length - 1) {
90
+ this.focusItem(visible[index + 1].node.id);
91
+ }
92
+ break;
93
+ case 'ArrowUp':
94
+ event.preventDefault();
95
+ if (index > 0) {
96
+ this.focusItem(visible[index - 1].node.id);
97
+ }
98
+ break;
99
+ case 'ArrowRight':
100
+ event.preventDefault();
101
+ if (this.hasChildren(current.node)) {
102
+ if (!this.isExpanded(current.node.id)) {
103
+ this.toggle(current.node.id);
104
+ } else if (index < visible.length - 1) {
105
+ this.focusItem(visible[index + 1].node.id);
106
+ }
107
+ }
108
+ break;
109
+ case 'ArrowLeft':
110
+ event.preventDefault();
111
+ if (this.hasChildren(current.node) && this.isExpanded(current.node.id)) {
112
+ this.toggle(current.node.id);
113
+ } else if (current.parentId !== null) {
114
+ this.focusItem(current.parentId);
115
+ }
116
+ break;
117
+ case 'Home':
118
+ event.preventDefault();
119
+ this.focusItem(visible[0].node.id);
120
+ break;
121
+ case 'End':
122
+ event.preventDefault();
123
+ this.focusItem(visible[visible.length - 1].node.id);
124
+ break;
125
+ case 'Enter':
126
+ case ' ':
127
+ event.preventDefault();
128
+ if (this.hasChildren(current.node)) {
129
+ this.toggle(current.node.id);
130
+ }
131
+ break;
132
+ }
133
+ }
134
+
135
+ private focusItem(id: number): void {
136
+ this.activeId.set(id);
137
+ const index = this.visibleNodes().findIndex((entry) => entry.node.id === id);
138
+ this.treeItems()[index]?.nativeElement.focus();
139
+ }
140
+ }
@@ -0,0 +1 @@
1
+ export declare const treeView: (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.treeView = void 0;
4
+ const generate_component_1 = require("../utils/generate-component");
5
+ exports.treeView = (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,QAAQ,GAAG,IAAA,iDAA4B,GAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createAriaComponentSchematic } from '../utils/generate-component';
2
+
3
+ export const treeView = 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":""}