@byuhbll/components 5.3.0-rc.2 → 6.0.0-rc.0.5

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 (49) hide show
  1. package/fesm2022/byuhbll-components.mjs +107 -116
  2. package/fesm2022/byuhbll-components.mjs.map +1 -1
  3. package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +1 -4
  4. package/lib/ss-search-bar/models/advanced-search.model.d.ts +3 -3
  5. package/lib/ss-search-bar/models/search-scope.model.d.ts +1 -1
  6. package/lib/ss-search-bar/simple-search/simple-search.component.d.ts +1 -1
  7. package/lib/status-button/status-button.component.d.ts +1 -1
  8. package/package.json +4 -6
  9. package/esm2022/byuhbll-components.mjs +0 -5
  10. package/esm2022/lib/animations/animations.mjs +0 -22
  11. package/esm2022/lib/button/button.component.mjs +0 -81
  12. package/esm2022/lib/button-group/button-group.component.mjs +0 -155
  13. package/esm2022/lib/checkbox/checkbox.component.mjs +0 -15
  14. package/esm2022/lib/contact-utils.mjs +0 -41
  15. package/esm2022/lib/copy-tooltip/copy-tooltip.component.mjs +0 -49
  16. package/esm2022/lib/expand-collapse/expand-collapse.component.mjs +0 -31
  17. package/esm2022/lib/hbll-footer/hbll-footer.component.mjs +0 -111
  18. package/esm2022/lib/hbll-header/hbll-header.component.mjs +0 -142
  19. package/esm2022/lib/hbll-header/models/library-hours.mjs +0 -2
  20. package/esm2022/lib/hbll-header/nav-bar/nav-bar.component.mjs +0 -352
  21. package/esm2022/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.mjs +0 -57
  22. package/esm2022/lib/hbll-header/pipes/library-hours.pipe.mjs +0 -31
  23. package/esm2022/lib/hbll-header/pipes/truncate.pipe.mjs +0 -17
  24. package/esm2022/lib/header-with-impersonation/header-with-impersonation.component.mjs +0 -128
  25. package/esm2022/lib/impersonate-modal/impersonate-modal.component.mjs +0 -190
  26. package/esm2022/lib/impersonation-banner/impersonation-banner.component.mjs +0 -151
  27. package/esm2022/lib/impersonation-banner/models/application-access.mjs +0 -7
  28. package/esm2022/lib/impersonation-banner/models/person-summary.mjs +0 -15
  29. package/esm2022/lib/models/token-payload.mjs +0 -2
  30. package/esm2022/lib/multi-select/multi-select.component.mjs +0 -115
  31. package/esm2022/lib/pipes/hbll-item-type-icon.pipe.mjs +0 -128
  32. package/esm2022/lib/snackbar/snackbar.component.mjs +0 -151
  33. package/esm2022/lib/snackbar/snackbar.service.mjs +0 -90
  34. package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +0 -273
  35. package/esm2022/lib/ss-search-bar/constants.mjs +0 -153
  36. package/esm2022/lib/ss-search-bar/date-range/date-range.component.mjs +0 -71
  37. package/esm2022/lib/ss-search-bar/models/advanced-search.model.mjs +0 -5
  38. package/esm2022/lib/ss-search-bar/models/search-config.model.mjs +0 -2
  39. package/esm2022/lib/ss-search-bar/models/search-scope.model.mjs +0 -3
  40. package/esm2022/lib/ss-search-bar/pipes/advanced-field-warning.pipe.mjs +0 -34
  41. package/esm2022/lib/ss-search-bar/pipes/advanced-queries.pipe.mjs +0 -33
  42. package/esm2022/lib/ss-search-bar/pipes/field-by-scope.pipe.mjs +0 -27
  43. package/esm2022/lib/ss-search-bar/simple-search/simple-search.component.mjs +0 -87
  44. package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +0 -98
  45. package/esm2022/lib/ss-search-bar/utils.mjs +0 -16
  46. package/esm2022/lib/status-button/status-button.component.mjs +0 -104
  47. package/esm2022/lib/subatomic-components/button-group-item/button-group-item.component.mjs +0 -39
  48. package/esm2022/lib/utils.mjs +0 -7
  49. package/esm2022/public-api.mjs +0 -22
@@ -105,10 +105,7 @@ export declare class AdvancedSearchComponent implements OnDestroy {
105
105
  readonly 'law -- iclrs': "Law & Religion Studies";
106
106
  readonly 'law -- main': "Main Collection";
107
107
  readonly 'law -- media': "Media";
108
- readonly 'law -- reserve': "Reserve"; /**
109
- * Takes a `FormGroup` and syncs up the `field` and `qualifier` values.
110
- * After syncing, when the `field` value changes, the `qualifier` value will update appropriately.
111
- */
108
+ readonly 'law -- reserve': "Reserve";
112
109
  readonly 'law -- self_help': "Self Help";
113
110
  readonly 'law -- study_guides': "Study Guides";
114
111
  };
@@ -1,11 +1,11 @@
1
1
  import { ADVANCED_SEARCH_OPTIONS } from '../constants';
2
2
  export type AdvancedSearchBooleanOption = (typeof ADVANCED_SEARCH_OPTIONS.boolean)[number];
3
3
  export type AdvancedSearchFieldOption = (typeof ADVANCED_SEARCH_OPTIONS.fields)[number];
4
- export declare const isAdvancedSearchFieldOption: (field: string) => field is "callNumber" | "contributor" | "genre" | "series";
4
+ export declare const isAdvancedSearchFieldOption: (field: string) => field is AdvancedSearchLocalFieldOption;
5
5
  export type AdvancedSearchLocalFieldOption = (typeof ADVANCED_SEARCH_OPTIONS.localFields)[number];
6
- export declare const isAdvancedSearchLocalFieldOption: (field: string) => field is "callNumber" | "contributor" | "genre" | "series";
6
+ export declare const isAdvancedSearchLocalFieldOption: (field: string) => field is AdvancedSearchLocalFieldOption;
7
7
  export type AdvancedSearchExternalFieldOption = (typeof ADVANCED_SEARCH_OPTIONS.externalFields)[number];
8
- export declare const isAdvancedSearchExternalFieldOption: (field: string) => field is "source" | "abstract";
8
+ export declare const isAdvancedSearchExternalFieldOption: (field: string) => field is AdvancedSearchExternalFieldOption;
9
9
  export type AdvancedSearchQualifierOption = (typeof ADVANCED_SEARCH_OPTIONS.qualifiers)[keyof typeof ADVANCED_SEARCH_OPTIONS.qualifiers][number];
10
10
  export type AdvancedSearchResultsPerPageOption = (typeof ADVANCED_SEARCH_OPTIONS.resultsPerPage)[number];
11
11
  export type AdvancedSearchLanguageOption = (keyof typeof ADVANCED_SEARCH_OPTIONS.languages)[number];
@@ -1,4 +1,4 @@
1
1
  declare const searchScopeValues: readonly ["local", "external"];
2
2
  export type SearchScope = (typeof searchScopeValues)[number];
3
- export declare const isSearchScope: (scope: string) => scope is "local" | "external";
3
+ export declare const isSearchScope: (scope: string) => scope is SearchScope;
4
4
  export {};
@@ -16,7 +16,7 @@ export declare class SimpleSearchComponent implements OnInit, OnDestroy {
16
16
  protected searchForm: import("@angular/forms").FormGroup<{
17
17
  simpleQuery: FormControl<string>;
18
18
  }>;
19
- get simpleQuery(): FormControl<any>;
19
+ get simpleQuery(): FormControl;
20
20
  ngOnInit(): void;
21
21
  ngOnDestroy(): void;
22
22
  protected emitSimpleSearch: () => void;
@@ -26,7 +26,7 @@ export declare class StatusButtonComponent {
26
26
  private _clearVariant;
27
27
  label: string;
28
28
  set status(value: 'success' | 'info' | 'warning' | 'error' | 'disabled');
29
- get status(): 'success' | 'info' | 'warning' | 'error' | 'disabled';
29
+ get status(): "success" | "info" | "warning" | "error" | "disabled";
30
30
  set leftIcon(value: string);
31
31
  get leftIcon(): string;
32
32
  set rightIcon(value: string);
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@byuhbll/components",
3
- "version": "5.3.0-rc.2",
3
+ "version": "6.0.0-rc.0.5",
4
4
  "peerDependencies": {
5
- "@angular/common": "^18.0.0",
6
- "@angular/core": "^18.0.0"
5
+ "@angular/common": "^19.2.17",
6
+ "@angular/core": "^19.2.17"
7
7
  },
8
8
  "dependencies": {
9
- "tslib": "^2.3.0"
9
+ "tslib": "^2.6.2"
10
10
  },
11
11
  "sideEffects": false,
12
12
  "exports": {
@@ -33,8 +33,6 @@
33
33
  },
34
34
  ".": {
35
35
  "types": "./index.d.ts",
36
- "esm2022": "./esm2022/byuhbll-components.mjs",
37
- "esm": "./esm2022/byuhbll-components.mjs",
38
36
  "default": "./fesm2022/byuhbll-components.mjs"
39
37
  }
40
38
  },
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnl1aGJsbC1jb21wb25lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvYnl1aGJsbC1jb21wb25lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -1,22 +0,0 @@
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==
@@ -1,81 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- /**
6
- * A flexible, reusable button component that supports multiple button types
7
- * and various content combinations (icon before, title, icon after).
8
- *
9
- * @example
10
- * ```html
11
- * <!-- Primary button with icon and title -->
12
- * <lib-button
13
- * buttonType="primary"
14
- * title="Copy Citation"
15
- * iconBefore="content_copy"
16
- * (buttonClick)="copyCitation()">
17
- * </lib-button>
18
- *
19
- * <!-- Secondary button with title only -->
20
- * <lib-button
21
- * buttonType="secondary"
22
- * title="Cancel"
23
- * (buttonClick)="cancelAction()">
24
- * </lib-button>
25
- *
26
- * <!-- Transparent button with icon after title -->
27
- * <lib-button
28
- * buttonType="transparent"
29
- * title="Download"
30
- * iconAfter="download"
31
- * (buttonClick)="downloadFile()">
32
- * </lib-button>
33
- *
34
- * <!-- Thin button -->
35
- * <lib-button
36
- * buttonType="primary"
37
- * title="Submit"
38
- * [isThin]="true"
39
- * (buttonClick)="submitForm()">
40
- * </lib-button>
41
- * ```
42
- */
43
- export class ButtonComponent {
44
- constructor() {
45
- this.buttonType = 'primary';
46
- this.disabled = false;
47
- this.isThin = false;
48
- this.buttonClick = new EventEmitter();
49
- }
50
- /**
51
- * Handles button click events and emits the buttonClick event if the button is not disabled.
52
- */
53
- onButtonClick() {
54
- if (!this.disabled) {
55
- this.buttonClick.emit();
56
- }
57
- }
58
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: ButtonComponent, isStandalone: true, selector: "lib-button", inputs: { buttonType: "buttonType", title: "title", iconBefore: "iconBefore", iconAfter: "iconAfter", disabled: "disabled", isThin: "isThin", ariaLabel: "ariaLabel" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n [class]=\"'btn btn-' + buttonType + (isThin ? ' btn-thin' : '') + (title ? '' : ' btn-icon-only')\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\n (click)=\"onButtonClick()\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n>\n @if (iconBefore) {\n <span class=\"icon material-symbols-outlined\" [ngClass]=\"{ 'icon-before': title }\">{{ iconBefore }}</span>\n }\n\n @if (title) {\n <span class=\"button-title\">{{ title }}</span>\n }\n\n @if (iconAfter) {\n <span class=\"icon icon-after material-symbols-outlined\">{{ iconAfter }}</span>\n }\n</button>\n", styles: [".btn{padding:.75rem 1.5rem;border-radius:.25rem;font-size:1rem;font-weight:600;cursor:pointer;transition:all .2s ease;border:none;display:inline-flex;align-items:center;outline:none;line-height:1.5rem}.btn.btn-thin{padding:.25rem 2.25rem;border-radius:.5rem;font-weight:400}.btn.btn-thin .icon img{height:1.25rem}.btn:disabled{cursor:not-allowed;color:#767676}.btn:disabled:not(.btn-transparent){background-color:#e7e7e7;border:.0625rem solid #767676}.btn:focus-visible{outline:.125rem solid #b967c7;outline-offset:.125rem}.btn .icon{display:flex;align-items:center;justify-content:center}.btn .icon img{height:1.5rem;width:auto}.btn .icon.icon-before{margin-right:.25rem}.btn .icon.icon-after{margin-left:.25rem}.btn .button-title{flex-shrink:0}.btn-icon-only{padding:.75rem}.btn-primary{background-color:#0047ba;color:#fff;border:.0625rem solid #0047ba}.btn-primary:hover:not(:disabled){background-color:#003995}.btn-secondary{background-color:#fff;color:#00245d;border:.0625rem solid #0047ba}.btn-secondary:hover:not(:disabled){background-color:#e5edf8}.btn-transparent{background-color:transparent;color:#00245d}.btn-transparent:hover:not(:disabled){background-color:#e5edf8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
60
- }
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ButtonComponent, decorators: [{
62
- type: Component,
63
- args: [{ selector: 'lib-button', standalone: true, imports: [CommonModule], template: "<button\n type=\"button\"\n [class]=\"'btn btn-' + buttonType + (isThin ? ' btn-thin' : '') + (title ? '' : ' btn-icon-only')\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\n (click)=\"onButtonClick()\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n>\n @if (iconBefore) {\n <span class=\"icon material-symbols-outlined\" [ngClass]=\"{ 'icon-before': title }\">{{ iconBefore }}</span>\n }\n\n @if (title) {\n <span class=\"button-title\">{{ title }}</span>\n }\n\n @if (iconAfter) {\n <span class=\"icon icon-after material-symbols-outlined\">{{ iconAfter }}</span>\n }\n</button>\n", styles: [".btn{padding:.75rem 1.5rem;border-radius:.25rem;font-size:1rem;font-weight:600;cursor:pointer;transition:all .2s ease;border:none;display:inline-flex;align-items:center;outline:none;line-height:1.5rem}.btn.btn-thin{padding:.25rem 2.25rem;border-radius:.5rem;font-weight:400}.btn.btn-thin .icon img{height:1.25rem}.btn:disabled{cursor:not-allowed;color:#767676}.btn:disabled:not(.btn-transparent){background-color:#e7e7e7;border:.0625rem solid #767676}.btn:focus-visible{outline:.125rem solid #b967c7;outline-offset:.125rem}.btn .icon{display:flex;align-items:center;justify-content:center}.btn .icon img{height:1.5rem;width:auto}.btn .icon.icon-before{margin-right:.25rem}.btn .icon.icon-after{margin-left:.25rem}.btn .button-title{flex-shrink:0}.btn-icon-only{padding:.75rem}.btn-primary{background-color:#0047ba;color:#fff;border:.0625rem solid #0047ba}.btn-primary:hover:not(:disabled){background-color:#003995}.btn-secondary{background-color:#fff;color:#00245d;border:.0625rem solid #0047ba}.btn-secondary:hover:not(:disabled){background-color:#e5edf8}.btn-transparent{background-color:transparent;color:#00245d}.btn-transparent:hover:not(:disabled){background-color:#e5edf8}\n"] }]
64
- }], propDecorators: { buttonType: [{
65
- type: Input
66
- }], title: [{
67
- type: Input
68
- }], iconBefore: [{
69
- type: Input
70
- }], iconAfter: [{
71
- type: Input
72
- }], disabled: [{
73
- type: Input
74
- }], isThin: [{
75
- type: Input
76
- }], ariaLabel: [{
77
- type: Input
78
- }], buttonClick: [{
79
- type: Output
80
- }] } });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9idXR0b24vYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFjL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFRSCxNQUFNLE9BQU8sZUFBZTtJQVA1QjtRQVFhLGVBQVUsR0FBZSxTQUFTLENBQUM7UUFJbkMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixXQUFNLEdBQVksS0FBSyxDQUFDO1FBRXZCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQVVwRDtJQVJHOztPQUVHO0lBQ0gsYUFBYTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0wsQ0FBQzs4R0FqQlEsZUFBZTtrR0FBZixlQUFlLHVSQzVENUIsNnBCQW9CQSxzdENEb0NjLFlBQVk7OzJGQUliLGVBQWU7a0JBUDNCLFNBQVM7K0JBQ0ksWUFBWSxjQUNWLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQzs4QkFLZCxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCB0eXBlIEJ1dHRvblR5cGUgPSAncHJpbWFyeScgfCAnc2Vjb25kYXJ5JyB8ICd0cmFuc3BhcmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uSW5wdXRzIHtcbiAgICBidXR0b25UeXBlPzogQnV0dG9uVHlwZTtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBpY29uQmVmb3JlPzogc3RyaW5nO1xuICAgIGljb25BZnRlcj86IHN0cmluZztcbiAgICBkaXNhYmxlZD86IGJvb2xlYW47XG4gICAgaXNUaGluPzogYm9vbGVhbjtcbiAgICBhcmlhTGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBmbGV4aWJsZSwgcmV1c2FibGUgYnV0dG9uIGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGJ1dHRvbiB0eXBlc1xuICogYW5kIHZhcmlvdXMgY29udGVudCBjb21iaW5hdGlvbnMgKGljb24gYmVmb3JlLCB0aXRsZSwgaWNvbiBhZnRlcikuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDwhLS0gUHJpbWFyeSBidXR0b24gd2l0aCBpY29uIGFuZCB0aXRsZSAtLT5cbiAqIDxsaWItYnV0dG9uXG4gKiAgIGJ1dHRvblR5cGU9XCJwcmltYXJ5XCJcbiAqICAgdGl0bGU9XCJDb3B5IENpdGF0aW9uXCJcbiAqICAgaWNvbkJlZm9yZT1cImNvbnRlbnRfY29weVwiXG4gKiAgIChidXR0b25DbGljayk9XCJjb3B5Q2l0YXRpb24oKVwiPlxuICogPC9saWItYnV0dG9uPlxuICpcbiAqIDwhLS0gU2Vjb25kYXJ5IGJ1dHRvbiB3aXRoIHRpdGxlIG9ubHkgLS0+XG4gKiA8bGliLWJ1dHRvblxuICogICBidXR0b25UeXBlPVwic2Vjb25kYXJ5XCJcbiAqICAgdGl0bGU9XCJDYW5jZWxcIlxuICogICAoYnV0dG9uQ2xpY2spPVwiY2FuY2VsQWN0aW9uKClcIj5cbiAqIDwvbGliLWJ1dHRvbj5cbiAqXG4gKiA8IS0tIFRyYW5zcGFyZW50IGJ1dHRvbiB3aXRoIGljb24gYWZ0ZXIgdGl0bGUgLS0+XG4gKiA8bGliLWJ1dHRvblxuICogICBidXR0b25UeXBlPVwidHJhbnNwYXJlbnRcIlxuICogICB0aXRsZT1cIkRvd25sb2FkXCJcbiAqICAgaWNvbkFmdGVyPVwiZG93bmxvYWRcIlxuICogICAoYnV0dG9uQ2xpY2spPVwiZG93bmxvYWRGaWxlKClcIj5cbiAqIDwvbGliLWJ1dHRvbj5cbiAqXG4gKiA8IS0tIFRoaW4gYnV0dG9uIC0tPlxuICogPGxpYi1idXR0b25cbiAqICAgYnV0dG9uVHlwZT1cInByaW1hcnlcIlxuICogICB0aXRsZT1cIlN1Ym1pdFwiXG4gKiAgIFtpc1RoaW5dPVwidHJ1ZVwiXG4gKiAgIChidXR0b25DbGljayk9XCJzdWJtaXRGb3JtKClcIj5cbiAqIDwvbGliLWJ1dHRvbj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1idXR0b24nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2J1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYnV0dG9uLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEJ1dHRvbkNvbXBvbmVudCB7XG4gICAgQElucHV0KCkgYnV0dG9uVHlwZTogQnV0dG9uVHlwZSA9ICdwcmltYXJ5JztcbiAgICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgICBASW5wdXQoKSBpY29uQmVmb3JlPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGljb25BZnRlcj86IHN0cmluZztcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGlzVGhpbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGFyaWFMYWJlbD86IHN0cmluZztcbiAgICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGJ1dHRvbiBjbGljayBldmVudHMgYW5kIGVtaXRzIHRoZSBidXR0b25DbGljayBldmVudCBpZiB0aGUgYnV0dG9uIGlzIG5vdCBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBvbkJ1dHRvbkNsaWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uQ2xpY2suZW1pdCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtjbGFzc109XCInYnRuIGJ0bi0nICsgYnV0dG9uVHlwZSArIChpc1RoaW4gPyAnIGJ0bi10aGluJyA6ICcnKSArICh0aXRsZSA/ICcnIDogJyBidG4taWNvbi1vbmx5JylcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgPyBhcmlhTGFiZWwgOiBudWxsXCJcbiAgICAoY2xpY2spPVwib25CdXR0b25DbGljaygpXCJcbiAgICBbYXR0ci50YWJpbmRleF09XCJkaXNhYmxlZCA/IC0xIDogMFwiXG4+XG4gICAgQGlmIChpY29uQmVmb3JlKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW25nQ2xhc3NdPVwieyAnaWNvbi1iZWZvcmUnOiB0aXRsZSB9XCI+e3sgaWNvbkJlZm9yZSB9fTwvc3Bhbj5cbiAgICB9XG5cbiAgICBAaWYgKHRpdGxlKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLXRpdGxlXCI+e3sgdGl0bGUgfX08L3NwYW4+XG4gICAgfVxuXG4gICAgQGlmIChpY29uQWZ0ZXIpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGljb24tYWZ0ZXIgbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPnt7IGljb25BZnRlciB9fTwvc3Bhbj5cbiAgICB9XG48L2J1dHRvbj5cbiJdfQ==
@@ -1,155 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, signal, ContentChildren, ElementRef, inject, } from '@angular/core';
2
- import { ButtonGroupItemComponent } from '../subatomic-components/button-group-item/button-group-item.component';
3
- import * as i0 from "@angular/core";
4
- export class ButtonGroupComponent {
5
- constructor() {
6
- this.activeButtonChange = new EventEmitter();
7
- this.elementRef = inject(ElementRef);
8
- this.activeButtonId = signal('');
9
- this.subscriptions = [];
10
- }
11
- /**
12
- * Angular lifecycle hook called after content projection is initialized.
13
- * Sets up the initial active button and subscribes to button click events from all button items.
14
- */
15
- ngAfterContentInit() {
16
- // Handle both Angular components (via ContentChildren) and custom elements (via DOM)
17
- if (this.buttonItems.length > 0) {
18
- // Angular component usage
19
- this.initializeActiveButton();
20
- this.buttonItems.forEach((item) => {
21
- const sub = item.buttonClick.subscribe((id) => this.onButtonClick(id));
22
- this.subscriptions.push(sub);
23
- });
24
- }
25
- else {
26
- // Custom element usage - delay slightly to ensure custom elements are fully initialized
27
- setTimeout(() => {
28
- this.initializeCustomElements();
29
- }, 0);
30
- }
31
- }
32
- /**
33
- * Initializes custom element children when used as web components.
34
- */
35
- initializeCustomElements() {
36
- const hostElement = this.elementRef.nativeElement;
37
- const customElementChildren = Array.from(hostElement.querySelectorAll('hbll-button-group-item, lib-button-group-item'));
38
- if (customElementChildren.length > 0) {
39
- // Set position attributes - first and last explicitly, rest are middle
40
- customElementChildren[0].setAttribute('position', 'first');
41
- if (customElementChildren.length > 1) {
42
- customElementChildren[customElementChildren.length - 1].setAttribute('position', 'last');
43
- }
44
- for (let i = 1; i < customElementChildren.length - 1; i++) {
45
- customElementChildren[i].setAttribute('position', 'middle');
46
- }
47
- const initialId = this.initialActiveId;
48
- if (initialId) {
49
- this.activeButtonId.set(initialId);
50
- customElementChildren.forEach((item) => {
51
- const itemId = item.getAttribute('id');
52
- if (itemId === initialId) {
53
- this.setActiveState(item, true);
54
- }
55
- else {
56
- this.setActiveState(item, false);
57
- }
58
- });
59
- }
60
- // Listen to clicks on custom elements
61
- customElementChildren.forEach((item) => {
62
- item.addEventListener('click', () => {
63
- const itemId = item.getAttribute('id');
64
- if (itemId && !item.hasAttribute('disabled')) {
65
- this.handleCustomElementClick(itemId, customElementChildren);
66
- }
67
- });
68
- });
69
- }
70
- }
71
- /**
72
- * Sets the active state on a custom element by toggling the active class on its button.
73
- */
74
- setActiveState(element, isActive) {
75
- const button = element.querySelector('.tab-btn');
76
- if (button) {
77
- if (isActive) {
78
- button.classList.add('active');
79
- }
80
- else {
81
- button.classList.remove('active');
82
- }
83
- }
84
- }
85
- /**
86
- * Handles click events for custom element children.
87
- */
88
- handleCustomElementClick(buttonId, children) {
89
- this.activeButtonId.set(buttonId);
90
- this.activeButtonChange.emit(buttonId);
91
- children.forEach((item) => {
92
- const itemId = item.getAttribute('id');
93
- const isActive = itemId === buttonId;
94
- this.setActiveState(item, isActive);
95
- });
96
- }
97
- /**
98
- * Angular lifecycle hook called when the component is destroyed.
99
- * Cleans up all subscriptions to prevent memory leaks.
100
- */
101
- ngOnDestroy() {
102
- this.subscriptions.forEach((sub) => sub.unsubscribe());
103
- }
104
- /**
105
- * Initializes the active button state based on the initialActiveId input.
106
- * Sets the active state on the matching button item if an initial ID is provided.
107
- */
108
- initializeActiveButton() {
109
- const items = this.buttonItems.toArray();
110
- const initialId = this.initialActiveId;
111
- // Set position - first and last explicitly, rest are middle
112
- if (items.length > 0) {
113
- items[0].position = 'first';
114
- if (items.length > 1) {
115
- items[items.length - 1].position = 'last';
116
- }
117
- for (let i = 1; i < items.length - 1; i++) {
118
- items[i].position = 'middle';
119
- }
120
- }
121
- // Set active state
122
- if (initialId) {
123
- items.forEach((item) => {
124
- item.isActive = item.id === initialId;
125
- });
126
- this.activeButtonId.set(initialId);
127
- }
128
- }
129
- /**
130
- * Handles button click events from child button items.
131
- * Updates the active button state and emits the activeButtonChange event.
132
- * @param buttonId - The ID of the clicked button
133
- */
134
- onButtonClick(buttonId) {
135
- this.activeButtonId.set(buttonId);
136
- this.activeButtonChange.emit(buttonId);
137
- this.buttonItems.forEach((item) => {
138
- item.isActive = item.id === buttonId;
139
- });
140
- }
141
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ButtonGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
142
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: ButtonGroupComponent, isStandalone: true, selector: "lib-button-group", inputs: { initialActiveId: "initialActiveId" }, outputs: { activeButtonChange: "activeButtonChange" }, queries: [{ propertyName: "buttonItems", predicate: ButtonGroupItemComponent }], ngImport: i0, template: "<div class=\"button-group\" role=\"tablist\">\n <ng-content></ng-content>\n</div>\n", styles: [".button-group{display:flex;overflow-x:auto;overflow-y:visible;-webkit-overflow-scrolling:touch;padding:.25rem}\n"] }); }
143
- }
144
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ButtonGroupComponent, decorators: [{
145
- type: Component,
146
- args: [{ selector: 'lib-button-group', standalone: true, imports: [ButtonGroupItemComponent], template: "<div class=\"button-group\" role=\"tablist\">\n <ng-content></ng-content>\n</div>\n", styles: [".button-group{display:flex;overflow-x:auto;overflow-y:visible;-webkit-overflow-scrolling:touch;padding:.25rem}\n"] }]
147
- }], propDecorators: { initialActiveId: [{
148
- type: Input
149
- }], activeButtonChange: [{
150
- type: Output
151
- }], buttonItems: [{
152
- type: ContentChildren,
153
- args: [ButtonGroupItemComponent]
154
- }] } });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9idXR0b24tZ3JvdXAvYnV0dG9uLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9idXR0b24tZ3JvdXAvYnV0dG9uLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLGVBQWUsRUFJZixVQUFVLEVBQ1YsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVFQUF1RSxDQUFDOztBQVNqSCxNQUFNLE9BQU8sb0JBQW9CO0lBUGpDO1FBU2MsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUdsRCxlQUFVLEdBQWUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLG1CQUFjLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztLQW9KOUM7SUFsSkc7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2QscUZBQXFGO1FBQ3JGLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRTlCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFD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QUFDLHdCQUF3QixDQUFDOzhCQUsxQixlQUFlO3NCQUF2QixLQUFLO2dCQUNJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFb0MsV0FBVztzQkFBckQsZUFBZTt1QkFBQyx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIHNpZ25hbCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0LFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgT25EZXN0cm95LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQnV0dG9uR3JvdXBJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vc3ViYXRvbWljLWNvbXBvbmVudHMvYnV0dG9uLWdyb3VwLWl0ZW0vYnV0dG9uLWdyb3VwLWl0ZW0uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItYnV0dG9uLWdyb3VwJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtCdXR0b25Hcm91cEl0ZW1Db21wb25lbnRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9idXR0b24tZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9idXR0b24tZ3JvdXAuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgaW5pdGlhbEFjdGl2ZUlkPzogc3RyaW5nO1xuICAgIEBPdXRwdXQoKSBhY3RpdmVCdXR0b25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgICAvLyBDb250ZW50IHByb2plY3Rpb246IGJ1dHRvbi1ncm91cC1pdGVtIGNvbXBvbmVudHMgZGVmaW5lZCBpbiBIVE1MXG4gICAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25Hcm91cEl0ZW1Db21wb25lbnQpIGJ1dHRvbkl0ZW1zITogUXVlcnlMaXN0PEJ1dHRvbkdyb3VwSXRlbUNvbXBvbmVudD47XG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByb3RlY3RlZCBhY3RpdmVCdXR0b25JZCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBBbmd1bGFyIGxpZmVjeWNsZSBob29rIGNhbGxlZCBhZnRlciBjb250ZW50IHByb2plY3Rpb24gaXMgaW5pdGlhbGl6ZWQuXG4gICAgICogU2V0cyB1cCB0aGUgaW5pdGlhbCBhY3RpdmUgYnV0dG9uIGFuZCBzdWJzY3JpYmVzIHRvIGJ1dHRvbiBjbGljayBldmVudHMgZnJvbSBhbGwgYnV0dG9uIGl0ZW1zLlxuICAgICAqL1xuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gSGFuZGxlIGJvdGggQW5ndWxhciBjb21wb25lbnRzICh2aWEgQ29udGVudENoaWxkcmVuKSBhbmQgY3VzdG9tIGVsZW1lbnRzICh2aWEgRE9NKVxuICAgICAgICBpZiAodGhpcy5idXR0b25JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBBbmd1bGFyIGNvbXBvbmVudCB1c2FnZVxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplQWN0aXZlQnV0dG9uKCk7XG5cbiAgICAgICAgICAgIHRoaXMuYnV0dG9uSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IGl0ZW0uYnV0dG9uQ2xpY2suc3Vic2NyaWJlKChpZDogc3RyaW5nKSA9PiB0aGlzLm9uQnV0dG9uQ2xpY2soaWQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDdXN0b20gZWxlbWVudCB1c2FnZSAtIGRlbGF5IHNsaWdodGx5IHRvIGVuc3VyZSBjdXN0b20gZWxlbWVudHMgYXJlIGZ1bGx5IGluaXRpYWxpemVkXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVDdXN0b21FbGVtZW50cygpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBjdXN0b20gZWxlbWVudCBjaGlsZHJlbiB3aGVuIHVzZWQgYXMgd2ViIGNvbXBvbmVudHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplQ3VzdG9tRWxlbWVudHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnRDaGlsZHJlbiA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICBob3N0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoYmxsLWJ1dHRvbi1ncm91cC1pdGVtLCBsaWItYnV0dG9uLWdyb3VwLWl0ZW0nKSxcbiAgICAgICAgKSBhcyBFbGVtZW50W107XG5cbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBTZXQgcG9zaXRpb24gYXR0cmlidXRlcyAtIGZpcnN0IGFuZCBsYXN0IGV4cGxpY2l0bHksIHJlc3QgYXJlIG1pZGRsZVxuICAgICAgICAgICAgY3VzdG9tRWxlbWVudENoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCAnZmlyc3QnKTtcbiAgICAgICAgICAgIGlmIChjdXN0b21FbGVtZW50Q2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRDaGlsZHJlbltjdXN0b21FbGVtZW50Q2hpbGRyZW4ubGVuZ3RoIC0gMV0uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICAncG9zaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnbGFzdCcsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY3VzdG9tRWxlbWVudENoaWxkcmVuLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRDaGlsZHJlbltpXS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgJ21pZGRsZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSWQgPSB0aGlzLmluaXRpYWxBY3RpdmVJZDtcbiAgICAgICAgICAgIGlmIChpbml0aWFsSWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUJ1dHRvbklkLnNldChpbml0aWFsSWQpO1xuICAgICAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRDaGlsZHJlbi5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUlkID09PSBpbml0aWFsSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU3RhdGUoaXRlbSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVN0YXRlKGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMaXN0ZW4gdG8gY2xpY2tzIG9uIGN1c3RvbSBlbGVtZW50c1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudENoaWxkcmVuLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCAmJiAhaXRlbS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ3VzdG9tRWxlbWVudENsaWNrKGl0ZW1JZCwgY3VzdG9tRWxlbWVudENoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhY3RpdmUgc3RhdGUgb24gYSBjdXN0b20gZWxlbWVudCBieSB0b2dnbGluZyB0aGUgYWN0aXZlIGNsYXNzIG9uIGl0cyBidXR0b24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRBY3RpdmVTdGF0ZShlbGVtZW50OiBFbGVtZW50LCBpc0FjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBidXR0b24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWItYnRuJyk7XG4gICAgICAgIGlmIChidXR0b24pIHtcbiAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjbGljayBldmVudHMgZm9yIGN1c3RvbSBlbGVtZW50IGNoaWxkcmVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFuZGxlQ3VzdG9tRWxlbWVudENsaWNrKGJ1dHRvbklkOiBzdHJpbmcsIGNoaWxkcmVuOiBFbGVtZW50W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVCdXR0b25JZC5zZXQoYnV0dG9uSWQpO1xuICAgICAgICB0aGlzLmFjdGl2ZUJ1dHRvbkNoYW5nZS5lbWl0KGJ1dHRvbklkKTtcblxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gaXRlbUlkID09PSBidXR0b25JZDtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU3RhdGUoaXRlbSwgaXNBY3RpdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbmd1bGFyIGxpZmVjeWNsZSBob29rIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgICAqIENsZWFucyB1cCBhbGwgc3Vic2NyaXB0aW9ucyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBhY3RpdmUgYnV0dG9uIHN0YXRlIGJhc2VkIG9uIHRoZSBpbml0aWFsQWN0aXZlSWQgaW5wdXQuXG4gICAgICogU2V0cyB0aGUgYWN0aXZlIHN0YXRlIG9uIHRoZSBtYXRjaGluZyBidXR0b24gaXRlbSBpZiBhbiBpbml0aWFsIElEIGlzIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUFjdGl2ZUJ1dHRvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmJ1dHRvbkl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbElkID0gdGhpcy5pbml0aWFsQWN0aXZlSWQ7XG5cbiAgICAgICAgLy8gU2V0IHBvc2l0aW9uIC0gZmlyc3QgYW5kIGxhc3QgZXhwbGljaXRseSwgcmVzdCBhcmUgbWlkZGxlXG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpdGVtc1swXS5wb3NpdGlvbiA9ICdmaXJzdCc7XG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLnBvc2l0aW9uID0gJ2xhc3QnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpdGVtc1tpXS5wb3NpdGlvbiA9ICdtaWRkbGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGFjdGl2ZSBzdGF0ZVxuICAgICAgICBpZiAoaW5pdGlhbElkKSB7XG4gICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5pc0FjdGl2ZSA9IGl0ZW0uaWQgPT09IGluaXRpYWxJZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVCdXR0b25JZC5zZXQoaW5pdGlhbElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgYnV0dG9uIGNsaWNrIGV2ZW50cyBmcm9tIGNoaWxkIGJ1dHRvbiBpdGVtcy5cbiAgICAgKiBVcGRhdGVzIHRoZSBhY3RpdmUgYnV0dG9uIHN0YXRlIGFuZCBlbWl0cyB0aGUgYWN0aXZlQnV0dG9uQ2hhbmdlIGV2ZW50LlxuICAgICAqIEBwYXJhbSBidXR0b25JZCAtIFRoZSBJRCBvZiB0aGUgY2xpY2tlZCBidXR0b25cbiAgICAgKi9cbiAgICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVCdXR0b25JZC5zZXQoYnV0dG9uSWQpO1xuICAgICAgICB0aGlzLmFjdGl2ZUJ1dHRvbkNoYW5nZS5lbWl0KGJ1dHRvbklkKTtcblxuICAgICAgICB0aGlzLmJ1dHRvbkl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaXNBY3RpdmUgPSBpdGVtLmlkID09PSBidXR0b25JZDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImJ1dHRvbi1ncm91cFwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
@@ -1,15 +0,0 @@
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 = input(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-checkbox", inputs: { isChecked: { classPropertyName: "isChecked", publicName: "isChecked", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<span class=\"components-checkbox-container\" [class.components-checked]=\"isChecked()\">\n @if (isChecked()) {\n <span class=\"material-symbols-outlined components-icon\"> check </span>\n }\n</span>\n", styles: [".components-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}.components-checkbox-container.components-checked{border-color:#3a6093;background-color:#3a6093}.components-checkbox-container.components-checked .components-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-checkbox', standalone: true, imports: [CommonModule], template: "<span class=\"components-checkbox-container\" [class.components-checked]=\"isChecked()\">\n @if (isChecked()) {\n <span class=\"material-symbols-outlined components-icon\"> check </span>\n }\n</span>\n", styles: [".components-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}.components-checkbox-container.components-checked{border-color:#3a6093;background-color:#3a6093}.components-checkbox-container.components-checked .components-icon{position:absolute;font-size:1.1em}\n"] }]
14
- }] });
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBU2pELE1BQU0sT0FBTyxxQkFBcUI7SUFQbEM7UUFRSSxjQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzVCOzhHQUZZLHFCQUFxQjtrR0FBckIscUJBQXFCLHdOQ1ZsQyx3TkFLQSxtZURHYyxZQUFZOzsyRkFFYixxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0ksY0FBYyxjQUdaLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWNoZWNrYm94JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hlY2tib3guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NoZWNrYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbENoZWNrYm94Q29tcG9uZW50IHtcbiAgICBpc0NoZWNrZWQgPSBpbnB1dChmYWxzZSk7XG59XG4iLCI8c3BhbiBjbGFzcz1cImNvbXBvbmVudHMtY2hlY2tib3gtY29udGFpbmVyXCIgW2NsYXNzLmNvbXBvbmVudHMtY2hlY2tlZF09XCJpc0NoZWNrZWQoKVwiPlxuICAgIEBpZiAoaXNDaGVja2VkKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGNvbXBvbmVudHMtaWNvblwiPiBjaGVjayA8L3NwYW4+XG4gICAgfVxuPC9zcGFuPlxuIl19
@@ -1,41 +0,0 @@
1
- import { Validators } from '@angular/forms';
2
- const EMAIL_PATH = 'email';
3
- const FEEDBACK_PATH = 'feedback';
4
- export const USER_STATUSES = [
5
- '',
6
- 'Undergraduate',
7
- 'Graduate',
8
- 'Faculty',
9
- 'Staff',
10
- 'Library Employee',
11
- 'Other',
12
- ];
13
- export const createContactForm = (fb) => fb.nonNullable.group({
14
- name: [''],
15
- email: [''],
16
- message: ['', Validators.required],
17
- status: [''],
18
- });
19
- export const submitEmail = (payload, byuid, http, apiBaseUrl) => submitContactForm({ ...payload, byuId: byuid }, http, EMAIL_PATH, apiBaseUrl);
20
- export const submitFeedback = (payload, http, apiBaseUrl) => submitContactForm({ ...payload, origin: location.href }, http, FEEDBACK_PATH, apiBaseUrl);
21
- const submitContactForm = (payload, http, path, apiBaseUrl) => http.post(`${apiBaseUrl}/${path}`, payload);
22
- export const getUserStatusFromRoles = (roles) => {
23
- let userStatus = '';
24
- if (roles.includes('undergraduateStudent')) {
25
- userStatus = 'Undergraduate';
26
- }
27
- if (roles.includes('graduateStudent')) {
28
- userStatus = 'Graduate';
29
- }
30
- if (roles.includes('staffEmployee')) {
31
- userStatus = 'Staff';
32
- }
33
- if (roles.includes('facultyEmployee')) {
34
- userStatus = 'Faculty';
35
- }
36
- if (roles.includes('libraryEmployee')) {
37
- userStatus = 'Library Employee';
38
- }
39
- return userStatus;
40
- };
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250YWN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUN6QixFQUFFO0lBQ0YsZUFBZTtJQUNmLFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLGtCQUFrQjtJQUNsQixPQUFPO0NBQ0QsQ0FBQztBQVdYLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsRUFBZSxFQUFFLEVBQUUsQ0FDakQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDakIsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ1YsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ1gsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDbEMsTUFBTSxFQUFFLENBQUMsRUFBOEIsQ0FBQztDQUMzQyxDQUFDLENBQUM7QUFFUCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDdkIsT0FBdUIsRUFDdkIsS0FBYSxFQUNiLElBQWdCLEVBQ2hCLFVBQWtCLEVBQ3BCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBRW5GLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQXVCLEVBQUUsSUFBZ0IsRUFBRSxVQUFrQixFQUFFLEVBQUUsQ0FDNUYsaUJBQWlCLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFOUYsTUFBTSxpQkFBaUIsR0FBRyxDQUN0QixPQUFrRSxFQUNsRSxJQUFnQixFQUNoQixJQUE4QyxFQUM5QyxVQUFrQixFQUNwQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUUxRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWUsRUFBYyxFQUFFO0lBQ2xFLElBQUksVUFBVSxHQUFlLEVBQUUsQ0FBQztJQUNoQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQ3pDLFVBQVUsR0FBRyxlQUFlLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDcEMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDbEMsVUFBVSxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNwQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3BDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5jb25zdCBFTUFJTF9QQVRIID0gJ2VtYWlsJztcbmNvbnN0IEZFRURCQUNLX1BBVEggPSAnZmVlZGJhY2snO1xuXG5leHBvcnQgY29uc3QgVVNFUl9TVEFUVVNFUyA9IFtcbiAgICAnJyxcbiAgICAnVW5kZXJncmFkdWF0ZScsXG4gICAgJ0dyYWR1YXRlJyxcbiAgICAnRmFjdWx0eScsXG4gICAgJ1N0YWZmJyxcbiAgICAnTGlicmFyeSBFbXBsb3llZScsXG4gICAgJ090aGVyJyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFVzZXJTdGF0dXMgPSAodHlwZW9mIFVTRVJfU1RBVFVTRVMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFjdFBheWxvYWQge1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHN0YXR1cz86IFVzZXJTdGF0dXM7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDb250YWN0Rm9ybSA9IChmYjogRm9ybUJ1aWxkZXIpID0+XG4gICAgZmIubm9uTnVsbGFibGUuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbJyddLFxuICAgICAgICBlbWFpbDogWycnXSxcbiAgICAgICAgbWVzc2FnZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc3RhdHVzOiBbJycgYXMgQ29udGFjdFBheWxvYWRbJ3N0YXR1cyddXSxcbiAgICB9KTtcblxuZXhwb3J0IGNvbnN0IHN1Ym1pdEVtYWlsID0gKFxuICAgIHBheWxvYWQ6IENvbnRhY3RQYXlsb2FkLFxuICAgIGJ5dWlkOiBzdHJpbmcsXG4gICAgaHR0cDogSHR0cENsaWVudCxcbiAgICBhcGlCYXNlVXJsOiBzdHJpbmcsXG4pID0+IHN1Ym1pdENvbnRhY3RGb3JtKHsgLi4ucGF5bG9hZCwgYnl1SWQ6IGJ5dWlkIH0sIGh0dHAsIEVNQUlMX1BBVEgsIGFwaUJhc2VVcmwpO1xuXG5leHBvcnQgY29uc3Qgc3VibWl0RmVlZGJhY2sgPSAocGF5bG9hZDogQ29udGFjdFBheWxvYWQsIGh0dHA6IEh0dHBDbGllbnQsIGFwaUJhc2VVcmw6IHN0cmluZykgPT5cbiAgICBzdWJtaXRDb250YWN0Rm9ybSh7IC4uLnBheWxvYWQsIG9yaWdpbjogbG9jYXRpb24uaHJlZiB9LCBodHRwLCBGRUVEQkFDS19QQVRILCBhcGlCYXNlVXJsKTtcblxuY29uc3Qgc3VibWl0Q29udGFjdEZvcm0gPSAoXG4gICAgcGF5bG9hZDogQ29udGFjdFBheWxvYWQgJiB7IG9yaWdpbj86IHN0cmluZyB9ICYgeyBieXVJZD86IHN0cmluZyB9LFxuICAgIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcGF0aDogdHlwZW9mIEVNQUlMX1BBVEggfCB0eXBlb2YgRkVFREJBQ0tfUEFUSCxcbiAgICBhcGlCYXNlVXJsOiBzdHJpbmcsXG4pID0+IGh0dHAucG9zdDx1bmtub3duPihgJHthcGlCYXNlVXJsfS8ke3BhdGh9YCwgcGF5bG9hZCk7XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyU3RhdHVzRnJvbVJvbGVzID0gKHJvbGVzOiBzdHJpbmdbXSk6IFVzZXJTdGF0dXMgPT4ge1xuICAgIGxldCB1c2VyU3RhdHVzOiBVc2VyU3RhdHVzID0gJyc7XG4gICAgaWYgKHJvbGVzLmluY2x1ZGVzKCd1bmRlcmdyYWR1YXRlU3R1ZGVudCcpKSB7XG4gICAgICAgIHVzZXJTdGF0dXMgPSAnVW5kZXJncmFkdWF0ZSc7XG4gICAgfVxuICAgIGlmIChyb2xlcy5pbmNsdWRlcygnZ3JhZHVhdGVTdHVkZW50JykpIHtcbiAgICAgICAgdXNlclN0YXR1cyA9ICdHcmFkdWF0ZSc7XG4gICAgfVxuICAgIGlmIChyb2xlcy5pbmNsdWRlcygnc3RhZmZFbXBsb3llZScpKSB7XG4gICAgICAgIHVzZXJTdGF0dXMgPSAnU3RhZmYnO1xuICAgIH1cbiAgICBpZiAocm9sZXMuaW5jbHVkZXMoJ2ZhY3VsdHlFbXBsb3llZScpKSB7XG4gICAgICAgIHVzZXJTdGF0dXMgPSAnRmFjdWx0eSc7XG4gICAgfVxuICAgIGlmIChyb2xlcy5pbmNsdWRlcygnbGlicmFyeUVtcGxveWVlJykpIHtcbiAgICAgICAgdXNlclN0YXR1cyA9ICdMaWJyYXJ5IEVtcGxveWVlJztcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJTdGF0dXM7XG59O1xuIl19
@@ -1,49 +0,0 @@
1
- import { Component, Input, ViewChild } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/tooltip";
6
- export class CopyTooltipComponent {
7
- constructor() {
8
- this.position = 'below';
9
- this.clipboardCopyMessage = 'Copy';
10
- this.copyToClipboard = async (text) => {
11
- // Ensure the tooltip doesn't disappear when button is clicked
12
- this.tooltip.show();
13
- if (text) {
14
- try {
15
- await navigator.clipboard.writeText(text).then(() => {
16
- this.clipboardCopyMessage = 'Copied!';
17
- });
18
- }
19
- catch {
20
- this.clipboardCopyMessage = 'Failed to copy';
21
- }
22
- }
23
- else
24
- this.clipboardCopyMessage = 'Nothing to copy!';
25
- };
26
- this.handleMouseLeave = () => {
27
- // Manually hide in case the user hovers over the tooltip
28
- this.tooltip.hide();
29
- // Delay to account for tooltip animation
30
- setTimeout(() => {
31
- this.clipboardCopyMessage = 'Copy';
32
- }, 100);
33
- };
34
- }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CopyTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CopyTooltipComponent, isStandalone: true, selector: "lib-copy-tooltip", inputs: { position: "position", copyText: "copyText" }, viewQueries: [{ propertyName: "tooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<div\n (click)=\"copyToClipboard(copyText)\"\n [matTooltip]=\"clipboardCopyMessage\"\n [matTooltipPosition]=\"position\"\n (mouseleave)=\"handleMouseLeave()\"\n data-testid=\"tooltip\"\n>\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
37
- }
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CopyTooltipComponent, decorators: [{
39
- type: Component,
40
- args: [{ selector: 'lib-copy-tooltip', standalone: true, imports: [CommonModule, MatTooltipModule], template: "<div\n (click)=\"copyToClipboard(copyText)\"\n [matTooltip]=\"clipboardCopyMessage\"\n [matTooltipPosition]=\"position\"\n (mouseleave)=\"handleMouseLeave()\"\n data-testid=\"tooltip\"\n>\n <ng-content></ng-content>\n</div>\n" }]
41
- }], propDecorators: { position: [{
42
- type: Input
43
- }], copyText: [{
44
- type: Input
45
- }], tooltip: [{
46
- type: ViewChild,
47
- args: [MatTooltip]
48
- }] } });
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weS10b29sdGlwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3B5LXRvb2x0aXAvY29weS10b29sdGlwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3B5LXRvb2x0aXAvY29weS10b29sdGlwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBbUIsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBUzFGLE1BQU0sT0FBTyxvQkFBb0I7SUFQakM7UUFRYSxhQUFRLEdBQW9CLE9BQU8sQ0FBQztRQUl0Qyx5QkFBb0IsR0FBRyxNQUFNLENBQUM7UUFFOUIsb0JBQWUsR0FBRyxLQUFLLEVBQUUsSUFBYSxFQUFFLEVBQUU7WUFDN0MsOERBQThEO1lBQzlELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDUCxJQUFJLENBQUM7b0JBQ0QsTUFBTSxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUNoRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO29CQUMxQyxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDTCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ2pELENBQUM7WUFDTCxDQUFDOztnQkFBTSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsa0JBQWtCLENBQUM7UUFDMUQsQ0FBQyxDQUFDO1FBRUsscUJBQWdCLEdBQUcsR0FBRyxFQUFFO1lBQzNCLHlEQUF5RDtZQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLHlDQUF5QztZQUN6QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7WUFDdkMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDO0tBQ0w7OEdBN0JZLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDZLQUdsQixVQUFVLGdEQ2R6QixxUEFTQSx5RERGYyxZQUFZLDhCQUFFLGdCQUFnQjs7MkZBSS9CLG9CQUFvQjtrQkFQaEMsU0FBUzsrQkFDSSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDOzhCQUtoQyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ2lCLE9BQU87c0JBQTdCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdFRvb2x0aXAsIE1hdFRvb2x0aXBNb2R1bGUsIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1jb3B5LXRvb2x0aXAnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0VG9vbHRpcE1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvcHktdG9vbHRpcC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY29weS10b29sdGlwLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENvcHlUb29sdGlwQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBwb3NpdGlvbjogVG9vbHRpcFBvc2l0aW9uID0gJ2JlbG93JztcbiAgICBASW5wdXQoKSBjb3B5VGV4dD86IHN0cmluZztcbiAgICBAVmlld0NoaWxkKE1hdFRvb2x0aXApIHRvb2x0aXAhOiBNYXRUb29sdGlwO1xuXG4gICAgcHVibGljIGNsaXBib2FyZENvcHlNZXNzYWdlID0gJ0NvcHknO1xuXG4gICAgcHVibGljIGNvcHlUb0NsaXBib2FyZCA9IGFzeW5jICh0ZXh0Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgdG9vbHRpcCBkb2Vzbid0IGRpc2FwcGVhciB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgICAgIHRoaXMudG9vbHRpcC5zaG93KCk7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZENvcHlNZXNzYWdlID0gJ0NvcGllZCEnO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRDb3B5TWVzc2FnZSA9ICdGYWlsZWQgdG8gY29weSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB0aGlzLmNsaXBib2FyZENvcHlNZXNzYWdlID0gJ05vdGhpbmcgdG8gY29weSEnO1xuICAgIH07XG5cbiAgICBwdWJsaWMgaGFuZGxlTW91c2VMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgLy8gTWFudWFsbHkgaGlkZSBpbiBjYXNlIHRoZSB1c2VyIGhvdmVycyBvdmVyIHRoZSB0b29sdGlwXG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XG4gICAgICAgIC8vIERlbGF5IHRvIGFjY291bnQgZm9yIHRvb2x0aXAgYW5pbWF0aW9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRDb3B5TWVzc2FnZSA9ICdDb3B5JztcbiAgICAgICAgfSwgMTAwKTtcbiAgICB9O1xufVxuIiwiPGRpdlxuICAgIChjbGljayk9XCJjb3B5VG9DbGlwYm9hcmQoY29weVRleHQpXCJcbiAgICBbbWF0VG9vbHRpcF09XCJjbGlwYm9hcmRDb3B5TWVzc2FnZVwiXG4gICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlTW91c2VMZWF2ZSgpXCJcbiAgICBkYXRhLXRlc3RpZD1cInRvb2x0aXBcIlxuPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19
@@ -1,31 +0,0 @@
1
- import { Component, Input, ViewChild, ChangeDetectionStrategy } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { libHbllExpandCollapse } from '../animations/animations';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- export class ExpandCollapseComponent {
7
- constructor() {
8
- this._isExpanded = false;
9
- this.heightOfContent = 0;
10
- }
11
- set isExpanded(isExpanded) {
12
- this.heightOfContent = this.contentRef?.nativeElement.clientHeight;
13
- this._isExpanded = isExpanded;
14
- }
15
- get isExpanded() {
16
- return this._isExpanded;
17
- }
18
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ExpandCollapseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: ExpandCollapseComponent, isStandalone: true, selector: "lib-expand-collapse", inputs: { isExpanded: "isExpanded" }, viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["contentRef"], descendants: true }], ngImport: i0, template: "<div\n #contentRef\n data-testid=\"contentRef\"\n [@libHbllExpandCollapse]=\"{\n value: isExpanded,\n params: { startHeight: heightOfContent },\n }\"\n class=\"hbll-expand-collapse-content-wrapper\"\n [ngClass]=\"{ 'hbll-expand-collapse-collapsed': !isExpanded }\"\n>\n <div data-testid=\"content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".hbll-expand-collapse-collapsed{height:0}.hbll-expand-collapse-content-wrapper{overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [libHbllExpandCollapse], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20
- }
21
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ExpandCollapseComponent, decorators: [{
22
- type: Component,
23
- args: [{ selector: 'lib-expand-collapse', changeDetection: ChangeDetectionStrategy.OnPush, animations: [libHbllExpandCollapse], standalone: true, imports: [CommonModule], template: "<div\n #contentRef\n data-testid=\"contentRef\"\n [@libHbllExpandCollapse]=\"{\n value: isExpanded,\n params: { startHeight: heightOfContent },\n }\"\n class=\"hbll-expand-collapse-content-wrapper\"\n [ngClass]=\"{ 'hbll-expand-collapse-collapsed': !isExpanded }\"\n>\n <div data-testid=\"content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".hbll-expand-collapse-collapsed{height:0}.hbll-expand-collapse-content-wrapper{overflow:hidden}\n"] }]
24
- }], propDecorators: { contentRef: [{
25
- type: ViewChild,
26
- args: ['contentRef']
27
- }], isExpanded: [{
28
- type: Input,
29
- args: [{ required: true }]
30
- }] } });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kLWNvbGxhcHNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7OztBQVdqRSxNQUFNLE9BQU8sdUJBQXVCO0lBVHBDO1FBWVksZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFTbEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7S0FDakM7SUFURyxJQUErQixVQUFVLENBQUMsVUFBbUI7UUFDekQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFDbkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDOzhHQVZRLHVCQUF1QjtrR0FBdkIsdUJBQXVCLCtOQ2JwQyx5WUFjQSwwSkRIYyxZQUFZLCtHQUZWLENBQUMscUJBQXFCLENBQUM7OzJGQUkxQix1QkFBdUI7a0JBVG5DLFNBQVM7K0JBQ0kscUJBQXFCLG1CQUdkLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsQ0FBQyxxQkFBcUIsQ0FBQyxjQUN2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7OEJBR1UsVUFBVTtzQkFBMUMsU0FBUzt1QkFBQyxZQUFZO2dCQUdRLFVBQVU7c0JBQXhDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGxpYkhibGxFeHBhbmRDb2xsYXBzZSB9IGZyb20gJy4uL2FuaW1hdGlvbnMvYW5pbWF0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWV4cGFuZC1jb2xsYXBzZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2V4cGFuZC1jb2xsYXBzZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZXhwYW5kLWNvbGxhcHNlLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgYW5pbWF0aW9uczogW2xpYkhibGxFeHBhbmRDb2xsYXBzZV0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgRXhwYW5kQ29sbGFwc2VDb21wb25lbnQge1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnRSZWYnKSBwcml2YXRlIGNvbnRlbnRSZWYhOiBFbGVtZW50UmVmO1xuXG4gICAgcHJpdmF0ZSBfaXNFeHBhbmRlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNldCBpc0V4cGFuZGVkKGlzRXhwYW5kZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5oZWlnaHRPZkNvbnRlbnQgPSB0aGlzLmNvbnRlbnRSZWY/Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICB0aGlzLl9pc0V4cGFuZGVkID0gaXNFeHBhbmRlZDtcbiAgICB9XG4gICAgZ2V0IGlzRXhwYW5kZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0V4cGFuZGVkO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoZWlnaHRPZkNvbnRlbnQgPSAwO1xufVxuIiwiPGRpdlxuICAgICNjb250ZW50UmVmXG4gICAgZGF0YS10ZXN0aWQ9XCJjb250ZW50UmVmXCJcbiAgICBbQGxpYkhibGxFeHBhbmRDb2xsYXBzZV09XCJ7XG4gICAgICAgIHZhbHVlOiBpc0V4cGFuZGVkLFxuICAgICAgICBwYXJhbXM6IHsgc3RhcnRIZWlnaHQ6IGhlaWdodE9mQ29udGVudCB9LFxuICAgIH1cIlxuICAgIGNsYXNzPVwiaGJsbC1leHBhbmQtY29sbGFwc2UtY29udGVudC13cmFwcGVyXCJcbiAgICBbbmdDbGFzc109XCJ7ICdoYmxsLWV4cGFuZC1jb2xsYXBzZS1jb2xsYXBzZWQnOiAhaXNFeHBhbmRlZCB9XCJcbj5cbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiY29udGVudFwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==