ng-hub-ui-stepper 1.0.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 +232 -0
- package/esm2022/lib/next-step-button.directive.mjs +22 -0
- package/esm2022/lib/prev-step-button.directive.mjs +22 -0
- package/esm2022/lib/services/stepper-theme-service.mjs +21 -0
- package/esm2022/lib/step/step.component.mjs +79 -0
- package/esm2022/lib/step-trigger.directive.mjs +16 -0
- package/esm2022/lib/stepper/stepper.component.mjs +136 -0
- package/esm2022/lib/stepper-buttons.directive.mjs +16 -0
- package/esm2022/lib/stepper-nav.directive.mjs +16 -0
- package/esm2022/lib/stepper.module.mjs +49 -0
- package/esm2022/ng-hub-ui-stepper.mjs +5 -0
- package/esm2022/public-api.mjs +12 -0
- package/fesm2022/ng-hub-ui-stepper.mjs +358 -0
- package/fesm2022/ng-hub-ui-stepper.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/next-step-button.directive.d.ts +8 -0
- package/lib/prev-step-button.directive.d.ts +8 -0
- package/lib/services/stepper-theme-service.d.ts +11 -0
- package/lib/step/step.component.d.ts +33 -0
- package/lib/step-trigger.directive.d.ts +8 -0
- package/lib/stepper/stepper.component.d.ts +71 -0
- package/lib/stepper-buttons.directive.d.ts +8 -0
- package/lib/stepper-nav.directive.d.ts +8 -0
- package/lib/stepper.module.d.ts +14 -0
- package/ng-hub-ui-stepper-1.0.0.tgz +0 -0
- package/package.json +60 -0
- package/public-api.d.ts +8 -0
package/README.md
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# ng-hub-ui-stepper
|
|
2
|
+
|
|
3
|
+
A flexible and customizable stepper component for Angular applications. Perfect for multi-step forms, wizards, and guided user experiences.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [ng-hub-ui-stepper](#ng-hub-ui-stepper)
|
|
8
|
+
- [Table of Contents](#table-of-contents)
|
|
9
|
+
- [Features](#features)
|
|
10
|
+
- [Installation](#installation)
|
|
11
|
+
- [Usage](#usage)
|
|
12
|
+
- [API Reference](#api-reference)
|
|
13
|
+
- [Stepper Component](#stepper-component)
|
|
14
|
+
- [Step Component](#step-component)
|
|
15
|
+
- [Customization](#customization)
|
|
16
|
+
- [CSS Variables](#css-variables)
|
|
17
|
+
- [Programmatic Customization](#programmatic-customization)
|
|
18
|
+
- [Custom Navigation Template](#custom-navigation-template)
|
|
19
|
+
- [Examples](#examples)
|
|
20
|
+
- [Basic Usage](#basic-usage)
|
|
21
|
+
- [With Custom Navigation](#with-custom-navigation)
|
|
22
|
+
- [Contributing](#contributing)
|
|
23
|
+
- [Support the Project](#support-the-project)
|
|
24
|
+
- [Inspiration](#inspiration)
|
|
25
|
+
- [License](#license)
|
|
26
|
+
|
|
27
|
+
## Features
|
|
28
|
+
|
|
29
|
+
- 🚀 Easy to integrate with existing Angular projects
|
|
30
|
+
- 🎨 Highly customizable appearance and behavior
|
|
31
|
+
- ♿ Accessible by default, following WCAG guidelines
|
|
32
|
+
- 📱 Responsive design, works on all screen sizes
|
|
33
|
+
- 🔢 Support for linear and non-linear step progression
|
|
34
|
+
- 🔄 Built-in animations for smooth transitions
|
|
35
|
+
- 🧩 Modular architecture for easy extension
|
|
36
|
+
|
|
37
|
+
## Installation
|
|
38
|
+
|
|
39
|
+
Install the package using npm:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install ng-hub-ui-stepper
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
1. Import the `StepperModule` in your Angular module:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { StepperModule } from 'ng-hub-ui-stepper';
|
|
51
|
+
|
|
52
|
+
@NgModule({
|
|
53
|
+
imports: [StepperModule],
|
|
54
|
+
// ...
|
|
55
|
+
})
|
|
56
|
+
export class YourModule { }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
2. Use the stepper component in your template:
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<hub-stepper>
|
|
63
|
+
<hub-step title="Step 1">
|
|
64
|
+
<h2>Welcome to Step 1</h2>
|
|
65
|
+
<p>This is the content of step 1.</p>
|
|
66
|
+
</hub-step>
|
|
67
|
+
<hub-step title="Step 2">
|
|
68
|
+
<h2>Moving on to Step 2</h2>
|
|
69
|
+
<p>Here's what you need to do in step 2.</p>
|
|
70
|
+
</hub-step>
|
|
71
|
+
<hub-step title="Step 3">
|
|
72
|
+
<h2>Final Step</h2>
|
|
73
|
+
<p>Congratulations! You've reached the last step.</p>
|
|
74
|
+
</hub-step>
|
|
75
|
+
</hub-stepper>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## API Reference
|
|
79
|
+
|
|
80
|
+
### Stepper Component
|
|
81
|
+
|
|
82
|
+
| Input | Type | Default | Description |
|
|
83
|
+
|----------------------|-----------|---------|------------------------------------------------|
|
|
84
|
+
| `backLabel` | string | 'Back' | Label for the back button |
|
|
85
|
+
| `continueLabel` | string | 'Continue' | Label for the continue button |
|
|
86
|
+
| `submitLabel` | string | 'Submit'| Label for the submit button |
|
|
87
|
+
|
|
88
|
+
| Output | Type | Description |
|
|
89
|
+
|------------|---------------------|---------------------------------------|
|
|
90
|
+
| `completed`| EventEmitter<void> | Emitted when the stepper is completed |
|
|
91
|
+
| `previousStep` | EventEmitter<number> | Emitted when moving to the previous step |
|
|
92
|
+
| `nextStep` | EventEmitter<number> | Emitted when moving to the next step |
|
|
93
|
+
|
|
94
|
+
### Step Component
|
|
95
|
+
|
|
96
|
+
| Input | Type | Default | Description |
|
|
97
|
+
|-----------|---------|--------|--------------------------------------|
|
|
98
|
+
| `index` | number | required | The index of this step |
|
|
99
|
+
| `title` | string | optional | The title of this step |
|
|
100
|
+
| `disabled`| boolean | false | Whether this step is disabled |
|
|
101
|
+
|
|
102
|
+
## Customization
|
|
103
|
+
|
|
104
|
+
The stepper component can be customized using CSS variables and by providing custom templates for navigation and buttons.
|
|
105
|
+
|
|
106
|
+
### CSS Variables
|
|
107
|
+
|
|
108
|
+
```css
|
|
109
|
+
:root {
|
|
110
|
+
--stepper-primary-color: #009ef7;
|
|
111
|
+
--stepper-secondary-color: #b5b5c3;
|
|
112
|
+
--stepper-background-color: #f3f6f9;
|
|
113
|
+
--stepper-text-color: #181c32;
|
|
114
|
+
--stepper-disabled-color: #e1e3ea;
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Programmatic Customization
|
|
119
|
+
|
|
120
|
+
You can also customize the stepper appearance programmatically using the `StepperThemeService`:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { StepperThemeService } from '@hub-ui/stepper';
|
|
124
|
+
|
|
125
|
+
@Component({...})
|
|
126
|
+
export class YourComponent implements OnInit {
|
|
127
|
+
constructor(private themeService: StepperThemeService) {}
|
|
128
|
+
|
|
129
|
+
ngOnInit() {
|
|
130
|
+
this.themeService.setTheme({
|
|
131
|
+
'primary-color': '#ff4081',
|
|
132
|
+
'background-color': '#f0f0f0'
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
This allows you to change the theme dynamically based on user preferences or other conditions in your application.
|
|
139
|
+
|
|
140
|
+
### Custom Navigation Template
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<hub-stepper [stepperNavTpt]="customNavTemplate">
|
|
144
|
+
<!-- step content -->
|
|
145
|
+
</hub-stepper>
|
|
146
|
+
|
|
147
|
+
<ng-template #customNavTemplate let-steps="steps" let-currentIndex="currentIndex">
|
|
148
|
+
<!-- Your custom navigation markup -->
|
|
149
|
+
</ng-template>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
<!-- ## Accessibility
|
|
153
|
+
|
|
154
|
+
This component is designed with accessibility in mind:
|
|
155
|
+
|
|
156
|
+
- Proper ARIA attributes are used for navigation and step content
|
|
157
|
+
- Keyboard navigation is supported
|
|
158
|
+
- Color contrast ratios meet WCAG AA standards -->
|
|
159
|
+
|
|
160
|
+
## Examples
|
|
161
|
+
|
|
162
|
+
### Basic Usage
|
|
163
|
+
|
|
164
|
+
```html
|
|
165
|
+
<hub-stepper>
|
|
166
|
+
<hub-step title="Personal Info">
|
|
167
|
+
<!-- Personal info form fields -->
|
|
168
|
+
</hub-step>
|
|
169
|
+
<hub-step title="Address">
|
|
170
|
+
<!-- Address form fields -->
|
|
171
|
+
</hub-step>
|
|
172
|
+
<hub-step title="Confirmation">
|
|
173
|
+
<!-- Confirmation step -->
|
|
174
|
+
</hub-step>
|
|
175
|
+
</hub-stepper>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### With Custom Navigation
|
|
179
|
+
|
|
180
|
+
```html
|
|
181
|
+
<hub-stepper [stepperNavTpt]="customNav">
|
|
182
|
+
<!-- Steps content -->
|
|
183
|
+
</hub-stepper>
|
|
184
|
+
|
|
185
|
+
<ng-template #customNav let-steps="steps" let-currentIndex="currentIndex">
|
|
186
|
+
<ul class="custom-nav">
|
|
187
|
+
<li *ngFor="let step of steps; let i = index"
|
|
188
|
+
[class.active]="i === currentIndex">
|
|
189
|
+
{{ step.title }}
|
|
190
|
+
</li>
|
|
191
|
+
</ul>
|
|
192
|
+
</ng-template>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Contributing
|
|
196
|
+
|
|
197
|
+
We welcome contributions to ng-hub-ui-stepper! Here's how you can help:
|
|
198
|
+
|
|
199
|
+
1. Fork the repository
|
|
200
|
+
2. Create your feature branch: `git checkout -b feature/AmazingFeature`
|
|
201
|
+
3. Commit your changes: `git commit -m 'Add some AmazingFeature'`
|
|
202
|
+
4. Push to the branch: `git push origin feature/AmazingFeature`
|
|
203
|
+
5. Open a pull request
|
|
204
|
+
|
|
205
|
+
Please make sure to update tests as appropriate and adhere to the [Angular Style Guide](https://angular.io/guide/styleguide).
|
|
206
|
+
|
|
207
|
+
## Support the Project
|
|
208
|
+
|
|
209
|
+
If you find this project helpful and would like to support its development, you can buy me a coffee:
|
|
210
|
+
|
|
211
|
+
[](https://www.buymeacoffee.com/carlosmorcillo)
|
|
212
|
+
|
|
213
|
+
Your support is greatly appreciated and helps maintain and improve this project!
|
|
214
|
+
|
|
215
|
+
## Inspiration
|
|
216
|
+
|
|
217
|
+
This project was inspired by the need for a flexible, customizable, and accessible stepper component in the Angular ecosystem. We drew inspiration from:
|
|
218
|
+
|
|
219
|
+
- Material Design's Stepper component
|
|
220
|
+
- Various multi-step form implementations across the web
|
|
221
|
+
- Feedback and feature requests from the Angular community
|
|
222
|
+
|
|
223
|
+
My goal was to create a component that combined the best features of existing solutions while adding my own improvements and focusing on customization and accessibility.
|
|
224
|
+
|
|
225
|
+
## License
|
|
226
|
+
|
|
227
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
Made with ❤️ by [Carlos Morcillo Fernández]
|
|
232
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Directive, HostListener, inject } from '@angular/core';
|
|
2
|
+
import { StepperComponent } from './stepper/stepper.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class NextStepButtonDirective {
|
|
5
|
+
#stepper = inject(StepperComponent);
|
|
6
|
+
constructor() { }
|
|
7
|
+
onClick() {
|
|
8
|
+
this.#stepper.goToNext();
|
|
9
|
+
}
|
|
10
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NextStepButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
11
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.5", type: NextStepButtonDirective, selector: "[hubNextStepButton] [nextStepButton]", host: { listeners: { "click": "onClick()" } }, ngImport: i0 }); }
|
|
12
|
+
}
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NextStepButtonDirective, decorators: [{
|
|
14
|
+
type: Directive,
|
|
15
|
+
args: [{
|
|
16
|
+
selector: '[hubNextStepButton] [nextStepButton]'
|
|
17
|
+
}]
|
|
18
|
+
}], ctorParameters: () => [], propDecorators: { onClick: [{
|
|
19
|
+
type: HostListener,
|
|
20
|
+
args: ['click']
|
|
21
|
+
}] } });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dC1zdGVwLWJ1dHRvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdGVwcGVyL3NyYy9saWIvbmV4dC1zdGVwLWJ1dHRvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQUsvRCxNQUFNLE9BQU8sdUJBQXVCO0lBQ25DLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwQyxnQkFBZSxDQUFDO0lBRU8sT0FBTztRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7OEdBTlcsdUJBQXVCO2tHQUF2Qix1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBSG5DLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHNDQUFzQztpQkFDaEQ7d0RBS3VCLE9BQU87c0JBQTdCLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0ZXBwZXJDb21wb25lbnQgfSBmcm9tICcuL3N0ZXBwZXIvc3RlcHBlci5jb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICdbaHViTmV4dFN0ZXBCdXR0b25dIFtuZXh0U3RlcEJ1dHRvbl0nXG59KVxuZXhwb3J0IGNsYXNzIE5leHRTdGVwQnV0dG9uRGlyZWN0aXZlIHtcblx0I3N0ZXBwZXIgPSBpbmplY3QoU3RlcHBlckNvbXBvbmVudCk7XG5cdGNvbnN0cnVjdG9yKCkge31cblxuXHRASG9zdExpc3RlbmVyKCdjbGljaycpIG9uQ2xpY2soKSB7XG5cdFx0dGhpcy4jc3RlcHBlci5nb1RvTmV4dCgpO1xuXHR9XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Directive, HostListener, inject } from '@angular/core';
|
|
2
|
+
import { StepperComponent } from './stepper/stepper.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class PrevStepButtonDirective {
|
|
5
|
+
#stepper = inject(StepperComponent);
|
|
6
|
+
constructor() { }
|
|
7
|
+
onClick() {
|
|
8
|
+
this.#stepper.goToPrevious();
|
|
9
|
+
}
|
|
10
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: PrevStepButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
11
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.5", type: PrevStepButtonDirective, selector: "[hubPrevStepButton]", host: { listeners: { "click": "onClick()" } }, ngImport: i0 }); }
|
|
12
|
+
}
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: PrevStepButtonDirective, decorators: [{
|
|
14
|
+
type: Directive,
|
|
15
|
+
args: [{
|
|
16
|
+
selector: '[hubPrevStepButton]'
|
|
17
|
+
}]
|
|
18
|
+
}], ctorParameters: () => [], propDecorators: { onClick: [{
|
|
19
|
+
type: HostListener,
|
|
20
|
+
args: ['click']
|
|
21
|
+
}] } });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldi1zdGVwLWJ1dHRvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdGVwcGVyL3NyYy9saWIvcHJldi1zdGVwLWJ1dHRvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQUsvRCxNQUFNLE9BQU8sdUJBQXVCO0lBQ25DLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwQyxnQkFBZSxDQUFDO0lBRU8sT0FBTztRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlCLENBQUM7OEdBTlcsdUJBQXVCO2tHQUF2Qix1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBSG5DLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHFCQUFxQjtpQkFDL0I7d0RBS3VCLE9BQU87c0JBQTdCLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0ZXBwZXJDb21wb25lbnQgfSBmcm9tICcuL3N0ZXBwZXIvc3RlcHBlci5jb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICdbaHViUHJldlN0ZXBCdXR0b25dJ1xufSlcbmV4cG9ydCBjbGFzcyBQcmV2U3RlcEJ1dHRvbkRpcmVjdGl2ZSB7XG5cdCNzdGVwcGVyID0gaW5qZWN0KFN0ZXBwZXJDb21wb25lbnQpO1xuXHRjb25zdHJ1Y3RvcigpIHt9XG5cblx0QEhvc3RMaXN0ZW5lcignY2xpY2snKSBvbkNsaWNrKCkge1xuXHRcdHRoaXMuI3N0ZXBwZXIuZ29Ub1ByZXZpb3VzKCk7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class StepperThemeService {
|
|
4
|
+
constructor(rendererFactory) {
|
|
5
|
+
this.renderer = rendererFactory.createRenderer(null, null);
|
|
6
|
+
}
|
|
7
|
+
setTheme(theme) {
|
|
8
|
+
Object.keys(theme).forEach((key) => {
|
|
9
|
+
this.renderer.setStyle(document.documentElement, `--stepper-${key}`, theme[key]);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperThemeService, deps: [{ token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperThemeService, providedIn: 'root' }); }
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperThemeService, decorators: [{
|
|
16
|
+
type: Injectable,
|
|
17
|
+
args: [{
|
|
18
|
+
providedIn: 'root'
|
|
19
|
+
}]
|
|
20
|
+
}], ctorParameters: () => [{ type: i0.RendererFactory2 }] });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci10aGVtZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RlcHBlci9zcmMvbGliL3NlcnZpY2VzL3N0ZXBwZXItdGhlbWUtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUErQixNQUFNLGVBQWUsQ0FBQzs7QUFLeEUsTUFBTSxPQUFPLG1CQUFtQjtJQUcvQixZQUFZLGVBQWlDO1FBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFnQztRQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNyQixRQUFRLENBQUMsZUFBZSxFQUN4QixhQUFhLEdBQUcsRUFBRSxFQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQ1YsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0FmVyxtQkFBbUI7a0hBQW5CLG1CQUFtQixjQUZuQixNQUFNOzsyRkFFTixtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBwZXJUaGVtZVNlcnZpY2Uge1xuXHRwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG5cblx0Y29uc3RydWN0b3IocmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyKSB7XG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcblx0fVxuXG5cdHNldFRoZW1lKHRoZW1lOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG5cdFx0T2JqZWN0LmtleXModGhlbWUpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShcblx0XHRcdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuXHRcdFx0XHRgLS1zdGVwcGVyLSR7a2V5fWAsXG5cdFx0XHRcdHRoZW1lW2tleV1cblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gVXNhZ2UgaW4gYSBjb21wb25lbnQ6XG4vLyBjb25zdHJ1Y3Rvcihwcml2YXRlIHRoZW1lU2VydmljZTogU3RlcHBlclRoZW1lU2VydmljZSkge31cbi8vXG4vLyBuZ09uSW5pdCgpIHtcbi8vICAgdGhpcy50aGVtZVNlcnZpY2Uuc2V0VGhlbWUoe1xuLy8gICAgICdwcmltYXJ5LWNvbG9yJzogJyNmZjQwODEnLFxuLy8gICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyNmMGYwZjAnXG4vLyAgIH0pO1xuLy8gfVxuIl19
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { animate, style, transition, trigger } from '@angular/animations';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, Input, TemplateRef, ViewChild } from '@angular/core';
|
|
3
|
+
import { NextStepButtonDirective } from '../next-step-button.directive';
|
|
4
|
+
import { PrevStepButtonDirective } from '../prev-step-button.directive';
|
|
5
|
+
import { StepTriggerDirective } from '../step-trigger.directive';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
const ANIMATION_DURATION = 256;
|
|
8
|
+
export class StepComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
/** Whether this step is disabled */
|
|
11
|
+
this.disabled = false;
|
|
12
|
+
}
|
|
13
|
+
ngOnInit() {
|
|
14
|
+
this.validateInputs();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validates the inputs to ensure the component is properly configured
|
|
18
|
+
*/
|
|
19
|
+
validateInputs() {
|
|
20
|
+
if (this.index === undefined) {
|
|
21
|
+
console.warn('StepComponent: index is required');
|
|
22
|
+
}
|
|
23
|
+
if (!this.title) {
|
|
24
|
+
console.warn('StepComponent: title is recommended for accessibility');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks if the step can be navigated to
|
|
29
|
+
* @returns boolean indicating if the step is accessible
|
|
30
|
+
*/
|
|
31
|
+
isAccessible() {
|
|
32
|
+
return !this.disabled;
|
|
33
|
+
}
|
|
34
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: StepComponent, selector: "hub-step, hub-ui-step, ng80-step", inputs: { index: "index", title: "title", disabled: "disabled" }, queries: [{ propertyName: "stepTriggerTpt", first: true, predicate: StepTriggerDirective, descendants: true, read: TemplateRef }, { propertyName: "prevStepButtons", predicate: PrevStepButtonDirective }, { propertyName: "nextStepButtons", predicate: NextStepButtonDirective }], viewQueries: [{ propertyName: "innerTemplate", first: true, predicate: ["innerTemplate"], descendants: true, static: true }], ngImport: i0, template: "<ng-template #innerTemplate>\n\t<div\n\t\t[@slideInOut]\n\t\tclass=\"step__content\"\n\t\t[attr.data-step-index]=\"index\"\n\t\t[attr.aria-label]=\"title\"\n\t>\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n", styles: [""], animations: [
|
|
36
|
+
trigger('slideInOut', [
|
|
37
|
+
transition(':enter', [
|
|
38
|
+
style({ transform: 'translateX(-100%)', opacity: 0 }),
|
|
39
|
+
animate(`${ANIMATION_DURATION}ms ${ANIMATION_DURATION}ms`, style({ transform: 'translateX(0%)', opacity: 1 }))
|
|
40
|
+
]),
|
|
41
|
+
transition(':leave', [
|
|
42
|
+
animate(`${ANIMATION_DURATION}ms ease-in`, style({ transform: 'translateX(100%)' }))
|
|
43
|
+
])
|
|
44
|
+
])
|
|
45
|
+
], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepComponent, decorators: [{
|
|
48
|
+
type: Component,
|
|
49
|
+
args: [{ selector: 'hub-step, hub-ui-step, ng80-step', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
|
|
50
|
+
trigger('slideInOut', [
|
|
51
|
+
transition(':enter', [
|
|
52
|
+
style({ transform: 'translateX(-100%)', opacity: 0 }),
|
|
53
|
+
animate(`${ANIMATION_DURATION}ms ${ANIMATION_DURATION}ms`, style({ transform: 'translateX(0%)', opacity: 1 }))
|
|
54
|
+
]),
|
|
55
|
+
transition(':leave', [
|
|
56
|
+
animate(`${ANIMATION_DURATION}ms ease-in`, style({ transform: 'translateX(100%)' }))
|
|
57
|
+
])
|
|
58
|
+
])
|
|
59
|
+
], template: "<ng-template #innerTemplate>\n\t<div\n\t\t[@slideInOut]\n\t\tclass=\"step__content\"\n\t\t[attr.data-step-index]=\"index\"\n\t\t[attr.aria-label]=\"title\"\n\t>\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n" }]
|
|
60
|
+
}], ctorParameters: () => [], propDecorators: { index: [{
|
|
61
|
+
type: Input
|
|
62
|
+
}], title: [{
|
|
63
|
+
type: Input
|
|
64
|
+
}], disabled: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], innerTemplate: [{
|
|
67
|
+
type: ViewChild,
|
|
68
|
+
args: ['innerTemplate', { static: true }]
|
|
69
|
+
}], stepTriggerTpt: [{
|
|
70
|
+
type: ContentChild,
|
|
71
|
+
args: [StepTriggerDirective, { read: TemplateRef }]
|
|
72
|
+
}], prevStepButtons: [{
|
|
73
|
+
type: ContentChildren,
|
|
74
|
+
args: [PrevStepButtonDirective]
|
|
75
|
+
}], nextStepButtons: [{
|
|
76
|
+
type: ContentChildren,
|
|
77
|
+
args: [NextStepButtonDirective]
|
|
78
|
+
}] } });
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdGVwcGVyL3NyYy9saWIvc3RlcC9zdGVwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0ZXBwZXIvc3JjL2xpYi9zdGVwL3N0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsS0FBSyxFQUdMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBRWpFLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBeUIvQixNQUFNLE9BQU8sYUFBYTtJQTBCekI7UUFuQkEsb0NBQW9DO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7SUFrQnBCLENBQUM7SUFFaEIsUUFBUTtRQUNQLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjO1FBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FDWCx1REFBdUQsQ0FDdkQsQ0FBQztTQUNGO0lBQ0YsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDOzhHQXBEVyxhQUFhO2tHQUFiLGFBQWEsc0xBZVgsb0JBQW9CLDJCQUFVLFdBQVcsa0RBSXRDLHVCQUF1QixrREFJdkIsdUJBQXVCLDJKQ2hFekMsNk5BVUEsNEJEYWE7WUFDWCxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUNyQixVQUFVLENBQUMsUUFBUSxFQUFFO29CQUNwQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNyRCxPQUFPLENBQ04sR0FBRyxrQkFBa0IsTUFBTSxrQkFBa0IsSUFBSSxFQUNqRCxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQ2xEO2lCQUNELENBQUM7Z0JBQ0YsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDcEIsT0FBTyxDQUNOLEdBQUcsa0JBQWtCLFlBQVksRUFDakMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FDeEM7aUJBQ0QsQ0FBQzthQUNGLENBQUM7U0FDRjs7MkZBRVcsYUFBYTtrQkF2QnpCLFNBQVM7K0JBQ0Msa0NBQWtDLG1CQUczQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DO3dCQUNYLE9BQU8sQ0FBQyxZQUFZLEVBQUU7NEJBQ3JCLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ3BCLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0NBQ3JELE9BQU8sQ0FDTixHQUFHLGtCQUFrQixNQUFNLGtCQUFrQixJQUFJLEVBQ2pELEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FDbEQ7NkJBQ0QsQ0FBQzs0QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO2dDQUNwQixPQUFPLENBQ04sR0FBRyxrQkFBa0IsWUFBWSxFQUNqQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUN4Qzs2QkFDRCxDQUFDO3lCQUNGLENBQUM7cUJBQ0Y7d0RBSVEsS0FBSztzQkFBYixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlOLGFBQWE7c0JBRFosU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUs1QyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUt6RCxlQUFlO3NCQURkLGVBQWU7dUJBQUMsdUJBQXVCO2dCQUt4QyxlQUFlO3NCQURkLGVBQWU7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdENvbnRlbnRDaGlsZCxcblx0Q29udGVudENoaWxkcmVuLFxuXHRJbnB1dCxcblx0T25Jbml0LFxuXHRRdWVyeUxpc3QsXG5cdFRlbXBsYXRlUmVmLFxuXHRWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZXh0U3RlcEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL25leHQtc3RlcC1idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IFByZXZTdGVwQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vcHJldi1zdGVwLWJ1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU3RlcFRyaWdnZXJEaXJlY3RpdmUgfSBmcm9tICcuLi9zdGVwLXRyaWdnZXIuZGlyZWN0aXZlJztcblxuY29uc3QgQU5JTUFUSU9OX0RVUkFUSU9OID0gMjU2O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdodWItc3RlcCwgaHViLXVpLXN0ZXAsIG5nODAtc3RlcCcsXG5cdHRlbXBsYXRlVXJsOiAnLi9zdGVwLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vc3RlcC5jb21wb25lbnQuc2NzcyddLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0YW5pbWF0aW9uczogW1xuXHRcdHRyaWdnZXIoJ3NsaWRlSW5PdXQnLCBbXG5cdFx0XHR0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXG5cdFx0XHRcdHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMTAwJSknLCBvcGFjaXR5OiAwIH0pLFxuXHRcdFx0XHRhbmltYXRlKFxuXHRcdFx0XHRcdGAke0FOSU1BVElPTl9EVVJBVElPTn1tcyAke0FOSU1BVElPTl9EVVJBVElPTn1tc2AsXG5cdFx0XHRcdFx0c3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDAlKScsIG9wYWNpdHk6IDEgfSlcblx0XHRcdFx0KVxuXHRcdFx0XSksXG5cdFx0XHR0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXG5cdFx0XHRcdGFuaW1hdGUoXG5cdFx0XHRcdFx0YCR7QU5JTUFUSU9OX0RVUkFUSU9OfW1zIGVhc2UtaW5gLFxuXHRcdFx0XHRcdHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScgfSlcblx0XHRcdFx0KVxuXHRcdFx0XSlcblx0XHRdKVxuXHRdXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXHQvKiogVGhlIGluZGV4IG9mIHRoaXMgc3RlcCBpbiB0aGUgc3RlcHBlciAqL1xuXHRASW5wdXQoKSBpbmRleCE6IG51bWJlcjtcblxuXHQvKiogVGhlIHRpdGxlIG9mIHRoaXMgc3RlcCAqL1xuXHRASW5wdXQoKSB0aXRsZT86IHN0cmluZztcblxuXHQvKiogV2hldGhlciB0aGlzIHN0ZXAgaXMgZGlzYWJsZWQgKi9cblx0QElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKiogVGVtcGxhdGUgcmVmZXJlbmNlIGZvciB0aGUgY29udGVudCBvZiB0aGlzIHN0ZXAgKi9cblx0QFZpZXdDaGlsZCgnaW5uZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pXG5cdGlubmVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cdC8qKiBDdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBzdGVwIHRyaWdnZXIgKi9cblx0QENvbnRlbnRDaGlsZChTdGVwVHJpZ2dlckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuXHRzdGVwVHJpZ2dlclRwdCE6IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqIENvbGxlY3Rpb24gb2YgcHJldmlvdXMgc3RlcCBidXR0b24gZGlyZWN0aXZlcyAqL1xuXHRAQ29udGVudENoaWxkcmVuKFByZXZTdGVwQnV0dG9uRGlyZWN0aXZlKVxuXHRwcmV2U3RlcEJ1dHRvbnMhOiBRdWVyeUxpc3Q8UHJldlN0ZXBCdXR0b25EaXJlY3RpdmU+O1xuXG5cdC8qKiBDb2xsZWN0aW9uIG9mIG5leHQgc3RlcCBidXR0b24gZGlyZWN0aXZlcyAqL1xuXHRAQ29udGVudENoaWxkcmVuKE5leHRTdGVwQnV0dG9uRGlyZWN0aXZlKVxuXHRuZXh0U3RlcEJ1dHRvbnMhOiBRdWVyeUxpc3Q8TmV4dFN0ZXBCdXR0b25EaXJlY3RpdmU+O1xuXG5cdGNvbnN0cnVjdG9yKCkge31cblxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkYXRlSW5wdXRzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIHRoZSBpbnB1dHMgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQgaXMgcHJvcGVybHkgY29uZmlndXJlZFxuXHQgKi9cblx0cHJpdmF0ZSB2YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oJ1N0ZXBDb21wb25lbnQ6IGluZGV4IGlzIHJlcXVpcmVkJyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy50aXRsZSkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnU3RlcENvbXBvbmVudDogdGl0bGUgaXMgcmVjb21tZW5kZWQgZm9yIGFjY2Vzc2liaWxpdHknXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHN0ZXAgY2FuIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHN0ZXAgaXMgYWNjZXNzaWJsZVxuXHQgKi9cblx0aXNBY2Nlc3NpYmxlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhdGhpcy5kaXNhYmxlZDtcblx0fVxufVxuIiwiPG5nLXRlbXBsYXRlICNpbm5lclRlbXBsYXRlPlxuXHQ8ZGl2XG5cdFx0W0BzbGlkZUluT3V0XVxuXHRcdGNsYXNzPVwic3RlcF9fY29udGVudFwiXG5cdFx0W2F0dHIuZGF0YS1zdGVwLWluZGV4XT1cImluZGV4XCJcblx0XHRbYXR0ci5hcmlhLWxhYmVsXT1cInRpdGxlXCJcblx0PlxuXHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class StepTriggerDirective {
|
|
4
|
+
constructor(template) {
|
|
5
|
+
this.template = template;
|
|
6
|
+
}
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepTriggerDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
8
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.5", type: StepTriggerDirective, selector: "[hubStepTrigger] [stepTrigger]", ngImport: i0 }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepTriggerDirective, decorators: [{
|
|
11
|
+
type: Directive,
|
|
12
|
+
args: [{
|
|
13
|
+
selector: '[hubStepTrigger] [stepTrigger]'
|
|
14
|
+
}]
|
|
15
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC10cmlnZ2VyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3N0ZXBwZXIvc3JjL2xpYi9zdGVwLXRyaWdnZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBS3ZELE1BQU0sT0FBTyxvQkFBb0I7SUFDaEMsWUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFBRyxDQUFDOzhHQURyQyxvQkFBb0I7a0dBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFIaEMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsZ0NBQWdDO2lCQUMxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmLCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG5cdHNlbGVjdG9yOiAnW2h1YlN0ZXBUcmlnZ2VyXSBbc3RlcFRyaWdnZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwVHJpZ2dlckRpcmVjdGl2ZSB7XG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge31cbn1cbiJdfQ==
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, EventEmitter, inject, Input, Output, TemplateRef } from '@angular/core';
|
|
2
|
+
import { StepComponent } from '../step/step.component';
|
|
3
|
+
import { StepperButtonsDirective } from '../stepper-buttons.directive';
|
|
4
|
+
import { StepperNavDirective } from '../stepper-nav.directive';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
/**
|
|
8
|
+
* StepperComponent is a multi-step interface component for Angular applications.
|
|
9
|
+
* It manages navigation between steps, handles step content, and provides
|
|
10
|
+
* customization options for navigation and controls.
|
|
11
|
+
*/
|
|
12
|
+
export class StepperComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.#cdr = inject(ChangeDetectorRef);
|
|
15
|
+
/** The index of the current active step */
|
|
16
|
+
this.currentIndex = 0;
|
|
17
|
+
/** Label for the back button */
|
|
18
|
+
this.backLabel = 'Back';
|
|
19
|
+
/** Label for the continue button */
|
|
20
|
+
this.continueLabel = 'Continue';
|
|
21
|
+
/** Label for the submit button */
|
|
22
|
+
this.submitLabel = 'Submit';
|
|
23
|
+
/** Event emitted when the stepper is completed */
|
|
24
|
+
this.completed = new EventEmitter();
|
|
25
|
+
/** Event emitted when moving to the previous step */
|
|
26
|
+
this.previousStep = new EventEmitter();
|
|
27
|
+
/** Event emitted when moving to the next step */
|
|
28
|
+
this.nextStep = new EventEmitter();
|
|
29
|
+
}
|
|
30
|
+
#cdr;
|
|
31
|
+
/** Get the current active step */
|
|
32
|
+
get currentStep() {
|
|
33
|
+
return this.steps?.toArray()[this.currentIndex] ?? null;
|
|
34
|
+
}
|
|
35
|
+
ngAfterContentInit() {
|
|
36
|
+
this.initializeSteps();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Initialize step indices and set up change detection
|
|
40
|
+
*/
|
|
41
|
+
initializeSteps() {
|
|
42
|
+
this.steps.forEach((step, index) => (step.index = index));
|
|
43
|
+
// Consider using ngZone.runOutsideAngular for better performance
|
|
44
|
+
this.#cdr.detectChanges();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Navigate to the previous step
|
|
48
|
+
*/
|
|
49
|
+
goToPrevious() {
|
|
50
|
+
this.goTo(this.currentIndex - 1);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Navigate to the next step
|
|
54
|
+
*/
|
|
55
|
+
goToNext() {
|
|
56
|
+
this.goTo(this.currentIndex + 1);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Navigate to a specific step by index
|
|
60
|
+
* @param index The index of the step to navigate to
|
|
61
|
+
*/
|
|
62
|
+
goTo(index) {
|
|
63
|
+
if (this.isValidStepIndex(index)) {
|
|
64
|
+
this.currentIndex = index;
|
|
65
|
+
this.#cdr.detectChanges();
|
|
66
|
+
if (index > this.currentIndex) {
|
|
67
|
+
this.nextStep.emit(index);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.previousStep.emit(index);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.error(`Invalid step index: ${index}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if it's possible to navigate to the next step
|
|
79
|
+
*/
|
|
80
|
+
canGoNext() {
|
|
81
|
+
const nextIndex = this.currentIndex + 1;
|
|
82
|
+
return (this.isValidStepIndex(nextIndex) &&
|
|
83
|
+
!this.steps.toArray()[nextIndex]?.disabled);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if it's possible to navigate to a specific step
|
|
87
|
+
* @param index The index of the step to check
|
|
88
|
+
*/
|
|
89
|
+
canNavigateTo(index) {
|
|
90
|
+
return (this.isValidStepIndex(index) &&
|
|
91
|
+
!this.steps.toArray()[index]?.disabled);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Complete the stepper process
|
|
95
|
+
*/
|
|
96
|
+
complete() {
|
|
97
|
+
this.completed.emit();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if a given index is valid within the current steps
|
|
101
|
+
* @param index The index to validate
|
|
102
|
+
*/
|
|
103
|
+
isValidStepIndex(index) {
|
|
104
|
+
return index >= 0 && index < this.steps.length;
|
|
105
|
+
}
|
|
106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
107
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: StepperComponent, selector: "hub-stepper, hub-ui-stepper, ng80-stepper", inputs: { backLabel: "backLabel", continueLabel: "continueLabel", submitLabel: "submitLabel" }, outputs: { completed: "completed", previousStep: "previousStep", nextStep: "nextStep" }, host: { classAttribute: "stepper d-flex flex-column overflow-auto" }, queries: [{ propertyName: "stepperNavTpt", first: true, predicate: StepperNavDirective, descendants: true, read: TemplateRef }, { propertyName: "stepperControlsTpt", first: true, predicate: StepperButtonsDirective, descendants: true, read: TemplateRef }, { propertyName: "steps", predicate: StepComponent }], ngImport: i0, template: "<div class=\"stepper\">\n\t<!--begin::Nav-->\n\t<nav class=\"stepper__nav\">\n\t\t<ng-container\n\t\t\t[ngTemplateOutlet]=\"stepperNavTpt || defaultNavTpt\"\n\t\t\t[ngTemplateOutletContext]=\"{ steps: steps, currentIndex }\"\n\t\t></ng-container>\n\t</nav>\n\t<!--end::Nav-->\n\n\t<!--begin::Content-->\n\t<div class=\"stepper__content\">\n\t\t<ng-container\n\t\t\t[ngTemplateOutlet]=\"currentStep?.innerTemplate\"\n\t\t></ng-container>\n\t</div>\n\t<!--end::Content-->\n\n\t<!--begin::Controls-->\n\t<div class=\"stepper__controls\">\n\t\t<ng-container\n\t\t\t[ngTemplateOutlet]=\"stepperControlsTpt || defaultStepperControlsTpt\"\n\t\t\t[ngTemplateOutletContext]=\"{ steps: steps, currentIndex }\"\n\t\t></ng-container>\n\t</div>\n\t<!--end::Controls-->\n</div>\n\n<!-- begin:default-controls -->\n<ng-template #defaultStepperControlsTpt let-currentIndex=\"currentIndex\">\n\t<button\n\t\tclass=\"stepper__button stepper__button--back\"\n\t\t(click)=\"goTo(currentIndex - 1)\"\n\t\t*ngIf=\"currentIndex > 0\"\n\t>\n\t\t<i class=\"stepper__button-icon stepper__button-icon--back\"></i>\n\t\t{{ backLabel }}\n\t</button>\n\n\t<button\n\t\tclass=\"stepper__button stepper__button--next\"\n\t\t(click)=\"goTo(currentIndex + 1)\"\n\t\t*ngIf=\"currentIndex < steps.length - 1\"\n\t\t[disabled]=\"!canGoNext()\"\n\t>\n\t\t{{ continueLabel }}\n\t\t<i class=\"stepper__button-icon stepper__button-icon--next\"></i>\n\t</button>\n\n\t<button\n\t\tclass=\"stepper__button stepper__button--submit\"\n\t\t(click)=\"complete()\"\n\t\t*ngIf=\"currentIndex === steps.length - 1\"\n\t>\n\t\t{{ submitLabel }}\n\t</button>\n</ng-template>\n<!--end::default-controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul class=\"stepper__nav-list\">\n\t\t<li *ngFor=\"let step of steps; let i = index\" class=\"stepper__nav-item\">\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\tstep?.stepTriggerTpt || defaultNavTriggerTpt\n\t\t\t\t\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\ttitle: step.title,\n\t\t\t\t\tindex: i,\n\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\tisCompleted: i < currentIndex\n\t\t\t\t}\"\n\t\t\t></ng-container>\n\t\t</li>\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template\n\t#defaultNavTriggerTpt\n\tlet-title=\"title\"\n\tlet-index=\"index\"\n\tlet-isCurrent=\"isCurrent\"\n\tlet-isCompleted=\"isCompleted\"\n>\n\t<button\n\t\tclass=\"stepper__nav-trigger\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t>\n\t\t<span class=\"stepper__nav-indicator\">{{ index + 1 }}</span>\n\t\t<span class=\"stepper__nav-title\" *ngIf=\"title\">{{ title }}</span>\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n", styles: [":host{--stepper-primary-color: #009ef7;--stepper-secondary-color: #b5b5c3;--stepper-background-color: #f3f6f9;--stepper-text-color: #181c32;--stepper-disabled-color: #e1e3ea;display:block}.stepper__nav{background-color:var(--stepper-background-color)}.stepper__nav-trigger{color:var(--stepper-text-color)}.stepper__nav-trigger--current{color:var(--stepper-primary-color)}.stepper__nav-trigger--completed{color:var(--stepper-secondary-color)}.stepper__nav-trigger:disabled{color:var(--stepper-disabled-color)}.stepper__button--back{background-color:var(--stepper-background-color);color:var(--stepper-text-color)}.stepper__button--next,.stepper__button--submit{background-color:var(--stepper-primary-color);color:var(--stepper-background-color)}.stepper__button:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
108
|
+
}
|
|
109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperComponent, decorators: [{
|
|
110
|
+
type: Component,
|
|
111
|
+
args: [{ selector: 'hub-stepper, hub-ui-stepper, ng80-stepper', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
112
|
+
class: 'stepper d-flex flex-column overflow-auto'
|
|
113
|
+
}, template: "<div class=\"stepper\">\n\t<!--begin::Nav-->\n\t<nav class=\"stepper__nav\">\n\t\t<ng-container\n\t\t\t[ngTemplateOutlet]=\"stepperNavTpt || defaultNavTpt\"\n\t\t\t[ngTemplateOutletContext]=\"{ steps: steps, currentIndex }\"\n\t\t></ng-container>\n\t</nav>\n\t<!--end::Nav-->\n\n\t<!--begin::Content-->\n\t<div class=\"stepper__content\">\n\t\t<ng-container\n\t\t\t[ngTemplateOutlet]=\"currentStep?.innerTemplate\"\n\t\t></ng-container>\n\t</div>\n\t<!--end::Content-->\n\n\t<!--begin::Controls-->\n\t<div class=\"stepper__controls\">\n\t\t<ng-container\n\t\t\t[ngTemplateOutlet]=\"stepperControlsTpt || defaultStepperControlsTpt\"\n\t\t\t[ngTemplateOutletContext]=\"{ steps: steps, currentIndex }\"\n\t\t></ng-container>\n\t</div>\n\t<!--end::Controls-->\n</div>\n\n<!-- begin:default-controls -->\n<ng-template #defaultStepperControlsTpt let-currentIndex=\"currentIndex\">\n\t<button\n\t\tclass=\"stepper__button stepper__button--back\"\n\t\t(click)=\"goTo(currentIndex - 1)\"\n\t\t*ngIf=\"currentIndex > 0\"\n\t>\n\t\t<i class=\"stepper__button-icon stepper__button-icon--back\"></i>\n\t\t{{ backLabel }}\n\t</button>\n\n\t<button\n\t\tclass=\"stepper__button stepper__button--next\"\n\t\t(click)=\"goTo(currentIndex + 1)\"\n\t\t*ngIf=\"currentIndex < steps.length - 1\"\n\t\t[disabled]=\"!canGoNext()\"\n\t>\n\t\t{{ continueLabel }}\n\t\t<i class=\"stepper__button-icon stepper__button-icon--next\"></i>\n\t</button>\n\n\t<button\n\t\tclass=\"stepper__button stepper__button--submit\"\n\t\t(click)=\"complete()\"\n\t\t*ngIf=\"currentIndex === steps.length - 1\"\n\t>\n\t\t{{ submitLabel }}\n\t</button>\n</ng-template>\n<!--end::default-controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul class=\"stepper__nav-list\">\n\t\t<li *ngFor=\"let step of steps; let i = index\" class=\"stepper__nav-item\">\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"\n\t\t\t\t\tstep?.stepTriggerTpt || defaultNavTriggerTpt\n\t\t\t\t\"\n\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\ttitle: step.title,\n\t\t\t\t\tindex: i,\n\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\tisCompleted: i < currentIndex\n\t\t\t\t}\"\n\t\t\t></ng-container>\n\t\t</li>\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template\n\t#defaultNavTriggerTpt\n\tlet-title=\"title\"\n\tlet-index=\"index\"\n\tlet-isCurrent=\"isCurrent\"\n\tlet-isCompleted=\"isCompleted\"\n>\n\t<button\n\t\tclass=\"stepper__nav-trigger\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t>\n\t\t<span class=\"stepper__nav-indicator\">{{ index + 1 }}</span>\n\t\t<span class=\"stepper__nav-title\" *ngIf=\"title\">{{ title }}</span>\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n", styles: [":host{--stepper-primary-color: #009ef7;--stepper-secondary-color: #b5b5c3;--stepper-background-color: #f3f6f9;--stepper-text-color: #181c32;--stepper-disabled-color: #e1e3ea;display:block}.stepper__nav{background-color:var(--stepper-background-color)}.stepper__nav-trigger{color:var(--stepper-text-color)}.stepper__nav-trigger--current{color:var(--stepper-primary-color)}.stepper__nav-trigger--completed{color:var(--stepper-secondary-color)}.stepper__nav-trigger:disabled{color:var(--stepper-disabled-color)}.stepper__button--back{background-color:var(--stepper-background-color);color:var(--stepper-text-color)}.stepper__button--next,.stepper__button--submit{background-color:var(--stepper-primary-color);color:var(--stepper-background-color)}.stepper__button:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
114
|
+
}], propDecorators: { backLabel: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], continueLabel: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], submitLabel: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], completed: [{
|
|
121
|
+
type: Output
|
|
122
|
+
}], previousStep: [{
|
|
123
|
+
type: Output
|
|
124
|
+
}], nextStep: [{
|
|
125
|
+
type: Output
|
|
126
|
+
}], steps: [{
|
|
127
|
+
type: ContentChildren,
|
|
128
|
+
args: [StepComponent]
|
|
129
|
+
}], stepperNavTpt: [{
|
|
130
|
+
type: ContentChild,
|
|
131
|
+
args: [StepperNavDirective, { read: TemplateRef }]
|
|
132
|
+
}], stepperControlsTpt: [{
|
|
133
|
+
type: ContentChild,
|
|
134
|
+
args: [StepperButtonsDirective, { read: TemplateRef }]
|
|
135
|
+
}] } });
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdGVwcGVyL3NyYy9saWIvc3RlcHBlci9zdGVwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0ZXBwZXIvc3JjL2xpYi9zdGVwcGVyL3N0ZXBwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVOLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7OztBQUUvRDs7OztHQUlHO0FBVUgsTUFBTSxPQUFPLGdCQUFnQjtJQVQ3QjtRQVVDLFNBQUksR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVqQywyQ0FBMkM7UUFDM0MsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFFekIsZ0NBQWdDO1FBQ3ZCLGNBQVMsR0FBVyxNQUFNLENBQUM7UUFFcEMsb0NBQW9DO1FBQzNCLGtCQUFhLEdBQVcsVUFBVSxDQUFDO1FBRTVDLGtDQUFrQztRQUN6QixnQkFBVyxHQUFXLFFBQVEsQ0FBQztRQUV4QyxrREFBa0Q7UUFDeEMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFL0MscURBQXFEO1FBQzNDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVwRCxpREFBaUQ7UUFDdkMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7S0FtR2hEO0lBeEhBLElBQUksQ0FBNkI7SUFrQ2pDLGtDQUFrQztJQUNsQyxJQUFJLFdBQVc7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUQsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLENBQUMsS0FBYTtRQUNqQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFCO2lCQUFNO2dCQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlCO1NBQ0Q7YUFBTTtZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDOUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDeEMsT0FBTyxDQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7WUFDaEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FDMUMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsS0FBYTtRQUMxQixPQUFPLENBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztZQUM1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGdCQUFnQixDQUFDLEtBQWE7UUFDckMsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNoRCxDQUFDOzhHQXhIVyxnQkFBZ0I7a0dBQWhCLGdCQUFnQiwyWEE0QmQsbUJBQW1CLDJCQUFVLFdBQVcsa0VBSXhDLHVCQUF1QiwyQkFBVSxXQUFXLHdDQVB6QyxhQUFhLDZCQ3pEL0IsczJGQW1HQTs7MkZEbkVhLGdCQUFnQjtrQkFUNUIsU0FBUzsrQkFDQywyQ0FBMkMsbUJBR3BDLHVCQUF1QixDQUFDLE1BQU0sUUFDekM7d0JBQ0wsS0FBSyxFQUFFLDBDQUEwQztxQkFDakQ7OEJBU1EsU0FBUztzQkFBakIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0ksU0FBUztzQkFBbEIsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLFFBQVE7c0JBQWpCLE1BQU07Z0JBR3lCLEtBQUs7c0JBQXBDLGVBQWU7dUJBQUMsYUFBYTtnQkFJOUIsYUFBYTtzQkFEWixZQUFZO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFLeEQsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEFmdGVyQ29udGVudEluaXQsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Q29tcG9uZW50LFxuXHRDb250ZW50Q2hpbGQsXG5cdENvbnRlbnRDaGlsZHJlbixcblx0RXZlbnRFbWl0dGVyLFxuXHRpbmplY3QsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdFF1ZXJ5TGlzdCxcblx0VGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vc3RlcC9zdGVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdGVwcGVyQnV0dG9uc0RpcmVjdGl2ZSB9IGZyb20gJy4uL3N0ZXBwZXItYnV0dG9ucy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU3RlcHBlck5hdkRpcmVjdGl2ZSB9IGZyb20gJy4uL3N0ZXBwZXItbmF2LmRpcmVjdGl2ZSc7XG5cbi8qKlxuICogU3RlcHBlckNvbXBvbmVudCBpcyBhIG11bHRpLXN0ZXAgaW50ZXJmYWNlIGNvbXBvbmVudCBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKiBJdCBtYW5hZ2VzIG5hdmlnYXRpb24gYmV0d2VlbiBzdGVwcywgaGFuZGxlcyBzdGVwIGNvbnRlbnQsIGFuZCBwcm92aWRlc1xuICogY3VzdG9taXphdGlvbiBvcHRpb25zIGZvciBuYXZpZ2F0aW9uIGFuZCBjb250cm9scy5cbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnaHViLXN0ZXBwZXIsIGh1Yi11aS1zdGVwcGVyLCBuZzgwLXN0ZXBwZXInLFxuXHR0ZW1wbGF0ZVVybDogJy4vc3RlcHBlci5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWycuL3N0ZXBwZXIuY29tcG9uZW50LnNjc3MnXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGhvc3Q6IHtcblx0XHRjbGFzczogJ3N0ZXBwZXIgZC1mbGV4IGZsZXgtY29sdW1uIG92ZXJmbG93LWF1dG8nXG5cdH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuXHQjY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuXHQvKiogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGFjdGl2ZSBzdGVwICovXG5cdGN1cnJlbnRJbmRleDogbnVtYmVyID0gMDtcblxuXHQvKiogTGFiZWwgZm9yIHRoZSBiYWNrIGJ1dHRvbiAqL1xuXHRASW5wdXQoKSBiYWNrTGFiZWw6IHN0cmluZyA9ICdCYWNrJztcblxuXHQvKiogTGFiZWwgZm9yIHRoZSBjb250aW51ZSBidXR0b24gKi9cblx0QElucHV0KCkgY29udGludWVMYWJlbDogc3RyaW5nID0gJ0NvbnRpbnVlJztcblxuXHQvKiogTGFiZWwgZm9yIHRoZSBzdWJtaXQgYnV0dG9uICovXG5cdEBJbnB1dCgpIHN1Ym1pdExhYmVsOiBzdHJpbmcgPSAnU3VibWl0JztcblxuXHQvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzdGVwcGVyIGlzIGNvbXBsZXRlZCAqL1xuXHRAT3V0cHV0KCkgY29tcGxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG5cdC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gbW92aW5nIHRvIHRoZSBwcmV2aW91cyBzdGVwICovXG5cdEBPdXRwdXQoKSBwcmV2aW91c1N0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuXHQvKiogRXZlbnQgZW1pdHRlZCB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBzdGVwICovXG5cdEBPdXRwdXQoKSBuZXh0U3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG5cdC8qKiBRdWVyeUxpc3Qgb2YgYWxsIFN0ZXBDb21wb25lbnQgY2hpbGRyZW4gKi9cblx0QENvbnRlbnRDaGlsZHJlbihTdGVwQ29tcG9uZW50KSBzdGVwcyE6IFF1ZXJ5TGlzdDxTdGVwQ29tcG9uZW50PjtcblxuXHQvKiogQ3VzdG9tIHRlbXBsYXRlIGZvciBzdGVwcGVyIG5hdmlnYXRpb24gKi9cblx0QENvbnRlbnRDaGlsZChTdGVwcGVyTmF2RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG5cdHN0ZXBwZXJOYXZUcHQ/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cdC8qKiBDdXN0b20gdGVtcGxhdGUgZm9yIHN0ZXBwZXIgY29udHJvbHMgKi9cblx0QENvbnRlbnRDaGlsZChTdGVwcGVyQnV0dG9uc0RpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuXHRzdGVwcGVyQ29udHJvbHNUcHQ/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cdC8qKiBHZXQgdGhlIGN1cnJlbnQgYWN0aXZlIHN0ZXAgKi9cblx0Z2V0IGN1cnJlbnRTdGVwKCk6IFN0ZXBDb21wb25lbnQgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5zdGVwcz8udG9BcnJheSgpW3RoaXMuY3VycmVudEluZGV4XSA/PyBudWxsO1xuXHR9XG5cblx0bmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuaW5pdGlhbGl6ZVN0ZXBzKCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZSBzdGVwIGluZGljZXMgYW5kIHNldCB1cCBjaGFuZ2UgZGV0ZWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGluaXRpYWxpemVTdGVwcygpOiB2b2lkIHtcblx0XHR0aGlzLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiAoc3RlcC5pbmRleCA9IGluZGV4KSk7XG5cdFx0Ly8gQ29uc2lkZXIgdXNpbmcgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Vcblx0XHR0aGlzLiNjZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlIHRvIHRoZSBwcmV2aW91cyBzdGVwXG5cdCAqL1xuXHRnb1RvUHJldmlvdXMoKTogdm9pZCB7XG5cdFx0dGhpcy5nb1RvKHRoaXMuY3VycmVudEluZGV4IC0gMSk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGUgdG8gdGhlIG5leHQgc3RlcFxuXHQgKi9cblx0Z29Ub05leHQoKTogdm9pZCB7XG5cdFx0dGhpcy5nb1RvKHRoaXMuY3VycmVudEluZGV4ICsgMSk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGUgdG8gYSBzcGVjaWZpYyBzdGVwIGJ5IGluZGV4XG5cdCAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHN0ZXAgdG8gbmF2aWdhdGUgdG9cblx0ICovXG5cdGdvVG8oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzVmFsaWRTdGVwSW5kZXgoaW5kZXgpKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRJbmRleCA9IGluZGV4O1xuXHRcdFx0dGhpcy4jY2RyLmRldGVjdENoYW5nZXMoKTtcblx0XHRcdGlmIChpbmRleCA+IHRoaXMuY3VycmVudEluZGV4KSB7XG5cdFx0XHRcdHRoaXMubmV4dFN0ZXAuZW1pdChpbmRleCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnByZXZpb3VzU3RlcC5lbWl0KGluZGV4KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgSW52YWxpZCBzdGVwIGluZGV4OiAke2luZGV4fWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvIG5hdmlnYXRlIHRvIHRoZSBuZXh0IHN0ZXBcblx0ICovXG5cdGNhbkdvTmV4dCgpOiBib29sZWFuIHtcblx0XHRjb25zdCBuZXh0SW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleCArIDE7XG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXMuaXNWYWxpZFN0ZXBJbmRleChuZXh0SW5kZXgpICYmXG5cdFx0XHQhdGhpcy5zdGVwcy50b0FycmF5KClbbmV4dEluZGV4XT8uZGlzYWJsZWRcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8gbmF2aWdhdGUgdG8gYSBzcGVjaWZpYyBzdGVwXG5cdCAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHN0ZXAgdG8gY2hlY2tcblx0ICovXG5cdGNhbk5hdmlnYXRlVG8oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLmlzVmFsaWRTdGVwSW5kZXgoaW5kZXgpICYmXG5cdFx0XHQhdGhpcy5zdGVwcy50b0FycmF5KClbaW5kZXhdPy5kaXNhYmxlZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29tcGxldGUgdGhlIHN0ZXBwZXIgcHJvY2Vzc1xuXHQgKi9cblx0Y29tcGxldGUoKTogdm9pZCB7XG5cdFx0dGhpcy5jb21wbGV0ZWQuZW1pdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgZ2l2ZW4gaW5kZXggaXMgdmFsaWQgd2l0aGluIHRoZSBjdXJyZW50IHN0ZXBzXG5cdCAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gdmFsaWRhdGVcblx0ICovXG5cdHByaXZhdGUgaXNWYWxpZFN0ZXBJbmRleChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnN0ZXBzLmxlbmd0aDtcblx0fVxufVxuIiwiPGRpdiBjbGFzcz1cInN0ZXBwZXJcIj5cblx0PCEtLWJlZ2luOjpOYXYtLT5cblx0PG5hdiBjbGFzcz1cInN0ZXBwZXJfX25hdlwiPlxuXHRcdDxuZy1jb250YWluZXJcblx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cInN0ZXBwZXJOYXZUcHQgfHwgZGVmYXVsdE5hdlRwdFwiXG5cdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzdGVwczogc3RlcHMsIGN1cnJlbnRJbmRleCB9XCJcblx0XHQ+PC9uZy1jb250YWluZXI+XG5cdDwvbmF2PlxuXHQ8IS0tZW5kOjpOYXYtLT5cblxuXHQ8IS0tYmVnaW46OkNvbnRlbnQtLT5cblx0PGRpdiBjbGFzcz1cInN0ZXBwZXJfX2NvbnRlbnRcIj5cblx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJjdXJyZW50U3RlcD8uaW5uZXJUZW1wbGF0ZVwiXG5cdFx0PjwvbmctY29udGFpbmVyPlxuXHQ8L2Rpdj5cblx0PCEtLWVuZDo6Q29udGVudC0tPlxuXG5cdDwhLS1iZWdpbjo6Q29udHJvbHMtLT5cblx0PGRpdiBjbGFzcz1cInN0ZXBwZXJfX2NvbnRyb2xzXCI+XG5cdFx0PG5nLWNvbnRhaW5lclxuXHRcdFx0W25nVGVtcGxhdGVPdXRsZXRdPVwic3RlcHBlckNvbnRyb2xzVHB0IHx8IGRlZmF1bHRTdGVwcGVyQ29udHJvbHNUcHRcIlxuXHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgc3RlcHM6IHN0ZXBzLCBjdXJyZW50SW5kZXggfVwiXG5cdFx0PjwvbmctY29udGFpbmVyPlxuXHQ8L2Rpdj5cblx0PCEtLWVuZDo6Q29udHJvbHMtLT5cbjwvZGl2PlxuXG48IS0tIGJlZ2luOmRlZmF1bHQtY29udHJvbHMgLS0+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRTdGVwcGVyQ29udHJvbHNUcHQgbGV0LWN1cnJlbnRJbmRleD1cImN1cnJlbnRJbmRleFwiPlxuXHQ8YnV0dG9uXG5cdFx0Y2xhc3M9XCJzdGVwcGVyX19idXR0b24gc3RlcHBlcl9fYnV0dG9uLS1iYWNrXCJcblx0XHQoY2xpY2spPVwiZ29UbyhjdXJyZW50SW5kZXggLSAxKVwiXG5cdFx0Km5nSWY9XCJjdXJyZW50SW5kZXggPiAwXCJcblx0PlxuXHRcdDxpIGNsYXNzPVwic3RlcHBlcl9fYnV0dG9uLWljb24gc3RlcHBlcl9fYnV0dG9uLWljb24tLWJhY2tcIj48L2k+XG5cdFx0e3sgYmFja0xhYmVsIH19XG5cdDwvYnV0dG9uPlxuXG5cdDxidXR0b25cblx0XHRjbGFzcz1cInN0ZXBwZXJfX2J1dHRvbiBzdGVwcGVyX19idXR0b24tLW5leHRcIlxuXHRcdChjbGljayk9XCJnb1RvKGN1cnJlbnRJbmRleCArIDEpXCJcblx0XHQqbmdJZj1cImN1cnJlbnRJbmRleCA8IHN0ZXBzLmxlbmd0aCAtIDFcIlxuXHRcdFtkaXNhYmxlZF09XCIhY2FuR29OZXh0KClcIlxuXHQ+XG5cdFx0e3sgY29udGludWVMYWJlbCB9fVxuXHRcdDxpIGNsYXNzPVwic3RlcHBlcl9fYnV0dG9uLWljb24gc3RlcHBlcl9fYnV0dG9uLWljb24tLW5leHRcIj48L2k+XG5cdDwvYnV0dG9uPlxuXG5cdDxidXR0b25cblx0XHRjbGFzcz1cInN0ZXBwZXJfX2J1dHRvbiBzdGVwcGVyX19idXR0b24tLXN1Ym1pdFwiXG5cdFx0KGNsaWNrKT1cImNvbXBsZXRlKClcIlxuXHRcdCpuZ0lmPVwiY3VycmVudEluZGV4ID09PSBzdGVwcy5sZW5ndGggLSAxXCJcblx0PlxuXHRcdHt7IHN1Ym1pdExhYmVsIH19XG5cdDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbjwhLS1lbmQ6OmRlZmF1bHQtY29udHJvbHMtLT5cblxuPCEtLSBiZWdpbjpkZWZhdWx0LW5hdiAtLT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5hdlRwdCBsZXQtc3RlcHM9XCJzdGVwc1wiIGxldC1jdXJyZW50SW5kZXg9XCJjdXJyZW50SW5kZXhcIj5cblx0PHVsIGNsYXNzPVwic3RlcHBlcl9fbmF2LWxpc3RcIj5cblx0XHQ8bGkgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cInN0ZXBwZXJfX25hdi1pdGVtXCI+XG5cdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuXHRcdFx0XHRcdHN0ZXA/LnN0ZXBUcmlnZ2VyVHB0IHx8IGRlZmF1bHROYXZUcmlnZ2VyVHB0XG5cdFx0XHRcdFwiXG5cdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG5cdFx0XHRcdFx0dGl0bGU6IHN0ZXAudGl0bGUsXG5cdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0aXNDdXJyZW50OiBjdXJyZW50SW5kZXggPT09IGksXG5cdFx0XHRcdFx0aXNDb21wbGV0ZWQ6IGkgPCBjdXJyZW50SW5kZXhcblx0XHRcdFx0fVwiXG5cdFx0XHQ+PC9uZy1jb250YWluZXI+XG5cdFx0PC9saT5cblx0PC91bD5cbjwvbmctdGVtcGxhdGU+XG48IS0tIGVuZDpkZWZhdWx0LW5hdiAtLT5cblxuPCEtLSBiZWdpbjpkZWZhdWx0LW5hdi10cmlnZ2VyIC0tPlxuPG5nLXRlbXBsYXRlXG5cdCNkZWZhdWx0TmF2VHJpZ2dlclRwdFxuXHRsZXQtdGl0bGU9XCJ0aXRsZVwiXG5cdGxldC1pbmRleD1cImluZGV4XCJcblx0bGV0LWlzQ3VycmVudD1cImlzQ3VycmVudFwiXG5cdGxldC1pc0NvbXBsZXRlZD1cImlzQ29tcGxldGVkXCJcbj5cblx0PGJ1dHRvblxuXHRcdGNsYXNzPVwic3RlcHBlcl9fbmF2LXRyaWdnZXJcIlxuXHRcdFtjbGFzcy5zdGVwcGVyX19uYXYtdHJpZ2dlci0tY3VycmVudF09XCJpc0N1cnJlbnRcIlxuXHRcdFtjbGFzcy5zdGVwcGVyX19uYXYtdHJpZ2dlci0tY29tcGxldGVkXT1cImlzQ29tcGxldGVkXCJcblx0XHRbZGlzYWJsZWRdPVwiIWNhbk5hdmlnYXRlVG8oaW5kZXgpXCJcblx0XHQoY2xpY2spPVwiZ29UbyhpbmRleClcIlxuXHQ+XG5cdFx0PHNwYW4gY2xhc3M9XCJzdGVwcGVyX19uYXYtaW5kaWNhdG9yXCI+e3sgaW5kZXggKyAxIH19PC9zcGFuPlxuXHRcdDxzcGFuIGNsYXNzPVwic3RlcHBlcl9fbmF2LXRpdGxlXCIgKm5nSWY9XCJ0aXRsZVwiPnt7IHRpdGxlIH19PC9zcGFuPlxuXHQ8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG48IS0tIGVuZDpkZWZhdWx0LW5hdi10cmlnZ2VyIC0tPlxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class StepperButtonsDirective {
|
|
4
|
+
constructor(template) {
|
|
5
|
+
this.template = template;
|
|
6
|
+
}
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperButtonsDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
8
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.5", type: StepperButtonsDirective, selector: "[hubStepperButtons], [stepperButtons]", ngImport: i0 }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperButtonsDirective, decorators: [{
|
|
11
|
+
type: Directive,
|
|
12
|
+
args: [{
|
|
13
|
+
selector: '[hubStepperButtons], [stepperButtons]'
|
|
14
|
+
}]
|
|
15
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci1idXR0b25zLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3N0ZXBwZXIvc3JjL2xpYi9zdGVwcGVyLWJ1dHRvbnMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBS3ZELE1BQU0sT0FBTyx1QkFBdUI7SUFDbkMsWUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFBRyxDQUFDOzhHQURyQyx1QkFBdUI7a0dBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkFIbkMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsdUNBQXVDO2lCQUNqRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmLCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG5cdHNlbGVjdG9yOiAnW2h1YlN0ZXBwZXJCdXR0b25zXSwgW3N0ZXBwZXJCdXR0b25zXSdcbn0pXG5leHBvcnQgY2xhc3MgU3RlcHBlckJ1dHRvbnNEaXJlY3RpdmUge1xuXHRjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class StepperNavDirective {
|
|
4
|
+
constructor(template) {
|
|
5
|
+
this.template = template;
|
|
6
|
+
}
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperNavDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
8
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.5", type: StepperNavDirective, selector: "[hubStepperNav], [stepperNav]", ngImport: i0 }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: StepperNavDirective, decorators: [{
|
|
11
|
+
type: Directive,
|
|
12
|
+
args: [{
|
|
13
|
+
selector: '[hubStepperNav], [stepperNav]'
|
|
14
|
+
}]
|
|
15
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci1uYXYuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RlcHBlci9zcmMvbGliL3N0ZXBwZXItbmF2LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUt2RCxNQUFNLE9BQU8sbUJBQW1CO0lBQy9CLFlBQW1CLFFBQTBCO1FBQTFCLGFBQVEsR0FBUixRQUFRLENBQWtCO0lBQUcsQ0FBQzs4R0FEckMsbUJBQW1CO2tHQUFuQixtQkFBbUI7OzJGQUFuQixtQkFBbUI7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLCtCQUErQjtpQkFDekMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZVJlZiwgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogJ1todWJTdGVwcGVyTmF2XSwgW3N0ZXBwZXJOYXZdJ1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwcGVyTmF2RGlyZWN0aXZlIHtcblx0Y29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuIl19
|