@wildmason/aegis 1.7.0 → 1.7.1

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.
@@ -167,11 +167,11 @@ class WmSelect {
167
167
  }
168
168
  }
169
169
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WmSelect, deps: [], target: i0.ɵɵFactoryTarget.Component });
170
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: WmSelect, isStandalone: true, selector: "wm-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: "<!-- Trigger button \u2014 anchors the CDK overlay -->\r\n<div\r\n class=\"wm-select-host\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n>\r\n <button\r\n type=\"button\"\r\n role=\"combobox\"\r\n class=\"wm-select-trigger\"\r\n [class.is-open]=\"isOpen()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n <span class=\"wm-select-value\" [class.is-placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label ?? placeholder() }}\r\n </span>\r\n <!-- Chevron icon \u2014 rotates when open -->\r\n <svg\r\n class=\"wm-select-chevron\"\r\n [class.is-open]=\"isOpen()\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<!-- Dropdown panel \u2014 rendered in CDK overlay container -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"wm-select-backdrop\"\r\n (backdropClick)=\"isOpen.set(false)\"\r\n (detach)=\"isOpen.set(false)\"\r\n>\r\n <div\r\n class=\"wm-select-panel\"\r\n role=\"listbox\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n @for (opt of options(); track opt.value) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n class=\"wm-select-option\"\r\n [class.is-selected]=\"opt.value === value()\"\r\n [class.is-disabled]=\"!!opt.disabled\"\r\n [attr.aria-selected]=\"opt.value === value()\"\r\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\r\n [disabled]=\"opt.disabled || null\"\r\n (click)=\"selectOption(opt)\"\r\n >\r\n <span class=\"wm-select-option-label\">{{ opt.label }}</span>\r\n @if (opt.value === value()) {\r\n <!-- Checkmark for selected option -->\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <polyline points=\"20 6 9 17 4 12\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block}.wm-select-host{display:block}.wm-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0 .75rem;height:36px;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-md);color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast);outline:none;text-align:left}.wm-select-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent)}.wm-select-trigger:focus-visible{border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-select-trigger.is-open{border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-select-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-value.is-placeholder{color:var(--wm-text-placeholder)}.wm-select-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast)}.wm-select-chevron.is-open{transform:rotate(180deg)}.wm-select-backdrop{position:fixed;inset:0}.wm-select-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;outline:none;padding:.25rem}.wm-select-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast)}.wm-select-option:hover:not(.is-disabled):not(.is-selected){background:var(--wm-bg-active)}.wm-select-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent);font-weight:500}.wm-select-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-select-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-option svg{flex-shrink:0;color:var(--wm-color-accent)}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }] });
170
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: WmSelect, isStandalone: true, selector: "wm-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: "<!-- Trigger button \u2014 anchors the CDK overlay -->\r\n<div\r\n class=\"wm-select-host\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n>\r\n <button\r\n type=\"button\"\r\n role=\"combobox\"\r\n class=\"wm-select-trigger\"\r\n [class.is-open]=\"isOpen()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n <span class=\"wm-select-value\" [class.is-placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label ?? placeholder() }}\r\n </span>\r\n <!-- Chevron icon \u2014 rotates when open -->\r\n <svg\r\n class=\"wm-select-chevron\"\r\n [class.is-open]=\"isOpen()\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<!-- Dropdown panel \u2014 rendered in CDK overlay container -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"wm-select-backdrop\"\r\n (backdropClick)=\"isOpen.set(false)\"\r\n (detach)=\"isOpen.set(false)\"\r\n>\r\n <div\r\n class=\"wm-select-panel\"\r\n role=\"listbox\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n @for (opt of options(); track opt.value) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n class=\"wm-select-option\"\r\n [class.is-selected]=\"opt.value === value()\"\r\n [class.is-disabled]=\"!!opt.disabled\"\r\n [attr.aria-selected]=\"opt.value === value()\"\r\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\r\n [disabled]=\"opt.disabled || null\"\r\n (click)=\"selectOption(opt)\"\r\n >\r\n <span class=\"wm-select-option-label\">{{ opt.label }}</span>\r\n @if (opt.value === value()) {\r\n <!-- Checkmark for selected option -->\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <polyline points=\"20 6 9 17 4 12\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block}.wm-select-host{display:block}.wm-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0 .75rem;height:36px;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-md);color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast);outline:none;text-align:left}.wm-select-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent-readable)}.wm-select-trigger:focus-visible{border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-select-trigger.is-open{border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-select-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-value.is-placeholder{color:var(--wm-text-placeholder)}.wm-select-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast)}.wm-select-chevron.is-open{transform:rotate(180deg)}.wm-select-backdrop{position:fixed;inset:0}.wm-select-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;outline:none;padding:.25rem}.wm-select-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast)}.wm-select-option:hover:not(.is-disabled):not(.is-selected){background:var(--wm-bg-active)}.wm-select-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent-readable);font-weight:500}.wm-select-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-select-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-option svg{flex-shrink:0;color:var(--wm-color-accent-readable)}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }] });
171
171
  }
172
172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WmSelect, decorators: [{
173
173
  type: Component,
174
- args: [{ selector: 'wm-select', imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkTrapFocus], template: "<!-- Trigger button \u2014 anchors the CDK overlay -->\r\n<div\r\n class=\"wm-select-host\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n>\r\n <button\r\n type=\"button\"\r\n role=\"combobox\"\r\n class=\"wm-select-trigger\"\r\n [class.is-open]=\"isOpen()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n <span class=\"wm-select-value\" [class.is-placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label ?? placeholder() }}\r\n </span>\r\n <!-- Chevron icon \u2014 rotates when open -->\r\n <svg\r\n class=\"wm-select-chevron\"\r\n [class.is-open]=\"isOpen()\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<!-- Dropdown panel \u2014 rendered in CDK overlay container -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"wm-select-backdrop\"\r\n (backdropClick)=\"isOpen.set(false)\"\r\n (detach)=\"isOpen.set(false)\"\r\n>\r\n <div\r\n class=\"wm-select-panel\"\r\n role=\"listbox\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n @for (opt of options(); track opt.value) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n class=\"wm-select-option\"\r\n [class.is-selected]=\"opt.value === value()\"\r\n [class.is-disabled]=\"!!opt.disabled\"\r\n [attr.aria-selected]=\"opt.value === value()\"\r\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\r\n [disabled]=\"opt.disabled || null\"\r\n (click)=\"selectOption(opt)\"\r\n >\r\n <span class=\"wm-select-option-label\">{{ opt.label }}</span>\r\n @if (opt.value === value()) {\r\n <!-- Checkmark for selected option -->\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <polyline points=\"20 6 9 17 4 12\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block}.wm-select-host{display:block}.wm-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0 .75rem;height:36px;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-md);color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast);outline:none;text-align:left}.wm-select-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent)}.wm-select-trigger:focus-visible{border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-select-trigger.is-open{border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-select-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-value.is-placeholder{color:var(--wm-text-placeholder)}.wm-select-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast)}.wm-select-chevron.is-open{transform:rotate(180deg)}.wm-select-backdrop{position:fixed;inset:0}.wm-select-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;outline:none;padding:.25rem}.wm-select-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast)}.wm-select-option:hover:not(.is-disabled):not(.is-selected){background:var(--wm-bg-active)}.wm-select-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent);font-weight:500}.wm-select-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-select-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-option svg{flex-shrink:0;color:var(--wm-color-accent)}\n"] }]
174
+ args: [{ selector: 'wm-select', imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkTrapFocus], template: "<!-- Trigger button \u2014 anchors the CDK overlay -->\r\n<div\r\n class=\"wm-select-host\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n>\r\n <button\r\n type=\"button\"\r\n role=\"combobox\"\r\n class=\"wm-select-trigger\"\r\n [class.is-open]=\"isOpen()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n <span class=\"wm-select-value\" [class.is-placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label ?? placeholder() }}\r\n </span>\r\n <!-- Chevron icon \u2014 rotates when open -->\r\n <svg\r\n class=\"wm-select-chevron\"\r\n [class.is-open]=\"isOpen()\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<!-- Dropdown panel \u2014 rendered in CDK overlay container -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"wm-select-backdrop\"\r\n (backdropClick)=\"isOpen.set(false)\"\r\n (detach)=\"isOpen.set(false)\"\r\n>\r\n <div\r\n class=\"wm-select-panel\"\r\n role=\"listbox\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n @for (opt of options(); track opt.value) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n class=\"wm-select-option\"\r\n [class.is-selected]=\"opt.value === value()\"\r\n [class.is-disabled]=\"!!opt.disabled\"\r\n [attr.aria-selected]=\"opt.value === value()\"\r\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\r\n [disabled]=\"opt.disabled || null\"\r\n (click)=\"selectOption(opt)\"\r\n >\r\n <span class=\"wm-select-option-label\">{{ opt.label }}</span>\r\n @if (opt.value === value()) {\r\n <!-- Checkmark for selected option -->\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <polyline points=\"20 6 9 17 4 12\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block}.wm-select-host{display:block}.wm-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0 .75rem;height:36px;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-md);color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast);outline:none;text-align:left}.wm-select-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent-readable)}.wm-select-trigger:focus-visible{border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-select-trigger.is-open{border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-select-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-value.is-placeholder{color:var(--wm-text-placeholder)}.wm-select-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast)}.wm-select-chevron.is-open{transform:rotate(180deg)}.wm-select-backdrop{position:fixed;inset:0}.wm-select-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;outline:none;padding:.25rem}.wm-select-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast)}.wm-select-option:hover:not(.is-disabled):not(.is-selected){background:var(--wm-bg-active)}.wm-select-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent-readable);font-weight:500}.wm-select-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-select-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-select-option svg{flex-shrink:0;color:var(--wm-color-accent-readable)}\n"] }]
175
175
  }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
176
176
 
177
177
  /**
@@ -386,11 +386,11 @@ class WmTabs {
386
386
  }
387
387
  }
388
388
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WmTabs, deps: [], target: i0.ɵɵFactoryTarget.Component });
389
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: WmTabs, isStandalone: true, selector: "wm-tabs", inputs: { activeValue: { classPropertyName: "activeValue", publicName: "activeValue", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, queries: [{ propertyName: "tabs", predicate: WmTab, isSignal: true }], ngImport: i0, template: "<div\r\n class=\"wm-tabs\"\r\n [class.wm-tabs--line]=\"variant() === 'line'\"\r\n [class.wm-tabs--pill]=\"variant() === 'pill'\"\r\n role=\"tablist\"\r\n #container\r\n (keydown)=\"onKeyDown($event, container)\"\r\n>\r\n @for (tab of tabs(); track tab.value(); let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"wm-tab\"\r\n [id]=\"'wm-tab-' + tab.value()\"\r\n [attr.aria-selected]=\"activeValue() === tab.value()\"\r\n [attr.aria-controls]=\"'wm-panel-' + tab.value()\"\r\n [tabIndex]=\"(focusedIndex() === null ? activeValue() === tab.value() : focusedIndex() === i) ? 0 : -1\"\r\n [class.is-active]=\"activeValue() === tab.value()\"\r\n (click)=\"selectTab(tab.value(), i)\"\r\n (focus)=\"focusedIndex.set(i)\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"tab.tmpl()\" />\r\n </button>\r\n }\r\n</div>\r\n", styles: [".wm-tab{display:inline-flex;align-items:center;gap:6px;font-size:.8125rem;font-weight:600;background:transparent;border:none;cursor:pointer;white-space:nowrap;transition:color var(--wm-duration-fast) var(--wm-ease-standard),background var(--wm-duration-fast) var(--wm-ease-standard),border-color var(--wm-duration-fast) var(--wm-ease-standard)}.wm-tab:focus-visible{outline:2px solid var(--wm-color-accent);outline-offset:-2px;border-radius:var(--wm-radius-sm)}.wm-tabs--line{display:flex;gap:1.5rem;border-bottom:1px solid var(--wm-border-subtle)}.wm-tabs--line .wm-tab{padding:.625rem .25rem;color:var(--wm-text-muted);border-radius:0;border-bottom:2px solid transparent;margin-bottom:-1px}.wm-tabs--line .wm-tab:hover{color:var(--wm-text-secondary)}.wm-tabs--line .wm-tab.is-active{color:var(--wm-color-accent);border-bottom-color:var(--wm-color-accent)}.wm-tabs--pill{display:inline-flex;background:var(--wm-bg-sunken);padding:.25rem;border-radius:var(--wm-radius-md);gap:.125rem;border:1px solid var(--wm-border-subtle)}.wm-tabs--pill .wm-tab{padding:.375rem .75rem;border-radius:var(--wm-radius-sm);color:var(--wm-text-muted)}.wm-tabs--pill .wm-tab:hover{background:color-mix(in srgb,var(--wm-color-accent) 5%,transparent);color:var(--wm-text-secondary)}.wm-tabs--pill .wm-tab.is-active{background:var(--wm-bg-float);color:var(--wm-text-primary);box-shadow:var(--wm-shadow-sm)}@media(prefers-reduced-motion:reduce){.wm-tab{transition:none}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
389
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: WmTabs, isStandalone: true, selector: "wm-tabs", inputs: { activeValue: { classPropertyName: "activeValue", publicName: "activeValue", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, queries: [{ propertyName: "tabs", predicate: WmTab, isSignal: true }], ngImport: i0, template: "<div\r\n class=\"wm-tabs\"\r\n [class.wm-tabs--line]=\"variant() === 'line'\"\r\n [class.wm-tabs--pill]=\"variant() === 'pill'\"\r\n role=\"tablist\"\r\n #container\r\n (keydown)=\"onKeyDown($event, container)\"\r\n>\r\n @for (tab of tabs(); track tab.value(); let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"wm-tab\"\r\n [id]=\"'wm-tab-' + tab.value()\"\r\n [attr.aria-selected]=\"activeValue() === tab.value()\"\r\n [attr.aria-controls]=\"'wm-panel-' + tab.value()\"\r\n [tabIndex]=\"(focusedIndex() === null ? activeValue() === tab.value() : focusedIndex() === i) ? 0 : -1\"\r\n [class.is-active]=\"activeValue() === tab.value()\"\r\n (click)=\"selectTab(tab.value(), i)\"\r\n (focus)=\"focusedIndex.set(i)\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"tab.tmpl()\" />\r\n </button>\r\n }\r\n</div>\r\n", styles: [".wm-tab{display:inline-flex;align-items:center;gap:6px;font-size:.8125rem;font-weight:600;background:transparent;border:none;cursor:pointer;white-space:nowrap;transition:color var(--wm-duration-fast) var(--wm-ease-standard),background var(--wm-duration-fast) var(--wm-ease-standard),border-color var(--wm-duration-fast) var(--wm-ease-standard)}.wm-tab:focus-visible{outline:2px solid var(--wm-color-accent);outline-offset:-2px;border-radius:var(--wm-radius-sm)}.wm-tabs--line{display:flex;gap:1.5rem;border-bottom:1px solid var(--wm-border-subtle)}.wm-tabs--line .wm-tab{padding:.625rem .25rem;color:var(--wm-text-muted);border-radius:0;border-bottom:2px solid transparent;margin-bottom:-1px}.wm-tabs--line .wm-tab:hover{color:var(--wm-text-secondary)}.wm-tabs--line .wm-tab.is-active{color:var(--wm-color-accent-readable);border-bottom-color:var(--wm-color-accent-readable)}.wm-tabs--pill{display:inline-flex;background:var(--wm-bg-sunken);padding:.25rem;border-radius:var(--wm-radius-md);gap:.125rem;border:1px solid var(--wm-border-subtle)}.wm-tabs--pill .wm-tab{padding:.375rem .75rem;border-radius:var(--wm-radius-sm);color:var(--wm-text-muted)}.wm-tabs--pill .wm-tab:hover{background:color-mix(in srgb,var(--wm-color-accent) 5%,transparent);color:var(--wm-text-secondary)}.wm-tabs--pill .wm-tab.is-active{background:var(--wm-bg-float);color:var(--wm-text-primary);box-shadow:var(--wm-shadow-sm)}@media(prefers-reduced-motion:reduce){.wm-tab{transition:none}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
390
390
  }
391
391
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WmTabs, decorators: [{
392
392
  type: Component,
393
- args: [{ selector: 'wm-tabs', imports: [NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"wm-tabs\"\r\n [class.wm-tabs--line]=\"variant() === 'line'\"\r\n [class.wm-tabs--pill]=\"variant() === 'pill'\"\r\n role=\"tablist\"\r\n #container\r\n (keydown)=\"onKeyDown($event, container)\"\r\n>\r\n @for (tab of tabs(); track tab.value(); let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"wm-tab\"\r\n [id]=\"'wm-tab-' + tab.value()\"\r\n [attr.aria-selected]=\"activeValue() === tab.value()\"\r\n [attr.aria-controls]=\"'wm-panel-' + tab.value()\"\r\n [tabIndex]=\"(focusedIndex() === null ? activeValue() === tab.value() : focusedIndex() === i) ? 0 : -1\"\r\n [class.is-active]=\"activeValue() === tab.value()\"\r\n (click)=\"selectTab(tab.value(), i)\"\r\n (focus)=\"focusedIndex.set(i)\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"tab.tmpl()\" />\r\n </button>\r\n }\r\n</div>\r\n", styles: [".wm-tab{display:inline-flex;align-items:center;gap:6px;font-size:.8125rem;font-weight:600;background:transparent;border:none;cursor:pointer;white-space:nowrap;transition:color var(--wm-duration-fast) var(--wm-ease-standard),background var(--wm-duration-fast) var(--wm-ease-standard),border-color var(--wm-duration-fast) var(--wm-ease-standard)}.wm-tab:focus-visible{outline:2px solid var(--wm-color-accent);outline-offset:-2px;border-radius:var(--wm-radius-sm)}.wm-tabs--line{display:flex;gap:1.5rem;border-bottom:1px solid var(--wm-border-subtle)}.wm-tabs--line .wm-tab{padding:.625rem .25rem;color:var(--wm-text-muted);border-radius:0;border-bottom:2px solid transparent;margin-bottom:-1px}.wm-tabs--line .wm-tab:hover{color:var(--wm-text-secondary)}.wm-tabs--line .wm-tab.is-active{color:var(--wm-color-accent);border-bottom-color:var(--wm-color-accent)}.wm-tabs--pill{display:inline-flex;background:var(--wm-bg-sunken);padding:.25rem;border-radius:var(--wm-radius-md);gap:.125rem;border:1px solid var(--wm-border-subtle)}.wm-tabs--pill .wm-tab{padding:.375rem .75rem;border-radius:var(--wm-radius-sm);color:var(--wm-text-muted)}.wm-tabs--pill .wm-tab:hover{background:color-mix(in srgb,var(--wm-color-accent) 5%,transparent);color:var(--wm-text-secondary)}.wm-tabs--pill .wm-tab.is-active{background:var(--wm-bg-float);color:var(--wm-text-primary);box-shadow:var(--wm-shadow-sm)}@media(prefers-reduced-motion:reduce){.wm-tab{transition:none}}\n"] }]
393
+ args: [{ selector: 'wm-tabs', imports: [NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"wm-tabs\"\r\n [class.wm-tabs--line]=\"variant() === 'line'\"\r\n [class.wm-tabs--pill]=\"variant() === 'pill'\"\r\n role=\"tablist\"\r\n #container\r\n (keydown)=\"onKeyDown($event, container)\"\r\n>\r\n @for (tab of tabs(); track tab.value(); let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"wm-tab\"\r\n [id]=\"'wm-tab-' + tab.value()\"\r\n [attr.aria-selected]=\"activeValue() === tab.value()\"\r\n [attr.aria-controls]=\"'wm-panel-' + tab.value()\"\r\n [tabIndex]=\"(focusedIndex() === null ? activeValue() === tab.value() : focusedIndex() === i) ? 0 : -1\"\r\n [class.is-active]=\"activeValue() === tab.value()\"\r\n (click)=\"selectTab(tab.value(), i)\"\r\n (focus)=\"focusedIndex.set(i)\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"tab.tmpl()\" />\r\n </button>\r\n }\r\n</div>\r\n", styles: [".wm-tab{display:inline-flex;align-items:center;gap:6px;font-size:.8125rem;font-weight:600;background:transparent;border:none;cursor:pointer;white-space:nowrap;transition:color var(--wm-duration-fast) var(--wm-ease-standard),background var(--wm-duration-fast) var(--wm-ease-standard),border-color var(--wm-duration-fast) var(--wm-ease-standard)}.wm-tab:focus-visible{outline:2px solid var(--wm-color-accent);outline-offset:-2px;border-radius:var(--wm-radius-sm)}.wm-tabs--line{display:flex;gap:1.5rem;border-bottom:1px solid var(--wm-border-subtle)}.wm-tabs--line .wm-tab{padding:.625rem .25rem;color:var(--wm-text-muted);border-radius:0;border-bottom:2px solid transparent;margin-bottom:-1px}.wm-tabs--line .wm-tab:hover{color:var(--wm-text-secondary)}.wm-tabs--line .wm-tab.is-active{color:var(--wm-color-accent-readable);border-bottom-color:var(--wm-color-accent-readable)}.wm-tabs--pill{display:inline-flex;background:var(--wm-bg-sunken);padding:.25rem;border-radius:var(--wm-radius-md);gap:.125rem;border:1px solid var(--wm-border-subtle)}.wm-tabs--pill .wm-tab{padding:.375rem .75rem;border-radius:var(--wm-radius-sm);color:var(--wm-text-muted)}.wm-tabs--pill .wm-tab:hover{background:color-mix(in srgb,var(--wm-color-accent) 5%,transparent);color:var(--wm-text-secondary)}.wm-tabs--pill .wm-tab.is-active{background:var(--wm-bg-float);color:var(--wm-text-primary);box-shadow:var(--wm-shadow-sm)}@media(prefers-reduced-motion:reduce){.wm-tab{transition:none}}\n"] }]
394
394
  }], propDecorators: { activeValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeValue", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], select: [{ type: i0.Output, args: ["select"] }], tabs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => WmTab), { isSignal: true }] }] } });
395
395
 
396
396
  class WmButton {
@@ -460,11 +460,11 @@ class Checkbox {
460
460
  }
461
461
  }
462
462
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: Checkbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
463
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: Checkbox, isStandalone: true, selector: "wm-checkbox", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, ngImport: i0, template: "<label class=\"wm-checkbox-wrap\" [class.is-disabled]=\"disabled()\">\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n class=\"wm-checkbox-box\"\r\n [class.is-checked]=\"checked()\"\r\n [class.is-indeterminate]=\"indeterminate() && !checked()\"\r\n [attr.aria-checked]=\"ariaChecked()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n >\r\n @if (indeterminate() && !checked()) {\r\n <!-- Dash for indeterminate (\"some selected\") state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"6\" x2=\"10\" y2=\"6\"\r\n stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else if (checked()) {\r\n <!-- Animated checkmark for selected state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <polyline class=\"check-mark\" points=\"2,6.5 4.5,9 10,3\"\r\n fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (label()) {\r\n <span class=\"wm-checkbox-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n", styles: [":host{display:inline-flex}.wm-checkbox-wrap{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.wm-checkbox-wrap.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.wm-checkbox-box{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border:2px solid var(--wm-border-input);border-radius:4px;background:var(--wm-bg-base);color:#fff;cursor:pointer;padding:0;outline:none;transition:background var(--wm-transition-fast),border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-checkbox-box:focus-visible{box-shadow:0 0 0 2px var(--wm-bg-base),0 0 0 4px var(--wm-color-accent)}.wm-checkbox-box.is-checked,.wm-checkbox-box.is-indeterminate{background:var(--wm-color-accent);border-color:var(--wm-color-accent)}.wm-checkbox-icon{width:12px;height:12px;display:block;flex-shrink:0}@keyframes check-draw{0%{stroke-dashoffset:16}to{stroke-dashoffset:0}}.check-mark{stroke-dasharray:16;stroke-dashoffset:0;animation:check-draw .18s ease-out forwards}.wm-checkbox-label{font-size:.875rem;color:var(--wm-text-primary);line-height:1.4}@media(prefers-reduced-motion:reduce){.wm-checkbox-box{transition:none}.check-mark{animation:none}}\n"] });
463
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: Checkbox, isStandalone: true, selector: "wm-checkbox", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, ngImport: i0, template: "<label class=\"wm-checkbox-wrap\" [class.is-disabled]=\"disabled()\">\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n class=\"wm-checkbox-box\"\r\n [class.is-checked]=\"checked()\"\r\n [class.is-indeterminate]=\"indeterminate() && !checked()\"\r\n [attr.aria-checked]=\"ariaChecked()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n >\r\n @if (indeterminate() && !checked()) {\r\n <!-- Dash for indeterminate (\"some selected\") state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"6\" x2=\"10\" y2=\"6\"\r\n stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else if (checked()) {\r\n <!-- Animated checkmark for selected state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <polyline class=\"check-mark\" points=\"2,6.5 4.5,9 10,3\"\r\n fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (label()) {\r\n <span class=\"wm-checkbox-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n", styles: [":host{display:inline-flex}.wm-checkbox-wrap{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.wm-checkbox-wrap.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.wm-checkbox-box{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border:2px solid var(--wm-border-input);border-radius:4px;background:var(--wm-bg-base);color:#fff;cursor:pointer;padding:0;outline:none;transition:background var(--wm-transition-fast),border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-checkbox-box:focus-visible{box-shadow:0 0 0 2px var(--wm-bg-base),0 0 0 4px var(--wm-color-accent)}.wm-checkbox-box.is-checked,.wm-checkbox-box.is-indeterminate{background:var(--wm-color-accent);border-color:var(--wm-color-accent-readable)}.wm-checkbox-icon{width:12px;height:12px;display:block;flex-shrink:0}@keyframes check-draw{0%{stroke-dashoffset:16}to{stroke-dashoffset:0}}.check-mark{stroke-dasharray:16;stroke-dashoffset:0;animation:check-draw .18s ease-out forwards}.wm-checkbox-label{font-size:.875rem;color:var(--wm-text-primary);line-height:1.4}@media(prefers-reduced-motion:reduce){.wm-checkbox-box{transition:none}.check-mark{animation:none}}\n"] });
464
464
  }
465
465
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: Checkbox, decorators: [{
466
466
  type: Component,
467
- args: [{ selector: 'wm-checkbox', template: "<label class=\"wm-checkbox-wrap\" [class.is-disabled]=\"disabled()\">\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n class=\"wm-checkbox-box\"\r\n [class.is-checked]=\"checked()\"\r\n [class.is-indeterminate]=\"indeterminate() && !checked()\"\r\n [attr.aria-checked]=\"ariaChecked()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n >\r\n @if (indeterminate() && !checked()) {\r\n <!-- Dash for indeterminate (\"some selected\") state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"6\" x2=\"10\" y2=\"6\"\r\n stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else if (checked()) {\r\n <!-- Animated checkmark for selected state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <polyline class=\"check-mark\" points=\"2,6.5 4.5,9 10,3\"\r\n fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (label()) {\r\n <span class=\"wm-checkbox-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n", styles: [":host{display:inline-flex}.wm-checkbox-wrap{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.wm-checkbox-wrap.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.wm-checkbox-box{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border:2px solid var(--wm-border-input);border-radius:4px;background:var(--wm-bg-base);color:#fff;cursor:pointer;padding:0;outline:none;transition:background var(--wm-transition-fast),border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-checkbox-box:focus-visible{box-shadow:0 0 0 2px var(--wm-bg-base),0 0 0 4px var(--wm-color-accent)}.wm-checkbox-box.is-checked,.wm-checkbox-box.is-indeterminate{background:var(--wm-color-accent);border-color:var(--wm-color-accent)}.wm-checkbox-icon{width:12px;height:12px;display:block;flex-shrink:0}@keyframes check-draw{0%{stroke-dashoffset:16}to{stroke-dashoffset:0}}.check-mark{stroke-dasharray:16;stroke-dashoffset:0;animation:check-draw .18s ease-out forwards}.wm-checkbox-label{font-size:.875rem;color:var(--wm-text-primary);line-height:1.4}@media(prefers-reduced-motion:reduce){.wm-checkbox-box{transition:none}.check-mark{animation:none}}\n"] }]
467
+ args: [{ selector: 'wm-checkbox', template: "<label class=\"wm-checkbox-wrap\" [class.is-disabled]=\"disabled()\">\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n class=\"wm-checkbox-box\"\r\n [class.is-checked]=\"checked()\"\r\n [class.is-indeterminate]=\"indeterminate() && !checked()\"\r\n [attr.aria-checked]=\"ariaChecked()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n >\r\n @if (indeterminate() && !checked()) {\r\n <!-- Dash for indeterminate (\"some selected\") state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"6\" x2=\"10\" y2=\"6\"\r\n stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else if (checked()) {\r\n <!-- Animated checkmark for selected state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <polyline class=\"check-mark\" points=\"2,6.5 4.5,9 10,3\"\r\n fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (label()) {\r\n <span class=\"wm-checkbox-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n", styles: [":host{display:inline-flex}.wm-checkbox-wrap{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.wm-checkbox-wrap.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.wm-checkbox-box{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border:2px solid var(--wm-border-input);border-radius:4px;background:var(--wm-bg-base);color:#fff;cursor:pointer;padding:0;outline:none;transition:background var(--wm-transition-fast),border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-checkbox-box:focus-visible{box-shadow:0 0 0 2px var(--wm-bg-base),0 0 0 4px var(--wm-color-accent)}.wm-checkbox-box.is-checked,.wm-checkbox-box.is-indeterminate{background:var(--wm-color-accent);border-color:var(--wm-color-accent-readable)}.wm-checkbox-icon{width:12px;height:12px;display:block;flex-shrink:0}@keyframes check-draw{0%{stroke-dashoffset:16}to{stroke-dashoffset:0}}.check-mark{stroke-dasharray:16;stroke-dashoffset:0;animation:check-draw .18s ease-out forwards}.wm-checkbox-label{font-size:.875rem;color:var(--wm-text-primary);line-height:1.4}@media(prefers-reduced-motion:reduce){.wm-checkbox-box{transition:none}.check-mark{animation:none}}\n"] }]
468
468
  }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
469
469
 
470
470
  /**
@@ -791,11 +791,11 @@ class ComboboxPanel {
791
791
  return segments;
792
792
  }
793
793
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ComboboxPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
794
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: ComboboxPanel, isStandalone: true, selector: "wm-combobox-panel", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, highlightIndex: { classPropertyName: "highlightIndex", publicName: "highlightIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedValues: { classPropertyName: "selectedValues", publicName: "selectedValues", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, filterQuery: { classPropertyName: "filterQuery", publicName: "filterQuery", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, freeformHint: { classPropertyName: "freeformHint", publicName: "freeformHint", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { optionClicked: "optionClicked" }, viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: "@if (loading()) {\n <div class=\"wm-cb-loading\" aria-live=\"polite\">\n <svg\n class=\"wm-cb-spinner\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <circle\n cx=\"10\" cy=\"10\" r=\"8\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-dasharray=\"40 60\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"wm-cb-loading-text\">Loading\u2026</span>\n </div>\n} @else if (showEmpty()) {\n <div class=\"wm-cb-empty\" aria-live=\"polite\">{{ emptyText() }}</div>\n} @else {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemHeight()\"\n [style.height.px]=\"viewportHeight()\"\n class=\"wm-cb-viewport\"\n >\n <div\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n >\n <div\n *cdkVirtualFor=\"let opt of options(); let i = index\"\n role=\"option\"\n class=\"wm-cb-option\"\n [id]=\"optionIdAt(i)\"\n [class.is-highlighted]=\"i === highlightIndex()\"\n [class.is-selected]=\"isSelected(opt.value)\"\n [class.is-disabled]=\"!!opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\n (mousedown)=\"onOptionMousedown($event, opt, i)\"\n >\n <span class=\"wm-cb-option-label\">\n @for (seg of segmentsAt(i); track $index) {\n @if (seg.match) {\n <b class=\"wm-cb-match\">{{ seg.text }}</b>\n } @else {\n {{ seg.text }}\n }\n }\n </span>\n @if (isSelected(opt.value)) {\n <svg\n class=\"wm-cb-check\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <polyline\n points=\"20 6 9 17 4 12\"\n stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"\n />\n </svg>\n }\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n}\n", styles: [":host{display:block}.wm-cb-viewport{width:100%}.wm-cb-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast);-webkit-user-select:none;user-select:none}.wm-cb-option:hover:not(.is-disabled):not(.is-highlighted){background:var(--wm-bg-active)}.wm-cb-option.is-highlighted{background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent)}.wm-cb-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent);font-weight:500}.wm-cb-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-cb-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-match{font-weight:700;color:var(--wm-color-accent)}.wm-cb-check{flex-shrink:0;color:var(--wm-color-accent)}.wm-cb-empty{padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem;text-align:center}.wm-cb-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem}.wm-cb-spinner{animation:wm-cb-spin .8s linear infinite}@keyframes wm-cb-spin{to{transform:rotate(360deg)}}.wm-cb-loading-text{color:var(--wm-text-muted)}\n"], dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
794
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: ComboboxPanel, isStandalone: true, selector: "wm-combobox-panel", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, highlightIndex: { classPropertyName: "highlightIndex", publicName: "highlightIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedValues: { classPropertyName: "selectedValues", publicName: "selectedValues", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, filterQuery: { classPropertyName: "filterQuery", publicName: "filterQuery", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, freeformHint: { classPropertyName: "freeformHint", publicName: "freeformHint", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { optionClicked: "optionClicked" }, viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: "@if (loading()) {\n <div class=\"wm-cb-loading\" aria-live=\"polite\">\n <svg\n class=\"wm-cb-spinner\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <circle\n cx=\"10\" cy=\"10\" r=\"8\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-dasharray=\"40 60\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"wm-cb-loading-text\">Loading\u2026</span>\n </div>\n} @else if (showEmpty()) {\n <div class=\"wm-cb-empty\" aria-live=\"polite\">{{ emptyText() }}</div>\n} @else {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemHeight()\"\n [style.height.px]=\"viewportHeight()\"\n class=\"wm-cb-viewport\"\n >\n <div\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n >\n <div\n *cdkVirtualFor=\"let opt of options(); let i = index\"\n role=\"option\"\n class=\"wm-cb-option\"\n [id]=\"optionIdAt(i)\"\n [class.is-highlighted]=\"i === highlightIndex()\"\n [class.is-selected]=\"isSelected(opt.value)\"\n [class.is-disabled]=\"!!opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\n (mousedown)=\"onOptionMousedown($event, opt, i)\"\n >\n <span class=\"wm-cb-option-label\">\n @for (seg of segmentsAt(i); track $index) {\n @if (seg.match) {\n <b class=\"wm-cb-match\">{{ seg.text }}</b>\n } @else {\n {{ seg.text }}\n }\n }\n </span>\n @if (isSelected(opt.value)) {\n <svg\n class=\"wm-cb-check\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <polyline\n points=\"20 6 9 17 4 12\"\n stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"\n />\n </svg>\n }\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n}\n", styles: [":host{display:block}.wm-cb-viewport{width:100%}.wm-cb-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast);-webkit-user-select:none;user-select:none}.wm-cb-option:hover:not(.is-disabled):not(.is-highlighted){background:var(--wm-bg-active)}.wm-cb-option.is-highlighted{background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent)}.wm-cb-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent-readable);font-weight:500}.wm-cb-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-cb-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-match{font-weight:700;color:var(--wm-color-accent-readable)}.wm-cb-check{flex-shrink:0;color:var(--wm-color-accent-readable)}.wm-cb-empty{padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem;text-align:center}.wm-cb-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem}.wm-cb-spinner{animation:wm-cb-spin .8s linear infinite}@keyframes wm-cb-spin{to{transform:rotate(360deg)}}.wm-cb-loading-text{color:var(--wm-text-muted)}\n"], dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
795
795
  }
796
796
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: ComboboxPanel, decorators: [{
797
797
  type: Component,
798
- args: [{ selector: 'wm-combobox-panel', imports: [ScrollingModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (loading()) {\n <div class=\"wm-cb-loading\" aria-live=\"polite\">\n <svg\n class=\"wm-cb-spinner\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <circle\n cx=\"10\" cy=\"10\" r=\"8\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-dasharray=\"40 60\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"wm-cb-loading-text\">Loading\u2026</span>\n </div>\n} @else if (showEmpty()) {\n <div class=\"wm-cb-empty\" aria-live=\"polite\">{{ emptyText() }}</div>\n} @else {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemHeight()\"\n [style.height.px]=\"viewportHeight()\"\n class=\"wm-cb-viewport\"\n >\n <div\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n >\n <div\n *cdkVirtualFor=\"let opt of options(); let i = index\"\n role=\"option\"\n class=\"wm-cb-option\"\n [id]=\"optionIdAt(i)\"\n [class.is-highlighted]=\"i === highlightIndex()\"\n [class.is-selected]=\"isSelected(opt.value)\"\n [class.is-disabled]=\"!!opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\n (mousedown)=\"onOptionMousedown($event, opt, i)\"\n >\n <span class=\"wm-cb-option-label\">\n @for (seg of segmentsAt(i); track $index) {\n @if (seg.match) {\n <b class=\"wm-cb-match\">{{ seg.text }}</b>\n } @else {\n {{ seg.text }}\n }\n }\n </span>\n @if (isSelected(opt.value)) {\n <svg\n class=\"wm-cb-check\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <polyline\n points=\"20 6 9 17 4 12\"\n stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"\n />\n </svg>\n }\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n}\n", styles: [":host{display:block}.wm-cb-viewport{width:100%}.wm-cb-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast);-webkit-user-select:none;user-select:none}.wm-cb-option:hover:not(.is-disabled):not(.is-highlighted){background:var(--wm-bg-active)}.wm-cb-option.is-highlighted{background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent)}.wm-cb-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent);font-weight:500}.wm-cb-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-cb-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-match{font-weight:700;color:var(--wm-color-accent)}.wm-cb-check{flex-shrink:0;color:var(--wm-color-accent)}.wm-cb-empty{padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem;text-align:center}.wm-cb-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem}.wm-cb-spinner{animation:wm-cb-spin .8s linear infinite}@keyframes wm-cb-spin{to{transform:rotate(360deg)}}.wm-cb-loading-text{color:var(--wm-text-muted)}\n"] }]
798
+ args: [{ selector: 'wm-combobox-panel', imports: [ScrollingModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (loading()) {\n <div class=\"wm-cb-loading\" aria-live=\"polite\">\n <svg\n class=\"wm-cb-spinner\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <circle\n cx=\"10\" cy=\"10\" r=\"8\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-dasharray=\"40 60\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"wm-cb-loading-text\">Loading\u2026</span>\n </div>\n} @else if (showEmpty()) {\n <div class=\"wm-cb-empty\" aria-live=\"polite\">{{ emptyText() }}</div>\n} @else {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemHeight()\"\n [style.height.px]=\"viewportHeight()\"\n class=\"wm-cb-viewport\"\n >\n <div\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n >\n <div\n *cdkVirtualFor=\"let opt of options(); let i = index\"\n role=\"option\"\n class=\"wm-cb-option\"\n [id]=\"optionIdAt(i)\"\n [class.is-highlighted]=\"i === highlightIndex()\"\n [class.is-selected]=\"isSelected(opt.value)\"\n [class.is-disabled]=\"!!opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\n (mousedown)=\"onOptionMousedown($event, opt, i)\"\n >\n <span class=\"wm-cb-option-label\">\n @for (seg of segmentsAt(i); track $index) {\n @if (seg.match) {\n <b class=\"wm-cb-match\">{{ seg.text }}</b>\n } @else {\n {{ seg.text }}\n }\n }\n </span>\n @if (isSelected(opt.value)) {\n <svg\n class=\"wm-cb-check\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <polyline\n points=\"20 6 9 17 4 12\"\n stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"\n />\n </svg>\n }\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n}\n", styles: [":host{display:block}.wm-cb-viewport{width:100%}.wm-cb-option{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.4375rem .625rem;border:none;border-radius:var(--wm-radius-sm);background:transparent;color:var(--wm-text-primary);font-size:.875rem;font-family:inherit;cursor:pointer;text-align:left;transition:background var(--wm-transition-fast);-webkit-user-select:none;user-select:none}.wm-cb-option:hover:not(.is-disabled):not(.is-highlighted){background:var(--wm-bg-active)}.wm-cb-option.is-highlighted{background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent)}.wm-cb-option.is-selected{background:color-mix(in srgb,var(--wm-color-accent) 10%,transparent);color:var(--wm-color-accent-readable);font-weight:500}.wm-cb-option.is-disabled{opacity:.4;cursor:not-allowed}.wm-cb-option-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-match{font-weight:700;color:var(--wm-color-accent-readable)}.wm-cb-check{flex-shrink:0;color:var(--wm-color-accent-readable)}.wm-cb-empty{padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem;text-align:center}.wm-cb-loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.75rem .625rem;color:var(--wm-text-muted);font-size:.875rem}.wm-cb-spinner{animation:wm-cb-spin .8s linear infinite}@keyframes wm-cb-spin{to{transform:rotate(360deg)}}.wm-cb-loading-text{color:var(--wm-text-muted)}\n"] }]
799
799
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], highlightIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightIndex", required: false }] }], selectedValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedValues", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], itemHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeight", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], filterQuery: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterQuery", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], freeformHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "freeformHint", required: false }] }], optionClicked: [{ type: i0.Output, args: ["optionClicked"] }], viewport: [{
800
800
  type: ViewChild,
801
801
  args: [CdkVirtualScrollViewport]
@@ -1299,7 +1299,7 @@ class WmCombobox {
1299
1299
  useExisting: forwardRef(() => WmCombobox),
1300
1300
  multi: true,
1301
1301
  },
1302
- ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ComboboxPanel, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Trigger wrapper \u2014 anchors the CDK overlay -->\n<div\n class=\"wm-cb-trigger\"\n [class.is-open]=\"isOpen()\"\n [class.is-disabled]=\"disabled()\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick()\"\n>\n <!-- Multi-select chips -->\n @if (multiple()) {\n @for (chip of chips(); track chip.value) {\n <span class=\"wm-cb-chip\">\n <span class=\"wm-cb-chip-label\">{{ chip.label }}</span>\n <button\n type=\"button\"\n class=\"wm-cb-chip-remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Remove ' + chip.label\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation()\"\n (click)=\"$event.stopPropagation(); removeChip(chip.value)\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </span>\n }\n }\n\n <!-- Text input -->\n <input\n #inputEl\n type=\"text\"\n class=\"wm-cb-input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.placeholder]=\"chips().length ? '' : placeholder()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n [attr.aria-autocomplete]=\"allowFreeform() ? 'both' : 'list'\"\n [attr.aria-activedescendant]=\"activeDescendant()\"\n [attr.aria-controls]=\"isOpen() ? panelListboxId() : null\"\n [disabled]=\"disabled() || null\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Chevron -->\n <svg\n class=\"wm-cb-chevron\"\n [class.is-open]=\"isOpen()\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n</div>\n\n<!-- Live region for screen readers -->\n<span class=\"wm-cb-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ liveText() }}\n</span>\n\n<!-- Dropdown panel in CDK overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"wm-cb-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div class=\"wm-cb-panel\">\n <wm-combobox-panel\n [options]=\"filteredOptions()\"\n [highlightIndex]=\"highlightIndex()\"\n [selectedValues]=\"selectedValues()\"\n [multiple]=\"multiple()\"\n [itemHeight]=\"itemHeight()\"\n [maxHeight]=\"maxPanelHeight()\"\n [filterQuery]=\"inputText()\"\n [loading]=\"asyncLoading()\"\n [freeformHint]=\"freeformHint()\"\n (optionClicked)=\"onOptionClicked($event)\"\n />\n </div>\n</ng-template>\n", styles: [":host{display:block}.wm-cb-trigger{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;width:100%;min-height:36px;padding:.25rem .5rem;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-sm);color:var(--wm-text-primary);font-size:.875rem;cursor:text;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-cb-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent)}.wm-cb-trigger:focus-within:not(.is-disabled){border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-cb-trigger.is-open{border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-cb-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-cb-input{flex:1 1 60px;min-width:60px;border:none;outline:none;background:transparent;color:inherit;font:inherit;padding:.125rem 0}.wm-cb-input::placeholder{color:var(--wm-text-placeholder)}.wm-cb-input:disabled{cursor:not-allowed}.wm-cb-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast);pointer-events:none}.wm-cb-chevron.is-open{transform:rotate(180deg)}.wm-cb-chip{display:inline-flex;align-items:center;gap:.25rem;max-width:100%;padding:.125rem .375rem;background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent);border:1px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-radius:var(--wm-radius-sm);font-size:.8125rem;line-height:1.4;color:var(--wm-text-primary);-webkit-user-select:none;user-select:none}.wm-cb-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-chip-remove{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--wm-text-muted);cursor:pointer;border-radius:var(--wm-radius-sm);transition:color var(--wm-transition-fast)}.wm-cb-chip-remove:hover{color:var(--wm-text-primary)}.wm-cb-backdrop{position:fixed;inset:0}.wm-cb-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;padding:.25rem}.wm-cb-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ComboboxPanel, selector: "wm-combobox-panel", inputs: ["options", "highlightIndex", "selectedValues", "multiple", "itemHeight", "maxHeight", "filterQuery", "loading", "freeformHint"], outputs: ["optionClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1302
+ ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ComboboxPanel, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Trigger wrapper \u2014 anchors the CDK overlay -->\n<div\n class=\"wm-cb-trigger\"\n [class.is-open]=\"isOpen()\"\n [class.is-disabled]=\"disabled()\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick()\"\n>\n <!-- Multi-select chips -->\n @if (multiple()) {\n @for (chip of chips(); track chip.value) {\n <span class=\"wm-cb-chip\">\n <span class=\"wm-cb-chip-label\">{{ chip.label }}</span>\n <button\n type=\"button\"\n class=\"wm-cb-chip-remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Remove ' + chip.label\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation()\"\n (click)=\"$event.stopPropagation(); removeChip(chip.value)\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </span>\n }\n }\n\n <!-- Text input -->\n <input\n #inputEl\n type=\"text\"\n class=\"wm-cb-input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.placeholder]=\"chips().length ? '' : placeholder()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n [attr.aria-autocomplete]=\"allowFreeform() ? 'both' : 'list'\"\n [attr.aria-activedescendant]=\"activeDescendant()\"\n [attr.aria-controls]=\"isOpen() ? panelListboxId() : null\"\n [disabled]=\"disabled() || null\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Chevron -->\n <svg\n class=\"wm-cb-chevron\"\n [class.is-open]=\"isOpen()\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n</div>\n\n<!-- Live region for screen readers -->\n<span class=\"wm-cb-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ liveText() }}\n</span>\n\n<!-- Dropdown panel in CDK overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"wm-cb-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div class=\"wm-cb-panel\">\n <wm-combobox-panel\n [options]=\"filteredOptions()\"\n [highlightIndex]=\"highlightIndex()\"\n [selectedValues]=\"selectedValues()\"\n [multiple]=\"multiple()\"\n [itemHeight]=\"itemHeight()\"\n [maxHeight]=\"maxPanelHeight()\"\n [filterQuery]=\"inputText()\"\n [loading]=\"asyncLoading()\"\n [freeformHint]=\"freeformHint()\"\n (optionClicked)=\"onOptionClicked($event)\"\n />\n </div>\n</ng-template>\n", styles: [":host{display:block}.wm-cb-trigger{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;width:100%;min-height:36px;padding:.25rem .5rem;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-sm);color:var(--wm-text-primary);font-size:.875rem;cursor:text;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-cb-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent-readable)}.wm-cb-trigger:focus-within:not(.is-disabled){border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-cb-trigger.is-open{border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-cb-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-cb-input{flex:1 1 60px;min-width:60px;border:none;outline:none;background:transparent;color:inherit;font:inherit;padding:.125rem 0}.wm-cb-input::placeholder{color:var(--wm-text-placeholder)}.wm-cb-input:disabled{cursor:not-allowed}.wm-cb-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast);pointer-events:none}.wm-cb-chevron.is-open{transform:rotate(180deg)}.wm-cb-chip{display:inline-flex;align-items:center;gap:.25rem;max-width:100%;padding:.125rem .375rem;background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent);border:1px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-radius:var(--wm-radius-sm);font-size:.8125rem;line-height:1.4;color:var(--wm-text-primary);-webkit-user-select:none;user-select:none}.wm-cb-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-chip-remove{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--wm-text-muted);cursor:pointer;border-radius:var(--wm-radius-sm);transition:color var(--wm-transition-fast)}.wm-cb-chip-remove:hover{color:var(--wm-text-primary)}.wm-cb-backdrop{position:fixed;inset:0}.wm-cb-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;padding:.25rem}.wm-cb-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ComboboxPanel, selector: "wm-combobox-panel", inputs: ["options", "highlightIndex", "selectedValues", "multiple", "itemHeight", "maxHeight", "filterQuery", "loading", "freeformHint"], outputs: ["optionClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1303
1303
  }
1304
1304
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WmCombobox, decorators: [{
1305
1305
  type: Component,
@@ -1309,7 +1309,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
1309
1309
  useExisting: forwardRef(() => WmCombobox),
1310
1310
  multi: true,
1311
1311
  },
1312
- ], template: "<!-- Trigger wrapper \u2014 anchors the CDK overlay -->\n<div\n class=\"wm-cb-trigger\"\n [class.is-open]=\"isOpen()\"\n [class.is-disabled]=\"disabled()\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick()\"\n>\n <!-- Multi-select chips -->\n @if (multiple()) {\n @for (chip of chips(); track chip.value) {\n <span class=\"wm-cb-chip\">\n <span class=\"wm-cb-chip-label\">{{ chip.label }}</span>\n <button\n type=\"button\"\n class=\"wm-cb-chip-remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Remove ' + chip.label\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation()\"\n (click)=\"$event.stopPropagation(); removeChip(chip.value)\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </span>\n }\n }\n\n <!-- Text input -->\n <input\n #inputEl\n type=\"text\"\n class=\"wm-cb-input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.placeholder]=\"chips().length ? '' : placeholder()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n [attr.aria-autocomplete]=\"allowFreeform() ? 'both' : 'list'\"\n [attr.aria-activedescendant]=\"activeDescendant()\"\n [attr.aria-controls]=\"isOpen() ? panelListboxId() : null\"\n [disabled]=\"disabled() || null\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Chevron -->\n <svg\n class=\"wm-cb-chevron\"\n [class.is-open]=\"isOpen()\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n</div>\n\n<!-- Live region for screen readers -->\n<span class=\"wm-cb-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ liveText() }}\n</span>\n\n<!-- Dropdown panel in CDK overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"wm-cb-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div class=\"wm-cb-panel\">\n <wm-combobox-panel\n [options]=\"filteredOptions()\"\n [highlightIndex]=\"highlightIndex()\"\n [selectedValues]=\"selectedValues()\"\n [multiple]=\"multiple()\"\n [itemHeight]=\"itemHeight()\"\n [maxHeight]=\"maxPanelHeight()\"\n [filterQuery]=\"inputText()\"\n [loading]=\"asyncLoading()\"\n [freeformHint]=\"freeformHint()\"\n (optionClicked)=\"onOptionClicked($event)\"\n />\n </div>\n</ng-template>\n", styles: [":host{display:block}.wm-cb-trigger{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;width:100%;min-height:36px;padding:.25rem .5rem;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-sm);color:var(--wm-text-primary);font-size:.875rem;cursor:text;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-cb-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent)}.wm-cb-trigger:focus-within:not(.is-disabled){border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-cb-trigger.is-open{border-color:var(--wm-color-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-cb-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-cb-input{flex:1 1 60px;min-width:60px;border:none;outline:none;background:transparent;color:inherit;font:inherit;padding:.125rem 0}.wm-cb-input::placeholder{color:var(--wm-text-placeholder)}.wm-cb-input:disabled{cursor:not-allowed}.wm-cb-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast);pointer-events:none}.wm-cb-chevron.is-open{transform:rotate(180deg)}.wm-cb-chip{display:inline-flex;align-items:center;gap:.25rem;max-width:100%;padding:.125rem .375rem;background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent);border:1px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-radius:var(--wm-radius-sm);font-size:.8125rem;line-height:1.4;color:var(--wm-text-primary);-webkit-user-select:none;user-select:none}.wm-cb-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-chip-remove{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--wm-text-muted);cursor:pointer;border-radius:var(--wm-radius-sm);transition:color var(--wm-transition-fast)}.wm-cb-chip-remove:hover{color:var(--wm-text-primary)}.wm-cb-backdrop{position:fixed;inset:0}.wm-cb-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;padding:.25rem}.wm-cb-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
1312
+ ], template: "<!-- Trigger wrapper \u2014 anchors the CDK overlay -->\n<div\n class=\"wm-cb-trigger\"\n [class.is-open]=\"isOpen()\"\n [class.is-disabled]=\"disabled()\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick()\"\n>\n <!-- Multi-select chips -->\n @if (multiple()) {\n @for (chip of chips(); track chip.value) {\n <span class=\"wm-cb-chip\">\n <span class=\"wm-cb-chip-label\">{{ chip.label }}</span>\n <button\n type=\"button\"\n class=\"wm-cb-chip-remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Remove ' + chip.label\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation()\"\n (click)=\"$event.stopPropagation(); removeChip(chip.value)\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </span>\n }\n }\n\n <!-- Text input -->\n <input\n #inputEl\n type=\"text\"\n class=\"wm-cb-input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.placeholder]=\"chips().length ? '' : placeholder()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n [attr.aria-autocomplete]=\"allowFreeform() ? 'both' : 'list'\"\n [attr.aria-activedescendant]=\"activeDescendant()\"\n [attr.aria-controls]=\"isOpen() ? panelListboxId() : null\"\n [disabled]=\"disabled() || null\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Chevron -->\n <svg\n class=\"wm-cb-chevron\"\n [class.is-open]=\"isOpen()\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n</div>\n\n<!-- Live region for screen readers -->\n<span class=\"wm-cb-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ liveText() }}\n</span>\n\n<!-- Dropdown panel in CDK overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"wm-cb-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div class=\"wm-cb-panel\">\n <wm-combobox-panel\n [options]=\"filteredOptions()\"\n [highlightIndex]=\"highlightIndex()\"\n [selectedValues]=\"selectedValues()\"\n [multiple]=\"multiple()\"\n [itemHeight]=\"itemHeight()\"\n [maxHeight]=\"maxPanelHeight()\"\n [filterQuery]=\"inputText()\"\n [loading]=\"asyncLoading()\"\n [freeformHint]=\"freeformHint()\"\n (optionClicked)=\"onOptionClicked($event)\"\n />\n </div>\n</ng-template>\n", styles: [":host{display:block}.wm-cb-trigger{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;width:100%;min-height:36px;padding:.25rem .5rem;background:var(--wm-bg-base);border:1px solid var(--wm-border-input);border-radius:var(--wm-radius-sm);color:var(--wm-text-primary);font-size:.875rem;cursor:text;transition:border-color var(--wm-transition-fast),box-shadow var(--wm-transition-fast)}.wm-cb-trigger:hover:not(.is-disabled){border-color:var(--wm-color-accent-readable)}.wm-cb-trigger:focus-within:not(.is-disabled){border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 25%,transparent)}.wm-cb-trigger.is-open{border-color:var(--wm-color-accent-readable);box-shadow:0 0 0 3px color-mix(in srgb,var(--wm-color-accent) 20%,transparent)}.wm-cb-trigger.is-disabled{opacity:.45;cursor:not-allowed}.wm-cb-input{flex:1 1 60px;min-width:60px;border:none;outline:none;background:transparent;color:inherit;font:inherit;padding:.125rem 0}.wm-cb-input::placeholder{color:var(--wm-text-placeholder)}.wm-cb-input:disabled{cursor:not-allowed}.wm-cb-chevron{flex-shrink:0;color:var(--wm-text-muted);transition:transform var(--wm-transition-fast);pointer-events:none}.wm-cb-chevron.is-open{transform:rotate(180deg)}.wm-cb-chip{display:inline-flex;align-items:center;gap:.25rem;max-width:100%;padding:.125rem .375rem;background:color-mix(in srgb,var(--wm-color-accent) 15%,transparent);border:1px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-radius:var(--wm-radius-sm);font-size:.8125rem;line-height:1.4;color:var(--wm-text-primary);-webkit-user-select:none;user-select:none}.wm-cb-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wm-cb-chip-remove{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--wm-text-muted);cursor:pointer;border-radius:var(--wm-radius-sm);transition:color var(--wm-transition-fast)}.wm-cb-chip-remove:hover{color:var(--wm-text-primary)}.wm-cb-backdrop{position:fixed;inset:0}.wm-cb-panel{width:100%;background:var(--wm-bg-float);border:1px solid var(--wm-border);border-radius:var(--wm-radius-lg);box-shadow:0 4px 6px -1px #00000014,0 10px 20px -4px #0000001f;overflow:hidden;padding:.25rem}.wm-cb-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
1313
1313
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], values: [{ type: i0.Input, args: [{ isSignal: true, alias: "values", required: false }] }, { type: i0.Output, args: ["valuesChange"] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], allowFreeform: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowFreeform", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filterFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterFn", required: false }] }], itemHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeight", required: false }] }], maxPanelHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxPanelHeight", required: false }] }], query: [{ type: i0.Output, args: ["query"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], inputRef: [{ type: i0.ViewChild, args: ['inputEl', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ComboboxPanel), { isSignal: true }] }] } });
1314
1314
 
1315
1315
  let nextId = 0;
@@ -1406,11 +1406,11 @@ class WmToastContainer {
1406
1406
  return `${mins}m ${secs.toString().padStart(2, '0')}s`;
1407
1407
  }
1408
1408
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WmToastContainer, deps: [], target: i0.ɵɵFactoryTarget.Component });
1409
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: WmToastContainer, isStandalone: true, selector: "wm-toast-container", ngImport: i0, template: "<div class=\"wm-toast-container\" role=\"log\" aria-live=\"polite\" aria-label=\"Notifications\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div [class]=\"typeClass(toast)\" role=\"status\">\n <!-- Success icon (check-circle) -->\n @if (toast.type === 'success') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n <!-- Error icon (x-circle) -->\n @if (toast.type === 'error') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n <!-- Info icon -->\n @if (toast.type === 'info') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n }\n <!-- Progress spinner -->\n @if (toast.type === 'progress') {\n <span class=\"wm-toast-spinner\" aria-hidden=\"true\"></span>\n }\n\n <span class=\"wm-toast-message\">\n {{ toast.message }}\n @if (toast.type === 'progress' && toast.createdAt) {\n <span class=\"wm-toast-elapsed\"> ({{ elapsed(toast.createdAt) }})</span>\n }\n </span>\n\n <!-- Cancel button for progress toasts with an onCancel callback -->\n @if (toast.type === 'progress' && toast.onCancel) {\n <button class=\"wm-toast-cancel\" (click)=\"cancel(toast)\" aria-label=\"Cancel operation\">Cancel</button>\n }\n\n <!-- Dismiss button \u2014 always shown -->\n <button class=\"wm-toast-dismiss\" (click)=\"dismiss(toast.id)\" aria-label=\"Dismiss notification\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n }\n</div>\n", styles: [".wm-toast-container{position:fixed;bottom:1rem;right:1rem;display:flex;flex-direction:column;gap:.5rem;z-index:9999;pointer-events:none}.wm-toast{display:flex;align-items:flex-start;gap:.625rem;padding:.625rem .875rem;border-radius:var(--wm-radius-sm, 4px);box-shadow:var(--wm-shadow-md, 0 4px 12px rgba(0,0,0,.25));font-size:.8125rem;line-height:1.4;min-width:220px;max-width:360px;pointer-events:auto;animation:wm-toast-slide-in .15s ease-out both}.wm-toast--success{background:color-mix(in srgb,var(--wm-color-success) 20%,var(--wm-bg-raised));color:var(--wm-color-success);border:1px solid color-mix(in srgb,var(--wm-color-success) 40%,transparent)}.wm-toast--error{background:color-mix(in srgb,var(--wm-color-danger) 20%,var(--wm-bg-raised));color:var(--wm-color-danger);border:1px solid color-mix(in srgb,var(--wm-color-danger) 40%,transparent)}.wm-toast--info{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid var(--wm-border)}.wm-toast--progress{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid color-mix(in srgb,var(--wm-color-accent) 40%,transparent)}.wm-toast-icon{flex-shrink:0;margin-top:1px}.wm-toast-message{flex:1;line-height:1.4}.wm-toast-dismiss{flex-shrink:0;background:none;border:none;color:inherit;opacity:.6;cursor:pointer;padding:0;margin-left:.25rem;transition:opacity .15s ease}.wm-toast-dismiss:hover{opacity:1}.wm-toast-spinner{width:14px;height:14px;border:2px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-top-color:var(--wm-color-accent);border-radius:50%;flex-shrink:0;margin-top:1px;animation:wm-toast-spin .7s linear infinite}.wm-toast-elapsed{opacity:.6;font-size:.75rem;font-variant-numeric:tabular-nums}.wm-toast-cancel{flex-shrink:0;background:none;border:1px solid color-mix(in srgb,currentColor 30%,transparent);border-radius:var(--wm-radius-sm, 4px);color:inherit;opacity:.7;cursor:pointer;padding:.125rem .5rem;font-size:.75rem;transition:opacity .15s ease,border-color .15s ease}.wm-toast-cancel:hover{opacity:1;border-color:currentColor}@keyframes wm-toast-spin{to{transform:rotate(360deg)}}@keyframes wm-toast-slide-in{0%{opacity:0;transform:translate(1rem)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.wm-toast{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1409
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: WmToastContainer, isStandalone: true, selector: "wm-toast-container", ngImport: i0, template: "<div class=\"wm-toast-container\" role=\"log\" aria-live=\"polite\" aria-label=\"Notifications\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div [class]=\"typeClass(toast)\" role=\"status\">\n <!-- Success icon (check-circle) -->\n @if (toast.type === 'success') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n <!-- Error icon (x-circle) -->\n @if (toast.type === 'error') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n <!-- Info icon -->\n @if (toast.type === 'info') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n }\n <!-- Progress spinner -->\n @if (toast.type === 'progress') {\n <span class=\"wm-toast-spinner\" aria-hidden=\"true\"></span>\n }\n\n <span class=\"wm-toast-message\">\n {{ toast.message }}\n @if (toast.type === 'progress' && toast.createdAt) {\n <span class=\"wm-toast-elapsed\"> ({{ elapsed(toast.createdAt) }})</span>\n }\n </span>\n\n <!-- Cancel button for progress toasts with an onCancel callback -->\n @if (toast.type === 'progress' && toast.onCancel) {\n <button class=\"wm-toast-cancel\" (click)=\"cancel(toast)\" aria-label=\"Cancel operation\">Cancel</button>\n }\n\n <!-- Dismiss button \u2014 always shown -->\n <button class=\"wm-toast-dismiss\" (click)=\"dismiss(toast.id)\" aria-label=\"Dismiss notification\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n }\n</div>\n", styles: [".wm-toast-container{position:fixed;bottom:1rem;right:1rem;display:flex;flex-direction:column;gap:.5rem;z-index:9999;pointer-events:none}.wm-toast{display:flex;align-items:flex-start;gap:.625rem;padding:.625rem .875rem;border-radius:var(--wm-radius-sm, 4px);box-shadow:var(--wm-shadow-md, 0 4px 12px rgba(0,0,0,.25));font-size:.8125rem;line-height:1.4;min-width:220px;max-width:360px;pointer-events:auto;animation:wm-toast-slide-in .15s ease-out both}.wm-toast--success{background:color-mix(in srgb,var(--wm-color-success) 20%,var(--wm-bg-raised));color:var(--wm-color-success);border:1px solid color-mix(in srgb,var(--wm-color-success) 40%,transparent)}.wm-toast--error{background:color-mix(in srgb,var(--wm-color-danger) 20%,var(--wm-bg-raised));color:var(--wm-color-danger);border:1px solid color-mix(in srgb,var(--wm-color-danger) 40%,transparent)}.wm-toast--info{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid var(--wm-border)}.wm-toast--progress{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid color-mix(in srgb,var(--wm-color-accent) 40%,transparent)}.wm-toast-icon{flex-shrink:0;margin-top:1px}.wm-toast-message{flex:1;line-height:1.4}.wm-toast-dismiss{flex-shrink:0;background:none;border:none;color:inherit;opacity:.6;cursor:pointer;padding:0;margin-left:.25rem;transition:opacity .15s ease}.wm-toast-dismiss:hover{opacity:1}.wm-toast-spinner{width:14px;height:14px;border:2px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-top-color:var(--wm-color-accent-readable);border-radius:50%;flex-shrink:0;margin-top:1px;animation:wm-toast-spin .7s linear infinite}.wm-toast-elapsed{opacity:.6;font-size:.75rem;font-variant-numeric:tabular-nums}.wm-toast-cancel{flex-shrink:0;background:none;border:1px solid color-mix(in srgb,currentColor 30%,transparent);border-radius:var(--wm-radius-sm, 4px);color:inherit;opacity:.7;cursor:pointer;padding:.125rem .5rem;font-size:.75rem;transition:opacity .15s ease,border-color .15s ease}.wm-toast-cancel:hover{opacity:1;border-color:currentColor}@keyframes wm-toast-spin{to{transform:rotate(360deg)}}@keyframes wm-toast-slide-in{0%{opacity:0;transform:translate(1rem)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.wm-toast{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1410
1410
  }
1411
1411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: WmToastContainer, decorators: [{
1412
1412
  type: Component,
1413
- args: [{ selector: 'wm-toast-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"wm-toast-container\" role=\"log\" aria-live=\"polite\" aria-label=\"Notifications\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div [class]=\"typeClass(toast)\" role=\"status\">\n <!-- Success icon (check-circle) -->\n @if (toast.type === 'success') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n <!-- Error icon (x-circle) -->\n @if (toast.type === 'error') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n <!-- Info icon -->\n @if (toast.type === 'info') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n }\n <!-- Progress spinner -->\n @if (toast.type === 'progress') {\n <span class=\"wm-toast-spinner\" aria-hidden=\"true\"></span>\n }\n\n <span class=\"wm-toast-message\">\n {{ toast.message }}\n @if (toast.type === 'progress' && toast.createdAt) {\n <span class=\"wm-toast-elapsed\"> ({{ elapsed(toast.createdAt) }})</span>\n }\n </span>\n\n <!-- Cancel button for progress toasts with an onCancel callback -->\n @if (toast.type === 'progress' && toast.onCancel) {\n <button class=\"wm-toast-cancel\" (click)=\"cancel(toast)\" aria-label=\"Cancel operation\">Cancel</button>\n }\n\n <!-- Dismiss button \u2014 always shown -->\n <button class=\"wm-toast-dismiss\" (click)=\"dismiss(toast.id)\" aria-label=\"Dismiss notification\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n }\n</div>\n", styles: [".wm-toast-container{position:fixed;bottom:1rem;right:1rem;display:flex;flex-direction:column;gap:.5rem;z-index:9999;pointer-events:none}.wm-toast{display:flex;align-items:flex-start;gap:.625rem;padding:.625rem .875rem;border-radius:var(--wm-radius-sm, 4px);box-shadow:var(--wm-shadow-md, 0 4px 12px rgba(0,0,0,.25));font-size:.8125rem;line-height:1.4;min-width:220px;max-width:360px;pointer-events:auto;animation:wm-toast-slide-in .15s ease-out both}.wm-toast--success{background:color-mix(in srgb,var(--wm-color-success) 20%,var(--wm-bg-raised));color:var(--wm-color-success);border:1px solid color-mix(in srgb,var(--wm-color-success) 40%,transparent)}.wm-toast--error{background:color-mix(in srgb,var(--wm-color-danger) 20%,var(--wm-bg-raised));color:var(--wm-color-danger);border:1px solid color-mix(in srgb,var(--wm-color-danger) 40%,transparent)}.wm-toast--info{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid var(--wm-border)}.wm-toast--progress{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid color-mix(in srgb,var(--wm-color-accent) 40%,transparent)}.wm-toast-icon{flex-shrink:0;margin-top:1px}.wm-toast-message{flex:1;line-height:1.4}.wm-toast-dismiss{flex-shrink:0;background:none;border:none;color:inherit;opacity:.6;cursor:pointer;padding:0;margin-left:.25rem;transition:opacity .15s ease}.wm-toast-dismiss:hover{opacity:1}.wm-toast-spinner{width:14px;height:14px;border:2px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-top-color:var(--wm-color-accent);border-radius:50%;flex-shrink:0;margin-top:1px;animation:wm-toast-spin .7s linear infinite}.wm-toast-elapsed{opacity:.6;font-size:.75rem;font-variant-numeric:tabular-nums}.wm-toast-cancel{flex-shrink:0;background:none;border:1px solid color-mix(in srgb,currentColor 30%,transparent);border-radius:var(--wm-radius-sm, 4px);color:inherit;opacity:.7;cursor:pointer;padding:.125rem .5rem;font-size:.75rem;transition:opacity .15s ease,border-color .15s ease}.wm-toast-cancel:hover{opacity:1;border-color:currentColor}@keyframes wm-toast-spin{to{transform:rotate(360deg)}}@keyframes wm-toast-slide-in{0%{opacity:0;transform:translate(1rem)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.wm-toast{animation:none}}\n"] }]
1413
+ args: [{ selector: 'wm-toast-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"wm-toast-container\" role=\"log\" aria-live=\"polite\" aria-label=\"Notifications\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div [class]=\"typeClass(toast)\" role=\"status\">\n <!-- Success icon (check-circle) -->\n @if (toast.type === 'success') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n <!-- Error icon (x-circle) -->\n @if (toast.type === 'error') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n <!-- Info icon -->\n @if (toast.type === 'info') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n }\n <!-- Progress spinner -->\n @if (toast.type === 'progress') {\n <span class=\"wm-toast-spinner\" aria-hidden=\"true\"></span>\n }\n\n <span class=\"wm-toast-message\">\n {{ toast.message }}\n @if (toast.type === 'progress' && toast.createdAt) {\n <span class=\"wm-toast-elapsed\"> ({{ elapsed(toast.createdAt) }})</span>\n }\n </span>\n\n <!-- Cancel button for progress toasts with an onCancel callback -->\n @if (toast.type === 'progress' && toast.onCancel) {\n <button class=\"wm-toast-cancel\" (click)=\"cancel(toast)\" aria-label=\"Cancel operation\">Cancel</button>\n }\n\n <!-- Dismiss button \u2014 always shown -->\n <button class=\"wm-toast-dismiss\" (click)=\"dismiss(toast.id)\" aria-label=\"Dismiss notification\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n }\n</div>\n", styles: [".wm-toast-container{position:fixed;bottom:1rem;right:1rem;display:flex;flex-direction:column;gap:.5rem;z-index:9999;pointer-events:none}.wm-toast{display:flex;align-items:flex-start;gap:.625rem;padding:.625rem .875rem;border-radius:var(--wm-radius-sm, 4px);box-shadow:var(--wm-shadow-md, 0 4px 12px rgba(0,0,0,.25));font-size:.8125rem;line-height:1.4;min-width:220px;max-width:360px;pointer-events:auto;animation:wm-toast-slide-in .15s ease-out both}.wm-toast--success{background:color-mix(in srgb,var(--wm-color-success) 20%,var(--wm-bg-raised));color:var(--wm-color-success);border:1px solid color-mix(in srgb,var(--wm-color-success) 40%,transparent)}.wm-toast--error{background:color-mix(in srgb,var(--wm-color-danger) 20%,var(--wm-bg-raised));color:var(--wm-color-danger);border:1px solid color-mix(in srgb,var(--wm-color-danger) 40%,transparent)}.wm-toast--info{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid var(--wm-border)}.wm-toast--progress{background:var(--wm-bg-raised);color:var(--wm-text-primary);border:1px solid color-mix(in srgb,var(--wm-color-accent) 40%,transparent)}.wm-toast-icon{flex-shrink:0;margin-top:1px}.wm-toast-message{flex:1;line-height:1.4}.wm-toast-dismiss{flex-shrink:0;background:none;border:none;color:inherit;opacity:.6;cursor:pointer;padding:0;margin-left:.25rem;transition:opacity .15s ease}.wm-toast-dismiss:hover{opacity:1}.wm-toast-spinner{width:14px;height:14px;border:2px solid color-mix(in srgb,var(--wm-color-accent) 30%,transparent);border-top-color:var(--wm-color-accent-readable);border-radius:50%;flex-shrink:0;margin-top:1px;animation:wm-toast-spin .7s linear infinite}.wm-toast-elapsed{opacity:.6;font-size:.75rem;font-variant-numeric:tabular-nums}.wm-toast-cancel{flex-shrink:0;background:none;border:1px solid color-mix(in srgb,currentColor 30%,transparent);border-radius:var(--wm-radius-sm, 4px);color:inherit;opacity:.7;cursor:pointer;padding:.125rem .5rem;font-size:.75rem;transition:opacity .15s ease,border-color .15s ease}.wm-toast-cancel:hover{opacity:1;border-color:currentColor}@keyframes wm-toast-spin{to{transform:rotate(360deg)}}@keyframes wm-toast-slide-in{0%{opacity:0;transform:translate(1rem)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.wm-toast{animation:none}}\n"] }]
1414
1414
  }] });
1415
1415
 
1416
1416
  class WmLicenseService {
@@ -1 +1 @@
1
- {"version":3,"file":"wildmason-aegis.mjs","sources":["../../src/modal/modal.ts","../../src/modal/modal.html","../../src/dialog/dialog.ts","../../src/dialog/dialog.html","../../src/select/select.ts","../../src/select/select.html","../../src/popover/popover.ts","../../src/popover/popover.html","../../src/popover/auto-focus.directive.ts","../../src/tabs/tab.ts","../../src/tabs/tabs.ts","../../src/tabs/tabs.html","../../src/button/button.ts","../../src/button/button.html","../../src/checkbox/checkbox.ts","../../src/checkbox/checkbox.html","../../src/number-input/number-input.ts","../../src/number-input/number-input.html","../../src/toggle/toggle.ts","../../src/toggle/toggle.html","../../src/ghost-field/ghost-field.ts","../../src/page-header/page-header.ts","../../src/page-header/page-header.html","../../src/combobox/combobox-panel.ts","../../src/combobox/combobox-panel.html","../../src/combobox/combobox.ts","../../src/combobox/combobox.html","../../src/toast/toast.service.ts","../../src/toast/toast-container.ts","../../src/toast/toast-container.html","../../src/license/license.service.ts","../../src/license/license-nudge.ts","../../src/license/license-nudge.html","../../src/license/license-dialog.ts","../../src/license/license-dialog.html","../../src/index.ts","../../src/wildmason-aegis.ts"],"sourcesContent":["import { Component, HostListener, input, output, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n/**\r\n * WmModal — Lightweight modal backdrop with Escape key and click-outside dismissal.\r\n *\r\n * Owns the fixed backdrop, centering, and keyboard/pointer dismissal so individual\r\n * modal components don't need to repeat this logic or add their own HostListeners.\r\n *\r\n * Usage:\r\n * <wm-modal [visible]=\"visible()\" (dismiss)=\"close()\">\r\n * <div class=\"p-6 wm-r-md w-80\" style=\"background: var(--wm-bg-raised)\">\r\n * <!-- modal panel content -->\r\n * </div>\r\n * </wm-modal>\r\n *\r\n * For top-aligned panels (e.g. search/command palettes), use align=\"top\":\r\n * <wm-modal [visible]=\"visible()\" (dismiss)=\"close()\" align=\"top\">\r\n *\r\n * The projected content is wrapped in a stop-propagation container so clicks inside\r\n * the panel do not bubble up to the backdrop and trigger a dismiss.\r\n */\r\n@Component({\r\n selector: 'wm-modal',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './modal.html',\r\n})\r\nexport class WmModal {\r\n /** Whether the modal is currently open. */\r\n visible = input.required<boolean>();\r\n\r\n /** Emitted when the user requests the modal to close (Escape or backdrop click). */\r\n dismiss = output<void>();\r\n\r\n /**\r\n * Vertical alignment of the panel within the backdrop.\r\n * - 'center' (default): panel is vertically centered (items-center)\r\n * - 'top': panel appears near the top (items-start pt-20), for search/command overlays\r\n */\r\n align = input<'center' | 'top'>('center');\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.visible()) this.dismiss.emit();\r\n }\r\n}\r\n","@if (visible()) {\r\n <div [class]=\"align() === 'top'\r\n ? 'fixed inset-0 flex items-start justify-center pt-20 z-50'\r\n : 'fixed inset-0 flex items-center justify-center z-50'\"\r\n style=\"background: var(--wm-modal-backdrop)\"\r\n (click)=\"dismiss.emit()\">\r\n <div (click)=\"$event.stopPropagation()\">\r\n <ng-content />\r\n </div>\r\n </div>\r\n}\r\n","import { Component, HostListener, input, model } from '@angular/core';\r\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\r\n\r\nexport type DialogSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * WmDialog — Modal dialog with backdrop, focus trap, and Escape key handling.\r\n *\r\n * Renders a fixed-position overlay that is always viewport-relative (not clipped\r\n * by ancestor overflow:hidden). Do NOT place inside a container that uses\r\n * CSS transform, perspective, or filter — fixed positioning breaks in that context.\r\n *\r\n * Usage:\r\n * <wm-dialog [(isOpen)]=\"open\" title=\"Confirm action\">\r\n * <div body>\r\n * <p>Are you sure?</p>\r\n * <div class=\"wm-dialog-footer\">\r\n * <wm-button variant=\"secondary\" (click)=\"open.set(false)\">Cancel</wm-button>\r\n * <wm-button variant=\"primary\" (click)=\"onConfirm()\">Confirm</wm-button>\r\n * </div>\r\n * </div>\r\n * </wm-dialog>\r\n *\r\n * Accessibility:\r\n * - role=\"dialog\" + aria-modal=\"true\" on the panel\r\n * - aria-labelledby wired to the title element (when title is set)\r\n * - Focus is trapped inside the panel when open (cdkTrapFocus)\r\n * - Escape key closes the dialog\r\n * - Clicking the backdrop closes the dialog\r\n * - On close, focus returns to the element that opened the dialog\r\n * (browser default when focus trap is released)\r\n */\r\n@Component({\r\n selector: 'wm-dialog',\r\n templateUrl: './dialog.html',\r\n styleUrl: './dialog.css',\r\n imports: [CdkTrapFocus],\r\n})\r\nexport class WmDialog {\r\n /** Two-way binding for open/closed state. */\r\n isOpen = model(false);\r\n\r\n /** Dialog heading text. When set, aria-labelledby is applied automatically. */\r\n title = input('');\r\n\r\n /** Panel width preset. sm = 360px, md = 480px (default), lg = 640px. */\r\n size = input<DialogSize>('md');\r\n\r\n close(): void { this.isOpen.set(false); }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.isOpen()) this.close();\r\n }\r\n}\r\n","@if (isOpen()) {\r\n <!-- Backdrop — click to close -->\r\n <div class=\"wm-dialog-backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n\r\n <!-- Panel -->\r\n <div\r\n class=\"wm-dialog\"\r\n [class]=\"'wm-dialog--' + size()\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"title() ? 'wm-dialog-title' : null\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n <div class=\"wm-dialog-header\">\r\n <h2 class=\"wm-dialog-title\" id=\"wm-dialog-title\">{{ title() }}</h2>\r\n <button\r\n class=\"wm-dialog-close\"\r\n type=\"button\"\r\n (click)=\"close()\"\r\n aria-label=\"Close dialog\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"wm-dialog-body\">\r\n <ng-content select=\"[body]\" />\r\n </div>\r\n </div>\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\nimport { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\r\nimport { SelectOption } from './option';\r\n\r\n/**\r\n * WmSelect — Accessible dropdown select built on Angular CDK Overlay.\r\n *\r\n * Provides a styled, keyboard-accessible alternative to the native <select> element\r\n * when you need custom option rendering or consistent cross-platform appearance.\r\n *\r\n * When to use:\r\n * - Single selection from a list of 4+ options\r\n * - When option labels are complex (icons, descriptions, status badges)\r\n * - When native <select> appearance is insufficient\r\n *\r\n * When NOT to use:\r\n * - 3 or fewer options → use a radio group (more scannable, no extra click)\r\n * - Multi-select → use a checkbox group or a combobox with chips\r\n * - Yes/No choices → use a Toggle or two radio buttons\r\n *\r\n * Options API:\r\n * options: SelectOption[] — Array of { value, label, disabled? } objects.\r\n *\r\n * Two-way binding:\r\n * <wm-select [(value)]=\"selectedValue\" [options]=\"myOptions\" />\r\n *\r\n * Accessibility:\r\n * - Trigger has role=\"combobox\", aria-expanded, aria-haspopup=\"listbox\"\r\n * - Panel has role=\"listbox\"; each option has role=\"option\" + aria-selected\r\n * - Disabled options have aria-disabled=\"true\"\r\n * - Focus is trapped inside the open panel (cdkTrapFocus)\r\n * - Clicking the backdrop closes the panel and returns focus to the trigger\r\n * - Keyboard: Enter/Space on trigger opens; Escape closes; arrow keys\r\n * navigate options (relies on natural tab order within the panel)\r\n * - Always pair with a visible label via <wm-label> or aria-label on the host\r\n */\r\n@Component({\r\n selector: 'wm-select',\r\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkTrapFocus],\r\n templateUrl: './select.html',\r\n styleUrl: './select.css',\r\n})\r\nexport class WmSelect {\r\n /** Array of options to display. */\r\n options = input<SelectOption[]>([]);\r\n\r\n /** The currently selected value. Two-way bindable. */\r\n value = model<unknown>(null);\r\n\r\n /** Placeholder text shown when no option is selected. */\r\n placeholder = input('Select…');\r\n\r\n /** Disables the trigger and prevents the panel from opening. */\r\n disabled = input(false);\r\n\r\n protected isOpen = signal(false);\r\n\r\n protected selectedOption = computed(() =>\r\n this.options().find((o: SelectOption) => o.value === this.value()) ?? null\r\n );\r\n\r\n private hostEl = inject(ElementRef<HTMLElement>);\r\n\r\n protected get overlayWidth(): number {\r\n return this.hostEl.nativeElement.offsetWidth || 200;\r\n }\r\n\r\n protected positions: ConnectedPosition[] = [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n\r\n protected toggleOpen(): void {\r\n if (!this.disabled()) {\r\n this.isOpen.update((v: boolean) => !v);\r\n }\r\n }\r\n\r\n protected selectOption(opt: SelectOption): void {\r\n if (!opt.disabled) {\r\n this.value.set(opt.value);\r\n this.isOpen.set(false);\r\n }\r\n }\r\n}\r\n","<!-- Trigger button — anchors the CDK overlay -->\r\n<div\r\n class=\"wm-select-host\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n>\r\n <button\r\n type=\"button\"\r\n role=\"combobox\"\r\n class=\"wm-select-trigger\"\r\n [class.is-open]=\"isOpen()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n <span class=\"wm-select-value\" [class.is-placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label ?? placeholder() }}\r\n </span>\r\n <!-- Chevron icon — rotates when open -->\r\n <svg\r\n class=\"wm-select-chevron\"\r\n [class.is-open]=\"isOpen()\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<!-- Dropdown panel — rendered in CDK overlay container -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"wm-select-backdrop\"\r\n (backdropClick)=\"isOpen.set(false)\"\r\n (detach)=\"isOpen.set(false)\"\r\n>\r\n <div\r\n class=\"wm-select-panel\"\r\n role=\"listbox\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n @for (opt of options(); track opt.value) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n class=\"wm-select-option\"\r\n [class.is-selected]=\"opt.value === value()\"\r\n [class.is-disabled]=\"!!opt.disabled\"\r\n [attr.aria-selected]=\"opt.value === value()\"\r\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\r\n [disabled]=\"opt.disabled || null\"\r\n (click)=\"selectOption(opt)\"\r\n >\r\n <span class=\"wm-select-option-label\">{{ opt.label }}</span>\r\n @if (opt.value === value()) {\r\n <!-- Checkmark for selected option -->\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <polyline points=\"20 6 9 17 4 12\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</ng-template>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n Renderer2,\r\n ViewEncapsulation,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\r\n\r\n/**\r\n * WmPopover — general-purpose CDK-overlay floating panel.\r\n *\r\n * A low-level primitive for dropdowns, menus, pickers, and any floating UI.\r\n * The parent controls open/close state; this component handles positioning,\r\n * backdrop, focus-trapping, and ARIA attribute management.\r\n *\r\n * Slots:\r\n * - [trigger] — the anchor element (button, icon, etc.)\r\n * - [content] — the panel body (menu items, form, etc.)\r\n *\r\n * Usage:\r\n * ```html\r\n * <wm-popover [isOpen]=\"open()\" (closed)=\"open.set(false)\" role=\"menu\" hasPopup=\"menu\" align=\"end\">\r\n * <button trigger (click)=\"open.set(!open())\">Options</button>\r\n * <div content role=\"menu\">\r\n * <button role=\"menuitem\" (click)=\"doThing()\">Do thing</button>\r\n * </div>\r\n * </wm-popover>\r\n * ```\r\n *\r\n * Accessibility:\r\n * - Trigger element automatically receives aria-haspopup, aria-expanded, aria-controls\r\n * - Panel receives the configured role\r\n * - Focus is trapped inside the open panel (cdkTrapFocus)\r\n * - Escape key closes the panel\r\n * - Backdrop click closes the panel\r\n *\r\n * Auto-focus:\r\n * - Add [wmAutoFocus] to any element inside [content] to focus it on open.\r\n * Import WmAutoFocus from @wildmason/aegis/components and add it to your component's imports.\r\n */\r\n@Component({\r\n selector: 'wm-popover',\r\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkTrapFocus],\r\n templateUrl: './popover.html',\r\n styleUrl: './popover.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class WmPopover {\r\n /** Whether the panel is currently open. */\r\n readonly isOpen = input<boolean>(false);\r\n\r\n /** Panel width in pixels, or 'auto' to match content. */\r\n readonly width = input<string | number>('auto');\r\n\r\n /** ARIA role for the floating panel element. Use 'menu', 'listbox', 'dialog', etc. */\r\n readonly role = input<string>('dialog');\r\n\r\n /** Value for aria-haspopup on the trigger element. */\r\n readonly hasPopup = input<string | boolean>('dialog');\r\n\r\n /** Horizontal alignment: 'start' aligns left edges, 'end' aligns right edges. */\r\n readonly align = input<'start' | 'end'>('start');\r\n\r\n /** Emitted when the panel should close (backdrop click, Escape key, CDK detach). */\r\n readonly closed = output<void>();\r\n\r\n private readonly renderer = inject(Renderer2);\r\n private readonly hostEl = inject(ElementRef);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n protected readonly panelId = 'wm-popover-' + Math.random().toString(36).substring(2, 9);\r\n protected readonly panel = viewChild<ElementRef<HTMLElement>>('panel');\r\n\r\n constructor() {\r\n effect(() => {\r\n const open = this.isOpen();\r\n const popup = this.hasPopup();\r\n this.cdr.markForCheck();\r\n\r\n const el: Element | null = this.hostEl.nativeElement.querySelector('[trigger]');\r\n if (!el) return;\r\n\r\n this.renderer.setAttribute(el, 'aria-haspopup', String(popup));\r\n this.renderer.setAttribute(el, 'aria-expanded', String(open));\r\n this.renderer.setAttribute(el, 'aria-controls', this.panelId);\r\n\r\n if (!el.getAttribute('role')) {\r\n this.renderer.setAttribute(el, 'role', 'button');\r\n }\r\n });\r\n }\r\n\r\n protected get positions(): ConnectedPosition[] {\r\n const x = this.align();\r\n return [\r\n { originX: x, originY: 'bottom', overlayX: x, overlayY: 'top', offsetY: 4 },\r\n { originX: x, originY: 'top', overlayX: x, overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n }\r\n\r\n protected onAttach(): void {\r\n setTimeout(() => {\r\n const panelEl = this.panel();\r\n if (!panelEl) return;\r\n const el = panelEl.nativeElement.querySelector('[wmAutoFocus]') as HTMLElement | null;\r\n if (!el) return;\r\n el.focus();\r\n if (typeof (el as any).showPicker === 'function') {\r\n const type = (el as HTMLInputElement).type;\r\n if (el.tagName === 'SELECT' || ['date', 'time', 'color'].includes(type)) {\r\n try { (el as any).showPicker(); } catch { /* ignore */ }\r\n }\r\n }\r\n }, 10);\r\n }\r\n\r\n protected onClose(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<!-- Trigger anchor -->\r\n<div cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" class=\"wm-popover-trigger\">\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n</div>\r\n\r\n<!-- Floating panel -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\r\n (backdropClick)=\"onClose()\"\r\n (detach)=\"onClose()\"\r\n (attach)=\"onAttach()\"\r\n>\r\n <div\r\n #panel\r\n [id]=\"panelId\"\r\n [attr.role]=\"role()\"\r\n class=\"wm-popover-panel\"\r\n [style.width]=\"width() === 'auto' ? 'auto' : width() + 'px'\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (keydown.escape)=\"onClose()\"\r\n >\r\n <ng-content select=\"[content]\"></ng-content>\r\n </div>\r\n</ng-template>\r\n","import { AfterViewInit, Directive, ElementRef, Input, inject } from '@angular/core';\r\n\r\n/**\r\n * WmAutoFocus — focuses an element when it enters the DOM.\r\n *\r\n * Usage: add [wmAutoFocus] to any focusable element inside a <wm-popover> panel.\r\n * For date/time/color/select inputs, also attempts to open the native picker UI.\r\n *\r\n * @example\r\n * <input wmAutoFocus type=\"text\" />\r\n * <input [wmAutoFocus]=\"shouldFocus\" type=\"date\" />\r\n */\r\n@Directive({\r\n selector: '[wmAutoFocus]',\r\n})\r\nexport class WmAutoFocus implements AfterViewInit {\r\n @Input('wmAutoFocus') enabled: boolean | '' = true;\r\n\r\n readonly #el = inject(ElementRef<HTMLElement>);\r\n\r\n ngAfterViewInit(): void {\r\n if (this.enabled === false) return;\r\n\r\n setTimeout(() => {\r\n const el = this.#el.nativeElement;\r\n if (!el) return;\r\n\r\n el.focus();\r\n\r\n const isPickerType =\r\n el.tagName === 'SELECT' ||\r\n (el.tagName === 'INPUT' &&\r\n ['date', 'time', 'color', 'datetime-local', 'month', 'week'].includes(\r\n (el as HTMLInputElement).type\r\n ));\r\n\r\n if (isPickerType && typeof (el as any).showPicker === 'function') {\r\n try {\r\n (el as any).showPicker();\r\n } catch {\r\n // Browser may reject showPicker() if not triggered by user gesture\r\n }\r\n }\r\n }, 50);\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, input, viewChild, TemplateRef } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'wm-tab',\r\n template: `<ng-template #tmpl><ng-content /></ng-template>`,\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class WmTab {\r\n readonly value = input.required<string>();\r\n readonly tmpl = viewChild.required<TemplateRef<void>>('tmpl');\r\n}\r\n","import { Component, ChangeDetectionStrategy, input, output, signal, contentChildren } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { WmTab } from './tab';\r\n\r\n@Component({\r\n selector: 'wm-tabs',\r\n templateUrl: './tabs.html',\r\n styleUrl: './tabs.css',\r\n imports: [NgTemplateOutlet],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class WmTabs {\r\n activeValue = input.required<string>();\r\n variant = input<'line' | 'pill'>('line');\r\n\r\n readonly select = output<string>();\r\n\r\n protected readonly tabs = contentChildren(WmTab);\r\n protected focusedIndex = signal<number | null>(null);\r\n\r\n protected selectTab(value: string, index: number): void {\r\n this.focusedIndex.set(index);\r\n this.select.emit(value);\r\n }\r\n\r\n protected onBlur(): void {\r\n setTimeout(() => {\r\n if (!document.activeElement?.closest('.wm-tabs')) {\r\n this.focusedIndex.set(null);\r\n }\r\n }, 0);\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent, container: HTMLElement): void {\r\n const tabs = this.tabs();\r\n const currentIndex = this.focusedIndex() ?? tabs.findIndex(t => t.value() === this.activeValue());\r\n let nextIndex: number | null = null;\r\n\r\n switch (event.key) {\r\n case 'ArrowRight':\r\n case 'ArrowDown':\r\n nextIndex = (currentIndex + 1) % tabs.length;\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowUp':\r\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length;\r\n break;\r\n case 'Home': nextIndex = 0; break;\r\n case 'End': nextIndex = tabs.length - 1; break;\r\n }\r\n\r\n if (nextIndex !== null) {\r\n event.preventDefault();\r\n this.focusedIndex.set(nextIndex);\r\n const btns = container.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]');\r\n btns[nextIndex]?.focus();\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"wm-tabs\"\r\n [class.wm-tabs--line]=\"variant() === 'line'\"\r\n [class.wm-tabs--pill]=\"variant() === 'pill'\"\r\n role=\"tablist\"\r\n #container\r\n (keydown)=\"onKeyDown($event, container)\"\r\n>\r\n @for (tab of tabs(); track tab.value(); let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"wm-tab\"\r\n [id]=\"'wm-tab-' + tab.value()\"\r\n [attr.aria-selected]=\"activeValue() === tab.value()\"\r\n [attr.aria-controls]=\"'wm-panel-' + tab.value()\"\r\n [tabIndex]=\"(focusedIndex() === null ? activeValue() === tab.value() : focusedIndex() === i) ? 0 : -1\"\r\n [class.is-active]=\"activeValue() === tab.value()\"\r\n (click)=\"selectTab(tab.value(), i)\"\r\n (focus)=\"focusedIndex.set(i)\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"tab.tmpl()\" />\r\n </button>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\n\r\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive' | 'flat';\r\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'wm-button',\r\n templateUrl: './button.html',\r\n styleUrl: './button.css',\r\n})\r\nexport class WmButton {\r\n readonly variant = input<ButtonVariant>('primary');\r\n readonly size = input<ButtonSize>('md');\r\n readonly disabled = input(false);\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n\r\n /** Makes the button square (equal width/height). Use for icon-only buttons. */\r\n readonly iconOnly = input(false);\r\n\r\n /** Accessible label forwarded to the inner <button>. Required for icon-only buttons. */\r\n readonly ariaLabel = input('');\r\n\r\n /** Tooltip text forwarded to the inner <button>. Named btnTitle to avoid native attribute conflict. */\r\n readonly btnTitle = input('');\r\n\r\n protected readonly btnClass = computed(() => {\r\n const base = `wm-btn wm-btn--${this.variant()} wm-btn--${this.size()}`;\r\n return this.iconOnly() ? `${base} btn-icon-only` : base;\r\n });\r\n}\r\n","<button\r\n [class]=\"btnClass()\"\r\n [disabled]=\"disabled()\"\r\n [type]=\"type()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.title]=\"btnTitle() || null\"\r\n>\r\n <ng-content />\r\n</button>\r\n","import { Component, computed, input, model } from '@angular/core';\r\n\r\n/**\r\n * WmCheckbox — Boolean selection control with optional indeterminate state.\r\n *\r\n * When to use:\r\n * - Multi-select lists (each item is independent)\r\n * - Form options that require explicit confirmation before taking effect\r\n * - Parent/child hierarchical selection (use indeterminate for \"some selected\")\r\n *\r\n * When NOT to use:\r\n * - Mutually exclusive choices → use radio buttons instead\r\n * - Immediate-effect toggles (e.g. dark mode) → use Toggle instead\r\n *\r\n * Accessibility:\r\n * - role=\"checkbox\" with aria-checked=\"true|false|mixed\"\r\n * - \"mixed\" maps to the indeterminate state for screen readers\r\n * - Space activates the checkbox (native button behaviour)\r\n * - Focus ring uses a double-ring (canvas gap + accent) pattern for maximum visibility\r\n * across all themes, meeting WCAG 2.1 SC 1.4.11 Non-text Contrast\r\n * - When wrapping in a group, add role=\"group\" + aria-labelledby to the container\r\n */\r\n@Component({\r\n selector: 'wm-checkbox',\r\n templateUrl: './checkbox.html',\r\n styleUrl: './checkbox.css',\r\n})\r\nexport class Checkbox {\r\n /** Two-way bindable checked state. */\r\n checked = model(false);\r\n\r\n /**\r\n * Shows a dash icon instead of a checkmark. Typically used for a \"select all\"\r\n * checkbox when only some child items are selected.\r\n * Note: indeterminate is display-only — clicking always toggles to true/false.\r\n */\r\n indeterminate = input(false);\r\n\r\n /** Visible text label rendered next to the checkbox box. */\r\n label = input('');\r\n\r\n disabled = input(false);\r\n\r\n /** Maps to aria-checked: true, false, or \"mixed\" (for indeterminate). */\r\n protected ariaChecked = computed<boolean | 'mixed'>(() => {\r\n if (this.indeterminate() && !this.checked()) return 'mixed';\r\n return this.checked();\r\n });\r\n\r\n toggle(): void {\r\n if (!this.disabled()) {\r\n this.checked.update(v => !v);\r\n }\r\n }\r\n}\r\n","<label class=\"wm-checkbox-wrap\" [class.is-disabled]=\"disabled()\">\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n class=\"wm-checkbox-box\"\r\n [class.is-checked]=\"checked()\"\r\n [class.is-indeterminate]=\"indeterminate() && !checked()\"\r\n [attr.aria-checked]=\"ariaChecked()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n >\r\n @if (indeterminate() && !checked()) {\r\n <!-- Dash for indeterminate (\"some selected\") state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"6\" x2=\"10\" y2=\"6\"\r\n stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else if (checked()) {\r\n <!-- Animated checkmark for selected state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <polyline class=\"check-mark\" points=\"2,6.5 4.5,9 10,3\"\r\n fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (label()) {\r\n <span class=\"wm-checkbox-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n","import {\r\n Component,\r\n ElementRef,\r\n forwardRef,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n/**\r\n * WmNumberInput — Numeric input with stepper buttons.\r\n *\r\n * Implements ControlValueAccessor so it works with both template-driven forms\r\n * (ngModel) and reactive forms (formControl / formControlName).\r\n *\r\n * When to use:\r\n * - Quantity fields (items in cart, repetitions, page count)\r\n * - Bounded numeric settings with a known min/max (timeout seconds, font size)\r\n *\r\n * When NOT to use:\r\n * - Free-form numeric entry without bounds → plain <input type=\"number\">\r\n * - Currency or phone numbers → use a text input with masking\r\n *\r\n * Accessibility:\r\n * - The underlying <input type=\"number\"> is the focusable control.\r\n * - Stepper buttons have tabindex=\"-1\" — they are mouse/touch targets only.\r\n * Keyboard users use the arrow keys on the input itself (native browser behaviour).\r\n * - Always provide an aria-label or visible label via <wm-field> + <wm-label>.\r\n * - The buttons use mousedown + preventDefault to avoid stealing focus from the input.\r\n *\r\n * Form integration:\r\n * <!-- Template-driven -->\r\n * <wm-number-input [(ngModel)]=\"count\" [min]=\"0\" [max]=\"100\" />\r\n *\r\n * <!-- Reactive -->\r\n * <wm-number-input formControlName=\"quantity\" [step]=\"5\" />\r\n */\r\n@Component({\r\n selector: 'wm-number-input',\r\n templateUrl: './number-input.html',\r\n styleUrl: './number-input.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NumberInput),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class NumberInput implements ControlValueAccessor {\r\n /** Minimum allowed value. */\r\n min = input<number | null>(null);\r\n\r\n /** Maximum allowed value. */\r\n max = input<number | null>(null);\r\n\r\n /** Amount to increment/decrement per step. Defaults to 1. */\r\n step = input(1);\r\n\r\n /** Placeholder text shown when the field is empty. */\r\n placeholder = input('0');\r\n\r\n /** Disables the control from the template. Also set automatically by reactive forms. */\r\n disabled = input(false);\r\n\r\n protected inputRef = viewChild<ElementRef<HTMLInputElement>>('inputEl');\r\n protected internalValue = signal<number | null>(null);\r\n\r\n private onChangeFn: (v: number | null) => void = () => {};\r\n protected onTouchedFn: () => void = () => {};\r\n\r\n /** CVA interface — called when the form model changes programmatically. */\r\n writeValue(value: number | null): void {\r\n this.internalValue.set(value ?? null);\r\n }\r\n\r\n registerOnChange(fn: (v: number | null) => void): void {\r\n this.onChangeFn = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouchedFn = fn;\r\n }\r\n\r\n protected onInputChange(event: Event): void {\r\n const raw = (event.target as HTMLInputElement).value;\r\n const num = raw === '' ? null : parseFloat(raw);\r\n this.internalValue.set(num);\r\n this.onChangeFn(num);\r\n this.onTouchedFn();\r\n }\r\n\r\n protected increment(): void {\r\n const curr = this.internalValue() ?? 0;\r\n const next = curr + this.step();\r\n const max = this.max();\r\n this.setValue(max !== null ? Math.min(next, max) : next);\r\n }\r\n\r\n protected decrement(): void {\r\n const curr = this.internalValue() ?? 0;\r\n const next = curr - this.step();\r\n const min = this.min();\r\n this.setValue(min !== null ? Math.max(next, min) : next);\r\n }\r\n\r\n /**\r\n * Prevents the stepper buttons from stealing focus away from the input element.\r\n * Without this, clicking a button would blur the input, hiding any validation state.\r\n */\r\n protected preventFocusSteal(event: MouseEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n private setValue(val: number): void {\r\n this.internalValue.set(val);\r\n this.onChangeFn(val);\r\n this.onTouchedFn();\r\n const el = this.inputRef();\r\n if (el) el.nativeElement.value = String(val);\r\n }\r\n}\r\n","<!--\r\n Uses .wm-input-group and .wm-number-* classes from inputs.css.\r\n The input fills the group; the controls column sits at the trailing edge.\r\n-->\r\n<div\r\n class=\"wm-input-group wm-number-field\"\r\n [class.is-disabled]=\"disabled()\"\r\n>\r\n <input\r\n #inputEl\r\n type=\"number\"\r\n class=\"wm-input-bare wm-number-input\"\r\n [value]=\"internalValue() ?? ''\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.min]=\"min() ?? null\"\r\n [attr.max]=\"max() ?? null\"\r\n [step]=\"step()\"\r\n [disabled]=\"disabled() || null\"\r\n (change)=\"onInputChange($event)\"\r\n (input)=\"onInputChange($event)\"\r\n (blur)=\"onTouchedFn()\"\r\n />\r\n\r\n <div class=\"wm-number-controls\" aria-hidden=\"true\">\r\n <button\r\n type=\"button\"\r\n class=\"wm-number-btn\"\r\n tabindex=\"-1\"\r\n [disabled]=\"disabled() || null\"\r\n (mousedown)=\"preventFocusSteal($event)\"\r\n (click)=\"increment()\"\r\n aria-label=\"Increment\"\r\n >\r\n <!-- chevron-up (lucide) -->\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"m18 15-6-6-6 6\"/>\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"wm-number-btn\"\r\n tabindex=\"-1\"\r\n [disabled]=\"disabled() || null\"\r\n (mousedown)=\"preventFocusSteal($event)\"\r\n (click)=\"decrement()\"\r\n aria-label=\"Decrement\"\r\n >\r\n <!-- chevron-down (lucide) -->\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"m6 9 6 6 6-6\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n","import { Component, input, model } from '@angular/core';\r\n\r\n/**\r\n * WmToggle — Binary on/off control.\r\n *\r\n * Use for settings that take effect immediately without a form submit.\r\n * For settings that need an explicit \"Save\" action, prefer a checkbox.\r\n *\r\n * Accessibility:\r\n * - role=\"switch\" communicates binary state to screen readers\r\n * - aria-checked reflects true/false\r\n * - aria-label required when no visible text label surrounds the toggle\r\n * - Space and Enter activate the toggle (native button behaviour)\r\n * - When disabled, aria state is preserved so SR users understand why it can't be changed\r\n */\r\n@Component({\r\n selector: 'wm-toggle',\r\n templateUrl: './toggle.html',\r\n styleUrl: './toggle.css',\r\n})\r\nexport class Toggle {\r\n /** Two-way bindable state. Use [(checked)]=\"mySignal\" or [checked]=\"val\" (changeChecked)=\"val=$event\". */\r\n checked = model(false);\r\n\r\n /** Visually and functionally disables the toggle. State is still readable by assistive tech. */\r\n disabled = input(false);\r\n\r\n /** Accessible label. Required if no visible label text surrounds the toggle in the DOM. */\r\n ariaLabel = input('Toggle');\r\n\r\n toggle(): void {\r\n if (!this.disabled()) {\r\n this.checked.update(v => !v);\r\n }\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n role=\"switch\"\r\n class=\"wm-toggle\"\r\n [class.is-on]=\"checked()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-checked]=\"checked()\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n>\r\n <span class=\"wm-toggle-track\" aria-hidden=\"true\">\r\n <span class=\"wm-toggle-thumb\"></span>\r\n </span>\r\n</button>\r\n","import { Component, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * GhostField — transparent-until-hover wrapper for inline-editable fields.\r\n *\r\n * Applies .wm-ghost-field to its content; all visual behaviour is CSS-driven\r\n * (inputs.css). No inputs or outputs — interactivity belongs to the inner\r\n * element projected via ng-content.\r\n *\r\n * Usage:\r\n * <wm-ghost-field>\r\n * <input class=\"wm-input-bare\" [(ngModel)]=\"title\" aria-label=\"Task title\" />\r\n * </wm-ghost-field>\r\n */\r\n@Component({\r\n selector: 'wm-ghost-field',\r\n standalone: true,\r\n template: `<div class=\"wm-ghost-field\"><ng-content /></div>`,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class GhostField {}\r\n","import { Component, ChangeDetectionStrategy, ViewEncapsulation, input } from '@angular/core';\r\n\r\n/**\r\n * PageHeader — standardised page-level heading with eyebrow label, title,\r\n * optional subtitle, optional status badge, and projected action/back slots.\r\n *\r\n * Slots:\r\n * [icon] — 12×12 icon projected into the eyebrow row (optional)\r\n * [back] — back-navigation element (link or button) placed in the status row (optional)\r\n * default — action buttons / controls placed below the status row\r\n *\r\n * Usage:\r\n * <wm-page-header flavourText=\"Sprints\" title=\"Active Sprint\" [badgeLabel]=\"daysLeft\">\r\n * <svg icon .../>\r\n * <a back href=\"...\">← Board</a>\r\n * <wm-button>New Sprint</wm-button>\r\n * </wm-page-header>\r\n */\r\n@Component({\r\n selector: 'wm-page-header',\r\n standalone: true,\r\n templateUrl: './page-header.html',\r\n styleUrl: './page-header.css',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PageHeader {\r\n readonly flavourText = input.required<string>();\r\n readonly title = input.required<string>();\r\n readonly subtitle = input<string>();\r\n readonly badgeLabel = input<string>();\r\n}\r\n","<header class=\"wm-page-header\">\r\n <div class=\"wm-page-header__left\">\r\n <div class=\"wm-page-header__eyebrow\">\r\n <ng-content select=\"[icon]\" />\r\n <span>{{ flavourText() }}</span>\r\n </div>\r\n <h2 class=\"wm-page-header__title\">{{ title() }}</h2>\r\n @if (subtitle()) {\r\n <p class=\"wm-page-header__subtitle\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n\r\n <div class=\"wm-page-header__right\">\r\n <div class=\"wm-page-header__status\">\r\n @if (badgeLabel()) {\r\n <span class=\"wm-page-header__badge\">{{ badgeLabel() }}</span>\r\n }\r\n <ng-content select=\"[back]\" />\r\n </div>\r\n <div class=\"wm-page-header__actions\">\r\n <ng-content />\r\n </div>\r\n </div>\r\n</header>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewChild,\n computed,\n effect,\n input,\n output,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ComboboxOption } from './option';\n\n/** Module-level counter for unique panel instance IDs. */\nlet nextPanelId = 0;\n\n/**\n * Segment of an option label, split by filter-query matches.\n * `match: true` means this segment matched the query and should be bolded.\n */\ninterface LabelSegment {\n text: string;\n match: boolean;\n}\n\n/**\n * Internal sub-component that renders the virtual-scrolled option list\n * inside the WmCombobox's CDK overlay. NOT exported from Aegis.\n */\n@Component({\n selector: 'wm-combobox-panel',\n imports: [ScrollingModule],\n templateUrl: './combobox-panel.html',\n styleUrl: './combobox-panel.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComboboxPanel {\n /** Filtered options to display. */\n readonly options = input<ComboboxOption[]>([]);\n\n /** Index of the keyboard-highlighted option (-1 = none). */\n readonly highlightIndex = input(-1);\n\n /** Values currently selected (for checkmark display). */\n readonly selectedValues = input<Set<unknown>>(new Set());\n\n /** Whether the parent is multi-select. */\n readonly multiple = input(false);\n\n /** Pixel height per row. */\n readonly itemHeight = input(36);\n\n /** Max panel height in pixels. */\n readonly maxHeight = input(256);\n\n /** Current filter text — used for match highlighting in labels. */\n readonly filterQuery = input('');\n\n /** Show spinner when async filter is pending. */\n readonly loading = input(false);\n\n /** Shown in empty state when freeform input is enabled. */\n readonly freeformHint = input('');\n\n /** Emitted on mousedown (not click) to prevent focus steal. */\n readonly optionClicked = output<{ option: ComboboxOption; index: number }>();\n\n @ViewChild(CdkVirtualScrollViewport)\n private viewport?: CdkVirtualScrollViewport;\n\n /** Unique instance ID for generating DOM IDs. */\n private readonly instanceId = nextPanelId++;\n\n /** The DOM ID of the listbox element — used by parent for aria-controls. */\n readonly listboxId = `wm-combobox-${this.instanceId}-listbox`;\n\n /** Computed viewport height: min of (options * itemHeight) and maxHeight. */\n protected readonly viewportHeight = computed(() => {\n const count = this.options().length;\n return Math.min(count * this.itemHeight(), this.maxHeight());\n });\n\n /** Whether to show the empty state. */\n protected readonly showEmpty = computed(\n () => this.options().length === 0 && !this.loading()\n );\n\n /** Text for the empty state. */\n protected readonly emptyText = computed(\n () => this.freeformHint() || 'No matches'\n );\n\n /**\n * Precomputed label segments for each option, split by the current filter query.\n * Recomputes whenever options or filterQuery changes.\n */\n protected readonly segmentedLabels = computed(() => {\n const query = this.filterQuery().trim();\n return this.options().map(opt => this.splitLabel(opt.label, query));\n });\n\n /** Map from option value to a stable key for DOM IDs. */\n private optionKeyMap = new Map<unknown, string>();\n private nextObjectIndex = 0;\n\n constructor() {\n // Scroll the highlighted option into view whenever highlightIndex changes.\n effect(() => {\n const idx = this.highlightIndex();\n if (idx >= 0 && this.viewport) {\n this.viewport.scrollToIndex(idx);\n }\n });\n }\n\n /** Returns a stable DOM ID for the option at the given index. */\n optionIdAt(index: number): string {\n const opts = this.options();\n if (index < 0 || index >= opts.length) {\n return '';\n }\n return `wm-combobox-${this.instanceId}-opt-${this.keyFor(opts[index].value)}`;\n }\n\n /** Handle mousedown on an option — emits event and prevents default. */\n protected onOptionMousedown(event: MouseEvent, option: ComboboxOption, index: number): void {\n event.preventDefault();\n if (!option.disabled) {\n this.optionClicked.emit({ option, index });\n }\n }\n\n /** Check whether a value is currently selected. */\n protected isSelected(value: unknown): boolean {\n return this.selectedValues().has(value);\n }\n\n /** Get label segments for the option at the given virtual-scroll index. */\n protected segmentsAt(index: number): LabelSegment[] {\n return this.segmentedLabels()[index] ?? [{ text: '', match: false }];\n }\n\n /**\n * Returns a stable string key for an option value.\n * Strings/numbers use the value directly. Objects use a monotonic index.\n */\n private keyFor(value: unknown): string {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n let key = this.optionKeyMap.get(value);\n if (key == null) {\n key = `obj-${this.nextObjectIndex++}`;\n this.optionKeyMap.set(value, key);\n }\n return key;\n }\n\n /**\n * Split a label into segments where the query matches (case-insensitive).\n * Returns an array of { text, match } segments.\n */\n private splitLabel(label: string, query: string): LabelSegment[] {\n if (!query) {\n return [{ text: label, match: false }];\n }\n const segments: LabelSegment[] = [];\n const lowerLabel = label.toLowerCase();\n const lowerQuery = query.toLowerCase();\n let cursor = 0;\n while (cursor < label.length) {\n const matchIndex = lowerLabel.indexOf(lowerQuery, cursor);\n if (matchIndex === -1) {\n segments.push({ text: label.slice(cursor), match: false });\n break;\n }\n if (matchIndex > cursor) {\n segments.push({ text: label.slice(cursor, matchIndex), match: false });\n }\n segments.push({\n text: label.slice(matchIndex, matchIndex + query.length),\n match: true,\n });\n cursor = matchIndex + query.length;\n }\n return segments;\n }\n}\n","@if (loading()) {\n <div class=\"wm-cb-loading\" aria-live=\"polite\">\n <svg\n class=\"wm-cb-spinner\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <circle\n cx=\"10\" cy=\"10\" r=\"8\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-dasharray=\"40 60\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"wm-cb-loading-text\">Loading…</span>\n </div>\n} @else if (showEmpty()) {\n <div class=\"wm-cb-empty\" aria-live=\"polite\">{{ emptyText() }}</div>\n} @else {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemHeight()\"\n [style.height.px]=\"viewportHeight()\"\n class=\"wm-cb-viewport\"\n >\n <div\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n >\n <div\n *cdkVirtualFor=\"let opt of options(); let i = index\"\n role=\"option\"\n class=\"wm-cb-option\"\n [id]=\"optionIdAt(i)\"\n [class.is-highlighted]=\"i === highlightIndex()\"\n [class.is-selected]=\"isSelected(opt.value)\"\n [class.is-disabled]=\"!!opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\n (mousedown)=\"onOptionMousedown($event, opt, i)\"\n >\n <span class=\"wm-cb-option-label\">\n @for (seg of segmentsAt(i); track $index) {\n @if (seg.match) {\n <b class=\"wm-cb-match\">{{ seg.text }}</b>\n } @else {\n {{ seg.text }}\n }\n }\n </span>\n @if (isSelected(opt.value)) {\n <svg\n class=\"wm-cb-check\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <polyline\n points=\"20 6 9 17 4 12\"\n stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"\n />\n </svg>\n }\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n Subject,\n Subscription,\n debounceTime,\n switchMap,\n catchError,\n of,\n finalize,\n} from 'rxjs';\nimport { ComboboxOption } from './option';\nimport { ComboboxPanel } from './combobox-panel';\n\n/**\n * WmCombobox — Accessible combobox with filtering, single/multi-select,\n * freeform entry, chips, and virtual-scrolled panel.\n *\n * Built on Angular CDK Overlay and the WAI-ARIA APG combobox pattern.\n * DOM focus ALWAYS stays on the input; assistive tech focus moves via\n * `aria-activedescendant`.\n *\n * Implements ControlValueAccessor for both template-driven and reactive forms.\n *\n * Usage:\n * <!-- Single-select -->\n * <wm-combobox [options]=\"opts\" [(value)]=\"selected\" />\n *\n * <!-- Multi-select with chips -->\n * <wm-combobox [options]=\"opts\" [(values)]=\"selectedIds\" [multiple]=\"true\" />\n *\n * <!-- Async filter -->\n * <wm-combobox [options]=\"opts\" [filterFn]=\"searchApi\" />\n *\n * <!-- Reactive form -->\n * <wm-combobox formControlName=\"tag\" [options]=\"tags\" />\n */\n@Component({\n selector: 'wm-combobox',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, ComboboxPanel],\n templateUrl: './combobox.html',\n styleUrl: './combobox.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => WmCombobox),\n multi: true,\n },\n ],\n})\nexport class WmCombobox implements ControlValueAccessor, OnDestroy {\n // ── Public inputs ──────────────────────────────────────────────────────\n\n /** Full option list (before filtering). */\n readonly options = input<ComboboxOption[]>([]);\n\n /** Selected value (single-select). Two-way bindable. */\n readonly value = model<unknown>(null);\n\n /** Selected values (multi-select). Two-way bindable. */\n readonly values = model<unknown[]>([]);\n\n /** Enable multi-select mode with chips. */\n readonly multiple = input(false);\n\n /** Allow typed text to be accepted as a freeform value. */\n readonly allowFreeform = input(false);\n\n /** Placeholder text for the input. */\n readonly placeholder = input('Search\\u2026');\n\n /** Disable the combobox. */\n readonly disabled = input(false);\n\n /** Custom async filter function. Overrides default substring matching. */\n readonly filterFn = input<\n ((query: string) => import('rxjs').Observable<ComboboxOption[]>) | null\n >(null);\n\n /** Pixel height of each option row. */\n readonly itemHeight = input(36);\n\n /** Max panel height in pixels. */\n readonly maxPanelHeight = input(256);\n\n // ── Public outputs ─────────────────────────────────────────────────────\n\n /** Emitted when the input text changes. */\n readonly query = output<string>();\n\n /** Emitted when the panel opens. */\n readonly opened = output<void>();\n\n /** Emitted when the panel closes. */\n readonly closed = output<void>();\n\n // ── View children ──────────────────────────────────────────────────────\n\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n protected readonly panel = viewChild(ComboboxPanel);\n\n // ── Internal state ─────────────────────────────────────────────────────\n\n protected readonly isOpen = signal(false);\n protected readonly inputText = signal('');\n protected readonly highlightIndex = signal(-1);\n protected readonly asyncLoading = signal(false);\n protected readonly asyncResults = signal<ComboboxOption[] | null>(null);\n\n /** Text the input had when the panel opened — restored on Escape. */\n private savedText = '';\n\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n // ── CVA state ──────────────────────────────────────────────────────────\n\n private onChangeFn: (v: unknown) => void = () => {};\n protected onTouchedFn: () => void = () => {};\n\n // ── Async filter plumbing ──────────────────────────────────────────────\n\n private readonly filterSubject = new Subject<string>();\n private filterSub: Subscription | null = null;\n\n // ── Live region debounce ───────────────────────────────────────────────\n\n protected readonly liveText = signal('');\n private liveTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ── Computed ───────────────────────────────────────────────────────────\n\n /** Set of currently selected values for the panel. */\n protected readonly selectedValues = computed(() => {\n if (this.multiple()) {\n return new Set<unknown>(this.values());\n }\n const v = this.value();\n return v != null ? new Set<unknown>([v]) : new Set<unknown>();\n });\n\n /** Filtered options shown in the panel. */\n protected readonly filteredOptions = computed(() => {\n // If async filterFn is set and we have results, use those.\n const asyncRes = this.asyncResults();\n if (this.filterFn() && asyncRes !== null) {\n return asyncRes;\n }\n\n const query = this.inputText().trim().toLowerCase();\n const opts = this.options();\n if (!query) return opts;\n return opts.filter(o => o.label.toLowerCase().includes(query));\n });\n\n /** Chips for multi-select mode. */\n protected readonly chips = computed(() => {\n if (!this.multiple()) return [];\n const vals = this.values();\n const opts = this.options();\n return vals.map(v => {\n const opt = opts.find(o => o.value === v);\n return { value: v, label: opt?.label ?? String(v) };\n });\n });\n\n /** The aria-activedescendant value. */\n protected readonly activeDescendant = computed(() => {\n const idx = this.highlightIndex();\n const p = this.panel();\n if (idx < 0 || !p) return null;\n return p.optionIdAt(idx) || null;\n });\n\n /** The listbox ID from the panel (for aria-controls). */\n protected readonly panelListboxId = computed(() => {\n const p = this.panel();\n return p ? p.listboxId : null;\n });\n\n /** Freeform hint for empty state. */\n protected readonly freeformHint = computed(() => {\n if (!this.allowFreeform()) return '';\n const text = this.inputText().trim();\n return text ? `Press Enter to add \"${text}\"` : '';\n });\n\n /** Overlay width tracks host element width. */\n protected get overlayWidth(): number {\n return this.hostEl.nativeElement.offsetWidth || 200;\n }\n\n /** Overlay positions: below-first with above-fallback. */\n protected readonly positions: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n ];\n\n constructor() {\n // Wire up async filter subscription.\n this.filterSub = this.filterSubject\n .pipe(\n debounceTime(200),\n switchMap(q => {\n const fn = this.filterFn();\n if (!fn) return of(null);\n this.asyncLoading.set(true);\n return fn(q).pipe(\n catchError(() => of([] as ComboboxOption[])),\n finalize(() => this.asyncLoading.set(false)),\n );\n }),\n )\n .subscribe(results => {\n if (results !== null) {\n this.asyncResults.set(results);\n }\n });\n\n // Update live region when filtered options change (debounced 300ms).\n effect(() => {\n const count = this.filteredOptions().length;\n const total = this.options().length;\n // Read isOpen to track it in this effect.\n const open = this.isOpen();\n\n // Clear any pending timer.\n if (this.liveTimer !== null) {\n clearTimeout(this.liveTimer);\n }\n\n if (!open) {\n this.liveText.set('');\n return;\n }\n\n this.liveTimer = setTimeout(() => {\n if (count === 0) {\n this.liveText.set('No results');\n } else if (this.filterFn() || this.inputText().trim()) {\n this.liveText.set(\n total > 0 && count < total\n ? `${count} of ${total} results`\n : `${count} results available`,\n );\n } else {\n this.liveText.set(`${count} results available`);\n }\n }, 300);\n });\n }\n\n ngOnDestroy(): void {\n this.filterSub?.unsubscribe();\n if (this.liveTimer !== null) {\n clearTimeout(this.liveTimer);\n }\n }\n\n // ── CVA ────────────────────────────────────────────────────────────────\n\n writeValue(value: unknown): void {\n if (this.multiple()) {\n const arr = Array.isArray(value) ? value : [];\n this.values.set(arr);\n } else {\n this.value.set(value);\n // Show label for current value.\n const opt = this.options().find(o => o.value === value);\n this.inputText.set(opt?.label ?? '');\n }\n }\n\n registerOnChange(fn: (v: unknown) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n // ── Panel open/close ───────────────────────────────────────────────────\n\n protected open(highlightFirst = false, highlightLast = false): void {\n if (this.disabled() || this.isOpen()) return;\n this.savedText = this.inputText();\n this.isOpen.set(true);\n this.opened.emit();\n\n if (highlightFirst) {\n this.highlightFirst();\n } else if (highlightLast) {\n this.highlightLast();\n } else {\n this.highlightIndex.set(-1);\n }\n }\n\n protected close(restoreText = false): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.highlightIndex.set(-1);\n this.closed.emit();\n\n if (restoreText) {\n this.inputText.set(this.savedText);\n } else if (!this.multiple()) {\n // Restore label of selected value.\n this.syncInputToSelection();\n }\n }\n\n // ── Input events ───────────────────────────────────────────────────────\n\n protected onInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.inputText.set(text);\n this.query.emit(text);\n this.highlightIndex.set(-1);\n this.asyncResults.set(null);\n\n if (this.filterFn()) {\n this.filterSubject.next(text);\n }\n\n if (!this.isOpen()) {\n this.open();\n }\n }\n\n protected onBlur(): void {\n this.onTouchedFn();\n\n // Short delay so mousedown on an option fires first.\n setTimeout(() => {\n if (!this.isOpen()) return;\n\n if (this.allowFreeform() && !this.multiple()) {\n this.acceptFreeform();\n }\n\n this.close();\n }, 150);\n }\n\n protected onTriggerClick(): void {\n if (this.disabled()) return;\n\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n // In single-select, select the input text for easy re-typing.\n if (!this.multiple() && this.inputText()) {\n const el = this.inputRef()?.nativeElement;\n el?.select();\n }\n }\n }\n\n // ── Keyboard ───────────────────────────────────────────────────────────\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n const open = this.isOpen();\n const hi = this.highlightIndex();\n const opts = this.filteredOptions();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!open) {\n if (event.altKey) {\n this.open(false, false); // Alt+ArrowDown: open without highlight\n } else {\n this.open(true, false); // ArrowDown: open + highlight first\n }\n } else if (hi < 0) {\n this.highlightFirst();\n } else {\n const next = this.nextEnabled(hi, 1, opts);\n this.highlightIndex.set(next);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (!open) {\n this.open(false, true); // ArrowUp: open + highlight last\n } else if (event.altKey) {\n this.close();\n } else if (hi < 0) {\n this.highlightLast();\n } else {\n const prev = this.nextEnabled(hi, -1, opts);\n this.highlightIndex.set(prev);\n }\n break;\n\n case 'Enter':\n if (open) {\n event.preventDefault();\n if (hi >= 0 && hi < opts.length) {\n this.selectOption(opts[hi]);\n } else if (this.allowFreeform() && this.inputText().trim()) {\n this.acceptFreeform();\n this.close();\n }\n }\n break;\n\n case 'Escape':\n if (open) {\n event.preventDefault();\n this.close(true); // Restore text\n } else {\n // Clear input text.\n this.inputText.set('');\n this.query.emit('');\n }\n break;\n\n case 'Tab':\n if (open) {\n if (hi >= 0 && hi < opts.length) {\n this.selectOption(opts[hi]);\n }\n this.close();\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'Home':\n case 'End':\n // Clear highlight so cursor navigation works normally.\n if (open && hi >= 0) {\n this.highlightIndex.set(-1);\n }\n break;\n\n case 'Backspace':\n if (open && hi >= 0) {\n // Clear highlight, let deletion happen in input.\n this.highlightIndex.set(-1);\n } else if (\n this.multiple() &&\n !this.inputText() &&\n this.values().length > 0\n ) {\n // Remove last chip.\n this.removeChipByIndex(this.values().length - 1);\n }\n break;\n\n default:\n // Printable character: clear highlight, let it type.\n if (open && hi >= 0 && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n this.highlightIndex.set(-1);\n }\n // If closed and printable, open panel.\n if (!open && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n this.open();\n }\n break;\n }\n }\n\n // ── Option selection ───────────────────────────────────────────────────\n\n protected onOptionClicked(event: { option: ComboboxOption; index: number }): void {\n this.selectOption(event.option);\n // Refocus input since mousedown prevented default.\n this.inputRef()?.nativeElement.focus();\n }\n\n private selectOption(opt: ComboboxOption): void {\n if (opt.disabled) return;\n\n if (this.multiple()) {\n const current = this.values();\n const idx = current.indexOf(opt.value);\n if (idx >= 0) {\n // Deselect.\n this.values.set(current.filter((_, i) => i !== idx));\n } else {\n this.values.set([...current, opt.value]);\n }\n // Clear input, keep panel open.\n this.inputText.set('');\n this.query.emit('');\n this.highlightIndex.set(-1);\n this.onChangeFn(this.values());\n } else {\n this.value.set(opt.value);\n this.inputText.set(opt.label);\n this.onChangeFn(opt.value);\n this.close();\n }\n }\n\n // ── Chip removal ───────────────────────────────────────────────────────\n\n protected removeChip(chipValue: unknown): void {\n const current = this.values();\n this.values.set(current.filter(v => v !== chipValue));\n this.onChangeFn(this.values());\n this.inputRef()?.nativeElement.focus();\n }\n\n private removeChipByIndex(index: number): void {\n const current = this.values();\n this.values.set(current.filter((_, i) => i !== index));\n this.onChangeFn(this.values());\n }\n\n // ── Freeform ───────────────────────────────────────────────────────────\n\n private acceptFreeform(): void {\n const text = this.inputText().trim();\n if (!text) return;\n\n if (this.multiple()) {\n const current = this.values();\n if (!current.includes(text)) {\n this.values.set([...current, text]);\n this.onChangeFn(this.values());\n }\n this.inputText.set('');\n this.query.emit('');\n } else {\n this.value.set(text);\n this.onChangeFn(text);\n }\n }\n\n // ── Highlight helpers ──────────────────────────────────────────────────\n\n private highlightFirst(): void {\n const opts = this.filteredOptions();\n for (let i = 0; i < opts.length; i++) {\n if (!opts[i].disabled) {\n this.highlightIndex.set(i);\n return;\n }\n }\n this.highlightIndex.set(-1);\n }\n\n private highlightLast(): void {\n const opts = this.filteredOptions();\n for (let i = opts.length - 1; i >= 0; i--) {\n if (!opts[i].disabled) {\n this.highlightIndex.set(i);\n return;\n }\n }\n this.highlightIndex.set(-1);\n }\n\n /**\n * Find the next enabled option in the given direction.\n * Returns -1 if wrapping past the end/start (clears highlight).\n */\n private nextEnabled(\n from: number,\n direction: 1 | -1,\n opts: ComboboxOption[],\n ): number {\n let i = from + direction;\n if (i < 0 || i >= opts.length) return -1; // Wrap clears highlight.\n while (i >= 0 && i < opts.length) {\n if (!opts[i].disabled) return i;\n i += direction;\n }\n return -1;\n }\n\n /** Sync input text to the currently selected option label (single-select). */\n private syncInputToSelection(): void {\n const v = this.value();\n if (v == null) {\n this.inputText.set('');\n return;\n }\n const opt = this.options().find(o => o.value === v);\n this.inputText.set(opt?.label ?? '');\n }\n}\n","<!-- Trigger wrapper — anchors the CDK overlay -->\n<div\n class=\"wm-cb-trigger\"\n [class.is-open]=\"isOpen()\"\n [class.is-disabled]=\"disabled()\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick()\"\n>\n <!-- Multi-select chips -->\n @if (multiple()) {\n @for (chip of chips(); track chip.value) {\n <span class=\"wm-cb-chip\">\n <span class=\"wm-cb-chip-label\">{{ chip.label }}</span>\n <button\n type=\"button\"\n class=\"wm-cb-chip-remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Remove ' + chip.label\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation()\"\n (click)=\"$event.stopPropagation(); removeChip(chip.value)\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </span>\n }\n }\n\n <!-- Text input -->\n <input\n #inputEl\n type=\"text\"\n class=\"wm-cb-input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.placeholder]=\"chips().length ? '' : placeholder()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n [attr.aria-autocomplete]=\"allowFreeform() ? 'both' : 'list'\"\n [attr.aria-activedescendant]=\"activeDescendant()\"\n [attr.aria-controls]=\"isOpen() ? panelListboxId() : null\"\n [disabled]=\"disabled() || null\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Chevron -->\n <svg\n class=\"wm-cb-chevron\"\n [class.is-open]=\"isOpen()\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n</div>\n\n<!-- Live region for screen readers -->\n<span class=\"wm-cb-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ liveText() }}\n</span>\n\n<!-- Dropdown panel in CDK overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"wm-cb-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div class=\"wm-cb-panel\">\n <wm-combobox-panel\n [options]=\"filteredOptions()\"\n [highlightIndex]=\"highlightIndex()\"\n [selectedValues]=\"selectedValues()\"\n [multiple]=\"multiple()\"\n [itemHeight]=\"itemHeight()\"\n [maxHeight]=\"maxPanelHeight()\"\n [filterQuery]=\"inputText()\"\n [loading]=\"asyncLoading()\"\n [freeformHint]=\"freeformHint()\"\n (optionClicked)=\"onOptionClicked($event)\"\n />\n </div>\n</ng-template>\n","import { Injectable, signal } from '@angular/core';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'progress';\n\nexport interface Toast {\n id: number;\n message: string;\n type: ToastType;\n /** If true, toast does not auto-dismiss. Caller must dismiss it manually. */\n persistent?: boolean;\n /** Epoch ms when this toast was created (used for elapsed time display). */\n createdAt?: number;\n /** Callback invoked when the user clicks the Cancel button (progress toasts only). */\n onCancel?: () => void;\n}\n\nlet nextId = 0;\n\n/**\n * WmToastService — Application-wide toast notification manager.\n *\n * Provided in root; inject anywhere and call success(), error(), info(), or progress().\n * Render `<wm-toast-container>` once at the app root to display toasts.\n *\n * Auto-dismiss: success/info after 4 s, error after 6 s.\n * Progress toasts persist until explicitly dismissed.\n * Custom duration via show(message, type, durationMs).\n */\n@Injectable({ providedIn: 'root' })\nexport class WmToastService {\n readonly toasts = signal<Toast[]>([]);\n\n show(message: string, type: ToastType = 'info', duration?: number): number {\n const id = ++nextId;\n this.toasts.update(list => [...list, { id, message, type }]);\n const ms = duration ?? (type === 'error' ? 6000 : 4000);\n setTimeout(() => this.dismiss(id), ms);\n return id;\n }\n\n success(message: string): number { return this.show(message, 'success'); }\n error(message: string): number { return this.show(message, 'error'); }\n info(message: string): number { return this.show(message, 'info'); }\n\n /**\n * Show a persistent progress toast with spinner and elapsed timer.\n * Returns the toast ID — caller must call dismiss(id) when done.\n *\n * @param message - Display message (e.g. \"Generating docs…\")\n * @param onCancel - Optional callback invoked when the user clicks Cancel.\n * The caller should abort the operation and then dismiss the toast.\n */\n progress(message: string, onCancel?: () => void): number {\n const id = ++nextId;\n this.toasts.update(list => [\n ...list,\n { id, message, type: 'progress', persistent: true, createdAt: Date.now(), onCancel },\n ]);\n return id;\n }\n\n dismiss(id: number): void {\n this.toasts.update(list => list.filter(t => t.id !== id));\n }\n}\n","import { Component, inject, ChangeDetectionStrategy, signal, OnDestroy } from '@angular/core';\nimport { WmToastService, Toast } from './toast.service';\n\n/**\n * WmToastContainer — Renders the current stack of toasts.\n *\n * Place once at the application root (e.g. inside the shell or app component).\n * Uses inline SVG icons — no external icon library dependency.\n *\n * Accessibility:\n * - Container has role=\"log\" + aria-live=\"polite\" so new toasts are announced\n * - Each toast has role=\"status\"\n * - Dismiss button has an accessible label\n */\n@Component({\n selector: 'wm-toast-container',\n templateUrl: './toast-container.html',\n styleUrl: './toast-container.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WmToastContainer implements OnDestroy {\n protected readonly toastService = inject(WmToastService);\n\n /** Tick signal that updates every second — drives the elapsed time display. */\n protected readonly tick = signal(Date.now());\n private tickInterval = setInterval(() => {\n // Only tick when there are progress toasts with createdAt\n if (this.toastService.toasts().some(t => t.type === 'progress' && t.createdAt)) {\n this.tick.set(Date.now());\n }\n }, 1000);\n\n ngOnDestroy(): void {\n clearInterval(this.tickInterval);\n }\n\n protected dismiss(id: number): void {\n this.toastService.dismiss(id);\n }\n\n protected cancel(toast: Toast): void {\n toast.onCancel?.();\n this.toastService.dismiss(toast.id);\n }\n\n protected typeClass(toast: Toast): string {\n return `wm-toast wm-toast--${toast.type}`;\n }\n\n protected elapsed(createdAt: number): string {\n const now = this.tick(); // reactive dependency on tick\n const diff = Math.max(0, Math.floor((now - createdAt) / 1000));\n if (diff < 60) return `${diff}s`;\n const mins = Math.floor(diff / 60);\n const secs = diff % 60;\n return `${mins}m ${secs.toString().padStart(2, '0')}s`;\n }\n}\n","<div class=\"wm-toast-container\" role=\"log\" aria-live=\"polite\" aria-label=\"Notifications\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div [class]=\"typeClass(toast)\" role=\"status\">\n <!-- Success icon (check-circle) -->\n @if (toast.type === 'success') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n <!-- Error icon (x-circle) -->\n @if (toast.type === 'error') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n <!-- Info icon -->\n @if (toast.type === 'info') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n }\n <!-- Progress spinner -->\n @if (toast.type === 'progress') {\n <span class=\"wm-toast-spinner\" aria-hidden=\"true\"></span>\n }\n\n <span class=\"wm-toast-message\">\n {{ toast.message }}\n @if (toast.type === 'progress' && toast.createdAt) {\n <span class=\"wm-toast-elapsed\"> ({{ elapsed(toast.createdAt) }})</span>\n }\n </span>\n\n <!-- Cancel button for progress toasts with an onCancel callback -->\n @if (toast.type === 'progress' && toast.onCancel) {\n <button class=\"wm-toast-cancel\" (click)=\"cancel(toast)\" aria-label=\"Cancel operation\">Cancel</button>\n }\n\n <!-- Dismiss button — always shown -->\n <button class=\"wm-toast-dismiss\" (click)=\"dismiss(toast.id)\" aria-label=\"Dismiss notification\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n }\n</div>\n","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { invoke } from '@tauri-apps/api/core';\nimport { WmToastService } from '../toast/toast.service';\nimport type { LicenseStatus } from './license.types';\n\n@Injectable({ providedIn: 'root' })\nexport class WmLicenseService {\n private toast = inject(WmToastService);\n\n readonly license = signal<LicenseStatus | null>(null);\n readonly isLicensed = computed(() => this.license()?.valid ?? false);\n readonly orgName = computed(() => this.license()?.org ?? null);\n\n async checkLicense(): Promise<void> {\n try {\n const status = await invoke<LicenseStatus>('get_license_status');\n this.license.set(status);\n if (!status.valid && status.error) {\n const message = status.error === 'expired'\n ? 'Your license key has expired.'\n : 'Your license key is not valid.';\n this.toast.error(message);\n }\n } catch (e) {\n console.error('License check failed:', e);\n this.license.set(null);\n }\n }\n\n async installKey(jwt: string): Promise<LicenseStatus> {\n const status = await invoke<LicenseStatus>('install_license', { key: jwt });\n this.license.set(status);\n return status;\n }\n}\n","import { Component, ChangeDetectionStrategy, signal, output, inject } from '@angular/core';\nimport { WmLicenseService } from './license.service';\nimport { WmButton } from '../button/button';\n\n@Component({\n selector: 'wm-license-nudge',\n standalone: true,\n imports: [WmButton],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './license-nudge.html',\n styleUrl: './license-nudge.css',\n})\nexport class WmLicenseNudge {\n private licenseService = inject(WmLicenseService);\n\n dismissed = signal(false);\n enterLicense = output<void>();\n\n protected readonly shouldShow = () =>\n !this.licenseService.isLicensed() && !this.dismissed();\n\n dismiss(): void {\n this.dismissed.set(true);\n }\n\n onEnterLicense(): void {\n this.enterLicense.emit();\n }\n}\n","@if (shouldShow()) {\n <div class=\"wm-license-nudge\">\n <span class=\"wm-license-nudge__text\">\n Using this at work? Organizations require a commercial license.\n </span>\n <div class=\"wm-license-nudge__actions\">\n <wm-button variant=\"ghost\" size=\"sm\" (click)=\"onEnterLicense()\">Enter License Key</wm-button>\n <wm-button variant=\"ghost\" size=\"sm\" (click)=\"dismiss()\">Dismiss</wm-button>\n </div>\n </div>\n}\n","import { Component, ChangeDetectionStrategy, signal, input, output, inject } from '@angular/core';\nimport { WmModal } from '../modal/modal';\nimport { WmButton } from '../button/button';\nimport { WmLicenseService } from './license.service';\nimport type { LicenseStatus } from './license.types';\n\n@Component({\n selector: 'wm-license-dialog',\n standalone: true,\n imports: [WmModal, WmButton],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './license-dialog.html',\n styleUrl: './license-dialog.css',\n})\nexport class WmLicenseDialog {\n private licenseService = inject(WmLicenseService);\n\n visible = input.required<boolean>();\n dismiss = output<void>();\n\n keyInput = signal('');\n validationResult = signal<LicenseStatus | null>(null);\n validating = signal(false);\n installed = signal(false);\n\n onDismiss(): void {\n this.reset();\n this.dismiss.emit();\n }\n\n onKeyInput(event: Event): void {\n const value = (event.target as HTMLTextAreaElement).value;\n this.keyInput.set(value);\n this.validationResult.set(null);\n this.installed.set(false);\n }\n\n async validate(): Promise<void> {\n const jwt = this.keyInput().trim();\n if (!jwt) return;\n\n this.validating.set(true);\n try {\n const status = await this.licenseService.installKey(jwt);\n this.validationResult.set(status);\n if (status.valid) {\n this.installed.set(true);\n }\n } catch (e) {\n this.validationResult.set({\n valid: false,\n org: null,\n product: '',\n seats: null,\n tier: null,\n expires: null,\n key_id: null,\n error: String(e),\n });\n } finally {\n this.validating.set(false);\n }\n }\n\n private reset(): void {\n this.keyInput.set('');\n this.validationResult.set(null);\n this.validating.set(false);\n this.installed.set(false);\n }\n}\n","<wm-modal [visible]=\"visible()\" (dismiss)=\"onDismiss()\">\n <div class=\"wm-license-dialog\">\n <h2 class=\"wm-license-dialog__title\">Enter License Key</h2>\n\n @if (installed()) {\n <div class=\"wm-license-dialog__success\">\n <p class=\"wm-license-dialog__success-text\">License activated successfully.</p>\n <dl class=\"wm-license-dialog__details\">\n <dt>Organization</dt>\n <dd>{{ validationResult()?.org }}</dd>\n <dt>Seats</dt>\n <dd>{{ validationResult()?.seats }}</dd>\n <dt>Expires</dt>\n <dd>{{ validationResult()?.expires?.slice(0, 10) }}</dd>\n </dl>\n <wm-button variant=\"primary\" size=\"sm\" (click)=\"onDismiss()\">Done</wm-button>\n </div>\n } @else {\n <textarea\n class=\"wm-license-dialog__input\"\n placeholder=\"Paste your license key here...\"\n [value]=\"keyInput()\"\n (input)=\"onKeyInput($event)\"\n rows=\"4\"\n ></textarea>\n\n @if (validationResult(); as result) {\n @if (!result.valid) {\n <p class=\"wm-license-dialog__error\">\n @if (result.error === 'expired') {\n This license key has expired.\n } @else {\n This is not a valid license key for this product.\n }\n </p>\n }\n }\n\n <div class=\"wm-license-dialog__actions\">\n <wm-button\n variant=\"primary\"\n size=\"sm\"\n [disabled]=\"!keyInput().trim() || validating()\"\n (click)=\"validate()\"\n >\n @if (validating()) { Validating... } @else { Activate }\n </wm-button>\n </div>\n }\n </div>\n</wm-modal>\n","// Components\r\nexport { WmModal } from './modal/modal';\r\nexport { WmDialog } from './dialog/dialog';\r\nexport { WmSelect } from './select/select';\r\nexport { WmPopover } from './popover/popover';\r\nexport { WmAutoFocus } from './popover/auto-focus.directive';\r\nexport { WmTabs } from './tabs/tabs';\r\nexport { WmTab } from './tabs/tab';\r\nexport { WmButton } from './button/button';\r\nexport { Checkbox } from './checkbox/checkbox';\r\nexport { NumberInput } from './number-input/number-input';\r\nexport { Toggle } from './toggle/toggle';\r\nexport { GhostField } from './ghost-field/ghost-field';\r\nexport { PageHeader } from './page-header/page-header';\r\nexport { WmCombobox } from './combobox/combobox';\r\nexport { WmToastContainer } from './toast/toast-container';\r\nexport { WmToastService } from './toast/toast.service';\r\n\r\n// License\r\nexport { WmLicenseService } from './license/license.service';\r\nexport { WmLicenseNudge } from './license/license-nudge';\r\nexport { WmLicenseDialog } from './license/license-dialog';\r\n\r\n// Types\r\nexport type { DialogSize } from './dialog/dialog';\r\nexport type { SelectOption } from './select/option';\r\nexport type { ButtonVariant, ButtonSize } from './button/button';\r\nexport type { ToastType, Toast } from './toast/toast.service';\r\nexport type { ComboboxOption } from './combobox/option';\r\nexport type { LicenseStatus } from './license/license.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wildmason-aegis.mjs","sources":["../../src/modal/modal.ts","../../src/modal/modal.html","../../src/dialog/dialog.ts","../../src/dialog/dialog.html","../../src/select/select.ts","../../src/select/select.html","../../src/popover/popover.ts","../../src/popover/popover.html","../../src/popover/auto-focus.directive.ts","../../src/tabs/tab.ts","../../src/tabs/tabs.ts","../../src/tabs/tabs.html","../../src/button/button.ts","../../src/button/button.html","../../src/checkbox/checkbox.ts","../../src/checkbox/checkbox.html","../../src/number-input/number-input.ts","../../src/number-input/number-input.html","../../src/toggle/toggle.ts","../../src/toggle/toggle.html","../../src/ghost-field/ghost-field.ts","../../src/page-header/page-header.ts","../../src/page-header/page-header.html","../../src/combobox/combobox-panel.ts","../../src/combobox/combobox-panel.html","../../src/combobox/combobox.ts","../../src/combobox/combobox.html","../../src/toast/toast.service.ts","../../src/toast/toast-container.ts","../../src/toast/toast-container.html","../../src/license/license.service.ts","../../src/license/license-nudge.ts","../../src/license/license-nudge.html","../../src/license/license-dialog.ts","../../src/license/license-dialog.html","../../src/index.ts","../../src/wildmason-aegis.ts"],"sourcesContent":["import { Component, HostListener, input, output, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n/**\r\n * WmModal — Lightweight modal backdrop with Escape key and click-outside dismissal.\r\n *\r\n * Owns the fixed backdrop, centering, and keyboard/pointer dismissal so individual\r\n * modal components don't need to repeat this logic or add their own HostListeners.\r\n *\r\n * Usage:\r\n * <wm-modal [visible]=\"visible()\" (dismiss)=\"close()\">\r\n * <div class=\"p-6 wm-r-md w-80\" style=\"background: var(--wm-bg-raised)\">\r\n * <!-- modal panel content -->\r\n * </div>\r\n * </wm-modal>\r\n *\r\n * For top-aligned panels (e.g. search/command palettes), use align=\"top\":\r\n * <wm-modal [visible]=\"visible()\" (dismiss)=\"close()\" align=\"top\">\r\n *\r\n * The projected content is wrapped in a stop-propagation container so clicks inside\r\n * the panel do not bubble up to the backdrop and trigger a dismiss.\r\n */\r\n@Component({\r\n selector: 'wm-modal',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './modal.html',\r\n})\r\nexport class WmModal {\r\n /** Whether the modal is currently open. */\r\n visible = input.required<boolean>();\r\n\r\n /** Emitted when the user requests the modal to close (Escape or backdrop click). */\r\n dismiss = output<void>();\r\n\r\n /**\r\n * Vertical alignment of the panel within the backdrop.\r\n * - 'center' (default): panel is vertically centered (items-center)\r\n * - 'top': panel appears near the top (items-start pt-20), for search/command overlays\r\n */\r\n align = input<'center' | 'top'>('center');\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.visible()) this.dismiss.emit();\r\n }\r\n}\r\n","@if (visible()) {\r\n <div [class]=\"align() === 'top'\r\n ? 'fixed inset-0 flex items-start justify-center pt-20 z-50'\r\n : 'fixed inset-0 flex items-center justify-center z-50'\"\r\n style=\"background: var(--wm-modal-backdrop)\"\r\n (click)=\"dismiss.emit()\">\r\n <div (click)=\"$event.stopPropagation()\">\r\n <ng-content />\r\n </div>\r\n </div>\r\n}\r\n","import { Component, HostListener, input, model } from '@angular/core';\r\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\r\n\r\nexport type DialogSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * WmDialog — Modal dialog with backdrop, focus trap, and Escape key handling.\r\n *\r\n * Renders a fixed-position overlay that is always viewport-relative (not clipped\r\n * by ancestor overflow:hidden). Do NOT place inside a container that uses\r\n * CSS transform, perspective, or filter — fixed positioning breaks in that context.\r\n *\r\n * Usage:\r\n * <wm-dialog [(isOpen)]=\"open\" title=\"Confirm action\">\r\n * <div body>\r\n * <p>Are you sure?</p>\r\n * <div class=\"wm-dialog-footer\">\r\n * <wm-button variant=\"secondary\" (click)=\"open.set(false)\">Cancel</wm-button>\r\n * <wm-button variant=\"primary\" (click)=\"onConfirm()\">Confirm</wm-button>\r\n * </div>\r\n * </div>\r\n * </wm-dialog>\r\n *\r\n * Accessibility:\r\n * - role=\"dialog\" + aria-modal=\"true\" on the panel\r\n * - aria-labelledby wired to the title element (when title is set)\r\n * - Focus is trapped inside the panel when open (cdkTrapFocus)\r\n * - Escape key closes the dialog\r\n * - Clicking the backdrop closes the dialog\r\n * - On close, focus returns to the element that opened the dialog\r\n * (browser default when focus trap is released)\r\n */\r\n@Component({\r\n selector: 'wm-dialog',\r\n templateUrl: './dialog.html',\r\n styleUrl: './dialog.css',\r\n imports: [CdkTrapFocus],\r\n})\r\nexport class WmDialog {\r\n /** Two-way binding for open/closed state. */\r\n isOpen = model(false);\r\n\r\n /** Dialog heading text. When set, aria-labelledby is applied automatically. */\r\n title = input('');\r\n\r\n /** Panel width preset. sm = 360px, md = 480px (default), lg = 640px. */\r\n size = input<DialogSize>('md');\r\n\r\n close(): void { this.isOpen.set(false); }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.isOpen()) this.close();\r\n }\r\n}\r\n","@if (isOpen()) {\r\n <!-- Backdrop — click to close -->\r\n <div class=\"wm-dialog-backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n\r\n <!-- Panel -->\r\n <div\r\n class=\"wm-dialog\"\r\n [class]=\"'wm-dialog--' + size()\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"title() ? 'wm-dialog-title' : null\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n <div class=\"wm-dialog-header\">\r\n <h2 class=\"wm-dialog-title\" id=\"wm-dialog-title\">{{ title() }}</h2>\r\n <button\r\n class=\"wm-dialog-close\"\r\n type=\"button\"\r\n (click)=\"close()\"\r\n aria-label=\"Close dialog\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"wm-dialog-body\">\r\n <ng-content select=\"[body]\" />\r\n </div>\r\n </div>\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\nimport { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\r\nimport { SelectOption } from './option';\r\n\r\n/**\r\n * WmSelect — Accessible dropdown select built on Angular CDK Overlay.\r\n *\r\n * Provides a styled, keyboard-accessible alternative to the native <select> element\r\n * when you need custom option rendering or consistent cross-platform appearance.\r\n *\r\n * When to use:\r\n * - Single selection from a list of 4+ options\r\n * - When option labels are complex (icons, descriptions, status badges)\r\n * - When native <select> appearance is insufficient\r\n *\r\n * When NOT to use:\r\n * - 3 or fewer options → use a radio group (more scannable, no extra click)\r\n * - Multi-select → use a checkbox group or a combobox with chips\r\n * - Yes/No choices → use a Toggle or two radio buttons\r\n *\r\n * Options API:\r\n * options: SelectOption[] — Array of { value, label, disabled? } objects.\r\n *\r\n * Two-way binding:\r\n * <wm-select [(value)]=\"selectedValue\" [options]=\"myOptions\" />\r\n *\r\n * Accessibility:\r\n * - Trigger has role=\"combobox\", aria-expanded, aria-haspopup=\"listbox\"\r\n * - Panel has role=\"listbox\"; each option has role=\"option\" + aria-selected\r\n * - Disabled options have aria-disabled=\"true\"\r\n * - Focus is trapped inside the open panel (cdkTrapFocus)\r\n * - Clicking the backdrop closes the panel and returns focus to the trigger\r\n * - Keyboard: Enter/Space on trigger opens; Escape closes; arrow keys\r\n * navigate options (relies on natural tab order within the panel)\r\n * - Always pair with a visible label via <wm-label> or aria-label on the host\r\n */\r\n@Component({\r\n selector: 'wm-select',\r\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkTrapFocus],\r\n templateUrl: './select.html',\r\n styleUrl: './select.css',\r\n})\r\nexport class WmSelect {\r\n /** Array of options to display. */\r\n options = input<SelectOption[]>([]);\r\n\r\n /** The currently selected value. Two-way bindable. */\r\n value = model<unknown>(null);\r\n\r\n /** Placeholder text shown when no option is selected. */\r\n placeholder = input('Select…');\r\n\r\n /** Disables the trigger and prevents the panel from opening. */\r\n disabled = input(false);\r\n\r\n protected isOpen = signal(false);\r\n\r\n protected selectedOption = computed(() =>\r\n this.options().find((o: SelectOption) => o.value === this.value()) ?? null\r\n );\r\n\r\n private hostEl = inject(ElementRef<HTMLElement>);\r\n\r\n protected get overlayWidth(): number {\r\n return this.hostEl.nativeElement.offsetWidth || 200;\r\n }\r\n\r\n protected positions: ConnectedPosition[] = [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n\r\n protected toggleOpen(): void {\r\n if (!this.disabled()) {\r\n this.isOpen.update((v: boolean) => !v);\r\n }\r\n }\r\n\r\n protected selectOption(opt: SelectOption): void {\r\n if (!opt.disabled) {\r\n this.value.set(opt.value);\r\n this.isOpen.set(false);\r\n }\r\n }\r\n}\r\n","<!-- Trigger button — anchors the CDK overlay -->\r\n<div\r\n class=\"wm-select-host\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n>\r\n <button\r\n type=\"button\"\r\n role=\"combobox\"\r\n class=\"wm-select-trigger\"\r\n [class.is-open]=\"isOpen()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n <span class=\"wm-select-value\" [class.is-placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label ?? placeholder() }}\r\n </span>\r\n <!-- Chevron icon — rotates when open -->\r\n <svg\r\n class=\"wm-select-chevron\"\r\n [class.is-open]=\"isOpen()\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\"\r\n stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<!-- Dropdown panel — rendered in CDK overlay container -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"wm-select-backdrop\"\r\n (backdropClick)=\"isOpen.set(false)\"\r\n (detach)=\"isOpen.set(false)\"\r\n>\r\n <div\r\n class=\"wm-select-panel\"\r\n role=\"listbox\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n >\r\n @for (opt of options(); track opt.value) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n class=\"wm-select-option\"\r\n [class.is-selected]=\"opt.value === value()\"\r\n [class.is-disabled]=\"!!opt.disabled\"\r\n [attr.aria-selected]=\"opt.value === value()\"\r\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\r\n [disabled]=\"opt.disabled || null\"\r\n (click)=\"selectOption(opt)\"\r\n >\r\n <span class=\"wm-select-option-label\">{{ opt.label }}</span>\r\n @if (opt.value === value()) {\r\n <!-- Checkmark for selected option -->\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <polyline points=\"20 6 9 17 4 12\"\r\n stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</ng-template>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n Renderer2,\r\n ViewEncapsulation,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\r\n\r\n/**\r\n * WmPopover — general-purpose CDK-overlay floating panel.\r\n *\r\n * A low-level primitive for dropdowns, menus, pickers, and any floating UI.\r\n * The parent controls open/close state; this component handles positioning,\r\n * backdrop, focus-trapping, and ARIA attribute management.\r\n *\r\n * Slots:\r\n * - [trigger] — the anchor element (button, icon, etc.)\r\n * - [content] — the panel body (menu items, form, etc.)\r\n *\r\n * Usage:\r\n * ```html\r\n * <wm-popover [isOpen]=\"open()\" (closed)=\"open.set(false)\" role=\"menu\" hasPopup=\"menu\" align=\"end\">\r\n * <button trigger (click)=\"open.set(!open())\">Options</button>\r\n * <div content role=\"menu\">\r\n * <button role=\"menuitem\" (click)=\"doThing()\">Do thing</button>\r\n * </div>\r\n * </wm-popover>\r\n * ```\r\n *\r\n * Accessibility:\r\n * - Trigger element automatically receives aria-haspopup, aria-expanded, aria-controls\r\n * - Panel receives the configured role\r\n * - Focus is trapped inside the open panel (cdkTrapFocus)\r\n * - Escape key closes the panel\r\n * - Backdrop click closes the panel\r\n *\r\n * Auto-focus:\r\n * - Add [wmAutoFocus] to any element inside [content] to focus it on open.\r\n * Import WmAutoFocus from @wildmason/aegis/components and add it to your component's imports.\r\n */\r\n@Component({\r\n selector: 'wm-popover',\r\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkTrapFocus],\r\n templateUrl: './popover.html',\r\n styleUrl: './popover.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class WmPopover {\r\n /** Whether the panel is currently open. */\r\n readonly isOpen = input<boolean>(false);\r\n\r\n /** Panel width in pixels, or 'auto' to match content. */\r\n readonly width = input<string | number>('auto');\r\n\r\n /** ARIA role for the floating panel element. Use 'menu', 'listbox', 'dialog', etc. */\r\n readonly role = input<string>('dialog');\r\n\r\n /** Value for aria-haspopup on the trigger element. */\r\n readonly hasPopup = input<string | boolean>('dialog');\r\n\r\n /** Horizontal alignment: 'start' aligns left edges, 'end' aligns right edges. */\r\n readonly align = input<'start' | 'end'>('start');\r\n\r\n /** Emitted when the panel should close (backdrop click, Escape key, CDK detach). */\r\n readonly closed = output<void>();\r\n\r\n private readonly renderer = inject(Renderer2);\r\n private readonly hostEl = inject(ElementRef);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n protected readonly panelId = 'wm-popover-' + Math.random().toString(36).substring(2, 9);\r\n protected readonly panel = viewChild<ElementRef<HTMLElement>>('panel');\r\n\r\n constructor() {\r\n effect(() => {\r\n const open = this.isOpen();\r\n const popup = this.hasPopup();\r\n this.cdr.markForCheck();\r\n\r\n const el: Element | null = this.hostEl.nativeElement.querySelector('[trigger]');\r\n if (!el) return;\r\n\r\n this.renderer.setAttribute(el, 'aria-haspopup', String(popup));\r\n this.renderer.setAttribute(el, 'aria-expanded', String(open));\r\n this.renderer.setAttribute(el, 'aria-controls', this.panelId);\r\n\r\n if (!el.getAttribute('role')) {\r\n this.renderer.setAttribute(el, 'role', 'button');\r\n }\r\n });\r\n }\r\n\r\n protected get positions(): ConnectedPosition[] {\r\n const x = this.align();\r\n return [\r\n { originX: x, originY: 'bottom', overlayX: x, overlayY: 'top', offsetY: 4 },\r\n { originX: x, originY: 'top', overlayX: x, overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n }\r\n\r\n protected onAttach(): void {\r\n setTimeout(() => {\r\n const panelEl = this.panel();\r\n if (!panelEl) return;\r\n const el = panelEl.nativeElement.querySelector('[wmAutoFocus]') as HTMLElement | null;\r\n if (!el) return;\r\n el.focus();\r\n if (typeof (el as any).showPicker === 'function') {\r\n const type = (el as HTMLInputElement).type;\r\n if (el.tagName === 'SELECT' || ['date', 'time', 'color'].includes(type)) {\r\n try { (el as any).showPicker(); } catch { /* ignore */ }\r\n }\r\n }\r\n }, 10);\r\n }\r\n\r\n protected onClose(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<!-- Trigger anchor -->\r\n<div cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" class=\"wm-popover-trigger\">\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n</div>\r\n\r\n<!-- Floating panel -->\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen()\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayHasBackdrop]=\"true\"\r\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\r\n (backdropClick)=\"onClose()\"\r\n (detach)=\"onClose()\"\r\n (attach)=\"onAttach()\"\r\n>\r\n <div\r\n #panel\r\n [id]=\"panelId\"\r\n [attr.role]=\"role()\"\r\n class=\"wm-popover-panel\"\r\n [style.width]=\"width() === 'auto' ? 'auto' : width() + 'px'\"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (keydown.escape)=\"onClose()\"\r\n >\r\n <ng-content select=\"[content]\"></ng-content>\r\n </div>\r\n</ng-template>\r\n","import { AfterViewInit, Directive, ElementRef, Input, inject } from '@angular/core';\r\n\r\n/**\r\n * WmAutoFocus — focuses an element when it enters the DOM.\r\n *\r\n * Usage: add [wmAutoFocus] to any focusable element inside a <wm-popover> panel.\r\n * For date/time/color/select inputs, also attempts to open the native picker UI.\r\n *\r\n * @example\r\n * <input wmAutoFocus type=\"text\" />\r\n * <input [wmAutoFocus]=\"shouldFocus\" type=\"date\" />\r\n */\r\n@Directive({\r\n selector: '[wmAutoFocus]',\r\n})\r\nexport class WmAutoFocus implements AfterViewInit {\r\n @Input('wmAutoFocus') enabled: boolean | '' = true;\r\n\r\n readonly #el = inject(ElementRef<HTMLElement>);\r\n\r\n ngAfterViewInit(): void {\r\n if (this.enabled === false) return;\r\n\r\n setTimeout(() => {\r\n const el = this.#el.nativeElement;\r\n if (!el) return;\r\n\r\n el.focus();\r\n\r\n const isPickerType =\r\n el.tagName === 'SELECT' ||\r\n (el.tagName === 'INPUT' &&\r\n ['date', 'time', 'color', 'datetime-local', 'month', 'week'].includes(\r\n (el as HTMLInputElement).type\r\n ));\r\n\r\n if (isPickerType && typeof (el as any).showPicker === 'function') {\r\n try {\r\n (el as any).showPicker();\r\n } catch {\r\n // Browser may reject showPicker() if not triggered by user gesture\r\n }\r\n }\r\n }, 50);\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, input, viewChild, TemplateRef } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'wm-tab',\r\n template: `<ng-template #tmpl><ng-content /></ng-template>`,\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class WmTab {\r\n readonly value = input.required<string>();\r\n readonly tmpl = viewChild.required<TemplateRef<void>>('tmpl');\r\n}\r\n","import { Component, ChangeDetectionStrategy, input, output, signal, contentChildren } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { WmTab } from './tab';\r\n\r\n@Component({\r\n selector: 'wm-tabs',\r\n templateUrl: './tabs.html',\r\n styleUrl: './tabs.css',\r\n imports: [NgTemplateOutlet],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class WmTabs {\r\n activeValue = input.required<string>();\r\n variant = input<'line' | 'pill'>('line');\r\n\r\n readonly select = output<string>();\r\n\r\n protected readonly tabs = contentChildren(WmTab);\r\n protected focusedIndex = signal<number | null>(null);\r\n\r\n protected selectTab(value: string, index: number): void {\r\n this.focusedIndex.set(index);\r\n this.select.emit(value);\r\n }\r\n\r\n protected onBlur(): void {\r\n setTimeout(() => {\r\n if (!document.activeElement?.closest('.wm-tabs')) {\r\n this.focusedIndex.set(null);\r\n }\r\n }, 0);\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent, container: HTMLElement): void {\r\n const tabs = this.tabs();\r\n const currentIndex = this.focusedIndex() ?? tabs.findIndex(t => t.value() === this.activeValue());\r\n let nextIndex: number | null = null;\r\n\r\n switch (event.key) {\r\n case 'ArrowRight':\r\n case 'ArrowDown':\r\n nextIndex = (currentIndex + 1) % tabs.length;\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowUp':\r\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length;\r\n break;\r\n case 'Home': nextIndex = 0; break;\r\n case 'End': nextIndex = tabs.length - 1; break;\r\n }\r\n\r\n if (nextIndex !== null) {\r\n event.preventDefault();\r\n this.focusedIndex.set(nextIndex);\r\n const btns = container.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]');\r\n btns[nextIndex]?.focus();\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"wm-tabs\"\r\n [class.wm-tabs--line]=\"variant() === 'line'\"\r\n [class.wm-tabs--pill]=\"variant() === 'pill'\"\r\n role=\"tablist\"\r\n #container\r\n (keydown)=\"onKeyDown($event, container)\"\r\n>\r\n @for (tab of tabs(); track tab.value(); let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"wm-tab\"\r\n [id]=\"'wm-tab-' + tab.value()\"\r\n [attr.aria-selected]=\"activeValue() === tab.value()\"\r\n [attr.aria-controls]=\"'wm-panel-' + tab.value()\"\r\n [tabIndex]=\"(focusedIndex() === null ? activeValue() === tab.value() : focusedIndex() === i) ? 0 : -1\"\r\n [class.is-active]=\"activeValue() === tab.value()\"\r\n (click)=\"selectTab(tab.value(), i)\"\r\n (focus)=\"focusedIndex.set(i)\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"tab.tmpl()\" />\r\n </button>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\n\r\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive' | 'flat';\r\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'wm-button',\r\n templateUrl: './button.html',\r\n styleUrl: './button.css',\r\n})\r\nexport class WmButton {\r\n readonly variant = input<ButtonVariant>('primary');\r\n readonly size = input<ButtonSize>('md');\r\n readonly disabled = input(false);\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n\r\n /** Makes the button square (equal width/height). Use for icon-only buttons. */\r\n readonly iconOnly = input(false);\r\n\r\n /** Accessible label forwarded to the inner <button>. Required for icon-only buttons. */\r\n readonly ariaLabel = input('');\r\n\r\n /** Tooltip text forwarded to the inner <button>. Named btnTitle to avoid native attribute conflict. */\r\n readonly btnTitle = input('');\r\n\r\n protected readonly btnClass = computed(() => {\r\n const base = `wm-btn wm-btn--${this.variant()} wm-btn--${this.size()}`;\r\n return this.iconOnly() ? `${base} btn-icon-only` : base;\r\n });\r\n}\r\n","<button\r\n [class]=\"btnClass()\"\r\n [disabled]=\"disabled()\"\r\n [type]=\"type()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.title]=\"btnTitle() || null\"\r\n>\r\n <ng-content />\r\n</button>\r\n","import { Component, computed, input, model } from '@angular/core';\r\n\r\n/**\r\n * WmCheckbox — Boolean selection control with optional indeterminate state.\r\n *\r\n * When to use:\r\n * - Multi-select lists (each item is independent)\r\n * - Form options that require explicit confirmation before taking effect\r\n * - Parent/child hierarchical selection (use indeterminate for \"some selected\")\r\n *\r\n * When NOT to use:\r\n * - Mutually exclusive choices → use radio buttons instead\r\n * - Immediate-effect toggles (e.g. dark mode) → use Toggle instead\r\n *\r\n * Accessibility:\r\n * - role=\"checkbox\" with aria-checked=\"true|false|mixed\"\r\n * - \"mixed\" maps to the indeterminate state for screen readers\r\n * - Space activates the checkbox (native button behaviour)\r\n * - Focus ring uses a double-ring (canvas gap + accent) pattern for maximum visibility\r\n * across all themes, meeting WCAG 2.1 SC 1.4.11 Non-text Contrast\r\n * - When wrapping in a group, add role=\"group\" + aria-labelledby to the container\r\n */\r\n@Component({\r\n selector: 'wm-checkbox',\r\n templateUrl: './checkbox.html',\r\n styleUrl: './checkbox.css',\r\n})\r\nexport class Checkbox {\r\n /** Two-way bindable checked state. */\r\n checked = model(false);\r\n\r\n /**\r\n * Shows a dash icon instead of a checkmark. Typically used for a \"select all\"\r\n * checkbox when only some child items are selected.\r\n * Note: indeterminate is display-only — clicking always toggles to true/false.\r\n */\r\n indeterminate = input(false);\r\n\r\n /** Visible text label rendered next to the checkbox box. */\r\n label = input('');\r\n\r\n disabled = input(false);\r\n\r\n /** Maps to aria-checked: true, false, or \"mixed\" (for indeterminate). */\r\n protected ariaChecked = computed<boolean | 'mixed'>(() => {\r\n if (this.indeterminate() && !this.checked()) return 'mixed';\r\n return this.checked();\r\n });\r\n\r\n toggle(): void {\r\n if (!this.disabled()) {\r\n this.checked.update(v => !v);\r\n }\r\n }\r\n}\r\n","<label class=\"wm-checkbox-wrap\" [class.is-disabled]=\"disabled()\">\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n class=\"wm-checkbox-box\"\r\n [class.is-checked]=\"checked()\"\r\n [class.is-indeterminate]=\"indeterminate() && !checked()\"\r\n [attr.aria-checked]=\"ariaChecked()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n (keydown.space)=\"$event.preventDefault(); toggle()\"\r\n >\r\n @if (indeterminate() && !checked()) {\r\n <!-- Dash for indeterminate (\"some selected\") state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"6\" x2=\"10\" y2=\"6\"\r\n stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else if (checked()) {\r\n <!-- Animated checkmark for selected state -->\r\n <svg class=\"wm-checkbox-icon\" viewBox=\"0 0 12 12\" aria-hidden=\"true\">\r\n <polyline class=\"check-mark\" points=\"2,6.5 4.5,9 10,3\"\r\n fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (label()) {\r\n <span class=\"wm-checkbox-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n","import {\r\n Component,\r\n ElementRef,\r\n forwardRef,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n/**\r\n * WmNumberInput — Numeric input with stepper buttons.\r\n *\r\n * Implements ControlValueAccessor so it works with both template-driven forms\r\n * (ngModel) and reactive forms (formControl / formControlName).\r\n *\r\n * When to use:\r\n * - Quantity fields (items in cart, repetitions, page count)\r\n * - Bounded numeric settings with a known min/max (timeout seconds, font size)\r\n *\r\n * When NOT to use:\r\n * - Free-form numeric entry without bounds → plain <input type=\"number\">\r\n * - Currency or phone numbers → use a text input with masking\r\n *\r\n * Accessibility:\r\n * - The underlying <input type=\"number\"> is the focusable control.\r\n * - Stepper buttons have tabindex=\"-1\" — they are mouse/touch targets only.\r\n * Keyboard users use the arrow keys on the input itself (native browser behaviour).\r\n * - Always provide an aria-label or visible label via <wm-field> + <wm-label>.\r\n * - The buttons use mousedown + preventDefault to avoid stealing focus from the input.\r\n *\r\n * Form integration:\r\n * <!-- Template-driven -->\r\n * <wm-number-input [(ngModel)]=\"count\" [min]=\"0\" [max]=\"100\" />\r\n *\r\n * <!-- Reactive -->\r\n * <wm-number-input formControlName=\"quantity\" [step]=\"5\" />\r\n */\r\n@Component({\r\n selector: 'wm-number-input',\r\n templateUrl: './number-input.html',\r\n styleUrl: './number-input.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NumberInput),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class NumberInput implements ControlValueAccessor {\r\n /** Minimum allowed value. */\r\n min = input<number | null>(null);\r\n\r\n /** Maximum allowed value. */\r\n max = input<number | null>(null);\r\n\r\n /** Amount to increment/decrement per step. Defaults to 1. */\r\n step = input(1);\r\n\r\n /** Placeholder text shown when the field is empty. */\r\n placeholder = input('0');\r\n\r\n /** Disables the control from the template. Also set automatically by reactive forms. */\r\n disabled = input(false);\r\n\r\n protected inputRef = viewChild<ElementRef<HTMLInputElement>>('inputEl');\r\n protected internalValue = signal<number | null>(null);\r\n\r\n private onChangeFn: (v: number | null) => void = () => {};\r\n protected onTouchedFn: () => void = () => {};\r\n\r\n /** CVA interface — called when the form model changes programmatically. */\r\n writeValue(value: number | null): void {\r\n this.internalValue.set(value ?? null);\r\n }\r\n\r\n registerOnChange(fn: (v: number | null) => void): void {\r\n this.onChangeFn = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouchedFn = fn;\r\n }\r\n\r\n protected onInputChange(event: Event): void {\r\n const raw = (event.target as HTMLInputElement).value;\r\n const num = raw === '' ? null : parseFloat(raw);\r\n this.internalValue.set(num);\r\n this.onChangeFn(num);\r\n this.onTouchedFn();\r\n }\r\n\r\n protected increment(): void {\r\n const curr = this.internalValue() ?? 0;\r\n const next = curr + this.step();\r\n const max = this.max();\r\n this.setValue(max !== null ? Math.min(next, max) : next);\r\n }\r\n\r\n protected decrement(): void {\r\n const curr = this.internalValue() ?? 0;\r\n const next = curr - this.step();\r\n const min = this.min();\r\n this.setValue(min !== null ? Math.max(next, min) : next);\r\n }\r\n\r\n /**\r\n * Prevents the stepper buttons from stealing focus away from the input element.\r\n * Without this, clicking a button would blur the input, hiding any validation state.\r\n */\r\n protected preventFocusSteal(event: MouseEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n private setValue(val: number): void {\r\n this.internalValue.set(val);\r\n this.onChangeFn(val);\r\n this.onTouchedFn();\r\n const el = this.inputRef();\r\n if (el) el.nativeElement.value = String(val);\r\n }\r\n}\r\n","<!--\r\n Uses .wm-input-group and .wm-number-* classes from inputs.css.\r\n The input fills the group; the controls column sits at the trailing edge.\r\n-->\r\n<div\r\n class=\"wm-input-group wm-number-field\"\r\n [class.is-disabled]=\"disabled()\"\r\n>\r\n <input\r\n #inputEl\r\n type=\"number\"\r\n class=\"wm-input-bare wm-number-input\"\r\n [value]=\"internalValue() ?? ''\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.min]=\"min() ?? null\"\r\n [attr.max]=\"max() ?? null\"\r\n [step]=\"step()\"\r\n [disabled]=\"disabled() || null\"\r\n (change)=\"onInputChange($event)\"\r\n (input)=\"onInputChange($event)\"\r\n (blur)=\"onTouchedFn()\"\r\n />\r\n\r\n <div class=\"wm-number-controls\" aria-hidden=\"true\">\r\n <button\r\n type=\"button\"\r\n class=\"wm-number-btn\"\r\n tabindex=\"-1\"\r\n [disabled]=\"disabled() || null\"\r\n (mousedown)=\"preventFocusSteal($event)\"\r\n (click)=\"increment()\"\r\n aria-label=\"Increment\"\r\n >\r\n <!-- chevron-up (lucide) -->\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"m18 15-6-6-6 6\"/>\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"wm-number-btn\"\r\n tabindex=\"-1\"\r\n [disabled]=\"disabled() || null\"\r\n (mousedown)=\"preventFocusSteal($event)\"\r\n (click)=\"decrement()\"\r\n aria-label=\"Decrement\"\r\n >\r\n <!-- chevron-down (lucide) -->\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"m6 9 6 6 6-6\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n","import { Component, input, model } from '@angular/core';\r\n\r\n/**\r\n * WmToggle — Binary on/off control.\r\n *\r\n * Use for settings that take effect immediately without a form submit.\r\n * For settings that need an explicit \"Save\" action, prefer a checkbox.\r\n *\r\n * Accessibility:\r\n * - role=\"switch\" communicates binary state to screen readers\r\n * - aria-checked reflects true/false\r\n * - aria-label required when no visible text label surrounds the toggle\r\n * - Space and Enter activate the toggle (native button behaviour)\r\n * - When disabled, aria state is preserved so SR users understand why it can't be changed\r\n */\r\n@Component({\r\n selector: 'wm-toggle',\r\n templateUrl: './toggle.html',\r\n styleUrl: './toggle.css',\r\n})\r\nexport class Toggle {\r\n /** Two-way bindable state. Use [(checked)]=\"mySignal\" or [checked]=\"val\" (changeChecked)=\"val=$event\". */\r\n checked = model(false);\r\n\r\n /** Visually and functionally disables the toggle. State is still readable by assistive tech. */\r\n disabled = input(false);\r\n\r\n /** Accessible label. Required if no visible label text surrounds the toggle in the DOM. */\r\n ariaLabel = input('Toggle');\r\n\r\n toggle(): void {\r\n if (!this.disabled()) {\r\n this.checked.update(v => !v);\r\n }\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n role=\"switch\"\r\n class=\"wm-toggle\"\r\n [class.is-on]=\"checked()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [attr.aria-checked]=\"checked()\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [disabled]=\"disabled() || null\"\r\n (click)=\"toggle()\"\r\n>\r\n <span class=\"wm-toggle-track\" aria-hidden=\"true\">\r\n <span class=\"wm-toggle-thumb\"></span>\r\n </span>\r\n</button>\r\n","import { Component, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * GhostField — transparent-until-hover wrapper for inline-editable fields.\r\n *\r\n * Applies .wm-ghost-field to its content; all visual behaviour is CSS-driven\r\n * (inputs.css). No inputs or outputs — interactivity belongs to the inner\r\n * element projected via ng-content.\r\n *\r\n * Usage:\r\n * <wm-ghost-field>\r\n * <input class=\"wm-input-bare\" [(ngModel)]=\"title\" aria-label=\"Task title\" />\r\n * </wm-ghost-field>\r\n */\r\n@Component({\r\n selector: 'wm-ghost-field',\r\n standalone: true,\r\n template: `<div class=\"wm-ghost-field\"><ng-content /></div>`,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class GhostField {}\r\n","import { Component, ChangeDetectionStrategy, ViewEncapsulation, input } from '@angular/core';\r\n\r\n/**\r\n * PageHeader — standardised page-level heading with eyebrow label, title,\r\n * optional subtitle, optional status badge, and projected action/back slots.\r\n *\r\n * Slots:\r\n * [icon] — 12×12 icon projected into the eyebrow row (optional)\r\n * [back] — back-navigation element (link or button) placed in the status row (optional)\r\n * default — action buttons / controls placed below the status row\r\n *\r\n * Usage:\r\n * <wm-page-header flavourText=\"Sprints\" title=\"Active Sprint\" [badgeLabel]=\"daysLeft\">\r\n * <svg icon .../>\r\n * <a back href=\"...\">← Board</a>\r\n * <wm-button>New Sprint</wm-button>\r\n * </wm-page-header>\r\n */\r\n@Component({\r\n selector: 'wm-page-header',\r\n standalone: true,\r\n templateUrl: './page-header.html',\r\n styleUrl: './page-header.css',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PageHeader {\r\n readonly flavourText = input.required<string>();\r\n readonly title = input.required<string>();\r\n readonly subtitle = input<string>();\r\n readonly badgeLabel = input<string>();\r\n}\r\n","<header class=\"wm-page-header\">\r\n <div class=\"wm-page-header__left\">\r\n <div class=\"wm-page-header__eyebrow\">\r\n <ng-content select=\"[icon]\" />\r\n <span>{{ flavourText() }}</span>\r\n </div>\r\n <h2 class=\"wm-page-header__title\">{{ title() }}</h2>\r\n @if (subtitle()) {\r\n <p class=\"wm-page-header__subtitle\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n\r\n <div class=\"wm-page-header__right\">\r\n <div class=\"wm-page-header__status\">\r\n @if (badgeLabel()) {\r\n <span class=\"wm-page-header__badge\">{{ badgeLabel() }}</span>\r\n }\r\n <ng-content select=\"[back]\" />\r\n </div>\r\n <div class=\"wm-page-header__actions\">\r\n <ng-content />\r\n </div>\r\n </div>\r\n</header>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewChild,\n computed,\n effect,\n input,\n output,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ComboboxOption } from './option';\n\n/** Module-level counter for unique panel instance IDs. */\nlet nextPanelId = 0;\n\n/**\n * Segment of an option label, split by filter-query matches.\n * `match: true` means this segment matched the query and should be bolded.\n */\ninterface LabelSegment {\n text: string;\n match: boolean;\n}\n\n/**\n * Internal sub-component that renders the virtual-scrolled option list\n * inside the WmCombobox's CDK overlay. NOT exported from Aegis.\n */\n@Component({\n selector: 'wm-combobox-panel',\n imports: [ScrollingModule],\n templateUrl: './combobox-panel.html',\n styleUrl: './combobox-panel.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComboboxPanel {\n /** Filtered options to display. */\n readonly options = input<ComboboxOption[]>([]);\n\n /** Index of the keyboard-highlighted option (-1 = none). */\n readonly highlightIndex = input(-1);\n\n /** Values currently selected (for checkmark display). */\n readonly selectedValues = input<Set<unknown>>(new Set());\n\n /** Whether the parent is multi-select. */\n readonly multiple = input(false);\n\n /** Pixel height per row. */\n readonly itemHeight = input(36);\n\n /** Max panel height in pixels. */\n readonly maxHeight = input(256);\n\n /** Current filter text — used for match highlighting in labels. */\n readonly filterQuery = input('');\n\n /** Show spinner when async filter is pending. */\n readonly loading = input(false);\n\n /** Shown in empty state when freeform input is enabled. */\n readonly freeformHint = input('');\n\n /** Emitted on mousedown (not click) to prevent focus steal. */\n readonly optionClicked = output<{ option: ComboboxOption; index: number }>();\n\n @ViewChild(CdkVirtualScrollViewport)\n private viewport?: CdkVirtualScrollViewport;\n\n /** Unique instance ID for generating DOM IDs. */\n private readonly instanceId = nextPanelId++;\n\n /** The DOM ID of the listbox element — used by parent for aria-controls. */\n readonly listboxId = `wm-combobox-${this.instanceId}-listbox`;\n\n /** Computed viewport height: min of (options * itemHeight) and maxHeight. */\n protected readonly viewportHeight = computed(() => {\n const count = this.options().length;\n return Math.min(count * this.itemHeight(), this.maxHeight());\n });\n\n /** Whether to show the empty state. */\n protected readonly showEmpty = computed(\n () => this.options().length === 0 && !this.loading()\n );\n\n /** Text for the empty state. */\n protected readonly emptyText = computed(\n () => this.freeformHint() || 'No matches'\n );\n\n /**\n * Precomputed label segments for each option, split by the current filter query.\n * Recomputes whenever options or filterQuery changes.\n */\n protected readonly segmentedLabels = computed(() => {\n const query = this.filterQuery().trim();\n return this.options().map(opt => this.splitLabel(opt.label, query));\n });\n\n /** Map from option value to a stable key for DOM IDs. */\n private optionKeyMap = new Map<unknown, string>();\n private nextObjectIndex = 0;\n\n constructor() {\n // Scroll the highlighted option into view whenever highlightIndex changes.\n effect(() => {\n const idx = this.highlightIndex();\n if (idx >= 0 && this.viewport) {\n this.viewport.scrollToIndex(idx);\n }\n });\n }\n\n /** Returns a stable DOM ID for the option at the given index. */\n optionIdAt(index: number): string {\n const opts = this.options();\n if (index < 0 || index >= opts.length) {\n return '';\n }\n return `wm-combobox-${this.instanceId}-opt-${this.keyFor(opts[index].value)}`;\n }\n\n /** Handle mousedown on an option — emits event and prevents default. */\n protected onOptionMousedown(event: MouseEvent, option: ComboboxOption, index: number): void {\n event.preventDefault();\n if (!option.disabled) {\n this.optionClicked.emit({ option, index });\n }\n }\n\n /** Check whether a value is currently selected. */\n protected isSelected(value: unknown): boolean {\n return this.selectedValues().has(value);\n }\n\n /** Get label segments for the option at the given virtual-scroll index. */\n protected segmentsAt(index: number): LabelSegment[] {\n return this.segmentedLabels()[index] ?? [{ text: '', match: false }];\n }\n\n /**\n * Returns a stable string key for an option value.\n * Strings/numbers use the value directly. Objects use a monotonic index.\n */\n private keyFor(value: unknown): string {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n let key = this.optionKeyMap.get(value);\n if (key == null) {\n key = `obj-${this.nextObjectIndex++}`;\n this.optionKeyMap.set(value, key);\n }\n return key;\n }\n\n /**\n * Split a label into segments where the query matches (case-insensitive).\n * Returns an array of { text, match } segments.\n */\n private splitLabel(label: string, query: string): LabelSegment[] {\n if (!query) {\n return [{ text: label, match: false }];\n }\n const segments: LabelSegment[] = [];\n const lowerLabel = label.toLowerCase();\n const lowerQuery = query.toLowerCase();\n let cursor = 0;\n while (cursor < label.length) {\n const matchIndex = lowerLabel.indexOf(lowerQuery, cursor);\n if (matchIndex === -1) {\n segments.push({ text: label.slice(cursor), match: false });\n break;\n }\n if (matchIndex > cursor) {\n segments.push({ text: label.slice(cursor, matchIndex), match: false });\n }\n segments.push({\n text: label.slice(matchIndex, matchIndex + query.length),\n match: true,\n });\n cursor = matchIndex + query.length;\n }\n return segments;\n }\n}\n","@if (loading()) {\n <div class=\"wm-cb-loading\" aria-live=\"polite\">\n <svg\n class=\"wm-cb-spinner\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <circle\n cx=\"10\" cy=\"10\" r=\"8\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-dasharray=\"40 60\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"wm-cb-loading-text\">Loading…</span>\n </div>\n} @else if (showEmpty()) {\n <div class=\"wm-cb-empty\" aria-live=\"polite\">{{ emptyText() }}</div>\n} @else {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemHeight()\"\n [style.height.px]=\"viewportHeight()\"\n class=\"wm-cb-viewport\"\n >\n <div\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n >\n <div\n *cdkVirtualFor=\"let opt of options(); let i = index\"\n role=\"option\"\n class=\"wm-cb-option\"\n [id]=\"optionIdAt(i)\"\n [class.is-highlighted]=\"i === highlightIndex()\"\n [class.is-selected]=\"isSelected(opt.value)\"\n [class.is-disabled]=\"!!opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt.value)\"\n [attr.aria-disabled]=\"opt.disabled ? true : null\"\n (mousedown)=\"onOptionMousedown($event, opt, i)\"\n >\n <span class=\"wm-cb-option-label\">\n @for (seg of segmentsAt(i); track $index) {\n @if (seg.match) {\n <b class=\"wm-cb-match\">{{ seg.text }}</b>\n } @else {\n {{ seg.text }}\n }\n }\n </span>\n @if (isSelected(opt.value)) {\n <svg\n class=\"wm-cb-check\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <polyline\n points=\"20 6 9 17 4 12\"\n stroke=\"currentColor\" stroke-width=\"2.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"\n />\n </svg>\n }\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n Subject,\n Subscription,\n debounceTime,\n switchMap,\n catchError,\n of,\n finalize,\n} from 'rxjs';\nimport { ComboboxOption } from './option';\nimport { ComboboxPanel } from './combobox-panel';\n\n/**\n * WmCombobox — Accessible combobox with filtering, single/multi-select,\n * freeform entry, chips, and virtual-scrolled panel.\n *\n * Built on Angular CDK Overlay and the WAI-ARIA APG combobox pattern.\n * DOM focus ALWAYS stays on the input; assistive tech focus moves via\n * `aria-activedescendant`.\n *\n * Implements ControlValueAccessor for both template-driven and reactive forms.\n *\n * Usage:\n * <!-- Single-select -->\n * <wm-combobox [options]=\"opts\" [(value)]=\"selected\" />\n *\n * <!-- Multi-select with chips -->\n * <wm-combobox [options]=\"opts\" [(values)]=\"selectedIds\" [multiple]=\"true\" />\n *\n * <!-- Async filter -->\n * <wm-combobox [options]=\"opts\" [filterFn]=\"searchApi\" />\n *\n * <!-- Reactive form -->\n * <wm-combobox formControlName=\"tag\" [options]=\"tags\" />\n */\n@Component({\n selector: 'wm-combobox',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, ComboboxPanel],\n templateUrl: './combobox.html',\n styleUrl: './combobox.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => WmCombobox),\n multi: true,\n },\n ],\n})\nexport class WmCombobox implements ControlValueAccessor, OnDestroy {\n // ── Public inputs ──────────────────────────────────────────────────────\n\n /** Full option list (before filtering). */\n readonly options = input<ComboboxOption[]>([]);\n\n /** Selected value (single-select). Two-way bindable. */\n readonly value = model<unknown>(null);\n\n /** Selected values (multi-select). Two-way bindable. */\n readonly values = model<unknown[]>([]);\n\n /** Enable multi-select mode with chips. */\n readonly multiple = input(false);\n\n /** Allow typed text to be accepted as a freeform value. */\n readonly allowFreeform = input(false);\n\n /** Placeholder text for the input. */\n readonly placeholder = input('Search\\u2026');\n\n /** Disable the combobox. */\n readonly disabled = input(false);\n\n /** Custom async filter function. Overrides default substring matching. */\n readonly filterFn = input<\n ((query: string) => import('rxjs').Observable<ComboboxOption[]>) | null\n >(null);\n\n /** Pixel height of each option row. */\n readonly itemHeight = input(36);\n\n /** Max panel height in pixels. */\n readonly maxPanelHeight = input(256);\n\n // ── Public outputs ─────────────────────────────────────────────────────\n\n /** Emitted when the input text changes. */\n readonly query = output<string>();\n\n /** Emitted when the panel opens. */\n readonly opened = output<void>();\n\n /** Emitted when the panel closes. */\n readonly closed = output<void>();\n\n // ── View children ──────────────────────────────────────────────────────\n\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n protected readonly panel = viewChild(ComboboxPanel);\n\n // ── Internal state ─────────────────────────────────────────────────────\n\n protected readonly isOpen = signal(false);\n protected readonly inputText = signal('');\n protected readonly highlightIndex = signal(-1);\n protected readonly asyncLoading = signal(false);\n protected readonly asyncResults = signal<ComboboxOption[] | null>(null);\n\n /** Text the input had when the panel opened — restored on Escape. */\n private savedText = '';\n\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n // ── CVA state ──────────────────────────────────────────────────────────\n\n private onChangeFn: (v: unknown) => void = () => {};\n protected onTouchedFn: () => void = () => {};\n\n // ── Async filter plumbing ──────────────────────────────────────────────\n\n private readonly filterSubject = new Subject<string>();\n private filterSub: Subscription | null = null;\n\n // ── Live region debounce ───────────────────────────────────────────────\n\n protected readonly liveText = signal('');\n private liveTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ── Computed ───────────────────────────────────────────────────────────\n\n /** Set of currently selected values for the panel. */\n protected readonly selectedValues = computed(() => {\n if (this.multiple()) {\n return new Set<unknown>(this.values());\n }\n const v = this.value();\n return v != null ? new Set<unknown>([v]) : new Set<unknown>();\n });\n\n /** Filtered options shown in the panel. */\n protected readonly filteredOptions = computed(() => {\n // If async filterFn is set and we have results, use those.\n const asyncRes = this.asyncResults();\n if (this.filterFn() && asyncRes !== null) {\n return asyncRes;\n }\n\n const query = this.inputText().trim().toLowerCase();\n const opts = this.options();\n if (!query) return opts;\n return opts.filter(o => o.label.toLowerCase().includes(query));\n });\n\n /** Chips for multi-select mode. */\n protected readonly chips = computed(() => {\n if (!this.multiple()) return [];\n const vals = this.values();\n const opts = this.options();\n return vals.map(v => {\n const opt = opts.find(o => o.value === v);\n return { value: v, label: opt?.label ?? String(v) };\n });\n });\n\n /** The aria-activedescendant value. */\n protected readonly activeDescendant = computed(() => {\n const idx = this.highlightIndex();\n const p = this.panel();\n if (idx < 0 || !p) return null;\n return p.optionIdAt(idx) || null;\n });\n\n /** The listbox ID from the panel (for aria-controls). */\n protected readonly panelListboxId = computed(() => {\n const p = this.panel();\n return p ? p.listboxId : null;\n });\n\n /** Freeform hint for empty state. */\n protected readonly freeformHint = computed(() => {\n if (!this.allowFreeform()) return '';\n const text = this.inputText().trim();\n return text ? `Press Enter to add \"${text}\"` : '';\n });\n\n /** Overlay width tracks host element width. */\n protected get overlayWidth(): number {\n return this.hostEl.nativeElement.offsetWidth || 200;\n }\n\n /** Overlay positions: below-first with above-fallback. */\n protected readonly positions: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n ];\n\n constructor() {\n // Wire up async filter subscription.\n this.filterSub = this.filterSubject\n .pipe(\n debounceTime(200),\n switchMap(q => {\n const fn = this.filterFn();\n if (!fn) return of(null);\n this.asyncLoading.set(true);\n return fn(q).pipe(\n catchError(() => of([] as ComboboxOption[])),\n finalize(() => this.asyncLoading.set(false)),\n );\n }),\n )\n .subscribe(results => {\n if (results !== null) {\n this.asyncResults.set(results);\n }\n });\n\n // Update live region when filtered options change (debounced 300ms).\n effect(() => {\n const count = this.filteredOptions().length;\n const total = this.options().length;\n // Read isOpen to track it in this effect.\n const open = this.isOpen();\n\n // Clear any pending timer.\n if (this.liveTimer !== null) {\n clearTimeout(this.liveTimer);\n }\n\n if (!open) {\n this.liveText.set('');\n return;\n }\n\n this.liveTimer = setTimeout(() => {\n if (count === 0) {\n this.liveText.set('No results');\n } else if (this.filterFn() || this.inputText().trim()) {\n this.liveText.set(\n total > 0 && count < total\n ? `${count} of ${total} results`\n : `${count} results available`,\n );\n } else {\n this.liveText.set(`${count} results available`);\n }\n }, 300);\n });\n }\n\n ngOnDestroy(): void {\n this.filterSub?.unsubscribe();\n if (this.liveTimer !== null) {\n clearTimeout(this.liveTimer);\n }\n }\n\n // ── CVA ────────────────────────────────────────────────────────────────\n\n writeValue(value: unknown): void {\n if (this.multiple()) {\n const arr = Array.isArray(value) ? value : [];\n this.values.set(arr);\n } else {\n this.value.set(value);\n // Show label for current value.\n const opt = this.options().find(o => o.value === value);\n this.inputText.set(opt?.label ?? '');\n }\n }\n\n registerOnChange(fn: (v: unknown) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n // ── Panel open/close ───────────────────────────────────────────────────\n\n protected open(highlightFirst = false, highlightLast = false): void {\n if (this.disabled() || this.isOpen()) return;\n this.savedText = this.inputText();\n this.isOpen.set(true);\n this.opened.emit();\n\n if (highlightFirst) {\n this.highlightFirst();\n } else if (highlightLast) {\n this.highlightLast();\n } else {\n this.highlightIndex.set(-1);\n }\n }\n\n protected close(restoreText = false): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.highlightIndex.set(-1);\n this.closed.emit();\n\n if (restoreText) {\n this.inputText.set(this.savedText);\n } else if (!this.multiple()) {\n // Restore label of selected value.\n this.syncInputToSelection();\n }\n }\n\n // ── Input events ───────────────────────────────────────────────────────\n\n protected onInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.inputText.set(text);\n this.query.emit(text);\n this.highlightIndex.set(-1);\n this.asyncResults.set(null);\n\n if (this.filterFn()) {\n this.filterSubject.next(text);\n }\n\n if (!this.isOpen()) {\n this.open();\n }\n }\n\n protected onBlur(): void {\n this.onTouchedFn();\n\n // Short delay so mousedown on an option fires first.\n setTimeout(() => {\n if (!this.isOpen()) return;\n\n if (this.allowFreeform() && !this.multiple()) {\n this.acceptFreeform();\n }\n\n this.close();\n }, 150);\n }\n\n protected onTriggerClick(): void {\n if (this.disabled()) return;\n\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n // In single-select, select the input text for easy re-typing.\n if (!this.multiple() && this.inputText()) {\n const el = this.inputRef()?.nativeElement;\n el?.select();\n }\n }\n }\n\n // ── Keyboard ───────────────────────────────────────────────────────────\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n const open = this.isOpen();\n const hi = this.highlightIndex();\n const opts = this.filteredOptions();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!open) {\n if (event.altKey) {\n this.open(false, false); // Alt+ArrowDown: open without highlight\n } else {\n this.open(true, false); // ArrowDown: open + highlight first\n }\n } else if (hi < 0) {\n this.highlightFirst();\n } else {\n const next = this.nextEnabled(hi, 1, opts);\n this.highlightIndex.set(next);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (!open) {\n this.open(false, true); // ArrowUp: open + highlight last\n } else if (event.altKey) {\n this.close();\n } else if (hi < 0) {\n this.highlightLast();\n } else {\n const prev = this.nextEnabled(hi, -1, opts);\n this.highlightIndex.set(prev);\n }\n break;\n\n case 'Enter':\n if (open) {\n event.preventDefault();\n if (hi >= 0 && hi < opts.length) {\n this.selectOption(opts[hi]);\n } else if (this.allowFreeform() && this.inputText().trim()) {\n this.acceptFreeform();\n this.close();\n }\n }\n break;\n\n case 'Escape':\n if (open) {\n event.preventDefault();\n this.close(true); // Restore text\n } else {\n // Clear input text.\n this.inputText.set('');\n this.query.emit('');\n }\n break;\n\n case 'Tab':\n if (open) {\n if (hi >= 0 && hi < opts.length) {\n this.selectOption(opts[hi]);\n }\n this.close();\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'Home':\n case 'End':\n // Clear highlight so cursor navigation works normally.\n if (open && hi >= 0) {\n this.highlightIndex.set(-1);\n }\n break;\n\n case 'Backspace':\n if (open && hi >= 0) {\n // Clear highlight, let deletion happen in input.\n this.highlightIndex.set(-1);\n } else if (\n this.multiple() &&\n !this.inputText() &&\n this.values().length > 0\n ) {\n // Remove last chip.\n this.removeChipByIndex(this.values().length - 1);\n }\n break;\n\n default:\n // Printable character: clear highlight, let it type.\n if (open && hi >= 0 && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n this.highlightIndex.set(-1);\n }\n // If closed and printable, open panel.\n if (!open && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n this.open();\n }\n break;\n }\n }\n\n // ── Option selection ───────────────────────────────────────────────────\n\n protected onOptionClicked(event: { option: ComboboxOption; index: number }): void {\n this.selectOption(event.option);\n // Refocus input since mousedown prevented default.\n this.inputRef()?.nativeElement.focus();\n }\n\n private selectOption(opt: ComboboxOption): void {\n if (opt.disabled) return;\n\n if (this.multiple()) {\n const current = this.values();\n const idx = current.indexOf(opt.value);\n if (idx >= 0) {\n // Deselect.\n this.values.set(current.filter((_, i) => i !== idx));\n } else {\n this.values.set([...current, opt.value]);\n }\n // Clear input, keep panel open.\n this.inputText.set('');\n this.query.emit('');\n this.highlightIndex.set(-1);\n this.onChangeFn(this.values());\n } else {\n this.value.set(opt.value);\n this.inputText.set(opt.label);\n this.onChangeFn(opt.value);\n this.close();\n }\n }\n\n // ── Chip removal ───────────────────────────────────────────────────────\n\n protected removeChip(chipValue: unknown): void {\n const current = this.values();\n this.values.set(current.filter(v => v !== chipValue));\n this.onChangeFn(this.values());\n this.inputRef()?.nativeElement.focus();\n }\n\n private removeChipByIndex(index: number): void {\n const current = this.values();\n this.values.set(current.filter((_, i) => i !== index));\n this.onChangeFn(this.values());\n }\n\n // ── Freeform ───────────────────────────────────────────────────────────\n\n private acceptFreeform(): void {\n const text = this.inputText().trim();\n if (!text) return;\n\n if (this.multiple()) {\n const current = this.values();\n if (!current.includes(text)) {\n this.values.set([...current, text]);\n this.onChangeFn(this.values());\n }\n this.inputText.set('');\n this.query.emit('');\n } else {\n this.value.set(text);\n this.onChangeFn(text);\n }\n }\n\n // ── Highlight helpers ──────────────────────────────────────────────────\n\n private highlightFirst(): void {\n const opts = this.filteredOptions();\n for (let i = 0; i < opts.length; i++) {\n if (!opts[i].disabled) {\n this.highlightIndex.set(i);\n return;\n }\n }\n this.highlightIndex.set(-1);\n }\n\n private highlightLast(): void {\n const opts = this.filteredOptions();\n for (let i = opts.length - 1; i >= 0; i--) {\n if (!opts[i].disabled) {\n this.highlightIndex.set(i);\n return;\n }\n }\n this.highlightIndex.set(-1);\n }\n\n /**\n * Find the next enabled option in the given direction.\n * Returns -1 if wrapping past the end/start (clears highlight).\n */\n private nextEnabled(\n from: number,\n direction: 1 | -1,\n opts: ComboboxOption[],\n ): number {\n let i = from + direction;\n if (i < 0 || i >= opts.length) return -1; // Wrap clears highlight.\n while (i >= 0 && i < opts.length) {\n if (!opts[i].disabled) return i;\n i += direction;\n }\n return -1;\n }\n\n /** Sync input text to the currently selected option label (single-select). */\n private syncInputToSelection(): void {\n const v = this.value();\n if (v == null) {\n this.inputText.set('');\n return;\n }\n const opt = this.options().find(o => o.value === v);\n this.inputText.set(opt?.label ?? '');\n }\n}\n","<!-- Trigger wrapper — anchors the CDK overlay -->\n<div\n class=\"wm-cb-trigger\"\n [class.is-open]=\"isOpen()\"\n [class.is-disabled]=\"disabled()\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick()\"\n>\n <!-- Multi-select chips -->\n @if (multiple()) {\n @for (chip of chips(); track chip.value) {\n <span class=\"wm-cb-chip\">\n <span class=\"wm-cb-chip-label\">{{ chip.label }}</span>\n <button\n type=\"button\"\n class=\"wm-cb-chip-remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Remove ' + chip.label\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation()\"\n (click)=\"$event.stopPropagation(); removeChip(chip.value)\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </span>\n }\n }\n\n <!-- Text input -->\n <input\n #inputEl\n type=\"text\"\n class=\"wm-cb-input\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.placeholder]=\"chips().length ? '' : placeholder()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n [attr.aria-autocomplete]=\"allowFreeform() ? 'both' : 'list'\"\n [attr.aria-activedescendant]=\"activeDescendant()\"\n [attr.aria-controls]=\"isOpen() ? panelListboxId() : null\"\n [disabled]=\"disabled() || null\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Chevron -->\n <svg\n class=\"wm-cb-chevron\"\n [class.is-open]=\"isOpen()\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n</div>\n\n<!-- Live region for screen readers -->\n<span class=\"wm-cb-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ liveText() }}\n</span>\n\n<!-- Dropdown panel in CDK overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"wm-cb-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div class=\"wm-cb-panel\">\n <wm-combobox-panel\n [options]=\"filteredOptions()\"\n [highlightIndex]=\"highlightIndex()\"\n [selectedValues]=\"selectedValues()\"\n [multiple]=\"multiple()\"\n [itemHeight]=\"itemHeight()\"\n [maxHeight]=\"maxPanelHeight()\"\n [filterQuery]=\"inputText()\"\n [loading]=\"asyncLoading()\"\n [freeformHint]=\"freeformHint()\"\n (optionClicked)=\"onOptionClicked($event)\"\n />\n </div>\n</ng-template>\n","import { Injectable, signal } from '@angular/core';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'progress';\n\nexport interface Toast {\n id: number;\n message: string;\n type: ToastType;\n /** If true, toast does not auto-dismiss. Caller must dismiss it manually. */\n persistent?: boolean;\n /** Epoch ms when this toast was created (used for elapsed time display). */\n createdAt?: number;\n /** Callback invoked when the user clicks the Cancel button (progress toasts only). */\n onCancel?: () => void;\n}\n\nlet nextId = 0;\n\n/**\n * WmToastService — Application-wide toast notification manager.\n *\n * Provided in root; inject anywhere and call success(), error(), info(), or progress().\n * Render `<wm-toast-container>` once at the app root to display toasts.\n *\n * Auto-dismiss: success/info after 4 s, error after 6 s.\n * Progress toasts persist until explicitly dismissed.\n * Custom duration via show(message, type, durationMs).\n */\n@Injectable({ providedIn: 'root' })\nexport class WmToastService {\n readonly toasts = signal<Toast[]>([]);\n\n show(message: string, type: ToastType = 'info', duration?: number): number {\n const id = ++nextId;\n this.toasts.update(list => [...list, { id, message, type }]);\n const ms = duration ?? (type === 'error' ? 6000 : 4000);\n setTimeout(() => this.dismiss(id), ms);\n return id;\n }\n\n success(message: string): number { return this.show(message, 'success'); }\n error(message: string): number { return this.show(message, 'error'); }\n info(message: string): number { return this.show(message, 'info'); }\n\n /**\n * Show a persistent progress toast with spinner and elapsed timer.\n * Returns the toast ID — caller must call dismiss(id) when done.\n *\n * @param message - Display message (e.g. \"Generating docs…\")\n * @param onCancel - Optional callback invoked when the user clicks Cancel.\n * The caller should abort the operation and then dismiss the toast.\n */\n progress(message: string, onCancel?: () => void): number {\n const id = ++nextId;\n this.toasts.update(list => [\n ...list,\n { id, message, type: 'progress', persistent: true, createdAt: Date.now(), onCancel },\n ]);\n return id;\n }\n\n dismiss(id: number): void {\n this.toasts.update(list => list.filter(t => t.id !== id));\n }\n}\n","import { Component, inject, ChangeDetectionStrategy, signal, OnDestroy } from '@angular/core';\nimport { WmToastService, Toast } from './toast.service';\n\n/**\n * WmToastContainer — Renders the current stack of toasts.\n *\n * Place once at the application root (e.g. inside the shell or app component).\n * Uses inline SVG icons — no external icon library dependency.\n *\n * Accessibility:\n * - Container has role=\"log\" + aria-live=\"polite\" so new toasts are announced\n * - Each toast has role=\"status\"\n * - Dismiss button has an accessible label\n */\n@Component({\n selector: 'wm-toast-container',\n templateUrl: './toast-container.html',\n styleUrl: './toast-container.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WmToastContainer implements OnDestroy {\n protected readonly toastService = inject(WmToastService);\n\n /** Tick signal that updates every second — drives the elapsed time display. */\n protected readonly tick = signal(Date.now());\n private tickInterval = setInterval(() => {\n // Only tick when there are progress toasts with createdAt\n if (this.toastService.toasts().some(t => t.type === 'progress' && t.createdAt)) {\n this.tick.set(Date.now());\n }\n }, 1000);\n\n ngOnDestroy(): void {\n clearInterval(this.tickInterval);\n }\n\n protected dismiss(id: number): void {\n this.toastService.dismiss(id);\n }\n\n protected cancel(toast: Toast): void {\n toast.onCancel?.();\n this.toastService.dismiss(toast.id);\n }\n\n protected typeClass(toast: Toast): string {\n return `wm-toast wm-toast--${toast.type}`;\n }\n\n protected elapsed(createdAt: number): string {\n const now = this.tick(); // reactive dependency on tick\n const diff = Math.max(0, Math.floor((now - createdAt) / 1000));\n if (diff < 60) return `${diff}s`;\n const mins = Math.floor(diff / 60);\n const secs = diff % 60;\n return `${mins}m ${secs.toString().padStart(2, '0')}s`;\n }\n}\n","<div class=\"wm-toast-container\" role=\"log\" aria-live=\"polite\" aria-label=\"Notifications\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div [class]=\"typeClass(toast)\" role=\"status\">\n <!-- Success icon (check-circle) -->\n @if (toast.type === 'success') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n <!-- Error icon (x-circle) -->\n @if (toast.type === 'error') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n <!-- Info icon -->\n @if (toast.type === 'info') {\n <svg class=\"wm-toast-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n }\n <!-- Progress spinner -->\n @if (toast.type === 'progress') {\n <span class=\"wm-toast-spinner\" aria-hidden=\"true\"></span>\n }\n\n <span class=\"wm-toast-message\">\n {{ toast.message }}\n @if (toast.type === 'progress' && toast.createdAt) {\n <span class=\"wm-toast-elapsed\"> ({{ elapsed(toast.createdAt) }})</span>\n }\n </span>\n\n <!-- Cancel button for progress toasts with an onCancel callback -->\n @if (toast.type === 'progress' && toast.onCancel) {\n <button class=\"wm-toast-cancel\" (click)=\"cancel(toast)\" aria-label=\"Cancel operation\">Cancel</button>\n }\n\n <!-- Dismiss button — always shown -->\n <button class=\"wm-toast-dismiss\" (click)=\"dismiss(toast.id)\" aria-label=\"Dismiss notification\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n }\n</div>\n","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { invoke } from '@tauri-apps/api/core';\nimport { WmToastService } from '../toast/toast.service';\nimport type { LicenseStatus } from './license.types';\n\n@Injectable({ providedIn: 'root' })\nexport class WmLicenseService {\n private toast = inject(WmToastService);\n\n readonly license = signal<LicenseStatus | null>(null);\n readonly isLicensed = computed(() => this.license()?.valid ?? false);\n readonly orgName = computed(() => this.license()?.org ?? null);\n\n async checkLicense(): Promise<void> {\n try {\n const status = await invoke<LicenseStatus>('get_license_status');\n this.license.set(status);\n if (!status.valid && status.error) {\n const message = status.error === 'expired'\n ? 'Your license key has expired.'\n : 'Your license key is not valid.';\n this.toast.error(message);\n }\n } catch (e) {\n console.error('License check failed:', e);\n this.license.set(null);\n }\n }\n\n async installKey(jwt: string): Promise<LicenseStatus> {\n const status = await invoke<LicenseStatus>('install_license', { key: jwt });\n this.license.set(status);\n return status;\n }\n}\n","import { Component, ChangeDetectionStrategy, signal, output, inject } from '@angular/core';\nimport { WmLicenseService } from './license.service';\nimport { WmButton } from '../button/button';\n\n@Component({\n selector: 'wm-license-nudge',\n standalone: true,\n imports: [WmButton],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './license-nudge.html',\n styleUrl: './license-nudge.css',\n})\nexport class WmLicenseNudge {\n private licenseService = inject(WmLicenseService);\n\n dismissed = signal(false);\n enterLicense = output<void>();\n\n protected readonly shouldShow = () =>\n !this.licenseService.isLicensed() && !this.dismissed();\n\n dismiss(): void {\n this.dismissed.set(true);\n }\n\n onEnterLicense(): void {\n this.enterLicense.emit();\n }\n}\n","@if (shouldShow()) {\n <div class=\"wm-license-nudge\">\n <span class=\"wm-license-nudge__text\">\n Using this at work? Organizations require a commercial license.\n </span>\n <div class=\"wm-license-nudge__actions\">\n <wm-button variant=\"ghost\" size=\"sm\" (click)=\"onEnterLicense()\">Enter License Key</wm-button>\n <wm-button variant=\"ghost\" size=\"sm\" (click)=\"dismiss()\">Dismiss</wm-button>\n </div>\n </div>\n}\n","import { Component, ChangeDetectionStrategy, signal, input, output, inject } from '@angular/core';\nimport { WmModal } from '../modal/modal';\nimport { WmButton } from '../button/button';\nimport { WmLicenseService } from './license.service';\nimport type { LicenseStatus } from './license.types';\n\n@Component({\n selector: 'wm-license-dialog',\n standalone: true,\n imports: [WmModal, WmButton],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './license-dialog.html',\n styleUrl: './license-dialog.css',\n})\nexport class WmLicenseDialog {\n private licenseService = inject(WmLicenseService);\n\n visible = input.required<boolean>();\n dismiss = output<void>();\n\n keyInput = signal('');\n validationResult = signal<LicenseStatus | null>(null);\n validating = signal(false);\n installed = signal(false);\n\n onDismiss(): void {\n this.reset();\n this.dismiss.emit();\n }\n\n onKeyInput(event: Event): void {\n const value = (event.target as HTMLTextAreaElement).value;\n this.keyInput.set(value);\n this.validationResult.set(null);\n this.installed.set(false);\n }\n\n async validate(): Promise<void> {\n const jwt = this.keyInput().trim();\n if (!jwt) return;\n\n this.validating.set(true);\n try {\n const status = await this.licenseService.installKey(jwt);\n this.validationResult.set(status);\n if (status.valid) {\n this.installed.set(true);\n }\n } catch (e) {\n this.validationResult.set({\n valid: false,\n org: null,\n product: '',\n seats: null,\n tier: null,\n expires: null,\n key_id: null,\n error: String(e),\n });\n } finally {\n this.validating.set(false);\n }\n }\n\n private reset(): void {\n this.keyInput.set('');\n this.validationResult.set(null);\n this.validating.set(false);\n this.installed.set(false);\n }\n}\n","<wm-modal [visible]=\"visible()\" (dismiss)=\"onDismiss()\">\n <div class=\"wm-license-dialog\">\n <h2 class=\"wm-license-dialog__title\">Enter License Key</h2>\n\n @if (installed()) {\n <div class=\"wm-license-dialog__success\">\n <p class=\"wm-license-dialog__success-text\">License activated successfully.</p>\n <dl class=\"wm-license-dialog__details\">\n <dt>Organization</dt>\n <dd>{{ validationResult()?.org }}</dd>\n <dt>Seats</dt>\n <dd>{{ validationResult()?.seats }}</dd>\n <dt>Expires</dt>\n <dd>{{ validationResult()?.expires?.slice(0, 10) }}</dd>\n </dl>\n <wm-button variant=\"primary\" size=\"sm\" (click)=\"onDismiss()\">Done</wm-button>\n </div>\n } @else {\n <textarea\n class=\"wm-license-dialog__input\"\n placeholder=\"Paste your license key here...\"\n [value]=\"keyInput()\"\n (input)=\"onKeyInput($event)\"\n rows=\"4\"\n ></textarea>\n\n @if (validationResult(); as result) {\n @if (!result.valid) {\n <p class=\"wm-license-dialog__error\">\n @if (result.error === 'expired') {\n This license key has expired.\n } @else {\n This is not a valid license key for this product.\n }\n </p>\n }\n }\n\n <div class=\"wm-license-dialog__actions\">\n <wm-button\n variant=\"primary\"\n size=\"sm\"\n [disabled]=\"!keyInput().trim() || validating()\"\n (click)=\"validate()\"\n >\n @if (validating()) { Validating... } @else { Activate }\n </wm-button>\n </div>\n }\n </div>\n</wm-modal>\n","// Components\r\nexport { WmModal } from './modal/modal';\r\nexport { WmDialog } from './dialog/dialog';\r\nexport { WmSelect } from './select/select';\r\nexport { WmPopover } from './popover/popover';\r\nexport { WmAutoFocus } from './popover/auto-focus.directive';\r\nexport { WmTabs } from './tabs/tabs';\r\nexport { WmTab } from './tabs/tab';\r\nexport { WmButton } from './button/button';\r\nexport { Checkbox } from './checkbox/checkbox';\r\nexport { NumberInput } from './number-input/number-input';\r\nexport { Toggle } from './toggle/toggle';\r\nexport { GhostField } from './ghost-field/ghost-field';\r\nexport { PageHeader } from './page-header/page-header';\r\nexport { WmCombobox } from './combobox/combobox';\r\nexport { WmToastContainer } from './toast/toast-container';\r\nexport { WmToastService } from './toast/toast.service';\r\n\r\n// License\r\nexport { WmLicenseService } from './license/license.service';\r\nexport { WmLicenseNudge } from './license/license-nudge';\r\nexport { WmLicenseDialog } from './license/license-dialog';\r\n\r\n// Types\r\nexport type { DialogSize } from './dialog/dialog';\r\nexport type { SelectOption } from './select/option';\r\nexport type { ButtonVariant, ButtonSize } from './button/button';\r\nexport type { ToastType, Toast } from './toast/toast.service';\r\nexport type { ComboboxOption } from './combobox/option';\r\nexport type { LicenseStatus } from './license/license.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wildmason/aegis",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "description": "Aegis design system — CSS tokens and Angular component library",
5
5
  "scripts": {
6
6
  "build": "ng-packagr -p ng-package.json",
package/themes.css CHANGED
@@ -129,6 +129,16 @@
129
129
  var(--wm-color-warning) 25%,
130
130
  transparent
131
131
  );
132
+
133
+ /* "Readable" accent — used in `color:` (text) contexts where WCAG AA
134
+ contrast (4.5:1) must be met against bg-base / bg-raised / bg-float.
135
+ Defaults to the theme's --wm-color-accent so most themes need no
136
+ override; themes whose accent is too low-contrast for body text
137
+ (currently Stone & Moss) override this to a lighter sibling while
138
+ keeping --wm-color-accent itself for fills, focus rings, and other
139
+ non-text usages where 3:1 (WCAG 1.4.11) is sufficient. Falls back
140
+ to --wm-color-accent at use-time via CSS variable evaluation. */
141
+ --wm-color-accent-readable: var(--wm-color-accent);
132
142
  }
133
143
 
134
144
  /* ================================================================
@@ -870,6 +880,12 @@
870
880
  --wm-color-accent: #82a682;
871
881
  --wm-color-accent-hover: #94b894;
872
882
  --wm-color-accent-text: #161817;
883
+ /* Brighter sage variant for "accent as text" contexts (active tab
884
+ labels, current nav items, link-style buttons). #82a682 fails
885
+ WCAG AA 4.5:1 against bg-float (3.30:1); #9bc99b clears 4.74:1
886
+ while staying in the moss-green hue family. Used wherever components
887
+ reference --wm-color-accent-readable instead of --wm-color-accent. */
888
+ --wm-color-accent-readable: #9bc99b;
873
889
 
874
890
  /* Semantic */
875
891
  --wm-color-success: #a0c5a0;