semmet-angular 0.4.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.
- package/README.md +43 -3
- package/package.json +1 -1
- 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/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/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/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
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!-- Semmet Angular: Pagination — https://www.w3.org/TR/wai-aria-1.2/#aria-current -->
|
|
2
|
+
<nav aria-label="Pagination">
|
|
3
|
+
<ul>
|
|
4
|
+
<li>
|
|
5
|
+
<button type="button" [disabled]="!hasPrevious()" (click)="goToPrevious()" aria-label="Previous page">
|
|
6
|
+
Previous
|
|
7
|
+
</button>
|
|
8
|
+
</li>
|
|
9
|
+
@for (page of pages; track page) {
|
|
10
|
+
<li>
|
|
11
|
+
<a
|
|
12
|
+
[href]="'?page=' + page"
|
|
13
|
+
[attr.aria-current]="page === currentPage() ? 'page' : null"
|
|
14
|
+
(click)="goToPage(page)"
|
|
15
|
+
>
|
|
16
|
+
{{ page }}
|
|
17
|
+
</a>
|
|
18
|
+
</li>
|
|
19
|
+
}
|
|
20
|
+
<li>
|
|
21
|
+
<button type="button" [disabled]="!hasNext()" (click)="goToNext()" aria-label="Next page">
|
|
22
|
+
Next
|
|
23
|
+
</button>
|
|
24
|
+
</li>
|
|
25
|
+
</ul>
|
|
26
|
+
</nav>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Component, computed, signal } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
@Component({
|
|
4
|
+
selector: '<%= selector %>',
|
|
5
|
+
imports: [],
|
|
6
|
+
templateUrl: './<%= dasherize(name) %>.html',
|
|
7
|
+
styleUrl: './<%= dasherize(name) %>.css',
|
|
8
|
+
})
|
|
9
|
+
export class <%= classify(name) %> {
|
|
10
|
+
protected readonly pages = [1, 2, 3, 4, 5];
|
|
11
|
+
protected readonly currentPage = signal(1);
|
|
12
|
+
|
|
13
|
+
protected readonly hasPrevious = computed(() => this.currentPage() > 1);
|
|
14
|
+
protected readonly hasNext = computed(() => this.currentPage() < this.pages.length);
|
|
15
|
+
|
|
16
|
+
protected goToPage(page: number): void {
|
|
17
|
+
this.currentPage.set(page);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected goToPrevious(): void {
|
|
21
|
+
if (this.hasPrevious()) {
|
|
22
|
+
this.currentPage.update((page) => page - 1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected goToNext(): void {
|
|
27
|
+
if (this.hasNext()) {
|
|
28
|
+
this.currentPage.update((page) => page + 1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const pagination: (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.pagination = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.pagination = (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": "SemmetAngularPagination",
|
|
4
|
+
"title": "Semmet Angular Pagination Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Pagination component with working page state, following W3C ARIA guidance on aria-current.",
|
|
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 pagination 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,53 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--semmet-color-primary: #0d7a72;
|
|
3
|
+
--semmet-color-on-surface: #1b201f;
|
|
4
|
+
--semmet-color-on-surface-variant: #576260;
|
|
5
|
+
--semmet-radius-sm: 8px;
|
|
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
|
+
}
|
|
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
|
+
progress {
|
|
21
|
+
display: block;
|
|
22
|
+
width: 100%;
|
|
23
|
+
max-width: 20rem;
|
|
24
|
+
height: 0.5rem;
|
|
25
|
+
margin-bottom: 0.75rem;
|
|
26
|
+
accent-color: var(--semmet-color-primary);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
button {
|
|
30
|
+
font: inherit;
|
|
31
|
+
font-weight: 500;
|
|
32
|
+
color: var(--semmet-color-primary);
|
|
33
|
+
background: none;
|
|
34
|
+
border: 1px solid currentColor;
|
|
35
|
+
border-radius: var(--semmet-radius-sm);
|
|
36
|
+
padding: 0.5rem 1rem;
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
transition: background-color var(--semmet-motion);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
button:hover:not(:disabled) {
|
|
42
|
+
background: color-mix(in srgb, var(--semmet-color-primary) 8%, transparent);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
button:disabled {
|
|
46
|
+
color: var(--semmet-color-on-surface-variant);
|
|
47
|
+
cursor: not-allowed;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
button:focus-visible {
|
|
51
|
+
outline: 2px solid var(--semmet-color-primary);
|
|
52
|
+
outline-offset: 2px;
|
|
53
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<!-- Semmet Angular: Progress Bar — https://www.w3.org/TR/wai-aria-1.2/#progressbar -->
|
|
2
|
+
<label [for]="instanceId">Uploading file</label>
|
|
3
|
+
<progress [id]="instanceId" [value]="value()" max="100">{{ value() }}%</progress>
|
|
4
|
+
<button type="button" (click)="advance()" [disabled]="isComplete()">
|
|
5
|
+
{{ isComplete() ? 'Done' : 'Simulate progress' }}
|
|
6
|
+
</button>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Component, computed, 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 value = signal(40);
|
|
14
|
+
protected readonly isComplete = computed(() => this.value() >= 100);
|
|
15
|
+
|
|
16
|
+
protected advance(): void {
|
|
17
|
+
this.value.update((current) => Math.min(100, current + 20));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const progressBar: (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.progressBar = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.progressBar = (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": "SemmetAngularProgressBar",
|
|
4
|
+
"title": "Semmet Angular Progress Bar Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Progress Bar component (native <progress>, signal-based value).",
|
|
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 progress bar 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,66 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--semmet-color-primary: #0d7a72;
|
|
3
|
+
--semmet-color-outline: #8a9793;
|
|
4
|
+
--semmet-color-on-surface: #1b201f;
|
|
5
|
+
--semmet-color-on-surface-variant: #576260;
|
|
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
|
+
}
|
|
12
|
+
|
|
13
|
+
[role='radiogroup'] > span {
|
|
14
|
+
display: block;
|
|
15
|
+
margin-bottom: 0.5rem;
|
|
16
|
+
font-weight: 500;
|
|
17
|
+
color: var(--semmet-color-on-surface);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
[role='radio'] {
|
|
21
|
+
position: relative;
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
padding: 0.4rem 0 0.4rem 1.75rem;
|
|
25
|
+
color: var(--semmet-color-on-surface-variant);
|
|
26
|
+
cursor: pointer;
|
|
27
|
+
user-select: none;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
[role='radio']::before {
|
|
31
|
+
content: '';
|
|
32
|
+
position: absolute;
|
|
33
|
+
left: 0;
|
|
34
|
+
width: 1.125rem;
|
|
35
|
+
height: 1.125rem;
|
|
36
|
+
box-sizing: border-box;
|
|
37
|
+
border: 2px solid var(--semmet-color-outline);
|
|
38
|
+
border-radius: 50%;
|
|
39
|
+
transition: border-color var(--semmet-motion);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
[role='radio'][aria-checked='true'] {
|
|
43
|
+
color: var(--semmet-color-on-surface);
|
|
44
|
+
font-weight: 500;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
[role='radio'][aria-checked='true']::before {
|
|
48
|
+
border-color: var(--semmet-color-primary);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
[role='radio'][aria-checked='true']::after {
|
|
52
|
+
content: '';
|
|
53
|
+
position: absolute;
|
|
54
|
+
left: 0.3125rem;
|
|
55
|
+
top: 0.3125rem;
|
|
56
|
+
width: 0.625rem;
|
|
57
|
+
height: 0.625rem;
|
|
58
|
+
border-radius: 50%;
|
|
59
|
+
background: var(--semmet-color-primary);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
[role='radio']:focus-visible {
|
|
63
|
+
outline: 2px solid var(--semmet-color-primary);
|
|
64
|
+
outline-offset: 2px;
|
|
65
|
+
border-radius: 4px;
|
|
66
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- Semmet Angular: Radio Group — https://www.w3.org/WAI/ARIA/apg/patterns/radio/ -->
|
|
2
|
+
<div role="radiogroup" [attr.aria-labelledby]="instanceId + '-label'">
|
|
3
|
+
<span [id]="instanceId + '-label'">Choose a plan</span>
|
|
4
|
+
@for (option of options; track option.id; let i = $index) {
|
|
5
|
+
<div
|
|
6
|
+
#radio
|
|
7
|
+
role="radio"
|
|
8
|
+
[attr.aria-checked]="selectedId() === option.id"
|
|
9
|
+
[tabIndex]="selectedId() === option.id ? 0 : -1"
|
|
10
|
+
(click)="select(option.id)"
|
|
11
|
+
(keydown)="navigateGroup($event, i)"
|
|
12
|
+
>
|
|
13
|
+
{{ option.label }}
|
|
14
|
+
</div>
|
|
15
|
+
}
|
|
16
|
+
</div>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Component, ElementRef, signal, viewChildren } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
interface <%= classify(name) %>Option {
|
|
4
|
+
id: number;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let nextId = 0;
|
|
9
|
+
|
|
10
|
+
@Component({
|
|
11
|
+
selector: '<%= selector %>',
|
|
12
|
+
imports: [],
|
|
13
|
+
templateUrl: './<%= dasherize(name) %>.html',
|
|
14
|
+
styleUrl: './<%= dasherize(name) %>.css',
|
|
15
|
+
})
|
|
16
|
+
export class <%= classify(name) %> {
|
|
17
|
+
private readonly radios = viewChildren<ElementRef<HTMLElement>>('radio');
|
|
18
|
+
|
|
19
|
+
protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
|
|
20
|
+
protected readonly options: <%= classify(name) %>Option[] = [
|
|
21
|
+
{ id: 1, label: 'Monthly' },
|
|
22
|
+
{ id: 2, label: 'Yearly' },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
protected readonly selectedId = signal(this.options[0].id);
|
|
26
|
+
|
|
27
|
+
protected select(id: number): void {
|
|
28
|
+
this.selectedId.set(id);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Up/Down/Left/Right move focus and selection together; Home/End jump to first/last (APG radio group pattern).
|
|
32
|
+
protected navigateGroup(event: KeyboardEvent, index: number): void {
|
|
33
|
+
const items = this.radios();
|
|
34
|
+
if (items.length === 0) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let nextIndex: number;
|
|
39
|
+
switch (event.key) {
|
|
40
|
+
case 'ArrowDown':
|
|
41
|
+
case 'ArrowRight':
|
|
42
|
+
nextIndex = (index + 1) % items.length;
|
|
43
|
+
break;
|
|
44
|
+
case 'ArrowUp':
|
|
45
|
+
case 'ArrowLeft':
|
|
46
|
+
nextIndex = (index - 1 + items.length) % items.length;
|
|
47
|
+
break;
|
|
48
|
+
case 'Home':
|
|
49
|
+
nextIndex = 0;
|
|
50
|
+
break;
|
|
51
|
+
case 'End':
|
|
52
|
+
nextIndex = items.length - 1;
|
|
53
|
+
break;
|
|
54
|
+
default:
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
event.preventDefault();
|
|
59
|
+
this.selectedId.set(this.options[nextIndex].id);
|
|
60
|
+
items[nextIndex].nativeElement.focus();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const radioGroup: (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.radioGroup = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.radioGroup = (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": "SemmetAngularRadioGroup",
|
|
4
|
+
"title": "Semmet Angular Radio Group Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Radio Group 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 radio group 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,30 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--semmet-color-primary: #0d7a72;
|
|
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
|
+
.skip-link {
|
|
13
|
+
position: absolute;
|
|
14
|
+
top: -3rem;
|
|
15
|
+
left: 0.5rem;
|
|
16
|
+
z-index: 100;
|
|
17
|
+
padding: 0.625rem 1rem;
|
|
18
|
+
color: var(--semmet-color-on-primary);
|
|
19
|
+
background: var(--semmet-color-primary);
|
|
20
|
+
border-radius: var(--semmet-radius-sm);
|
|
21
|
+
text-decoration: none;
|
|
22
|
+
font-weight: 500;
|
|
23
|
+
transition: top var(--semmet-motion);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.skip-link:focus-visible {
|
|
27
|
+
top: 0.5rem;
|
|
28
|
+
outline: 2px solid var(--semmet-color-on-primary);
|
|
29
|
+
outline-offset: 2px;
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const skipLink: (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.skipLink = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.skipLink = (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 @@
|
|
|
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": "SemmetAngularSkipLink",
|
|
4
|
+
"title": "Semmet Angular Skip Link Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Skip Link component (skip to main content), per WCAG Technique G1.",
|
|
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 skip link 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,54 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--semmet-color-primary: #0d7a72;
|
|
3
|
+
--semmet-color-outline: #d7dedd;
|
|
4
|
+
--semmet-color-on-surface: #1b201f;
|
|
5
|
+
--semmet-motion: 120ms 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
|
+
max-width: 20rem;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
label {
|
|
14
|
+
display: block;
|
|
15
|
+
margin-bottom: 0.75rem;
|
|
16
|
+
font-weight: 500;
|
|
17
|
+
color: var(--semmet-color-on-surface);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.track {
|
|
21
|
+
position: relative;
|
|
22
|
+
height: 0.25rem;
|
|
23
|
+
border-radius: 999px;
|
|
24
|
+
background: var(--semmet-color-outline);
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
touch-action: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.fill {
|
|
30
|
+
position: absolute;
|
|
31
|
+
top: 0;
|
|
32
|
+
left: 0;
|
|
33
|
+
height: 100%;
|
|
34
|
+
border-radius: 999px;
|
|
35
|
+
background: var(--semmet-color-primary);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.thumb {
|
|
39
|
+
position: absolute;
|
|
40
|
+
top: 50%;
|
|
41
|
+
width: 1.125rem;
|
|
42
|
+
height: 1.125rem;
|
|
43
|
+
transform: translate(-50%, -50%);
|
|
44
|
+
border-radius: 50%;
|
|
45
|
+
background: var(--semmet-color-primary);
|
|
46
|
+
box-shadow: 0 1px 3px rgba(20, 24, 23, 0.25);
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
transition: box-shadow var(--semmet-motion);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.thumb:focus-visible {
|
|
52
|
+
outline: 2px solid var(--semmet-color-primary);
|
|
53
|
+
outline-offset: 2px;
|
|
54
|
+
}
|