@fhss-web-team/frontend-utils 21.4.2 → 21.4.3

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.
@@ -222,11 +222,11 @@ class ByuHeaderComponent {
222
222
  }
223
223
  }
224
224
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ByuHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
225
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: ByuHeaderComponent, isStandalone: true, selector: "byu-header", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "@let title = config().title;\n@let subtitle = config().subtitle;\n@let breadcrumbs = config().breadcrumbs;\n@let menu = config().menu;\n@let authenticated = auth.authenticated();\n\n<ng-template #signin>\n <button class=\"signin\" (click)=\"authenticated ? auth.logout() : auth.login()\">\n <span>{{ auth.preferredName() }}</span>\n <svg\n class=\"signin-icon\"\n aria-hidden=\"true\"\n focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\">\n <path\n fill=\"currentcolor\"\n d=\"M50 95c-26 0-34-18-34-18 3-12 8-18 17-18 5 5 10 7 17 7s12-2 17-7c9 0 14 6 17 18 0 0-7 18-34 18z\"></path>\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n fill=\"none\"\n stroke=\"currentcolor\"\n stroke-width=\"10\"></circle>\n <circle fill=\"currentcolor\" cx=\"50\" cy=\"40\" r=\"20\"></circle>\n </svg>\n <span class=\"signin-link\">{{\n authenticated ? 'Sign Out' : 'Sign In'\n }}</span>\n </button>\n</ng-template>\n\n<a class=\"skip-to-main-content\" [routerLink]=\"[]\" fragment=\"#maincontent\">\n Skip to main content\n</a>\n\n<header>\n <div class=\"top\">\n <a\n href=\"https://www.byu.edu\"\n class=\"logo\"\n aria-label=\"Brigham Young University home\">\n </a>\n <div class=\"titles\">\n <div class=\"breadcrumbs\">\n @for (breadcrumb of breadcrumbs; track breadcrumb) {\n <byu-header-link [headerItem]=\"breadcrumb\" class=\"breadcrumb\" />\n }\n </div>\n <byu-header-link [headerItem]=\"title\" class=\"title\" />\n @if (subtitle) {\n <byu-header-link [headerItem]=\"subtitle\" class=\"subtitle\" />\n }\n </div>\n <ng-container *ngTemplateOutlet=\"signin\" />\n <button\n type=\"button\"\n class=\"hamburger\"\n [class.open]=\"isMenuOpen()\"\n (click)=\"toggleMenu()\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n aria-controls=\"byu-header-nav\"\n aria-label=\"Menu\">\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n </button>\n </div>\n <div class=\"bottom\">\n <nav id=\"byu-header-nav\" [class.open]=\"isMenuOpen()\">\n <ng-container *ngTemplateOutlet=\"signin\" />\n @for (menuItem of menu; track menuItem.text) {\n @if (isMenuLink(menuItem)) {\n @if (isMenuLinkVisible(menuItem)) {\n <byu-header-link [headerItem]=\"menuItem\" class=\"nav-item\" />\n }\n } @else {\n @if (isMenuDropdownVisible(menuItem)) {\n <div\n class=\"nav-item dropdown\"\n [class.open]=\"openDropdown === menuItem\">\n <button\n type=\"button\"\n class=\"nav-item-content\"\n (click)=\"toggleDropdown(menuItem)\"\n [attr.aria-expanded]=\"openDropdown === menuItem\">\n {{ menuItem.text }}\n </button>\n @if (openDropdown === menuItem) {\n <div class=\"dropdown-item-menu\">\n @for (dropItem of menuItem.items; track dropItem.text) {\n @if (isMenuLinkVisible(dropItem)) {\n <byu-header-link\n [headerItem]=\"dropItem\"\n itemType=\"dropdown\"\n class=\"dropdown-item\" />\n }\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n </div>\n</header>\n", styles: [":host{container:byu-header-container/inline-size;z-index:999}.skip-to-main-content{position:fixed;top:1em;left:1em;transform:translate(-200%);z-index:1000;background-color:#0047ba;color:#fff;border-radius:2px;padding:.5em 1em;text-decoration:none}.skip-to-main-content:focus,.skip-to-main-content:focus-visible,.skip-to-main-content:active{transform:translate(0)}.signin{display:flex;align-items:center;gap:10px;font-size:16px;color:#fff;cursor:pointer}.signin .signin-icon{display:flex;margin-right:0;align-items:center;height:20px;width:20px}.signin .signin-link{text-decoration:none}header{color:#fff;position:relative;--padding: 16px;--logo-extra-padding: 5px;--logo-width: 100px;--title-gap: 8px;--item-padding-block: 16px;--item-padding-inline: 22px;--item-padding: var(--item-padding-block) var(--item-padding-inline);--dropdown-arrow-width: 6px;--sqrt2: 1.414}header button{background-color:transparent;border:none}header .top{background-color:#002e5d;display:flex;align-items:center;padding:var(--padding);padding-left:0}header .top .logo{width:var(--logo-width);height:25px;margin-inline:var(--logo-extra-padding);background-image:url(data:image/png;base64,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);background-size:cover;background-position:center}header .top .hamburger{display:none}header .top .titles{display:flex;flex-direction:column;gap:var(--title-gap);padding-left:var(--padding);border-left:1px solid rgba(255,255,255,.25);margin-right:auto}header .top .titles .breadcrumbs byu-header-link{display:inline}header .top .titles .breadcrumbs byu-header-link:not(:first-child){padding-left:10px}header .top .titles .breadcrumbs byu-header-link:not(:last-child){padding-right:10px;border-right:1px solid rgba(255,255,255,.25)}header .top .titles .breadcrumbs:empty{display:none}header .bottom{box-shadow:0 3px 10px #ccc5c580;background-color:#fff}header .bottom nav{display:flex;flex-direction:row;flex-wrap:wrap;padding-left:calc(var(--logo-width) + 2 * var(--logo-extra-padding) + var(--padding) - var(--item-padding-inline))}header .bottom nav .signin{display:none}header .bottom nav .nav-item{display:block;transition:all .25s;text-decoration:none}header .bottom nav .nav-item:hover{box-shadow:inset 0 -5px #002e5d;background-color:#f1f1f1}header .bottom nav .nav-item .nav-item-content{display:inline-block;padding:var(--item-padding);font-size:16px;text-decoration:none;color:#002e5d}header .bottom nav .nav-item.dropdown{position:relative;cursor:pointer}header .bottom nav .nav-item.dropdown .nav-item-content{position:relative;padding-right:calc(var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2))}header .bottom nav .nav-item.dropdown .nav-item-content:after{content:\"\";width:var(--dropdown-arrow-width);aspect-ratio:1/1;border-bottom:2px solid #002e5d;border-right:2px solid #002e5d;position:absolute;right:calc((var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2)) / 2);top:50%;transform-origin:75% 75%;transform:translateY(-75%) rotate(45deg);transition:transform .2s ease-in-out}header .bottom nav .nav-item.dropdown.open .nav-item-content:after{transform:translateY(-75%) rotate(225deg)}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:absolute;background:#fff;z-index:1000;top:calc(100% - 5px);padding:0;box-shadow:0 3px 3px #ccc5c5bf}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item:hover{background-color:#f1f1f1}@container byu-header-container (width <= 800px){header{--padding: 12px;--logo-extra-padding: 3px;--title-gap: 2px}header .top .logo{width:65px}header .top .signin{display:none}header .top .hamburger{display:block;margin-left:var(--padding)}header .top .hamburger .bar{--width: 28px;--height: 2px;--gap: calc(var(--width) / 3 - var(--height));display:block;width:var(--width);height:var(--height);background-color:#fff;transition:all .2s ease}header .top .hamburger .bar:nth-child(2){margin-block:var(--gap)}header .top .hamburger.open .bar:nth-child(1){transform:translateY(calc(1 * (var(--gap) + var(--height)))) rotate(45deg)}header .top .hamburger.open .bar:nth-child(2){width:0}header .top .hamburger.open .bar:nth-child(3){transform:translateY(calc(-1 * (var(--gap) + var(--height)))) rotate(-45deg)}header .bottom{position:absolute;width:100%}header .bottom nav{display:none;flex-direction:column;flex-wrap:nowrap;padding-left:0}header .bottom nav.open{display:flex}header .bottom nav .signin{display:flex;color:#002e5d;align-self:end;padding:1em}header .bottom nav .nav-item:hover{box-shadow:inset 5px 0 #002e5d}header .bottom nav .nav-item.dropdown .nav-item-content{display:block}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:static;width:auto;box-shadow:none}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item{padding-left:1em}}\n"], dependencies: [{ kind: "component", type: NormalizedHeaderItem, selector: "byu-header-link", inputs: ["headerItem"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.ShadowDom });
225
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: ByuHeaderComponent, isStandalone: true, selector: "byu-header", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "@let title = config().title;\n@let subtitle = config().subtitle;\n@let breadcrumbs = config().breadcrumbs;\n@let menu = config().menu;\n@let authenticated = auth.authenticated();\n\n<ng-template #signin>\n <button class=\"signin\" (click)=\"authenticated ? auth.logout() : auth.login()\">\n <span>{{ auth.preferredName() }}</span>\n <svg\n class=\"signin-icon\"\n aria-hidden=\"true\"\n focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\">\n <path\n fill=\"currentcolor\"\n d=\"M50 95c-26 0-34-18-34-18 3-12 8-18 17-18 5 5 10 7 17 7s12-2 17-7c9 0 14 6 17 18 0 0-7 18-34 18z\"></path>\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n fill=\"none\"\n stroke=\"currentcolor\"\n stroke-width=\"10\"></circle>\n <circle fill=\"currentcolor\" cx=\"50\" cy=\"40\" r=\"20\"></circle>\n </svg>\n <span class=\"signin-link\">{{\n authenticated ? 'Sign Out' : 'Sign In'\n }}</span>\n </button>\n</ng-template>\n\n<a class=\"skip-to-main-content\" [routerLink]=\"[]\" fragment=\"maincontent\">\n Skip to main content\n</a>\n\n<header>\n <div class=\"top\">\n <a\n href=\"https://www.byu.edu\"\n class=\"logo\"\n aria-label=\"Brigham Young University home\">\n </a>\n <div class=\"titles\">\n <div class=\"breadcrumbs\">\n @for (breadcrumb of breadcrumbs; track breadcrumb) {\n <byu-header-link [headerItem]=\"breadcrumb\" class=\"breadcrumb\" />\n }\n </div>\n <byu-header-link [headerItem]=\"title\" class=\"title\" />\n @if (subtitle) {\n <byu-header-link [headerItem]=\"subtitle\" class=\"subtitle\" />\n }\n </div>\n <ng-container *ngTemplateOutlet=\"signin\" />\n <button\n type=\"button\"\n class=\"hamburger\"\n [class.open]=\"isMenuOpen()\"\n (click)=\"toggleMenu()\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n aria-controls=\"byu-header-nav\"\n aria-label=\"Menu\">\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n </button>\n </div>\n <div class=\"bottom\">\n <nav id=\"byu-header-nav\" [class.open]=\"isMenuOpen()\">\n <ng-container *ngTemplateOutlet=\"signin\" />\n @for (menuItem of menu; track menuItem.text) {\n @if (isMenuLink(menuItem)) {\n @if (isMenuLinkVisible(menuItem)) {\n <byu-header-link [headerItem]=\"menuItem\" class=\"nav-item\" />\n }\n } @else {\n @if (isMenuDropdownVisible(menuItem)) {\n <div\n class=\"nav-item dropdown\"\n [class.open]=\"openDropdown === menuItem\">\n <button\n type=\"button\"\n class=\"nav-item-content\"\n (click)=\"toggleDropdown(menuItem)\"\n [attr.aria-expanded]=\"openDropdown === menuItem\">\n {{ menuItem.text }}\n </button>\n @if (openDropdown === menuItem) {\n <div class=\"dropdown-item-menu\">\n @for (dropItem of menuItem.items; track dropItem.text) {\n @if (isMenuLinkVisible(dropItem)) {\n <byu-header-link\n [headerItem]=\"dropItem\"\n itemType=\"dropdown\"\n class=\"dropdown-item\" />\n }\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n </div>\n</header>\n", styles: [":host{container:byu-header-container/inline-size;z-index:999}.skip-to-main-content{position:fixed;top:1em;left:1em;transform:translate(-200%);z-index:1000;background-color:#0047ba;color:#fff;border-radius:2px;padding:.5em 1em;text-decoration:none}.skip-to-main-content:focus,.skip-to-main-content:focus-visible,.skip-to-main-content:active{transform:translate(0)}.signin{display:flex;align-items:center;gap:10px;font-size:16px;color:#fff;cursor:pointer}.signin .signin-icon{display:flex;margin-right:0;align-items:center;height:20px;width:20px}.signin .signin-link{text-decoration:none}header{color:#fff;position:relative;--padding: 16px;--logo-extra-padding: 5px;--logo-width: 100px;--title-gap: 8px;--item-padding-block: 16px;--item-padding-inline: 22px;--item-padding: var(--item-padding-block) var(--item-padding-inline);--dropdown-arrow-width: 6px;--sqrt2: 1.414}header button{background-color:transparent;border:none}header .top{background-color:#002e5d;display:flex;align-items:center;padding:var(--padding);padding-left:0}header .top .logo{width:var(--logo-width);height:25px;margin-inline:var(--logo-extra-padding);background-image:url(data:image/png;base64,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);background-size:cover;background-position:center}header .top .hamburger{display:none}header .top .titles{display:flex;flex-direction:column;gap:var(--title-gap);padding-left:var(--padding);border-left:1px solid rgba(255,255,255,.25);margin-right:auto}header .top .titles .breadcrumbs byu-header-link{display:inline}header .top .titles .breadcrumbs byu-header-link:not(:first-child){padding-left:10px}header .top .titles .breadcrumbs byu-header-link:not(:last-child){padding-right:10px;border-right:1px solid rgba(255,255,255,.25)}header .top .titles .breadcrumbs:empty{display:none}header .bottom{box-shadow:0 3px 10px #ccc5c580;background-color:#fff}header .bottom nav{display:flex;flex-direction:row;flex-wrap:wrap;padding-left:calc(var(--logo-width) + 2 * var(--logo-extra-padding) + var(--padding) - var(--item-padding-inline))}header .bottom nav .signin{display:none}header .bottom nav .nav-item{display:block;transition:all .25s;text-decoration:none}header .bottom nav .nav-item:hover{box-shadow:inset 0 -5px #002e5d;background-color:#f1f1f1}header .bottom nav .nav-item .nav-item-content{display:inline-block;padding:var(--item-padding);font-size:16px;text-decoration:none;color:#002e5d}header .bottom nav .nav-item.dropdown{position:relative;cursor:pointer}header .bottom nav .nav-item.dropdown .nav-item-content{position:relative;padding-right:calc(var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2))}header .bottom nav .nav-item.dropdown .nav-item-content:after{content:\"\";width:var(--dropdown-arrow-width);aspect-ratio:1/1;border-bottom:2px solid #002e5d;border-right:2px solid #002e5d;position:absolute;right:calc((var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2)) / 2);top:50%;transform-origin:75% 75%;transform:translateY(-75%) rotate(45deg);transition:transform .2s ease-in-out}header .bottom nav .nav-item.dropdown.open .nav-item-content:after{transform:translateY(-75%) rotate(225deg)}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:absolute;background:#fff;z-index:1000;top:calc(100% - 5px);padding:0;box-shadow:0 3px 3px #ccc5c5bf}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item:hover{background-color:#f1f1f1}@container byu-header-container (width <= 800px){header{--padding: 12px;--logo-extra-padding: 3px;--title-gap: 2px}header .top .logo{width:65px}header .top .signin{display:none}header .top .hamburger{display:block;margin-left:var(--padding)}header .top .hamburger .bar{--width: 28px;--height: 2px;--gap: calc(var(--width) / 3 - var(--height));display:block;width:var(--width);height:var(--height);background-color:#fff;transition:all .2s ease}header .top .hamburger .bar:nth-child(2){margin-block:var(--gap)}header .top .hamburger.open .bar:nth-child(1){transform:translateY(calc(1 * (var(--gap) + var(--height)))) rotate(45deg)}header .top .hamburger.open .bar:nth-child(2){width:0}header .top .hamburger.open .bar:nth-child(3){transform:translateY(calc(-1 * (var(--gap) + var(--height)))) rotate(-45deg)}header .bottom{position:absolute;width:100%}header .bottom nav{display:none;flex-direction:column;flex-wrap:nowrap;padding-left:0}header .bottom nav.open{display:flex}header .bottom nav .signin{display:flex;color:#002e5d;align-self:end;padding:1em}header .bottom nav .nav-item:hover{box-shadow:inset 5px 0 #002e5d}header .bottom nav .nav-item.dropdown .nav-item-content{display:block}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:static;width:auto;box-shadow:none}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item{padding-left:1em}}\n"], dependencies: [{ kind: "component", type: NormalizedHeaderItem, selector: "byu-header-link", inputs: ["headerItem"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.ShadowDom });
226
226
  }
227
227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ByuHeaderComponent, decorators: [{
228
228
  type: Component,
229
- args: [{ selector: 'byu-header', imports: [NormalizedHeaderItem, NgTemplateOutlet, RouterLink], encapsulation: ViewEncapsulation.ShadowDom, template: "@let title = config().title;\n@let subtitle = config().subtitle;\n@let breadcrumbs = config().breadcrumbs;\n@let menu = config().menu;\n@let authenticated = auth.authenticated();\n\n<ng-template #signin>\n <button class=\"signin\" (click)=\"authenticated ? auth.logout() : auth.login()\">\n <span>{{ auth.preferredName() }}</span>\n <svg\n class=\"signin-icon\"\n aria-hidden=\"true\"\n focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\">\n <path\n fill=\"currentcolor\"\n d=\"M50 95c-26 0-34-18-34-18 3-12 8-18 17-18 5 5 10 7 17 7s12-2 17-7c9 0 14 6 17 18 0 0-7 18-34 18z\"></path>\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n fill=\"none\"\n stroke=\"currentcolor\"\n stroke-width=\"10\"></circle>\n <circle fill=\"currentcolor\" cx=\"50\" cy=\"40\" r=\"20\"></circle>\n </svg>\n <span class=\"signin-link\">{{\n authenticated ? 'Sign Out' : 'Sign In'\n }}</span>\n </button>\n</ng-template>\n\n<a class=\"skip-to-main-content\" [routerLink]=\"[]\" fragment=\"#maincontent\">\n Skip to main content\n</a>\n\n<header>\n <div class=\"top\">\n <a\n href=\"https://www.byu.edu\"\n class=\"logo\"\n aria-label=\"Brigham Young University home\">\n </a>\n <div class=\"titles\">\n <div class=\"breadcrumbs\">\n @for (breadcrumb of breadcrumbs; track breadcrumb) {\n <byu-header-link [headerItem]=\"breadcrumb\" class=\"breadcrumb\" />\n }\n </div>\n <byu-header-link [headerItem]=\"title\" class=\"title\" />\n @if (subtitle) {\n <byu-header-link [headerItem]=\"subtitle\" class=\"subtitle\" />\n }\n </div>\n <ng-container *ngTemplateOutlet=\"signin\" />\n <button\n type=\"button\"\n class=\"hamburger\"\n [class.open]=\"isMenuOpen()\"\n (click)=\"toggleMenu()\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n aria-controls=\"byu-header-nav\"\n aria-label=\"Menu\">\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n </button>\n </div>\n <div class=\"bottom\">\n <nav id=\"byu-header-nav\" [class.open]=\"isMenuOpen()\">\n <ng-container *ngTemplateOutlet=\"signin\" />\n @for (menuItem of menu; track menuItem.text) {\n @if (isMenuLink(menuItem)) {\n @if (isMenuLinkVisible(menuItem)) {\n <byu-header-link [headerItem]=\"menuItem\" class=\"nav-item\" />\n }\n } @else {\n @if (isMenuDropdownVisible(menuItem)) {\n <div\n class=\"nav-item dropdown\"\n [class.open]=\"openDropdown === menuItem\">\n <button\n type=\"button\"\n class=\"nav-item-content\"\n (click)=\"toggleDropdown(menuItem)\"\n [attr.aria-expanded]=\"openDropdown === menuItem\">\n {{ menuItem.text }}\n </button>\n @if (openDropdown === menuItem) {\n <div class=\"dropdown-item-menu\">\n @for (dropItem of menuItem.items; track dropItem.text) {\n @if (isMenuLinkVisible(dropItem)) {\n <byu-header-link\n [headerItem]=\"dropItem\"\n itemType=\"dropdown\"\n class=\"dropdown-item\" />\n }\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n </div>\n</header>\n", styles: [":host{container:byu-header-container/inline-size;z-index:999}.skip-to-main-content{position:fixed;top:1em;left:1em;transform:translate(-200%);z-index:1000;background-color:#0047ba;color:#fff;border-radius:2px;padding:.5em 1em;text-decoration:none}.skip-to-main-content:focus,.skip-to-main-content:focus-visible,.skip-to-main-content:active{transform:translate(0)}.signin{display:flex;align-items:center;gap:10px;font-size:16px;color:#fff;cursor:pointer}.signin .signin-icon{display:flex;margin-right:0;align-items:center;height:20px;width:20px}.signin .signin-link{text-decoration:none}header{color:#fff;position:relative;--padding: 16px;--logo-extra-padding: 5px;--logo-width: 100px;--title-gap: 8px;--item-padding-block: 16px;--item-padding-inline: 22px;--item-padding: var(--item-padding-block) var(--item-padding-inline);--dropdown-arrow-width: 6px;--sqrt2: 1.414}header button{background-color:transparent;border:none}header .top{background-color:#002e5d;display:flex;align-items:center;padding:var(--padding);padding-left:0}header .top .logo{width:var(--logo-width);height:25px;margin-inline:var(--logo-extra-padding);background-image:url(data:image/png;base64,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);background-size:cover;background-position:center}header .top .hamburger{display:none}header .top .titles{display:flex;flex-direction:column;gap:var(--title-gap);padding-left:var(--padding);border-left:1px solid rgba(255,255,255,.25);margin-right:auto}header .top .titles .breadcrumbs byu-header-link{display:inline}header .top .titles .breadcrumbs byu-header-link:not(:first-child){padding-left:10px}header .top .titles .breadcrumbs byu-header-link:not(:last-child){padding-right:10px;border-right:1px solid rgba(255,255,255,.25)}header .top .titles .breadcrumbs:empty{display:none}header .bottom{box-shadow:0 3px 10px #ccc5c580;background-color:#fff}header .bottom nav{display:flex;flex-direction:row;flex-wrap:wrap;padding-left:calc(var(--logo-width) + 2 * var(--logo-extra-padding) + var(--padding) - var(--item-padding-inline))}header .bottom nav .signin{display:none}header .bottom nav .nav-item{display:block;transition:all .25s;text-decoration:none}header .bottom nav .nav-item:hover{box-shadow:inset 0 -5px #002e5d;background-color:#f1f1f1}header .bottom nav .nav-item .nav-item-content{display:inline-block;padding:var(--item-padding);font-size:16px;text-decoration:none;color:#002e5d}header .bottom nav .nav-item.dropdown{position:relative;cursor:pointer}header .bottom nav .nav-item.dropdown .nav-item-content{position:relative;padding-right:calc(var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2))}header .bottom nav .nav-item.dropdown .nav-item-content:after{content:\"\";width:var(--dropdown-arrow-width);aspect-ratio:1/1;border-bottom:2px solid #002e5d;border-right:2px solid #002e5d;position:absolute;right:calc((var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2)) / 2);top:50%;transform-origin:75% 75%;transform:translateY(-75%) rotate(45deg);transition:transform .2s ease-in-out}header .bottom nav .nav-item.dropdown.open .nav-item-content:after{transform:translateY(-75%) rotate(225deg)}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:absolute;background:#fff;z-index:1000;top:calc(100% - 5px);padding:0;box-shadow:0 3px 3px #ccc5c5bf}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item:hover{background-color:#f1f1f1}@container byu-header-container (width <= 800px){header{--padding: 12px;--logo-extra-padding: 3px;--title-gap: 2px}header .top .logo{width:65px}header .top .signin{display:none}header .top .hamburger{display:block;margin-left:var(--padding)}header .top .hamburger .bar{--width: 28px;--height: 2px;--gap: calc(var(--width) / 3 - var(--height));display:block;width:var(--width);height:var(--height);background-color:#fff;transition:all .2s ease}header .top .hamburger .bar:nth-child(2){margin-block:var(--gap)}header .top .hamburger.open .bar:nth-child(1){transform:translateY(calc(1 * (var(--gap) + var(--height)))) rotate(45deg)}header .top .hamburger.open .bar:nth-child(2){width:0}header .top .hamburger.open .bar:nth-child(3){transform:translateY(calc(-1 * (var(--gap) + var(--height)))) rotate(-45deg)}header .bottom{position:absolute;width:100%}header .bottom nav{display:none;flex-direction:column;flex-wrap:nowrap;padding-left:0}header .bottom nav.open{display:flex}header .bottom nav .signin{display:flex;color:#002e5d;align-self:end;padding:1em}header .bottom nav .nav-item:hover{box-shadow:inset 5px 0 #002e5d}header .bottom nav .nav-item.dropdown .nav-item-content{display:block}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:static;width:auto;box-shadow:none}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item{padding-left:1em}}\n"] }]
229
+ args: [{ selector: 'byu-header', imports: [NormalizedHeaderItem, NgTemplateOutlet, RouterLink], encapsulation: ViewEncapsulation.ShadowDom, template: "@let title = config().title;\n@let subtitle = config().subtitle;\n@let breadcrumbs = config().breadcrumbs;\n@let menu = config().menu;\n@let authenticated = auth.authenticated();\n\n<ng-template #signin>\n <button class=\"signin\" (click)=\"authenticated ? auth.logout() : auth.login()\">\n <span>{{ auth.preferredName() }}</span>\n <svg\n class=\"signin-icon\"\n aria-hidden=\"true\"\n focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\">\n <path\n fill=\"currentcolor\"\n d=\"M50 95c-26 0-34-18-34-18 3-12 8-18 17-18 5 5 10 7 17 7s12-2 17-7c9 0 14 6 17 18 0 0-7 18-34 18z\"></path>\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n fill=\"none\"\n stroke=\"currentcolor\"\n stroke-width=\"10\"></circle>\n <circle fill=\"currentcolor\" cx=\"50\" cy=\"40\" r=\"20\"></circle>\n </svg>\n <span class=\"signin-link\">{{\n authenticated ? 'Sign Out' : 'Sign In'\n }}</span>\n </button>\n</ng-template>\n\n<a class=\"skip-to-main-content\" [routerLink]=\"[]\" fragment=\"maincontent\">\n Skip to main content\n</a>\n\n<header>\n <div class=\"top\">\n <a\n href=\"https://www.byu.edu\"\n class=\"logo\"\n aria-label=\"Brigham Young University home\">\n </a>\n <div class=\"titles\">\n <div class=\"breadcrumbs\">\n @for (breadcrumb of breadcrumbs; track breadcrumb) {\n <byu-header-link [headerItem]=\"breadcrumb\" class=\"breadcrumb\" />\n }\n </div>\n <byu-header-link [headerItem]=\"title\" class=\"title\" />\n @if (subtitle) {\n <byu-header-link [headerItem]=\"subtitle\" class=\"subtitle\" />\n }\n </div>\n <ng-container *ngTemplateOutlet=\"signin\" />\n <button\n type=\"button\"\n class=\"hamburger\"\n [class.open]=\"isMenuOpen()\"\n (click)=\"toggleMenu()\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n aria-controls=\"byu-header-nav\"\n aria-label=\"Menu\">\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n </button>\n </div>\n <div class=\"bottom\">\n <nav id=\"byu-header-nav\" [class.open]=\"isMenuOpen()\">\n <ng-container *ngTemplateOutlet=\"signin\" />\n @for (menuItem of menu; track menuItem.text) {\n @if (isMenuLink(menuItem)) {\n @if (isMenuLinkVisible(menuItem)) {\n <byu-header-link [headerItem]=\"menuItem\" class=\"nav-item\" />\n }\n } @else {\n @if (isMenuDropdownVisible(menuItem)) {\n <div\n class=\"nav-item dropdown\"\n [class.open]=\"openDropdown === menuItem\">\n <button\n type=\"button\"\n class=\"nav-item-content\"\n (click)=\"toggleDropdown(menuItem)\"\n [attr.aria-expanded]=\"openDropdown === menuItem\">\n {{ menuItem.text }}\n </button>\n @if (openDropdown === menuItem) {\n <div class=\"dropdown-item-menu\">\n @for (dropItem of menuItem.items; track dropItem.text) {\n @if (isMenuLinkVisible(dropItem)) {\n <byu-header-link\n [headerItem]=\"dropItem\"\n itemType=\"dropdown\"\n class=\"dropdown-item\" />\n }\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n </div>\n</header>\n", styles: [":host{container:byu-header-container/inline-size;z-index:999}.skip-to-main-content{position:fixed;top:1em;left:1em;transform:translate(-200%);z-index:1000;background-color:#0047ba;color:#fff;border-radius:2px;padding:.5em 1em;text-decoration:none}.skip-to-main-content:focus,.skip-to-main-content:focus-visible,.skip-to-main-content:active{transform:translate(0)}.signin{display:flex;align-items:center;gap:10px;font-size:16px;color:#fff;cursor:pointer}.signin .signin-icon{display:flex;margin-right:0;align-items:center;height:20px;width:20px}.signin .signin-link{text-decoration:none}header{color:#fff;position:relative;--padding: 16px;--logo-extra-padding: 5px;--logo-width: 100px;--title-gap: 8px;--item-padding-block: 16px;--item-padding-inline: 22px;--item-padding: var(--item-padding-block) var(--item-padding-inline);--dropdown-arrow-width: 6px;--sqrt2: 1.414}header button{background-color:transparent;border:none}header .top{background-color:#002e5d;display:flex;align-items:center;padding:var(--padding);padding-left:0}header .top .logo{width:var(--logo-width);height:25px;margin-inline:var(--logo-extra-padding);background-image:url(data:image/png;base64,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);background-size:cover;background-position:center}header .top .hamburger{display:none}header .top .titles{display:flex;flex-direction:column;gap:var(--title-gap);padding-left:var(--padding);border-left:1px solid rgba(255,255,255,.25);margin-right:auto}header .top .titles .breadcrumbs byu-header-link{display:inline}header .top .titles .breadcrumbs byu-header-link:not(:first-child){padding-left:10px}header .top .titles .breadcrumbs byu-header-link:not(:last-child){padding-right:10px;border-right:1px solid rgba(255,255,255,.25)}header .top .titles .breadcrumbs:empty{display:none}header .bottom{box-shadow:0 3px 10px #ccc5c580;background-color:#fff}header .bottom nav{display:flex;flex-direction:row;flex-wrap:wrap;padding-left:calc(var(--logo-width) + 2 * var(--logo-extra-padding) + var(--padding) - var(--item-padding-inline))}header .bottom nav .signin{display:none}header .bottom nav .nav-item{display:block;transition:all .25s;text-decoration:none}header .bottom nav .nav-item:hover{box-shadow:inset 0 -5px #002e5d;background-color:#f1f1f1}header .bottom nav .nav-item .nav-item-content{display:inline-block;padding:var(--item-padding);font-size:16px;text-decoration:none;color:#002e5d}header .bottom nav .nav-item.dropdown{position:relative;cursor:pointer}header .bottom nav .nav-item.dropdown .nav-item-content{position:relative;padding-right:calc(var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2))}header .bottom nav .nav-item.dropdown .nav-item-content:after{content:\"\";width:var(--dropdown-arrow-width);aspect-ratio:1/1;border-bottom:2px solid #002e5d;border-right:2px solid #002e5d;position:absolute;right:calc((var(--item-padding-inline) + var(--dropdown-arrow-width) * var(--sqrt2)) / 2);top:50%;transform-origin:75% 75%;transform:translateY(-75%) rotate(45deg);transition:transform .2s ease-in-out}header .bottom nav .nav-item.dropdown.open .nav-item-content:after{transform:translateY(-75%) rotate(225deg)}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:absolute;background:#fff;z-index:1000;top:calc(100% - 5px);padding:0;box-shadow:0 3px 3px #ccc5c5bf}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item:hover{background-color:#f1f1f1}@container byu-header-container (width <= 800px){header{--padding: 12px;--logo-extra-padding: 3px;--title-gap: 2px}header .top .logo{width:65px}header .top .signin{display:none}header .top .hamburger{display:block;margin-left:var(--padding)}header .top .hamburger .bar{--width: 28px;--height: 2px;--gap: calc(var(--width) / 3 - var(--height));display:block;width:var(--width);height:var(--height);background-color:#fff;transition:all .2s ease}header .top .hamburger .bar:nth-child(2){margin-block:var(--gap)}header .top .hamburger.open .bar:nth-child(1){transform:translateY(calc(1 * (var(--gap) + var(--height)))) rotate(45deg)}header .top .hamburger.open .bar:nth-child(2){width:0}header .top .hamburger.open .bar:nth-child(3){transform:translateY(calc(-1 * (var(--gap) + var(--height)))) rotate(-45deg)}header .bottom{position:absolute;width:100%}header .bottom nav{display:none;flex-direction:column;flex-wrap:nowrap;padding-left:0}header .bottom nav.open{display:flex}header .bottom nav .signin{display:flex;color:#002e5d;align-self:end;padding:1em}header .bottom nav .nav-item:hover{box-shadow:inset 5px 0 #002e5d}header .bottom nav .nav-item.dropdown .nav-item-content{display:block}header .bottom nav .nav-item.dropdown .dropdown-item-menu{position:static;width:auto;box-shadow:none}header .bottom nav .nav-item.dropdown .dropdown-item-menu .dropdown-item{padding-left:1em}}\n"] }]
230
230
  }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], onDocumentClick: [{
231
231
  type: HostListener,
232
232
  args: ['document:click', ['$event']]
@@ -1 +1 @@
1
- {"version":3,"file":"fhss-web-team-frontend-utils.mjs","sources":["../../../projects/frontend-utils/src/lib/components/byu-footer/byu-footer.component.ts","../../../projects/frontend-utils/src/lib/components/byu-footer/byu-footer.component.html","../../../projects/frontend-utils/src/lib/config/lib.config.ts","../../../projects/frontend-utils/src/lib/services/auth/auth.service.ts","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header-link/byu-header-link.ts","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header-link/byu-header-link.html","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header.component.ts","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header.component.html","../../../projects/frontend-utils/src/lib/components/confirmation/confirmation.dialog.ts","../../../projects/frontend-utils/src/lib/components/confirmation/confirmation.dialog.html","../../../projects/frontend-utils/src/lib/components/combo-box/combo-box.component.ts","../../../projects/frontend-utils/src/lib/components/combo-box/combo-box.component.html","../../../projects/frontend-utils/src/lib/config/utils.config.ts","../../../projects/frontend-utils/src/lib/services/scroll-registry/scroll-registry.service.ts","../../../projects/frontend-utils/src/lib/directives/scroll-anchor.directive.ts","../../../projects/frontend-utils/src/lib/guards/auth/auth.guard.ts","../../../projects/frontend-utils/src/lib/guards/permission/permission.guard.ts","../../../projects/frontend-utils/src/lib/guards/home-redirect/home-redirect.guard.ts","../../../projects/frontend-utils/src/lib/pages/system/system.page.ts","../../../projects/frontend-utils/src/lib/pages/system/system.page.html","../../../projects/frontend-utils/src/lib/pages/auth-error/auth-error.page.ts","../../../projects/frontend-utils/src/lib/pages/auth-error/auth-error.page.html","../../../projects/frontend-utils/src/lib/pages/forbidden/forbidden.page.ts","../../../projects/frontend-utils/src/lib/pages/forbidden/forbidden.page.html","../../../projects/frontend-utils/src/lib/pages/not-found/not-found.page.ts","../../../projects/frontend-utils/src/lib/pages/not-found/not-found.page.html","../../../projects/frontend-utils/src/lib/pages/server-error/server-error.page.ts","../../../projects/frontend-utils/src/lib/pages/server-error/server-error.page.html","../../../projects/frontend-utils/src/lib/utils/result.ts","../../../projects/frontend-utils/src/lib/services/file/file.types.ts","../../../projects/frontend-utils/src/lib/services/file/file.ts","../../../projects/frontend-utils/src/lib/signals/trpcResource/trpcResource.ts","../../../projects/frontend-utils/src/lib/signals/debounced/debounced.ts","../../../projects/frontend-utils/src/public-api.ts","../../../projects/frontend-utils/src/fhss-web-team-frontend-utils.ts"],"sourcesContent":["import { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'byu-footer',\n imports: [],\n templateUrl: './byu-footer.component.html',\n styleUrl: './byu-footer.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class ByuFooterComponent {\n currentYear: number = new Date().getFullYear(); // Automatically updates the year\n}\n","<footer>\n <p class=\"title\">\n <a href=\"https://www.byu.edu/\">BRIGHAM YOUNG UNIVERSITY</a>\n </p>\n <p>Provo, UT 84602, USA | © {{ currentYear }} All rights reserved.</p>\n <p>\n <a href=\"https://privacy.byu.edu/privacy-notice\">Privacy Notice</a> |\n <a href=\"https://privacy.byu.edu/cookie-prefs\">Cookie Preferences</a>\n </p>\n</footer>\n","import { InjectionToken } from '@angular/core';\n\nexport const FHSS_CONFIG = new InjectionToken<FhssConfig>('FHSS_CONFIG');\n\nexport type FhssConfig = {\n rolePermissionMap: Record<string, string[]>;\n defaultHomePages: Partial<Record<string, string>>;\n};\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { FHSS_CONFIG } from '../../config/lib.config';\nimport { z } from 'zod';\n\nconst authUserSchema = z\n .object({\n id: z.string(),\n preferredFirstName: z.string(),\n preferredLastName: z.string(),\n roles: z.string().array(),\n permissions: z.string().array(),\n })\n .nullable();\n\ntype AuthUser = z.infer<typeof authUserSchema>;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n private readonly FhssConfig = inject(FHSS_CONFIG);\n private readonly readyPromise: Promise<AuthUser>;\n\n constructor() {\n this.readyPromise = this.whoAmI();\n }\n\n /**\n * Returns a promise that resolves when the authentication service is ready.\n */\n ready() {\n return this.readyPromise;\n }\n\n /**\n * Updates the authentication state by retrieving the current user's information.\n *\n * @returns A promise containing the current user's authentication details.\n */\n update() {\n return this.whoAmI();\n }\n\n readonly authenticated = signal(false);\n readonly userId = signal<string | undefined>(undefined);\n readonly preferredFirstName = signal<string | undefined>(undefined);\n readonly preferredLastName = signal<string | undefined>(undefined);\n readonly roles = signal<string[]>([]);\n readonly permissions = signal<string[]>([]);\n\n /**\n * Contains all of the user's permissions, meaning those explicitly given, as well as\n * those provided by the user's roles.\n *\n * The result is a `Set` containing all unique permissions granted to the user.\n */\n readonly effectivePermissions = computed(\n () =>\n new Set(\n this.roles()\n .flatMap(role => this.FhssConfig.rolePermissionMap[role])\n .concat(this.permissions())\n )\n );\n\n /**\n * Computes the user's preferred full name by concatenating the preferred first name\n * and, if available, the preferred last name separated by a space.\n * If the preferred first name is not set, an empty string is used.\n * If the preferred last name is not set, only the first name is returned.\n *\n * @returns The computed preferred full name as a string.\n */\n readonly preferredName = computed(() => {\n const prefLast = this.preferredLastName();\n return `${this.preferredFirstName() ?? ''}${prefLast ? ` ${prefLast}` : ''}`;\n });\n\n private resetAuthState() {\n this.authenticated.set(false);\n this.userId.set(undefined);\n this.preferredFirstName.set(undefined);\n this.preferredLastName.set(undefined);\n this.roles.set([]);\n this.permissions.set([]);\n }\n\n private setUser(user: NonNullable<AuthUser>) {\n this.authenticated.set(true);\n this.userId.set(user.id);\n this.preferredFirstName.set(user.preferredFirstName);\n this.preferredLastName.set(user.preferredLastName);\n this.roles.set(user.roles);\n this.permissions.set(user.permissions);\n }\n\n /**\n * Redirects the user to the login page.\n *\n * @param nextUri - (Optional) The URI to redirect to after login.\n */\n login(nextUri?: string): Promise<void> {\n window.location.href = `/login${nextUri ? `?next_uri=${nextUri}` : ''}`;\n return new Promise(() => {\n console.log('redirecting to login');\n });\n }\n\n /**\n * Logs the user out by resetting the authentication state and redirecting to the logout page.\n */\n logout() {\n this.resetAuthState();\n window.location.href = '/logout';\n return new Promise(() => {\n console.log('redirecting to logout');\n });\n }\n\n /**\n * Retrieves information about the currently authenticated user.\n *\n * @returns A promise that resolves to a `WhoAmI` object\n * representing the current user, or `null` if not authenticated or on error.\n */\n private async whoAmI(): Promise<AuthUser | null> {\n try {\n const res = await fetch('/sys/who-am-i');\n const user = authUserSchema.parse(await res.json());\n if (!user) {\n this.resetAuthState();\n return null;\n }\n this.setUser(user);\n return user;\n } catch {\n this.resetAuthState();\n return null;\n }\n }\n}\n","import { Component, computed, input } from '@angular/core';\nimport { RouterLink, RouterLinkActive, UrlTree } from '@angular/router';\n\nexport type HeaderLink = {\n /** text content of link */\n text: string;\n\n /**\n * If the path is a string that starts with `http`, it will be used as an absolute path for the href\n *\n * Else it will be used as a relative path for the routerLink\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n path: string | readonly any[] | UrlTree | null | undefined;\n\n /** if the link should open in a new tab */\n newTab?: boolean;\n};\n\n@Component({\n selector: 'byu-header-link',\n imports: [RouterLink, RouterLinkActive],\n templateUrl: 'byu-header-link.html',\n styleUrl: 'byu-header-link.scss',\n})\nexport class NormalizedHeaderItem {\n headerItem = input.required<HeaderLink | string>();\n\n normalizeHeaderItem = computed(() => {\n const item = this.headerItem();\n if (typeof item === 'string') {\n return {\n text: item,\n routerLink: null,\n href: null,\n newTab: null,\n };\n } else {\n const httpPath =\n typeof item.path === 'string' && item.path.startsWith('http')\n ? item.path\n : null;\n return {\n text: item.text,\n routerLink: httpPath === null ? item.path : null,\n href: httpPath,\n newTab: item.newTab ?? false,\n };\n }\n });\n}\n","@let item = normalizeHeaderItem(); @if (item.routerLink) {\n<a\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active\"\n [target]=\"item.newTab ? '_blank' : '_self'\"\n >{{ item.text }}</a\n>\n} @else if (item.href) {\n<a [href]=\"item.href\" [target]=\"item.newTab ? '_blank' : '_self'\"\n >{{ item.text }}</a\n>\n} @else {\n<a>{{ item.text }}</a>\n}\n","import {\n Component,\n input,\n inject,\n signal,\n HostListener,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { UrlTree, RouterLink } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\nimport {\n HeaderLink,\n NormalizedHeaderItem,\n} from './byu-header-link/byu-header-link';\n\ntype MenuLink<T extends string> = {\n /** text content of the link */\n text: string;\n\n /**\n * If the link is a string that starts with `http`, it will be used as an absolute path for the href\n *\n * Else it will be used as a relative path for the routerLink\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n path: string | readonly any[] | UrlTree | null | undefined;\n\n /** if the link should open in a new tab */\n newTab?: boolean;\n\n /** list of permissions that a user must have at least one of to see the link */\n requiredPermissions?: T[];\n\n /** if instead the user should have all of the required permissions */\n haveAll?: boolean;\n\n /** if the user must be authenticated to see the link */\n needsAuthentication?: boolean;\n};\n\ntype MenuDropdown<T extends string> = {\n /** text content of the link */\n text: string;\n\n /** items to display in the dropdown menu */\n items: MenuLink<T>[];\n};\n\ntype HeaderMenu<T extends string> = MenuLink<T> | MenuDropdown<T>;\n\nexport type HeaderConfig<Permission extends string> = {\n /** Main site title: a link or plain text */\n title: HeaderLink | string;\n\n /** Optional subtitle: a link or plain text */\n subtitle?: HeaderLink | string;\n\n /** Optional breadcrumbs for navigational context: links or plain texts */\n breadcrumbs?: (HeaderLink | string)[];\n\n /** Optional menu items: links or dropdowns, potentially restricted by authentication or permissions */\n menu?: HeaderMenu<Permission>[];\n};\n\n@Component({\n selector: 'byu-header',\n imports: [NormalizedHeaderItem, NgTemplateOutlet, RouterLink],\n templateUrl: './byu-header.component.html',\n styleUrl: './byu-header.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class ByuHeaderComponent {\n auth = inject(AuthService);\n config = input.required<HeaderConfig<string>>();\n\n openDropdown: MenuDropdown<string> | null = null;\n isMenuOpen = signal(false);\n\n isMenuLink(item: HeaderMenu<string>): item is MenuLink<string> {\n return 'path' in item;\n }\n\n isMenuLinkVisible(link: MenuLink<string>) {\n return link.requiredPermissions !== undefined\n ? link.requiredPermissions[link.haveAll ? 'every' : 'some'](permission =>\n this.auth.effectivePermissions().has(permission)\n )\n : this.auth.authenticated() || !link.needsAuthentication;\n }\n\n isMenuDropdownVisible(dropdown: MenuDropdown<string>) {\n return dropdown.items.some(item => this.isMenuLinkVisible(item));\n }\n\n toggleDropdown(dropdown: MenuDropdown<string>) {\n this.openDropdown = this.openDropdown === dropdown ? null : dropdown;\n }\n\n toggleMenu() {\n this.isMenuOpen.update(prev => !prev);\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(ev: MouseEvent) {\n const path = ev.composedPath();\n const target = path[0];\n\n if (target instanceof Element) {\n if (target.className !== 'nav-item-content') {\n this.openDropdown = null;\n\n if (target.className !== 'hamburger' && target.className !== 'bar') {\n this.isMenuOpen.set(false);\n }\n }\n }\n }\n}\n","@let title = config().title;\n@let subtitle = config().subtitle;\n@let breadcrumbs = config().breadcrumbs;\n@let menu = config().menu;\n@let authenticated = auth.authenticated();\n\n<ng-template #signin>\n <button class=\"signin\" (click)=\"authenticated ? auth.logout() : auth.login()\">\n <span>{{ auth.preferredName() }}</span>\n <svg\n class=\"signin-icon\"\n aria-hidden=\"true\"\n focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\">\n <path\n fill=\"currentcolor\"\n d=\"M50 95c-26 0-34-18-34-18 3-12 8-18 17-18 5 5 10 7 17 7s12-2 17-7c9 0 14 6 17 18 0 0-7 18-34 18z\"></path>\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n fill=\"none\"\n stroke=\"currentcolor\"\n stroke-width=\"10\"></circle>\n <circle fill=\"currentcolor\" cx=\"50\" cy=\"40\" r=\"20\"></circle>\n </svg>\n <span class=\"signin-link\">{{\n authenticated ? 'Sign Out' : 'Sign In'\n }}</span>\n </button>\n</ng-template>\n\n<a class=\"skip-to-main-content\" [routerLink]=\"[]\" fragment=\"#maincontent\">\n Skip to main content\n</a>\n\n<header>\n <div class=\"top\">\n <a\n href=\"https://www.byu.edu\"\n class=\"logo\"\n aria-label=\"Brigham Young University home\">\n </a>\n <div class=\"titles\">\n <div class=\"breadcrumbs\">\n @for (breadcrumb of breadcrumbs; track breadcrumb) {\n <byu-header-link [headerItem]=\"breadcrumb\" class=\"breadcrumb\" />\n }\n </div>\n <byu-header-link [headerItem]=\"title\" class=\"title\" />\n @if (subtitle) {\n <byu-header-link [headerItem]=\"subtitle\" class=\"subtitle\" />\n }\n </div>\n <ng-container *ngTemplateOutlet=\"signin\" />\n <button\n type=\"button\"\n class=\"hamburger\"\n [class.open]=\"isMenuOpen()\"\n (click)=\"toggleMenu()\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n aria-controls=\"byu-header-nav\"\n aria-label=\"Menu\">\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n </button>\n </div>\n <div class=\"bottom\">\n <nav id=\"byu-header-nav\" [class.open]=\"isMenuOpen()\">\n <ng-container *ngTemplateOutlet=\"signin\" />\n @for (menuItem of menu; track menuItem.text) {\n @if (isMenuLink(menuItem)) {\n @if (isMenuLinkVisible(menuItem)) {\n <byu-header-link [headerItem]=\"menuItem\" class=\"nav-item\" />\n }\n } @else {\n @if (isMenuDropdownVisible(menuItem)) {\n <div\n class=\"nav-item dropdown\"\n [class.open]=\"openDropdown === menuItem\">\n <button\n type=\"button\"\n class=\"nav-item-content\"\n (click)=\"toggleDropdown(menuItem)\"\n [attr.aria-expanded]=\"openDropdown === menuItem\">\n {{ menuItem.text }}\n </button>\n @if (openDropdown === menuItem) {\n <div class=\"dropdown-item-menu\">\n @for (dropItem of menuItem.items; track dropItem.text) {\n @if (isMenuLinkVisible(dropItem)) {\n <byu-header-link\n [headerItem]=\"dropItem\"\n itemType=\"dropdown\"\n class=\"dropdown-item\" />\n }\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n </div>\n</header>\n","import { Component, inject, Injectable } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n MatDialogModule,\n MAT_DIALOG_DATA,\n MatDialog,\n} from '@angular/material/dialog';\n\ntype ConfirmationConfig =\n | {\n title?: string;\n action?: string;\n description?: never;\n buttons?: readonly string[];\n }\n | {\n title?: string;\n action?: never;\n description?: string;\n buttons?: readonly string[];\n };\n\ntype ConfirmationResult<C extends ConfirmationConfig | undefined> = C extends {\n buttons: readonly string[];\n}\n ? C['buttons'][number]\n : boolean;\n\n@Component({\n selector: 'fhss-confirmation',\n imports: [MatDialogModule, MatButtonModule],\n templateUrl: './confirmation.dialog.html',\n styleUrl: './confirmation.dialog.scss',\n})\nclass ConfirmationDialogContainer {\n protected readonly config: ConfirmationConfig | undefined = inject<\n ConfirmationConfig | undefined\n >(MAT_DIALOG_DATA);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ConfirmationDialog {\n private readonly dialog = inject(MatDialog);\n\n open<C extends ConfirmationConfig | undefined>(config?: C) {\n const dialogRef = this.dialog.open<\n ConfirmationDialogContainer,\n ConfirmationConfig,\n ConfirmationResult<C>\n >(ConfirmationDialogContainer, {\n data: config,\n });\n\n return dialogRef;\n }\n}\n","<h2 mat-dialog-title>{{ config?.title ?? \"Are you sure?\"}}</h2>\n\n<mat-dialog-content>\n @if (config?.description) {\n <p>{{ config?.description }}</p>\n } @else {\n <p>Are you sure you would like to {{ config?.action ?? 'continue' }}?</p>\n }</mat-dialog-content\n>\n\n<mat-dialog-actions>\n @if (config?.buttons) { @for (name of config?.buttons; track name) {\n <button mat-button [mat-dialog-close]=\"name\">{{name}}</button>\n } } @else {\n <button mat-button [mat-dialog-close]=\"false\">No</button>\n <button mat-button [mat-dialog-close]=\"true\">Yes</button>\n }\n</mat-dialog-actions>\n","import { Component, input, model, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\n\ntype value = string | number;\nexport type Option = { label: string; value: value | null };\n\ntype Boolish = string | boolean | undefined;\nfunction fromBoolish(v: Boolish): boolean {\n if (v === undefined || v === false) return false;\n if (typeof v === 'string') {\n return v.trim().toLowerCase() !== 'false';\n }\n return true;\n}\n\n@Component({\n selector: 'fhss-combo-box',\n imports: [\n MatSelectModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n FormsModule,\n ],\n templateUrl: './combo-box.component.html',\n styleUrl: './combo-box.component.scss',\n})\nexport class ComboBoxComponent {\n options = input.required<Option[]>();\n placeholder = input.required<string>();\n appearance = input<'outline' | 'fill'>('fill');\n multiple = input<boolean, Boolish>(false, {\n transform: fromBoolish,\n });\n showClear = input<boolean, Boolish>(false, {\n transform: fromBoolish,\n });\n\n /**\n * Takes a signal to store the selected value(s) in.\n */\n selected = model.required<value[] | value | null>();\n\n filter = signal('');\n protected isOptionHidden = (opt: Option) =>\n !opt.label.toLowerCase().includes(this.filter().toLowerCase());\n\n clearSelected() {\n if (Array.isArray(this.selected())) {\n this.selected.set([]);\n } else {\n this.selected.set(null);\n }\n }\n}\n","<mat-form-field\n (click)=\"filter.set('')\"\n [appearance]=\"appearance()\"\n subscriptSizing=\"dynamic\">\n <mat-label>{{ placeholder() }}</mat-label>\n <mat-select [(ngModel)]=\"selected\" [multiple]=\"multiple()\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput placeholder=\"Search...\" [(ngModel)]=\"filter\" />\n <button mat-icon-button matSuffix (click)=\"filter.set('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n @for (option of options(); track option.value) {\n <mat-option\n [value]=\"option.value\"\n [class.hidden]=\"isOptionHidden(option)\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n\n @if (showClear()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"$event.stopPropagation(); clearSelected()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n</mat-form-field>\n","import { Provider } from '@angular/core';\nimport { FHSS_CONFIG, FhssConfig } from './lib.config';\n\nexport const provideFhss = (config: FhssConfig): Provider => ({\n provide: FHSS_CONFIG,\n useValue: config,\n});\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScrollRegistryService {\n private anchors = new Map<string, HTMLElement>();\n private pending = new Map<string, (() => void)[]>();\n\n register(key: string, el: HTMLElement) {\n this.anchors.set(key, el);\n const queue = this.pending.get(key);\n if (queue) {\n queue.forEach(fn => {\n fn();\n });\n this.pending.delete(key);\n }\n }\n\n unregister(key: string) {\n this.anchors.delete(key);\n }\n\n scrollTo(\n key: string,\n opts: ScrollIntoViewOptions & { delay?: number } = {\n behavior: 'smooth',\n block: 'center',\n delay: 0,\n }\n ) {\n setTimeout(() => {\n const el = this.anchors.get(key);\n if (el) el.scrollIntoView(opts);\n else {\n const q = this.pending.get(key) ?? [];\n q.push(() => this.anchors.get(key)?.scrollIntoView(opts));\n this.pending.set(key, q);\n }\n }, opts.delay ?? 0);\n }\n}\n","import {\n Directive,\n ElementRef,\n inject,\n input,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport { ScrollRegistryService } from '../services/scroll-registry/scroll-registry.service';\n\n@Directive({\n selector: '[scrollAnchor]',\n})\nexport class ScrollAnchorDirective implements OnInit, OnDestroy {\n private element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly registery = inject(ScrollRegistryService);\n scrollAnchor = input.required<string>();\n\n ngOnInit() {\n this.registery.register(this.scrollAnchor(), this.element.nativeElement);\n }\n\n ngOnDestroy() {\n this.registery.unregister(this.scrollAnchor());\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\n\n/**\n * This guard checks if the client is authenticated, redirecting to login if not.\n */\nexport const authGuard: CanActivateFn = async (_route, state) => {\n const authService = inject(AuthService);\n if (!(await authService.ready())) {\n await authService.login(state.url);\n return false;\n }\n return true;\n};\n","import { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\nimport { inject } from '@angular/core';\n\n/**\n * A permission-based route guard.\n *\n * This guard checks if the current user has the required permissions to access a route.\n * If the user is not authenticated, they are redirected to the login page.\n * If the user lacks the necessary permissions, they are redirected to the `/forbidden` page.\n *\n * Pass the Permission type to get intellisense on requiredPermissions\n * @param requiredPermissions - An array of permission strings that the user must have.\n * @param haveAll - If `true`, the user must have all required permissions. If `false` or omitted, the user must have at least one of the required permissions.\n * @returns A `CanActivateFn` function to be used as a route guard.\n *\n * @example\n * ```typescript\n * const routes: Routes = [\n * {\n * path: 'admin',\n * component: AdminPage,\n * canActivate: [permissionGuard<Permission>(['manage-users', 'see-data'], true)],\n * },\n * ];\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nexport const permissionGuard: <Permission extends string>(\n requiredPermissions: Permission[],\n haveAll?: boolean\n) => CanActivateFn = (reqPerms, haveAll) => {\n return async (_route, state) => {\n const router = inject(Router);\n const authService = inject(AuthService);\n\n if (!(await authService.ready())) {\n await authService.login(state.url);\n return false;\n }\n\n const hasAccess = reqPerms[haveAll ? 'every' : 'some'](role =>\n authService.effectivePermissions().has(role)\n );\n\n return hasAccess || router.parseUrl('/forbidden');\n };\n};\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router, UrlTree } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\nimport { FHSS_CONFIG } from '../../config/lib.config';\n\n/**\n * Guard factory that returns a CanActivateFn which redirects an authenticated user\n * to their default \"home\" page based on their role, or to a provided fallback.\n *\n * @param fallbackRedirect - Route path string or UrlTree to use when no role matches or no user is present.\n * @returns A CanActivateFn that resolves to an UrlTree to perform the redirect.\n */\nexport function homeRedirectGuard(\n fallbackRedirect: string | UrlTree\n): CanActivateFn {\n return async () => {\n const { defaultHomePages } = inject(FHSS_CONFIG);\n const router = inject(Router);\n const auth = inject(AuthService);\n const user = await auth.ready();\n\n for (const [role, path] of Object.entries(defaultHomePages)) {\n if (user?.roles.includes(role)) {\n if (path !== undefined) {\n return router.parseUrl(path);\n }\n }\n }\n\n return typeof fallbackRedirect === 'string'\n ? router.parseUrl(fallbackRedirect)\n : fallbackRedirect;\n };\n}\n","import { Component, input } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport type SystemConfig = {\n title?: string;\n message?: string;\n image?: string;\n};\n\n@Component({\n selector: 'fhss-system-page',\n imports: [MatButtonModule],\n templateUrl: './system.page.html',\n styleUrl: './system.page.scss',\n})\nexport class SystemPage {\n readonly config = input.required<SystemConfig>();\n}\n","@let title = config().title; @let message = config().message; @let image =\nconfig().image;\n\n<div class=\"container\">\n @if (image) {\n <div [class]=\"['image', image]\"></div>\n }\n <h1>{{ title ?? 'Application Error' }}</h1>\n <p>{{ message ?? 'Oops! Something went wrong!' }}</p>\n <a mat-flat-button href=\"/\">Go back home</a>\n</div>\n","import { Component } from '@angular/core';\nimport { SystemPage, SystemConfig } from '../system/system.page';\n\n@Component({\n selector: 'fhss-auth-error',\n imports: [SystemPage],\n templateUrl: './auth-error.page.html',\n styleUrl: './auth-error.page.scss',\n})\nexport class AuthErrorPage {\n protected readonly config: SystemConfig = {\n title: 'Login Failed',\n message: 'Something went wrong while trying to log you in.',\n image: 'sad-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","import { Component } from '@angular/core';\nimport { SystemConfig, SystemPage } from '../system/system.page';\n\n@Component({\n selector: 'fhss-forbidden',\n imports: [SystemPage],\n templateUrl: './forbidden.page.html',\n styleUrl: './forbidden.page.scss',\n})\nexport class ForbiddenPage {\n protected readonly config: SystemConfig = {\n title: '403 - Forbidden',\n message: \"You don't have permission to access this page.\",\n image: 'police-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","import { Component } from '@angular/core';\nimport { SystemPage, SystemConfig } from '../system/system.page';\n\n@Component({\n selector: 'fhss-not-found',\n imports: [SystemPage],\n templateUrl: './not-found.page.html',\n styleUrl: './not-found.page.scss',\n})\nexport class NotFoundPage {\n protected readonly config: SystemConfig = {\n title: '404 - Page not found',\n message: \"The page you are looking for doesn't exist or it may have moved.\",\n image: 'confused-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","import { Component } from '@angular/core';\nimport { SystemConfig, SystemPage } from '../system/system.page';\n\n@Component({\n selector: 'fhss-server-error',\n imports: [SystemPage],\n templateUrl: './server-error.page.html',\n styleUrl: './server-error.page.scss',\n})\nexport class ServerErrorPage {\n protected readonly config: SystemConfig = {\n title: '500 - Internal Server Error',\n message: 'We ran into an unexpected error!',\n image: 'error-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","type Ok<T> = { ok: true; value: T };\ntype Err<E = unknown> = { ok: false; error: E };\nexport type Result<T, E> = Ok<T> | Err<E>;\n\nexport function ok<T = undefined>(value?: T): Ok<T>;\nexport function ok(value?: unknown): Ok<unknown> {\n return {\n ok: true,\n value,\n };\n}\n\nexport function err<E>(error: E): Err<E> {\n return {\n ok: false,\n error,\n };\n}\n","import { err as _err, ok as _ok, Result } from '../../utils/result';\n\nexport type FileData = {\n contentType: string;\n size: number;\n fileName: string;\n};\n\nexport type UploadUrlGenerator<E> = (\n fileData: FileData,\n ok: typeof _ok,\n err: typeof _err\n) => Promise<Result<{ url: string; key: string }, E>>;\n\nexport type RequestError = 'Network error during upload' | 'Upload failed';\nexport type UploadError =\n | 'Disabled component'\n | 'No file'\n | 'Url generation failed'\n | 'Unknown'\n | RequestError;\n\nexport type FileType =\n | 'image/gif'\n | '.gif'\n | 'image/avif'\n | '.avif'\n | 'image/jpeg'\n | '.jpeg'\n | 'image/png'\n | '.png'\n | 'image/svg+xml'\n | '.svg'\n | 'image/webp'\n | '.webp'\n | 'image/*'\n | 'application/pdf'\n | '.pdf'\n | 'application/msword'\n | '.doc'\n | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n | '.docx'\n | 'text/markdown'\n | '.md'\n | 'text/plain'\n | '.txt'\n | 'text/csv'\n | '.csv'\n | 'application/vnd.ms-excel'\n | '.xls'\n | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n | '.xlsx'\n | 'application/vnd.ms-powerpoint'\n | '.ppt'\n | 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n | '.pptx'\n | 'audio/mpeg'\n | '.mp3'\n | 'audio/*'\n | 'video/mp4'\n | '.mp4'\n | 'video/mpeg'\n | '.mpeg'\n | 'video/*'\n | 'application/zip'\n | '.zip'\n | 'application/x-zip-compressed'\n | 'application/xml'\n | '.xml'\n | 'application/json'\n | '.json';\n\nexport type FileLabel =\n | 'image'\n | 'document'\n | 'spreadsheet'\n | 'presentation'\n | 'audio'\n | 'video'\n | 'archive'\n | 'data'\n | 'gif'\n | 'avif'\n | 'jpeg'\n | 'png'\n | 'svg'\n | 'webp'\n | 'pdf'\n | 'word'\n | 'markdown'\n | 'text'\n | 'csv'\n | 'excel'\n | 'powerpoint'\n | 'mp3'\n | 'mpeg'\n | 'mp4'\n | 'zip'\n | 'xml'\n | 'json';\n\nexport const FileTypeMap: Record<FileLabel, FileType[]> = {\n gif: ['image/gif', '.gif'],\n avif: ['image/avif', '.avif'],\n jpeg: ['image/jpeg', '.jpeg'],\n png: ['image/png', '.png'],\n svg: ['image/svg+xml', '.svg'],\n webp: ['image/webp', '.webp'],\n pdf: ['application/pdf', '.pdf'],\n word: [\n 'application/msword',\n '.doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.docx',\n ],\n markdown: ['text/markdown', '.md'],\n text: ['text/plain', '.txt'],\n csv: ['text/csv', '.csv'],\n excel: [\n 'application/vnd.ms-excel',\n '.xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.xlsx',\n ],\n powerpoint: [\n 'application/vnd.ms-powerpoint',\n '.ppt',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.pptx',\n ],\n mpeg: ['video/mpeg', '.mpeg'],\n mp4: ['video/mp4', '.mp4'],\n mp3: ['audio/mpeg', '.mp3'],\n zip: ['application/zip', '.zip', 'application/x-zip-compressed'],\n xml: ['application/xml', '.xml'],\n json: ['application/json', '.json'],\n image: ['image/*'],\n document: [\n 'application/msword',\n '.doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.docx',\n 'application/pdf',\n '.pdf',\n 'text/markdown',\n '.md',\n 'text/plain',\n '.txt',\n ],\n spreadsheet: [\n 'application/vnd.ms-excel',\n '.xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.xlsx',\n 'text/csv',\n '.csv',\n ],\n presentation: [\n '.ppt',\n 'application/vnd.ms-powerpoint',\n '.pptx',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n ],\n audio: ['audio/*'],\n video: ['video/*'],\n archive: ['application/zip', '.zip', 'application/x-zip-compressed'],\n data: ['application/xml', '.xml', 'application/json', '.json'],\n} as const;\n","import { err, ok, Result } from '../../utils/result';\nimport { FileLabel, FileTypeMap } from './file.types';\n\ntype DownloadError = 'Not Found' | 'Unknown';\n\n/**\n * Downloads a file from the specified URL.\n *\n * This function performs a HEAD request to check if the file is available\n * before initiating the download. If the file is available, it uses a\n * temporary <a> to initiate a browser download.\n *\n * @param url - The URL of the file to download.\n * @returns A promise that resolves to a Result.\n */\nexport async function downloadFileFrom(\n url: string\n): Promise<Result<void, DownloadError>> {\n const head = await fetch(url, { method: 'HEAD' });\n if (!head.ok) {\n if (head.status === 404) return err('Not Found');\n else return err('Unknown');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n return ok();\n}\n\n/**\n * Generates a comma-separated string of unique file types from the given file label groups.\n * This allows the developer to easily define the `<input type=\"file\" />`'s `accept` property.\n * @param groups - An array of file labels to retrieve file types for.\n * @returns A comma-separated string of unique file types.\n */\nexport function getFileTypes(groups: FileLabel[]): string {\n const allTypes = groups.flatMap(label => FileTypeMap[label]);\n const uniqueTypes = Array.from(new Set(allTypes));\n return uniqueTypes.join(',');\n}\n\nexport type UploadError = 'Network error during upload' | 'Upload failed';\n\n/**\n * Uploads a file to the specified URL using XMLHttpRequest.\n *\n * @param file - The file to upload\n * @param url - The URL endpoint where the file will be uploaded (PUT request)\n * @param setProgress - Optional callback function to track upload progress as a percentage (0-100)\n * @returns A promise that resolves to a Result object containing either void on success or an UploadError on failure\n */\nexport function uploadFile(\n file: File,\n url: string,\n setProgress?: (percent: number) => void\n) {\n return new Promise<Result<void, UploadError>>(resolve => {\n const xhr = new XMLHttpRequest();\n\n xhr.open('PUT', url, true);\n xhr.setRequestHeader('Content-Type', file.type);\n\n if (setProgress) {\n setProgress(0);\n xhr.upload.onprogress = ev => {\n if (ev.lengthComputable) {\n const pct = Math.floor((ev.loaded / ev.total) * 100);\n setProgress(pct);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(ok());\n } else {\n resolve(err('Upload failed'));\n }\n };\n\n xhr.onerror = () => {\n resolve(err('Network error during upload'));\n };\n\n xhr.send(file);\n });\n}\n","import {\n computed,\n effect,\n inject,\n Injector,\n linkedSignal,\n signal,\n} from '@angular/core';\nimport { isTRPCClientError, Resolver } from '@trpc/client';\nimport {\n ResolverDef,\n TrpcResource,\n TrpcResourceOptions,\n} from './trpcResource.types';\n\nfunction trpcResource<TDef extends ResolverDef>(\n procedure: Resolver<TDef>,\n input: () => TDef['input'] | undefined,\n options?: TrpcResourceOptions<TDef['output']>\n): TrpcResource<TDef> {\n const currentInput = computed(input);\n\n const value = linkedSignal<TDef['output'] | undefined>(\n options?.valueComputation ??\n (() => options?.initialValue ?? options?.defaultValue),\n { equal: options?.equal }\n );\n const error = signal<TDef['errorShape'] | undefined>(undefined);\n const isLoading = signal<boolean>(false);\n\n if (options?.autoRefresh) {\n effect(\n onCleanup => {\n // pass abort signal to refresh on cleanup of effect\n const controller = new AbortController();\n onCleanup(() => {\n controller.abort();\n });\n\n // call refresh with this abort controller\n // refresh reads currentInput which triggers the effect\n refresh(controller.signal, true);\n },\n { injector: options.injector ?? inject(Injector) }\n );\n }\n\n const refresh = async (\n abortSignal?: AbortSignal,\n keepLoadingThroughAbort = true\n ): Promise<boolean> => {\n // if we have the special case where the current input is undefined\n // then set everything to it's initial state\n if (currentInput() === undefined) {\n value.set(options?.initialValue ?? options?.defaultValue);\n error.set(undefined);\n isLoading.set(false);\n return true;\n }\n\n // Reset signals for a fresh request.\n isLoading.set(true);\n error.set(undefined);\n\n try {\n value.set(\n await procedure(currentInput(), {\n signal: abortSignal,\n })\n );\n error.set(undefined);\n } catch (err) {\n if (isTRPCClientError(err)) {\n // if the trpc request was aborted\n // we check if we would like to continue loading (the next request)\n // if so then we just leave this refresh in an undefined state\n // else we error as usual\n if (err.cause?.name === 'AbortError' && keepLoadingThroughAbort) {\n return false;\n }\n error.set(err);\n } else {\n // Fallback for non-Error values\n console.error(\n 'A non-tRPC error has occured on this trpcResource: ',\n String(err)\n );\n }\n value.set(options?.defaultValue);\n }\n isLoading.set(false);\n return !error();\n };\n\n return {\n value,\n error,\n isLoading,\n refresh,\n };\n}\n\nfunction debugTrpcResource<TDef extends ResolverDef>(\n _trpcResource: TrpcResource<TDef>\n) {\n return {\n value: _trpcResource.value(),\n error: _trpcResource.error(),\n isLoading: _trpcResource.isLoading(),\n };\n}\n\nexport { debugTrpcResource, trpcResource };\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { effect, signal, Signal } from '@angular/core';\n\nexport const debounced = <T>(inputSignal: Signal<T>, wait = 400) => {\n const debouncedSignal = signal<T>(inputSignal());\n const setSignal = debounce(value => {\n debouncedSignal.set(value);\n }, wait);\n\n effect(() => {\n setSignal(inputSignal());\n });\n\n return debouncedSignal;\n};\n\nconst debounce = (callback: (...args: any[]) => void, wait: number) => {\n let timeoutId: number | undefined;\n return (...args: any[]) => {\n window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => {\n callback(...args);\n }, wait);\n };\n};\n","/**\n * Components\n */\nexport * from './lib/components/byu-footer/byu-footer.component';\nexport { ByuHeaderComponent } from './lib/components/byu-header/byu-header.component';\nexport type { HeaderConfig } from './lib/components/byu-header/byu-header.component';\nexport * from './lib/components/confirmation/confirmation.dialog';\nexport * from './lib/components/combo-box/combo-box.component';\n\n/**\n * Config\n */\nexport * from './lib/config/lib.config';\nexport * from './lib/config/utils.config';\n\n/**\n * Directives\n */\nexport * from './lib/directives/scroll-anchor.directive';\n\n/**\n * Guards\n */\nexport * from './lib/guards/auth/auth.guard';\nexport * from './lib/guards/permission/permission.guard';\nexport * from './lib/guards/home-redirect/home-redirect.guard';\n\n/**\n * Pages\n */\nexport * from './lib/pages/auth-error/auth-error.page';\nexport * from './lib/pages/forbidden/forbidden.page';\nexport * from './lib/pages/not-found/not-found.page';\nexport * from './lib/pages/server-error/server-error.page';\n\n/**\n * Services\n */\nexport * from './lib/services/auth/auth.service';\nexport * from './lib/services/file/file';\nexport * from './lib/services/scroll-registry/scroll-registry.service';\n\n/**\n * Signals\n */\nexport * from './lib/signals/trpcResource/trpcResource';\nexport * from './lib/signals/debounced/debounced';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"fhss-web-team-frontend-utils.mjs","sources":["../../../projects/frontend-utils/src/lib/components/byu-footer/byu-footer.component.ts","../../../projects/frontend-utils/src/lib/components/byu-footer/byu-footer.component.html","../../../projects/frontend-utils/src/lib/config/lib.config.ts","../../../projects/frontend-utils/src/lib/services/auth/auth.service.ts","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header-link/byu-header-link.ts","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header-link/byu-header-link.html","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header.component.ts","../../../projects/frontend-utils/src/lib/components/byu-header/byu-header.component.html","../../../projects/frontend-utils/src/lib/components/confirmation/confirmation.dialog.ts","../../../projects/frontend-utils/src/lib/components/confirmation/confirmation.dialog.html","../../../projects/frontend-utils/src/lib/components/combo-box/combo-box.component.ts","../../../projects/frontend-utils/src/lib/components/combo-box/combo-box.component.html","../../../projects/frontend-utils/src/lib/config/utils.config.ts","../../../projects/frontend-utils/src/lib/services/scroll-registry/scroll-registry.service.ts","../../../projects/frontend-utils/src/lib/directives/scroll-anchor.directive.ts","../../../projects/frontend-utils/src/lib/guards/auth/auth.guard.ts","../../../projects/frontend-utils/src/lib/guards/permission/permission.guard.ts","../../../projects/frontend-utils/src/lib/guards/home-redirect/home-redirect.guard.ts","../../../projects/frontend-utils/src/lib/pages/system/system.page.ts","../../../projects/frontend-utils/src/lib/pages/system/system.page.html","../../../projects/frontend-utils/src/lib/pages/auth-error/auth-error.page.ts","../../../projects/frontend-utils/src/lib/pages/auth-error/auth-error.page.html","../../../projects/frontend-utils/src/lib/pages/forbidden/forbidden.page.ts","../../../projects/frontend-utils/src/lib/pages/forbidden/forbidden.page.html","../../../projects/frontend-utils/src/lib/pages/not-found/not-found.page.ts","../../../projects/frontend-utils/src/lib/pages/not-found/not-found.page.html","../../../projects/frontend-utils/src/lib/pages/server-error/server-error.page.ts","../../../projects/frontend-utils/src/lib/pages/server-error/server-error.page.html","../../../projects/frontend-utils/src/lib/utils/result.ts","../../../projects/frontend-utils/src/lib/services/file/file.types.ts","../../../projects/frontend-utils/src/lib/services/file/file.ts","../../../projects/frontend-utils/src/lib/signals/trpcResource/trpcResource.ts","../../../projects/frontend-utils/src/lib/signals/debounced/debounced.ts","../../../projects/frontend-utils/src/public-api.ts","../../../projects/frontend-utils/src/fhss-web-team-frontend-utils.ts"],"sourcesContent":["import { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'byu-footer',\n imports: [],\n templateUrl: './byu-footer.component.html',\n styleUrl: './byu-footer.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class ByuFooterComponent {\n currentYear: number = new Date().getFullYear(); // Automatically updates the year\n}\n","<footer>\n <p class=\"title\">\n <a href=\"https://www.byu.edu/\">BRIGHAM YOUNG UNIVERSITY</a>\n </p>\n <p>Provo, UT 84602, USA | © {{ currentYear }} All rights reserved.</p>\n <p>\n <a href=\"https://privacy.byu.edu/privacy-notice\">Privacy Notice</a> |\n <a href=\"https://privacy.byu.edu/cookie-prefs\">Cookie Preferences</a>\n </p>\n</footer>\n","import { InjectionToken } from '@angular/core';\n\nexport const FHSS_CONFIG = new InjectionToken<FhssConfig>('FHSS_CONFIG');\n\nexport type FhssConfig = {\n rolePermissionMap: Record<string, string[]>;\n defaultHomePages: Partial<Record<string, string>>;\n};\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { FHSS_CONFIG } from '../../config/lib.config';\nimport { z } from 'zod';\n\nconst authUserSchema = z\n .object({\n id: z.string(),\n preferredFirstName: z.string(),\n preferredLastName: z.string(),\n roles: z.string().array(),\n permissions: z.string().array(),\n })\n .nullable();\n\ntype AuthUser = z.infer<typeof authUserSchema>;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n private readonly FhssConfig = inject(FHSS_CONFIG);\n private readonly readyPromise: Promise<AuthUser>;\n\n constructor() {\n this.readyPromise = this.whoAmI();\n }\n\n /**\n * Returns a promise that resolves when the authentication service is ready.\n */\n ready() {\n return this.readyPromise;\n }\n\n /**\n * Updates the authentication state by retrieving the current user's information.\n *\n * @returns A promise containing the current user's authentication details.\n */\n update() {\n return this.whoAmI();\n }\n\n readonly authenticated = signal(false);\n readonly userId = signal<string | undefined>(undefined);\n readonly preferredFirstName = signal<string | undefined>(undefined);\n readonly preferredLastName = signal<string | undefined>(undefined);\n readonly roles = signal<string[]>([]);\n readonly permissions = signal<string[]>([]);\n\n /**\n * Contains all of the user's permissions, meaning those explicitly given, as well as\n * those provided by the user's roles.\n *\n * The result is a `Set` containing all unique permissions granted to the user.\n */\n readonly effectivePermissions = computed(\n () =>\n new Set(\n this.roles()\n .flatMap(role => this.FhssConfig.rolePermissionMap[role])\n .concat(this.permissions())\n )\n );\n\n /**\n * Computes the user's preferred full name by concatenating the preferred first name\n * and, if available, the preferred last name separated by a space.\n * If the preferred first name is not set, an empty string is used.\n * If the preferred last name is not set, only the first name is returned.\n *\n * @returns The computed preferred full name as a string.\n */\n readonly preferredName = computed(() => {\n const prefLast = this.preferredLastName();\n return `${this.preferredFirstName() ?? ''}${prefLast ? ` ${prefLast}` : ''}`;\n });\n\n private resetAuthState() {\n this.authenticated.set(false);\n this.userId.set(undefined);\n this.preferredFirstName.set(undefined);\n this.preferredLastName.set(undefined);\n this.roles.set([]);\n this.permissions.set([]);\n }\n\n private setUser(user: NonNullable<AuthUser>) {\n this.authenticated.set(true);\n this.userId.set(user.id);\n this.preferredFirstName.set(user.preferredFirstName);\n this.preferredLastName.set(user.preferredLastName);\n this.roles.set(user.roles);\n this.permissions.set(user.permissions);\n }\n\n /**\n * Redirects the user to the login page.\n *\n * @param nextUri - (Optional) The URI to redirect to after login.\n */\n login(nextUri?: string): Promise<void> {\n window.location.href = `/login${nextUri ? `?next_uri=${nextUri}` : ''}`;\n return new Promise(() => {\n console.log('redirecting to login');\n });\n }\n\n /**\n * Logs the user out by resetting the authentication state and redirecting to the logout page.\n */\n logout() {\n this.resetAuthState();\n window.location.href = '/logout';\n return new Promise(() => {\n console.log('redirecting to logout');\n });\n }\n\n /**\n * Retrieves information about the currently authenticated user.\n *\n * @returns A promise that resolves to a `WhoAmI` object\n * representing the current user, or `null` if not authenticated or on error.\n */\n private async whoAmI(): Promise<AuthUser | null> {\n try {\n const res = await fetch('/sys/who-am-i');\n const user = authUserSchema.parse(await res.json());\n if (!user) {\n this.resetAuthState();\n return null;\n }\n this.setUser(user);\n return user;\n } catch {\n this.resetAuthState();\n return null;\n }\n }\n}\n","import { Component, computed, input } from '@angular/core';\nimport { RouterLink, RouterLinkActive, UrlTree } from '@angular/router';\n\nexport type HeaderLink = {\n /** text content of link */\n text: string;\n\n /**\n * If the path is a string that starts with `http`, it will be used as an absolute path for the href\n *\n * Else it will be used as a relative path for the routerLink\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n path: string | readonly any[] | UrlTree | null | undefined;\n\n /** if the link should open in a new tab */\n newTab?: boolean;\n};\n\n@Component({\n selector: 'byu-header-link',\n imports: [RouterLink, RouterLinkActive],\n templateUrl: 'byu-header-link.html',\n styleUrl: 'byu-header-link.scss',\n})\nexport class NormalizedHeaderItem {\n headerItem = input.required<HeaderLink | string>();\n\n normalizeHeaderItem = computed(() => {\n const item = this.headerItem();\n if (typeof item === 'string') {\n return {\n text: item,\n routerLink: null,\n href: null,\n newTab: null,\n };\n } else {\n const httpPath =\n typeof item.path === 'string' && item.path.startsWith('http')\n ? item.path\n : null;\n return {\n text: item.text,\n routerLink: httpPath === null ? item.path : null,\n href: httpPath,\n newTab: item.newTab ?? false,\n };\n }\n });\n}\n","@let item = normalizeHeaderItem(); @if (item.routerLink) {\n<a\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active\"\n [target]=\"item.newTab ? '_blank' : '_self'\"\n >{{ item.text }}</a\n>\n} @else if (item.href) {\n<a [href]=\"item.href\" [target]=\"item.newTab ? '_blank' : '_self'\"\n >{{ item.text }}</a\n>\n} @else {\n<a>{{ item.text }}</a>\n}\n","import {\n Component,\n input,\n inject,\n signal,\n HostListener,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { UrlTree, RouterLink } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\nimport {\n HeaderLink,\n NormalizedHeaderItem,\n} from './byu-header-link/byu-header-link';\n\ntype MenuLink<T extends string> = {\n /** text content of the link */\n text: string;\n\n /**\n * If the link is a string that starts with `http`, it will be used as an absolute path for the href\n *\n * Else it will be used as a relative path for the routerLink\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n path: string | readonly any[] | UrlTree | null | undefined;\n\n /** if the link should open in a new tab */\n newTab?: boolean;\n\n /** list of permissions that a user must have at least one of to see the link */\n requiredPermissions?: T[];\n\n /** if instead the user should have all of the required permissions */\n haveAll?: boolean;\n\n /** if the user must be authenticated to see the link */\n needsAuthentication?: boolean;\n};\n\ntype MenuDropdown<T extends string> = {\n /** text content of the link */\n text: string;\n\n /** items to display in the dropdown menu */\n items: MenuLink<T>[];\n};\n\ntype HeaderMenu<T extends string> = MenuLink<T> | MenuDropdown<T>;\n\nexport type HeaderConfig<Permission extends string> = {\n /** Main site title: a link or plain text */\n title: HeaderLink | string;\n\n /** Optional subtitle: a link or plain text */\n subtitle?: HeaderLink | string;\n\n /** Optional breadcrumbs for navigational context: links or plain texts */\n breadcrumbs?: (HeaderLink | string)[];\n\n /** Optional menu items: links or dropdowns, potentially restricted by authentication or permissions */\n menu?: HeaderMenu<Permission>[];\n};\n\n@Component({\n selector: 'byu-header',\n imports: [NormalizedHeaderItem, NgTemplateOutlet, RouterLink],\n templateUrl: './byu-header.component.html',\n styleUrl: './byu-header.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n})\nexport class ByuHeaderComponent {\n auth = inject(AuthService);\n config = input.required<HeaderConfig<string>>();\n\n openDropdown: MenuDropdown<string> | null = null;\n isMenuOpen = signal(false);\n\n isMenuLink(item: HeaderMenu<string>): item is MenuLink<string> {\n return 'path' in item;\n }\n\n isMenuLinkVisible(link: MenuLink<string>) {\n return link.requiredPermissions !== undefined\n ? link.requiredPermissions[link.haveAll ? 'every' : 'some'](permission =>\n this.auth.effectivePermissions().has(permission)\n )\n : this.auth.authenticated() || !link.needsAuthentication;\n }\n\n isMenuDropdownVisible(dropdown: MenuDropdown<string>) {\n return dropdown.items.some(item => this.isMenuLinkVisible(item));\n }\n\n toggleDropdown(dropdown: MenuDropdown<string>) {\n this.openDropdown = this.openDropdown === dropdown ? null : dropdown;\n }\n\n toggleMenu() {\n this.isMenuOpen.update(prev => !prev);\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(ev: MouseEvent) {\n const path = ev.composedPath();\n const target = path[0];\n\n if (target instanceof Element) {\n if (target.className !== 'nav-item-content') {\n this.openDropdown = null;\n\n if (target.className !== 'hamburger' && target.className !== 'bar') {\n this.isMenuOpen.set(false);\n }\n }\n }\n }\n}\n","@let title = config().title;\n@let subtitle = config().subtitle;\n@let breadcrumbs = config().breadcrumbs;\n@let menu = config().menu;\n@let authenticated = auth.authenticated();\n\n<ng-template #signin>\n <button class=\"signin\" (click)=\"authenticated ? auth.logout() : auth.login()\">\n <span>{{ auth.preferredName() }}</span>\n <svg\n class=\"signin-icon\"\n aria-hidden=\"true\"\n focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\">\n <path\n fill=\"currentcolor\"\n d=\"M50 95c-26 0-34-18-34-18 3-12 8-18 17-18 5 5 10 7 17 7s12-2 17-7c9 0 14 6 17 18 0 0-7 18-34 18z\"></path>\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n fill=\"none\"\n stroke=\"currentcolor\"\n stroke-width=\"10\"></circle>\n <circle fill=\"currentcolor\" cx=\"50\" cy=\"40\" r=\"20\"></circle>\n </svg>\n <span class=\"signin-link\">{{\n authenticated ? 'Sign Out' : 'Sign In'\n }}</span>\n </button>\n</ng-template>\n\n<a class=\"skip-to-main-content\" [routerLink]=\"[]\" fragment=\"maincontent\">\n Skip to main content\n</a>\n\n<header>\n <div class=\"top\">\n <a\n href=\"https://www.byu.edu\"\n class=\"logo\"\n aria-label=\"Brigham Young University home\">\n </a>\n <div class=\"titles\">\n <div class=\"breadcrumbs\">\n @for (breadcrumb of breadcrumbs; track breadcrumb) {\n <byu-header-link [headerItem]=\"breadcrumb\" class=\"breadcrumb\" />\n }\n </div>\n <byu-header-link [headerItem]=\"title\" class=\"title\" />\n @if (subtitle) {\n <byu-header-link [headerItem]=\"subtitle\" class=\"subtitle\" />\n }\n </div>\n <ng-container *ngTemplateOutlet=\"signin\" />\n <button\n type=\"button\"\n class=\"hamburger\"\n [class.open]=\"isMenuOpen()\"\n (click)=\"toggleMenu()\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n aria-controls=\"byu-header-nav\"\n aria-label=\"Menu\">\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n <div class=\"bar\"></div>\n </button>\n </div>\n <div class=\"bottom\">\n <nav id=\"byu-header-nav\" [class.open]=\"isMenuOpen()\">\n <ng-container *ngTemplateOutlet=\"signin\" />\n @for (menuItem of menu; track menuItem.text) {\n @if (isMenuLink(menuItem)) {\n @if (isMenuLinkVisible(menuItem)) {\n <byu-header-link [headerItem]=\"menuItem\" class=\"nav-item\" />\n }\n } @else {\n @if (isMenuDropdownVisible(menuItem)) {\n <div\n class=\"nav-item dropdown\"\n [class.open]=\"openDropdown === menuItem\">\n <button\n type=\"button\"\n class=\"nav-item-content\"\n (click)=\"toggleDropdown(menuItem)\"\n [attr.aria-expanded]=\"openDropdown === menuItem\">\n {{ menuItem.text }}\n </button>\n @if (openDropdown === menuItem) {\n <div class=\"dropdown-item-menu\">\n @for (dropItem of menuItem.items; track dropItem.text) {\n @if (isMenuLinkVisible(dropItem)) {\n <byu-header-link\n [headerItem]=\"dropItem\"\n itemType=\"dropdown\"\n class=\"dropdown-item\" />\n }\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n </div>\n</header>\n","import { Component, inject, Injectable } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n MatDialogModule,\n MAT_DIALOG_DATA,\n MatDialog,\n} from '@angular/material/dialog';\n\ntype ConfirmationConfig =\n | {\n title?: string;\n action?: string;\n description?: never;\n buttons?: readonly string[];\n }\n | {\n title?: string;\n action?: never;\n description?: string;\n buttons?: readonly string[];\n };\n\ntype ConfirmationResult<C extends ConfirmationConfig | undefined> = C extends {\n buttons: readonly string[];\n}\n ? C['buttons'][number]\n : boolean;\n\n@Component({\n selector: 'fhss-confirmation',\n imports: [MatDialogModule, MatButtonModule],\n templateUrl: './confirmation.dialog.html',\n styleUrl: './confirmation.dialog.scss',\n})\nclass ConfirmationDialogContainer {\n protected readonly config: ConfirmationConfig | undefined = inject<\n ConfirmationConfig | undefined\n >(MAT_DIALOG_DATA);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ConfirmationDialog {\n private readonly dialog = inject(MatDialog);\n\n open<C extends ConfirmationConfig | undefined>(config?: C) {\n const dialogRef = this.dialog.open<\n ConfirmationDialogContainer,\n ConfirmationConfig,\n ConfirmationResult<C>\n >(ConfirmationDialogContainer, {\n data: config,\n });\n\n return dialogRef;\n }\n}\n","<h2 mat-dialog-title>{{ config?.title ?? \"Are you sure?\"}}</h2>\n\n<mat-dialog-content>\n @if (config?.description) {\n <p>{{ config?.description }}</p>\n } @else {\n <p>Are you sure you would like to {{ config?.action ?? 'continue' }}?</p>\n }</mat-dialog-content\n>\n\n<mat-dialog-actions>\n @if (config?.buttons) { @for (name of config?.buttons; track name) {\n <button mat-button [mat-dialog-close]=\"name\">{{name}}</button>\n } } @else {\n <button mat-button [mat-dialog-close]=\"false\">No</button>\n <button mat-button [mat-dialog-close]=\"true\">Yes</button>\n }\n</mat-dialog-actions>\n","import { Component, input, model, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\n\ntype value = string | number;\nexport type Option = { label: string; value: value | null };\n\ntype Boolish = string | boolean | undefined;\nfunction fromBoolish(v: Boolish): boolean {\n if (v === undefined || v === false) return false;\n if (typeof v === 'string') {\n return v.trim().toLowerCase() !== 'false';\n }\n return true;\n}\n\n@Component({\n selector: 'fhss-combo-box',\n imports: [\n MatSelectModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n FormsModule,\n ],\n templateUrl: './combo-box.component.html',\n styleUrl: './combo-box.component.scss',\n})\nexport class ComboBoxComponent {\n options = input.required<Option[]>();\n placeholder = input.required<string>();\n appearance = input<'outline' | 'fill'>('fill');\n multiple = input<boolean, Boolish>(false, {\n transform: fromBoolish,\n });\n showClear = input<boolean, Boolish>(false, {\n transform: fromBoolish,\n });\n\n /**\n * Takes a signal to store the selected value(s) in.\n */\n selected = model.required<value[] | value | null>();\n\n filter = signal('');\n protected isOptionHidden = (opt: Option) =>\n !opt.label.toLowerCase().includes(this.filter().toLowerCase());\n\n clearSelected() {\n if (Array.isArray(this.selected())) {\n this.selected.set([]);\n } else {\n this.selected.set(null);\n }\n }\n}\n","<mat-form-field\n (click)=\"filter.set('')\"\n [appearance]=\"appearance()\"\n subscriptSizing=\"dynamic\">\n <mat-label>{{ placeholder() }}</mat-label>\n <mat-select [(ngModel)]=\"selected\" [multiple]=\"multiple()\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput placeholder=\"Search...\" [(ngModel)]=\"filter\" />\n <button mat-icon-button matSuffix (click)=\"filter.set('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n @for (option of options(); track option.value) {\n <mat-option\n [value]=\"option.value\"\n [class.hidden]=\"isOptionHidden(option)\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n\n @if (showClear()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"$event.stopPropagation(); clearSelected()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n</mat-form-field>\n","import { Provider } from '@angular/core';\nimport { FHSS_CONFIG, FhssConfig } from './lib.config';\n\nexport const provideFhss = (config: FhssConfig): Provider => ({\n provide: FHSS_CONFIG,\n useValue: config,\n});\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScrollRegistryService {\n private anchors = new Map<string, HTMLElement>();\n private pending = new Map<string, (() => void)[]>();\n\n register(key: string, el: HTMLElement) {\n this.anchors.set(key, el);\n const queue = this.pending.get(key);\n if (queue) {\n queue.forEach(fn => {\n fn();\n });\n this.pending.delete(key);\n }\n }\n\n unregister(key: string) {\n this.anchors.delete(key);\n }\n\n scrollTo(\n key: string,\n opts: ScrollIntoViewOptions & { delay?: number } = {\n behavior: 'smooth',\n block: 'center',\n delay: 0,\n }\n ) {\n setTimeout(() => {\n const el = this.anchors.get(key);\n if (el) el.scrollIntoView(opts);\n else {\n const q = this.pending.get(key) ?? [];\n q.push(() => this.anchors.get(key)?.scrollIntoView(opts));\n this.pending.set(key, q);\n }\n }, opts.delay ?? 0);\n }\n}\n","import {\n Directive,\n ElementRef,\n inject,\n input,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport { ScrollRegistryService } from '../services/scroll-registry/scroll-registry.service';\n\n@Directive({\n selector: '[scrollAnchor]',\n})\nexport class ScrollAnchorDirective implements OnInit, OnDestroy {\n private element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly registery = inject(ScrollRegistryService);\n scrollAnchor = input.required<string>();\n\n ngOnInit() {\n this.registery.register(this.scrollAnchor(), this.element.nativeElement);\n }\n\n ngOnDestroy() {\n this.registery.unregister(this.scrollAnchor());\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\n\n/**\n * This guard checks if the client is authenticated, redirecting to login if not.\n */\nexport const authGuard: CanActivateFn = async (_route, state) => {\n const authService = inject(AuthService);\n if (!(await authService.ready())) {\n await authService.login(state.url);\n return false;\n }\n return true;\n};\n","import { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\nimport { inject } from '@angular/core';\n\n/**\n * A permission-based route guard.\n *\n * This guard checks if the current user has the required permissions to access a route.\n * If the user is not authenticated, they are redirected to the login page.\n * If the user lacks the necessary permissions, they are redirected to the `/forbidden` page.\n *\n * Pass the Permission type to get intellisense on requiredPermissions\n * @param requiredPermissions - An array of permission strings that the user must have.\n * @param haveAll - If `true`, the user must have all required permissions. If `false` or omitted, the user must have at least one of the required permissions.\n * @returns A `CanActivateFn` function to be used as a route guard.\n *\n * @example\n * ```typescript\n * const routes: Routes = [\n * {\n * path: 'admin',\n * component: AdminPage,\n * canActivate: [permissionGuard<Permission>(['manage-users', 'see-data'], true)],\n * },\n * ];\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nexport const permissionGuard: <Permission extends string>(\n requiredPermissions: Permission[],\n haveAll?: boolean\n) => CanActivateFn = (reqPerms, haveAll) => {\n return async (_route, state) => {\n const router = inject(Router);\n const authService = inject(AuthService);\n\n if (!(await authService.ready())) {\n await authService.login(state.url);\n return false;\n }\n\n const hasAccess = reqPerms[haveAll ? 'every' : 'some'](role =>\n authService.effectivePermissions().has(role)\n );\n\n return hasAccess || router.parseUrl('/forbidden');\n };\n};\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router, UrlTree } from '@angular/router';\nimport { AuthService } from '../../services/auth/auth.service';\nimport { FHSS_CONFIG } from '../../config/lib.config';\n\n/**\n * Guard factory that returns a CanActivateFn which redirects an authenticated user\n * to their default \"home\" page based on their role, or to a provided fallback.\n *\n * @param fallbackRedirect - Route path string or UrlTree to use when no role matches or no user is present.\n * @returns A CanActivateFn that resolves to an UrlTree to perform the redirect.\n */\nexport function homeRedirectGuard(\n fallbackRedirect: string | UrlTree\n): CanActivateFn {\n return async () => {\n const { defaultHomePages } = inject(FHSS_CONFIG);\n const router = inject(Router);\n const auth = inject(AuthService);\n const user = await auth.ready();\n\n for (const [role, path] of Object.entries(defaultHomePages)) {\n if (user?.roles.includes(role)) {\n if (path !== undefined) {\n return router.parseUrl(path);\n }\n }\n }\n\n return typeof fallbackRedirect === 'string'\n ? router.parseUrl(fallbackRedirect)\n : fallbackRedirect;\n };\n}\n","import { Component, input } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport type SystemConfig = {\n title?: string;\n message?: string;\n image?: string;\n};\n\n@Component({\n selector: 'fhss-system-page',\n imports: [MatButtonModule],\n templateUrl: './system.page.html',\n styleUrl: './system.page.scss',\n})\nexport class SystemPage {\n readonly config = input.required<SystemConfig>();\n}\n","@let title = config().title; @let message = config().message; @let image =\nconfig().image;\n\n<div class=\"container\">\n @if (image) {\n <div [class]=\"['image', image]\"></div>\n }\n <h1>{{ title ?? 'Application Error' }}</h1>\n <p>{{ message ?? 'Oops! Something went wrong!' }}</p>\n <a mat-flat-button href=\"/\">Go back home</a>\n</div>\n","import { Component } from '@angular/core';\nimport { SystemPage, SystemConfig } from '../system/system.page';\n\n@Component({\n selector: 'fhss-auth-error',\n imports: [SystemPage],\n templateUrl: './auth-error.page.html',\n styleUrl: './auth-error.page.scss',\n})\nexport class AuthErrorPage {\n protected readonly config: SystemConfig = {\n title: 'Login Failed',\n message: 'Something went wrong while trying to log you in.',\n image: 'sad-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","import { Component } from '@angular/core';\nimport { SystemConfig, SystemPage } from '../system/system.page';\n\n@Component({\n selector: 'fhss-forbidden',\n imports: [SystemPage],\n templateUrl: './forbidden.page.html',\n styleUrl: './forbidden.page.scss',\n})\nexport class ForbiddenPage {\n protected readonly config: SystemConfig = {\n title: '403 - Forbidden',\n message: \"You don't have permission to access this page.\",\n image: 'police-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","import { Component } from '@angular/core';\nimport { SystemPage, SystemConfig } from '../system/system.page';\n\n@Component({\n selector: 'fhss-not-found',\n imports: [SystemPage],\n templateUrl: './not-found.page.html',\n styleUrl: './not-found.page.scss',\n})\nexport class NotFoundPage {\n protected readonly config: SystemConfig = {\n title: '404 - Page not found',\n message: \"The page you are looking for doesn't exist or it may have moved.\",\n image: 'confused-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","import { Component } from '@angular/core';\nimport { SystemConfig, SystemPage } from '../system/system.page';\n\n@Component({\n selector: 'fhss-server-error',\n imports: [SystemPage],\n templateUrl: './server-error.page.html',\n styleUrl: './server-error.page.scss',\n})\nexport class ServerErrorPage {\n protected readonly config: SystemConfig = {\n title: '500 - Internal Server Error',\n message: 'We ran into an unexpected error!',\n image: 'error-duck',\n };\n}\n","<fhss-system-page [config]=\"config\" />\n","type Ok<T> = { ok: true; value: T };\ntype Err<E = unknown> = { ok: false; error: E };\nexport type Result<T, E> = Ok<T> | Err<E>;\n\nexport function ok<T = undefined>(value?: T): Ok<T>;\nexport function ok(value?: unknown): Ok<unknown> {\n return {\n ok: true,\n value,\n };\n}\n\nexport function err<E>(error: E): Err<E> {\n return {\n ok: false,\n error,\n };\n}\n","import { err as _err, ok as _ok, Result } from '../../utils/result';\n\nexport type FileData = {\n contentType: string;\n size: number;\n fileName: string;\n};\n\nexport type UploadUrlGenerator<E> = (\n fileData: FileData,\n ok: typeof _ok,\n err: typeof _err\n) => Promise<Result<{ url: string; key: string }, E>>;\n\nexport type RequestError = 'Network error during upload' | 'Upload failed';\nexport type UploadError =\n | 'Disabled component'\n | 'No file'\n | 'Url generation failed'\n | 'Unknown'\n | RequestError;\n\nexport type FileType =\n | 'image/gif'\n | '.gif'\n | 'image/avif'\n | '.avif'\n | 'image/jpeg'\n | '.jpeg'\n | 'image/png'\n | '.png'\n | 'image/svg+xml'\n | '.svg'\n | 'image/webp'\n | '.webp'\n | 'image/*'\n | 'application/pdf'\n | '.pdf'\n | 'application/msword'\n | '.doc'\n | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n | '.docx'\n | 'text/markdown'\n | '.md'\n | 'text/plain'\n | '.txt'\n | 'text/csv'\n | '.csv'\n | 'application/vnd.ms-excel'\n | '.xls'\n | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n | '.xlsx'\n | 'application/vnd.ms-powerpoint'\n | '.ppt'\n | 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n | '.pptx'\n | 'audio/mpeg'\n | '.mp3'\n | 'audio/*'\n | 'video/mp4'\n | '.mp4'\n | 'video/mpeg'\n | '.mpeg'\n | 'video/*'\n | 'application/zip'\n | '.zip'\n | 'application/x-zip-compressed'\n | 'application/xml'\n | '.xml'\n | 'application/json'\n | '.json';\n\nexport type FileLabel =\n | 'image'\n | 'document'\n | 'spreadsheet'\n | 'presentation'\n | 'audio'\n | 'video'\n | 'archive'\n | 'data'\n | 'gif'\n | 'avif'\n | 'jpeg'\n | 'png'\n | 'svg'\n | 'webp'\n | 'pdf'\n | 'word'\n | 'markdown'\n | 'text'\n | 'csv'\n | 'excel'\n | 'powerpoint'\n | 'mp3'\n | 'mpeg'\n | 'mp4'\n | 'zip'\n | 'xml'\n | 'json';\n\nexport const FileTypeMap: Record<FileLabel, FileType[]> = {\n gif: ['image/gif', '.gif'],\n avif: ['image/avif', '.avif'],\n jpeg: ['image/jpeg', '.jpeg'],\n png: ['image/png', '.png'],\n svg: ['image/svg+xml', '.svg'],\n webp: ['image/webp', '.webp'],\n pdf: ['application/pdf', '.pdf'],\n word: [\n 'application/msword',\n '.doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.docx',\n ],\n markdown: ['text/markdown', '.md'],\n text: ['text/plain', '.txt'],\n csv: ['text/csv', '.csv'],\n excel: [\n 'application/vnd.ms-excel',\n '.xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.xlsx',\n ],\n powerpoint: [\n 'application/vnd.ms-powerpoint',\n '.ppt',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.pptx',\n ],\n mpeg: ['video/mpeg', '.mpeg'],\n mp4: ['video/mp4', '.mp4'],\n mp3: ['audio/mpeg', '.mp3'],\n zip: ['application/zip', '.zip', 'application/x-zip-compressed'],\n xml: ['application/xml', '.xml'],\n json: ['application/json', '.json'],\n image: ['image/*'],\n document: [\n 'application/msword',\n '.doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.docx',\n 'application/pdf',\n '.pdf',\n 'text/markdown',\n '.md',\n 'text/plain',\n '.txt',\n ],\n spreadsheet: [\n 'application/vnd.ms-excel',\n '.xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.xlsx',\n 'text/csv',\n '.csv',\n ],\n presentation: [\n '.ppt',\n 'application/vnd.ms-powerpoint',\n '.pptx',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n ],\n audio: ['audio/*'],\n video: ['video/*'],\n archive: ['application/zip', '.zip', 'application/x-zip-compressed'],\n data: ['application/xml', '.xml', 'application/json', '.json'],\n} as const;\n","import { err, ok, Result } from '../../utils/result';\nimport { FileLabel, FileTypeMap } from './file.types';\n\ntype DownloadError = 'Not Found' | 'Unknown';\n\n/**\n * Downloads a file from the specified URL.\n *\n * This function performs a HEAD request to check if the file is available\n * before initiating the download. If the file is available, it uses a\n * temporary <a> to initiate a browser download.\n *\n * @param url - The URL of the file to download.\n * @returns A promise that resolves to a Result.\n */\nexport async function downloadFileFrom(\n url: string\n): Promise<Result<void, DownloadError>> {\n const head = await fetch(url, { method: 'HEAD' });\n if (!head.ok) {\n if (head.status === 404) return err('Not Found');\n else return err('Unknown');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n return ok();\n}\n\n/**\n * Generates a comma-separated string of unique file types from the given file label groups.\n * This allows the developer to easily define the `<input type=\"file\" />`'s `accept` property.\n * @param groups - An array of file labels to retrieve file types for.\n * @returns A comma-separated string of unique file types.\n */\nexport function getFileTypes(groups: FileLabel[]): string {\n const allTypes = groups.flatMap(label => FileTypeMap[label]);\n const uniqueTypes = Array.from(new Set(allTypes));\n return uniqueTypes.join(',');\n}\n\nexport type UploadError = 'Network error during upload' | 'Upload failed';\n\n/**\n * Uploads a file to the specified URL using XMLHttpRequest.\n *\n * @param file - The file to upload\n * @param url - The URL endpoint where the file will be uploaded (PUT request)\n * @param setProgress - Optional callback function to track upload progress as a percentage (0-100)\n * @returns A promise that resolves to a Result object containing either void on success or an UploadError on failure\n */\nexport function uploadFile(\n file: File,\n url: string,\n setProgress?: (percent: number) => void\n) {\n return new Promise<Result<void, UploadError>>(resolve => {\n const xhr = new XMLHttpRequest();\n\n xhr.open('PUT', url, true);\n xhr.setRequestHeader('Content-Type', file.type);\n\n if (setProgress) {\n setProgress(0);\n xhr.upload.onprogress = ev => {\n if (ev.lengthComputable) {\n const pct = Math.floor((ev.loaded / ev.total) * 100);\n setProgress(pct);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(ok());\n } else {\n resolve(err('Upload failed'));\n }\n };\n\n xhr.onerror = () => {\n resolve(err('Network error during upload'));\n };\n\n xhr.send(file);\n });\n}\n","import {\n computed,\n effect,\n inject,\n Injector,\n linkedSignal,\n signal,\n} from '@angular/core';\nimport { isTRPCClientError, Resolver } from '@trpc/client';\nimport {\n ResolverDef,\n TrpcResource,\n TrpcResourceOptions,\n} from './trpcResource.types';\n\nfunction trpcResource<TDef extends ResolverDef>(\n procedure: Resolver<TDef>,\n input: () => TDef['input'] | undefined,\n options?: TrpcResourceOptions<TDef['output']>\n): TrpcResource<TDef> {\n const currentInput = computed(input);\n\n const value = linkedSignal<TDef['output'] | undefined>(\n options?.valueComputation ??\n (() => options?.initialValue ?? options?.defaultValue),\n { equal: options?.equal }\n );\n const error = signal<TDef['errorShape'] | undefined>(undefined);\n const isLoading = signal<boolean>(false);\n\n if (options?.autoRefresh) {\n effect(\n onCleanup => {\n // pass abort signal to refresh on cleanup of effect\n const controller = new AbortController();\n onCleanup(() => {\n controller.abort();\n });\n\n // call refresh with this abort controller\n // refresh reads currentInput which triggers the effect\n refresh(controller.signal, true);\n },\n { injector: options.injector ?? inject(Injector) }\n );\n }\n\n const refresh = async (\n abortSignal?: AbortSignal,\n keepLoadingThroughAbort = true\n ): Promise<boolean> => {\n // if we have the special case where the current input is undefined\n // then set everything to it's initial state\n if (currentInput() === undefined) {\n value.set(options?.initialValue ?? options?.defaultValue);\n error.set(undefined);\n isLoading.set(false);\n return true;\n }\n\n // Reset signals for a fresh request.\n isLoading.set(true);\n error.set(undefined);\n\n try {\n value.set(\n await procedure(currentInput(), {\n signal: abortSignal,\n })\n );\n error.set(undefined);\n } catch (err) {\n if (isTRPCClientError(err)) {\n // if the trpc request was aborted\n // we check if we would like to continue loading (the next request)\n // if so then we just leave this refresh in an undefined state\n // else we error as usual\n if (err.cause?.name === 'AbortError' && keepLoadingThroughAbort) {\n return false;\n }\n error.set(err);\n } else {\n // Fallback for non-Error values\n console.error(\n 'A non-tRPC error has occured on this trpcResource: ',\n String(err)\n );\n }\n value.set(options?.defaultValue);\n }\n isLoading.set(false);\n return !error();\n };\n\n return {\n value,\n error,\n isLoading,\n refresh,\n };\n}\n\nfunction debugTrpcResource<TDef extends ResolverDef>(\n _trpcResource: TrpcResource<TDef>\n) {\n return {\n value: _trpcResource.value(),\n error: _trpcResource.error(),\n isLoading: _trpcResource.isLoading(),\n };\n}\n\nexport { debugTrpcResource, trpcResource };\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { effect, signal, Signal } from '@angular/core';\n\nexport const debounced = <T>(inputSignal: Signal<T>, wait = 400) => {\n const debouncedSignal = signal<T>(inputSignal());\n const setSignal = debounce(value => {\n debouncedSignal.set(value);\n }, wait);\n\n effect(() => {\n setSignal(inputSignal());\n });\n\n return debouncedSignal;\n};\n\nconst debounce = (callback: (...args: any[]) => void, wait: number) => {\n let timeoutId: number | undefined;\n return (...args: any[]) => {\n window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => {\n callback(...args);\n }, wait);\n };\n};\n","/**\n * Components\n */\nexport * from './lib/components/byu-footer/byu-footer.component';\nexport { ByuHeaderComponent } from './lib/components/byu-header/byu-header.component';\nexport type { HeaderConfig } from './lib/components/byu-header/byu-header.component';\nexport * from './lib/components/confirmation/confirmation.dialog';\nexport * from './lib/components/combo-box/combo-box.component';\n\n/**\n * Config\n */\nexport * from './lib/config/lib.config';\nexport * from './lib/config/utils.config';\n\n/**\n * Directives\n */\nexport * from './lib/directives/scroll-anchor.directive';\n\n/**\n * Guards\n */\nexport * from './lib/guards/auth/auth.guard';\nexport * from './lib/guards/permission/permission.guard';\nexport * from './lib/guards/home-redirect/home-redirect.guard';\n\n/**\n * Pages\n */\nexport * from './lib/pages/auth-error/auth-error.page';\nexport * from './lib/pages/forbidden/forbidden.page';\nexport * from './lib/pages/not-found/not-found.page';\nexport * from './lib/pages/server-error/server-error.page';\n\n/**\n * Services\n */\nexport * from './lib/services/auth/auth.service';\nexport * from './lib/services/file/file';\nexport * from './lib/services/scroll-registry/scroll-registry.service';\n\n/**\n * Signals\n */\nexport * from './lib/signals/trpcResource/trpcResource';\nexport * from './lib/signals/debounced/debounced';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fhss-web-team/frontend-utils",
3
- "version": "21.4.2",
3
+ "version": "21.4.3",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.3",
6
6
  "@angular/core": "^21.0.3"