ng-hub-ui-buttons 22.9.2 → 22.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Carlos Morcillo
3
+ Copyright (c) 2026 Carlos Morcillo Fernández
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -17,5 +17,5 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
17
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING IN THE
21
21
  SOFTWARE.
@@ -309,14 +309,14 @@ class HubSpeedDialComponent {
309
309
  this.closed.emit();
310
310
  }
311
311
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubSpeedDialComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
312
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubSpeedDialComponent, isStandalone: true, selector: "hub-speed-dial", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", opened: "opened", closed: "closed" }, host: { properties: { "class": "_hostClass" }, classAttribute: "hub-speed-dial" }, ngImport: i0, template: "<button\n\tclass=\"hub-fab\"\n\t[class]=\"'hub-fab-' + color() + ' hub-fab-' + size()\"\n\t[style.--hub-fab-accent]=\"_accent\"\n\t(click)=\"trigger() === 'click' && toggle()\"\n\t(mouseenter)=\"trigger() === 'hover' && open()\"\n\t(mouseleave)=\"trigger() === 'hover' && close()\"\n\ttype=\"button\"\n\t[attr.aria-expanded]=\"isOpen()\"\n\taria-haspopup=\"true\">\n\t<ng-content select=\"[hubTrigger]\"></ng-content>\n</button>\n\n@if (isOpen()) {\n\t<div class=\"hub-speed-dial__actions\" [attr.data-direction]=\"direction()\">\n\t\t<ng-content></ng-content>\n\t</div>\n}\n", styles: [":where(:host){--hub-speed-dial-gap: .625rem;--hub-speed-dial-zindex: var(--hub-sys-zindex-fixed, 1030);--hub-speed-dial-animation: .2s ease}:host{position:fixed;display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);z-index:var(--hub-speed-dial-zindex)}.hub-speed-dial__actions{display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);animation:hub-sd-fade-in var(--hub-speed-dial-animation) both}:host(.hub-speed-dial-top-start){inset-block-start:1rem;inset-inline-start:1rem;flex-direction:column;align-items:flex-start}:host(.hub-speed-dial-top-end){inset-block-start:1rem;inset-inline-end:1rem;flex-direction:column;align-items:flex-end}:host(.hub-speed-dial-bottom-start){inset-block-end:1rem;inset-inline-start:1rem;align-items:flex-start}:host(.hub-speed-dial-bottom-end){inset-block-end:1rem;inset-inline-end:1rem;align-items:flex-end}:host(.hub-speed-dial-center){inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}:host(.hub-speed-dial-left){flex-direction:row-reverse}:host(.hub-speed-dial-left) .hub-speed-dial__actions{flex-direction:row-reverse}:host(.hub-speed-dial-right){flex-direction:row}:host(.hub-speed-dial-right) .hub-speed-dial__actions{flex-direction:row}@keyframes hub-sd-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
312
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubSpeedDialComponent, isStandalone: true, selector: "hub-speed-dial", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", opened: "opened", closed: "closed" }, host: { properties: { "class": "_hostClass" }, classAttribute: "hub-speed-dial" }, ngImport: i0, template: "<button\n\tclass=\"hub-fab\"\n\t[class]=\"'hub-fab-' + color() + ' hub-fab-' + size()\"\n\t[style.--hub-fab-accent]=\"_accent\"\n\t(click)=\"trigger() === 'click' && toggle()\"\n\t(mouseenter)=\"trigger() === 'hover' && open()\"\n\t(mouseleave)=\"trigger() === 'hover' && close()\"\n\ttype=\"button\"\n\t[attr.aria-expanded]=\"isOpen()\"\n\taria-haspopup=\"true\"\n>\n\t<ng-content select=\"[hubTrigger]\"></ng-content>\n</button>\n\n@if (isOpen()) {\n\t<div class=\"hub-speed-dial__actions\" [attr.data-direction]=\"direction()\">\n\t\t<ng-content></ng-content>\n\t</div>\n}\n", styles: [":where(:host){--hub-speed-dial-gap: .625rem;--hub-speed-dial-zindex: var(--hub-sys-zindex-fixed, 1030);--hub-speed-dial-animation: .2s ease}:host{position:fixed;display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);z-index:var(--hub-speed-dial-zindex)}.hub-speed-dial__actions{display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);animation:hub-sd-fade-in var(--hub-speed-dial-animation) both}:host(.hub-speed-dial-top-start){inset-block-start:1rem;inset-inline-start:1rem;flex-direction:column;align-items:flex-start}:host(.hub-speed-dial-top-end){inset-block-start:1rem;inset-inline-end:1rem;flex-direction:column;align-items:flex-end}:host(.hub-speed-dial-bottom-start){inset-block-end:1rem;inset-inline-start:1rem;align-items:flex-start}:host(.hub-speed-dial-bottom-end){inset-block-end:1rem;inset-inline-end:1rem;align-items:flex-end}:host(.hub-speed-dial-center){inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}:host(.hub-speed-dial-left){flex-direction:row-reverse}:host(.hub-speed-dial-left) .hub-speed-dial__actions{flex-direction:row-reverse}:host(.hub-speed-dial-right){flex-direction:row}:host(.hub-speed-dial-right) .hub-speed-dial__actions{flex-direction:row}@keyframes hub-sd-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
313
313
  }
314
314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubSpeedDialComponent, decorators: [{
315
315
  type: Component,
316
316
  args: [{ selector: 'hub-speed-dial', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
317
317
  class: 'hub-speed-dial',
318
318
  '[class]': '_hostClass'
319
- }, template: "<button\n\tclass=\"hub-fab\"\n\t[class]=\"'hub-fab-' + color() + ' hub-fab-' + size()\"\n\t[style.--hub-fab-accent]=\"_accent\"\n\t(click)=\"trigger() === 'click' && toggle()\"\n\t(mouseenter)=\"trigger() === 'hover' && open()\"\n\t(mouseleave)=\"trigger() === 'hover' && close()\"\n\ttype=\"button\"\n\t[attr.aria-expanded]=\"isOpen()\"\n\taria-haspopup=\"true\">\n\t<ng-content select=\"[hubTrigger]\"></ng-content>\n</button>\n\n@if (isOpen()) {\n\t<div class=\"hub-speed-dial__actions\" [attr.data-direction]=\"direction()\">\n\t\t<ng-content></ng-content>\n\t</div>\n}\n", styles: [":where(:host){--hub-speed-dial-gap: .625rem;--hub-speed-dial-zindex: var(--hub-sys-zindex-fixed, 1030);--hub-speed-dial-animation: .2s ease}:host{position:fixed;display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);z-index:var(--hub-speed-dial-zindex)}.hub-speed-dial__actions{display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);animation:hub-sd-fade-in var(--hub-speed-dial-animation) both}:host(.hub-speed-dial-top-start){inset-block-start:1rem;inset-inline-start:1rem;flex-direction:column;align-items:flex-start}:host(.hub-speed-dial-top-end){inset-block-start:1rem;inset-inline-end:1rem;flex-direction:column;align-items:flex-end}:host(.hub-speed-dial-bottom-start){inset-block-end:1rem;inset-inline-start:1rem;align-items:flex-start}:host(.hub-speed-dial-bottom-end){inset-block-end:1rem;inset-inline-end:1rem;align-items:flex-end}:host(.hub-speed-dial-center){inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}:host(.hub-speed-dial-left){flex-direction:row-reverse}:host(.hub-speed-dial-left) .hub-speed-dial__actions{flex-direction:row-reverse}:host(.hub-speed-dial-right){flex-direction:row}:host(.hub-speed-dial-right) .hub-speed-dial__actions{flex-direction:row}@keyframes hub-sd-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n"] }]
319
+ }, template: "<button\n\tclass=\"hub-fab\"\n\t[class]=\"'hub-fab-' + color() + ' hub-fab-' + size()\"\n\t[style.--hub-fab-accent]=\"_accent\"\n\t(click)=\"trigger() === 'click' && toggle()\"\n\t(mouseenter)=\"trigger() === 'hover' && open()\"\n\t(mouseleave)=\"trigger() === 'hover' && close()\"\n\ttype=\"button\"\n\t[attr.aria-expanded]=\"isOpen()\"\n\taria-haspopup=\"true\"\n>\n\t<ng-content select=\"[hubTrigger]\"></ng-content>\n</button>\n\n@if (isOpen()) {\n\t<div class=\"hub-speed-dial__actions\" [attr.data-direction]=\"direction()\">\n\t\t<ng-content></ng-content>\n\t</div>\n}\n", styles: [":where(:host){--hub-speed-dial-gap: .625rem;--hub-speed-dial-zindex: var(--hub-sys-zindex-fixed, 1030);--hub-speed-dial-animation: .2s ease}:host{position:fixed;display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);z-index:var(--hub-speed-dial-zindex)}.hub-speed-dial__actions{display:flex;flex-direction:column-reverse;align-items:center;gap:var(--hub-speed-dial-gap);animation:hub-sd-fade-in var(--hub-speed-dial-animation) both}:host(.hub-speed-dial-top-start){inset-block-start:1rem;inset-inline-start:1rem;flex-direction:column;align-items:flex-start}:host(.hub-speed-dial-top-end){inset-block-start:1rem;inset-inline-end:1rem;flex-direction:column;align-items:flex-end}:host(.hub-speed-dial-bottom-start){inset-block-end:1rem;inset-inline-start:1rem;align-items:flex-start}:host(.hub-speed-dial-bottom-end){inset-block-end:1rem;inset-inline-end:1rem;align-items:flex-end}:host(.hub-speed-dial-center){inset-block-start:50%;inset-inline-start:50%;transform:translate(-50%,-50%)}:host(.hub-speed-dial-left){flex-direction:row-reverse}:host(.hub-speed-dial-left) .hub-speed-dial__actions{flex-direction:row-reverse}:host(.hub-speed-dial-right){flex-direction:row}:host(.hub-speed-dial-right) .hub-speed-dial__actions{flex-direction:row}@keyframes hub-sd-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n"] }]
320
320
  }], ctorParameters: () => [], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], trigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "trigger", required: false }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }, { type: i0.Output, args: ["isOpenChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
321
321
 
322
322
  /**
@@ -349,11 +349,11 @@ class HubSpeedDialItemComponent {
349
349
  return this.color() === 'default' ? null : resolveHubAccent(this.color());
350
350
  }
351
351
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubSpeedDialItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
352
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubSpeedDialItemComponent, isStandalone: true, selector: "hub-speed-dial-item", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, ngImport: i0, template: "@if (label()) {\n\t<span class=\"hub-speed-dial-item__label\">{{ label() }}</span>\n}\n<button\n\tclass=\"hub-speed-dial-item__btn\"\n\t[class]=\"'hub-speed-dial-item__btn--' + color()\"\n\t[style.--hub-speed-dial-item-accent]=\"_accent\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"itemClick.emit()\"\n\ttype=\"button\"\n\t[attr.aria-label]=\"label() || icon()\">\n\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n</button>\n", styles: [":where(:host){--hub-speed-dial-label-bg: var(--hub-sys-color-ink, #212529);--hub-speed-dial-label-color: var(--hub-sys-surface-page, #ffffff)}:host{display:flex;align-items:center;gap:var(--hub-speed-dial-gap, .625rem)}.hub-speed-dial-item__label{font-size:.8rem;font-weight:var(--hub-ref-font-weight-medium, 500);background:var(--hub-speed-dial-label-bg);color:var(--hub-speed-dial-label-color);padding:.1875rem .5rem;border-radius:.3125rem;white-space:nowrap;box-shadow:var(--hub-sys-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075))}.hub-speed-dial-item__btn{width:2.625rem;height:2.625rem;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1.1rem;background:var(--hub-speed-dial-item-accent, var(--hub-sys-color-surface-default, #ffffff));box-shadow:var(--hub-sys-shadow-md, 0 .5rem 1rem rgba(0, 0, 0, .15));transition:transform .15s ease}.hub-speed-dial-item__btn:hover{transform:scale(1.1)}.hub-speed-dial-item__btn:disabled{opacity:.45;pointer-events:none}.hub-speed-dial-item__btn--primary{background:var(--hub-sys-color-primary-default, var(--hub-sys-color-primary));color:var(--hub-sys-color-primary-on-default, #fff)}.hub-speed-dial-item__btn--secondary{background:var(--hub-sys-color-secondary-default, var(--hub-sys-color-secondary));color:var(--hub-sys-color-secondary-on-default, #fff)}.hub-speed-dial-item__btn--success{background:var(--hub-sys-color-success-default, var(--hub-sys-color-success));color:var(--hub-sys-color-success-on-default, #fff)}.hub-speed-dial-item__btn--danger{background:var(--hub-sys-color-danger-default, var(--hub-sys-color-danger));color:var(--hub-sys-color-danger-on-default, #fff)}.hub-speed-dial-item__btn--warning{background:var(--hub-sys-color-warning-default, var(--hub-sys-color-warning));color:var(--hub-sys-color-warning-on-default, #fff)}.hub-speed-dial-item__btn--info{background:var(--hub-sys-color-info-default, var(--hub-sys-color-info));color:var(--hub-sys-color-info-on-default, #fff)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubSpeedDialItemComponent, isStandalone: true, selector: "hub-speed-dial-item", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, ngImport: i0, template: "@if (label()) {\n\t<span class=\"hub-speed-dial-item__label\">{{ label() }}</span>\n}\n<button\n\tclass=\"hub-speed-dial-item__btn\"\n\t[class]=\"'hub-speed-dial-item__btn--' + color()\"\n\t[style.--hub-speed-dial-item-accent]=\"_accent\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"itemClick.emit()\"\n\ttype=\"button\"\n\t[attr.aria-label]=\"label() || icon()\"\n>\n\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n</button>\n", styles: [":where(:host){--hub-speed-dial-label-bg: var(--hub-sys-color-ink, #212529);--hub-speed-dial-label-color: var(--hub-sys-surface-page, #ffffff)}:host{display:flex;align-items:center;gap:var(--hub-speed-dial-gap, .625rem)}.hub-speed-dial-item__label{font-size:.8rem;font-weight:var(--hub-ref-font-weight-medium, 500);background:var(--hub-speed-dial-label-bg);color:var(--hub-speed-dial-label-color);padding:.1875rem .5rem;border-radius:.3125rem;white-space:nowrap;box-shadow:var(--hub-sys-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075))}.hub-speed-dial-item__btn{width:2.625rem;height:2.625rem;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1.1rem;background:var(--hub-speed-dial-item-accent, var(--hub-sys-color-surface-default, #ffffff));box-shadow:var(--hub-sys-shadow-md, 0 .5rem 1rem rgba(0, 0, 0, .15));transition:transform .15s ease}.hub-speed-dial-item__btn:hover{transform:scale(1.1)}.hub-speed-dial-item__btn:disabled{opacity:.45;pointer-events:none}.hub-speed-dial-item__btn--primary{background:var(--hub-sys-color-primary-default, var(--hub-sys-color-primary));color:var(--hub-sys-color-primary-on-default, #fff)}.hub-speed-dial-item__btn--secondary{background:var(--hub-sys-color-secondary-default, var(--hub-sys-color-secondary));color:var(--hub-sys-color-secondary-on-default, #fff)}.hub-speed-dial-item__btn--success{background:var(--hub-sys-color-success-default, var(--hub-sys-color-success));color:var(--hub-sys-color-success-on-default, #fff)}.hub-speed-dial-item__btn--danger{background:var(--hub-sys-color-danger-default, var(--hub-sys-color-danger));color:var(--hub-sys-color-danger-on-default, #fff)}.hub-speed-dial-item__btn--warning{background:var(--hub-sys-color-warning-default, var(--hub-sys-color-warning));color:var(--hub-sys-color-warning-on-default, #fff)}.hub-speed-dial-item__btn--info{background:var(--hub-sys-color-info-default, var(--hub-sys-color-info));color:var(--hub-sys-color-info-on-default, #fff)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
353
353
  }
354
354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubSpeedDialItemComponent, decorators: [{
355
355
  type: Component,
356
- args: [{ selector: 'hub-speed-dial-item', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (label()) {\n\t<span class=\"hub-speed-dial-item__label\">{{ label() }}</span>\n}\n<button\n\tclass=\"hub-speed-dial-item__btn\"\n\t[class]=\"'hub-speed-dial-item__btn--' + color()\"\n\t[style.--hub-speed-dial-item-accent]=\"_accent\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"itemClick.emit()\"\n\ttype=\"button\"\n\t[attr.aria-label]=\"label() || icon()\">\n\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n</button>\n", styles: [":where(:host){--hub-speed-dial-label-bg: var(--hub-sys-color-ink, #212529);--hub-speed-dial-label-color: var(--hub-sys-surface-page, #ffffff)}:host{display:flex;align-items:center;gap:var(--hub-speed-dial-gap, .625rem)}.hub-speed-dial-item__label{font-size:.8rem;font-weight:var(--hub-ref-font-weight-medium, 500);background:var(--hub-speed-dial-label-bg);color:var(--hub-speed-dial-label-color);padding:.1875rem .5rem;border-radius:.3125rem;white-space:nowrap;box-shadow:var(--hub-sys-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075))}.hub-speed-dial-item__btn{width:2.625rem;height:2.625rem;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1.1rem;background:var(--hub-speed-dial-item-accent, var(--hub-sys-color-surface-default, #ffffff));box-shadow:var(--hub-sys-shadow-md, 0 .5rem 1rem rgba(0, 0, 0, .15));transition:transform .15s ease}.hub-speed-dial-item__btn:hover{transform:scale(1.1)}.hub-speed-dial-item__btn:disabled{opacity:.45;pointer-events:none}.hub-speed-dial-item__btn--primary{background:var(--hub-sys-color-primary-default, var(--hub-sys-color-primary));color:var(--hub-sys-color-primary-on-default, #fff)}.hub-speed-dial-item__btn--secondary{background:var(--hub-sys-color-secondary-default, var(--hub-sys-color-secondary));color:var(--hub-sys-color-secondary-on-default, #fff)}.hub-speed-dial-item__btn--success{background:var(--hub-sys-color-success-default, var(--hub-sys-color-success));color:var(--hub-sys-color-success-on-default, #fff)}.hub-speed-dial-item__btn--danger{background:var(--hub-sys-color-danger-default, var(--hub-sys-color-danger));color:var(--hub-sys-color-danger-on-default, #fff)}.hub-speed-dial-item__btn--warning{background:var(--hub-sys-color-warning-default, var(--hub-sys-color-warning));color:var(--hub-sys-color-warning-on-default, #fff)}.hub-speed-dial-item__btn--info{background:var(--hub-sys-color-info-default, var(--hub-sys-color-info));color:var(--hub-sys-color-info-on-default, #fff)}\n"] }]
356
+ args: [{ selector: 'hub-speed-dial-item', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (label()) {\n\t<span class=\"hub-speed-dial-item__label\">{{ label() }}</span>\n}\n<button\n\tclass=\"hub-speed-dial-item__btn\"\n\t[class]=\"'hub-speed-dial-item__btn--' + color()\"\n\t[style.--hub-speed-dial-item-accent]=\"_accent\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"itemClick.emit()\"\n\ttype=\"button\"\n\t[attr.aria-label]=\"label() || icon()\"\n>\n\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n</button>\n", styles: [":where(:host){--hub-speed-dial-label-bg: var(--hub-sys-color-ink, #212529);--hub-speed-dial-label-color: var(--hub-sys-surface-page, #ffffff)}:host{display:flex;align-items:center;gap:var(--hub-speed-dial-gap, .625rem)}.hub-speed-dial-item__label{font-size:.8rem;font-weight:var(--hub-ref-font-weight-medium, 500);background:var(--hub-speed-dial-label-bg);color:var(--hub-speed-dial-label-color);padding:.1875rem .5rem;border-radius:.3125rem;white-space:nowrap;box-shadow:var(--hub-sys-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075))}.hub-speed-dial-item__btn{width:2.625rem;height:2.625rem;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1.1rem;background:var(--hub-speed-dial-item-accent, var(--hub-sys-color-surface-default, #ffffff));box-shadow:var(--hub-sys-shadow-md, 0 .5rem 1rem rgba(0, 0, 0, .15));transition:transform .15s ease}.hub-speed-dial-item__btn:hover{transform:scale(1.1)}.hub-speed-dial-item__btn:disabled{opacity:.45;pointer-events:none}.hub-speed-dial-item__btn--primary{background:var(--hub-sys-color-primary-default, var(--hub-sys-color-primary));color:var(--hub-sys-color-primary-on-default, #fff)}.hub-speed-dial-item__btn--secondary{background:var(--hub-sys-color-secondary-default, var(--hub-sys-color-secondary));color:var(--hub-sys-color-secondary-on-default, #fff)}.hub-speed-dial-item__btn--success{background:var(--hub-sys-color-success-default, var(--hub-sys-color-success));color:var(--hub-sys-color-success-on-default, #fff)}.hub-speed-dial-item__btn--danger{background:var(--hub-sys-color-danger-default, var(--hub-sys-color-danger));color:var(--hub-sys-color-danger-on-default, #fff)}.hub-speed-dial-item__btn--warning{background:var(--hub-sys-color-warning-default, var(--hub-sys-color-warning));color:var(--hub-sys-color-warning-on-default, #fff)}.hub-speed-dial-item__btn--info{background:var(--hub-sys-color-info-default, var(--hub-sys-color-info));color:var(--hub-sys-color-info-on-default, #fff)}\n"] }]
357
357
  }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
358
358
 
359
359
  /**
@@ -438,7 +438,7 @@ class HubDropdownItemComponent {
438
438
  this.itemClick.emit();
439
439
  }
440
440
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubDropdownItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
441
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubDropdownItemComponent, isStandalone: true, selector: "hub-dropdown-item", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "class": "_hostClass", "style.--hub-dropdown-item-accent": "_accent" }, classAttribute: "hub-dropdown-item" }, ngImport: i0, template: "<button\n\tclass=\"hub-dropdown-item__inner\"\n\ttype=\"button\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"_handleClick()\">\n\t@if (icon()) {\n\t\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n\t}\n\t<span class=\"hub-dropdown-item__label\"><ng-content></ng-content></span>\n\t@if (selected()) {\n\t\t<span class=\"hub-dropdown-item__check\" aria-hidden=\"true\">\u2713</span>\n\t}\n</button>\n", styles: [":where(:host){--hub-dropdown-item-padding-y: var(--hub-ref-space-2, .5rem);--hub-dropdown-item-padding-x: var(--hub-ref-space-3, 1rem);--hub-dropdown-item-hover-bg: var(--hub-sys-color-surface-subtle, #f8f9fa);--hub-dropdown-item-border-radius: var(--hub-sys-radius-sm, .25rem);--hub-dropdown-item-disabled-opacity: .45}:host{display:block}.hub-dropdown-item__inner{display:flex;align-items:center;gap:var(--hub-ref-space-2, .5rem);width:100%;padding:var(--hub-dropdown-item-padding-y) var(--hub-dropdown-item-padding-x);border:none;background:transparent;font-size:var(--hub-ref-font-size-sm, .875rem);color:var(--hub-dropdown-item-accent, inherit);cursor:pointer;text-align:start;border-radius:var(--hub-dropdown-item-border-radius);transition:background .1s ease}.hub-dropdown-item__inner:hover{background:var(--hub-dropdown-item-hover-bg)}.hub-dropdown-item__inner:disabled{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}.hub-dropdown-item__label{flex:1}.hub-dropdown-item__check{margin-inline-start:auto}:host(.hub-dropdown-item-disabled) .hub-dropdown-item__inner{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner{color:var(--hub-sys-color-primary-emphasis)}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-primary-subtle)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner{color:var(--hub-sys-color-secondary-emphasis)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-secondary-subtle)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner{color:var(--hub-sys-color-success-emphasis)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-success-subtle)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner{color:var(--hub-sys-color-danger-emphasis)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-danger-subtle)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner{color:var(--hub-sys-color-warning-emphasis)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-warning-subtle)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner{color:var(--hub-sys-color-info-emphasis)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-info-subtle)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
441
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubDropdownItemComponent, isStandalone: true, selector: "hub-dropdown-item", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "class": "_hostClass", "style.--hub-dropdown-item-accent": "_accent" }, classAttribute: "hub-dropdown-item" }, ngImport: i0, template: "<button class=\"hub-dropdown-item__inner\" type=\"button\" [disabled]=\"disabled() || null\" (click)=\"_handleClick()\">\n\t@if (icon()) {\n\t\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n\t}\n\t<span class=\"hub-dropdown-item__label\"><ng-content></ng-content></span>\n\t@if (selected()) {\n\t\t<span class=\"hub-dropdown-item__check\" aria-hidden=\"true\">\u2713</span>\n\t}\n</button>\n", styles: [":where(:host){--hub-dropdown-item-padding-y: var(--hub-ref-space-2, .5rem);--hub-dropdown-item-padding-x: var(--hub-ref-space-3, 1rem);--hub-dropdown-item-hover-bg: var(--hub-sys-color-surface-subtle, #f8f9fa);--hub-dropdown-item-border-radius: var(--hub-sys-radius-sm, .25rem);--hub-dropdown-item-disabled-opacity: .45}:host{display:block}.hub-dropdown-item__inner{display:flex;align-items:center;gap:var(--hub-ref-space-2, .5rem);width:100%;padding:var(--hub-dropdown-item-padding-y) var(--hub-dropdown-item-padding-x);border:none;background:transparent;font-size:var(--hub-ref-font-size-sm, .875rem);color:var(--hub-dropdown-item-accent, inherit);cursor:pointer;text-align:start;border-radius:var(--hub-dropdown-item-border-radius);transition:background .1s ease}.hub-dropdown-item__inner:hover{background:var(--hub-dropdown-item-hover-bg)}.hub-dropdown-item__inner:disabled{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}.hub-dropdown-item__label{flex:1}.hub-dropdown-item__check{margin-inline-start:auto}:host(.hub-dropdown-item-disabled) .hub-dropdown-item__inner{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner{color:var(--hub-sys-color-primary-emphasis)}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-primary-subtle)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner{color:var(--hub-sys-color-secondary-emphasis)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-secondary-subtle)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner{color:var(--hub-sys-color-success-emphasis)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-success-subtle)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner{color:var(--hub-sys-color-danger-emphasis)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-danger-subtle)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner{color:var(--hub-sys-color-warning-emphasis)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-warning-subtle)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner{color:var(--hub-sys-color-info-emphasis)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-info-subtle)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
442
442
  }
443
443
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubDropdownItemComponent, decorators: [{
444
444
  type: Component,
@@ -446,7 +446,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
446
446
  class: 'hub-dropdown-item',
447
447
  '[class]': '_hostClass',
448
448
  '[style.--hub-dropdown-item-accent]': '_accent'
449
- }, template: "<button\n\tclass=\"hub-dropdown-item__inner\"\n\ttype=\"button\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"_handleClick()\">\n\t@if (icon()) {\n\t\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n\t}\n\t<span class=\"hub-dropdown-item__label\"><ng-content></ng-content></span>\n\t@if (selected()) {\n\t\t<span class=\"hub-dropdown-item__check\" aria-hidden=\"true\">\u2713</span>\n\t}\n</button>\n", styles: [":where(:host){--hub-dropdown-item-padding-y: var(--hub-ref-space-2, .5rem);--hub-dropdown-item-padding-x: var(--hub-ref-space-3, 1rem);--hub-dropdown-item-hover-bg: var(--hub-sys-color-surface-subtle, #f8f9fa);--hub-dropdown-item-border-radius: var(--hub-sys-radius-sm, .25rem);--hub-dropdown-item-disabled-opacity: .45}:host{display:block}.hub-dropdown-item__inner{display:flex;align-items:center;gap:var(--hub-ref-space-2, .5rem);width:100%;padding:var(--hub-dropdown-item-padding-y) var(--hub-dropdown-item-padding-x);border:none;background:transparent;font-size:var(--hub-ref-font-size-sm, .875rem);color:var(--hub-dropdown-item-accent, inherit);cursor:pointer;text-align:start;border-radius:var(--hub-dropdown-item-border-radius);transition:background .1s ease}.hub-dropdown-item__inner:hover{background:var(--hub-dropdown-item-hover-bg)}.hub-dropdown-item__inner:disabled{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}.hub-dropdown-item__label{flex:1}.hub-dropdown-item__check{margin-inline-start:auto}:host(.hub-dropdown-item-disabled) .hub-dropdown-item__inner{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner{color:var(--hub-sys-color-primary-emphasis)}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-primary-subtle)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner{color:var(--hub-sys-color-secondary-emphasis)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-secondary-subtle)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner{color:var(--hub-sys-color-success-emphasis)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-success-subtle)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner{color:var(--hub-sys-color-danger-emphasis)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-danger-subtle)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner{color:var(--hub-sys-color-warning-emphasis)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-warning-subtle)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner{color:var(--hub-sys-color-info-emphasis)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-info-subtle)}\n"] }]
449
+ }, template: "<button class=\"hub-dropdown-item__inner\" type=\"button\" [disabled]=\"disabled() || null\" (click)=\"_handleClick()\">\n\t@if (icon()) {\n\t\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n\t}\n\t<span class=\"hub-dropdown-item__label\"><ng-content></ng-content></span>\n\t@if (selected()) {\n\t\t<span class=\"hub-dropdown-item__check\" aria-hidden=\"true\">\u2713</span>\n\t}\n</button>\n", styles: [":where(:host){--hub-dropdown-item-padding-y: var(--hub-ref-space-2, .5rem);--hub-dropdown-item-padding-x: var(--hub-ref-space-3, 1rem);--hub-dropdown-item-hover-bg: var(--hub-sys-color-surface-subtle, #f8f9fa);--hub-dropdown-item-border-radius: var(--hub-sys-radius-sm, .25rem);--hub-dropdown-item-disabled-opacity: .45}:host{display:block}.hub-dropdown-item__inner{display:flex;align-items:center;gap:var(--hub-ref-space-2, .5rem);width:100%;padding:var(--hub-dropdown-item-padding-y) var(--hub-dropdown-item-padding-x);border:none;background:transparent;font-size:var(--hub-ref-font-size-sm, .875rem);color:var(--hub-dropdown-item-accent, inherit);cursor:pointer;text-align:start;border-radius:var(--hub-dropdown-item-border-radius);transition:background .1s ease}.hub-dropdown-item__inner:hover{background:var(--hub-dropdown-item-hover-bg)}.hub-dropdown-item__inner:disabled{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}.hub-dropdown-item__label{flex:1}.hub-dropdown-item__check{margin-inline-start:auto}:host(.hub-dropdown-item-disabled) .hub-dropdown-item__inner{opacity:var(--hub-dropdown-item-disabled-opacity);pointer-events:none}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner{color:var(--hub-sys-color-primary-emphasis)}:host(.hub-dropdown-item-primary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-primary-subtle)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner{color:var(--hub-sys-color-secondary-emphasis)}:host(.hub-dropdown-item-secondary) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-secondary-subtle)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner{color:var(--hub-sys-color-success-emphasis)}:host(.hub-dropdown-item-success) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-success-subtle)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner{color:var(--hub-sys-color-danger-emphasis)}:host(.hub-dropdown-item-danger) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-danger-subtle)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner{color:var(--hub-sys-color-warning-emphasis)}:host(.hub-dropdown-item-warning) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-warning-subtle)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner{color:var(--hub-sys-color-info-emphasis)}:host(.hub-dropdown-item-info) .hub-dropdown-item__inner:hover{background:var(--hub-sys-color-info-subtle)}\n"] }]
450
450
  }], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
451
451
 
452
452
  /** Horizontal separator for grouping items inside HubDropdownPanelComponent. */
@@ -1 +1 @@
1
- {"version":3,"file":"ng-hub-ui-buttons.mjs","sources":["../../../projects/buttons/src/lib/tokens/dropdown.token.ts","../../../projects/buttons/src/lib/components/btn/button.component.ts","../../../projects/buttons/src/lib/components/btn/button.component.html","../../../projects/buttons/src/lib/components/fab/fab.component.ts","../../../projects/buttons/src/lib/components/fab/fab.component.html","../../../projects/buttons/src/lib/components/speed-dial/speed-dial.component.ts","../../../projects/buttons/src/lib/components/speed-dial/speed-dial.component.html","../../../projects/buttons/src/lib/components/speed-dial/speed-dial-item/speed-dial-item.component.ts","../../../projects/buttons/src/lib/components/speed-dial/speed-dial-item/speed-dial-item.component.html","../../../projects/buttons/src/lib/components/dropdown-panel/dropdown-panel.component.ts","../../../projects/buttons/src/lib/components/dropdown-item/dropdown-item.component.ts","../../../projects/buttons/src/lib/components/dropdown-item/dropdown-item.component.html","../../../projects/buttons/src/lib/components/dropdown-divider/dropdown-divider.component.ts","../../../projects/buttons/src/lib/components/dropdown-header/dropdown-header.component.ts","../../../projects/buttons/src/lib/directives/dropdown.directive.ts","../../../projects/buttons/src/public-api.ts","../../../projects/buttons/src/ng-hub-ui-buttons.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\n/**\n * Context shared between HubDropdownDirective and its panel/item descendants.\n * Injected by the directive; consumed by HubDropdownPanelComponent and\n * HubDropdownItemComponent to implement closeOnSelect without prop drilling.\n */\nexport interface DropdownContext {\n\t/** Whether clicking an item should close the dropdown. */\n\treadonly closeOnSelect: Signal<boolean>;\n\t/** Imperatively close the dropdown. */\n\tclose(): void;\n}\n\n/** Injection token for DropdownContext. */\nexport const DROPDOWN_CONTEXT = new InjectionToken<DropdownContext>('HubDropdownContext');\n","import { ChangeDetectionStrategy, Component, ElementRef, inject, input } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubBtnSize, HubBtnVariant, HubSemanticColor } from '../../models/button.types';\n\n/**\n * Styled button. Applies `hub-btn` CSS classes computed from signal inputs and\n * renders an optional loading spinner around the projected content.\n *\n * Usable in two interchangeable forms from the same class:\n * - As an element: `<hub-button variant=\"solid\" color=\"primary\">Save</hub-button>`.\n * - As an attribute on any host: `<button hubButton>Save</button>` / `<a hubButton href=\"…\">Link</a>`.\n *\n * Prefer the attribute form on a native `<button>` / `<a>` when you need real button\n * semantics (focus, keyboard activation, form submission). The `<hub-button>` **element**\n * form is only a styling host — a component cannot swap its own host tag for a native\n * `<button>` — so it self-advertises `role=\"button\"`, a focusable `tabindex`, and\n * Enter/Space keyboard activation to stay accessible. The `[hubButton]` attribute form on\n * a native `<button>`/`<a>` adds **none** of these bindings (the host is already\n * interactive; a redundant `role`/`tabindex` would be harmful).\n *\n * **Accessibility caveat:** an element-form `<hub-button>` now reports `role=\"button\"`,\n * so it must not be nested inside another interactive element (a `<button>`, `<a>` or any\n * host that is itself a control), which would produce an invalid nested-interactive tree.\n *\n * **Icons:** project whatever you want as content — the button is icon-library\n * agnostic. The icon's position follows the markup order, and the label/icon gap\n * is the `--hub-button-gap` token:\n *\n * ```html\n * <button hubButton><hub-icon name=\"floppy-disk\" /> Save</button>\n * <button hubButton>Next <hub-icon name=\"arrow-right\" /></button>\n * <button hubButton aria-label=\"Settings\"><hub-icon name=\"gear\" /></button>\n * ```\n */\n@Component({\n\tselector: 'hub-button, [hubButton]',\n\tstandalone: true,\n\ttemplateUrl: './button.component.html',\n\tstyleUrl: './button.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-btn',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-btn-accent]': '_accent',\n\t\t'[attr.disabled]': '_disabledAttr',\n\t\t'[attr.aria-busy]': '_ariaBusy',\n\t\t'[attr.aria-disabled]': '_ariaDisabled',\n\t\t'[attr.role]': '_role',\n\t\t'[attr.tabindex]': '_tabindex',\n\t\t'(keydown)': '_onKeydown($event)'\n\t}\n})\nexport class HubButtonComponent {\n\t/**\n\t * Whether this instance renders as the `<hub-button>` element (vs `[hubButton]` on a\n\t * native host). Read once from the host tag at construction — a static host fact that\n\t * is available immediately (unlike input signals, which are not populated in the\n\t * constructor). Gates the a11y host bindings so they only apply to the element form.\n\t */\n\tprivate readonly _isElementForm = inject(ElementRef).nativeElement.tagName === 'HUB-BUTTON';\n\n\t/** Visual style of the button. */\n\tvariant = input<HubBtnVariant>('solid');\n\n\t/** Semantic color token. */\n\tcolor = input<HubSemanticColor>('primary');\n\n\t/** Size token. */\n\tsize = input<HubBtnSize>('md');\n\n\t/**\n\t * When true, shows the spinner and marks the button **busy and disabled**: it\n\t * reflects `aria-busy=\"true\"`, becomes non-focusable and inert to pointer and\n\t * keyboard, and (like {@link disabled}) reflects the native `disabled` attribute\n\t * so an in-flight submit button cannot be triggered twice.\n\t */\n\tloading = input(false);\n\n\t/** Mirrors the native disabled attribute on the host element. */\n\tdisabled = input(false);\n\n\t/**\n\t * True while the button must not respond to interaction — either explicitly\n\t * {@link disabled} or busy {@link loading}. Drives the native `disabled`\n\t * reflection, the tab-order removal and the keyboard-activation guard so both\n\t * states are inert through a single source of truth.\n\t */\n\tprivate get _isInert(): boolean {\n\t\treturn this.disabled() || this.loading();\n\t}\n\n\t/** Computed CSS classes applied to the host element via the `[class]` host binding. */\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\t`hub-btn-${this.variant()}`,\n\t\t\t`hub-btn-${this.color()}`,\n\t\t\t`hub-btn-${this.size()}`,\n\t\t\tthis.loading() ? 'hub-btn-loading' : '',\n\t\t\tthis.disabled() ? 'hub-btn-disabled' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The single semantic accent consumed by the stylesheet (`--hub-btn-accent`),\n\t * from which every visual role (emphasis / subtle / on) is derived at runtime.\n\t *\n\t * Accepts ANY colour: a bareword (a built-in semantic name, a host-registered\n\t * accent or a CSS named colour) resolves to its `--hub-sys-color-<name>` token\n\t * with the bareword itself as the raw fallback, so unregistered names still\n\t * paint; a literal (`#hex`, `rgb()`, `oklch()`, `var(...)`) is passed through\n\t * unchanged. The built-in `hub-btn-<color>` appearance classes remain in place.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn resolveHubAccent(this.color());\n\t}\n\n\t/** Reflects the inert state (disabled or loading) as the native `disabled` attribute. */\n\tprotected get _disabledAttr(): true | null {\n\t\treturn this._isInert ? true : null;\n\t}\n\n\t/** Announces the busy state to assistive tech while loading. */\n\tprotected get _ariaBusy(): 'true' | null {\n\t\treturn this.loading() ? 'true' : null;\n\t}\n\n\t/**\n\t * Conveys the inert state to assistive tech on the element form, whose custom\n\t * host tag does not natively expose `disabled`. Bound to nothing for the\n\t * attribute form (its native host already exposes the state).\n\t */\n\tprotected get _ariaDisabled(): 'true' | null {\n\t\treturn this._isElementForm && this._isInert ? 'true' : null;\n\t}\n\n\t/**\n\t * Advertises `role=\"button\"` for the element form only. The attribute form binds\n\t * nothing (its native host already exposes the correct role).\n\t */\n\tprotected get _role(): 'button' | null {\n\t\treturn this._isElementForm ? 'button' : null;\n\t}\n\n\t/**\n\t * Makes the element form keyboard-focusable (`0`), or removes it from the tab order\n\t * when inert — disabled or loading (`-1`). Bound to nothing for the attribute form.\n\t */\n\tprotected get _tabindex(): number | null {\n\t\tif (!this._isElementForm) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._isInert ? -1 : 0;\n\t}\n\n\t/**\n\t * Emulates native button keyboard activation for the element form: Enter or Space\n\t * triggers a click. Space additionally calls `preventDefault()` to stop the page from\n\t * scrolling. No-op for the attribute form (the native host already handles keys) and\n\t * while inert (disabled or loading).\n\t * @param event The originating keyboard event.\n\t */\n\tprotected _onKeydown(event: KeyboardEvent): void {\n\t\tif (!this._isElementForm || this._isInert) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isSpace = event.key === ' ' || event.key === 'Spacebar';\n\n\t\tif (event.key === 'Enter' || isSpace) {\n\t\t\tif (isSpace) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\t(event.currentTarget as HTMLElement).click();\n\t\t}\n\t}\n}\n","@if (loading()) {\n\t<span class=\"hub-btn__spinner\" aria-hidden=\"true\"></span>\n}\n<ng-content></ng-content>\n","import { ChangeDetectionStrategy, Component, DestroyRef, OnInit, ViewEncapsulation, inject, input, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { fromEvent } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { HubFabPosition, HubFabSize, HubSemanticColor } from '../../models/button.types';\n\n/**\n * Floating Action Button component. Renders fixed in the viewport at the given position.\n * Supports circular and extended (pill with label) variants.\n * When collapseOnScroll is true, an extended FAB collapses to icon-only after 50px scroll.\n * Uses inset-inline-* / inset-block-* CSS logical properties for RTL support.\n */\n@Component({\n\tselector: 'hub-fab',\n\tstandalone: true,\n\ttemplateUrl: './fab.component.html',\n\tstyleUrl: './fab.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-fab',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-fab-accent]': '_accent'\n\t},\n\tencapsulation: ViewEncapsulation.None\n})\nexport class HubFabComponent implements OnInit {\n\tcolor = input<HubSemanticColor>('primary');\n\tsize = input<HubFabSize>('standard');\n\textended = input(false);\n\t/** Fixed viewport position. 9-slot grid including center. */\n\tposition = input<HubFabPosition>('bottom-end');\n\t/** When true, collapses an extended FAB to icon-only on page scroll. */\n\tcollapseOnScroll = input(false);\n\tdisabled = input(false);\n\tfabClick = output<void>();\n\n\t/** Collapse state driven by scroll — only active when extended + collapseOnScroll. */\n\tprotected readonly _collapsed = signal(false);\n\n\tprivate readonly _destroyRef = inject(DestroyRef);\n\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\t`hub-fab-${this.color()}`,\n\t\t\t`hub-fab-${this.size()}`,\n\t\t\t`hub-fab-${this.position()}`,\n\t\t\tthis.extended() && !this._collapsed() ? 'hub-fab-extended' : '',\n\t\t\tthis.disabled() ? 'hub-fab-disabled' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The semantic accent consumed by the base `.hub-fab` background slot\n\t * (`--hub-fab-accent`). Accepts ANY colour: a bareword (a built-in semantic\n\t * name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Built-in `hub-fab-<color>` classes\n\t * keep overriding the background, so this slot only paints custom / literal\n\t * colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn resolveHubAccent(this.color());\n\t}\n\n\tngOnInit(): void {\n\t\tif (!this.collapseOnScroll()) return;\n\n\t\tfromEvent(window, 'scroll', { passive: true })\n\t\t\t.pipe(debounceTime(50), takeUntilDestroyed(this._destroyRef))\n\t\t\t.subscribe(() => {\n\t\t\t\tthis._collapsed.set(window.scrollY > 50);\n\t\t\t});\n\t}\n}\n","<ng-content select=\"[slot=icon]\"></ng-content>\n\n@if (extended() && !_collapsed()) {\n\t<span class=\"hub-fab__label\">\n\t\t<ng-content select=\"[slot=label]\"></ng-content>\n\t</span>\n} @else if (!extended()) {\n\t<ng-content></ng-content>\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, PLATFORM_ID, inject, input, model, output } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { HubFabPosition, HubFabSize, HubSemanticColor } from '../../models/button.types';\n\n/**\n * FAB that expands a stack of HubSpeedDialItemComponent children on click or hover.\n * Supports 4 expansion directions and all 9 FAB viewport positions.\n * Closes automatically on Escape key press.\n */\n@Component({\n\tselector: 'hub-speed-dial',\n\tstandalone: true,\n\ttemplateUrl: './speed-dial.component.html',\n\tstyleUrl: './speed-dial.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-speed-dial',\n\t\t'[class]': '_hostClass'\n\t}\n})\nexport class HubSpeedDialComponent {\n\tcolor = input<HubSemanticColor>('primary');\n\tsize = input<HubFabSize>('standard');\n\tposition = input<HubFabPosition>('bottom-end');\n\tdirection = input<'up' | 'down' | 'left' | 'right'>('up');\n\ttrigger = input<'click' | 'hover'>('click');\n\tisOpen = model(false);\n\topened = output<void>();\n\tclosed = output<void>();\n\n\tprivate readonly _destroyRef = inject(DestroyRef);\n\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\t`hub-speed-dial-${this.color()}`,\n\t\t\t`hub-speed-dial-${this.position()}`,\n\t\t\t`hub-speed-dial-${this.direction()}`,\n\t\t\tthis.isOpen() ? 'hub-speed-dial-open' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The semantic accent painted on the inner `.hub-fab` trigger button through its\n\t * `--hub-fab-accent` slot. Accepts ANY colour: a bareword (a built-in semantic\n\t * name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Built-in `hub-fab-<color>` classes on\n\t * the trigger keep overriding the background, so this slot only paints custom /\n\t * literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn resolveHubAccent(this.color());\n\t}\n\n\tconstructor() {\n\t\t// Escape-to-close relies on DOM events; inert on the server (SSR/prerender).\n\t\tif (isPlatformBrowser(inject(PLATFORM_ID))) {\n\t\t\tfromEvent<KeyboardEvent>(inject(DOCUMENT), 'keydown')\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((e) => e.key === 'Escape' && this.isOpen()),\n\t\t\t\t\ttakeUntilDestroyed(this._destroyRef)\n\t\t\t\t)\n\t\t\t\t.subscribe(() => this.close());\n\t\t}\n\t}\n\n\t/** Toggle the speed dial open/closed. */\n\ttoggle(): void {\n\t\tthis.isOpen() ? this.close() : this.open();\n\t}\n\n\t/** Open the speed dial and emit the opened event. */\n\topen(): void {\n\t\tthis.isOpen.set(true);\n\t\tthis.opened.emit();\n\t}\n\n\t/** Close the speed dial and emit the closed event. */\n\tclose(): void {\n\t\tthis.isOpen.set(false);\n\t\tthis.closed.emit();\n\t}\n}\n","<button\n\tclass=\"hub-fab\"\n\t[class]=\"'hub-fab-' + color() + ' hub-fab-' + size()\"\n\t[style.--hub-fab-accent]=\"_accent\"\n\t(click)=\"trigger() === 'click' && toggle()\"\n\t(mouseenter)=\"trigger() === 'hover' && open()\"\n\t(mouseleave)=\"trigger() === 'hover' && close()\"\n\ttype=\"button\"\n\t[attr.aria-expanded]=\"isOpen()\"\n\taria-haspopup=\"true\">\n\t<ng-content select=\"[hubTrigger]\"></ng-content>\n</button>\n\n@if (isOpen()) {\n\t<div class=\"hub-speed-dial__actions\" [attr.data-direction]=\"direction()\">\n\t\t<ng-content></ng-content>\n\t</div>\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubSemanticColor } from '../../../models/button.types';\n\n/**\n * Secondary action item rendered inside HubSpeedDialComponent.\n * Emits itemClick when activated. Supports an optional label tooltip.\n */\n@Component({\n\tselector: 'hub-speed-dial-item',\n\tstandalone: true,\n\ttemplateUrl: './speed-dial-item.component.html',\n\tstyleUrl: './speed-dial-item.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class HubSpeedDialItemComponent {\n\t/** Icon character or ligature string displayed in the action button. */\n\ticon = input.required<string>();\n\t/** Tooltip label shown next to the action button. */\n\tlabel = input('');\n\tcolor = input<HubSemanticColor | 'default'>('default');\n\tdisabled = input(false);\n\titemClick = output<void>();\n\n\t/**\n\t * The semantic accent painted on the action button through its\n\t * `--hub-speed-dial-item-accent` slot. Accepts ANY colour: a bareword (a\n\t * built-in semantic name, a host-registered accent or a CSS named colour)\n\t * resolves to its `--hub-sys-color-<name>` token with the bareword as the raw\n\t * fallback, so unregistered names still paint; a literal (`#hex`, `rgb()`,\n\t * `oklch()`, `var(...)`) is passed through unchanged. Returns `null` for the\n\t * `default` colour and for the built-in classes, which paint themselves — the\n\t * slot only takes effect for custom / literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn this.color() === 'default' ? null : resolveHubAccent(this.color());\n\t}\n}\n","@if (label()) {\n\t<span class=\"hub-speed-dial-item__label\">{{ label() }}</span>\n}\n<button\n\tclass=\"hub-speed-dial-item__btn\"\n\t[class]=\"'hub-speed-dial-item__btn--' + color()\"\n\t[style.--hub-speed-dial-item-accent]=\"_accent\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"itemClick.emit()\"\n\ttype=\"button\"\n\t[attr.aria-label]=\"label() || icon()\">\n\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n</button>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubSemanticColor } from '../../models/button.types';\n\n/**\n * Styled container for dropdown content.\n * Renders a shadowed panel with an optional semantic color top-border accent.\n * Place hub-dropdown-item, hub-dropdown-divider, and hub-dropdown-header children inside.\n */\n@Component({\n\tselector: 'hub-dropdown-panel',\n\tstandalone: true,\n\ttemplate: `<ng-content></ng-content>`,\n\tstyleUrl: './dropdown-panel.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-dropdown-panel',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-dropdown-panel-accent]': '_accent'\n\t}\n})\nexport class HubDropdownPanelComponent {\n\t/** Adds a semantic color accent to the panel top border. */\n\tcolor = input<HubSemanticColor | 'default'>('default');\n\n\tprotected get _hostClass(): string {\n\t\treturn this.color() !== 'default' ? `hub-dropdown-panel-${this.color()}` : '';\n\t}\n\n\t/**\n\t * The semantic accent painted on the panel top border through the\n\t * `--hub-dropdown-panel-accent` slot. Accepts ANY colour: a bareword (a built-in\n\t * semantic name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Returns `null` for the `default`\n\t * colour (the border keeps its neutral colour) and for the built-in classes,\n\t * which paint their own thicker accent — the slot only takes effect for custom /\n\t * literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn this.color() === 'default' ? null : resolveHubAccent(this.color());\n\t}\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubSemanticColor } from '../../models/button.types';\n\n/**\n * Menu item for use inside HubDropdownPanelComponent.\n * Emits itemClick when activated. Supports an optional icon, selected state and semantic color.\n */\n@Component({\n\tselector: 'hub-dropdown-item',\n\tstandalone: true,\n\ttemplateUrl: './dropdown-item.component.html',\n\tstyleUrl: './dropdown-item.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-dropdown-item',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-dropdown-item-accent]': '_accent'\n\t}\n})\nexport class HubDropdownItemComponent {\n\tcolor = input<HubSemanticColor | 'default'>('default');\n\t/** Optional icon character or ligature displayed before the label. */\n\ticon = input<string>();\n\tdisabled = input(false);\n\t/** Shows a checkmark indicator when selected. */\n\tselected = input(false);\n\titemClick = output<void>();\n\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\tthis.color() !== 'default' ? `hub-dropdown-item-${this.color()}` : '',\n\t\t\tthis.disabled() ? 'hub-dropdown-item-disabled' : '',\n\t\t\tthis.selected() ? 'hub-dropdown-item-selected' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The semantic accent painted as the item label colour through the\n\t * `--hub-dropdown-item-accent` slot. Accepts ANY colour: a bareword (a built-in\n\t * semantic name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Returns `null` for the `default`\n\t * colour (the item inherits its colour) and for the built-in classes, which\n\t * paint themselves — the slot only takes effect for custom / literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn this.color() === 'default' ? null : resolveHubAccent(this.color());\n\t}\n\n\tprotected _handleClick(): void {\n\t\tif (this.disabled()) return;\n\t\tthis.itemClick.emit();\n\t}\n}\n","<button\n\tclass=\"hub-dropdown-item__inner\"\n\ttype=\"button\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"_handleClick()\">\n\t@if (icon()) {\n\t\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n\t}\n\t<span class=\"hub-dropdown-item__label\"><ng-content></ng-content></span>\n\t@if (selected()) {\n\t\t<span class=\"hub-dropdown-item__check\" aria-hidden=\"true\">✓</span>\n\t}\n</button>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** Horizontal separator for grouping items inside HubDropdownPanelComponent. */\n@Component({\n\tselector: 'hub-dropdown-divider',\n\tstandalone: true,\n\ttemplate: '',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-dropdown-divider',\n\t\trole: 'separator',\n\t\t'aria-hidden': 'true'\n\t},\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 1px;\n\t\t\t\tbackground: var(--hub-dropdown-divider-color, var(--hub-sys-color-border-subtle, #dee2e6));\n\t\t\t\tmargin: var(--hub-ref-space-1, 0.25rem) 0;\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubDropdownDividerComponent {}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** Group label for organizing items inside HubDropdownPanelComponent. */\n@Component({\n\tselector: 'hub-dropdown-header',\n\tstandalone: true,\n\ttemplate: `<ng-content></ng-content>`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'hub-dropdown-header' },\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tpadding: 0.375rem var(--hub-dropdown-header-padding-x, var(--hub-ref-space-3, 1rem)) 0.1875rem;\n\t\t\t\tfont-size: var(--hub-dropdown-header-font-size, var(--hub-ref-font-size-xs, 0.75rem));\n\t\t\t\tfont-weight: var(--hub-ref-font-weight-bold, 700);\n\t\t\t\tcolor: var(--hub-dropdown-header-color, var(--hub-sys-color-text-subtle, #6c757d));\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubDropdownHeaderComponent {}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n\tDestroyRef,\n\tDirective,\n\tElementRef,\n\tPLATFORM_ID,\n\tTemplateRef,\n\tViewContainerRef,\n\tinject,\n\tinput,\n\tmodel,\n\toutput,\n\tsignal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { OverlayService } from 'ng-hub-ui-utils';\nimport type { OverlayRef, ConnectionPosition } from 'ng-hub-ui-utils';\nimport { HubDropdownPlacement } from '../models/button.types';\n\n/**\n * Turns any host element into a dropdown trigger.\n * Renders an ng-template in a body-level overlay managed by OverlayService (no CDK).\n * When closeOnSelect is true, any click inside the panel closes the overlay automatically.\n */\n@Directive({\n\tselector: '[hubDropdown]',\n\tstandalone: true,\n\texportAs: 'hubDropdown',\n\thost: {\n\t\t'(click)': '_onHostClick()',\n\t\t'(mouseenter)': '_onHostEnter()',\n\t\t'(mouseleave)': '_onHostLeave()'\n\t}\n})\nexport class HubDropdownDirective {\n\t/** The ng-template to render inside the overlay panel. */\n\ttpl = input.required<TemplateRef<any>>({ alias: 'hubDropdown' });\n\tplacement = input<HubDropdownPlacement>('bottom-start');\n\ttrigger = input<'click' | 'hover'>('click');\n\t/** When true, any click inside the panel content closes the dropdown. */\n\tcloseOnSelect = input(true);\n\tdisabled = input(false);\n\t/** Vertical offset in pixels between the trigger and the panel. */\n\toffsetY = input(4);\n\tpanelClass = input('');\n\tisOpen = model(false);\n\topened = output<void>();\n\tclosed = output<void>();\n\n\tprivate _overlayRef: OverlayRef | null = null;\n\n\tprivate readonly _el = inject(ElementRef<HTMLElement>);\n\tprivate readonly _vcr = inject(ViewContainerRef);\n\tprivate readonly _overlay = inject(OverlayService);\n\tprivate readonly _destroyRef = inject(DestroyRef);\n\tprivate readonly _document = inject(DOCUMENT);\n\n\tconstructor() {\n\t\t// Escape-to-close relies on DOM events; inert on the server (SSR/prerender).\n\t\tif (isPlatformBrowser(inject(PLATFORM_ID))) {\n\t\t\tfromEvent<KeyboardEvent>(this._document, 'keydown')\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((e) => e.key === 'Escape' && this.isOpen()),\n\t\t\t\t\ttakeUntilDestroyed(this._destroyRef)\n\t\t\t\t)\n\t\t\t\t.subscribe(() => this.close());\n\t\t}\n\t}\n\n\t/** Open the dropdown and mount the overlay. */\n\topen(): void {\n\t\tif (this.disabled() || this.isOpen()) return;\n\n\t\tconst positionStrategy = this._overlay.position().flexibleConnectedTo(this._el).withPositions(this._buildPositions());\n\n\t\tconst panelClasses = ['hub-dropdown-overlay'];\n\t\tif (this.panelClass()) panelClasses.push(this.panelClass());\n\n\t\tthis._overlayRef = this._overlay.create({ positionStrategy, panelClass: panelClasses });\n\n\t\tconst panelEl = this._overlayRef.attach(this.tpl(), this._vcr);\n\n\t\t// Close on click-outside via backdrop\n\t\tthis._overlayRef.onBackdropClick(() => this.close());\n\n\t\t// Close on click-inside when closeOnSelect is true\n\t\tif (this.closeOnSelect() && panelEl) {\n\t\t\tfromEvent<MouseEvent>(panelEl, 'click')\n\t\t\t\t.pipe(take(1), takeUntilDestroyed(this._destroyRef))\n\t\t\t\t.subscribe(() => this.close());\n\t\t}\n\n\t\tthis.isOpen.set(true);\n\t\tthis.opened.emit();\n\n\t\t// Close on scroll so the panel stays aligned with the trigger\n\t\tfromEvent(this._document, 'scroll', { passive: true, capture: true })\n\t\t\t.pipe(take(1), takeUntilDestroyed(this._destroyRef))\n\t\t\t.subscribe(() => this.close());\n\n\t\t// Click-outside detection (document-level)\n\t\tfromEvent<MouseEvent>(this._document, 'click')\n\t\t\t.pipe(\n\t\t\t\tfilter((e) => !this._el.nativeElement.contains(e.target as Node) && !!this._overlayRef?.hasAttached()),\n\t\t\t\ttake(1),\n\t\t\t\ttakeUntilDestroyed(this._destroyRef)\n\t\t\t)\n\t\t\t.subscribe(() => this.close());\n\t}\n\n\t/** Close the dropdown and destroy the overlay. */\n\tclose(): void {\n\t\tif (!this.isOpen()) return;\n\t\tthis._overlayRef?.detach();\n\t\tthis._overlayRef?.dispose();\n\t\tthis._overlayRef = null;\n\t\tthis.isOpen.set(false);\n\t\tthis.closed.emit();\n\t}\n\n\t/** Toggle between open and closed. */\n\ttoggle(): void {\n\t\tthis.isOpen() ? this.close() : this.open();\n\t}\n\n\tprotected _onHostClick(): void {\n\t\tif (this.trigger() === 'click') this.toggle();\n\t}\n\n\tprotected _onHostEnter(): void {\n\t\tif (this.trigger() === 'hover') this.open();\n\t}\n\n\tprotected _onHostLeave(): void {\n\t\tif (this.trigger() === 'hover') this.close();\n\t}\n\n\t/**\n\t * Translates HubDropdownPlacement tokens to ConnectionPosition arrays.\n\t * The OverlayPosition tries each entry in order, using the first that fits.\n\t */\n\tprivate _buildPositions(): ConnectionPosition[] {\n\t\tconst o = this.offsetY();\n\t\tconst map: Record<HubDropdownPlacement, ConnectionPosition[]> = {\n\t\t\t'bottom-start': [{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: o }],\n\t\t\tbottom: [{ originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: o }],\n\t\t\t'bottom-end': [{ originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: o }],\n\t\t\t'top-start': [{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -o }],\n\t\t\ttop: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -o }],\n\t\t\t'top-end': [{ originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -o }],\n\t\t\tstart: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -o }],\n\t\t\tend: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: o }]\n\t\t};\n\t\treturn map[this.placement()];\n\t}\n}\n","/*\n * Public API Surface of ng-hub-ui-buttons\n */\n\n// Types\nexport * from './lib/models/button.types';\n\n// Tokens\nexport * from './lib/tokens/dropdown.token';\n\n// Components\nexport * from './lib/components/btn/button.component';\n/**\n * @deprecated Renamed to `HubButtonComponent`. The component now also matches the\n * `[hubButton]` attribute selector, so it replaces the former `HubBtnDirective`.\n */\nexport { HubButtonComponent as HubBtnComponent } from './lib/components/btn/button.component';\n/**\n * @deprecated Replaced by `HubButtonComponent`, which now matches `[hubButton]` itself\n * (and renders the loading spinner in the attribute form too).\n */\nexport { HubButtonComponent as HubBtnDirective } from './lib/components/btn/button.component';\nexport * from './lib/components/fab/fab.component';\nexport * from './lib/components/speed-dial/speed-dial.component';\nexport * from './lib/components/speed-dial/speed-dial-item/speed-dial-item.component';\nexport * from './lib/components/dropdown-panel/dropdown-panel.component';\nexport * from './lib/components/dropdown-item/dropdown-item.component';\nexport * from './lib/components/dropdown-divider/dropdown-divider.component';\nexport * from './lib/components/dropdown-header/dropdown-header.component';\n\n// Directives\nexport * from './lib/directives/dropdown.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-hub-ui-buttons.mjs","sources":["../../../projects/buttons/src/lib/tokens/dropdown.token.ts","../../../projects/buttons/src/lib/components/btn/button.component.ts","../../../projects/buttons/src/lib/components/btn/button.component.html","../../../projects/buttons/src/lib/components/fab/fab.component.ts","../../../projects/buttons/src/lib/components/fab/fab.component.html","../../../projects/buttons/src/lib/components/speed-dial/speed-dial.component.ts","../../../projects/buttons/src/lib/components/speed-dial/speed-dial.component.html","../../../projects/buttons/src/lib/components/speed-dial/speed-dial-item/speed-dial-item.component.ts","../../../projects/buttons/src/lib/components/speed-dial/speed-dial-item/speed-dial-item.component.html","../../../projects/buttons/src/lib/components/dropdown-panel/dropdown-panel.component.ts","../../../projects/buttons/src/lib/components/dropdown-item/dropdown-item.component.ts","../../../projects/buttons/src/lib/components/dropdown-item/dropdown-item.component.html","../../../projects/buttons/src/lib/components/dropdown-divider/dropdown-divider.component.ts","../../../projects/buttons/src/lib/components/dropdown-header/dropdown-header.component.ts","../../../projects/buttons/src/lib/directives/dropdown.directive.ts","../../../projects/buttons/src/public-api.ts","../../../projects/buttons/src/ng-hub-ui-buttons.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\n/**\n * Context shared between HubDropdownDirective and its panel/item descendants.\n * Injected by the directive; consumed by HubDropdownPanelComponent and\n * HubDropdownItemComponent to implement closeOnSelect without prop drilling.\n */\nexport interface DropdownContext {\n\t/** Whether clicking an item should close the dropdown. */\n\treadonly closeOnSelect: Signal<boolean>;\n\t/** Imperatively close the dropdown. */\n\tclose(): void;\n}\n\n/** Injection token for DropdownContext. */\nexport const DROPDOWN_CONTEXT = new InjectionToken<DropdownContext>('HubDropdownContext');\n","import { ChangeDetectionStrategy, Component, ElementRef, inject, input } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubBtnSize, HubBtnVariant, HubSemanticColor } from '../../models/button.types';\n\n/**\n * Styled button. Applies `hub-btn` CSS classes computed from signal inputs and\n * renders an optional loading spinner around the projected content.\n *\n * Usable in two interchangeable forms from the same class:\n * - As an element: `<hub-button variant=\"solid\" color=\"primary\">Save</hub-button>`.\n * - As an attribute on any host: `<button hubButton>Save</button>` / `<a hubButton href=\"…\">Link</a>`.\n *\n * Prefer the attribute form on a native `<button>` / `<a>` when you need real button\n * semantics (focus, keyboard activation, form submission). The `<hub-button>` **element**\n * form is only a styling host — a component cannot swap its own host tag for a native\n * `<button>` — so it self-advertises `role=\"button\"`, a focusable `tabindex`, and\n * Enter/Space keyboard activation to stay accessible. The `[hubButton]` attribute form on\n * a native `<button>`/`<a>` adds **none** of these bindings (the host is already\n * interactive; a redundant `role`/`tabindex` would be harmful).\n *\n * **Accessibility caveat:** an element-form `<hub-button>` now reports `role=\"button\"`,\n * so it must not be nested inside another interactive element (a `<button>`, `<a>` or any\n * host that is itself a control), which would produce an invalid nested-interactive tree.\n *\n * **Icons:** project whatever you want as content — the button is icon-library\n * agnostic. The icon's position follows the markup order, and the label/icon gap\n * is the `--hub-button-gap` token:\n *\n * ```html\n * <button hubButton><hub-icon name=\"floppy-disk\" /> Save</button>\n * <button hubButton>Next <hub-icon name=\"arrow-right\" /></button>\n * <button hubButton aria-label=\"Settings\"><hub-icon name=\"gear\" /></button>\n * ```\n */\n@Component({\n\tselector: 'hub-button, [hubButton]',\n\tstandalone: true,\n\ttemplateUrl: './button.component.html',\n\tstyleUrl: './button.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-btn',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-btn-accent]': '_accent',\n\t\t'[attr.disabled]': '_disabledAttr',\n\t\t'[attr.aria-busy]': '_ariaBusy',\n\t\t'[attr.aria-disabled]': '_ariaDisabled',\n\t\t'[attr.role]': '_role',\n\t\t'[attr.tabindex]': '_tabindex',\n\t\t'(keydown)': '_onKeydown($event)'\n\t}\n})\nexport class HubButtonComponent {\n\t/**\n\t * Whether this instance renders as the `<hub-button>` element (vs `[hubButton]` on a\n\t * native host). Read once from the host tag at construction — a static host fact that\n\t * is available immediately (unlike input signals, which are not populated in the\n\t * constructor). Gates the a11y host bindings so they only apply to the element form.\n\t */\n\tprivate readonly _isElementForm = inject(ElementRef).nativeElement.tagName === 'HUB-BUTTON';\n\n\t/** Visual style of the button. */\n\tvariant = input<HubBtnVariant>('solid');\n\n\t/** Semantic color token. */\n\tcolor = input<HubSemanticColor>('primary');\n\n\t/** Size token. */\n\tsize = input<HubBtnSize>('md');\n\n\t/**\n\t * When true, shows the spinner and marks the button **busy and disabled**: it\n\t * reflects `aria-busy=\"true\"`, becomes non-focusable and inert to pointer and\n\t * keyboard, and (like {@link disabled}) reflects the native `disabled` attribute\n\t * so an in-flight submit button cannot be triggered twice.\n\t */\n\tloading = input(false);\n\n\t/** Mirrors the native disabled attribute on the host element. */\n\tdisabled = input(false);\n\n\t/**\n\t * True while the button must not respond to interaction — either explicitly\n\t * {@link disabled} or busy {@link loading}. Drives the native `disabled`\n\t * reflection, the tab-order removal and the keyboard-activation guard so both\n\t * states are inert through a single source of truth.\n\t */\n\tprivate get _isInert(): boolean {\n\t\treturn this.disabled() || this.loading();\n\t}\n\n\t/** Computed CSS classes applied to the host element via the `[class]` host binding. */\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\t`hub-btn-${this.variant()}`,\n\t\t\t`hub-btn-${this.color()}`,\n\t\t\t`hub-btn-${this.size()}`,\n\t\t\tthis.loading() ? 'hub-btn-loading' : '',\n\t\t\tthis.disabled() ? 'hub-btn-disabled' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The single semantic accent consumed by the stylesheet (`--hub-btn-accent`),\n\t * from which every visual role (emphasis / subtle / on) is derived at runtime.\n\t *\n\t * Accepts ANY colour: a bareword (a built-in semantic name, a host-registered\n\t * accent or a CSS named colour) resolves to its `--hub-sys-color-<name>` token\n\t * with the bareword itself as the raw fallback, so unregistered names still\n\t * paint; a literal (`#hex`, `rgb()`, `oklch()`, `var(...)`) is passed through\n\t * unchanged. The built-in `hub-btn-<color>` appearance classes remain in place.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn resolveHubAccent(this.color());\n\t}\n\n\t/** Reflects the inert state (disabled or loading) as the native `disabled` attribute. */\n\tprotected get _disabledAttr(): true | null {\n\t\treturn this._isInert ? true : null;\n\t}\n\n\t/** Announces the busy state to assistive tech while loading. */\n\tprotected get _ariaBusy(): 'true' | null {\n\t\treturn this.loading() ? 'true' : null;\n\t}\n\n\t/**\n\t * Conveys the inert state to assistive tech on the element form, whose custom\n\t * host tag does not natively expose `disabled`. Bound to nothing for the\n\t * attribute form (its native host already exposes the state).\n\t */\n\tprotected get _ariaDisabled(): 'true' | null {\n\t\treturn this._isElementForm && this._isInert ? 'true' : null;\n\t}\n\n\t/**\n\t * Advertises `role=\"button\"` for the element form only. The attribute form binds\n\t * nothing (its native host already exposes the correct role).\n\t */\n\tprotected get _role(): 'button' | null {\n\t\treturn this._isElementForm ? 'button' : null;\n\t}\n\n\t/**\n\t * Makes the element form keyboard-focusable (`0`), or removes it from the tab order\n\t * when inert — disabled or loading (`-1`). Bound to nothing for the attribute form.\n\t */\n\tprotected get _tabindex(): number | null {\n\t\tif (!this._isElementForm) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._isInert ? -1 : 0;\n\t}\n\n\t/**\n\t * Emulates native button keyboard activation for the element form: Enter or Space\n\t * triggers a click. Space additionally calls `preventDefault()` to stop the page from\n\t * scrolling. No-op for the attribute form (the native host already handles keys) and\n\t * while inert (disabled or loading).\n\t * @param event The originating keyboard event.\n\t */\n\tprotected _onKeydown(event: KeyboardEvent): void {\n\t\tif (!this._isElementForm || this._isInert) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isSpace = event.key === ' ' || event.key === 'Spacebar';\n\n\t\tif (event.key === 'Enter' || isSpace) {\n\t\t\tif (isSpace) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\t(event.currentTarget as HTMLElement).click();\n\t\t}\n\t}\n}\n","@if (loading()) {\n\t<span class=\"hub-btn__spinner\" aria-hidden=\"true\"></span>\n}\n<ng-content></ng-content>\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tDestroyRef,\n\tOnInit,\n\tViewEncapsulation,\n\tinject,\n\tinput,\n\toutput,\n\tsignal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { fromEvent } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { HubFabPosition, HubFabSize, HubSemanticColor } from '../../models/button.types';\n\n/**\n * Floating Action Button component. Renders fixed in the viewport at the given position.\n * Supports circular and extended (pill with label) variants.\n * When collapseOnScroll is true, an extended FAB collapses to icon-only after 50px scroll.\n * Uses inset-inline-* / inset-block-* CSS logical properties for RTL support.\n */\n@Component({\n\tselector: 'hub-fab',\n\tstandalone: true,\n\ttemplateUrl: './fab.component.html',\n\tstyleUrl: './fab.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-fab',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-fab-accent]': '_accent'\n\t},\n\tencapsulation: ViewEncapsulation.None\n})\nexport class HubFabComponent implements OnInit {\n\tcolor = input<HubSemanticColor>('primary');\n\tsize = input<HubFabSize>('standard');\n\textended = input(false);\n\t/** Fixed viewport position. 9-slot grid including center. */\n\tposition = input<HubFabPosition>('bottom-end');\n\t/** When true, collapses an extended FAB to icon-only on page scroll. */\n\tcollapseOnScroll = input(false);\n\tdisabled = input(false);\n\tfabClick = output<void>();\n\n\t/** Collapse state driven by scroll — only active when extended + collapseOnScroll. */\n\tprotected readonly _collapsed = signal(false);\n\n\tprivate readonly _destroyRef = inject(DestroyRef);\n\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\t`hub-fab-${this.color()}`,\n\t\t\t`hub-fab-${this.size()}`,\n\t\t\t`hub-fab-${this.position()}`,\n\t\t\tthis.extended() && !this._collapsed() ? 'hub-fab-extended' : '',\n\t\t\tthis.disabled() ? 'hub-fab-disabled' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The semantic accent consumed by the base `.hub-fab` background slot\n\t * (`--hub-fab-accent`). Accepts ANY colour: a bareword (a built-in semantic\n\t * name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Built-in `hub-fab-<color>` classes\n\t * keep overriding the background, so this slot only paints custom / literal\n\t * colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn resolveHubAccent(this.color());\n\t}\n\n\tngOnInit(): void {\n\t\tif (!this.collapseOnScroll()) return;\n\n\t\tfromEvent(window, 'scroll', { passive: true })\n\t\t\t.pipe(debounceTime(50), takeUntilDestroyed(this._destroyRef))\n\t\t\t.subscribe(() => {\n\t\t\t\tthis._collapsed.set(window.scrollY > 50);\n\t\t\t});\n\t}\n}\n","<ng-content select=\"[slot=icon]\"></ng-content>\n\n@if (extended() && !_collapsed()) {\n\t<span class=\"hub-fab__label\">\n\t\t<ng-content select=\"[slot=label]\"></ng-content>\n\t</span>\n} @else if (!extended()) {\n\t<ng-content></ng-content>\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, PLATFORM_ID, inject, input, model, output } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { HubFabPosition, HubFabSize, HubSemanticColor } from '../../models/button.types';\n\n/**\n * FAB that expands a stack of HubSpeedDialItemComponent children on click or hover.\n * Supports 4 expansion directions and all 9 FAB viewport positions.\n * Closes automatically on Escape key press.\n */\n@Component({\n\tselector: 'hub-speed-dial',\n\tstandalone: true,\n\ttemplateUrl: './speed-dial.component.html',\n\tstyleUrl: './speed-dial.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-speed-dial',\n\t\t'[class]': '_hostClass'\n\t}\n})\nexport class HubSpeedDialComponent {\n\tcolor = input<HubSemanticColor>('primary');\n\tsize = input<HubFabSize>('standard');\n\tposition = input<HubFabPosition>('bottom-end');\n\tdirection = input<'up' | 'down' | 'left' | 'right'>('up');\n\ttrigger = input<'click' | 'hover'>('click');\n\tisOpen = model(false);\n\topened = output<void>();\n\tclosed = output<void>();\n\n\tprivate readonly _destroyRef = inject(DestroyRef);\n\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\t`hub-speed-dial-${this.color()}`,\n\t\t\t`hub-speed-dial-${this.position()}`,\n\t\t\t`hub-speed-dial-${this.direction()}`,\n\t\t\tthis.isOpen() ? 'hub-speed-dial-open' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The semantic accent painted on the inner `.hub-fab` trigger button through its\n\t * `--hub-fab-accent` slot. Accepts ANY colour: a bareword (a built-in semantic\n\t * name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Built-in `hub-fab-<color>` classes on\n\t * the trigger keep overriding the background, so this slot only paints custom /\n\t * literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn resolveHubAccent(this.color());\n\t}\n\n\tconstructor() {\n\t\t// Escape-to-close relies on DOM events; inert on the server (SSR/prerender).\n\t\tif (isPlatformBrowser(inject(PLATFORM_ID))) {\n\t\t\tfromEvent<KeyboardEvent>(inject(DOCUMENT), 'keydown')\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((e) => e.key === 'Escape' && this.isOpen()),\n\t\t\t\t\ttakeUntilDestroyed(this._destroyRef)\n\t\t\t\t)\n\t\t\t\t.subscribe(() => this.close());\n\t\t}\n\t}\n\n\t/** Toggle the speed dial open/closed. */\n\ttoggle(): void {\n\t\tthis.isOpen() ? this.close() : this.open();\n\t}\n\n\t/** Open the speed dial and emit the opened event. */\n\topen(): void {\n\t\tthis.isOpen.set(true);\n\t\tthis.opened.emit();\n\t}\n\n\t/** Close the speed dial and emit the closed event. */\n\tclose(): void {\n\t\tthis.isOpen.set(false);\n\t\tthis.closed.emit();\n\t}\n}\n","<button\n\tclass=\"hub-fab\"\n\t[class]=\"'hub-fab-' + color() + ' hub-fab-' + size()\"\n\t[style.--hub-fab-accent]=\"_accent\"\n\t(click)=\"trigger() === 'click' && toggle()\"\n\t(mouseenter)=\"trigger() === 'hover' && open()\"\n\t(mouseleave)=\"trigger() === 'hover' && close()\"\n\ttype=\"button\"\n\t[attr.aria-expanded]=\"isOpen()\"\n\taria-haspopup=\"true\"\n>\n\t<ng-content select=\"[hubTrigger]\"></ng-content>\n</button>\n\n@if (isOpen()) {\n\t<div class=\"hub-speed-dial__actions\" [attr.data-direction]=\"direction()\">\n\t\t<ng-content></ng-content>\n\t</div>\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubSemanticColor } from '../../../models/button.types';\n\n/**\n * Secondary action item rendered inside HubSpeedDialComponent.\n * Emits itemClick when activated. Supports an optional label tooltip.\n */\n@Component({\n\tselector: 'hub-speed-dial-item',\n\tstandalone: true,\n\ttemplateUrl: './speed-dial-item.component.html',\n\tstyleUrl: './speed-dial-item.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class HubSpeedDialItemComponent {\n\t/** Icon character or ligature string displayed in the action button. */\n\ticon = input.required<string>();\n\t/** Tooltip label shown next to the action button. */\n\tlabel = input('');\n\tcolor = input<HubSemanticColor | 'default'>('default');\n\tdisabled = input(false);\n\titemClick = output<void>();\n\n\t/**\n\t * The semantic accent painted on the action button through its\n\t * `--hub-speed-dial-item-accent` slot. Accepts ANY colour: a bareword (a\n\t * built-in semantic name, a host-registered accent or a CSS named colour)\n\t * resolves to its `--hub-sys-color-<name>` token with the bareword as the raw\n\t * fallback, so unregistered names still paint; a literal (`#hex`, `rgb()`,\n\t * `oklch()`, `var(...)`) is passed through unchanged. Returns `null` for the\n\t * `default` colour and for the built-in classes, which paint themselves — the\n\t * slot only takes effect for custom / literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn this.color() === 'default' ? null : resolveHubAccent(this.color());\n\t}\n}\n","@if (label()) {\n\t<span class=\"hub-speed-dial-item__label\">{{ label() }}</span>\n}\n<button\n\tclass=\"hub-speed-dial-item__btn\"\n\t[class]=\"'hub-speed-dial-item__btn--' + color()\"\n\t[style.--hub-speed-dial-item-accent]=\"_accent\"\n\t[disabled]=\"disabled() || null\"\n\t(click)=\"itemClick.emit()\"\n\ttype=\"button\"\n\t[attr.aria-label]=\"label() || icon()\"\n>\n\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n</button>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubSemanticColor } from '../../models/button.types';\n\n/**\n * Styled container for dropdown content.\n * Renders a shadowed panel with an optional semantic color top-border accent.\n * Place hub-dropdown-item, hub-dropdown-divider, and hub-dropdown-header children inside.\n */\n@Component({\n\tselector: 'hub-dropdown-panel',\n\tstandalone: true,\n\ttemplate: `<ng-content></ng-content>`,\n\tstyleUrl: './dropdown-panel.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-dropdown-panel',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-dropdown-panel-accent]': '_accent'\n\t}\n})\nexport class HubDropdownPanelComponent {\n\t/** Adds a semantic color accent to the panel top border. */\n\tcolor = input<HubSemanticColor | 'default'>('default');\n\n\tprotected get _hostClass(): string {\n\t\treturn this.color() !== 'default' ? `hub-dropdown-panel-${this.color()}` : '';\n\t}\n\n\t/**\n\t * The semantic accent painted on the panel top border through the\n\t * `--hub-dropdown-panel-accent` slot. Accepts ANY colour: a bareword (a built-in\n\t * semantic name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Returns `null` for the `default`\n\t * colour (the border keeps its neutral colour) and for the built-in classes,\n\t * which paint their own thicker accent — the slot only takes effect for custom /\n\t * literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn this.color() === 'default' ? null : resolveHubAccent(this.color());\n\t}\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { resolveHubAccent } from 'ng-hub-ui-utils';\nimport { HubSemanticColor } from '../../models/button.types';\n\n/**\n * Menu item for use inside HubDropdownPanelComponent.\n * Emits itemClick when activated. Supports an optional icon, selected state and semantic color.\n */\n@Component({\n\tselector: 'hub-dropdown-item',\n\tstandalone: true,\n\ttemplateUrl: './dropdown-item.component.html',\n\tstyleUrl: './dropdown-item.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-dropdown-item',\n\t\t'[class]': '_hostClass',\n\t\t'[style.--hub-dropdown-item-accent]': '_accent'\n\t}\n})\nexport class HubDropdownItemComponent {\n\tcolor = input<HubSemanticColor | 'default'>('default');\n\t/** Optional icon character or ligature displayed before the label. */\n\ticon = input<string>();\n\tdisabled = input(false);\n\t/** Shows a checkmark indicator when selected. */\n\tselected = input(false);\n\titemClick = output<void>();\n\n\tprotected get _hostClass(): string {\n\t\treturn [\n\t\t\tthis.color() !== 'default' ? `hub-dropdown-item-${this.color()}` : '',\n\t\t\tthis.disabled() ? 'hub-dropdown-item-disabled' : '',\n\t\t\tthis.selected() ? 'hub-dropdown-item-selected' : ''\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\t}\n\n\t/**\n\t * The semantic accent painted as the item label colour through the\n\t * `--hub-dropdown-item-accent` slot. Accepts ANY colour: a bareword (a built-in\n\t * semantic name, a host-registered accent or a CSS named colour) resolves to its\n\t * `--hub-sys-color-<name>` token with the bareword as the raw fallback, so\n\t * unregistered names still paint; a literal (`#hex`, `rgb()`, `oklch()`,\n\t * `var(...)`) is passed through unchanged. Returns `null` for the `default`\n\t * colour (the item inherits its colour) and for the built-in classes, which\n\t * paint themselves — the slot only takes effect for custom / literal colours.\n\t */\n\tprotected get _accent(): string | null {\n\t\treturn this.color() === 'default' ? null : resolveHubAccent(this.color());\n\t}\n\n\tprotected _handleClick(): void {\n\t\tif (this.disabled()) return;\n\t\tthis.itemClick.emit();\n\t}\n}\n","<button class=\"hub-dropdown-item__inner\" type=\"button\" [disabled]=\"disabled() || null\" (click)=\"_handleClick()\">\n\t@if (icon()) {\n\t\t<i [class]=\"icon()\" aria-hidden=\"true\"></i>\n\t}\n\t<span class=\"hub-dropdown-item__label\"><ng-content></ng-content></span>\n\t@if (selected()) {\n\t\t<span class=\"hub-dropdown-item__check\" aria-hidden=\"true\">✓</span>\n\t}\n</button>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** Horizontal separator for grouping items inside HubDropdownPanelComponent. */\n@Component({\n\tselector: 'hub-dropdown-divider',\n\tstandalone: true,\n\ttemplate: '',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-dropdown-divider',\n\t\trole: 'separator',\n\t\t'aria-hidden': 'true'\n\t},\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 1px;\n\t\t\t\tbackground: var(--hub-dropdown-divider-color, var(--hub-sys-color-border-subtle, #dee2e6));\n\t\t\t\tmargin: var(--hub-ref-space-1, 0.25rem) 0;\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubDropdownDividerComponent {}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** Group label for organizing items inside HubDropdownPanelComponent. */\n@Component({\n\tselector: 'hub-dropdown-header',\n\tstandalone: true,\n\ttemplate: `<ng-content></ng-content>`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'hub-dropdown-header' },\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tpadding: 0.375rem var(--hub-dropdown-header-padding-x, var(--hub-ref-space-3, 1rem)) 0.1875rem;\n\t\t\t\tfont-size: var(--hub-dropdown-header-font-size, var(--hub-ref-font-size-xs, 0.75rem));\n\t\t\t\tfont-weight: var(--hub-ref-font-weight-bold, 700);\n\t\t\t\tcolor: var(--hub-dropdown-header-color, var(--hub-sys-color-text-subtle, #6c757d));\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubDropdownHeaderComponent {}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n\tDestroyRef,\n\tDirective,\n\tElementRef,\n\tPLATFORM_ID,\n\tTemplateRef,\n\tViewContainerRef,\n\tinject,\n\tinput,\n\tmodel,\n\toutput,\n\tsignal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { OverlayService } from 'ng-hub-ui-utils';\nimport type { OverlayRef, ConnectionPosition } from 'ng-hub-ui-utils';\nimport { HubDropdownPlacement } from '../models/button.types';\n\n/**\n * Turns any host element into a dropdown trigger.\n * Renders an ng-template in a body-level overlay managed by OverlayService (no CDK).\n * When closeOnSelect is true, any click inside the panel closes the overlay automatically.\n */\n@Directive({\n\tselector: '[hubDropdown]',\n\tstandalone: true,\n\texportAs: 'hubDropdown',\n\thost: {\n\t\t'(click)': '_onHostClick()',\n\t\t'(mouseenter)': '_onHostEnter()',\n\t\t'(mouseleave)': '_onHostLeave()'\n\t}\n})\nexport class HubDropdownDirective {\n\t/** The ng-template to render inside the overlay panel. */\n\ttpl = input.required<TemplateRef<any>>({ alias: 'hubDropdown' });\n\tplacement = input<HubDropdownPlacement>('bottom-start');\n\ttrigger = input<'click' | 'hover'>('click');\n\t/** When true, any click inside the panel content closes the dropdown. */\n\tcloseOnSelect = input(true);\n\tdisabled = input(false);\n\t/** Vertical offset in pixels between the trigger and the panel. */\n\toffsetY = input(4);\n\tpanelClass = input('');\n\tisOpen = model(false);\n\topened = output<void>();\n\tclosed = output<void>();\n\n\tprivate _overlayRef: OverlayRef | null = null;\n\n\tprivate readonly _el = inject(ElementRef<HTMLElement>);\n\tprivate readonly _vcr = inject(ViewContainerRef);\n\tprivate readonly _overlay = inject(OverlayService);\n\tprivate readonly _destroyRef = inject(DestroyRef);\n\tprivate readonly _document = inject(DOCUMENT);\n\n\tconstructor() {\n\t\t// Escape-to-close relies on DOM events; inert on the server (SSR/prerender).\n\t\tif (isPlatformBrowser(inject(PLATFORM_ID))) {\n\t\t\tfromEvent<KeyboardEvent>(this._document, 'keydown')\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((e) => e.key === 'Escape' && this.isOpen()),\n\t\t\t\t\ttakeUntilDestroyed(this._destroyRef)\n\t\t\t\t)\n\t\t\t\t.subscribe(() => this.close());\n\t\t}\n\t}\n\n\t/** Open the dropdown and mount the overlay. */\n\topen(): void {\n\t\tif (this.disabled() || this.isOpen()) return;\n\n\t\tconst positionStrategy = this._overlay.position().flexibleConnectedTo(this._el).withPositions(this._buildPositions());\n\n\t\tconst panelClasses = ['hub-dropdown-overlay'];\n\t\tif (this.panelClass()) panelClasses.push(this.panelClass());\n\n\t\tthis._overlayRef = this._overlay.create({ positionStrategy, panelClass: panelClasses });\n\n\t\tconst panelEl = this._overlayRef.attach(this.tpl(), this._vcr);\n\n\t\t// Close on click-outside via backdrop\n\t\tthis._overlayRef.onBackdropClick(() => this.close());\n\n\t\t// Close on click-inside when closeOnSelect is true\n\t\tif (this.closeOnSelect() && panelEl) {\n\t\t\tfromEvent<MouseEvent>(panelEl, 'click')\n\t\t\t\t.pipe(take(1), takeUntilDestroyed(this._destroyRef))\n\t\t\t\t.subscribe(() => this.close());\n\t\t}\n\n\t\tthis.isOpen.set(true);\n\t\tthis.opened.emit();\n\n\t\t// Close on scroll so the panel stays aligned with the trigger\n\t\tfromEvent(this._document, 'scroll', { passive: true, capture: true })\n\t\t\t.pipe(take(1), takeUntilDestroyed(this._destroyRef))\n\t\t\t.subscribe(() => this.close());\n\n\t\t// Click-outside detection (document-level)\n\t\tfromEvent<MouseEvent>(this._document, 'click')\n\t\t\t.pipe(\n\t\t\t\tfilter((e) => !this._el.nativeElement.contains(e.target as Node) && !!this._overlayRef?.hasAttached()),\n\t\t\t\ttake(1),\n\t\t\t\ttakeUntilDestroyed(this._destroyRef)\n\t\t\t)\n\t\t\t.subscribe(() => this.close());\n\t}\n\n\t/** Close the dropdown and destroy the overlay. */\n\tclose(): void {\n\t\tif (!this.isOpen()) return;\n\t\tthis._overlayRef?.detach();\n\t\tthis._overlayRef?.dispose();\n\t\tthis._overlayRef = null;\n\t\tthis.isOpen.set(false);\n\t\tthis.closed.emit();\n\t}\n\n\t/** Toggle between open and closed. */\n\ttoggle(): void {\n\t\tthis.isOpen() ? this.close() : this.open();\n\t}\n\n\tprotected _onHostClick(): void {\n\t\tif (this.trigger() === 'click') this.toggle();\n\t}\n\n\tprotected _onHostEnter(): void {\n\t\tif (this.trigger() === 'hover') this.open();\n\t}\n\n\tprotected _onHostLeave(): void {\n\t\tif (this.trigger() === 'hover') this.close();\n\t}\n\n\t/**\n\t * Translates HubDropdownPlacement tokens to ConnectionPosition arrays.\n\t * The OverlayPosition tries each entry in order, using the first that fits.\n\t */\n\tprivate _buildPositions(): ConnectionPosition[] {\n\t\tconst o = this.offsetY();\n\t\tconst map: Record<HubDropdownPlacement, ConnectionPosition[]> = {\n\t\t\t'bottom-start': [{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: o }],\n\t\t\tbottom: [{ originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: o }],\n\t\t\t'bottom-end': [{ originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: o }],\n\t\t\t'top-start': [{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -o }],\n\t\t\ttop: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -o }],\n\t\t\t'top-end': [{ originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -o }],\n\t\t\tstart: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -o }],\n\t\t\tend: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: o }]\n\t\t};\n\t\treturn map[this.placement()];\n\t}\n}\n","/*\n * Public API Surface of ng-hub-ui-buttons\n */\n\n// Types\nexport * from './lib/models/button.types';\n\n// Tokens\nexport * from './lib/tokens/dropdown.token';\n\n// Components\nexport * from './lib/components/btn/button.component';\n/**\n * @deprecated Renamed to `HubButtonComponent`. The component now also matches the\n * `[hubButton]` attribute selector, so it replaces the former `HubBtnDirective`.\n */\nexport { HubButtonComponent as HubBtnComponent } from './lib/components/btn/button.component';\n/**\n * @deprecated Replaced by `HubButtonComponent`, which now matches `[hubButton]` itself\n * (and renders the loading spinner in the attribute form too).\n */\nexport { HubButtonComponent as HubBtnDirective } from './lib/components/btn/button.component';\nexport * from './lib/components/fab/fab.component';\nexport * from './lib/components/speed-dial/speed-dial.component';\nexport * from './lib/components/speed-dial/speed-dial-item/speed-dial-item.component';\nexport * from './lib/components/dropdown-panel/dropdown-panel.component';\nexport * from './lib/components/dropdown-item/dropdown-item.component';\nexport * from './lib/components/dropdown-divider/dropdown-divider.component';\nexport * from './lib/components/dropdown-header/dropdown-header.component';\n\n// Directives\nexport * from './lib/directives/dropdown.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAcA;MACa,gBAAgB,GAAG,IAAI,cAAc,CAAkB,oBAAoB;;ACXxF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;MAmBU,kBAAkB,CAAA;AAC9B;;;;;AAKG;IACc,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,OAAO,KAAK,YAAY;;IAG3F,OAAO,GAAG,KAAK,CAAgB,OAAO;gFAAC;;IAGvC,KAAK,GAAG,KAAK,CAAmB,SAAS;8EAAC;;IAG1C,IAAI,GAAG,KAAK,CAAa,IAAI;6EAAC;AAE9B;;;;;AAKG;IACH,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;;IAGtB,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;AAEvB;;;;;AAKG;AACH,IAAA,IAAY,QAAQ,GAAA;QACnB,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;IACzC;;AAGA,IAAA,IAAc,UAAU,GAAA;QACvB,OAAO;AACN,YAAA,CAAA,QAAA,EAAW,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE;AAC3B,YAAA,CAAA,QAAA,EAAW,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AACzB,YAAA,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;YACxB,IAAI,CAAC,OAAO,EAAE,GAAG,iBAAiB,GAAG,EAAE;YACvC,IAAI,CAAC,QAAQ,EAAE,GAAG,kBAAkB,GAAG;AACvC;aACC,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;IACZ;AAEA;;;;;;;;;AASG;AACH,IAAA,IAAc,OAAO,GAAA;AACpB,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtC;;AAGA,IAAA,IAAc,aAAa,GAAA;QAC1B,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI;IACnC;;AAGA,IAAA,IAAc,SAAS,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI;IACtC;AAEA;;;;AAIG;AACH,IAAA,IAAc,aAAa,GAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI;IAC5D;AAEA;;;AAGG;AACH,IAAA,IAAc,KAAK,GAAA;QAClB,OAAO,IAAI,CAAC,cAAc,GAAG,QAAQ,GAAG,IAAI;IAC7C;AAEA;;;AAGG;AACH,IAAA,IAAc,SAAS,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACzB,YAAA,OAAO,IAAI;QACZ;AAEA,QAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC;IAC9B;AAEA;;;;;;AAMG;AACO,IAAA,UAAU,CAAC,KAAoB,EAAA;QACxC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC1C;QACD;AAEA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU;QAE7D,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,OAAO,EAAE;YACrC,IAAI,OAAO,EAAE;gBACZ,KAAK,CAAC,cAAc,EAAE;YACvB;AAEC,YAAA,KAAK,CAAC,aAA6B,CAAC,KAAK,EAAE;QAC7C;IACD;uGA9HY,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,sgCCpD/B,oHAIA,EAAA,MAAA,EAAA,CAAA,6/OAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDgDa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAlB9B,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cACvB,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,SAAS,EAAE,YAAY;AACvB,wBAAA,0BAA0B,EAAE,SAAS;AACrC,wBAAA,iBAAiB,EAAE,eAAe;AAClC,wBAAA,kBAAkB,EAAE,WAAW;AAC/B,wBAAA,sBAAsB,EAAE,eAAe;AACvC,wBAAA,aAAa,EAAE,OAAO;AACtB,wBAAA,iBAAiB,EAAE,WAAW;AAC9B,wBAAA,WAAW,EAAE;AACb,qBAAA,EAAA,QAAA,EAAA,oHAAA,EAAA,MAAA,EAAA,CAAA,6/OAAA,CAAA,EAAA;;;AEjCF;;;;;AAKG;MAcU,eAAe,CAAA;IAC3B,KAAK,GAAG,KAAK,CAAmB,SAAS;8EAAC;IAC1C,IAAI,GAAG,KAAK,CAAa,UAAU;6EAAC;IACpC,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;;IAEvB,QAAQ,GAAG,KAAK,CAAiB,YAAY;iFAAC;;IAE9C,gBAAgB,GAAG,KAAK,CAAC,KAAK;yFAAC;IAC/B,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,QAAQ,GAAG,MAAM,EAAQ;;IAGN,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;AAE5B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAEjD,IAAA,IAAc,UAAU,GAAA;QACvB,OAAO;AACN,YAAA,CAAA,QAAA,EAAW,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AACzB,YAAA,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AACxB,YAAA,CAAA,QAAA,EAAW,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE;AAC5B,YAAA,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,kBAAkB,GAAG,EAAE;YAC/D,IAAI,CAAC,QAAQ,EAAE,GAAG,kBAAkB,GAAG;AACvC;aACC,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;IACZ;AAEA;;;;;;;;;AASG;AACH,IAAA,IAAc,OAAO,GAAA;AACpB,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtC;IAEA,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAAE;QAE9B,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC3C,aAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aAC3D,SAAS,CAAC,MAAK;YACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;uGAlDY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,4+BCpC5B,4PASA,EAAA,MAAA,EAAA,CAAA,07GAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FD2Ba,eAAe,EAAA,UAAA,EAAA,CAAA;kBAb3B,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,cACP,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,SAAS,EAAE,YAAY;AACvB,wBAAA,0BAA0B,EAAE;qBAC5B,EAAA,aAAA,EACc,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,4PAAA,EAAA,MAAA,EAAA,CAAA,07GAAA,CAAA,EAAA;;;AE1BtC;;;;AAIG;MAYU,qBAAqB,CAAA;IACjC,KAAK,GAAG,KAAK,CAAmB,SAAS;8EAAC;IAC1C,IAAI,GAAG,KAAK,CAAa,UAAU;6EAAC;IACpC,QAAQ,GAAG,KAAK,CAAiB,YAAY;iFAAC;IAC9C,SAAS,GAAG,KAAK,CAAmC,IAAI;kFAAC;IACzD,OAAO,GAAG,KAAK,CAAoB,OAAO;gFAAC;IAC3C,MAAM,GAAG,KAAK,CAAC,KAAK;+EAAC;IACrB,MAAM,GAAG,MAAM,EAAQ;IACvB,MAAM,GAAG,MAAM,EAAQ;AAEN,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAEjD,IAAA,IAAc,UAAU,GAAA;QACvB,OAAO;AACN,YAAA,CAAA,eAAA,EAAkB,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AAChC,YAAA,CAAA,eAAA,EAAkB,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE;AACnC,YAAA,CAAA,eAAA,EAAkB,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE;YACpC,IAAI,CAAC,MAAM,EAAE,GAAG,qBAAqB,GAAG;AACxC;aACC,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;IACZ;AAEA;;;;;;;;;AASG;AACH,IAAA,IAAc,OAAO,GAAA;AACpB,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtC;AAEA,IAAA,WAAA,GAAA;;QAEC,IAAI,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;AAC3C,YAAA,SAAS,CAAgB,MAAM,CAAC,QAAQ,CAAC,EAAE,SAAS;iBAClD,IAAI,CACJ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAClD,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;iBAEpC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC;IACD;;IAGA,MAAM,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;IAC3C;;IAGA,IAAI,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACnB;;IAGA,KAAK,GAAA;AACJ,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACnB;uGAhEY,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,69BCxBlC,mkBAmBA,EAAA,MAAA,EAAA,CAAA,w2CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDKa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAXjC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cACd,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,gBAAgB;AACvB,wBAAA,SAAS,EAAE;AACX,qBAAA,EAAA,QAAA,EAAA,mkBAAA,EAAA,MAAA,EAAA,CAAA,w2CAAA,CAAA,EAAA;;;AElBF;;;AAGG;MAQU,yBAAyB,CAAA;;IAErC,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAU;;IAE/B,KAAK,GAAG,KAAK,CAAC,EAAE;8EAAC;IACjB,KAAK,GAAG,KAAK,CAA+B,SAAS;8EAAC;IACtD,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,SAAS,GAAG,MAAM,EAAQ;AAE1B;;;;;;;;;AASG;AACH,IAAA,IAAc,OAAO,GAAA;QACpB,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1E;uGArBY,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,qmBCftC,sbAcA,EAAA,MAAA,EAAA,CAAA,u9DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDCa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sbAAA,EAAA,MAAA,EAAA,CAAA,u9DAAA,CAAA,EAAA;;;AEThD;;;;AAIG;MAaU,yBAAyB,CAAA;;IAErC,KAAK,GAAG,KAAK,CAA+B,SAAS;8EAAC;AAEtD,IAAA,IAAc,UAAU,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,sBAAsB,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE,GAAG,EAAE;IAC9E;AAEA;;;;;;;;;;AAUG;AACH,IAAA,IAAc,OAAO,GAAA;QACpB,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1E;uGArBY,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,yVAT3B,CAAA,yBAAA,CAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wwDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FASzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAZrC,SAAS;+BACC,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,QAAA,EACN,CAAA,yBAAA,CAA2B,mBAEpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,oBAAoB;AAC3B,wBAAA,SAAS,EAAE,YAAY;AACvB,wBAAA,qCAAqC,EAAE;AACvC,qBAAA,EAAA,MAAA,EAAA,CAAA,wwDAAA,CAAA,EAAA;;;ACfF;;;AAGG;MAaU,wBAAwB,CAAA;IACpC,KAAK,GAAG,KAAK,CAA+B,SAAS;8EAAC;;AAEtD,IAAA,IAAI,GAAG,KAAK;wFAAU;IACtB,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;;IAEvB,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,SAAS,GAAG,MAAM,EAAQ;AAE1B,IAAA,IAAc,UAAU,GAAA;QACvB,OAAO;AACN,YAAA,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,CAAA,kBAAA,EAAqB,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE;YACrE,IAAI,CAAC,QAAQ,EAAE,GAAG,4BAA4B,GAAG,EAAE;YACnD,IAAI,CAAC,QAAQ,EAAE,GAAG,4BAA4B,GAAG;AACjD;aACC,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;IACZ;AAEA;;;;;;;;;AASG;AACH,IAAA,IAAc,OAAO,GAAA;QACpB,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1E;IAEU,YAAY,GAAA;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACtB;uGApCY,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,kvBCpBrC,4YASA,EAAA,MAAA,EAAA,CAAA,65EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDWa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAZpC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,mBAAmB;AAC1B,wBAAA,SAAS,EAAE,YAAY;AACvB,wBAAA,oCAAoC,EAAE;AACtC,qBAAA,EAAA,QAAA,EAAA,4YAAA,EAAA,MAAA,EAAA,CAAA,65EAAA,CAAA,EAAA;;;AEhBF;MAsBa,2BAA2B,CAAA;uGAA3B,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,8LAlB7B,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAkBA,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBArBvC,SAAS;+BACC,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,QAAA,EACN,EAAE,mBACK,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,sBAAsB;AAC7B,wBAAA,IAAI,EAAE,WAAW;AACjB,wBAAA,aAAa,EAAE;AACf,qBAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA;;;ACVF;MAqBa,0BAA0B,CAAA;uGAA1B,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,gIAjB5B,CAAA,yBAAA,CAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yXAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAiBzB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBApBtC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,QAAA,EACN,CAAA,yBAAA,CAA2B,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAA,MAAA,EAAA,CAAA,yXAAA,CAAA,EAAA;;;ACavC;;;;AAIG;MAWU,oBAAoB,CAAA;;IAEhC,GAAG,GAAG,KAAK,CAAC,QAAQ,0EAAqB,KAAK,EAAE,aAAa,EAAA,CAAG;IAChE,SAAS,GAAG,KAAK,CAAuB,cAAc;kFAAC;IACvD,OAAO,GAAG,KAAK,CAAoB,OAAO;gFAAC;;IAE3C,aAAa,GAAG,KAAK,CAAC,IAAI;sFAAC;IAC3B,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;;IAEvB,OAAO,GAAG,KAAK,CAAC,CAAC;gFAAC;IAClB,UAAU,GAAG,KAAK,CAAC,EAAE;mFAAC;IACtB,MAAM,GAAG,KAAK,CAAC,KAAK;+EAAC;IACrB,MAAM,GAAG,MAAM,EAAQ;IACvB,MAAM,GAAG,MAAM,EAAQ;IAEf,WAAW,GAAsB,IAAI;AAE5B,IAAA,GAAG,GAAG,MAAM,EAAC,UAAuB,EAAC;AACrC,IAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AACjC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE7C,IAAA,WAAA,GAAA;;QAEC,IAAI,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;AAC3C,YAAA,SAAS,CAAgB,IAAI,CAAC,SAAS,EAAE,SAAS;iBAChD,IAAI,CACJ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAClD,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;iBAEpC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC;IACD;;IAGA,IAAI,GAAA;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE;QAEtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AAErH,QAAA,MAAM,YAAY,GAAG,CAAC,sBAAsB,CAAC;QAC7C,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAE3D,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAEvF,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;;AAG9D,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;;AAGpD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,OAAO,EAAE;AACpC,YAAA,SAAS,CAAa,OAAO,EAAE,OAAO;AACpC,iBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;iBAClD,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;AAGlB,QAAA,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;AAClE,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aAClD,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;;AAG/B,QAAA,SAAS,CAAa,IAAI,CAAC,SAAS,EAAE,OAAO;AAC3C,aAAA,IAAI,CACJ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EACtG,IAAI,CAAC,CAAC,CAAC,EACP,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aAEpC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAChC;;IAGA,KAAK,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AACpB,QAAA,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAC1B,QAAA,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE;AAC3B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACnB;;IAGA,MAAM,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;IAC3C;IAEU,YAAY,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE;IAC9C;IAEU,YAAY,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,IAAI,EAAE;IAC5C;IAEU,YAAY,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE;IAC7C;AAEA;;;AAGG;IACK,eAAe,GAAA;AACtB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,MAAM,GAAG,GAAuD;YAC/D,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACzG,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACnG,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACnG,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;YACvG,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;YACjG,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;YACjG,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;YAClG,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;SAC9F;AACD,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAC7B;uGAxHY,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,cAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAVhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,IAAI,EAAE;AACL,wBAAA,SAAS,EAAE,gBAAgB;AAC3B,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,cAAc,EAAE;AAChB;AACD,iBAAA;;;ACnCD;;AAEG;AAEH;;ACJA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "ng-hub-ui-buttons",
3
- "version": "22.9.2",
3
+ "version": "22.9.4",
4
+ "license": "MIT",
4
5
  "description": "Buttons, FAB, Speed Dial and Dropdown directive for Angular, part of the ng-hub-ui ecosystem",
5
6
  "author": "Carlos Morcillo <carlos.morcillo@me.com> (https://www.carlosmorcillo.com)",
6
7
  "repository": {
@@ -11,7 +12,7 @@
11
12
  "url": "https://github.com/carlos-morcillo/ng-hub-ui-buttons/issues",
12
13
  "email": "carlos.morcillo@me.com"
13
14
  },
14
- "homepage": "https://hubui.dev/",
15
+ "homepage": "https://hubui.dev/en/buttons/overview/",
15
16
  "keywords": [
16
17
  "angular",
17
18
  "button",
@@ -22,7 +22,8 @@
22
22
  // scss-docs-start hub-btn-theme
23
23
  @mixin hub-btn-theme(
24
24
  // ── Colour ──
25
- $accent: null, // semantic accent slot (drives the derived role family)
25
+ $accent: null,
26
+ // semantic accent slot (drives the derived role family)
26
27
  // ── Shape ──
27
28
  $border-radius: null,
28
29
  // ── Density / typography ──
Binary file