@byuhbll/components 0.0.8

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.
Files changed (32) hide show
  1. package/README.md +25 -0
  2. package/esm2022/byuhbll-components.mjs +5 -0
  3. package/esm2022/lib/animations/animations.mjs +22 -0
  4. package/esm2022/lib/directives/hbll-pill-btn/hbll-pill-btn.directive.mjs +121 -0
  5. package/esm2022/lib/hbll-checkbox/hbll-checkbox.component.mjs +17 -0
  6. package/esm2022/lib/hbll-header/hbll-header.component.mjs +60 -0
  7. package/esm2022/lib/hbll-multi-select/hbll-multi-select.component.mjs +114 -0
  8. package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +270 -0
  9. package/esm2022/lib/ss-search-bar/constants.mjs +41 -0
  10. package/esm2022/lib/ss-search-bar/date-range/date-range.component.mjs +71 -0
  11. package/esm2022/lib/ss-search-bar/pipes/advanced-queries.pipe.mjs +27 -0
  12. package/esm2022/lib/ss-search-bar/simple-search/simple-search.component.mjs +85 -0
  13. package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +199 -0
  14. package/esm2022/lib/ss-search-bar/utils.mjs +16 -0
  15. package/esm2022/public-api.mjs +6 -0
  16. package/fesm2022/byuhbll-components.mjs +1001 -0
  17. package/fesm2022/byuhbll-components.mjs.map +1 -0
  18. package/index.d.ts +5 -0
  19. package/lib/animations/animations.d.ts +4 -0
  20. package/lib/directives/hbll-pill-btn/hbll-pill-btn.directive.d.ts +17 -0
  21. package/lib/hbll-checkbox/hbll-checkbox.component.d.ts +6 -0
  22. package/lib/hbll-header/hbll-header.component.d.ts +40 -0
  23. package/lib/hbll-multi-select/hbll-multi-select.component.d.ts +52 -0
  24. package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +122 -0
  25. package/lib/ss-search-bar/constants.d.ts +40 -0
  26. package/lib/ss-search-bar/date-range/date-range.component.d.ts +25 -0
  27. package/lib/ss-search-bar/pipes/advanced-queries.pipe.d.ts +8 -0
  28. package/lib/ss-search-bar/simple-search/simple-search.component.d.ts +28 -0
  29. package/lib/ss-search-bar/ss-search-bar.component.d.ts +121 -0
  30. package/lib/ss-search-bar/utils.d.ts +7 -0
  31. package/package.json +25 -0
  32. package/public-api.d.ts +2 -0
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Components
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.0.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project components` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project components`.
8
+
9
+ > Note: Don't forget to add `--project components` or else it will be added to the default project in your `angular.json` file.
10
+
11
+ ## Build
12
+
13
+ Run `ng build components` to build the project. The build artifacts will be stored in the `dist/` directory.
14
+
15
+ ## Publishing
16
+
17
+ After building your library with `ng build components`, go to the dist folder `cd dist/components` and run `npm publish`.
18
+
19
+ ## Running unit tests
20
+
21
+ Run `ng test components` to execute the unit tests via [Karma](https://karma-runner.github.io).
22
+
23
+ ## Further help
24
+
25
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnl1aGJsbC1jb21wb25lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvYnl1aGJsbC1jb21wb25lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { trigger, transition, animate, style, group, query, animateChild, } from '@angular/animations';
2
+ export const libHbllExpandCollapse = trigger('libHbllExpandCollapse', [
3
+ transition('void <=> *', []),
4
+ transition('* <=> *', [
5
+ group([
6
+ style({ height: '{{startHeight}}px' }),
7
+ query('@*', [animateChild()], { optional: true }),
8
+ animate('.15s ease-in-out'),
9
+ ]),
10
+ ], { params: { startHeight: '0px' } }),
11
+ ]);
12
+ export const libHbllFadeInOut = trigger('libHbllFadeInOut', [
13
+ transition(':enter', [style({ opacity: '0' }), animate('.15s ease-out')]),
14
+ transition(':leave', [animate('.15s ease-out', style({ opacity: '0' }))]),
15
+ ]);
16
+ export const libHbllFadeIn = trigger('libHbllFadeIn', [
17
+ transition(':enter', [style({ opacity: '0' }), animate('.15s ease-out')]),
18
+ ]);
19
+ export const libHbllFadeOut = trigger('libHbllFadeOut', [
20
+ transition(':leave', [animate('.15s ease-out', style({ opacity: '0' }))]),
21
+ ]);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9hbmltYXRpb25zL2FuaW1hdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILE9BQU8sRUFDUCxVQUFVLEVBQ1YsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLFlBQVksR0FDZixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRTtJQUNsRSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztJQUM1QixVQUFVLENBQ04sU0FBUyxFQUNUO1FBQ0ksS0FBSyxDQUFDO1lBQ0YsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUM7WUFDdEMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDakQsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1NBQzlCLENBQUM7S0FDTCxFQUNELEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3JDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFO0lBQ3hELFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUN6RSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDNUUsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUU7SUFDbEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7SUFDcEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzVFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgdHJpZ2dlcixcbiAgICB0cmFuc2l0aW9uLFxuICAgIGFuaW1hdGUsXG4gICAgc3R5bGUsXG4gICAgZ3JvdXAsXG4gICAgcXVlcnksXG4gICAgYW5pbWF0ZUNoaWxkLFxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGNvbnN0IGxpYkhibGxFeHBhbmRDb2xsYXBzZSA9IHRyaWdnZXIoJ2xpYkhibGxFeHBhbmRDb2xsYXBzZScsIFtcbiAgICB0cmFuc2l0aW9uKCd2b2lkIDw9PiAqJywgW10pLFxuICAgIHRyYW5zaXRpb24oXG4gICAgICAgICcqIDw9PiAqJyxcbiAgICAgICAgW1xuICAgICAgICAgICAgZ3JvdXAoW1xuICAgICAgICAgICAgICAgIHN0eWxlKHsgaGVpZ2h0OiAne3tzdGFydEhlaWdodH19cHgnIH0pLFxuICAgICAgICAgICAgICAgIHF1ZXJ5KCdAKicsIFthbmltYXRlQ2hpbGQoKV0sIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnLjE1cyBlYXNlLWluLW91dCcpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIF0sXG4gICAgICAgIHsgcGFyYW1zOiB7IHN0YXJ0SGVpZ2h0OiAnMHB4JyB9IH0sXG4gICAgKSxcbl0pO1xuXG5leHBvcnQgY29uc3QgbGliSGJsbEZhZGVJbk91dCA9IHRyaWdnZXIoJ2xpYkhibGxGYWRlSW5PdXQnLCBbXG4gICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHsgb3BhY2l0eTogJzAnIH0pLCBhbmltYXRlKCcuMTVzIGVhc2Utb3V0JyldKSxcbiAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnLjE1cyBlYXNlLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogJzAnIH0pKV0pLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBsaWJIYmxsRmFkZUluID0gdHJpZ2dlcignbGliSGJsbEZhZGVJbicsIFtcbiAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbc3R5bGUoeyBvcGFjaXR5OiAnMCcgfSksIGFuaW1hdGUoJy4xNXMgZWFzZS1vdXQnKV0pLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBsaWJIYmxsRmFkZU91dCA9IHRyaWdnZXIoJ2xpYkhibGxGYWRlT3V0JywgW1xuICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFthbmltYXRlKCcuMTVzIGVhc2Utb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAnMCcgfSkpXSksXG5dKTtcbiJdfQ==
@@ -0,0 +1,121 @@
1
+ import { Directive, ElementRef, HostListener, Input, inject, } from '@angular/core';
2
+ import { ANIMATION_LENGTH_STD, DESTRUCTIVE_RED, DESTRUCTIVE_RED_HOVER, LIGHT_GRAY, PRIMARY_BLUE, PRIMARY_BLUE_HOVER, PRIMARY_PURPLE, PRIMARY_PURPLE_HOVER, SECONDARY_TEXT_GRAY, TEXT_SEMIBOLD, } from '../../ss-search-bar/constants';
3
+ import * as i0 from "@angular/core";
4
+ const BG_COLORS = {
5
+ blue: PRIMARY_BLUE,
6
+ purple: PRIMARY_PURPLE,
7
+ };
8
+ const BG_COLORS_HOVER = {
9
+ blue: PRIMARY_BLUE_HOVER,
10
+ purple: PRIMARY_PURPLE_HOVER,
11
+ };
12
+ export class HbllPillBtnDirective {
13
+ constructor() {
14
+ this.el = inject(ElementRef);
15
+ this.isDestructiveStyle = false;
16
+ this.isDisabled = false;
17
+ this.isFullWidth = false;
18
+ this.color = 'purple';
19
+ }
20
+ onMouseEnter() {
21
+ if (this.isDisabled) {
22
+ return;
23
+ }
24
+ else {
25
+ if (!this.isDestructiveStyle) {
26
+ this.el.nativeElement.style.backgroundColor = BG_COLORS_HOVER[this.color];
27
+ }
28
+ else {
29
+ this.el.nativeElement.style.backgroundColor = DESTRUCTIVE_RED_HOVER;
30
+ }
31
+ }
32
+ this.el.nativeElement.style.cursor = 'pointer';
33
+ }
34
+ onMouseLeave() {
35
+ if (this.isDisabled) {
36
+ return;
37
+ }
38
+ else {
39
+ if (!this.isDestructiveStyle) {
40
+ this.el.nativeElement.style.backgroundColor = BG_COLORS[this.color];
41
+ }
42
+ else {
43
+ this.el.nativeElement.style.backgroundColor = DESTRUCTIVE_RED;
44
+ }
45
+ }
46
+ this.el.nativeElement.style.cursor = 'pointer';
47
+ }
48
+ onClick() {
49
+ if (this.isDisabled) {
50
+ return;
51
+ }
52
+ else {
53
+ if (!this.isDestructiveStyle) {
54
+ this.el.nativeElement.style.backgroundColor = BG_COLORS[this.color];
55
+ }
56
+ else {
57
+ this.el.nativeElement.style.backgroundColor = DESTRUCTIVE_RED;
58
+ }
59
+ }
60
+ this.el.nativeElement.style.cursor = 'pointer';
61
+ }
62
+ ngOnInit() {
63
+ this.setupButton();
64
+ }
65
+ ngOnChanges() {
66
+ this.setupButton();
67
+ }
68
+ setupButton() {
69
+ if (this.isDisabled) {
70
+ this.el.nativeElement.style.color = SECONDARY_TEXT_GRAY;
71
+ this.el.nativeElement.style.backgroundColor = LIGHT_GRAY;
72
+ }
73
+ else {
74
+ if (!this.isDestructiveStyle) {
75
+ this.el.nativeElement.style.backgroundColor = BG_COLORS[this.color];
76
+ }
77
+ else {
78
+ this.el.nativeElement.style.backgroundColor = DESTRUCTIVE_RED;
79
+ }
80
+ this.el.nativeElement.style.color = 'white';
81
+ }
82
+ this.el.nativeElement.style.transition = 'all ' + ANIMATION_LENGTH_STD;
83
+ this.el.nativeElement.style.fontSize = '1em';
84
+ this.el.nativeElement.style.fontWeight = TEXT_SEMIBOLD;
85
+ this.el.nativeElement.style.textAlign = 'center';
86
+ this.el.nativeElement.style.display = this.isFullWidth ? 'flex' : 'inline-flex';
87
+ this.el.nativeElement.style.justifyContent = 'center';
88
+ this.el.nativeElement.style.alignItems = 'center';
89
+ this.el.nativeElement.style.width = this.isFullWidth ? '100%' : 'auto';
90
+ this.el.nativeElement.style.borderRadius = '100em';
91
+ this.el.nativeElement.style.padding = '0.4em 1.3em';
92
+ this.el.nativeElement.style.boxSizing = 'border-box';
93
+ }
94
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllPillBtnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
95
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.0", type: HbllPillBtnDirective, isStandalone: true, selector: "[libHbllPillBtn]", inputs: { isDestructiveStyle: "isDestructiveStyle", isDisabled: "isDisabled", isFullWidth: "isFullWidth", color: "color" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "click": "onClick()" } }, usesOnChanges: true, ngImport: i0 }); }
96
+ }
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllPillBtnDirective, decorators: [{
98
+ type: Directive,
99
+ args: [{
100
+ selector: '[libHbllPillBtn]',
101
+ standalone: true,
102
+ }]
103
+ }], propDecorators: { isDestructiveStyle: [{
104
+ type: Input
105
+ }], isDisabled: [{
106
+ type: Input
107
+ }], isFullWidth: [{
108
+ type: Input
109
+ }], color: [{
110
+ type: Input
111
+ }], onMouseEnter: [{
112
+ type: HostListener,
113
+ args: ['mouseenter']
114
+ }], onMouseLeave: [{
115
+ type: HostListener,
116
+ args: ['mouseleave']
117
+ }], onClick: [{
118
+ type: HostListener,
119
+ args: ['click']
120
+ }] } });
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1waWxsLWJ0bi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlyZWN0aXZlcy9oYmxsLXBpbGwtYnRuL2hibGwtcGlsbC1idG4uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUdULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixVQUFVLEVBQ1YsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixhQUFhLEdBQ2hCLE1BQU0sK0JBQStCLENBQUM7O0FBRXZDLE1BQU0sU0FBUyxHQUFHO0lBQ2QsSUFBSSxFQUFFLFlBQVk7SUFDbEIsTUFBTSxFQUFFLGNBQWM7Q0FDekIsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHO0lBQ3BCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsTUFBTSxFQUFFLG9CQUFvQjtDQUMvQixDQUFDO0FBTUYsTUFBTSxPQUFPLG9CQUFvQjtJQUpqQztRQUtxQixPQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLFVBQUssR0FBc0IsUUFBUSxDQUFDO0tBeUVoRDtJQXZFK0IsWUFBWTtRQUNwQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1gsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FB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O2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFc0IsWUFBWTtzQkFBdkMsWUFBWTt1QkFBQyxZQUFZO2dCQWFFLFlBQVk7c0JBQXZDLFlBQVk7dUJBQUMsWUFBWTtnQkFhSCxPQUFPO3NCQUE3QixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBpbmplY3QsXG4gICAgdHlwZSBPbkNoYW5nZXMsXG4gICAgdHlwZSBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBTklNQVRJT05fTEVOR1RIX1NURCxcbiAgICBERVNUUlVDVElWRV9SRUQsXG4gICAgREVTVFJVQ1RJVkVfUkVEX0hPVkVSLFxuICAgIExJR0hUX0dSQVksXG4gICAgUFJJTUFSWV9CTFVFLFxuICAgIFBSSU1BUllfQkxVRV9IT1ZFUixcbiAgICBQUklNQVJZX1BVUlBMRSxcbiAgICBQUklNQVJZX1BVUlBMRV9IT1ZFUixcbiAgICBTRUNPTkRBUllfVEVYVF9HUkFZLFxuICAgIFRFWFRfU0VNSUJPTEQsXG59IGZyb20gJy4uLy4uL3NzLXNlYXJjaC1iYXIvY29uc3RhbnRzJztcblxuY29uc3QgQkdfQ09MT1JTID0ge1xuICAgIGJsdWU6IFBSSU1BUllfQkxVRSxcbiAgICBwdXJwbGU6IFBSSU1BUllfUFVSUExFLFxufTtcblxuY29uc3QgQkdfQ09MT1JTX0hPVkVSID0ge1xuICAgIGJsdWU6IFBSSU1BUllfQkxVRV9IT1ZFUixcbiAgICBwdXJwbGU6IFBSSU1BUllfUFVSUExFX0hPVkVSLFxufTtcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbbGliSGJsbFBpbGxCdG5dJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBIYmxsUGlsbEJ0bkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIEBJbnB1dCgpIGlzRGVzdHJ1Y3RpdmVTdHlsZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBpc0Z1bGxXaWR0aCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGNvbG9yOiAnYmx1ZScgfCAncHVycGxlJyA9ICdwdXJwbGUnO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGVzdHJ1Y3RpdmVTdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBCR19DT0xPUlNfSE9WRVJbdGhpcy5jb2xvcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBERVNUUlVDVElWRV9SRURfSE9WRVI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJykgb25Nb3VzZUxlYXZlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNEZXN0cnVjdGl2ZVN0eWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IEJHX0NPTE9SU1t0aGlzLmNvbG9yXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IERFU1RSVUNUSVZFX1JFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJykgb25DbGljaygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGVzdHJ1Y3RpdmVTdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBCR19DT0xPUlNbdGhpcy5jb2xvcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBERVNUUlVDVElWRV9SRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXR1cEJ1dHRvbigpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLnNldHVwQnV0dG9uKCk7XG4gICAgfVxuXG4gICAgc2V0dXBCdXR0b24oKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5jb2xvciA9IFNFQ09OREFSWV9URVhUX0dSQVk7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gTElHSFRfR1JBWTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Rlc3RydWN0aXZlU3R5bGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gQkdfQ09MT1JTW3RoaXMuY29sb3JdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gREVTVFJVQ1RJVkVfUkVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgJyArIEFOSU1BVElPTl9MRU5HVEhfU1REO1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMWVtJztcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmZvbnRXZWlnaHQgPSBURVhUX1NFTUlCT0xEO1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5pc0Z1bGxXaWR0aCA/ICdmbGV4JyA6ICdpbmxpbmUtZmxleCc7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLmlzRnVsbFdpZHRoID8gJzEwMCUnIDogJ2F1dG8nO1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzEwMGVtJztcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMC40ZW0gMS4zZW0nO1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class HbllCheckboxComponent {
5
+ constructor() {
6
+ this.isChecked = false;
7
+ }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllCheckboxComponent, isStandalone: true, selector: "lib-hbll-checkbox", inputs: { isChecked: "isChecked" }, ngImport: i0, template: "<span class=\"checkbox-container\" [class.checked]=\"isChecked\">\n @if (isChecked) {\n <span class=\"material-symbols-outlined icon\"> check </span>\n }\n</span>\n", styles: [".checkbox-container{transition:.15s;height:1.13em;aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;border-radius:4px;border:solid 1px #707070;color:#fff;box-sizing:border-box;position:relative}.checkbox-container.checked{border-color:#3a6093;background-color:#3a6093}.checkbox-container.checked .icon{position:absolute;font-size:1.1em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllCheckboxComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'lib-hbll-checkbox', standalone: true, imports: [CommonModule], template: "<span class=\"checkbox-container\" [class.checked]=\"isChecked\">\n @if (isChecked) {\n <span class=\"material-symbols-outlined icon\"> check </span>\n }\n</span>\n", styles: [".checkbox-container{transition:.15s;height:1.13em;aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;border-radius:4px;border:solid 1px #707070;color:#fff;box-sizing:border-box;position:relative}.checkbox-container.checked{border-color:#3a6093;background-color:#3a6093}.checkbox-container.checked .icon{position:absolute;font-size:1.1em}\n"] }]
14
+ }], propDecorators: { isChecked: [{
15
+ type: Input
16
+ }] } });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1jaGVja2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvaGJsbC1jaGVja2JveC9oYmxsLWNoZWNrYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWNoZWNrYm94L2hibGwtY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVNqRCxNQUFNLE9BQU8scUJBQXFCO0lBUGxDO1FBUWEsY0FBUyxHQUFHLEtBQUssQ0FBQztLQUM5Qjs4R0FGWSxxQkFBcUI7a0dBQXJCLHFCQUFxQixpSENWbEMsbUxBS0EsaWFER2MsWUFBWTs7MkZBRWIscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNJLG1CQUFtQixjQUdqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7OEJBR2QsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWhibGwtY2hlY2tib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oYmxsLWNoZWNrYm94LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9oYmxsLWNoZWNrYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbENoZWNrYm94Q29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBpc0NoZWNrZWQgPSBmYWxzZTtcbn1cbiIsIjxzcGFuIGNsYXNzPVwiY2hlY2tib3gtY29udGFpbmVyXCIgW2NsYXNzLmNoZWNrZWRdPVwiaXNDaGVja2VkXCI+XG4gICAgQGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb25cIj4gY2hlY2sgPC9zcGFuPlxuICAgIH1cbjwvc3Bhbj5cbiJdfQ==
@@ -0,0 +1,60 @@
1
+ import { DatePipe, LowerCasePipe } from '@angular/common';
2
+ import { toSignal } from '@angular/core/rxjs-interop';
3
+ import { HttpClient } from '@angular/common/http';
4
+ import { Component, EventEmitter, Output, Pipe, Renderer2, computed, inject, input, viewChild, } from '@angular/core';
5
+ import * as i0 from "@angular/core";
6
+ const LIBRARY_HOURS_API_URL = 'https://apps.lib.byu.edu/libraryhours/api/hours';
7
+ export class LibraryHoursDatePipe {
8
+ transform(date, time) {
9
+ return new Date(date + 'T' + time);
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: LibraryHoursDatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
12
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: LibraryHoursDatePipe, isStandalone: true, name: "libraryHoursDate" }); }
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: LibraryHoursDatePipe, decorators: [{
15
+ type: Pipe,
16
+ args: [{
17
+ name: 'libraryHoursDate',
18
+ standalone: true,
19
+ }]
20
+ }] });
21
+ /**
22
+ * Header component built to be exported as a custom element.
23
+ * This component uses icons provided by Google Material.
24
+ * The link to these icons should be included once in the \<head> of your base html.
25
+ *
26
+ * When a non-empty string `name` is provided to this component, the user is considered logged in.
27
+ * Two outputs/events are accessible: `login` and `logout`.
28
+ */
29
+ export class HbllHeaderComponent {
30
+ constructor() {
31
+ this.r2 = inject(Renderer2);
32
+ this.http = inject(HttpClient);
33
+ // --- API ---
34
+ this.name = input('');
35
+ this.login = new EventEmitter();
36
+ this.logout = new EventEmitter();
37
+ // -----------
38
+ this.accountInfoEl = viewChild('accountInfo');
39
+ this.isLoggedIn = computed(() => !!this.name());
40
+ this.libraryHours = toSignal(this.http.get(LIBRARY_HOURS_API_URL));
41
+ this.showAccountDropdown = false;
42
+ }
43
+ ngAfterViewInit() {
44
+ this.r2.listen('window', 'click', (e) => {
45
+ if (!this.accountInfoEl()?.nativeElement.contains(e.target))
46
+ this.showAccountDropdown = false;
47
+ });
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
50
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllHeaderComponent, isStandalone: true, selector: "lib-hbll-header", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { login: "login", logout: "logout" }, viewQueries: [{ propertyName: "accountInfoEl", first: true, predicate: ["accountInfo"], descendants: true, isSignal: true }], ngImport: i0, template: "<header role=\"banner\" class=\"wrapper\">\n <h1>\n <a href=\"https://lib.byu.edu/\">\n <img\n src=\"https://media.lib.byu.edu/web-assets/images/1.0.0/byu-library-logo-full.svg\"\n alt=\"BYU Library Logo\"\n />\n </a>\n </h1>\n <div id=\"libraryInfo\" class=\"wrapper\">\n @if (libraryHours()) {\n <div id=\"libraryHours\">\n <div class=\"wrapper\">\n <span class=\"material-symbols-outlined left-icon\"> schedule </span>\n {{\n libraryHours()?.is_closed\n ? \"CLOSED\"\n : \"Today's hours: \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.open_time\n | date : \"ha\"\n | lowercase) +\n \" - \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.close_time\n | date : \"ha\"\n | lowercase)\n }}\n </div>\n </div>\n }\n <div id=\"accountInfo\" #accountInfo>\n <button\n (click)=\"\n isLoggedIn()\n ? (showAccountDropdown = !showAccountDropdown)\n : login.emit()\n \"\n class=\"wrapper\"\n id=\"accountBtn\"\n >\n <span class=\"material-symbols-outlined left-icon\"> person </span>\n {{ isLoggedIn() ? name : \"Login\" }}\n @if (isLoggedIn()) {\n <span class=\"material-symbols-outlined\"> arrow_drop_down </span>\n }\n </button>\n @if (isLoggedIn() && showAccountDropdown) {\n <div id=\"accountDropdown\">\n <a class=\"item\">My Account</a>\n <a class=\"item\">Preferences</a>\n <button class=\"item\" (click)=\"logout.emit()\">Logout</button>\n </div>\n }\n </div>\n </div>\n</header>\n<nav></nav>\n", styles: [":host{font-family:Source Sans Pro}.wrapper{display:flex;align-items:center}header{background-color:#002e5d;display:flex;align-items:center;padding:.6rem 1rem}h1{height:2rem}#libraryInfo{margin-left:auto}#libraryHours,#accountInfo{color:#fff;margin:.6rem}.left-icon{margin-right:.4rem}img{height:100%}#accountInfo{position:relative}#accountInfo #accountBtn:hover{opacity:.6}#accountInfo #accountDropdown{font-size:1.1rem;text-wrap:nowrap;position:absolute;background-color:#002e5d;top:100%;right:0;padding:1.2rem}#accountInfo #accountDropdown .item{display:block;padding:.4rem 0;width:100%;text-align:left}#accountInfo #accountDropdown .item:first-child{padding-top:0}#accountInfo #accountDropdown .item:last-child{padding-bottom:0}button{background-color:transparent;border:none;cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;padding:0}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: LibraryHoursDatePipe, name: "libraryHoursDate" }] }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllHeaderComponent, decorators: [{
53
+ type: Component,
54
+ args: [{ selector: 'lib-hbll-header', standalone: true, imports: [DatePipe, LowerCasePipe, LibraryHoursDatePipe], template: "<header role=\"banner\" class=\"wrapper\">\n <h1>\n <a href=\"https://lib.byu.edu/\">\n <img\n src=\"https://media.lib.byu.edu/web-assets/images/1.0.0/byu-library-logo-full.svg\"\n alt=\"BYU Library Logo\"\n />\n </a>\n </h1>\n <div id=\"libraryInfo\" class=\"wrapper\">\n @if (libraryHours()) {\n <div id=\"libraryHours\">\n <div class=\"wrapper\">\n <span class=\"material-symbols-outlined left-icon\"> schedule </span>\n {{\n libraryHours()?.is_closed\n ? \"CLOSED\"\n : \"Today's hours: \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.open_time\n | date : \"ha\"\n | lowercase) +\n \" - \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.close_time\n | date : \"ha\"\n | lowercase)\n }}\n </div>\n </div>\n }\n <div id=\"accountInfo\" #accountInfo>\n <button\n (click)=\"\n isLoggedIn()\n ? (showAccountDropdown = !showAccountDropdown)\n : login.emit()\n \"\n class=\"wrapper\"\n id=\"accountBtn\"\n >\n <span class=\"material-symbols-outlined left-icon\"> person </span>\n {{ isLoggedIn() ? name : \"Login\" }}\n @if (isLoggedIn()) {\n <span class=\"material-symbols-outlined\"> arrow_drop_down </span>\n }\n </button>\n @if (isLoggedIn() && showAccountDropdown) {\n <div id=\"accountDropdown\">\n <a class=\"item\">My Account</a>\n <a class=\"item\">Preferences</a>\n <button class=\"item\" (click)=\"logout.emit()\">Logout</button>\n </div>\n }\n </div>\n </div>\n</header>\n<nav></nav>\n", styles: [":host{font-family:Source Sans Pro}.wrapper{display:flex;align-items:center}header{background-color:#002e5d;display:flex;align-items:center;padding:.6rem 1rem}h1{height:2rem}#libraryInfo{margin-left:auto}#libraryHours,#accountInfo{color:#fff;margin:.6rem}.left-icon{margin-right:.4rem}img{height:100%}#accountInfo{position:relative}#accountInfo #accountBtn:hover{opacity:.6}#accountInfo #accountDropdown{font-size:1.1rem;text-wrap:nowrap;position:absolute;background-color:#002e5d;top:100%;right:0;padding:1.2rem}#accountInfo #accountDropdown .item{display:block;padding:.4rem 0;width:100%;text-align:left}#accountInfo #accountDropdown .item:first-child{padding-top:0}#accountInfo #accountDropdown .item:last-child{padding-bottom:0}button{background-color:transparent;border:none;cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;padding:0}\n"] }]
55
+ }], propDecorators: { login: [{
56
+ type: Output
57
+ }], logout: [{
58
+ type: Output
59
+ }] } });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtaGVhZGVyL2hibGwtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWhlYWRlci9oYmxsLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLElBQUksRUFFSixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDOztBQUV2QixNQUFNLHFCQUFxQixHQUFHLGlEQUFpRCxDQUFDO0FBaUJoRixNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFNBQVMsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUNoQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQzs4R0FIUSxvQkFBb0I7NEdBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFKaEMsSUFBSTttQkFBQztvQkFDRixJQUFJLEVBQUUsa0JBQWtCO29CQUN4QixVQUFVLEVBQUUsSUFBSTtpQkFDbkI7O0FBT0Q7Ozs7Ozs7R0FPRztBQVFILE1BQU0sT0FBTyxtQkFBbUI7SUFQaEM7UUFRcUIsT0FBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QixTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNDLGNBQWM7UUFDSixTQUFJLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVDLGNBQWM7UUFFTixrQkFBYSxHQUFHLFNBQVMsQ0FBYSxhQUFhLENBQUMsQ0FBQztRQUVuRCxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzQyxpQkFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBZSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDNUUsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO0tBUXpDO0lBTkcsZUFBZTtRQUNYLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDdkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBckJRLG1CQUFtQjtrR0FBbkIsbUJBQW1CLHlYQ3hEaEMsbXlEQTBEQSwrNEJETmMsUUFBUSx3Q0FBRSxhQUFhLDZDQWpCeEIsb0JBQW9COzsyRkFxQnBCLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDSSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixDQUFDOzhCQVU5QyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUsIExvd2VyQ2FzZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPdXRwdXQsXG4gICAgUGlwZSxcbiAgICBQaXBlVHJhbnNmb3JtLFxuICAgIFJlbmRlcmVyMixcbiAgICBjb21wdXRlZCxcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuY29uc3QgTElCUkFSWV9IT1VSU19BUElfVVJMID0gJ2h0dHBzOi8vYXBwcy5saWIuYnl1LmVkdS9saWJyYXJ5aG91cnMvYXBpL2hvdXJzJztcblxuaW50ZXJmYWNlIExpYnJhcnlIb3VycyB7XG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIGlzX2Nsb3NlZDogYm9vbGVhbjtcbiAgICBvcGVuX3RpbWU6IHN0cmluZztcbiAgICBjbG9zZV90aW1lOiBzdHJpbmc7XG4gICAgaGFzX2V4Y2VwdGlvbjogYm9vbGVhbjtcbiAgICBleGNlcHRpb25fdGl0bGU6IHN0cmluZztcbiAgICBleGNlcHRpb25fbWVzc2FnZTogc3RyaW5nO1xuICAgIGlzX2N1cnJlbnRseV9vcGVuOiBib29sZWFuO1xufVxuXG5AUGlwZSh7XG4gICAgbmFtZTogJ2xpYnJhcnlIb3Vyc0RhdGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIExpYnJhcnlIb3Vyc0RhdGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gICAgdHJhbnNmb3JtKGRhdGU6IHN0cmluZywgdGltZTogc3RyaW5nKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlICsgJ1QnICsgdGltZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlYWRlciBjb21wb25lbnQgYnVpbHQgdG8gYmUgZXhwb3J0ZWQgYXMgYSBjdXN0b20gZWxlbWVudC5cbiAqIFRoaXMgY29tcG9uZW50IHVzZXMgaWNvbnMgcHJvdmlkZWQgYnkgR29vZ2xlIE1hdGVyaWFsLlxuICogVGhlIGxpbmsgdG8gdGhlc2UgaWNvbnMgc2hvdWxkIGJlIGluY2x1ZGVkIG9uY2UgaW4gdGhlIFxcPGhlYWQ+IG9mIHlvdXIgYmFzZSBodG1sLlxuICpcbiAqIFdoZW4gYSBub24tZW1wdHkgc3RyaW5nIGBuYW1lYCBpcyBwcm92aWRlZCB0byB0aGlzIGNvbXBvbmVudCwgdGhlIHVzZXIgaXMgY29uc2lkZXJlZCBsb2dnZWQgaW4uXG4gKiBUd28gb3V0cHV0cy9ldmVudHMgYXJlIGFjY2Vzc2libGU6IGBsb2dpbmAgYW5kIGBsb2dvdXRgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1oYmxsLWhlYWRlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbRGF0ZVBpcGUsIExvd2VyQ2FzZVBpcGUsIExpYnJhcnlIb3Vyc0RhdGVQaXBlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaGJsbC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9oYmxsLWhlYWRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEhibGxIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuXG4gICAgLy8gLS0tIEFQSSAtLS1cbiAgICBwcm90ZWN0ZWQgbmFtZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICAgIEBPdXRwdXQoKSBsb2dpbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgbG9nb3V0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIC8vIC0tLS0tLS0tLS0tXG5cbiAgICBwcml2YXRlIGFjY291bnRJbmZvRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2FjY291bnRJbmZvJyk7XG5cbiAgICBwcm90ZWN0ZWQgaXNMb2dnZWRJbiA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5uYW1lKCkpO1xuICAgIHByb3RlY3RlZCBsaWJyYXJ5SG91cnMgPSB0b1NpZ25hbCh0aGlzLmh0dHAuZ2V0PExpYnJhcnlIb3Vycz4oTElCUkFSWV9IT1VSU19BUElfVVJMKSk7XG4gICAgcHJvdGVjdGVkIHNob3dBY2NvdW50RHJvcGRvd24gPSBmYWxzZTtcblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yMi5saXN0ZW4oJ3dpbmRvdycsICdjbGljaycsIChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFjY291bnRJbmZvRWwoKT8ubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QWNjb3VudERyb3Bkb3duID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxoZWFkZXIgcm9sZT1cImJhbm5lclwiIGNsYXNzPVwid3JhcHBlclwiPlxuICA8aDE+XG4gICAgPGEgaHJlZj1cImh0dHBzOi8vbGliLmJ5dS5lZHUvXCI+XG4gICAgICA8aW1nXG4gICAgICAgIHNyYz1cImh0dHBzOi8vbWVkaWEubGliLmJ5dS5lZHUvd2ViLWFzc2V0cy9pbWFnZXMvMS4wLjAvYnl1LWxpYnJhcnktbG9nby1mdWxsLnN2Z1wiXG4gICAgICAgIGFsdD1cIkJZVSBMaWJyYXJ5IExvZ29cIlxuICAgICAgLz5cbiAgICA8L2E+XG4gIDwvaDE+XG4gIDxkaXYgaWQ9XCJsaWJyYXJ5SW5mb1wiIGNsYXNzPVwid3JhcHBlclwiPlxuICAgIEBpZiAobGlicmFyeUhvdXJzKCkpIHtcbiAgICA8ZGl2IGlkPVwibGlicmFyeUhvdXJzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgbGVmdC1pY29uXCI+IHNjaGVkdWxlIDwvc3Bhbj5cbiAgICAgICAge3tcbiAgICAgICAgICBsaWJyYXJ5SG91cnMoKT8uaXNfY2xvc2VkXG4gICAgICAgICAgICA/IFwiQ0xPU0VEXCJcbiAgICAgICAgICAgIDogXCJUb2RheSdzIGhvdXJzOiBcIiArXG4gICAgICAgICAgICAgIChsaWJyYXJ5SG91cnMoKSEuZGF0ZVxuICAgICAgICAgICAgICAgIHwgbGlicmFyeUhvdXJzRGF0ZSA6IGxpYnJhcnlIb3VycygpIS5vcGVuX3RpbWVcbiAgICAgICAgICAgICAgICB8IGRhdGUgOiBcImhhXCJcbiAgICAgICAgICAgICAgICB8IGxvd2VyY2FzZSkgK1xuICAgICAgICAgICAgICBcIiAtIFwiICtcbiAgICAgICAgICAgICAgKGxpYnJhcnlIb3VycygpIS5kYXRlXG4gICAgICAgICAgICAgICAgfCBsaWJyYXJ5SG91cnNEYXRlIDogbGlicmFyeUhvdXJzKCkhLmNsb3NlX3RpbWVcbiAgICAgICAgICAgICAgICB8IGRhdGUgOiBcImhhXCJcbiAgICAgICAgICAgICAgICB8IGxvd2VyY2FzZSlcbiAgICAgICAgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2IGlkPVwiYWNjb3VudEluZm9cIiAjYWNjb3VudEluZm8+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBpc0xvZ2dlZEluKClcbiAgICAgICAgICAgID8gKHNob3dBY2NvdW50RHJvcGRvd24gPSAhc2hvd0FjY291bnREcm9wZG93bilcbiAgICAgICAgICAgIDogbG9naW4uZW1pdCgpXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwid3JhcHBlclwiXG4gICAgICAgIGlkPVwiYWNjb3VudEJ0blwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBsZWZ0LWljb25cIj4gcGVyc29uIDwvc3Bhbj5cbiAgICAgICAge3sgaXNMb2dnZWRJbigpID8gbmFtZSA6IFwiTG9naW5cIiB9fVxuICAgICAgICBAaWYgKGlzTG9nZ2VkSW4oKSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYXJyb3dfZHJvcF9kb3duIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKGlzTG9nZ2VkSW4oKSAmJiBzaG93QWNjb3VudERyb3Bkb3duKSB7XG4gICAgICA8ZGl2IGlkPVwiYWNjb3VudERyb3Bkb3duXCI+XG4gICAgICAgIDxhIGNsYXNzPVwiaXRlbVwiPk15IEFjY291bnQ8L2E+XG4gICAgICAgIDxhIGNsYXNzPVwiaXRlbVwiPlByZWZlcmVuY2VzPC9hPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaXRlbVwiIChjbGljayk9XCJsb2dvdXQuZW1pdCgpXCI+TG9nb3V0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2hlYWRlcj5cbjxuYXY+PC9uYXY+XG4iXX0=
@@ -0,0 +1,114 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatAutocompleteModule, } from '@angular/material/autocomplete';
4
+ import { MatFormFieldModule } from '@angular/material/form-field';
5
+ import { MatChipsModule } from '@angular/material/chips';
6
+ import { COMMA, ENTER } from '@angular/cdk/keycodes';
7
+ import { MatIconModule } from '@angular/material/icon';
8
+ import { FormControl, ReactiveFormsModule } from '@angular/forms';
9
+ import { combineLatest } from 'rxjs';
10
+ import { map, startWith } from 'rxjs/operators';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "@angular/material/chips";
14
+ import * as i3 from "@angular/material/form-field";
15
+ import * as i4 from "@angular/material/autocomplete";
16
+ import * as i5 from "@angular/material/core";
17
+ import * as i6 from "@angular/forms";
18
+ export class HbllMultiSelectComponent {
19
+ constructor() {
20
+ this.allOptions = {};
21
+ this.label = '';
22
+ /**
23
+ * An array that indicates which keys are selected.
24
+ */
25
+ this.selectedKeys = [];
26
+ /**
27
+ * An EventEmitter that emits an array of keys indicating which options are currently selected.
28
+ */
29
+ this.selectedKeysChange = new EventEmitter();
30
+ this.inputControl = new FormControl('');
31
+ this.filteredOptions$ = combineLatest([
32
+ this.inputControl.valueChanges.pipe(startWith('')),
33
+ this.selectedKeysChange.asObservable().pipe(startWith([])),
34
+ ]).pipe(map(([key]) =>
35
+ // Display filtered options if there is a value, else display all options currently not selected.
36
+ key
37
+ ? this.filterOptions(key)
38
+ : Object.keys(this.allOptions).filter((key) => !this.selectedKeys.find((selectedOption) => key === selectedOption))));
39
+ this.separatorKeysCodes = [ENTER, COMMA];
40
+ /**
41
+ * Adds an option to the array of selected keys when a user selects from the autocomplete.
42
+ * @param {MatAutocompleteSelectedEvent} event MatAutocompleteSelectedEvent
43
+ */
44
+ this.selectOption = (event) => {
45
+ this.addOptionToSelectedOptions(event.option.value);
46
+ };
47
+ /**
48
+ * Filters the options by the supplied key as well as the currently selected key.
49
+ * @param {string} key key to filter by.
50
+ * @returns {string[]} the filtered keys
51
+ */
52
+ this.filterOptions = (newKey) => {
53
+ return Object.keys(this.allOptions).filter((key) => this.allOptions[key] !== newKey && !this.selectedKeys.includes(key));
54
+ };
55
+ /**
56
+ * Adds a key to the selected keys array if the option is truthy and not already in the array.
57
+ * The input is also cleared (if available), and the new selected keys are emitted.
58
+ * @param {key} option key to add
59
+ */
60
+ this.addOptionToSelectedOptions = (key) => {
61
+ if (key && !this.selectedKeys.includes(key) && this.allOptions[key]) {
62
+ this.selectedKeys.push(key);
63
+ this.inputControl.setValue('');
64
+ this.selectedKeysChange.emit(this.selectedKeys);
65
+ if (this.inputRef)
66
+ this.inputRef.nativeElement.value = '';
67
+ }
68
+ };
69
+ }
70
+ /**
71
+ * Adds a key from the input to the array of selected key.
72
+ * The value from the input must match a key from the record of all options.
73
+ * @param {MatChipInputEvent} event MatChipInputEvent
74
+ */
75
+ addOption(event) {
76
+ this.addOptionToSelectedOptions(event.value);
77
+ }
78
+ /**
79
+ * Removes a key from the array of selected options and emits the new selected keys.
80
+ * @param {MultiSelectKeyValPair} key key to remove
81
+ */
82
+ removeOption(key) {
83
+ const index = this.selectedKeys.indexOf(key);
84
+ if (index >= 0) {
85
+ this.selectedKeys.splice(index, 1);
86
+ this.selectedKeysChange.emit(this.selectedKeys);
87
+ }
88
+ }
89
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
90
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllMultiSelectComponent, isStandalone: true, selector: "lib-hbll-multi-select", inputs: { allOptions: "allOptions", label: "label", selectedKeys: "selectedKeys" }, outputs: { selectedKeysChange: "selectedKeysChange" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"hbll-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <label class=\"hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".hbll-multi-select mat-form-field{width:100%}.hbll-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input{margin-left:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.hbll-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.hbll-multi-select .icon{font-size:1em}.hbll-multi-select mat-autocomplete{font-family:inherit}.hbll-multi-select .hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font-family:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i2.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
91
+ }
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'lib-hbll-multi-select', standalone: true, imports: [
95
+ CommonModule,
96
+ MatChipsModule,
97
+ MatFormFieldModule,
98
+ MatAutocompleteModule,
99
+ ReactiveFormsModule,
100
+ MatIconModule,
101
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"hbll-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <label class=\"hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".hbll-multi-select mat-form-field{width:100%}.hbll-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input{margin-left:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.hbll-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.hbll-multi-select .icon{font-size:1em}.hbll-multi-select mat-autocomplete{font-family:inherit}.hbll-multi-select .hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font-family:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"] }]
102
+ }], propDecorators: { inputRef: [{
103
+ type: ViewChild,
104
+ args: ['input']
105
+ }], allOptions: [{
106
+ type: Input
107
+ }], label: [{
108
+ type: Input
109
+ }], selectedKeys: [{
110
+ type: Input
111
+ }], selectedKeysChange: [{
112
+ type: Output
113
+ }] } });
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtbXVsdGktc2VsZWN0L2hibGwtbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLW11bHRpLXNlbGVjdC9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gscUJBQXFCLEdBRXhCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFxQixjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQW9CaEQsTUFBTSxPQUFPLHdCQUF3QjtJQWxCckM7UUFvQmEsZUFBVSxHQUEyQixFQUFFLENBQUM7UUFDeEMsVUFBSyxH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Q0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNMLENBQUM7OEdBaERRLHdCQUF3QjtrR0FBeEIsd0JBQXdCLCtUQ3pDckMscXJEQXlDQSw0cUJEZFEsWUFBWSxnSkFDWixjQUFjLDR1QkFDZCxrQkFBa0IseU9BQ2xCLHFCQUFxQix3MUJBQ3JCLG1CQUFtQix5a0JBQ25CLGFBQWE7OzJGQVNSLHdCQUF3QjtrQkFsQnBDLFNBQVM7K0JBQ0ksdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsYUFBYTtxQkFDaEIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTs4QkFLbkIsUUFBUTtzQkFBbkMsU0FBUzt1QkFBQyxPQUFPO2dCQUNULFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQsIE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWhibGwtbXVsdGktc2VsZWN0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRDaGlwc01vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgXSxcbiAgICAvLyBOZWNlc3NhcnkgdG8gb3ZlcnJpZGUgbWF0ZXJpYWwgZGVzaWduIHN0eWxlcy5cbiAgICAvLyBJTVBPUlRBTlQ6IFRpZ2h0bHkgc2NvcGUgY2xhc3NlcyBhbmQgaWRzIHRvIHRoaXMgY29tcG9uZW50IGlmIHRoZXkgYXJlIG5lY2Vzc2FyeS5cbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IHtcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcpIHByaXZhdGUgaW5wdXRSZWYhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIEBJbnB1dCgpIGFsbE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGtleXMgYXJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBBbiBFdmVudEVtaXR0ZXIgdGhhdCBlbWl0cyBhbiBhcnJheSBvZiBrZXlzIGluZGljYXRpbmcgd2hpY2ggb3B0aW9ucyBhcmUgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzZWxlY3RlZEtleXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gICAgcHJvdGVjdGVkIGlucHV0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgcHJvdGVjdGVkIGZpbHRlcmVkT3B0aW9ucyQ6IE9ic2VydmFibGU8c3RyaW5nW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCgnJykpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkS2V5c0NoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHN0YXJ0V2l0aChbXSkpLFxuICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW2tleV06IFtzdHJpbmcgfCBudWxsLCB1bmtub3duXSkgPT5cbiAgICAgICAgICAgIC8vIERpc3BsYXkgZmlsdGVyZWQgb3B0aW9ucyBpZiB0aGVyZSBpcyBhIHZhbHVlLCBlbHNlIGRpc3BsYXkgYWxsIG9wdGlvbnMgY3VycmVudGx5IG5vdCBzZWxlY3RlZC5cbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgID8gdGhpcy5maWx0ZXJPcHRpb25zKGtleSlcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5rZXlzKHRoaXMuYWxsT3B0aW9ucykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgIChrZXkpID0+ICF0aGlzLnNlbGVjdGVkS2V5cy5maW5kKChzZWxlY3RlZE9wdGlvbikgPT4ga2V5ID09PSBzZWxlY3RlZE9wdGlvbiksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BXTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleS5cbiAgICAgKiBUaGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbXVzdCBtYXRjaCBhIGtleSBmcm9tIHRoZSByZWNvcmQgb2YgYWxsIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtNYXRDaGlwSW5wdXRFdmVudH0gZXZlbnQgTWF0Q2hpcElucHV0RXZlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkT3B0aW9uKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50LnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5IGZyb20gdGhlIGFycmF5IG9mIHNlbGVjdGVkIG9wdGlvbnMgYW5kIGVtaXRzIHRoZSBuZXcgc2VsZWN0ZWQga2V5cy5cbiAgICAgKiBAcGFyYW0ge011bHRpU2VsZWN0S2V5VmFsUGFpcn0ga2V5IGtleSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlT3B0aW9uKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEtleXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBvcHRpb24gdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleXMgd2hlbiBhIHVzZXIgc2VsZWN0cyBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHtNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50fSBldmVudCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbiA9IChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50Lm9wdGlvbi52YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIG9wdGlvbnMgYnkgdGhlIHN1cHBsaWVkIGtleSBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQga2V5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkga2V5IHRvIGZpbHRlciBieS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IHRoZSBmaWx0ZXJlZCBrZXlzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zID0gKG5ld0tleTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hbGxPcHRpb25zKS5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IHRoaXMuYWxsT3B0aW9uc1trZXldICE9PSBuZXdLZXkgJiYgIXRoaXMuc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKGtleSksXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgdG8gdGhlIHNlbGVjdGVkIGtleXMgYXJyYXkgaWYgdGhlIG9wdGlvbiBpcyB0cnV0aHkgYW5kIG5vdCBhbHJlYWR5IGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGUgaW5wdXQgaXMgYWxzbyBjbGVhcmVkIChpZiBhdmFpbGFibGUpLCBhbmQgdGhlIG5ldyBzZWxlY3RlZCBrZXlzIGFyZSBlbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7a2V5fSBvcHRpb24ga2V5IHRvIGFkZFxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkT3B0aW9uVG9TZWxlY3RlZE9wdGlvbnMgPSAoa2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGtleSAmJiAhdGhpcy5zZWxlY3RlZEtleXMuaW5jbHVkZXMoa2V5KSAmJiB0aGlzLmFsbE9wdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkS2V5cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFJlZikgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cImhibGwtbXVsdGktc2VsZWN0XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsICsgJyBzZWxlY3Rpb24nXCI+XG4gICAgICAgICAgICBAZm9yIChrZXkgb2Ygc2VsZWN0ZWRLZXlzOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93IChyZW1vdmVkKT1cInJlbW92ZU9wdGlvbihrZXkpXCIgZGF0YS10ZXN0aWQ9XCJtYXRDaGlwUm93XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGFsbE9wdGlvbnNba2V5XSB9fVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRDaGlwUmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGFsbE9wdGlvbnNba2V5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCIncmVtb3ZlJyArIGtleVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uXCI+IGNhbmNlbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImhpZGRlblwiIGZvcj1cImlucHV0XCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbCB8IHRpdGxlY2FzZVwiXG4gICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgIGlkPVwiaW5wdXRcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImlucHV0Q29udHJvbFwiXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBHcmlkXCJcbiAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcbiAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImlucHV0XCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKGtleSBvZiBmaWx0ZXJlZE9wdGlvbnMkIHwgYXN5bmM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJrZXlcIiBkYXRhLXRlc3RpZD1cImF1dG9jb21wbGV0ZU9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBhbGxPcHRpb25zW2tleV0gfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG4iXX0=