semmet-angular 0.4.0 → 0.6.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.
- package/README.md +43 -3
- package/package.json +1 -1
- package/src/accordion/files/__name@dasherize__/__name@dasherize__.css.template +4 -4
- package/src/alert/files/__name@dasherize__/__name@dasherize__.css.template +43 -0
- package/src/alert/files/__name@dasherize__/__name@dasherize__.html.template +7 -0
- package/src/alert/files/__name@dasherize__/__name@dasherize__.ts.template +18 -0
- package/src/alert/index.d.ts +1 -0
- package/src/alert/index.js +6 -0
- package/src/alert/index.js.map +1 -0
- package/src/alert/index.ts +3 -0
- package/src/alert/schema.d.ts +1 -0
- package/src/alert/schema.js +3 -0
- package/src/alert/schema.js.map +1 -0
- package/src/alert/schema.json +29 -0
- package/src/alert/schema.ts +1 -0
- package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.css.template +82 -0
- package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.html.template +20 -0
- package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.ts.template +75 -0
- package/src/alert-dialog/index.d.ts +1 -0
- package/src/alert-dialog/index.js +6 -0
- package/src/alert-dialog/index.js.map +1 -0
- package/src/alert-dialog/index.ts +3 -0
- package/src/alert-dialog/schema.d.ts +1 -0
- package/src/alert-dialog/schema.js +3 -0
- package/src/alert-dialog/schema.js.map +1 -0
- package/src/alert-dialog/schema.json +29 -0
- package/src/alert-dialog/schema.ts +1 -0
- package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.css.template +52 -0
- package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.html.template +9 -0
- package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.ts.template +20 -0
- package/src/breadcrumb/index.d.ts +1 -0
- package/src/breadcrumb/index.js +6 -0
- package/src/breadcrumb/index.js.map +1 -0
- package/src/breadcrumb/index.ts +3 -0
- package/src/breadcrumb/schema.d.ts +1 -0
- package/src/breadcrumb/schema.js +3 -0
- package/src/breadcrumb/schema.js.map +1 -0
- package/src/breadcrumb/schema.json +29 -0
- package/src/breadcrumb/schema.ts +1 -0
- package/src/card/files/__name@dasherize__/__name@dasherize__.css.template +49 -0
- package/src/card/files/__name@dasherize__/__name@dasherize__.html.template +6 -0
- package/src/card/files/__name@dasherize__/__name@dasherize__.ts.template +13 -0
- package/src/card/index.d.ts +1 -0
- package/src/card/index.js +6 -0
- package/src/card/index.js.map +1 -0
- package/src/card/index.ts +3 -0
- package/src/card/schema.d.ts +1 -0
- package/src/card/schema.js +3 -0
- package/src/card/schema.js.map +1 -0
- package/src/card/schema.json +29 -0
- package/src/card/schema.ts +1 -0
- package/src/carousel/files/__name@dasherize__/__name@dasherize__.css.template +58 -0
- package/src/carousel/files/__name@dasherize__/__name@dasherize__.html.template +10 -0
- package/src/carousel/files/__name@dasherize__/__name@dasherize__.ts.template +35 -0
- package/src/carousel/index.d.ts +1 -0
- package/src/carousel/index.js +6 -0
- package/src/carousel/index.js.map +1 -0
- package/src/carousel/index.ts +3 -0
- package/src/carousel/schema.d.ts +1 -0
- package/src/carousel/schema.js +3 -0
- package/src/carousel/schema.js.map +1 -0
- package/src/carousel/schema.json +29 -0
- package/src/carousel/schema.ts +1 -0
- package/src/checkbox/files/__name@dasherize__/__name@dasherize__.css.template +62 -0
- package/src/checkbox/files/__name@dasherize__/__name@dasherize__.html.template +11 -0
- package/src/checkbox/files/__name@dasherize__/__name@dasherize__.ts.template +25 -0
- package/src/checkbox/index.d.ts +1 -0
- package/src/checkbox/index.js +6 -0
- package/src/checkbox/index.js.map +1 -0
- package/src/checkbox/index.ts +3 -0
- package/src/checkbox/schema.d.ts +1 -0
- package/src/checkbox/schema.js +3 -0
- package/src/checkbox/schema.js.map +1 -0
- package/src/checkbox/schema.json +29 -0
- package/src/checkbox/schema.ts +1 -0
- package/src/collection.json +115 -0
- package/src/combobox/files/__name@dasherize__/__name@dasherize__.css.template +75 -0
- package/src/combobox/files/__name@dasherize__/__name@dasherize__.html.template +33 -0
- package/src/combobox/files/__name@dasherize__/__name@dasherize__.ts.template +93 -0
- package/src/combobox/index.d.ts +1 -0
- package/src/combobox/index.js +6 -0
- package/src/combobox/index.js.map +1 -0
- package/src/combobox/index.ts +3 -0
- package/src/combobox/schema.d.ts +1 -0
- package/src/combobox/schema.js +3 -0
- package/src/combobox/schema.js.map +1 -0
- package/src/combobox/schema.json +29 -0
- package/src/combobox/schema.ts +1 -0
- package/src/dialog/files/__name@dasherize__/__name@dasherize__.css.template +3 -3
- package/src/disclosure/files/__name@dasherize__/__name@dasherize__.css.template +4 -4
- package/src/landmarks/files/__name@dasherize__/__name@dasherize__.css.template +61 -0
- package/src/landmarks/files/__name@dasherize__/__name@dasherize__.html.template +17 -0
- package/src/landmarks/files/__name@dasherize__/__name@dasherize__.ts.template +9 -0
- package/src/landmarks/index.d.ts +1 -0
- package/src/landmarks/index.js +6 -0
- package/src/landmarks/index.js.map +1 -0
- package/src/landmarks/index.ts +3 -0
- package/src/landmarks/schema.d.ts +1 -0
- package/src/landmarks/schema.js +3 -0
- package/src/landmarks/schema.js.map +1 -0
- package/src/landmarks/schema.json +29 -0
- package/src/landmarks/schema.ts +1 -0
- package/src/listbox/files/__name@dasherize__/__name@dasherize__.css.template +52 -0
- package/src/listbox/files/__name@dasherize__/__name@dasherize__.html.template +20 -0
- package/src/listbox/files/__name@dasherize__/__name@dasherize__.ts.template +54 -0
- package/src/listbox/index.d.ts +1 -0
- package/src/listbox/index.js +6 -0
- package/src/listbox/index.js.map +1 -0
- package/src/listbox/index.ts +3 -0
- package/src/listbox/schema.d.ts +1 -0
- package/src/listbox/schema.js +3 -0
- package/src/listbox/schema.js.map +1 -0
- package/src/listbox/schema.json +29 -0
- package/src/listbox/schema.ts +1 -0
- package/src/menu-button/files/__name@dasherize__/__name@dasherize__.css.template +82 -0
- package/src/menu-button/files/__name@dasherize__/__name@dasherize__.html.template +34 -0
- package/src/menu-button/files/__name@dasherize__/__name@dasherize__.ts.template +104 -0
- package/src/menu-button/index.d.ts +1 -0
- package/src/menu-button/index.js +6 -0
- package/src/menu-button/index.js.map +1 -0
- package/src/menu-button/index.ts +3 -0
- package/src/menu-button/schema.d.ts +1 -0
- package/src/menu-button/schema.js +3 -0
- package/src/menu-button/schema.js.map +1 -0
- package/src/menu-button/schema.json +29 -0
- package/src/menu-button/schema.ts +1 -0
- package/src/meter/files/__name@dasherize__/__name@dasherize__.css.template +22 -0
- package/src/meter/files/__name@dasherize__/__name@dasherize__.html.template +5 -0
- package/src/meter/files/__name@dasherize__/__name@dasherize__.ts.template +14 -0
- package/src/meter/index.d.ts +1 -0
- package/src/meter/index.js +6 -0
- package/src/meter/index.js.map +1 -0
- package/src/meter/index.ts +3 -0
- package/src/meter/schema.d.ts +1 -0
- package/src/meter/schema.js +3 -0
- package/src/meter/schema.js.map +1 -0
- package/src/meter/schema.json +29 -0
- package/src/meter/schema.ts +1 -0
- package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.css.template +88 -0
- package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.html.template +22 -0
- package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.ts.template +18 -0
- package/src/navigation-menu/index.d.ts +1 -0
- package/src/navigation-menu/index.js +6 -0
- package/src/navigation-menu/index.js.map +1 -0
- package/src/navigation-menu/index.ts +3 -0
- package/src/navigation-menu/schema.d.ts +1 -0
- package/src/navigation-menu/schema.js +3 -0
- package/src/navigation-menu/schema.js.map +1 -0
- package/src/navigation-menu/schema.json +29 -0
- package/src/navigation-menu/schema.ts +1 -0
- package/src/pagination/files/__name@dasherize__/__name@dasherize__.css.template +63 -0
- package/src/pagination/files/__name@dasherize__/__name@dasherize__.html.template +26 -0
- package/src/pagination/files/__name@dasherize__/__name@dasherize__.ts.template +31 -0
- package/src/pagination/index.d.ts +1 -0
- package/src/pagination/index.js +6 -0
- package/src/pagination/index.js.map +1 -0
- package/src/pagination/index.ts +3 -0
- package/src/pagination/schema.d.ts +1 -0
- package/src/pagination/schema.js +3 -0
- package/src/pagination/schema.js.map +1 -0
- package/src/pagination/schema.json +29 -0
- package/src/pagination/schema.ts +1 -0
- package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.css.template +53 -0
- package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.html.template +6 -0
- package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.ts.template +19 -0
- package/src/progress-bar/index.d.ts +1 -0
- package/src/progress-bar/index.js +6 -0
- package/src/progress-bar/index.js.map +1 -0
- package/src/progress-bar/index.ts +3 -0
- package/src/progress-bar/schema.d.ts +1 -0
- package/src/progress-bar/schema.js +3 -0
- package/src/progress-bar/schema.js.map +1 -0
- package/src/progress-bar/schema.json +29 -0
- package/src/progress-bar/schema.ts +1 -0
- package/src/radio-group/files/__name@dasherize__/__name@dasherize__.css.template +66 -0
- package/src/radio-group/files/__name@dasherize__/__name@dasherize__.html.template +16 -0
- package/src/radio-group/files/__name@dasherize__/__name@dasherize__.ts.template +62 -0
- package/src/radio-group/index.d.ts +1 -0
- package/src/radio-group/index.js +6 -0
- package/src/radio-group/index.js.map +1 -0
- package/src/radio-group/index.ts +3 -0
- package/src/radio-group/schema.d.ts +1 -0
- package/src/radio-group/schema.js +3 -0
- package/src/radio-group/schema.js.map +1 -0
- package/src/radio-group/schema.json +29 -0
- package/src/radio-group/schema.ts +1 -0
- package/src/skip-link/files/__name@dasherize__/__name@dasherize__.css.template +30 -0
- package/src/skip-link/files/__name@dasherize__/__name@dasherize__.html.template +3 -0
- package/src/skip-link/files/__name@dasherize__/__name@dasherize__.ts.template +9 -0
- package/src/skip-link/index.d.ts +1 -0
- package/src/skip-link/index.js +6 -0
- package/src/skip-link/index.js.map +1 -0
- package/src/skip-link/index.ts +3 -0
- package/src/skip-link/schema.d.ts +1 -0
- package/src/skip-link/schema.js +3 -0
- package/src/skip-link/schema.js.map +1 -0
- package/src/skip-link/schema.json +29 -0
- package/src/skip-link/schema.ts +1 -0
- package/src/slider/files/__name@dasherize__/__name@dasherize__.css.template +54 -0
- package/src/slider/files/__name@dasherize__/__name@dasherize__.html.template +16 -0
- package/src/slider/files/__name@dasherize__/__name@dasherize__.ts.template +79 -0
- package/src/slider/index.d.ts +1 -0
- package/src/slider/index.js +6 -0
- package/src/slider/index.js.map +1 -0
- package/src/slider/index.ts +3 -0
- package/src/slider/schema.d.ts +1 -0
- package/src/slider/schema.js +3 -0
- package/src/slider/schema.js.map +1 -0
- package/src/slider/schema.json +29 -0
- package/src/slider/schema.ts +1 -0
- package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.css.template +64 -0
- package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.html.template +19 -0
- package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.ts.template +59 -0
- package/src/spinbutton/index.d.ts +1 -0
- package/src/spinbutton/index.js +6 -0
- package/src/spinbutton/index.js.map +1 -0
- package/src/spinbutton/index.ts +3 -0
- package/src/spinbutton/schema.d.ts +1 -0
- package/src/spinbutton/schema.js +3 -0
- package/src/spinbutton/schema.js.map +1 -0
- package/src/spinbutton/schema.json +29 -0
- package/src/spinbutton/schema.ts +1 -0
- package/src/switch/files/__name@dasherize__/__name@dasherize__.css.template +68 -0
- package/src/switch/files/__name@dasherize__/__name@dasherize__.html.template +4 -0
- package/src/switch/files/__name@dasherize__/__name@dasherize__.ts.template +18 -0
- package/src/switch/index.d.ts +1 -0
- package/src/switch/index.js +6 -0
- package/src/switch/index.js.map +1 -0
- package/src/switch/index.ts +3 -0
- package/src/switch/schema.d.ts +1 -0
- package/src/switch/schema.js +3 -0
- package/src/switch/schema.js.map +1 -0
- package/src/switch/schema.json +29 -0
- package/src/switch/schema.ts +1 -0
- package/src/table/files/__name@dasherize__/__name@dasherize__.css.template +40 -0
- package/src/table/files/__name@dasherize__/__name@dasherize__.html.template +18 -0
- package/src/table/files/__name@dasherize__/__name@dasherize__.ts.template +19 -0
- package/src/table/index.d.ts +1 -0
- package/src/table/index.js +6 -0
- package/src/table/index.js.map +1 -0
- package/src/table/index.ts +3 -0
- package/src/table/schema.d.ts +1 -0
- package/src/table/schema.js +3 -0
- package/src/table/schema.js.map +1 -0
- package/src/table/schema.json +29 -0
- package/src/table/schema.ts +1 -0
- package/src/tabs/files/__name@dasherize__/__name@dasherize__.css.template +4 -4
- package/src/toast/files/__name@dasherize__/__name@dasherize__.css.template +56 -0
- package/src/toast/files/__name@dasherize__/__name@dasherize__.html.template +9 -0
- package/src/toast/files/__name@dasherize__/__name@dasherize__.ts.template +33 -0
- package/src/toast/index.d.ts +1 -0
- package/src/toast/index.js +6 -0
- package/src/toast/index.js.map +1 -0
- package/src/toast/index.ts +3 -0
- package/src/toast/schema.d.ts +1 -0
- package/src/toast/schema.js +3 -0
- package/src/toast/schema.js.map +1 -0
- package/src/toast/schema.json +29 -0
- package/src/toast/schema.ts +1 -0
- package/src/toolbar/files/__name@dasherize__/__name@dasherize__.css.template +48 -0
- package/src/toolbar/files/__name@dasherize__/__name@dasherize__.html.template +15 -0
- package/src/toolbar/files/__name@dasherize__/__name@dasherize__.ts.template +71 -0
- package/src/toolbar/index.d.ts +1 -0
- package/src/toolbar/index.js +6 -0
- package/src/toolbar/index.js.map +1 -0
- package/src/toolbar/index.ts +3 -0
- package/src/toolbar/schema.d.ts +1 -0
- package/src/toolbar/schema.js +3 -0
- package/src/toolbar/schema.js.map +1 -0
- package/src/toolbar/schema.json +29 -0
- package/src/toolbar/schema.ts +1 -0
- package/src/tooltip/files/__name@dasherize__/__name@dasherize__.css.template +2 -2
- package/src/tree-view/files/__name@dasherize__/__name@dasherize__.css.template +57 -0
- package/src/tree-view/files/__name@dasherize__/__name@dasherize__.html.template +30 -0
- package/src/tree-view/files/__name@dasherize__/__name@dasherize__.ts.template +140 -0
- package/src/tree-view/index.d.ts +1 -0
- package/src/tree-view/index.js +6 -0
- package/src/tree-view/index.js.map +1 -0
- package/src/tree-view/index.ts +3 -0
- package/src/tree-view/schema.d.ts +1 -0
- package/src/tree-view/schema.js +3 -0
- package/src/tree-view/schema.js.map +1 -0
- package/src/tree-view/schema.json +29 -0
- package/src/tree-view/schema.ts +1 -0
package/README.md
CHANGED
|
@@ -17,15 +17,55 @@ ng generate semmet-angular:accordion my-faq
|
|
|
17
17
|
|
|
18
18
|
Each generated component is dropped into your project exactly like `ng generate component` would (respecting your `angular.json` project, source root, and selector prefix), and has **zero runtime dependency** on this package — `semmet-angular` is only needed at generation time.
|
|
19
19
|
|
|
20
|
-
## Schematics (
|
|
20
|
+
## Schematics (28)
|
|
21
|
+
|
|
22
|
+
**Overlays & disclosure**
|
|
21
23
|
|
|
22
24
|
| Command | Generates | Keyboard/focus behavior implemented |
|
|
23
25
|
|---|---|---|
|
|
24
26
|
| `ng generate semmet-angular:accordion <name>` | [Accordion](https://www.w3.org/WAI/ARIA/apg/patterns/accordion/) | Click/Enter/Space toggle; Up/Down/Home/End moves focus between headers |
|
|
25
|
-
| `ng generate semmet-angular:tabs <name>` | [Tabs](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/) | Automatic activation; Left/Right/Home/End with roving `tabindex` |
|
|
26
|
-
| `ng generate semmet-angular:dialog <name>` | [Dialog (Modal)](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) | Focus moves in on open; Tab/Shift+Tab focus trap; Escape closes; focus returns to trigger on close |
|
|
27
27
|
| `ng generate semmet-angular:disclosure <name>` | [Disclosure](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/) | Click/Enter/Space toggle |
|
|
28
|
+
| `ng generate semmet-angular:dialog <name>` | [Dialog (Modal)](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) | Focus moves in on open; Tab/Shift+Tab focus trap; Escape closes; focus returns to trigger on close |
|
|
29
|
+
| `ng generate semmet-angular:alert-dialog <name>` | [Alert Dialog](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/) | Same focus trap as Dialog; initial focus on the least destructive action (Cancel) |
|
|
28
30
|
| `ng generate semmet-angular:tooltip <name>` | [Tooltip](https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/) | Shows on hover **and** focus (required for keyboard users); hides on blur/mouseleave/Escape |
|
|
31
|
+
| `ng generate semmet-angular:menu-button <name>` | [Menu Button](https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/) | Up/Down/Home/End/Escape inside the menu; closes on outside click; focus returns to the trigger |
|
|
32
|
+
|
|
33
|
+
**Navigation & structure**
|
|
34
|
+
|
|
35
|
+
| Command | Generates | Keyboard/focus behavior implemented |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `ng generate semmet-angular:tabs <name>` | [Tabs](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/) | Automatic activation; Left/Right/Home/End with roving `tabindex` |
|
|
38
|
+
| `ng generate semmet-angular:breadcrumb <name>` | [Breadcrumb](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/) | Static — plain links + `aria-current="page"` |
|
|
39
|
+
| `ng generate semmet-angular:navigation-menu <name>` | [Navigation Menu (Disclosure)](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/) | Click/Enter/Space toggles the submenu — deliberately avoids `role="menu"`, reserved for app-style menus |
|
|
40
|
+
| `ng generate semmet-angular:pagination <name>` | Pagination | Working page state; Previous/Next disable at the boundaries |
|
|
41
|
+
| `ng generate semmet-angular:skip-link <name>` | [Skip Link](https://www.w3.org/WAI/WCAG21/Techniques/general/G1) | Hidden until focused, per the standard skip-link pattern |
|
|
42
|
+
| `ng generate semmet-angular:landmarks <name>` | [Landmarks (Page Skeleton)](https://www.w3.org/WAI/ARIA/apg/practices/landmark-regions/) | Content-projected layout wrapper (`header`/`nav`/`main`/`aside`/`footer` slots) |
|
|
43
|
+
| `ng generate semmet-angular:tree-view <name>` | [Tree View](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/) | Up/Down/Left/Right/Home/End/Enter with roving `tabindex` across visible nodes |
|
|
44
|
+
| `ng generate semmet-angular:toolbar <name>` | [Toolbar](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/) | Left/Right/Home/End with roving `tabindex` |
|
|
45
|
+
| `ng generate semmet-angular:card <name>` | Card | Static — semantic `<article>` + heading structure |
|
|
46
|
+
| `ng generate semmet-angular:table <name>` | [Table](https://www.w3.org/WAI/ARIA/apg/patterns/table/) | Static — caption + scoped headers |
|
|
47
|
+
|
|
48
|
+
**Forms & inputs**
|
|
49
|
+
|
|
50
|
+
| Command | Generates | Keyboard/focus behavior implemented |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `ng generate semmet-angular:checkbox <name>` | [Checkbox](https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/) | Click/Enter/Space toggle |
|
|
53
|
+
| `ng generate semmet-angular:radio-group <name>` | [Radio Group](https://www.w3.org/WAI/ARIA/apg/patterns/radio/) | Up/Down/Left/Right/Home/End move focus and selection together |
|
|
54
|
+
| `ng generate semmet-angular:switch <name>` | [Switch](https://www.w3.org/WAI/ARIA/apg/patterns/switch/) | Native `<button>` — Click/Enter/Space toggle |
|
|
55
|
+
| `ng generate semmet-angular:combobox <name>` | [Combobox](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/) | Live filtering; Up/Down/Home/End/Enter/Escape via `aria-activedescendant` |
|
|
56
|
+
| `ng generate semmet-angular:listbox <name>` | [Listbox](https://www.w3.org/WAI/ARIA/apg/patterns/listbox/) | Up/Down/Home/End via `aria-activedescendant` |
|
|
57
|
+
| `ng generate semmet-angular:slider <name>` | [Slider](https://www.w3.org/WAI/ARIA/apg/patterns/slider/) | Arrow keys/PageUp/PageDown/Home/End, plus pointer drag |
|
|
58
|
+
| `ng generate semmet-angular:spinbutton <name>` | [Spinbutton](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/) | Up/Down/Home/End, plus increment/decrement buttons |
|
|
59
|
+
| `ng generate semmet-angular:meter <name>` | [Meter](https://www.w3.org/TR/wai-aria-1.2/#meter) | Static — native `<meter>` bound to a signal |
|
|
60
|
+
| `ng generate semmet-angular:progress-bar <name>` | [Progress Bar](https://www.w3.org/TR/wai-aria-1.2/#progressbar) | Native `<progress>` bound to a signal |
|
|
61
|
+
|
|
62
|
+
**Feedback & media**
|
|
63
|
+
|
|
64
|
+
| Command | Generates | Keyboard/focus behavior implemented |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `ng generate semmet-angular:alert <name>` | [Alert](https://www.w3.org/WAI/ARIA/apg/patterns/alert/) | Dismissible assertive live region |
|
|
67
|
+
| `ng generate semmet-angular:toast <name>` | Toast / Notification | Auto-dismisses after 5s (cleaned up via `DestroyRef`); dismissible early |
|
|
68
|
+
| `ng generate semmet-angular:carousel <name>` | [Carousel](https://www.w3.org/WAI/ARIA/apg/patterns/carousel/) | Previous/Next controls; `aria-live="polite"` slide region |
|
|
29
69
|
|
|
30
70
|
## What every generated component looks like
|
|
31
71
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semmet-angular",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Angular schematics that generate real, ARIA-conformant standalone components (Accordion, Tabs, Dialog, Disclosure, Tooltip...) with signals-based state and keyboard interaction built in.",
|
|
5
5
|
"publisher": "danilodevsilva",
|
|
6
6
|
"license": "MIT",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
:host {
|
|
2
|
-
--semmet-color-primary: #
|
|
2
|
+
--semmet-color-primary: #18181b;
|
|
3
3
|
--semmet-color-surface: #ffffff;
|
|
4
|
-
--semmet-color-outline: #
|
|
5
|
-
--semmet-color-on-surface: #
|
|
6
|
-
--semmet-color-on-surface-variant: #
|
|
4
|
+
--semmet-color-outline: #d4d4d8;
|
|
5
|
+
--semmet-color-on-surface: #18181b;
|
|
6
|
+
--semmet-color-on-surface-variant: #52525b;
|
|
7
7
|
--semmet-radius-md: 12px;
|
|
8
8
|
--semmet-elevation-1: 0 1px 2px rgba(20, 24, 23, 0.1), 0 1px 1px rgba(20, 24, 23, 0.06);
|
|
9
9
|
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--semmet-color-primary: #18181b;
|
|
3
|
+
--semmet-color-on-primary: #ffffff;
|
|
4
|
+
--semmet-radius-sm: 8px;
|
|
5
|
+
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
6
|
+
|
|
7
|
+
display: block;
|
|
8
|
+
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
9
|
+
font-size: 0.9375rem;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
[role='alert'] {
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
justify-content: space-between;
|
|
16
|
+
gap: 1rem;
|
|
17
|
+
padding: 0.75rem 1rem;
|
|
18
|
+
color: var(--semmet-color-on-primary);
|
|
19
|
+
background: var(--semmet-color-primary);
|
|
20
|
+
border-radius: var(--semmet-radius-sm);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
button {
|
|
24
|
+
font: inherit;
|
|
25
|
+
font-size: 1.125rem;
|
|
26
|
+
line-height: 1;
|
|
27
|
+
color: inherit;
|
|
28
|
+
background: none;
|
|
29
|
+
border: none;
|
|
30
|
+
cursor: pointer;
|
|
31
|
+
border-radius: 4px;
|
|
32
|
+
padding: 0.125rem 0.375rem;
|
|
33
|
+
transition: background-color var(--semmet-motion);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
button:hover {
|
|
37
|
+
background: color-mix(in srgb, var(--semmet-color-on-primary) 20%, transparent);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
button:focus-visible {
|
|
41
|
+
outline: 2px solid var(--semmet-color-on-primary);
|
|
42
|
+
outline-offset: 2px;
|
|
43
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<!-- Semmet Angular: Alert — https://www.w3.org/WAI/ARIA/apg/patterns/alert/ -->
|
|
2
|
+
@if (visible()) {
|
|
3
|
+
<div role="alert" [id]="instanceId">
|
|
4
|
+
<span>Your changes have been saved.</span>
|
|
5
|
+
<button type="button" (click)="dismiss()" aria-label="Dismiss">×</button>
|
|
6
|
+
</div>
|
|
7
|
+
}
|
|
@@ -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 visible = signal(true);
|
|
14
|
+
|
|
15
|
+
protected dismiss(): void {
|
|
16
|
+
this.visible.set(false);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const alert: (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.alert = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.alert = (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 @@
|
|
|
1
|
+
export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
|
|
@@ -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": "SemmetAngularAlert",
|
|
4
|
+
"title": "Semmet Angular Alert Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Alert component (dismissible assertive live region) 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 alert 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,82 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--semmet-color-primary: #18181b;
|
|
3
|
+
--semmet-color-on-primary: #ffffff;
|
|
4
|
+
--semmet-color-surface: #ffffff;
|
|
5
|
+
--semmet-color-on-surface: #18181b;
|
|
6
|
+
--semmet-color-on-surface-variant: #52525b;
|
|
7
|
+
--semmet-color-scrim: rgba(20, 24, 23, 0.45);
|
|
8
|
+
--semmet-radius-lg: 20px;
|
|
9
|
+
--semmet-elevation-3: 0 8px 24px rgba(20, 24, 23, 0.18), 0 2px 8px rgba(20, 24, 23, 0.1);
|
|
10
|
+
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
11
|
+
|
|
12
|
+
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
13
|
+
font-size: 0.9375rem;
|
|
14
|
+
line-height: 1.5;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
button {
|
|
18
|
+
font: inherit;
|
|
19
|
+
font-weight: 500;
|
|
20
|
+
color: var(--semmet-color-primary);
|
|
21
|
+
background: none;
|
|
22
|
+
border: none;
|
|
23
|
+
border-radius: 8px;
|
|
24
|
+
padding: 0.5rem 1rem;
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
transition: background-color var(--semmet-motion);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
button:hover {
|
|
30
|
+
background: color-mix(in srgb, var(--semmet-color-primary) 8%, transparent);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
button:focus-visible {
|
|
34
|
+
outline: 2px solid var(--semmet-color-primary);
|
|
35
|
+
outline-offset: 2px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
[role='alertdialog'] button:last-of-type {
|
|
39
|
+
color: var(--semmet-color-on-primary);
|
|
40
|
+
background: var(--semmet-color-primary);
|
|
41
|
+
margin-left: 0.5rem;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
[role='alertdialog'] button:last-of-type:hover {
|
|
45
|
+
background: color-mix(in srgb, var(--semmet-color-primary) 88%, black);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.backdrop {
|
|
49
|
+
position: fixed;
|
|
50
|
+
inset: 0;
|
|
51
|
+
background: var(--semmet-color-scrim);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
[role='alertdialog'] {
|
|
55
|
+
position: fixed;
|
|
56
|
+
top: 50%;
|
|
57
|
+
left: 50%;
|
|
58
|
+
transform: translate(-50%, -50%);
|
|
59
|
+
min-width: 22rem;
|
|
60
|
+
max-width: 90vw;
|
|
61
|
+
padding: 1.5rem;
|
|
62
|
+
border-radius: var(--semmet-radius-lg);
|
|
63
|
+
background: var(--semmet-color-surface);
|
|
64
|
+
color: var(--semmet-color-on-surface);
|
|
65
|
+
box-shadow: var(--semmet-elevation-3);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
[role='alertdialog']:focus-visible {
|
|
69
|
+
outline: 2px solid var(--semmet-color-primary);
|
|
70
|
+
outline-offset: 2px;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
[role='alertdialog'] h2 {
|
|
74
|
+
margin: 0 0 0.75rem;
|
|
75
|
+
font-size: 1.25rem;
|
|
76
|
+
font-weight: 500;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
[role='alertdialog'] > div {
|
|
80
|
+
margin-bottom: 1.25rem;
|
|
81
|
+
color: var(--semmet-color-on-surface-variant);
|
|
82
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!-- Semmet Angular: Alert Dialog — https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/ -->
|
|
2
|
+
<button type="button" (click)="open($event)">Delete item</button>
|
|
3
|
+
|
|
4
|
+
@if (isOpen()) {
|
|
5
|
+
<div class="backdrop" (click)="close()"></div>
|
|
6
|
+
<div
|
|
7
|
+
#dialog
|
|
8
|
+
role="alertdialog"
|
|
9
|
+
aria-modal="true"
|
|
10
|
+
[attr.aria-labelledby]="instanceId + '-title'"
|
|
11
|
+
[attr.aria-describedby]="instanceId + '-description'"
|
|
12
|
+
tabindex="-1"
|
|
13
|
+
(keydown)="handleDialogKeydown($event)"
|
|
14
|
+
>
|
|
15
|
+
<h2 [id]="instanceId + '-title'">Confirm action</h2>
|
|
16
|
+
<div [id]="instanceId + '-description'">Are you sure you want to continue? This action cannot be undone.</div>
|
|
17
|
+
<button type="button" (click)="close()">Cancel</button>
|
|
18
|
+
<button type="button" (click)="close()">Confirm</button>
|
|
19
|
+
</div>
|
|
20
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Component, ElementRef, Injector, afterNextRender, inject, signal, viewChild } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
const FOCUSABLE_SELECTOR =
|
|
4
|
+
'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
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
|
+
private readonly injector = inject(Injector);
|
|
16
|
+
private readonly dialogRef = viewChild<ElementRef<HTMLElement>>('dialog');
|
|
17
|
+
private triggerElement: HTMLElement | null = null;
|
|
18
|
+
|
|
19
|
+
protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
|
|
20
|
+
protected readonly isOpen = signal(false);
|
|
21
|
+
|
|
22
|
+
protected open(event: MouseEvent): void {
|
|
23
|
+
this.triggerElement = event.currentTarget as HTMLElement;
|
|
24
|
+
this.isOpen.set(true);
|
|
25
|
+
// Focus moves to the first focusable element (Cancel) only after Angular flushes the DOM
|
|
26
|
+
// update that un-hides the dialog — APG recommends focusing the least destructive action.
|
|
27
|
+
afterNextRender(() => this.focusFirstElement(), { injector: this.injector });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected close(): void {
|
|
31
|
+
this.isOpen.set(false);
|
|
32
|
+
this.triggerElement?.focus();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
protected handleDialogKeydown(event: KeyboardEvent): void {
|
|
36
|
+
if (event.key === 'Escape') {
|
|
37
|
+
this.close();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (event.key === 'Tab') {
|
|
41
|
+
this.trapFocus(event);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private focusFirstElement(): void {
|
|
46
|
+
const dialog = this.dialogRef()?.nativeElement;
|
|
47
|
+
const firstFocusable = dialog?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);
|
|
48
|
+
(firstFocusable ?? dialog)?.focus();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Keeps Tab/Shift+Tab cycling within the dialog's focusable elements (APG dialog focus trap).
|
|
52
|
+
private trapFocus(event: KeyboardEvent): void {
|
|
53
|
+
const dialog = this.dialogRef()?.nativeElement;
|
|
54
|
+
if (!dialog) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const focusable = Array.from(dialog.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));
|
|
59
|
+
if (focusable.length === 0) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const first = focusable[0];
|
|
64
|
+
const last = focusable[focusable.length - 1];
|
|
65
|
+
const active = dialog.ownerDocument.activeElement;
|
|
66
|
+
|
|
67
|
+
if (event.shiftKey && active === first) {
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
last.focus();
|
|
70
|
+
} else if (!event.shiftKey && active === last) {
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
first.focus();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const alertDialog: (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.alertDialog = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.alertDialog = (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,WAAW,GAAG,IAAA,iDAA4B,GAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
|
|
@@ -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": "SemmetAngularAlertDialog",
|
|
4
|
+
"title": "Semmet Angular Alert Dialog Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Alert Dialog component (confirmation dialog with focus trap) 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 alert dialog 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,52 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--semmet-color-primary: #18181b;
|
|
3
|
+
--semmet-color-on-surface: #18181b;
|
|
4
|
+
--semmet-color-on-surface-variant: #52525b;
|
|
5
|
+
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
6
|
+
|
|
7
|
+
display: block;
|
|
8
|
+
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
9
|
+
font-size: 0.9375rem;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
ol {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-wrap: wrap;
|
|
15
|
+
align-items: center;
|
|
16
|
+
gap: 0.5rem;
|
|
17
|
+
margin: 0;
|
|
18
|
+
padding: 0;
|
|
19
|
+
list-style: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
li {
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
gap: 0.5rem;
|
|
26
|
+
color: var(--semmet-color-on-surface-variant);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
li:not(:last-child)::after {
|
|
30
|
+
content: '/';
|
|
31
|
+
opacity: 0.6;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
a {
|
|
35
|
+
color: var(--semmet-color-primary);
|
|
36
|
+
text-decoration: none;
|
|
37
|
+
border-radius: 4px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
a:hover {
|
|
41
|
+
text-decoration: underline;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
a:focus-visible {
|
|
45
|
+
outline: 2px solid var(--semmet-color-primary);
|
|
46
|
+
outline-offset: 2px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
li[aria-current='page'] {
|
|
50
|
+
color: var(--semmet-color-on-surface);
|
|
51
|
+
font-weight: 500;
|
|
52
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<!-- Semmet Angular: Breadcrumb — https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/ -->
|
|
2
|
+
<nav aria-label="Breadcrumb">
|
|
3
|
+
<ol>
|
|
4
|
+
@for (item of items; track item.id) {
|
|
5
|
+
<li><a [href]="item.href">{{ item.label }}</a></li>
|
|
6
|
+
}
|
|
7
|
+
<li aria-current="page">Current page</li>
|
|
8
|
+
</ol>
|
|
9
|
+
</nav>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
interface <%= classify(name) %>Item {
|
|
4
|
+
id: number;
|
|
5
|
+
label: string;
|
|
6
|
+
href: string;
|
|
7
|
+
}
|
|
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
|
+
protected readonly items: <%= classify(name) %>Item[] = [
|
|
17
|
+
{ id: 1, label: 'Home', href: '/' },
|
|
18
|
+
{ id: 2, label: 'Category', href: '/category' },
|
|
19
|
+
];
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const breadcrumb: (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.breadcrumb = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.breadcrumb = (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 @@
|
|
|
1
|
+
export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
|
|
@@ -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": "SemmetAngularBreadcrumb",
|
|
4
|
+
"title": "Semmet Angular Breadcrumb Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Breadcrumb component 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 breadcrumb 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';
|