semmet-angular 0.41.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 +4 -33
- 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 +7 -2
- package/src/utils/generate-composition.js.map +1 -1
- package/src/utils/generate-composition.ts +9 -2
- 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/checkbox/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 checkbox 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,16 +1,5 @@
|
|
|
1
1
|
:host {
|
|
2
|
-
--semmet-color-primary: #18181b;
|
|
3
|
-
--semmet-color-on-surface: #27272a;
|
|
4
|
-
--semmet-color-on-inverse: #ffffff;
|
|
5
|
-
--semmet-color-hover: #f4f4f5;
|
|
6
|
-
--semmet-radius-full: 999px;
|
|
7
|
-
--semmet-target-sm: 32px;
|
|
8
|
-
--semmet-target-md: 40px;
|
|
9
|
-
--semmet-target-lg: 48px;
|
|
10
|
-
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
11
|
-
|
|
12
2
|
display: inline-block;
|
|
13
|
-
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
14
3
|
}
|
|
15
4
|
|
|
16
5
|
.semmet-close-button {
|
|
@@ -19,51 +8,25 @@
|
|
|
19
8
|
align-items: center;
|
|
20
9
|
justify-content: center;
|
|
21
10
|
border: 0;
|
|
22
|
-
border-radius: var(--semmet-radius-full);
|
|
23
|
-
color: var(--semmet-color-on-surface);
|
|
24
11
|
background: transparent;
|
|
12
|
+
color: inherit;
|
|
25
13
|
cursor: pointer;
|
|
26
|
-
|
|
27
|
-
background-color var(--semmet-motion),
|
|
28
|
-
color var(--semmet-motion),
|
|
29
|
-
opacity var(--semmet-motion),
|
|
30
|
-
transform var(--semmet-motion);
|
|
14
|
+
font: inherit;
|
|
31
15
|
}
|
|
32
16
|
|
|
33
17
|
.semmet-close-button--sm {
|
|
34
|
-
width:
|
|
35
|
-
height:
|
|
18
|
+
width: 2rem;
|
|
19
|
+
height: 2rem;
|
|
36
20
|
}
|
|
37
21
|
|
|
38
22
|
.semmet-close-button--md {
|
|
39
|
-
width:
|
|
40
|
-
height:
|
|
23
|
+
width: 2.5rem;
|
|
24
|
+
height: 2.5rem;
|
|
41
25
|
}
|
|
42
26
|
|
|
43
27
|
.semmet-close-button--lg {
|
|
44
|
-
width:
|
|
45
|
-
height:
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
.semmet-close-button--default:hover:not(:disabled),
|
|
49
|
-
.semmet-close-button--subtle {
|
|
50
|
-
background: var(--semmet-color-hover);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.semmet-close-button--inverse {
|
|
54
|
-
color: var(--semmet-color-on-inverse);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.semmet-close-button--inverse:hover:not(:disabled) {
|
|
58
|
-
background: rgba(255, 255, 255, 0.16);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.semmet-close-button:hover:not(:disabled) {
|
|
62
|
-
transform: scale(1.04);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.semmet-close-button:active:not(:disabled) {
|
|
66
|
-
transform: scale(0.98);
|
|
28
|
+
width: 3rem;
|
|
29
|
+
height: 3rem;
|
|
67
30
|
}
|
|
68
31
|
|
|
69
32
|
.semmet-close-button:disabled {
|
|
@@ -72,7 +35,7 @@
|
|
|
72
35
|
}
|
|
73
36
|
|
|
74
37
|
.semmet-close-button:focus-visible {
|
|
75
|
-
outline: 2px solid
|
|
38
|
+
outline: 2px solid currentColor;
|
|
76
39
|
outline-offset: 2px;
|
|
77
40
|
}
|
|
78
41
|
|
|
@@ -94,7 +57,6 @@
|
|
|
94
57
|
position: absolute;
|
|
95
58
|
top: 50%;
|
|
96
59
|
left: 0;
|
|
97
|
-
border-radius: 999px;
|
|
98
60
|
background: currentColor;
|
|
99
61
|
content: '';
|
|
100
62
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { Component, booleanAttribute, computed, input, output } from '@angular/core';
|
|
2
2
|
|
|
3
|
-
type <%= classify(name) %>Variant = 'default' | 'subtle' | 'inverse';
|
|
4
|
-
type <%= classify(name) %>Size = 'sm' | 'md' | 'lg';
|
|
5
|
-
|
|
6
3
|
let nextId = 0;
|
|
7
4
|
|
|
8
5
|
@Component({
|
|
@@ -15,8 +12,8 @@ export class <%= classify(name) %> {
|
|
|
15
12
|
protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
|
|
16
13
|
|
|
17
14
|
readonly label = input('Close');
|
|
18
|
-
readonly variant = input
|
|
19
|
-
readonly size = input
|
|
15
|
+
readonly variant = input<string>('default');
|
|
16
|
+
readonly size = input<string>('md');
|
|
20
17
|
readonly disabled = input(false, { transform: booleanAttribute });
|
|
21
18
|
readonly buttonClick = output<MouseEvent>();
|
|
22
19
|
|
|
@@ -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 close button 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
|
}
|
package/src/collection.json
CHANGED
|
@@ -71,6 +71,16 @@
|
|
|
71
71
|
"factory": "./badge/index#badge",
|
|
72
72
|
"schema": "./badge/schema.json"
|
|
73
73
|
},
|
|
74
|
+
"avatar": {
|
|
75
|
+
"description": "Generates a standalone Angular Avatar component with image, initials, decorative, and accessible-label modes.",
|
|
76
|
+
"factory": "./avatar/index#avatar",
|
|
77
|
+
"schema": "./avatar/schema.json"
|
|
78
|
+
},
|
|
79
|
+
"rating": {
|
|
80
|
+
"description": "Generates a standalone Angular Rating component with readonly image semantics or interactive radiogroup semantics.",
|
|
81
|
+
"factory": "./rating/index#rating",
|
|
82
|
+
"schema": "./rating/schema.json"
|
|
83
|
+
},
|
|
74
84
|
"close-button": {
|
|
75
85
|
"description": "Generates a standalone Angular Close Button component with a native button and accessible label.",
|
|
76
86
|
"factory": "./close-button/index#closeButton",
|
|
@@ -221,6 +231,11 @@
|
|
|
221
231
|
"factory": "./progress-bar/index#progressBar",
|
|
222
232
|
"schema": "./progress-bar/schema.json"
|
|
223
233
|
},
|
|
234
|
+
"steps": {
|
|
235
|
+
"description": "Generates a standalone Angular Steps component for ordered progress, current-step semantics, and optional keyboard navigation.",
|
|
236
|
+
"factory": "./steps/index#steps",
|
|
237
|
+
"schema": "./steps/schema.json"
|
|
238
|
+
},
|
|
224
239
|
"skeleton": {
|
|
225
240
|
"description": "Generates a standalone Angular Skeleton loading placeholder component for composable loading states.",
|
|
226
241
|
"factory": "./skeleton/index#skeleton",
|
|
@@ -1,49 +1,21 @@
|
|
|
1
1
|
:host {
|
|
2
|
-
--semmet-color-primary: #18181b;
|
|
3
|
-
--semmet-color-surface: #ffffff;
|
|
4
|
-
--semmet-color-outline: #d4d4d8;
|
|
5
|
-
--semmet-color-on-surface: #18181b;
|
|
6
|
-
--semmet-color-on-surface-variant: #52525b;
|
|
7
|
-
--semmet-radius-sm: 8px;
|
|
8
|
-
--semmet-radius-md: 12px;
|
|
9
|
-
--semmet-space-3xs: 4px;
|
|
10
|
-
--semmet-space-2xs: 8px;
|
|
11
|
-
--semmet-space-xs: 16px;
|
|
12
|
-
--semmet-target-md: 40px;
|
|
13
|
-
--semmet-elevation-3: 0 8px 24px rgba(20, 24, 23, 0.18), 0 2px 8px rgba(20, 24, 23, 0.1);
|
|
14
|
-
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
15
|
-
|
|
16
2
|
position: relative;
|
|
17
3
|
display: inline-block;
|
|
18
|
-
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
19
|
-
font-size: 0.9375rem;
|
|
20
4
|
}
|
|
21
5
|
|
|
22
6
|
label {
|
|
23
7
|
display: block;
|
|
24
|
-
margin-bottom: var(--semmet-space-2xs);
|
|
25
|
-
font-weight: 500;
|
|
26
|
-
color: var(--semmet-color-on-surface);
|
|
27
8
|
}
|
|
28
9
|
|
|
29
10
|
input {
|
|
30
11
|
width: 100%;
|
|
31
|
-
min-width: 14rem;
|
|
32
|
-
min-height: var(--semmet-target-md);
|
|
33
12
|
font: inherit;
|
|
34
|
-
color: var(--semmet-color-on-surface);
|
|
35
|
-
background: var(--semmet-color-surface);
|
|
36
|
-
border: 1px solid var(--semmet-color-outline);
|
|
37
|
-
border-radius: var(--semmet-radius-sm);
|
|
38
|
-
padding: var(--semmet-space-2xs) var(--semmet-space-xs);
|
|
39
13
|
box-sizing: border-box;
|
|
40
|
-
transition: border-color var(--semmet-motion);
|
|
41
14
|
}
|
|
42
15
|
|
|
43
16
|
input:focus-visible {
|
|
44
|
-
outline: 2px solid
|
|
45
|
-
outline-offset:
|
|
46
|
-
border-color: var(--semmet-color-primary);
|
|
17
|
+
outline: 2px solid currentColor;
|
|
18
|
+
outline-offset: 2px;
|
|
47
19
|
}
|
|
48
20
|
|
|
49
21
|
ul {
|
|
@@ -52,30 +24,13 @@ ul {
|
|
|
52
24
|
top: 100%;
|
|
53
25
|
left: 0;
|
|
54
26
|
right: 0;
|
|
55
|
-
margin:
|
|
56
|
-
padding:
|
|
27
|
+
margin: 0;
|
|
28
|
+
padding: 0;
|
|
57
29
|
list-style: none;
|
|
58
|
-
background: var(--semmet-color-surface);
|
|
59
|
-
border-radius: var(--semmet-radius-md);
|
|
60
|
-
box-shadow: var(--semmet-elevation-3);
|
|
61
30
|
max-height: 12rem;
|
|
62
31
|
overflow-y: auto;
|
|
63
32
|
}
|
|
64
33
|
|
|
65
34
|
[role='option'] {
|
|
66
|
-
min-height: var(--semmet-target-md);
|
|
67
|
-
padding: var(--semmet-space-2xs) var(--semmet-space-xs);
|
|
68
|
-
border-radius: 6px;
|
|
69
|
-
color: var(--semmet-color-on-surface);
|
|
70
35
|
cursor: pointer;
|
|
71
|
-
transition: background-color var(--semmet-motion);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
[role='option'][aria-selected='true'] {
|
|
75
|
-
background: color-mix(in srgb, var(--semmet-color-primary) 12%, transparent);
|
|
76
|
-
color: var(--semmet-color-primary);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
[role='option']:hover {
|
|
80
|
-
background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
|
|
81
36
|
}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Usage from a parent component template:
|
|
4
4
|
Import <%= classify(name) %> in that parent component.
|
|
5
5
|
|
|
6
|
-
<<%= selector %> />
|
|
6
|
+
<<%= selector %> label="Choose a fruit" [items]="fruitOptions" />
|
|
7
7
|
-->
|
|
8
|
-
<label [id]="instanceId + '-label'" [for]="instanceId + '-input'">
|
|
8
|
+
<label [id]="instanceId + '-label'" [for]="instanceId + '-input'">{{ label() }}</label>
|
|
9
9
|
<input
|
|
10
10
|
type="text"
|
|
11
11
|
[id]="instanceId + '-input'"
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { Component, computed, signal } from '@angular/core';
|
|
1
|
+
import { Component, computed, input, signal } from '@angular/core';
|
|
2
2
|
|
|
3
3
|
interface <%= classify(name) %>Item {
|
|
4
4
|
id: number;
|
|
5
5
|
label: string;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
+
const DEFAULT_ITEMS: readonly <%= classify(name) %>Item[] = [
|
|
9
|
+
{ id: 1, label: 'Apple' },
|
|
10
|
+
{ id: 2, label: 'Banana' },
|
|
11
|
+
{ id: 3, label: 'Cherry' },
|
|
12
|
+
];
|
|
13
|
+
|
|
8
14
|
let nextId = 0;
|
|
9
15
|
|
|
10
16
|
@Component({
|
|
@@ -15,18 +21,15 @@ let nextId = 0;
|
|
|
15
21
|
})
|
|
16
22
|
export class <%= classify(name) %> {
|
|
17
23
|
protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
|
|
18
|
-
protected readonly items: <%= classify(name) %>Item[] = [
|
|
19
|
-
{ id: 1, label: 'Apple' },
|
|
20
|
-
{ id: 2, label: 'Banana' },
|
|
21
|
-
{ id: 3, label: 'Cherry' },
|
|
22
|
-
];
|
|
23
|
-
|
|
24
24
|
protected readonly query = signal('');
|
|
25
25
|
protected readonly isOpen = signal(false);
|
|
26
26
|
protected readonly activeIndex = signal(-1);
|
|
27
27
|
|
|
28
|
+
readonly label = input('Choose a fruit');
|
|
29
|
+
readonly items = input<readonly <%= classify(name) %>Item[]>(DEFAULT_ITEMS);
|
|
30
|
+
|
|
28
31
|
protected readonly filteredItems = computed(() =>
|
|
29
|
-
this.items.filter((item) => item.label.toLowerCase().includes(this.query().toLowerCase()))
|
|
32
|
+
this.items().filter((item) => item.label.toLowerCase().includes(this.query().toLowerCase()))
|
|
30
33
|
);
|
|
31
34
|
|
|
32
35
|
protected readonly activeDescendantId = computed(() => {
|
package/src/combobox/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 combobox 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,48 +1,18 @@
|
|
|
1
|
-
:host {
|
|
2
|
-
--semmet-color-primary: #18181b;
|
|
3
|
-
--semmet-color-surface: #ffffff;
|
|
4
|
-
--semmet-color-on-surface: #18181b;
|
|
5
|
-
--semmet-color-on-surface-variant: #52525b;
|
|
6
|
-
--semmet-color-scrim: rgba(20, 24, 23, 0.45);
|
|
7
|
-
--semmet-radius-lg: 20px;
|
|
8
|
-
--semmet-space-2xs: 8px;
|
|
9
|
-
--semmet-space-xs: 16px;
|
|
10
|
-
--semmet-space-sm: 24px;
|
|
11
|
-
--semmet-target-md: 40px;
|
|
12
|
-
--semmet-elevation-3: 0 8px 24px rgba(20, 24, 23, 0.18), 0 2px 8px rgba(20, 24, 23, 0.1);
|
|
13
|
-
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
14
|
-
|
|
15
|
-
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
16
|
-
font-size: 0.9375rem;
|
|
17
|
-
line-height: 1.5;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
1
|
button {
|
|
21
2
|
font: inherit;
|
|
22
|
-
font-weight: 500;
|
|
23
|
-
color: var(--semmet-color-primary);
|
|
24
3
|
background: none;
|
|
25
4
|
border: none;
|
|
26
|
-
border-radius: 8px;
|
|
27
|
-
min-height: var(--semmet-target-md);
|
|
28
|
-
padding: var(--semmet-space-2xs) var(--semmet-space-xs);
|
|
29
5
|
cursor: pointer;
|
|
30
|
-
transition: background-color var(--semmet-motion);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
button:hover {
|
|
34
|
-
background: color-mix(in srgb, var(--semmet-color-primary) 8%, transparent);
|
|
35
6
|
}
|
|
36
7
|
|
|
37
8
|
button:focus-visible {
|
|
38
|
-
outline: 2px solid
|
|
9
|
+
outline: 2px solid currentColor;
|
|
39
10
|
outline-offset: 2px;
|
|
40
11
|
}
|
|
41
12
|
|
|
42
13
|
.backdrop {
|
|
43
14
|
position: fixed;
|
|
44
15
|
inset: 0;
|
|
45
|
-
background: var(--semmet-color-scrim);
|
|
46
16
|
}
|
|
47
17
|
|
|
48
18
|
[role='dialog'] {
|
|
@@ -52,25 +22,13 @@ button:focus-visible {
|
|
|
52
22
|
transform: translate(-50%, -50%);
|
|
53
23
|
min-width: 22rem;
|
|
54
24
|
max-width: 90vw;
|
|
55
|
-
padding: var(--semmet-space-sm);
|
|
56
|
-
border-radius: var(--semmet-radius-lg);
|
|
57
|
-
background: var(--semmet-color-surface);
|
|
58
|
-
color: var(--semmet-color-on-surface);
|
|
59
|
-
box-shadow: var(--semmet-elevation-3);
|
|
60
25
|
}
|
|
61
26
|
|
|
62
27
|
[role='dialog']:focus-visible {
|
|
63
|
-
outline: 2px solid
|
|
28
|
+
outline: 2px solid currentColor;
|
|
64
29
|
outline-offset: 2px;
|
|
65
30
|
}
|
|
66
31
|
|
|
67
32
|
[role='dialog'] h2 {
|
|
68
|
-
margin: 0
|
|
69
|
-
font-size: 1.25rem;
|
|
70
|
-
font-weight: 500;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
[role='dialog'] > div {
|
|
74
|
-
margin-bottom: var(--semmet-space-sm);
|
|
75
|
-
color: var(--semmet-color-on-surface-variant);
|
|
33
|
+
margin: 0;
|
|
76
34
|
}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Usage from a parent component template:
|
|
4
4
|
Import <%= classify(name) %> in that parent component.
|
|
5
5
|
|
|
6
|
-
<<%= selector %> />
|
|
6
|
+
<<%= selector %> triggerLabel="Open details" title="Details" description="Review the current details." />
|
|
7
7
|
-->
|
|
8
|
-
<button type="button" (click)="open($event)">
|
|
8
|
+
<button type="button" (click)="open($event)">{{ triggerLabel() }}</button>
|
|
9
9
|
|
|
10
10
|
@if (isOpen()) {
|
|
11
11
|
<div class="backdrop" (click)="close()"></div>
|
|
@@ -17,8 +17,8 @@ Import <%= classify(name) %> in that parent component.
|
|
|
17
17
|
tabindex="-1"
|
|
18
18
|
(keydown)="handleDialogKeydown($event)"
|
|
19
19
|
>
|
|
20
|
-
<h2 [id]="instanceId + '-title'">
|
|
21
|
-
<div>
|
|
22
|
-
<button type="button" (click)="close()">
|
|
20
|
+
<h2 [id]="instanceId + '-title'">{{ title() }}</h2>
|
|
21
|
+
<div>{{ description() }}</div>
|
|
22
|
+
<button type="button" (click)="close()">{{ closeLabel() }}</button>
|
|
23
23
|
</div>
|
|
24
24
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, ElementRef, Injector, afterNextRender, inject, signal, viewChild } from '@angular/core';
|
|
1
|
+
import { Component, ElementRef, Injector, afterNextRender, inject, input, signal, viewChild } from '@angular/core';
|
|
2
2
|
|
|
3
3
|
const FOCUSABLE_SELECTOR =
|
|
4
4
|
'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
@@ -19,6 +19,11 @@ export class <%= classify(name) %> {
|
|
|
19
19
|
protected readonly instanceId = `<%= dasherize(name) %>-${nextId++}`;
|
|
20
20
|
protected readonly isOpen = signal(false);
|
|
21
21
|
|
|
22
|
+
readonly triggerLabel = input('Open dialog');
|
|
23
|
+
readonly title = input('Dialog title');
|
|
24
|
+
readonly description = input('Dialog content');
|
|
25
|
+
readonly closeLabel = input('Close');
|
|
26
|
+
|
|
22
27
|
protected open(event: MouseEvent): void {
|
|
23
28
|
this.triggerElement = event.currentTarget as HTMLElement;
|
|
24
29
|
this.isOpen.set(true);
|
package/src/dialog/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 dialog 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,48 +1,22 @@
|
|
|
1
1
|
:host {
|
|
2
|
-
--semmet-color-primary: #18181b;
|
|
3
|
-
--semmet-color-surface: #ffffff;
|
|
4
|
-
--semmet-color-outline: #d4d4d8;
|
|
5
|
-
--semmet-color-on-surface: #18181b;
|
|
6
|
-
--semmet-color-on-surface-variant: #52525b;
|
|
7
|
-
--semmet-radius-md: 12px;
|
|
8
|
-
--semmet-space-xs: 16px;
|
|
9
|
-
--semmet-space-sm: 24px;
|
|
10
|
-
--semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
|
|
11
|
-
|
|
12
2
|
display: block;
|
|
13
|
-
font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
14
|
-
font-size: 0.9375rem;
|
|
15
|
-
line-height: 1.5;
|
|
16
|
-
color: var(--semmet-color-on-surface);
|
|
17
|
-
background: var(--semmet-color-surface);
|
|
18
|
-
border: 1px solid var(--semmet-color-outline);
|
|
19
|
-
border-radius: var(--semmet-radius-md);
|
|
20
|
-
overflow: hidden;
|
|
21
3
|
}
|
|
22
4
|
|
|
23
5
|
button {
|
|
24
6
|
display: flex;
|
|
25
7
|
align-items: center;
|
|
26
|
-
gap: var(--semmet-space-xs);
|
|
27
8
|
width: 100%;
|
|
28
|
-
padding: var(--semmet-space-xs) var(--semmet-space-sm);
|
|
29
9
|
font: inherit;
|
|
30
|
-
font-weight: 500;
|
|
31
10
|
color: inherit;
|
|
32
11
|
background: none;
|
|
33
12
|
border: none;
|
|
34
13
|
cursor: pointer;
|
|
35
14
|
text-align: left;
|
|
36
|
-
transition: background-color var(--semmet-motion);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
button:hover {
|
|
40
|
-
background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
|
|
41
15
|
}
|
|
42
16
|
|
|
43
17
|
button:focus-visible {
|
|
44
|
-
outline: 2px solid
|
|
45
|
-
outline-offset:
|
|
18
|
+
outline: 2px solid currentColor;
|
|
19
|
+
outline-offset: 2px;
|
|
46
20
|
}
|
|
47
21
|
|
|
48
22
|
button::after {
|
|
@@ -51,17 +25,11 @@ button::after {
|
|
|
51
25
|
height: 0.5rem;
|
|
52
26
|
margin-left: auto;
|
|
53
27
|
flex-shrink: 0;
|
|
54
|
-
border-right: 2px solid
|
|
55
|
-
border-bottom: 2px solid
|
|
28
|
+
border-right: 2px solid currentColor;
|
|
29
|
+
border-bottom: 2px solid currentColor;
|
|
56
30
|
transform: rotate(45deg);
|
|
57
|
-
transition: transform var(--semmet-motion);
|
|
58
31
|
}
|
|
59
32
|
|
|
60
33
|
button[aria-expanded='true']::after {
|
|
61
34
|
transform: rotate(-135deg);
|
|
62
35
|
}
|
|
63
|
-
|
|
64
|
-
div {
|
|
65
|
-
padding: 0 var(--semmet-space-sm) var(--semmet-space-sm);
|
|
66
|
-
color: var(--semmet-color-on-surface-variant);
|
|
67
|
-
}
|
|
@@ -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 disclosure 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
|
}
|