semmet-angular 0.42.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +2 -315
- package/README.md +169 -264
- package/package.json +2 -2
- package/src/accordion/files/__name@dasherize__/__name@dasherize__.css.template +4 -41
- package/src/accordion/schema.json +19 -4
- package/src/alert/files/__name@dasherize__/__name@dasherize__.css.template +1 -25
- package/src/alert/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
- package/src/alert/files/__name@dasherize__/__name@dasherize__.ts.template +4 -1
- package/src/alert/schema.json +19 -4
- package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.css.template +3 -56
- package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.html.template +6 -6
- package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.ts.template +7 -1
- package/src/alert-dialog/schema.json +19 -4
- package/src/avatar/files/__name@dasherize__/__name@dasherize__.css.template +17 -0
- package/src/avatar/files/__name@dasherize__/__name@dasherize__.html.template +28 -0
- package/src/avatar/files/__name@dasherize__/__name@dasherize__.spec.ts.template +27 -0
- package/src/avatar/files/__name@dasherize__/__name@dasherize__.ts.template +35 -0
- package/src/avatar/index.d.ts +1 -0
- package/src/avatar/index.js +6 -0
- package/src/avatar/index.js.map +1 -0
- package/src/avatar/index.ts +3 -0
- package/src/avatar/schema.d.ts +1 -0
- package/src/avatar/schema.js +3 -0
- package/src/avatar/schema.js.map +1 -0
- package/src/avatar/schema.json +44 -0
- package/src/avatar/schema.ts +1 -0
- package/src/badge/files/__name@dasherize__/__name@dasherize__.css.template +0 -77
- package/src/badge/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
- package/src/badge/schema.json +19 -4
- package/src/block/files/__name@dasherize__/__name@dasherize__.css.template +10 -81
- package/src/block/files/__name@dasherize__/__name@dasherize__.html.template +33 -25
- package/src/block/files/__name@dasherize__/__name@dasherize__.ts.template +41 -10
- package/src/block/schema.json +19 -4
- package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.css.template +2 -23
- package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
- package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.ts.template +9 -5
- package/src/breadcrumb/schema.json +19 -4
- package/src/button/files/__name@dasherize__/__name@dasherize__.css.template +2 -79
- package/src/button/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
- package/src/button/schema.json +19 -4
- package/src/button-group/files/__name@dasherize__/__name@dasherize__.css.template +2 -70
- package/src/button-group/files/__name@dasherize__/__name@dasherize__.ts.template +1 -2
- package/src/button-group/schema.json +19 -4
- package/src/card/files/__name@dasherize__/__name@dasherize__.css.template +0 -67
- package/src/card/files/__name@dasherize__/__name@dasherize__.html.template +10 -55
- package/src/card/files/__name@dasherize__/__name@dasherize__.ts.template +2 -45
- package/src/card/schema.json +19 -4
- package/src/carousel/files/__name@dasherize__/__name@dasherize__.css.template +2 -32
- package/src/carousel/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
- package/src/carousel/files/__name@dasherize__/__name@dasherize__.ts.template +4 -0
- package/src/carousel/schema.json +19 -4
- package/src/checkbox/files/__name@dasherize__/__name@dasherize__.css.template +5 -21
- package/src/checkbox/schema.json +19 -4
- package/src/close-button/files/__name@dasherize__/__name@dasherize__.css.template +9 -47
- package/src/close-button/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
- package/src/close-button/schema.json +19 -4
- package/src/collection.json +15 -0
- package/src/combobox/files/__name@dasherize__/__name@dasherize__.css.template +4 -49
- package/src/combobox/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/combobox/files/__name@dasherize__/__name@dasherize__.ts.template +11 -8
- package/src/combobox/schema.json +19 -4
- package/src/dialog/files/__name@dasherize__/__name@dasherize__.css.template +3 -45
- package/src/dialog/files/__name@dasherize__/__name@dasherize__.html.template +5 -5
- package/src/dialog/files/__name@dasherize__/__name@dasherize__.ts.template +6 -1
- package/src/dialog/schema.json +19 -4
- package/src/disclosure/files/__name@dasherize__/__name@dasherize__.css.template +4 -36
- package/src/disclosure/schema.json +19 -4
- package/src/form/files/__name@dasherize__/__name@dasherize__.css.template +1 -77
- package/src/form/files/__name@dasherize__/__name@dasherize__.html.template +7 -7
- package/src/form/files/__name@dasherize__/__name@dasherize__.ts.template +20 -7
- package/src/form/schema.json +19 -4
- package/src/input/files/__name@dasherize__/__name@dasherize__.css.template +2 -58
- package/src/input/schema.json +19 -4
- package/src/input-group/files/__name@dasherize__/__name@dasherize__.css.template +2 -68
- package/src/input-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -5
- package/src/input-group/files/__name@dasherize__/__name@dasherize__.ts.template +21 -6
- package/src/input-group/schema.json +19 -4
- package/src/landmarks/files/__name@dasherize__/__name@dasherize__.css.template +0 -24
- package/src/landmarks/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/landmarks/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
- package/src/landmarks/schema.json +19 -4
- package/src/list-group/files/__name@dasherize__/__name@dasherize__.css.template +0 -123
- package/src/list-group/files/__name@dasherize__/__name@dasherize__.e2e-spec.ts.template +8 -9
- package/src/list-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -47
- package/src/list-group/files/__name@dasherize__/__name@dasherize__.spec.ts.template +46 -24
- package/src/list-group/files/__name@dasherize__/__name@dasherize__.ts.template +97 -39
- package/src/list-group/schema.json +19 -4
- package/src/listbox/files/__name@dasherize__/__name@dasherize__.css.template +3 -37
- package/src/listbox/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/listbox/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
- package/src/listbox/schema.json +19 -4
- package/src/menu-button/files/__name@dasherize__/__name@dasherize__.css.template +7 -47
- package/src/menu-button/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
- package/src/menu-button/files/__name@dasherize__/__name@dasherize__.ts.template +10 -7
- package/src/menu-button/schema.json +19 -4
- package/src/meter/files/__name@dasherize__/__name@dasherize__.css.template +0 -12
- package/src/meter/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/meter/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
- package/src/meter/schema.json +19 -4
- package/src/navbar/files/__name@dasherize__/__name@dasherize__.css.template +6 -62
- package/src/navbar/schema.json +19 -4
- package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.css.template +6 -37
- package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.html.template +7 -6
- package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.ts.template +15 -1
- package/src/navigation-menu/schema.json +19 -4
- package/src/offcanvas/files/__name@dasherize__/__name@dasherize__.css.template +3 -70
- package/src/offcanvas/schema.json +19 -4
- package/src/pagination/files/__name@dasherize__/__name@dasherize__.css.template +2 -33
- package/src/pagination/files/__name@dasherize__/__name@dasherize__.html.template +6 -6
- package/src/pagination/files/__name@dasherize__/__name@dasherize__.ts.template +7 -1
- package/src/pagination/schema.json +19 -4
- package/src/popover/files/__name@dasherize__/__name@dasherize__.css.template +8 -69
- package/src/popover/schema.json +19 -4
- package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.css.template +1 -31
- package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
- package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
- package/src/progress-bar/schema.json +19 -4
- package/src/radio-group/files/__name@dasherize__/__name@dasherize__.css.template +4 -31
- package/src/radio-group/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/radio-group/files/__name@dasherize__/__name@dasherize__.ts.template +2 -1
- package/src/radio-group/schema.json +19 -4
- package/src/rating/files/__name@dasherize__/__name@dasherize__.css.template +17 -0
- package/src/rating/files/__name@dasherize__/__name@dasherize__.html.template +34 -0
- package/src/rating/files/__name@dasherize__/__name@dasherize__.spec.ts.template +38 -0
- package/src/rating/files/__name@dasherize__/__name@dasherize__.ts.template +75 -0
- package/src/rating/index.d.ts +1 -0
- package/src/rating/index.js +6 -0
- package/src/rating/index.js.map +1 -0
- package/src/rating/index.ts +3 -0
- package/src/rating/schema.d.ts +1 -0
- package/src/rating/schema.js +3 -0
- package/src/rating/schema.js.map +1 -0
- package/src/rating/schema.json +44 -0
- package/src/rating/schema.ts +1 -0
- package/src/select/files/__name@dasherize__/__name@dasherize__.css.template +4 -55
- package/src/select/schema.json +19 -4
- package/src/skeleton/files/__name@dasherize__/__name@dasherize__.css.template +2 -29
- package/src/skeleton/files/__name@dasherize__/__name@dasherize__.ts.template +1 -3
- package/src/skeleton/schema.json +19 -4
- package/src/skip-link/files/__name@dasherize__/__name@dasherize__.css.template +2 -14
- package/src/skip-link/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/skip-link/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
- package/src/skip-link/schema.json +19 -4
- package/src/slider/files/__name@dasherize__/__name@dasherize__.css.template +6 -20
- package/src/slider/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/slider/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
- package/src/slider/schema.json +19 -4
- package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.css.template +6 -35
- package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
- package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
- package/src/spinbutton/schema.json +19 -4
- package/src/spinner/files/__name@dasherize__/__name@dasherize__.css.template +0 -43
- package/src/spinner/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
- package/src/spinner/schema.json +19 -4
- package/src/steps/files/__name@dasherize__/__name@dasherize__.css.template +36 -0
- package/src/steps/files/__name@dasherize__/__name@dasherize__.html.template +44 -0
- package/src/steps/files/__name@dasherize__/__name@dasherize__.spec.ts.template +35 -0
- package/src/steps/files/__name@dasherize__/__name@dasherize__.ts.template +107 -0
- package/src/steps/index.d.ts +1 -0
- package/src/steps/index.js +6 -0
- package/src/steps/index.js.map +1 -0
- package/src/steps/index.ts +3 -0
- package/src/steps/schema.d.ts +1 -0
- package/src/steps/schema.js +3 -0
- package/src/steps/schema.js.map +1 -0
- package/src/steps/schema.json +44 -0
- package/src/steps/schema.ts +1 -0
- package/src/switch/files/__name@dasherize__/__name@dasherize__.css.template +7 -22
- package/src/switch/schema.json +19 -4
- package/src/table/files/__name@dasherize__/__name@dasherize__.css.template +0 -25
- package/src/table/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
- package/src/table/files/__name@dasherize__/__name@dasherize__.ts.template +3 -0
- package/src/table/schema.json +19 -4
- package/src/tabs/files/__name@dasherize__/__name@dasherize__.css.template +5 -44
- package/src/tabs/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
- package/src/tabs/files/__name@dasherize__/__name@dasherize__.ts.template +2 -0
- package/src/tabs/schema.json +19 -4
- package/src/textarea/files/__name@dasherize__/__name@dasherize__.css.template +2 -59
- package/src/textarea/schema.json +19 -4
- package/src/toast/files/__name@dasherize__/__name@dasherize__.css.template +1 -35
- package/src/toast/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
- package/src/toast/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
- package/src/toast/schema.json +19 -4
- package/src/toolbar/files/__name@dasherize__/__name@dasherize__.css.template +2 -36
- package/src/toolbar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
- package/src/toolbar/files/__name@dasherize__/__name@dasherize__.ts.template +11 -8
- package/src/toolbar/schema.json +19 -4
- package/src/tooltip/files/__name@dasherize__/__name@dasherize__.css.template +1 -32
- package/src/tooltip/schema.json +19 -4
- package/src/tree-view/files/__name@dasherize__/__name@dasherize__.css.template +5 -27
- package/src/tree-view/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
- package/src/tree-view/files/__name@dasherize__/__name@dasherize__.ts.template +16 -13
- package/src/tree-view/schema.json +19 -4
- package/src/utils/generate-component.js +3 -1
- package/src/utils/generate-component.js.map +1 -1
- package/src/utils/generate-component.ts +3 -1
- package/src/utils/generate-composition.js +0 -1
- package/src/utils/generate-composition.js.map +1 -1
- package/src/utils/generate-composition.ts +0 -1
- package/src/utils/schema-types.d.ts +1 -0
- package/src/utils/schema-types.ts +1 -0
- package/README.pt-BR.md +0 -330
package/src/spinner/schema.json
CHANGED
|
@@ -9,21 +9,36 @@
|
|
|
9
9
|
"name": {
|
|
10
10
|
"type": "string",
|
|
11
11
|
"description": "The name for the new component. Used to derive the class name, selector, and file names.",
|
|
12
|
-
"$default": {
|
|
12
|
+
"$default": {
|
|
13
|
+
"$source": "argv",
|
|
14
|
+
"index": 0
|
|
15
|
+
},
|
|
13
16
|
"x-prompt": "What name would you like to use for the spinner component?"
|
|
14
17
|
},
|
|
18
|
+
"e2e": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"default": false,
|
|
21
|
+
"description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
|
|
22
|
+
},
|
|
15
23
|
"path": {
|
|
16
24
|
"type": "string",
|
|
17
25
|
"format": "path",
|
|
18
|
-
"$default": {
|
|
26
|
+
"$default": {
|
|
27
|
+
"$source": "workingDirectory"
|
|
28
|
+
},
|
|
19
29
|
"description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
|
|
20
30
|
"visible": false
|
|
21
31
|
},
|
|
22
32
|
"project": {
|
|
23
33
|
"type": "string",
|
|
24
34
|
"description": "The name of the project to add the component to.",
|
|
25
|
-
"$default": {
|
|
35
|
+
"$default": {
|
|
36
|
+
"$source": "projectName"
|
|
37
|
+
}
|
|
26
38
|
}
|
|
27
39
|
},
|
|
28
|
-
"required": [
|
|
40
|
+
"required": [
|
|
41
|
+
"name",
|
|
42
|
+
"project"
|
|
43
|
+
]
|
|
29
44
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.semmet-steps {
|
|
6
|
+
margin: 0;
|
|
7
|
+
padding: 0;
|
|
8
|
+
list-style: none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.semmet-steps__control,
|
|
12
|
+
.semmet-steps__entry {
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
color: inherit;
|
|
16
|
+
font: inherit;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.semmet-steps__control {
|
|
20
|
+
background: none;
|
|
21
|
+
border: 0;
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.semmet-steps__control:disabled {
|
|
26
|
+
cursor: not-allowed;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.semmet-steps__control:focus-visible {
|
|
30
|
+
outline: 2px solid currentColor;
|
|
31
|
+
outline-offset: 2px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.semmet-steps__content {
|
|
35
|
+
display: grid;
|
|
36
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!-- Semmet Angular: Steps - ordered progress with current-step semantics and optional keyboard navigation. -->
|
|
2
|
+
<!--
|
|
3
|
+
Usage from a parent component template:
|
|
4
|
+
Import <%= classify(name) %> in that parent component.
|
|
5
|
+
|
|
6
|
+
<<%= selector %> />
|
|
7
|
+
<<%= selector %> interactive />
|
|
8
|
+
-->
|
|
9
|
+
<ol class="semmet-steps" [attr.aria-label]="label()">
|
|
10
|
+
@for (step of steps(); track step.id; let i = $index) {
|
|
11
|
+
<li class="semmet-steps__item" [attr.aria-current]="isCurrent(step) ? 'step' : null">
|
|
12
|
+
@if (interactive()) {
|
|
13
|
+
<button
|
|
14
|
+
#stepButton
|
|
15
|
+
type="button"
|
|
16
|
+
class="semmet-steps__control"
|
|
17
|
+
[disabled]="step.disabled"
|
|
18
|
+
[attr.aria-current]="isCurrent(step) ? 'step' : null"
|
|
19
|
+
[tabIndex]="isCurrent(step) ? 0 : -1"
|
|
20
|
+
(click)="select(step)"
|
|
21
|
+
(keydown)="navigate($event, i)"
|
|
22
|
+
>
|
|
23
|
+
<span class="semmet-steps__index" aria-hidden="true">{{ i + 1 }}</span>
|
|
24
|
+
<span class="semmet-steps__content">
|
|
25
|
+
<span class="semmet-steps__label">{{ step.label }}</span>
|
|
26
|
+
@if (step.description) {
|
|
27
|
+
<span class="semmet-steps__description">{{ step.description }}</span>
|
|
28
|
+
}
|
|
29
|
+
</span>
|
|
30
|
+
</button>
|
|
31
|
+
} @else {
|
|
32
|
+
<span class="semmet-steps__entry">
|
|
33
|
+
<span class="semmet-steps__index" aria-hidden="true">{{ i + 1 }}</span>
|
|
34
|
+
<span class="semmet-steps__content">
|
|
35
|
+
<span class="semmet-steps__label">{{ step.label }}</span>
|
|
36
|
+
@if (step.description) {
|
|
37
|
+
<span class="semmet-steps__description">{{ step.description }}</span>
|
|
38
|
+
}
|
|
39
|
+
</span>
|
|
40
|
+
</span>
|
|
41
|
+
}
|
|
42
|
+
</li>
|
|
43
|
+
}
|
|
44
|
+
</ol>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
3
|
+
import { By } from '@angular/platform-browser';
|
|
4
|
+
import { <%= classify(name) %> } from './<%= dasherize(name) %>';
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
imports: [<%= classify(name) %>],
|
|
8
|
+
template: `<<%= selector %> interactive />`,
|
|
9
|
+
})
|
|
10
|
+
class Host {}
|
|
11
|
+
|
|
12
|
+
describe('<%= classify(name) %>', () => {
|
|
13
|
+
let fixture: ComponentFixture<Host>;
|
|
14
|
+
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
await TestBed.configureTestingModule({ imports: [Host] }).compileComponents();
|
|
17
|
+
fixture = TestBed.createComponent(Host);
|
|
18
|
+
fixture.detectChanges();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('marks the current step with aria-current="step"', () => {
|
|
22
|
+
const current = fixture.nativeElement.querySelector('[aria-current="step"]');
|
|
23
|
+
|
|
24
|
+
expect(current?.textContent).toContain('Discover');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('moves current step with arrow keys when interactive', () => {
|
|
28
|
+
const buttons = fixture.debugElement.queryAll(By.css('button'));
|
|
29
|
+
|
|
30
|
+
buttons[0].triggerEventHandler('keydown', new KeyboardEvent('keydown', { key: 'ArrowRight' }));
|
|
31
|
+
fixture.detectChanges();
|
|
32
|
+
|
|
33
|
+
expect(fixture.nativeElement.querySelector('[aria-current="step"]').textContent).toContain('Build');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Component, ElementRef, booleanAttribute, computed, input, output, signal, viewChildren } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
interface <%= classify(name) %>Step {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const DEFAULT_STEPS: readonly <%= classify(name) %>Step[] = [
|
|
11
|
+
{ id: 'discover', label: 'Discover', description: 'Understand the current need.' },
|
|
12
|
+
{ id: 'build', label: 'Build', description: 'Create the accessible UI.' },
|
|
13
|
+
{ id: 'ship', label: 'Ship', description: 'Verify and deliver.' },
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
let nextId = 0;
|
|
17
|
+
|
|
18
|
+
@Component({
|
|
19
|
+
selector: '<%= selector %>',
|
|
20
|
+
imports: [],
|
|
21
|
+
templateUrl: './<%= dasherize(name) %>.html',
|
|
22
|
+
styleUrl: './<%= dasherize(name) %>.css',
|
|
23
|
+
})
|
|
24
|
+
export class <%= classify(name) %> {
|
|
25
|
+
private readonly stepButtons = viewChildren<ElementRef<HTMLButtonElement>>('stepButton');
|
|
26
|
+
|
|
27
|
+
protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
|
|
28
|
+
|
|
29
|
+
readonly label = input('Progress steps');
|
|
30
|
+
readonly interactive = input(false, { transform: booleanAttribute });
|
|
31
|
+
readonly steps = input<readonly <%= classify(name) %>Step[]>(DEFAULT_STEPS);
|
|
32
|
+
readonly currentId = input<string | null>(null);
|
|
33
|
+
readonly stepChange = output<<%= classify(name) %>Step>();
|
|
34
|
+
|
|
35
|
+
protected readonly selectedId = signal(DEFAULT_STEPS[0]?.id ?? null);
|
|
36
|
+
protected readonly activeId = computed(() => this.currentId() ?? this.selectedId());
|
|
37
|
+
|
|
38
|
+
protected isCurrent(step: <%= classify(name) %>Step): boolean {
|
|
39
|
+
return this.activeId() === step.id;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected select(step: <%= classify(name) %>Step): void {
|
|
43
|
+
if (!this.interactive() || step.disabled) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
this.selectedId.set(step.id);
|
|
48
|
+
this.stepChange.emit(step);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected navigate(event: KeyboardEvent, index: number): void {
|
|
52
|
+
if (!this.interactive()) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const steps = this.steps();
|
|
57
|
+
let nextIndex: number;
|
|
58
|
+
|
|
59
|
+
switch (event.key) {
|
|
60
|
+
case 'ArrowDown':
|
|
61
|
+
case 'ArrowRight':
|
|
62
|
+
nextIndex = this.findEnabledIndex(index, 1, steps);
|
|
63
|
+
break;
|
|
64
|
+
case 'ArrowUp':
|
|
65
|
+
case 'ArrowLeft':
|
|
66
|
+
nextIndex = this.findEnabledIndex(index, -1, steps);
|
|
67
|
+
break;
|
|
68
|
+
case 'Home':
|
|
69
|
+
nextIndex = steps.findIndex((step) => !step.disabled);
|
|
70
|
+
break;
|
|
71
|
+
case 'End':
|
|
72
|
+
nextIndex = -1;
|
|
73
|
+
for (let i = steps.length - 1; i >= 0; i--) {
|
|
74
|
+
if (!steps[i].disabled) {
|
|
75
|
+
nextIndex = i;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (nextIndex < 0) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
this.select(steps[nextIndex]);
|
|
90
|
+
this.stepButtons()[nextIndex]?.nativeElement.focus();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private findEnabledIndex(index: number, direction: 1 | -1, steps: readonly <%= classify(name) %>Step[]): number {
|
|
94
|
+
if (steps.length === 0) {
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
for (let offset = 1; offset <= steps.length; offset++) {
|
|
99
|
+
const nextIndex = (index + offset * direction + steps.length) % steps.length;
|
|
100
|
+
if (!steps[nextIndex].disabled) {
|
|
101
|
+
return nextIndex;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return -1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const steps: (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.steps = void 0;
|
|
4
|
+
const generate_component_1 = require("../utils/generate-component");
|
|
5
|
+
exports.steps = (0, generate_component_1.createAriaComponentSchematic)({ includeSharedUnitTest: false });
|
|
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,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,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,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"$id": "SemmetAngularSteps",
|
|
4
|
+
"title": "Semmet Angular Steps Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Generates a standalone Angular Steps component for ordered progress, current-step semantics, and optional keyboard navigation.",
|
|
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": {
|
|
13
|
+
"$source": "argv",
|
|
14
|
+
"index": 0
|
|
15
|
+
},
|
|
16
|
+
"x-prompt": "What name would you like to use for the steps component?"
|
|
17
|
+
},
|
|
18
|
+
"e2e": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"default": false,
|
|
21
|
+
"description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
|
|
22
|
+
},
|
|
23
|
+
"path": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"format": "path",
|
|
26
|
+
"$default": {
|
|
27
|
+
"$source": "workingDirectory"
|
|
28
|
+
},
|
|
29
|
+
"description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
|
|
30
|
+
"visible": false
|
|
31
|
+
},
|
|
32
|
+
"project": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"description": "The name of the project to add the component to.",
|
|
35
|
+
"$default": {
|
|
36
|
+
"$source": "projectName"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"required": [
|
|
41
|
+
"name",
|
|
42
|
+
"project"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ComponentSchematicOptions as Schema } from '../utils/schema-types';
|
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
:host {
|
|
2
|
-
--semmet-color-primary: #18181b;
|
|
3
|
-
--semmet-color-outline: #71717a;
|
|
4
|
-
--semmet-color-surface: #ffffff;
|
|
5
|
-
--semmet-color-on-surface: #18181b;
|
|
6
|
-
--semmet-space-md: 32px;
|
|
7
|
-
--semmet-target-sm: 32px;
|
|
8
|
-
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
9
|
-
|
|
10
2
|
display: inline-block;
|
|
11
|
-
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
12
|
-
font-size: 0.9375rem;
|
|
13
3
|
}
|
|
14
4
|
|
|
15
5
|
[role='switch'] {
|
|
16
6
|
position: relative;
|
|
17
7
|
display: inline-flex;
|
|
18
8
|
align-items: center;
|
|
19
|
-
padding-left:
|
|
20
|
-
min-height: var(--semmet-target-sm);
|
|
9
|
+
padding-left: 2.75rem;
|
|
21
10
|
font: inherit;
|
|
22
|
-
color:
|
|
11
|
+
color: inherit;
|
|
23
12
|
background: none;
|
|
24
13
|
border: none;
|
|
25
14
|
cursor: pointer;
|
|
@@ -34,10 +23,9 @@
|
|
|
34
23
|
width: 2.25rem;
|
|
35
24
|
height: 1.25rem;
|
|
36
25
|
box-sizing: border-box;
|
|
37
|
-
border: 2px solid
|
|
26
|
+
border: 2px solid currentColor;
|
|
38
27
|
border-radius: 999px;
|
|
39
28
|
background: transparent;
|
|
40
|
-
transition: background-color var(--semmet-motion), border-color var(--semmet-motion);
|
|
41
29
|
}
|
|
42
30
|
|
|
43
31
|
[role='switch']::after {
|
|
@@ -49,22 +37,19 @@
|
|
|
49
37
|
width: 0.85rem;
|
|
50
38
|
height: 0.85rem;
|
|
51
39
|
border-radius: 50%;
|
|
52
|
-
background:
|
|
53
|
-
transition: transform var(--semmet-motion), background-color var(--semmet-motion);
|
|
40
|
+
background: currentColor;
|
|
54
41
|
}
|
|
55
42
|
|
|
56
43
|
[role='switch'][aria-checked='true']::before {
|
|
57
|
-
background:
|
|
58
|
-
border-color: var(--semmet-color-primary);
|
|
44
|
+
background: currentColor;
|
|
59
45
|
}
|
|
60
46
|
|
|
61
47
|
[role='switch'][aria-checked='true']::after {
|
|
62
|
-
background:
|
|
48
|
+
background: Canvas;
|
|
63
49
|
transform: translateY(-50%) translateX(1rem);
|
|
64
50
|
}
|
|
65
51
|
|
|
66
52
|
[role='switch']:focus-visible {
|
|
67
|
-
outline: 2px solid
|
|
53
|
+
outline: 2px solid currentColor;
|
|
68
54
|
outline-offset: 2px;
|
|
69
|
-
border-radius: 4px;
|
|
70
55
|
}
|
package/src/switch/schema.json
CHANGED
|
@@ -9,21 +9,36 @@
|
|
|
9
9
|
"name": {
|
|
10
10
|
"type": "string",
|
|
11
11
|
"description": "The name for the new component. Used to derive the class name, selector, and file names.",
|
|
12
|
-
"$default": {
|
|
12
|
+
"$default": {
|
|
13
|
+
"$source": "argv",
|
|
14
|
+
"index": 0
|
|
15
|
+
},
|
|
13
16
|
"x-prompt": "What name would you like to use for the switch component?"
|
|
14
17
|
},
|
|
18
|
+
"e2e": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"default": false,
|
|
21
|
+
"description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
|
|
22
|
+
},
|
|
15
23
|
"path": {
|
|
16
24
|
"type": "string",
|
|
17
25
|
"format": "path",
|
|
18
|
-
"$default": {
|
|
26
|
+
"$default": {
|
|
27
|
+
"$source": "workingDirectory"
|
|
28
|
+
},
|
|
19
29
|
"description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
|
|
20
30
|
"visible": false
|
|
21
31
|
},
|
|
22
32
|
"project": {
|
|
23
33
|
"type": "string",
|
|
24
34
|
"description": "The name of the project to add the component to.",
|
|
25
|
-
"$default": {
|
|
35
|
+
"$default": {
|
|
36
|
+
"$source": "projectName"
|
|
37
|
+
}
|
|
26
38
|
}
|
|
27
39
|
},
|
|
28
|
-
"required": [
|
|
40
|
+
"required": [
|
|
41
|
+
"name",
|
|
42
|
+
"project"
|
|
43
|
+
]
|
|
29
44
|
}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
:host {
|
|
2
|
-
--semmet-color-outline: #d4d4d8;
|
|
3
|
-
--semmet-color-on-surface: #18181b;
|
|
4
|
-
--semmet-color-on-surface-variant: #52525b;
|
|
5
|
-
--semmet-color-surface-variant: #f4f4f5;
|
|
6
|
-
--semmet-space-2xs: 8px;
|
|
7
|
-
--semmet-space-xs: 16px;
|
|
8
|
-
|
|
9
2
|
display: block;
|
|
10
|
-
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
11
|
-
font-size: 0.9375rem;
|
|
12
3
|
}
|
|
13
4
|
|
|
14
5
|
table {
|
|
@@ -18,25 +9,9 @@ table {
|
|
|
18
9
|
|
|
19
10
|
caption {
|
|
20
11
|
text-align: left;
|
|
21
|
-
margin-bottom: var(--semmet-space-xs);
|
|
22
|
-
font-weight: 500;
|
|
23
|
-
color: var(--semmet-color-on-surface);
|
|
24
12
|
}
|
|
25
13
|
|
|
26
14
|
th,
|
|
27
15
|
td {
|
|
28
16
|
text-align: left;
|
|
29
|
-
padding: var(--semmet-space-2xs) var(--semmet-space-xs);
|
|
30
|
-
border-bottom: 1px solid var(--semmet-color-outline);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
thead th {
|
|
34
|
-
background: var(--semmet-color-surface-variant);
|
|
35
|
-
color: var(--semmet-color-on-surface-variant);
|
|
36
|
-
font-weight: 500;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
tbody th {
|
|
40
|
-
color: var(--semmet-color-on-surface);
|
|
41
|
-
font-weight: 500;
|
|
42
17
|
}
|
|
@@ -20,8 +20,8 @@ Import <%= classify(name) %> in that parent component.
|
|
|
20
20
|
</caption>
|
|
21
21
|
<thead>
|
|
22
22
|
<tr>
|
|
23
|
-
<th scope="col">
|
|
24
|
-
<th scope="col">
|
|
23
|
+
<th scope="col">{{ quarterHeader() }}</th>
|
|
24
|
+
<th scope="col">{{ revenueHeader() }}</th>
|
|
25
25
|
</tr>
|
|
26
26
|
</thead>
|
|
27
27
|
<tbody>
|
|
@@ -36,7 +36,7 @@ Import <%= classify(name) %> in that parent component.
|
|
|
36
36
|
@if (emptyTemplate(); as emptySlot) {
|
|
37
37
|
<ng-container [ngTemplateOutlet]="emptySlot.templateRef" />
|
|
38
38
|
} @else {
|
|
39
|
-
|
|
39
|
+
{{ emptyLabel() }}
|
|
40
40
|
}
|
|
41
41
|
</td>
|
|
42
42
|
</tr>
|
|
@@ -31,6 +31,9 @@ export class <%= classify(name) %> {
|
|
|
31
31
|
protected readonly emptyTemplate = contentChild(<%= classify(name) %>Empty);
|
|
32
32
|
|
|
33
33
|
readonly caption = input('Quarterly results');
|
|
34
|
+
readonly quarterHeader = input('Quarter');
|
|
35
|
+
readonly revenueHeader = input('Revenue');
|
|
36
|
+
readonly emptyLabel = input('No results available.');
|
|
34
37
|
readonly rows = input<readonly <%= classify(name) %>Row[]>([
|
|
35
38
|
{ quarter: 'Q1', revenue: '$12,000' },
|
|
36
39
|
{ quarter: 'Q2', revenue: '$15,500' },
|
package/src/table/schema.json
CHANGED
|
@@ -9,21 +9,36 @@
|
|
|
9
9
|
"name": {
|
|
10
10
|
"type": "string",
|
|
11
11
|
"description": "The name for the new component. Used to derive the class name, selector, and file names.",
|
|
12
|
-
"$default": {
|
|
12
|
+
"$default": {
|
|
13
|
+
"$source": "argv",
|
|
14
|
+
"index": 0
|
|
15
|
+
},
|
|
13
16
|
"x-prompt": "What name would you like to use for the table component?"
|
|
14
17
|
},
|
|
18
|
+
"e2e": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"default": false,
|
|
21
|
+
"description": "Generate a Playwright e2e spec for this component. Requires Playwright to be installed/configured in the consuming app."
|
|
22
|
+
},
|
|
15
23
|
"path": {
|
|
16
24
|
"type": "string",
|
|
17
25
|
"format": "path",
|
|
18
|
-
"$default": {
|
|
26
|
+
"$default": {
|
|
27
|
+
"$source": "workingDirectory"
|
|
28
|
+
},
|
|
19
29
|
"description": "The path where the component files should be created, relative to the workspace root. Defaults to the project's source root.",
|
|
20
30
|
"visible": false
|
|
21
31
|
},
|
|
22
32
|
"project": {
|
|
23
33
|
"type": "string",
|
|
24
34
|
"description": "The name of the project to add the component to.",
|
|
25
|
-
"$default": {
|
|
35
|
+
"$default": {
|
|
36
|
+
"$source": "projectName"
|
|
37
|
+
}
|
|
26
38
|
}
|
|
27
39
|
},
|
|
28
|
-
"required": [
|
|
40
|
+
"required": [
|
|
41
|
+
"name",
|
|
42
|
+
"project"
|
|
43
|
+
]
|
|
29
44
|
}
|
|
@@ -1,79 +1,40 @@
|
|
|
1
1
|
:host {
|
|
2
|
-
--semmet-color-primary: #18181b;
|
|
3
|
-
--semmet-color-outline: #d4d4d8;
|
|
4
|
-
--semmet-color-on-surface: #18181b;
|
|
5
|
-
--semmet-color-on-surface-variant: #52525b;
|
|
6
|
-
--semmet-radius-sm: 8px;
|
|
7
|
-
--semmet-space-3xs: 4px;
|
|
8
|
-
--semmet-space-2xs: 8px;
|
|
9
|
-
--semmet-space-xs: 16px;
|
|
10
|
-
--semmet-space-sm: 24px;
|
|
11
|
-
--semmet-target-lg: 48px;
|
|
12
|
-
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
13
|
-
|
|
14
2
|
display: block;
|
|
15
|
-
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
16
|
-
font-size: 0.9375rem;
|
|
17
|
-
line-height: 1.5;
|
|
18
|
-
color: var(--semmet-color-on-surface);
|
|
19
3
|
}
|
|
20
4
|
|
|
21
5
|
[role='tablist'] {
|
|
22
6
|
display: flex;
|
|
23
|
-
gap: var(--semmet-space-3xs);
|
|
24
|
-
border-bottom: 1px solid var(--semmet-color-outline);
|
|
25
7
|
}
|
|
26
8
|
|
|
27
9
|
[role='tab'] {
|
|
28
10
|
position: relative;
|
|
29
11
|
font: inherit;
|
|
30
|
-
font-weight: 500;
|
|
31
|
-
color: var(--semmet-color-on-surface-variant);
|
|
32
12
|
background: none;
|
|
33
13
|
border: none;
|
|
34
|
-
border-radius: var(--semmet-radius-sm) var(--semmet-radius-sm) 0 0;
|
|
35
|
-
min-height: var(--semmet-target-lg);
|
|
36
|
-
padding: var(--semmet-space-2xs) var(--semmet-space-sm);
|
|
37
14
|
cursor: pointer;
|
|
38
|
-
transition: background-color var(--semmet-motion), color var(--semmet-motion);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
[role='tab']:hover {
|
|
42
|
-
background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
|
|
43
15
|
}
|
|
44
16
|
|
|
45
17
|
[role='tab']:focus-visible {
|
|
46
|
-
outline: 2px solid
|
|
18
|
+
outline: 2px solid currentColor;
|
|
47
19
|
outline-offset: 2px;
|
|
48
20
|
}
|
|
49
21
|
|
|
50
22
|
[role='tab']::after {
|
|
51
23
|
content: '';
|
|
52
24
|
position: absolute;
|
|
53
|
-
left:
|
|
54
|
-
right:
|
|
25
|
+
left: 0;
|
|
26
|
+
right: 0;
|
|
55
27
|
bottom: -1px;
|
|
56
28
|
height: 2px;
|
|
57
|
-
|
|
58
|
-
background: var(--semmet-color-primary);
|
|
29
|
+
background: currentColor;
|
|
59
30
|
transform: scaleX(0);
|
|
60
|
-
transition: transform var(--semmet-motion);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
[role='tab'][aria-selected='true'] {
|
|
64
|
-
color: var(--semmet-color-primary);
|
|
65
31
|
}
|
|
66
32
|
|
|
67
33
|
[role='tab'][aria-selected='true']::after {
|
|
68
34
|
transform: scaleX(1);
|
|
69
35
|
}
|
|
70
36
|
|
|
71
|
-
[role='tabpanel'] {
|
|
72
|
-
padding: var(--semmet-space-xs) var(--semmet-space-3xs);
|
|
73
|
-
color: var(--semmet-color-on-surface-variant);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
37
|
[role='tabpanel']:focus-visible {
|
|
77
|
-
outline: 2px solid
|
|
38
|
+
outline: 2px solid currentColor;
|
|
78
39
|
outline-offset: 2px;
|
|
79
40
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Usage from a parent component template:
|
|
4
4
|
Import <%= classify(name) %> and <%= classify(name) %>Item in that parent component.
|
|
5
5
|
|
|
6
|
-
<<%= selector
|
|
6
|
+
<<%= selector %> label="Tabs">
|
|
7
7
|
<ng-template <%= camelize(name) %>Item id="profile" label="Profile" [selected]="true">
|
|
8
8
|
<app-profile-panel />
|
|
9
9
|
</ng-template>
|
|
@@ -15,7 +15,7 @@ Import <%= classify(name) %> and <%= classify(name) %>Item in that parent compon
|
|
|
15
15
|
|
|
16
16
|
Set [preserveContent]="false" on <<%= selector %>> to destroy inactive tab content.
|
|
17
17
|
-->
|
|
18
|
-
<div role="tablist" aria-label="
|
|
18
|
+
<div role="tablist" [attr.aria-label]="label()">
|
|
19
19
|
@for (item of items(); track item.id(); let i = $index) {
|
|
20
20
|
<button
|
|
21
21
|
#tabButton
|