angular-visuals 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -228,7 +228,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
228
228
  }]
229
229
  }], ctorParameters: () => [] });
230
230
 
231
- class AvDropdown {
231
+ class AvNavDropdown {
232
232
  config = inject(VISUALS_CONFIG);
233
233
  themeService = inject(ThemeService);
234
234
  badge = input(null, /* @ts-ignore */
@@ -244,20 +244,20 @@ class AvDropdown {
244
244
  expandedChange = output();
245
245
  internalExpanded = signal(false, /* @ts-ignore */
246
246
  ...(ngDevMode ? [{ debugName: "internalExpanded" }] : /* istanbul ignore next */ []));
247
- panelId = `av-dropdown-${Math.random().toString(36).slice(2, 9)}`;
247
+ panelId = `av-nav-dropdown-${Math.random().toString(36).slice(2, 9)}`;
248
248
  isExpanded = computed(() => this.expanded() ?? this.internalExpanded(), /* @ts-ignore */
249
249
  ...(ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []));
250
250
  themeVars = computed(() => {
251
251
  const variant = this.variant();
252
252
  const isDark = this.themeService.dark();
253
253
  return {
254
- '--av-dropdown-accent': `var(--av-${variant}-${isDark ? 400 : 500})`,
255
- '--av-dropdown-accent-hover': `var(--av-${variant}-${isDark ? 300 : 700})`,
256
- '--av-dropdown-accent-soft': isDark
254
+ '--av-nav-dropdown-accent': `var(--av-${variant}-${isDark ? 400 : 500})`,
255
+ '--av-nav-dropdown-accent-hover': `var(--av-${variant}-${isDark ? 300 : 700})`,
256
+ '--av-nav-dropdown-accent-soft': isDark
257
257
  ? `color-mix(in srgb, var(--av-${variant}-400) 16%, transparent)`
258
258
  : `var(--av-${variant}-50)`,
259
- '--av-dropdown-text': 'var(--av-color-text-muted)',
260
- '--av-dropdown-text-active': isDark ? `var(--av-${variant}-100)` : `var(--av-${variant}-800)`,
259
+ '--av-nav-dropdown-text': 'var(--av-color-text-muted)',
260
+ '--av-nav-dropdown-text-active': isDark ? `var(--av-${variant}-100)` : `var(--av-${variant}-800)`,
261
261
  };
262
262
  }, /* @ts-ignore */
263
263
  ...(ngDevMode ? [{ debugName: "themeVars" }] : /* istanbul ignore next */ []));
@@ -276,12 +276,12 @@ class AvDropdown {
276
276
  this.internalExpanded.set(next);
277
277
  this.expandedChange.emit(next);
278
278
  }
279
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvDropdown, deps: [], target: i0.ɵɵFactoryTarget.Component });
280
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AvDropdown, isStandalone: true, selector: "av-dropdown", inputs: { badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, ngImport: i0, template: "<div class=\"av-dropdown\" [ngStyle]=\"themeVars()\">\n <button\n type=\"button\"\n class=\"av-dropdown__trigger\"\n [class.av-dropdown__trigger--active]=\"isExpanded()\"\n [disabled]=\"disabled()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-expanded]=\"isExpanded()\"\n (click)=\"toggle()\"\n >\n @if (icon()) {\n <span class=\"av-dropdown__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n }\n\n <span class=\"av-dropdown__label\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content select=\"[av-dropdown-label]\"></ng-content>\n }\n </span>\n\n @if (badge() !== null && badge() !== undefined) {\n <span class=\"av-dropdown__badge\">{{ badge() }}</span>\n }\n\n <span\n class=\"av-dropdown__chevron\"\n av-icon\n name=\"expand_more\"\n size=\"md\"\n [class.av-dropdown__chevron--open]=\"isExpanded()\"\n ></span>\n </button>\n\n <div\n class=\"av-dropdown__panel\"\n [id]=\"panelId\"\n [class.av-dropdown__panel--open]=\"isExpanded()\"\n [attr.aria-hidden]=\"!isExpanded()\"\n [attr.inert]=\"isExpanded() ? null : ''\"\n >\n <div class=\"av-dropdown__panel-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;min-width:0}.av-dropdown{display:grid;gap:.125rem;min-width:0}.av-dropdown__trigger{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--av-radius-md);box-sizing:border-box;color:var(--av-dropdown-text, var(--av-color-text-muted));cursor:pointer;display:flex;font:inherit;gap:.625rem;min-height:2.5rem;min-width:0;padding:.625rem .75rem;text-align:left;transition:background-color .18s ease,border-color .18s ease,color .18s ease;width:100%}.av-dropdown__trigger:hover:not(:disabled),.av-dropdown__trigger--active{background:var(--av-dropdown-accent-soft);color:var(--av-dropdown-accent-hover)}.av-dropdown__trigger--active{border-color:color-mix(in srgb,var(--av-dropdown-accent) 24%,transparent);color:var(--av-dropdown-text-active);font-weight:700}.av-dropdown__trigger:disabled{cursor:not-allowed;opacity:.52}.av-dropdown__trigger:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--av-dropdown-accent) 24%,transparent);outline:none}.av-dropdown__icon,.av-dropdown__chevron{color:currentColor;flex:0 0 auto}.av-dropdown__label{flex:1;font-size:.875rem;line-height:1.25;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-dropdown__badge{background:var(--av-dropdown-accent);border-radius:var(--av-radius-full);color:var(--av-white);flex:0 0 auto;font-size:.6875rem;font-weight:700;line-height:1;min-width:1.25rem;padding:.25rem .375rem;text-align:center}.av-dropdown__chevron{transition:transform .18s ease}.av-dropdown__chevron--open{transform:rotate(180deg)}.av-dropdown__panel{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .2s ease,opacity .18s ease}.av-dropdown__panel--open{grid-template-rows:1fr;opacity:1}.av-dropdown__panel-inner{--av-nav-link-padding-left: 1rem;--av-nav-link-padding-y: .5rem;border-left:1px solid var(--av-color-border-soft);display:grid;gap:.125rem;margin-left:1.25rem;overflow:hidden;padding:.125rem 0 .125rem .5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: AvIcon, selector: "span[av-icon], i[av-icon]", inputs: ["name", "size"] }] });
279
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvNavDropdown, deps: [], target: i0.ɵɵFactoryTarget.Component });
280
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AvNavDropdown, isStandalone: true, selector: "av-nav-dropdown", inputs: { badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, ngImport: i0, template: "<div class=\"av-nav-dropdown\" [ngStyle]=\"themeVars()\">\n <button\n type=\"button\"\n class=\"av-nav-dropdown__trigger\"\n [class.av-nav-dropdown__trigger--active]=\"isExpanded()\"\n [disabled]=\"disabled()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-expanded]=\"isExpanded()\"\n (click)=\"toggle()\"\n >\n @if (icon()) {\n <span class=\"av-nav-dropdown__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n }\n\n <span class=\"av-nav-dropdown__label\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content select=\"[av-nav-dropdown-label]\"></ng-content>\n }\n </span>\n\n @if (badge() !== null && badge() !== undefined) {\n <span class=\"av-nav-dropdown__badge\">{{ badge() }}</span>\n }\n\n <span\n class=\"av-nav-dropdown__chevron\"\n av-icon\n name=\"expand_more\"\n size=\"md\"\n [class.av-nav-dropdown__chevron--open]=\"isExpanded()\"\n ></span>\n </button>\n\n <div\n class=\"av-nav-dropdown__panel\"\n [id]=\"panelId\"\n [class.av-nav-dropdown__panel--open]=\"isExpanded()\"\n [attr.aria-hidden]=\"!isExpanded()\"\n [attr.inert]=\"isExpanded() ? null : ''\"\n >\n <div class=\"av-nav-dropdown__panel-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;min-width:0}.av-nav-dropdown{display:grid;gap:.125rem;min-width:0}.av-nav-dropdown__trigger{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--av-radius-md);box-sizing:border-box;color:var(--av-nav-dropdown-text, var(--av-color-text-muted));cursor:pointer;display:flex;font:inherit;gap:.625rem;min-height:2.5rem;min-width:0;padding:.625rem .75rem;text-align:left;transition:background-color .18s ease,border-color .18s ease,color .18s ease;width:100%}.av-nav-dropdown__trigger:hover:not(:disabled),.av-nav-dropdown__trigger--active{background:var(--av-nav-dropdown-accent-soft);color:var(--av-nav-dropdown-accent-hover)}.av-nav-dropdown__trigger--active{border-color:color-mix(in srgb,var(--av-nav-dropdown-accent) 24%,transparent);color:var(--av-nav-dropdown-text-active);font-weight:700}.av-nav-dropdown__trigger:disabled{cursor:not-allowed;opacity:.52}.av-nav-dropdown__trigger:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--av-nav-dropdown-accent) 24%,transparent);outline:none}.av-nav-dropdown__icon,.av-nav-dropdown__chevron{color:currentColor;flex:0 0 auto}.av-nav-dropdown__label{flex:1;font-size:.875rem;line-height:1.25;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-nav-dropdown__badge{background:var(--av-nav-dropdown-accent);border-radius:var(--av-radius-full);color:var(--av-white);flex:0 0 auto;font-size:.6875rem;font-weight:700;line-height:1;min-width:1.25rem;padding:.25rem .375rem;text-align:center}.av-nav-dropdown__chevron{transition:transform .18s ease}.av-nav-dropdown__chevron--open{transform:rotate(180deg)}.av-nav-dropdown__panel{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .2s ease,opacity .18s ease}.av-nav-dropdown__panel--open{grid-template-rows:1fr;opacity:1}.av-nav-dropdown__panel-inner{--av-nav-link-padding-left: 1rem;--av-nav-link-padding-y: .5rem;border-left:1px solid var(--av-color-border-soft);display:grid;gap:.125rem;margin-left:1.25rem;overflow:hidden;padding:.125rem 0 .125rem .5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: AvIcon, selector: "span[av-icon], i[av-icon]", inputs: ["name", "size"] }] });
281
281
  }
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvDropdown, decorators: [{
282
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvNavDropdown, decorators: [{
283
283
  type: Component,
284
- args: [{ imports: [CommonModule, AvIcon], selector: 'av-dropdown', template: "<div class=\"av-dropdown\" [ngStyle]=\"themeVars()\">\n <button\n type=\"button\"\n class=\"av-dropdown__trigger\"\n [class.av-dropdown__trigger--active]=\"isExpanded()\"\n [disabled]=\"disabled()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-expanded]=\"isExpanded()\"\n (click)=\"toggle()\"\n >\n @if (icon()) {\n <span class=\"av-dropdown__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n }\n\n <span class=\"av-dropdown__label\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content select=\"[av-dropdown-label]\"></ng-content>\n }\n </span>\n\n @if (badge() !== null && badge() !== undefined) {\n <span class=\"av-dropdown__badge\">{{ badge() }}</span>\n }\n\n <span\n class=\"av-dropdown__chevron\"\n av-icon\n name=\"expand_more\"\n size=\"md\"\n [class.av-dropdown__chevron--open]=\"isExpanded()\"\n ></span>\n </button>\n\n <div\n class=\"av-dropdown__panel\"\n [id]=\"panelId\"\n [class.av-dropdown__panel--open]=\"isExpanded()\"\n [attr.aria-hidden]=\"!isExpanded()\"\n [attr.inert]=\"isExpanded() ? null : ''\"\n >\n <div class=\"av-dropdown__panel-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;min-width:0}.av-dropdown{display:grid;gap:.125rem;min-width:0}.av-dropdown__trigger{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--av-radius-md);box-sizing:border-box;color:var(--av-dropdown-text, var(--av-color-text-muted));cursor:pointer;display:flex;font:inherit;gap:.625rem;min-height:2.5rem;min-width:0;padding:.625rem .75rem;text-align:left;transition:background-color .18s ease,border-color .18s ease,color .18s ease;width:100%}.av-dropdown__trigger:hover:not(:disabled),.av-dropdown__trigger--active{background:var(--av-dropdown-accent-soft);color:var(--av-dropdown-accent-hover)}.av-dropdown__trigger--active{border-color:color-mix(in srgb,var(--av-dropdown-accent) 24%,transparent);color:var(--av-dropdown-text-active);font-weight:700}.av-dropdown__trigger:disabled{cursor:not-allowed;opacity:.52}.av-dropdown__trigger:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--av-dropdown-accent) 24%,transparent);outline:none}.av-dropdown__icon,.av-dropdown__chevron{color:currentColor;flex:0 0 auto}.av-dropdown__label{flex:1;font-size:.875rem;line-height:1.25;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-dropdown__badge{background:var(--av-dropdown-accent);border-radius:var(--av-radius-full);color:var(--av-white);flex:0 0 auto;font-size:.6875rem;font-weight:700;line-height:1;min-width:1.25rem;padding:.25rem .375rem;text-align:center}.av-dropdown__chevron{transition:transform .18s ease}.av-dropdown__chevron--open{transform:rotate(180deg)}.av-dropdown__panel{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .2s ease,opacity .18s ease}.av-dropdown__panel--open{grid-template-rows:1fr;opacity:1}.av-dropdown__panel-inner{--av-nav-link-padding-left: 1rem;--av-nav-link-padding-y: .5rem;border-left:1px solid var(--av-color-border-soft);display:grid;gap:.125rem;margin-left:1.25rem;overflow:hidden;padding:.125rem 0 .125rem .5rem}\n"] }]
284
+ args: [{ imports: [CommonModule, AvIcon], selector: 'av-nav-dropdown', template: "<div class=\"av-nav-dropdown\" [ngStyle]=\"themeVars()\">\n <button\n type=\"button\"\n class=\"av-nav-dropdown__trigger\"\n [class.av-nav-dropdown__trigger--active]=\"isExpanded()\"\n [disabled]=\"disabled()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-expanded]=\"isExpanded()\"\n (click)=\"toggle()\"\n >\n @if (icon()) {\n <span class=\"av-nav-dropdown__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n }\n\n <span class=\"av-nav-dropdown__label\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content select=\"[av-nav-dropdown-label]\"></ng-content>\n }\n </span>\n\n @if (badge() !== null && badge() !== undefined) {\n <span class=\"av-nav-dropdown__badge\">{{ badge() }}</span>\n }\n\n <span\n class=\"av-nav-dropdown__chevron\"\n av-icon\n name=\"expand_more\"\n size=\"md\"\n [class.av-nav-dropdown__chevron--open]=\"isExpanded()\"\n ></span>\n </button>\n\n <div\n class=\"av-nav-dropdown__panel\"\n [id]=\"panelId\"\n [class.av-nav-dropdown__panel--open]=\"isExpanded()\"\n [attr.aria-hidden]=\"!isExpanded()\"\n [attr.inert]=\"isExpanded() ? null : ''\"\n >\n <div class=\"av-nav-dropdown__panel-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;min-width:0}.av-nav-dropdown{display:grid;gap:.125rem;min-width:0}.av-nav-dropdown__trigger{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--av-radius-md);box-sizing:border-box;color:var(--av-nav-dropdown-text, var(--av-color-text-muted));cursor:pointer;display:flex;font:inherit;gap:.625rem;min-height:2.5rem;min-width:0;padding:.625rem .75rem;text-align:left;transition:background-color .18s ease,border-color .18s ease,color .18s ease;width:100%}.av-nav-dropdown__trigger:hover:not(:disabled),.av-nav-dropdown__trigger--active{background:var(--av-nav-dropdown-accent-soft);color:var(--av-nav-dropdown-accent-hover)}.av-nav-dropdown__trigger--active{border-color:color-mix(in srgb,var(--av-nav-dropdown-accent) 24%,transparent);color:var(--av-nav-dropdown-text-active);font-weight:700}.av-nav-dropdown__trigger:disabled{cursor:not-allowed;opacity:.52}.av-nav-dropdown__trigger:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--av-nav-dropdown-accent) 24%,transparent);outline:none}.av-nav-dropdown__icon,.av-nav-dropdown__chevron{color:currentColor;flex:0 0 auto}.av-nav-dropdown__label{flex:1;font-size:.875rem;line-height:1.25;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-nav-dropdown__badge{background:var(--av-nav-dropdown-accent);border-radius:var(--av-radius-full);color:var(--av-white);flex:0 0 auto;font-size:.6875rem;font-weight:700;line-height:1;min-width:1.25rem;padding:.25rem .375rem;text-align:center}.av-nav-dropdown__chevron{transition:transform .18s ease}.av-nav-dropdown__chevron--open{transform:rotate(180deg)}.av-nav-dropdown__panel{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .2s ease,opacity .18s ease}.av-nav-dropdown__panel--open{grid-template-rows:1fr;opacity:1}.av-nav-dropdown__panel-inner{--av-nav-link-padding-left: 1rem;--av-nav-link-padding-y: .5rem;border-left:1px solid var(--av-color-border-soft);display:grid;gap:.125rem;margin-left:1.25rem;overflow:hidden;padding:.125rem 0 .125rem .5rem}\n"] }]
285
285
  }], ctorParameters: () => [], propDecorators: { badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }] } });
286
286
 
287
287
  class AvNavLink {
@@ -900,6 +900,168 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
900
900
  args: ['keydown.escape']
901
901
  }] } });
902
902
 
903
+ class AvDropdown {
904
+ config = inject(VISUALS_CONFIG);
905
+ themeService = inject(ThemeService);
906
+ badge = input(null, /* @ts-ignore */
907
+ ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
908
+ closeOnContentClick = input(true, { ...(ngDevMode ? { debugName: "closeOnContentClick" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
909
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
910
+ icon = input('', /* @ts-ignore */
911
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
912
+ label = input('', /* @ts-ignore */
913
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
914
+ matchTriggerWidth = input(false, { ...(ngDevMode ? { debugName: "matchTriggerWidth" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
915
+ offset = input(8, { ...(ngDevMode ? { debugName: "offset" } : /* istanbul ignore next */ {}), transform: numberAttribute });
916
+ open = input(undefined, { ...(ngDevMode ? { debugName: "open" } : /* istanbul ignore next */ {}), transform: (value) => value === undefined ? undefined : booleanAttribute(value) });
917
+ placement = input('bottom-start', /* @ts-ignore */
918
+ ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
919
+ rounded = input('md', /* @ts-ignore */
920
+ ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
921
+ variant = input(this.config.theme.defaultVariant, /* @ts-ignore */
922
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
923
+ openChange = output();
924
+ triggerEl;
925
+ internalOpen = signal(false, /* @ts-ignore */
926
+ ...(ngDevMode ? [{ debugName: "internalOpen" }] : /* istanbul ignore next */ []));
927
+ panelId = `av-dropdown-${Math.random().toString(36).slice(2, 9)}`;
928
+ isOpen = computed(() => this.open() ?? this.internalOpen(), /* @ts-ignore */
929
+ ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
930
+ overlayPositions = computed(() => this.positionsFor(this.placement()), /* @ts-ignore */
931
+ ...(ngDevMode ? [{ debugName: "overlayPositions" }] : /* istanbul ignore next */ []));
932
+ themeVars = computed(() => {
933
+ const variant = this.variant();
934
+ const isDark = this.themeService.dark();
935
+ const accent = `var(--av-${variant}-${isDark ? 400 : 500})`;
936
+ return {
937
+ '--av-dropdown-accent': accent,
938
+ '--av-dropdown-accent-strong': `var(--av-${variant}-${isDark ? 300 : 600})`,
939
+ '--av-dropdown-accent-soft': isDark
940
+ ? `color-mix(in srgb, var(--av-${variant}-400) 16%, transparent)`
941
+ : `var(--av-${variant}-50)`,
942
+ '--av-dropdown-bg': 'var(--av-color-surface)',
943
+ '--av-dropdown-border': 'var(--av-color-border)',
944
+ '--av-dropdown-panel-bg': 'var(--av-color-surface-raised)',
945
+ '--av-dropdown-panel-border': 'var(--av-color-border-soft)',
946
+ '--av-dropdown-shadow': 'var(--av-shadow-raised)',
947
+ '--av-dropdown-text': 'var(--av-color-text)',
948
+ '--av-dropdown-muted': 'var(--av-color-text-muted)',
949
+ '--av-dropdown-focus-ring': `color-mix(in srgb, ${accent} 24%, transparent)`,
950
+ };
951
+ }, /* @ts-ignore */
952
+ ...(ngDevMode ? [{ debugName: "themeVars" }] : /* istanbul ignore next */ []));
953
+ constructor() {
954
+ effect(() => {
955
+ const controlledOpen = this.open();
956
+ if (controlledOpen !== undefined) {
957
+ this.internalOpen.set(controlledOpen);
958
+ }
959
+ });
960
+ }
961
+ get roundedStyle() {
962
+ if (typeof this.rounded() === 'string') {
963
+ return `var(--av-radius-${this.rounded()})`;
964
+ }
965
+ return `${this.rounded()}px`;
966
+ }
967
+ toggle() {
968
+ if (this.disabled())
969
+ return;
970
+ this.setOpen(!this.isOpen());
971
+ }
972
+ close() {
973
+ this.setOpen(false);
974
+ }
975
+ handleTriggerKeydown(event) {
976
+ if (event.key === 'Escape') {
977
+ this.close();
978
+ return;
979
+ }
980
+ if (event.key !== 'Enter' && event.key !== ' ' && event.key !== 'ArrowDown')
981
+ return;
982
+ event.preventDefault();
983
+ this.setOpen(true);
984
+ }
985
+ handlePanelClick() {
986
+ if (this.closeOnContentClick()) {
987
+ this.close();
988
+ }
989
+ }
990
+ setOpen(open) {
991
+ if (open && this.disabled())
992
+ return;
993
+ if (open === this.isOpen())
994
+ return;
995
+ this.internalOpen.set(open);
996
+ this.openChange.emit(open);
997
+ }
998
+ positionsFor(placement) {
999
+ const offset = Math.max(0, this.offset());
1000
+ const positions = {
1001
+ 'bottom-start': [
1002
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },
1003
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },
1004
+ ],
1005
+ 'bottom-end': [
1006
+ { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },
1007
+ { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },
1008
+ ],
1009
+ 'top-start': [
1010
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },
1011
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },
1012
+ ],
1013
+ 'top-end': [
1014
+ { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },
1015
+ { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },
1016
+ ],
1017
+ };
1018
+ return positions[placement] ?? positions['bottom-start'];
1019
+ }
1020
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvDropdown, deps: [], target: i0.ɵɵFactoryTarget.Component });
1021
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AvDropdown, isStandalone: true, selector: "av-dropdown", inputs: { badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, closeOnContentClick: { classPropertyName: "closeOnContentClick", publicName: "closeOnContentClick", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, matchTriggerWidth: { classPropertyName: "matchTriggerWidth", publicName: "matchTriggerWidth", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openChange: "openChange" }, viewQueries: [{ propertyName: "triggerEl", first: true, predicate: ["triggerEl"], descendants: true }], ngImport: i0, template: "<div class=\"av-dropdown\" [ngStyle]=\"themeVars()\">\n <button\n #triggerEl\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"av-dropdown__trigger\"\n [class.av-dropdown__trigger--open]=\"isOpen()\"\n [disabled]=\"disabled()\"\n [style.border-radius]=\"roundedStyle\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"menu\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n @if (label() || icon() || (badge() !== null && badge() !== undefined)) {\n @if (icon()) {\n <span class=\"av-dropdown__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n }\n\n <span class=\"av-dropdown__label\">\n {{ label() }}\n </span>\n\n @if (badge() !== null && badge() !== undefined) {\n <span class=\"av-dropdown__badge\">{{ badge() }}</span>\n }\n } @else {\n <span class=\"av-dropdown__custom-trigger\">\n <ng-content select=\"[av-dropdown-trigger]\"></ng-content>\n </span>\n }\n\n <span\n class=\"av-dropdown__chevron\"\n av-icon\n name=\"expand_more\"\n size=\"md\"\n [class.av-dropdown__chevron--open]=\"isOpen()\"\n ></span>\n </button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n class=\"av-dropdown__panel\"\n [id]=\"panelId\"\n [ngStyle]=\"themeVars()\"\n [style.border-radius]=\"roundedStyle\"\n [style.min-width.px]=\"matchTriggerWidth() ? triggerEl.offsetWidth : null\"\n role=\"menu\"\n tabindex=\"-1\"\n (click)=\"handlePanelClick()\"\n (keydown.escape)=\"close()\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block}.av-dropdown{display:inline-block}.av-dropdown__trigger{align-items:center;background:var(--av-dropdown-bg);border:1px solid var(--av-dropdown-border);color:var(--av-dropdown-text);cursor:pointer;display:inline-flex;font:inherit;font-size:.875rem;font-weight:700;gap:.5rem;justify-content:center;line-height:1.2;min-height:2.5rem;min-width:0;padding:.625rem .75rem;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease,color .18s ease}.av-dropdown__trigger:hover:not(:disabled),.av-dropdown__trigger--open{background:var(--av-dropdown-accent-soft);border-color:color-mix(in srgb,var(--av-dropdown-accent) 36%,var(--av-dropdown-border));color:var(--av-dropdown-accent-strong)}.av-dropdown__trigger:disabled{cursor:not-allowed;opacity:.52}.av-dropdown__trigger:focus-visible{box-shadow:0 0 0 3px var(--av-dropdown-focus-ring);outline:none}.av-dropdown__icon,.av-dropdown__chevron{color:currentColor;flex:0 0 auto}.av-dropdown__label,.av-dropdown__custom-trigger{min-width:0}.av-dropdown__badge{align-items:center;background:var(--av-dropdown-accent);border-radius:var(--av-radius-full);color:var(--av-white);display:inline-flex;flex:0 0 auto;font-size:.6875rem;font-weight:800;justify-content:center;line-height:1;min-width:1.25rem;padding:.25rem .375rem}.av-dropdown__chevron{transition:transform .18s ease}.av-dropdown__chevron--open{transform:rotate(180deg)}.av-dropdown__panel{animation:av-dropdown-panel-in .14s cubic-bezier(.2,0,0,1);background:var(--av-dropdown-panel-bg);border:1px solid var(--av-dropdown-panel-border);box-shadow:var(--av-dropdown-shadow);box-sizing:border-box;color:var(--av-dropdown-text);display:grid;gap:.125rem;max-width:min(24rem,calc(100vw - 2rem));min-width:12rem;padding:.375rem}@keyframes av-dropdown-panel-in{0%{opacity:0;transform:translateY(-.15rem) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i3.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: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: AvIcon, selector: "span[av-icon], i[av-icon]", inputs: ["name", "size"] }] });
1022
+ }
1023
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvDropdown, decorators: [{
1024
+ type: Component,
1025
+ args: [{ imports: [CommonModule, OverlayModule, AvIcon], selector: 'av-dropdown', standalone: true, template: "<div class=\"av-dropdown\" [ngStyle]=\"themeVars()\">\n <button\n #triggerEl\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"av-dropdown__trigger\"\n [class.av-dropdown__trigger--open]=\"isOpen()\"\n [disabled]=\"disabled()\"\n [style.border-radius]=\"roundedStyle\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"menu\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n @if (label() || icon() || (badge() !== null && badge() !== undefined)) {\n @if (icon()) {\n <span class=\"av-dropdown__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n }\n\n <span class=\"av-dropdown__label\">\n {{ label() }}\n </span>\n\n @if (badge() !== null && badge() !== undefined) {\n <span class=\"av-dropdown__badge\">{{ badge() }}</span>\n }\n } @else {\n <span class=\"av-dropdown__custom-trigger\">\n <ng-content select=\"[av-dropdown-trigger]\"></ng-content>\n </span>\n }\n\n <span\n class=\"av-dropdown__chevron\"\n av-icon\n name=\"expand_more\"\n size=\"md\"\n [class.av-dropdown__chevron--open]=\"isOpen()\"\n ></span>\n </button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n class=\"av-dropdown__panel\"\n [id]=\"panelId\"\n [ngStyle]=\"themeVars()\"\n [style.border-radius]=\"roundedStyle\"\n [style.min-width.px]=\"matchTriggerWidth() ? triggerEl.offsetWidth : null\"\n role=\"menu\"\n tabindex=\"-1\"\n (click)=\"handlePanelClick()\"\n (keydown.escape)=\"close()\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block}.av-dropdown{display:inline-block}.av-dropdown__trigger{align-items:center;background:var(--av-dropdown-bg);border:1px solid var(--av-dropdown-border);color:var(--av-dropdown-text);cursor:pointer;display:inline-flex;font:inherit;font-size:.875rem;font-weight:700;gap:.5rem;justify-content:center;line-height:1.2;min-height:2.5rem;min-width:0;padding:.625rem .75rem;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease,color .18s ease}.av-dropdown__trigger:hover:not(:disabled),.av-dropdown__trigger--open{background:var(--av-dropdown-accent-soft);border-color:color-mix(in srgb,var(--av-dropdown-accent) 36%,var(--av-dropdown-border));color:var(--av-dropdown-accent-strong)}.av-dropdown__trigger:disabled{cursor:not-allowed;opacity:.52}.av-dropdown__trigger:focus-visible{box-shadow:0 0 0 3px var(--av-dropdown-focus-ring);outline:none}.av-dropdown__icon,.av-dropdown__chevron{color:currentColor;flex:0 0 auto}.av-dropdown__label,.av-dropdown__custom-trigger{min-width:0}.av-dropdown__badge{align-items:center;background:var(--av-dropdown-accent);border-radius:var(--av-radius-full);color:var(--av-white);display:inline-flex;flex:0 0 auto;font-size:.6875rem;font-weight:800;justify-content:center;line-height:1;min-width:1.25rem;padding:.25rem .375rem}.av-dropdown__chevron{transition:transform .18s ease}.av-dropdown__chevron--open{transform:rotate(180deg)}.av-dropdown__panel{animation:av-dropdown-panel-in .14s cubic-bezier(.2,0,0,1);background:var(--av-dropdown-panel-bg);border:1px solid var(--av-dropdown-panel-border);box-shadow:var(--av-dropdown-shadow);box-sizing:border-box;color:var(--av-dropdown-text);display:grid;gap:.125rem;max-width:min(24rem,calc(100vw - 2rem));min-width:12rem;padding:.375rem}@keyframes av-dropdown-panel-in{0%{opacity:0;transform:translateY(-.15rem) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}\n"] }]
1026
+ }], ctorParameters: () => [], propDecorators: { badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], closeOnContentClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnContentClick", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], matchTriggerWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "matchTriggerWidth", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }], triggerEl: [{
1027
+ type: ViewChild,
1028
+ args: ['triggerEl']
1029
+ }] } });
1030
+
1031
+ class AvDropdownItem {
1032
+ danger = input(false, { ...(ngDevMode ? { debugName: "danger" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1033
+ description = input('', /* @ts-ignore */
1034
+ ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
1035
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1036
+ icon = input('', /* @ts-ignore */
1037
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
1038
+ role = input('menuitem', /* @ts-ignore */
1039
+ ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
1040
+ type = input('button', /* @ts-ignore */
1041
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
1042
+ handleClick(event) {
1043
+ if (!this.disabled())
1044
+ return;
1045
+ event.preventDefault();
1046
+ event.stopPropagation();
1047
+ }
1048
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvDropdownItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
1049
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AvDropdownItem, isStandalone: true, selector: "button[av-dropdown-item], a[av-dropdown-item]", inputs: { danger: { classPropertyName: "danger", publicName: "danger", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleClick($event)" }, properties: { "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.disabled": "disabled() ? \"\" : null", "attr.role": "role()", "attr.tabindex": "disabled() ? -1 : 0", "attr.type": "type()", "class.av-dropdown-item--danger": "danger()", "class.av-dropdown-item--disabled": "disabled()" } }, ngImport: i0, template: "@if (icon()) {\n <span class=\"av-dropdown-item__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n}\n\n<span class=\"av-dropdown-item__content\">\n <span class=\"av-dropdown-item__label\">\n <ng-content></ng-content>\n </span>\n\n @if (description()) {\n <span class=\"av-dropdown-item__description\">{{ description() }}</span>\n }\n</span>\n", styles: [":host{align-items:center;background:transparent;border:0;border-radius:var(--av-radius-sm);box-sizing:border-box;color:var(--av-dropdown-text, var(--av-color-text));cursor:pointer;display:flex;font:inherit;gap:.625rem;min-height:2.25rem;min-width:0;padding:.5rem .625rem;text-align:left;text-decoration:none;transition:background-color .16s ease,color .16s ease;width:100%}:host(:hover),:host(:focus-visible){background:var(--av-dropdown-accent-soft, var(--av-color-surface-muted));color:var(--av-dropdown-accent-strong, var(--av-color-text));outline:none}:host(.av-dropdown-item--danger){color:var(--av-red-600, #dc2626)}:host(.av-dropdown-item--danger:hover),:host(.av-dropdown-item--danger:focus-visible){background:color-mix(in srgb,var(--av-red-500, #ef4444) 12%,transparent);color:var(--av-red-700, #b91c1c)}:host(.av-dropdown-item--disabled){cursor:not-allowed;opacity:.52}:host(.av-dropdown-item--disabled:hover),:host(.av-dropdown-item--disabled:focus-visible){background:transparent;color:var(--av-dropdown-text, var(--av-color-text))}.av-dropdown-item__icon{color:currentColor;flex:0 0 auto}.av-dropdown-item__content{display:grid;gap:.125rem;min-width:0}.av-dropdown-item__label{font-size:.875rem;font-weight:700;line-height:1.25;min-width:0}.av-dropdown-item__description{color:var(--av-dropdown-muted, var(--av-color-text-muted));font-size:.75rem;line-height:1.25;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AvIcon, selector: "span[av-icon], i[av-icon]", inputs: ["name", "size"] }] });
1050
+ }
1051
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvDropdownItem, decorators: [{
1052
+ type: Component,
1053
+ args: [{ host: {
1054
+ '[attr.aria-disabled]': 'disabled() ? "true" : null',
1055
+ '[attr.disabled]': 'disabled() ? "" : null',
1056
+ '[attr.role]': 'role()',
1057
+ '[attr.tabindex]': 'disabled() ? -1 : 0',
1058
+ '[attr.type]': 'type()',
1059
+ '[class.av-dropdown-item--danger]': 'danger()',
1060
+ '[class.av-dropdown-item--disabled]': 'disabled()',
1061
+ '(click)': 'handleClick($event)',
1062
+ }, imports: [CommonModule, AvIcon], selector: 'button[av-dropdown-item], a[av-dropdown-item]', standalone: true, template: "@if (icon()) {\n <span class=\"av-dropdown-item__icon\" av-icon [name]=\"icon()\" size=\"md\"></span>\n}\n\n<span class=\"av-dropdown-item__content\">\n <span class=\"av-dropdown-item__label\">\n <ng-content></ng-content>\n </span>\n\n @if (description()) {\n <span class=\"av-dropdown-item__description\">{{ description() }}</span>\n }\n</span>\n", styles: [":host{align-items:center;background:transparent;border:0;border-radius:var(--av-radius-sm);box-sizing:border-box;color:var(--av-dropdown-text, var(--av-color-text));cursor:pointer;display:flex;font:inherit;gap:.625rem;min-height:2.25rem;min-width:0;padding:.5rem .625rem;text-align:left;text-decoration:none;transition:background-color .16s ease,color .16s ease;width:100%}:host(:hover),:host(:focus-visible){background:var(--av-dropdown-accent-soft, var(--av-color-surface-muted));color:var(--av-dropdown-accent-strong, var(--av-color-text));outline:none}:host(.av-dropdown-item--danger){color:var(--av-red-600, #dc2626)}:host(.av-dropdown-item--danger:hover),:host(.av-dropdown-item--danger:focus-visible){background:color-mix(in srgb,var(--av-red-500, #ef4444) 12%,transparent);color:var(--av-red-700, #b91c1c)}:host(.av-dropdown-item--disabled){cursor:not-allowed;opacity:.52}:host(.av-dropdown-item--disabled:hover),:host(.av-dropdown-item--disabled:focus-visible){background:transparent;color:var(--av-dropdown-text, var(--av-color-text))}.av-dropdown-item__icon{color:currentColor;flex:0 0 auto}.av-dropdown-item__content{display:grid;gap:.125rem;min-width:0}.av-dropdown-item__label{font-size:.875rem;font-weight:700;line-height:1.25;min-width:0}.av-dropdown-item__description{color:var(--av-dropdown-muted, var(--av-color-text-muted));font-size:.75rem;line-height:1.25;min-width:0}\n"] }]
1063
+ }], propDecorators: { danger: [{ type: i0.Input, args: [{ isSignal: true, alias: "danger", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }] } });
1064
+
903
1065
  class AvTextArea {
904
1066
  ngControl;
905
1067
  config = inject(VISUALS_CONFIG);
@@ -949,7 +1111,7 @@ class AvTextArea {
949
1111
  return !!(this.ngControl && this.ngControl.invalid && (this.ngControl.dirty || this.ngControl.touched));
950
1112
  }
951
1113
  writeValue(value) {
952
- this.value = value || '';
1114
+ this.value = value ?? '';
953
1115
  }
954
1116
  registerOnChange(fn) {
955
1117
  this.onChange = fn;
@@ -1738,7 +1900,7 @@ class AvInput {
1738
1900
  return !!(this.ngControl && this.ngControl.invalid && (this.ngControl.dirty || this.ngControl.touched));
1739
1901
  }
1740
1902
  writeValue(value) {
1741
- this.value = value || '';
1903
+ this.value = value ?? '';
1742
1904
  }
1743
1905
  registerOnChange(fn) {
1744
1906
  this.onChange = fn;
@@ -1823,7 +1985,9 @@ class AvSelect {
1823
1985
  this.ngControl.valueAccessor = this;
1824
1986
  }
1825
1987
  effect(() => {
1826
- this._value.set(this.value());
1988
+ if (!this.ngControl) {
1989
+ this._value.set(this.value());
1990
+ }
1827
1991
  });
1828
1992
  }
1829
1993
  get roundedStyle() {
@@ -2668,6 +2832,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
2668
2832
  }, template: "<ng-content></ng-content>\n", styles: [":host{align-items:start;display:grid;gap:var(--av-grid-gap, .5rem);grid-template-columns:repeat(var(--av-grid-cols-xs, 1),minmax(0,1fr));justify-content:start;width:100%}:host(.av-grid--empty){align-items:center;display:flex;justify-content:center;min-height:8rem}@media(min-width:640px){:host{grid-template-columns:repeat(var(--av-grid-cols-sm, var(--av-grid-cols-xs, 1)),minmax(0,1fr))}}@media(min-width:768px){:host{grid-template-columns:repeat(var(--av-grid-cols-md, var(--av-grid-cols-sm, 1)),minmax(0,1fr))}}@media(min-width:1024px){:host{grid-template-columns:repeat(var(--av-grid-cols-lg, var(--av-grid-cols-md, 1)),minmax(0,1fr))}}@media(min-width:1280px){:host{grid-template-columns:repeat(var(--av-grid-cols-xl, var(--av-grid-cols-lg, 1)),minmax(0,1fr))}}@media(min-width:1536px){:host{grid-template-columns:repeat(var(--av-grid-cols-2xl, var(--av-grid-cols-xl, 1)),minmax(0,1fr))}}\n"] }]
2669
2833
  }], propDecorators: { cols: [{ type: i0.Input, args: [{ isSignal: true, alias: "cols", required: false }] }], empty: [{ type: i0.Input, args: [{ isSignal: true, alias: "empty", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }] } });
2670
2834
 
2835
+ class AvCard {
2836
+ config = inject(VISUALS_CONFIG);
2837
+ themeService = inject(ThemeService);
2838
+ appearance = input('outlined', /* @ts-ignore */
2839
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
2840
+ padding = input('md', /* @ts-ignore */
2841
+ ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
2842
+ rounded = input('md', /* @ts-ignore */
2843
+ ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
2844
+ variant = input(this.config.theme.defaultVariant, /* @ts-ignore */
2845
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2846
+ themeVars = computed(() => {
2847
+ const variant = this.variant();
2848
+ const isDark = this.themeService.dark();
2849
+ const accent = `var(--av-${variant}-${isDark ? 400 : 500})`;
2850
+ return {
2851
+ '--av-card-accent': accent,
2852
+ '--av-card-accent-soft': isDark
2853
+ ? `color-mix(in srgb, var(--av-${variant}-400) 14%, transparent)`
2854
+ : `var(--av-${variant}-50)`,
2855
+ '--av-card-bg': 'var(--av-color-surface)',
2856
+ '--av-card-border': 'var(--av-color-border-soft)',
2857
+ '--av-card-muted': 'var(--av-color-text-muted)',
2858
+ '--av-card-padding': this.paddingStyle(),
2859
+ '--av-card-radius': this.roundedStyle(),
2860
+ '--av-card-shadow': 'var(--av-shadow-control)',
2861
+ '--av-card-text': 'var(--av-color-text)',
2862
+ };
2863
+ }, /* @ts-ignore */
2864
+ ...(ngDevMode ? [{ debugName: "themeVars" }] : /* istanbul ignore next */ []));
2865
+ isFilled = computed(() => this.appearance() === 'filled', /* @ts-ignore */
2866
+ ...(ngDevMode ? [{ debugName: "isFilled" }] : /* istanbul ignore next */ []));
2867
+ isElevated = computed(() => this.appearance() === 'elevated', /* @ts-ignore */
2868
+ ...(ngDevMode ? [{ debugName: "isElevated" }] : /* istanbul ignore next */ []));
2869
+ paddingStyle() {
2870
+ const padding = this.padding();
2871
+ if (typeof padding === 'number') {
2872
+ return `${padding}px`;
2873
+ }
2874
+ const sizes = {
2875
+ none: '0',
2876
+ xs: '.5rem',
2877
+ sm: '.75rem',
2878
+ md: '1rem',
2879
+ lg: '1.25rem',
2880
+ xl: '1.5rem',
2881
+ };
2882
+ return sizes[padding] ?? sizes.md;
2883
+ }
2884
+ roundedStyle() {
2885
+ const rounded = this.rounded();
2886
+ return typeof rounded === 'string'
2887
+ ? `var(--av-radius-${rounded})`
2888
+ : `${rounded}px`;
2889
+ }
2890
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
2891
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: AvCard, isStandalone: true, selector: "av-card", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<article\n class=\"av-card\"\n [class.av-card--filled]=\"isFilled()\"\n [class.av-card--elevated]=\"isElevated()\"\n [ngStyle]=\"themeVars()\"\n>\n <div class=\"av-card__header\">\n <ng-content select=\"[header]\"></ng-content>\n </div>\n\n <div class=\"av-card__content\">\n <ng-content select=\"[content]\"></ng-content>\n <ng-content></ng-content>\n </div>\n\n <div class=\"av-card__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n</article>\n", styles: [":host{display:block;min-width:0}.av-card{background:var(--av-card-bg, var(--av-color-surface));border:1px solid var(--av-card-border, var(--av-color-border-soft));border-radius:var(--av-card-radius, var(--av-radius-md));box-shadow:var(--av-card-shadow, var(--av-shadow-control));color:var(--av-card-text, var(--av-color-text));display:flex;flex-direction:column;min-width:0;overflow:hidden;position:relative;transition:background-color .2s ease,border-color .2s ease,box-shadow .2s ease,color .2s ease}.av-card:before{background:var(--av-card-accent);content:\"\";flex:0 0 3px}.av-card--filled{background:var(--av-card-accent-soft);border-color:color-mix(in srgb,var(--av-card-accent) 26%,var(--av-card-border))}.av-card--elevated{border-color:transparent;box-shadow:var(--av-shadow-raised)}.av-card__header,.av-card__content,.av-card__footer{min-width:0;padding:var(--av-card-padding, 1rem)}.av-card__header{color:var(--av-card-text, var(--av-color-text));font-weight:600}.av-card__footer{color:var(--av-card-muted, var(--av-color-text-muted))}.av-card__header:not(:empty){border-bottom:1px solid var(--av-card-border, var(--av-color-border-soft))}.av-card__footer:not(:empty){border-top:1px solid var(--av-card-border, var(--av-color-border-soft))}.av-card__header:empty,.av-card__content:empty,.av-card__footer:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
2892
+ }
2893
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvCard, decorators: [{
2894
+ type: Component,
2895
+ args: [{ imports: [CommonModule], selector: 'av-card', standalone: true, template: "<article\n class=\"av-card\"\n [class.av-card--filled]=\"isFilled()\"\n [class.av-card--elevated]=\"isElevated()\"\n [ngStyle]=\"themeVars()\"\n>\n <div class=\"av-card__header\">\n <ng-content select=\"[header]\"></ng-content>\n </div>\n\n <div class=\"av-card__content\">\n <ng-content select=\"[content]\"></ng-content>\n <ng-content></ng-content>\n </div>\n\n <div class=\"av-card__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n</article>\n", styles: [":host{display:block;min-width:0}.av-card{background:var(--av-card-bg, var(--av-color-surface));border:1px solid var(--av-card-border, var(--av-color-border-soft));border-radius:var(--av-card-radius, var(--av-radius-md));box-shadow:var(--av-card-shadow, var(--av-shadow-control));color:var(--av-card-text, var(--av-color-text));display:flex;flex-direction:column;min-width:0;overflow:hidden;position:relative;transition:background-color .2s ease,border-color .2s ease,box-shadow .2s ease,color .2s ease}.av-card:before{background:var(--av-card-accent);content:\"\";flex:0 0 3px}.av-card--filled{background:var(--av-card-accent-soft);border-color:color-mix(in srgb,var(--av-card-accent) 26%,var(--av-card-border))}.av-card--elevated{border-color:transparent;box-shadow:var(--av-shadow-raised)}.av-card__header,.av-card__content,.av-card__footer{min-width:0;padding:var(--av-card-padding, 1rem)}.av-card__header{color:var(--av-card-text, var(--av-color-text));font-weight:600}.av-card__footer{color:var(--av-card-muted, var(--av-color-text-muted))}.av-card__header:not(:empty){border-bottom:1px solid var(--av-card-border, var(--av-color-border-soft))}.av-card__footer:not(:empty){border-top:1px solid var(--av-card-border, var(--av-color-border-soft))}.av-card__header:empty,.av-card__content:empty,.av-card__footer:empty{display:none}\n"] }]
2896
+ }], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
2897
+
2671
2898
  class AvButton {
2672
2899
  config = inject(VISUALS_CONFIG);
2673
2900
  icon = input(/* @ts-ignore */
@@ -2699,11 +2926,11 @@ class AvButton {
2699
2926
  return `var(--av-${this.variant()}-500)`;
2700
2927
  }
2701
2928
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
2702
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AvButton, isStandalone: true, selector: "button[av-button], a[av-button]", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, loadingIcon: { classPropertyName: "loadingIcon", publicName: "loadingIcon", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.border-radius": "this.roundedClass", "style.--av-button-light-bg": "this.lightBackground", "style.--av-button-light-hover-bg": "this.lightHoverBackground", "style.--av-button-dark-bg": "this.darkBackground", "style.--av-button-dark-hover-bg": "this.darkHoverBackground" } }, ngImport: i0, template: "@if(icon() || loading()) {<span av-icon [name]=\"loading()? loadingIcon()!: icon()!\"></span>}\n<div>\n <ng-content></ng-content>\n</div>\n", styles: [":host{--av-button-focus-color: var(--av-button-light-bg);--av-button-shadow: rgba(50, 50, 93, .25) 0 6px 12px -2px, rgba(0, 0, 0, .3) 0 3px 7px -3px;display:inline-flex;width:fit-content;flex-shrink:0;align-items:center;justify-content:center;gap:5px;padding:8px 16px;font-size:14px;font-weight:500;background-color:var(--av-button-light-bg);color:var(--av-white);transition:background-color .15s ease,color .15s ease,transform .15s ease;cursor:pointer;box-shadow:var(--av-button-shadow)}:host:hover{background-color:var(--av-button-light-hover-bg)}:host:active{transform:scale(.95)}:host:focus-visible{outline:none;box-shadow:var(--av-button-shadow),0 0 0 2px var(--av-button-focus-color);box-shadow:var(--av-button-shadow),0 0 0 3px color-mix(in srgb,var(--av-button-focus-color) 28%,transparent)}:host-context([data-av-theme=\"dark\"]){--av-button-focus-color: var(--av-button-dark-hover-bg);--av-button-shadow: 0 12px 24px -12px rgb(0 0 0 / .62), 0 4px 10px -6px rgb(0 0 0 / .5);background-color:var(--av-button-dark-bg)}:host-context([data-av-theme=\"dark\"]):hover{background-color:var(--av-button-dark-hover-bg)}\n"], dependencies: [{ kind: "component", type: AvIcon, selector: "span[av-icon], i[av-icon]", inputs: ["name", "size"] }] });
2929
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AvButton, isStandalone: true, selector: "button[av-button], a[av-button]", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, loadingIcon: { classPropertyName: "loadingIcon", publicName: "loadingIcon", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.border-radius": "this.roundedClass", "style.--av-button-light-bg": "this.lightBackground", "style.--av-button-light-hover-bg": "this.lightHoverBackground", "style.--av-button-dark-bg": "this.darkBackground", "style.--av-button-dark-hover-bg": "this.darkHoverBackground" } }, ngImport: i0, template: "@if(icon() || loading()) {<span av-icon [name]=\"loading()? loadingIcon()!: icon()!\"></span>}\n<div class=\"btn-content\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{--av-button-focus-color: var(--av-button-light-bg);--av-button-shadow: rgba(50, 50, 93, .25) 0 6px 12px -2px, rgba(0, 0, 0, .3) 0 3px 7px -3px;display:inline-flex;width:fit-content;flex-shrink:0;align-items:center;justify-content:center;gap:5px;padding:8px 16px;font-size:14px;font-weight:500;background-color:var(--av-button-light-bg);color:var(--av-white);transition:background-color .15s ease,color .15s ease,transform .15s ease;cursor:pointer;box-shadow:var(--av-button-shadow)}:host:hover{background-color:var(--av-button-light-hover-bg)}:host:active{transform:scale(.95)}:host:focus-visible{outline:none;box-shadow:var(--av-button-shadow),0 0 0 2px var(--av-button-focus-color);box-shadow:var(--av-button-shadow),0 0 0 3px color-mix(in srgb,var(--av-button-focus-color) 28%,transparent)}:host-context([data-av-theme=\"dark\"]){--av-button-focus-color: var(--av-button-dark-hover-bg);--av-button-shadow: 0 12px 24px -12px rgb(0 0 0 / .62), 0 4px 10px -6px rgb(0 0 0 / .5);background-color:var(--av-button-dark-bg)}:host-context([data-av-theme=\"dark\"]):hover{background-color:var(--av-button-dark-hover-bg)}.btn-content{display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "component", type: AvIcon, selector: "span[av-icon], i[av-icon]", inputs: ["name", "size"] }] });
2703
2930
  }
2704
2931
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvButton, decorators: [{
2705
2932
  type: Component,
2706
- args: [{ imports: [AvIcon], selector: 'button[av-button], a[av-button]', template: "@if(icon() || loading()) {<span av-icon [name]=\"loading()? loadingIcon()!: icon()!\"></span>}\n<div>\n <ng-content></ng-content>\n</div>\n", styles: [":host{--av-button-focus-color: var(--av-button-light-bg);--av-button-shadow: rgba(50, 50, 93, .25) 0 6px 12px -2px, rgba(0, 0, 0, .3) 0 3px 7px -3px;display:inline-flex;width:fit-content;flex-shrink:0;align-items:center;justify-content:center;gap:5px;padding:8px 16px;font-size:14px;font-weight:500;background-color:var(--av-button-light-bg);color:var(--av-white);transition:background-color .15s ease,color .15s ease,transform .15s ease;cursor:pointer;box-shadow:var(--av-button-shadow)}:host:hover{background-color:var(--av-button-light-hover-bg)}:host:active{transform:scale(.95)}:host:focus-visible{outline:none;box-shadow:var(--av-button-shadow),0 0 0 2px var(--av-button-focus-color);box-shadow:var(--av-button-shadow),0 0 0 3px color-mix(in srgb,var(--av-button-focus-color) 28%,transparent)}:host-context([data-av-theme=\"dark\"]){--av-button-focus-color: var(--av-button-dark-hover-bg);--av-button-shadow: 0 12px 24px -12px rgb(0 0 0 / .62), 0 4px 10px -6px rgb(0 0 0 / .5);background-color:var(--av-button-dark-bg)}:host-context([data-av-theme=\"dark\"]):hover{background-color:var(--av-button-dark-hover-bg)}\n"] }]
2933
+ args: [{ imports: [AvIcon], selector: 'button[av-button], a[av-button]', template: "@if(icon() || loading()) {<span av-icon [name]=\"loading()? loadingIcon()!: icon()!\"></span>}\n<div class=\"btn-content\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{--av-button-focus-color: var(--av-button-light-bg);--av-button-shadow: rgba(50, 50, 93, .25) 0 6px 12px -2px, rgba(0, 0, 0, .3) 0 3px 7px -3px;display:inline-flex;width:fit-content;flex-shrink:0;align-items:center;justify-content:center;gap:5px;padding:8px 16px;font-size:14px;font-weight:500;background-color:var(--av-button-light-bg);color:var(--av-white);transition:background-color .15s ease,color .15s ease,transform .15s ease;cursor:pointer;box-shadow:var(--av-button-shadow)}:host:hover{background-color:var(--av-button-light-hover-bg)}:host:active{transform:scale(.95)}:host:focus-visible{outline:none;box-shadow:var(--av-button-shadow),0 0 0 2px var(--av-button-focus-color);box-shadow:var(--av-button-shadow),0 0 0 3px color-mix(in srgb,var(--av-button-focus-color) 28%,transparent)}:host-context([data-av-theme=\"dark\"]){--av-button-focus-color: var(--av-button-dark-hover-bg);--av-button-shadow: 0 12px 24px -12px rgb(0 0 0 / .62), 0 4px 10px -6px rgb(0 0 0 / .5);background-color:var(--av-button-dark-bg)}:host-context([data-av-theme=\"dark\"]):hover{background-color:var(--av-button-dark-hover-bg)}.btn-content{display:flex;align-items:center;justify-content:center}\n"] }]
2707
2934
  }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], roundedClass: [{
2708
2935
  type: HostBinding,
2709
2936
  args: ['style.border-radius']
@@ -3261,6 +3488,370 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
3261
3488
  args: [{ selector: 'av-table', standalone: true, imports: [CommonModule, AvSelect, AvPaginator], template: "<div class=\"av-table\">\n <div class=\"av-table__scroll\">\n <table class=\"av-table__table\">\n @if (headerTemplate()) {\n <thead class=\"av-table__header\">\n <ng-container *ngTemplateOutlet=\"headerTemplate()!\"></ng-container>\n </thead>\n }\n\n <tbody class=\"av-table__body\">\n @if (bodyTemplate()) {\n @for (item of value(); track $index) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate()!; context: { $implicit: item, index: $index }\"></ng-container>\n } @empty {\n <tr>\n <td colspan=\"100%\" class=\"av-table__empty\">\n {{ emptyMessage() }}\n </td>\n </tr>\n }\n } @else {\n <tr>\n <td colspan=\"100%\" class=\"av-table__empty\">\n {{ emptyMessage() }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n @if (paginator()) {\n <div class=\"av-table__pagination\">\n @if (currentPageLabel() !== '') {\n <div class=\"av-table__page-label\">\n <span>{{ formattedPageLabel() }}</span>\n </div>\n }\n\n <div class=\"av-table__pagination-controls\">\n @if (rowsPerPageOptions().length > 0) {\n <div class=\"av-table__page-size\">\n <span>Itens por p\u00E1gina:</span>\n <av-select\n [data]=\"pageSizeOptions()\"\n [searchable]=\"false\"\n [value]=\"pageSize()\"\n [variant]=\"variant()\"\n (valueChange)=\"changePageSize($event)\"\n />\n </div>\n }\n\n <av-paginator\n [variant]=\"variant()\"\n [pageIndex]=\"pageIndex()\"\n [totalPages]=\"totalPages()\"\n (pageChanged)=\"changePage($event)\"\n />\n </div>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%}.av-table{background:var(--av-color-surface);border:1px solid var(--av-color-border-soft);border-radius:var(--av-radius-xl);box-shadow:var(--av-shadow-control);color:var(--av-color-text);display:flex;flex-direction:column;height:100%;overflow:hidden;width:100%}.av-table__header{background:var(--av-color-surface-muted);color:var(--av-color-text-muted);font-size:.75rem;font-weight:700;text-transform:uppercase}.av-table__header tr{border-bottom:1px solid var(--av-color-border-soft)}.av-table__scroll{flex:1;min-height:0;overflow:auto}.av-table__table{border-collapse:collapse;color:var(--av-color-text);font-size:.875rem;text-align:left;width:100%}.av-table__body tr+tr{border-top:1px solid var(--av-color-border-soft)}.av-table__empty{color:var(--av-color-text-subtle);padding:2rem 1.5rem;text-align:center}.av-table__pagination{align-items:center;background:var(--av-color-surface-muted);border-top:1px solid var(--av-color-border-soft);color:var(--av-color-text-muted);display:flex;flex-wrap:wrap;font-size:.75rem;gap:.75rem;justify-content:space-between;padding:.75rem 1rem}.av-table__pagination-controls,.av-table__page-size{align-items:center;display:flex}.av-table__pagination-controls{flex:1;gap:1rem;justify-content:flex-end;min-width:18rem}.av-table__page-size{gap:.5rem;white-space:nowrap}.av-table__page-size av-select{min-width:5rem}\n"] }]
3262
3489
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], paginator: [{ type: i0.Input, args: [{ isSignal: true, alias: "paginator", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], pageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageIndex", required: false }] }], totalRecords: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRecords", required: false }] }], rowsPerPageOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPageOptions", required: false }] }], currentPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentPageLabel", required: false }] }], sortField: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortField", required: false }] }], sortOrder: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortOrder", required: false }] }], onSort: [{ type: i0.Output, args: ["onSort"] }], onPage: [{ type: i0.Output, args: ["onPage"] }], headerTemplate: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], bodyTemplate: [{ type: i0.ContentChild, args: ['body', { isSignal: true }] }] } });
3263
3490
 
3491
+ class AvCalendar {
3492
+ config = inject(VISUALS_CONFIG);
3493
+ themeService = inject(ThemeService);
3494
+ events = input([], /* @ts-ignore */
3495
+ ...(ngDevMode ? [{ debugName: "events" }] : /* istanbul ignore next */ []));
3496
+ firstDayOfWeek = input(0, { ...(ngDevMode ? { debugName: "firstDayOfWeek" } : /* istanbul ignore next */ {}), transform: numberAttribute });
3497
+ locale = input('pt-BR', /* @ts-ignore */
3498
+ ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
3499
+ maxVisibleEvents = input(3, { ...(ngDevMode ? { debugName: "maxVisibleEvents" } : /* istanbul ignore next */ {}), transform: numberAttribute });
3500
+ rounded = input('md', /* @ts-ignore */
3501
+ ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
3502
+ selectedDate = input(undefined, /* @ts-ignore */
3503
+ ...(ngDevMode ? [{ debugName: "selectedDate" }] : /* istanbul ignore next */ []));
3504
+ showAdjacentDays = input(true, { ...(ngDevMode ? { debugName: "showAdjacentDays" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3505
+ variant = input(this.config.theme.defaultVariant, /* @ts-ignore */
3506
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3507
+ view = input(undefined, /* @ts-ignore */
3508
+ ...(ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []));
3509
+ viewDate = input(undefined, /* @ts-ignore */
3510
+ ...(ngDevMode ? [{ debugName: "viewDate" }] : /* istanbul ignore next */ []));
3511
+ weekdayFormat = input('short', /* @ts-ignore */
3512
+ ...(ngDevMode ? [{ debugName: "weekdayFormat" }] : /* istanbul ignore next */ []));
3513
+ dateSelect = output();
3514
+ eventSelect = output();
3515
+ selectedDateChange = output();
3516
+ viewChange = output();
3517
+ viewDateChange = output();
3518
+ currentView = signal('month', /* @ts-ignore */
3519
+ ...(ngDevMode ? [{ debugName: "currentView" }] : /* istanbul ignore next */ []));
3520
+ currentViewDate = signal(this.startOfMonth(new Date()), /* @ts-ignore */
3521
+ ...(ngDevMode ? [{ debugName: "currentViewDate" }] : /* istanbul ignore next */ []));
3522
+ currentSelectedDate = signal(null, /* @ts-ignore */
3523
+ ...(ngDevMode ? [{ debugName: "currentSelectedDate" }] : /* istanbul ignore next */ []));
3524
+ activeVariant = computed(() => this.variant(), /* @ts-ignore */
3525
+ ...(ngDevMode ? [{ debugName: "activeVariant" }] : /* istanbul ignore next */ []));
3526
+ themeVars = computed(() => {
3527
+ const variant = this.activeVariant();
3528
+ const isDark = this.themeService.dark();
3529
+ const accent = `var(--av-${variant}-${isDark ? 400 : 500})`;
3530
+ return {
3531
+ '--av-calendar-accent': accent,
3532
+ '--av-calendar-accent-strong': `var(--av-${variant}-${isDark ? 300 : 700})`,
3533
+ '--av-calendar-accent-soft': isDark
3534
+ ? `color-mix(in srgb, var(--av-${variant}-400) 16%, transparent)`
3535
+ : `var(--av-${variant}-50)`,
3536
+ '--av-calendar-bg': 'var(--av-color-surface)',
3537
+ '--av-calendar-border': 'var(--av-color-border-soft)',
3538
+ '--av-calendar-cell-bg': 'var(--av-color-surface)',
3539
+ '--av-calendar-cell-muted-bg': 'var(--av-color-surface-muted)',
3540
+ '--av-calendar-panel-bg': 'var(--av-color-surface-raised)',
3541
+ '--av-calendar-shadow': 'var(--av-shadow-raised)',
3542
+ '--av-calendar-text': 'var(--av-color-text)',
3543
+ '--av-calendar-muted': 'var(--av-color-text-muted)',
3544
+ '--av-calendar-radius': this.roundedStyle(),
3545
+ };
3546
+ }, /* @ts-ignore */
3547
+ ...(ngDevMode ? [{ debugName: "themeVars" }] : /* istanbul ignore next */ []));
3548
+ eventEntries = computed(() => {
3549
+ return this.events()
3550
+ .map((event) => this.normalizeEvent(event))
3551
+ .filter((event) => event !== null)
3552
+ .sort((a, b) => a.start.getTime() - b.start.getTime());
3553
+ }, /* @ts-ignore */
3554
+ ...(ngDevMode ? [{ debugName: "eventEntries" }] : /* istanbul ignore next */ []));
3555
+ weekdayLabels = computed(() => {
3556
+ const firstDay = this.safeFirstDayOfWeek();
3557
+ const formatter = new Intl.DateTimeFormat(this.locale(), { weekday: this.weekdayFormat() });
3558
+ const sunday = new Date(2026, 0, 4);
3559
+ return Array.from({ length: 7 }, (_, index) => {
3560
+ const date = this.addDays(sunday, firstDay + index);
3561
+ return formatter.format(date);
3562
+ });
3563
+ }, /* @ts-ignore */
3564
+ ...(ngDevMode ? [{ debugName: "weekdayLabels" }] : /* istanbul ignore next */ []));
3565
+ monthLabel = computed(() => {
3566
+ return new Intl.DateTimeFormat(this.locale(), {
3567
+ month: 'long',
3568
+ year: 'numeric',
3569
+ }).format(this.currentViewDate());
3570
+ }, /* @ts-ignore */
3571
+ ...(ngDevMode ? [{ debugName: "monthLabel" }] : /* istanbul ignore next */ []));
3572
+ yearLabel = computed(() => String(this.currentViewDate().getFullYear()), /* @ts-ignore */
3573
+ ...(ngDevMode ? [{ debugName: "yearLabel" }] : /* istanbul ignore next */ []));
3574
+ monthDays = computed(() => {
3575
+ return this.buildMonthDays(this.currentViewDate());
3576
+ }, /* @ts-ignore */
3577
+ ...(ngDevMode ? [{ debugName: "monthDays" }] : /* istanbul ignore next */ []));
3578
+ yearMonths = computed(() => {
3579
+ const year = this.currentViewDate().getFullYear();
3580
+ const monthFormatter = new Intl.DateTimeFormat(this.locale(), { month: 'long' });
3581
+ return Array.from({ length: 12 }, (_, month) => {
3582
+ const date = new Date(year, month, 1);
3583
+ const days = this.buildMonthDays(date);
3584
+ const events = this.eventEntries().filter(({ start, end }) => {
3585
+ const monthStart = this.startOfMonth(date);
3586
+ const monthEnd = this.endOfMonth(date);
3587
+ return start <= monthEnd && end >= monthStart;
3588
+ });
3589
+ return {
3590
+ date,
3591
+ days,
3592
+ eventCount: events.length,
3593
+ key: `${year}-${month}`,
3594
+ label: monthFormatter.format(date),
3595
+ };
3596
+ });
3597
+ }, /* @ts-ignore */
3598
+ ...(ngDevMode ? [{ debugName: "yearMonths" }] : /* istanbul ignore next */ []));
3599
+ selectedSummary = computed(() => {
3600
+ const selectedDate = this.currentSelectedDate();
3601
+ if (!selectedDate)
3602
+ return null;
3603
+ return {
3604
+ date: selectedDate,
3605
+ events: this.eventsForDate(selectedDate),
3606
+ label: new Intl.DateTimeFormat(this.locale(), {
3607
+ day: '2-digit',
3608
+ month: 'long',
3609
+ year: 'numeric',
3610
+ }).format(selectedDate),
3611
+ };
3612
+ }, /* @ts-ignore */
3613
+ ...(ngDevMode ? [{ debugName: "selectedSummary" }] : /* istanbul ignore next */ []));
3614
+ constructor() {
3615
+ effect(() => {
3616
+ const view = this.view();
3617
+ if (view !== undefined) {
3618
+ this.currentView.set(this.safeView(view));
3619
+ }
3620
+ });
3621
+ effect(() => {
3622
+ const date = this.viewDate();
3623
+ if (date !== undefined) {
3624
+ this.currentViewDate.set(this.startOfMonth(this.toDate(date) ?? new Date()));
3625
+ }
3626
+ });
3627
+ effect(() => {
3628
+ const date = this.selectedDate();
3629
+ if (date !== undefined) {
3630
+ this.currentSelectedDate.set(this.toDate(date));
3631
+ }
3632
+ });
3633
+ }
3634
+ get title() {
3635
+ return this.currentView() === 'year' ? this.yearLabel() : this.monthLabel();
3636
+ }
3637
+ previous() {
3638
+ const current = this.currentViewDate();
3639
+ const next = this.currentView() === 'year'
3640
+ ? new Date(current.getFullYear() - 1, 0, 1)
3641
+ : new Date(current.getFullYear(), current.getMonth() - 1, 1);
3642
+ this.setViewDate(next);
3643
+ }
3644
+ next() {
3645
+ const current = this.currentViewDate();
3646
+ const next = this.currentView() === 'year'
3647
+ ? new Date(current.getFullYear() + 1, 0, 1)
3648
+ : new Date(current.getFullYear(), current.getMonth() + 1, 1);
3649
+ this.setViewDate(next);
3650
+ }
3651
+ goToday() {
3652
+ const today = this.stripTime(new Date());
3653
+ this.setViewDate(today);
3654
+ this.selectDate(today);
3655
+ }
3656
+ setView(view) {
3657
+ const next = this.safeView(view);
3658
+ if (next === this.currentView())
3659
+ return;
3660
+ this.currentView.set(next);
3661
+ this.viewChange.emit(next);
3662
+ }
3663
+ openMonth(date) {
3664
+ this.setViewDate(date);
3665
+ this.setView('month');
3666
+ }
3667
+ selectDay(day) {
3668
+ if (day.isAdjacent && !this.showAdjacentDays())
3669
+ return;
3670
+ this.selectDate(day.date);
3671
+ }
3672
+ handleDayKeydown(event, day) {
3673
+ if (event.key !== 'Enter' && event.key !== ' ')
3674
+ return;
3675
+ event.preventDefault();
3676
+ this.selectDay(day);
3677
+ }
3678
+ selectEvent(event, date, mouseEvent) {
3679
+ mouseEvent.stopPropagation();
3680
+ if (event.disabled)
3681
+ return;
3682
+ this.eventSelect.emit({
3683
+ date: this.cloneDate(date),
3684
+ event,
3685
+ });
3686
+ }
3687
+ visibleEvents(events) {
3688
+ return events.slice(0, this.safeMaxVisibleEvents());
3689
+ }
3690
+ hiddenEventCount(events) {
3691
+ return Math.max(0, events.length - this.safeMaxVisibleEvents());
3692
+ }
3693
+ dotEvents(events) {
3694
+ return events.slice(0, 4);
3695
+ }
3696
+ eventColor(event) {
3697
+ if (event.color)
3698
+ return event.color;
3699
+ const variant = event.variant || this.activeVariant();
3700
+ const shade = this.themeService.dark() ? 400 : 500;
3701
+ return `var(--av-${variant}-${shade})`;
3702
+ }
3703
+ eventTimeLabel(event) {
3704
+ if (event.allDay)
3705
+ return 'Dia todo';
3706
+ const start = this.toDate(event.start);
3707
+ if (!start)
3708
+ return '';
3709
+ return new Intl.DateTimeFormat(this.locale(), {
3710
+ hour: '2-digit',
3711
+ minute: '2-digit',
3712
+ }).format(start);
3713
+ }
3714
+ dayAriaLabel(day) {
3715
+ const label = new Intl.DateTimeFormat(this.locale(), {
3716
+ day: 'numeric',
3717
+ month: 'long',
3718
+ year: 'numeric',
3719
+ }).format(day.date);
3720
+ if (!day.events.length)
3721
+ return label;
3722
+ return `${label}, ${day.events.length} evento${day.events.length === 1 ? '' : 's'}`;
3723
+ }
3724
+ trackEvent(_index, event) {
3725
+ return event.id;
3726
+ }
3727
+ trackDay(_index, day) {
3728
+ return day.key;
3729
+ }
3730
+ selectDate(date) {
3731
+ const selected = this.stripTime(date);
3732
+ const events = this.eventsForDate(selected);
3733
+ this.currentSelectedDate.set(selected);
3734
+ this.selectedDateChange.emit(this.cloneDate(selected));
3735
+ this.dateSelect.emit({
3736
+ date: this.cloneDate(selected),
3737
+ events,
3738
+ });
3739
+ }
3740
+ setViewDate(date) {
3741
+ const next = this.startOfMonth(date);
3742
+ this.currentViewDate.set(next);
3743
+ this.viewDateChange.emit(this.cloneDate(next));
3744
+ }
3745
+ buildMonthDays(date) {
3746
+ const monthStart = this.startOfMonth(date);
3747
+ const monthEnd = this.endOfMonth(date);
3748
+ const start = this.startOfWeek(monthStart);
3749
+ const end = this.endOfWeek(monthEnd);
3750
+ const days = [];
3751
+ for (let day = start; day <= end; day = this.addDays(day, 1)) {
3752
+ const dayDate = this.stripTime(day);
3753
+ const isCurrentMonth = dayDate.getMonth() === monthStart.getMonth();
3754
+ days.push({
3755
+ date: dayDate,
3756
+ events: this.eventsForDate(dayDate),
3757
+ isAdjacent: !isCurrentMonth,
3758
+ isCurrentMonth,
3759
+ isSelected: this.isSameDay(dayDate, this.currentSelectedDate()),
3760
+ isToday: this.isSameDay(dayDate, new Date()),
3761
+ key: this.dateKey(dayDate),
3762
+ });
3763
+ }
3764
+ return days;
3765
+ }
3766
+ eventsForDate(date) {
3767
+ const day = this.stripTime(date);
3768
+ return this.eventEntries()
3769
+ .filter(({ start, end }) => start <= day && end >= day)
3770
+ .map(({ event }) => event);
3771
+ }
3772
+ normalizeEvent(event) {
3773
+ const start = this.toDate(event.start);
3774
+ if (!start)
3775
+ return null;
3776
+ const end = this.toDate(event.end ?? event.start) ?? start;
3777
+ const startDay = this.stripTime(start);
3778
+ const endDay = this.stripTime(end);
3779
+ return {
3780
+ event,
3781
+ start: startDay,
3782
+ end: endDay >= startDay ? endDay : startDay,
3783
+ };
3784
+ }
3785
+ roundedStyle() {
3786
+ const rounded = this.rounded();
3787
+ return typeof rounded === 'string'
3788
+ ? `var(--av-radius-${rounded})`
3789
+ : `${rounded}px`;
3790
+ }
3791
+ safeFirstDayOfWeek() {
3792
+ const firstDay = Math.trunc(Number(this.firstDayOfWeek()));
3793
+ if (!Number.isFinite(firstDay))
3794
+ return 0;
3795
+ return ((firstDay % 7) + 7) % 7;
3796
+ }
3797
+ safeMaxVisibleEvents() {
3798
+ const max = Math.trunc(Number(this.maxVisibleEvents()));
3799
+ return Number.isFinite(max) && max > 0 ? max : 3;
3800
+ }
3801
+ safeView(view) {
3802
+ return view === 'year' ? 'year' : 'month';
3803
+ }
3804
+ startOfMonth(date) {
3805
+ return new Date(date.getFullYear(), date.getMonth(), 1);
3806
+ }
3807
+ endOfMonth(date) {
3808
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0);
3809
+ }
3810
+ startOfWeek(date) {
3811
+ const day = this.stripTime(date);
3812
+ const offset = (day.getDay() - this.safeFirstDayOfWeek() + 7) % 7;
3813
+ return this.addDays(day, -offset);
3814
+ }
3815
+ endOfWeek(date) {
3816
+ return this.addDays(this.startOfWeek(date), 6);
3817
+ }
3818
+ addDays(date, days) {
3819
+ const next = this.cloneDate(date);
3820
+ next.setDate(next.getDate() + days);
3821
+ return next;
3822
+ }
3823
+ stripTime(date) {
3824
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
3825
+ }
3826
+ cloneDate(date) {
3827
+ return new Date(date.getTime());
3828
+ }
3829
+ toDate(value) {
3830
+ if (value === null || value === undefined || value === '')
3831
+ return null;
3832
+ const date = value instanceof Date ? new Date(value.getTime()) : new Date(value);
3833
+ return Number.isNaN(date.getTime()) ? null : date;
3834
+ }
3835
+ isSameDay(first, second) {
3836
+ if (!first || !second)
3837
+ return false;
3838
+ return first.getDate() === second.getDate()
3839
+ && first.getMonth() === second.getMonth()
3840
+ && first.getFullYear() === second.getFullYear();
3841
+ }
3842
+ dateKey(date) {
3843
+ const month = String(date.getMonth() + 1).padStart(2, '0');
3844
+ const day = String(date.getDate()).padStart(2, '0');
3845
+ return `${date.getFullYear()}-${month}-${day}`;
3846
+ }
3847
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
3848
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AvCalendar, isStandalone: true, selector: "av-calendar", inputs: { events: { classPropertyName: "events", publicName: "events", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, maxVisibleEvents: { classPropertyName: "maxVisibleEvents", publicName: "maxVisibleEvents", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, selectedDate: { classPropertyName: "selectedDate", publicName: "selectedDate", isSignal: true, isRequired: false, transformFunction: null }, showAdjacentDays: { classPropertyName: "showAdjacentDays", publicName: "showAdjacentDays", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, viewDate: { classPropertyName: "viewDate", publicName: "viewDate", isSignal: true, isRequired: false, transformFunction: null }, weekdayFormat: { classPropertyName: "weekdayFormat", publicName: "weekdayFormat", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateSelect: "dateSelect", eventSelect: "eventSelect", selectedDateChange: "selectedDateChange", viewChange: "viewChange", viewDateChange: "viewDateChange" }, ngImport: i0, template: "<div class=\"av-calendar\" [ngStyle]=\"themeVars()\">\n <header class=\"av-calendar__header\">\n <div class=\"av-calendar__nav\">\n <button type=\"button\" class=\"av-calendar__nav-button\" (click)=\"previous()\" aria-label=\"Periodo anterior\">\n <span av-icon name=\"chevron_left\"></span>\n </button>\n\n <h2 class=\"av-calendar__title\">{{ title }}</h2>\n\n <button type=\"button\" class=\"av-calendar__nav-button\" (click)=\"next()\" aria-label=\"Proximo periodo\">\n <span av-icon name=\"chevron_right\"></span>\n </button>\n </div>\n\n <div class=\"av-calendar__actions\">\n <button type=\"button\" class=\"av-calendar__today\" (click)=\"goToday()\">Hoje</button>\n\n <div class=\"av-calendar__view-switch\" role=\"tablist\" aria-label=\"Visualizacao do calendario\">\n <button\n type=\"button\"\n class=\"av-calendar__view-button\"\n [class.av-calendar__view-button--active]=\"currentView() === 'month'\"\n [attr.aria-selected]=\"currentView() === 'month'\"\n role=\"tab\"\n (click)=\"setView('month')\"\n >\n Mes\n </button>\n\n <button\n type=\"button\"\n class=\"av-calendar__view-button\"\n [class.av-calendar__view-button--active]=\"currentView() === 'year'\"\n [attr.aria-selected]=\"currentView() === 'year'\"\n role=\"tab\"\n (click)=\"setView('year')\"\n >\n Ano\n </button>\n </div>\n </div>\n </header>\n\n @if (currentView() === 'month') {\n <section class=\"av-calendar__month\" [attr.aria-label]=\"monthLabel()\">\n <div class=\"av-calendar__weekdays\">\n @for (weekday of weekdayLabels(); track weekday) {\n <span class=\"av-calendar__weekday\">{{ weekday }}</span>\n }\n </div>\n\n <div class=\"av-calendar__month-grid\">\n @for (day of monthDays(); track trackDay($index, day)) {\n <div\n class=\"av-calendar__day\"\n [class.av-calendar__day--adjacent]=\"day.isAdjacent\"\n [class.av-calendar__day--hidden]=\"day.isAdjacent && !showAdjacentDays()\"\n [class.av-calendar__day--selected]=\"day.isSelected\"\n [class.av-calendar__day--today]=\"day.isToday\"\n [attr.aria-label]=\"dayAriaLabel(day)\"\n [attr.tabindex]=\"day.isAdjacent && !showAdjacentDays() ? -1 : 0\"\n role=\"button\"\n (click)=\"selectDay(day)\"\n (keydown)=\"handleDayKeydown($event, day)\"\n >\n <span class=\"av-calendar__day-number\">{{ day.date.getDate() }}</span>\n\n @if (day.events.length) {\n <div class=\"av-calendar__event-list\">\n @for (event of visibleEvents(day.events); track trackEvent($index, event)) {\n <button\n type=\"button\"\n class=\"av-calendar__event\"\n [class.av-calendar__event--disabled]=\"event.disabled\"\n [style.--av-calendar-event-color]=\"eventColor(event)\"\n [title]=\"event.title\"\n (click)=\"selectEvent(event, day.date, $event)\"\n >\n @if (!event.allDay) {\n <span class=\"av-calendar__event-time\">{{ eventTimeLabel(event) }}</span>\n }\n <span class=\"av-calendar__event-title\">{{ event.title }}</span>\n </button>\n }\n\n @if (hiddenEventCount(day.events) > 0) {\n <span class=\"av-calendar__event-more\">+{{ hiddenEventCount(day.events) }}</span>\n }\n </div>\n\n <div class=\"av-calendar__dots\" aria-hidden=\"true\">\n @for (event of dotEvents(day.events); track trackEvent($index, event)) {\n <span class=\"av-calendar__dot\" [style.background]=\"eventColor(event)\"></span>\n }\n </div>\n }\n </div>\n }\n </div>\n </section>\n } @else {\n <section class=\"av-calendar__year\" [attr.aria-label]=\"yearLabel()\">\n @for (month of yearMonths(); track month.key) {\n <article class=\"av-calendar__year-month\">\n <button type=\"button\" class=\"av-calendar__year-month-title\" (click)=\"openMonth(month.date)\">\n <span>{{ month.label }}</span>\n @if (month.eventCount) {\n <span class=\"av-calendar__year-month-count\">{{ month.eventCount }}</span>\n }\n </button>\n\n <div class=\"av-calendar__mini-weekdays\">\n @for (weekday of weekdayLabels(); track weekday) {\n <span>{{ weekday.slice(0, 1) }}</span>\n }\n </div>\n\n <div class=\"av-calendar__mini-grid\">\n @for (day of month.days; track trackDay($index, day)) {\n <button\n type=\"button\"\n class=\"av-calendar__mini-day\"\n [class.av-calendar__mini-day--adjacent]=\"day.isAdjacent\"\n [class.av-calendar__mini-day--selected]=\"day.isSelected\"\n [class.av-calendar__mini-day--today]=\"day.isToday\"\n [disabled]=\"day.isAdjacent\"\n [attr.aria-label]=\"dayAriaLabel(day)\"\n (click)=\"selectDay(day)\"\n >\n @if (!day.isAdjacent) {\n <span class=\"av-calendar__mini-day-number\">{{ day.date.getDate() }}</span>\n\n @if (day.events.length) {\n <span class=\"av-calendar__mini-dots\" aria-hidden=\"true\">\n @for (event of dotEvents(day.events); track trackEvent($index, event)) {\n <span class=\"av-calendar__mini-dot\" [style.background]=\"eventColor(event)\"></span>\n }\n </span>\n }\n }\n </button>\n }\n </div>\n </article>\n }\n </section>\n }\n\n @if (selectedSummary(); as selected) {\n <section class=\"av-calendar__selected\">\n <div class=\"av-calendar__selected-header\">\n <span class=\"av-calendar__selected-date\">{{ selected.label }}</span>\n <span class=\"av-calendar__selected-count\">{{ selected.events.length }}</span>\n </div>\n\n @if (selected.events.length) {\n <div class=\"av-calendar__selected-events\">\n @for (event of selected.events; track trackEvent($index, event)) {\n <button\n type=\"button\"\n class=\"av-calendar__selected-event\"\n [style.--av-calendar-event-color]=\"eventColor(event)\"\n (click)=\"selectEvent(event, selected.date, $event)\"\n >\n <span class=\"av-calendar__selected-event-body\">\n <span class=\"av-calendar__selected-event-title\">{{ event.title }}</span>\n <span class=\"av-calendar__selected-event-time\">{{ eventTimeLabel(event) }}</span>\n </span>\n </button>\n }\n </div>\n } @else {\n <span class=\"av-calendar__empty\">Sem eventos</span>\n }\n </section>\n }\n</div>\n", styles: [":host{container-type:inline-size;display:block}.av-calendar{background:var(--av-calendar-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-calendar-radius);box-sizing:border-box;color:var(--av-calendar-text);display:grid;gap:1rem;padding:1rem}.av-calendar__header{align-items:center;display:flex;gap:.75rem;justify-content:space-between}.av-calendar__nav,.av-calendar__actions{align-items:center;display:flex;gap:.5rem}.av-calendar__title{color:var(--av-calendar-text);font-size:1.05rem;font-weight:800;line-height:1.2;margin:0;text-transform:capitalize}.av-calendar__nav-button,.av-calendar__today,.av-calendar__view-button{align-items:center;background:var(--av-calendar-cell-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);color:var(--av-calendar-text);cursor:pointer;display:inline-flex;font:inherit;justify-content:center}.av-calendar__nav-button{height:2.25rem;padding:0;width:2.25rem}.av-calendar__today,.av-calendar__view-button{font-size:.8125rem;font-weight:800;min-height:2.25rem;padding:.45rem .7rem}.av-calendar__nav-button:hover,.av-calendar__today:hover,.av-calendar__view-button:hover,.av-calendar__view-button--active{background:var(--av-calendar-accent-soft);border-color:color-mix(in srgb,var(--av-calendar-accent) 34%,var(--av-calendar-border));color:var(--av-calendar-accent-strong)}.av-calendar__nav-button:focus-visible,.av-calendar__today:focus-visible,.av-calendar__view-button:focus-visible,.av-calendar__day:focus-visible,.av-calendar__mini-day:focus-visible,.av-calendar__event:focus-visible,.av-calendar__selected-event:focus-visible,.av-calendar__year-month-title:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--av-calendar-accent) 24%,transparent);outline:none}.av-calendar__view-switch{background:var(--av-calendar-cell-muted-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);display:inline-flex;padding:.125rem}.av-calendar__view-button{background:transparent;border-color:transparent;min-height:2rem;padding-inline:.65rem}.av-calendar__weekdays,.av-calendar__month-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.av-calendar__weekdays{gap:.25rem;margin-bottom:.25rem}.av-calendar__weekday{color:var(--av-calendar-muted);font-size:.72rem;font-weight:800;padding:.25rem;text-align:center;text-transform:capitalize}.av-calendar__month-grid{background:var(--av-calendar-border);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);gap:1px;overflow:hidden}.av-calendar__day{background:var(--av-calendar-cell-bg);box-sizing:border-box;cursor:pointer;display:grid;grid-template-rows:auto 1fr auto;min-height:7rem;min-width:0;padding:.5rem}.av-calendar__day:hover{background:var(--av-calendar-accent-soft)}.av-calendar__day--adjacent{background:var(--av-calendar-cell-muted-bg);color:var(--av-calendar-muted)}.av-calendar__day--hidden{cursor:default;opacity:.28}.av-calendar__day--selected{box-shadow:inset 0 0 0 2px var(--av-calendar-accent)}.av-calendar__day--today .av-calendar__day-number,.av-calendar__mini-day--today .av-calendar__mini-day-number{background:var(--av-calendar-accent);color:var(--av-white)}.av-calendar__day-number{align-items:center;border-radius:var(--av-radius-full);display:inline-flex;font-size:.8125rem;font-weight:800;height:1.7rem;justify-content:center;justify-self:end;line-height:1;width:1.7rem}.av-calendar__event-list{align-content:start;display:grid;gap:.25rem;margin-top:.35rem;min-width:0}.av-calendar__event,.av-calendar__event-more{border-radius:var(--av-radius-xs);font-size:.72rem;line-height:1.2;min-width:0}.av-calendar__event{align-items:center;background:color-mix(in srgb,var(--av-calendar-event-color) 12%,transparent);border:0;border-left:3px solid var(--av-calendar-event-color);color:var(--av-calendar-text);cursor:pointer;display:flex;gap:.3rem;padding:.25rem .35rem;text-align:left}.av-calendar__event:hover{background:color-mix(in srgb,var(--av-calendar-event-color) 18%,transparent)}.av-calendar__event--disabled{cursor:not-allowed;opacity:.52}.av-calendar__event-time{color:var(--av-calendar-muted);flex:0 0 auto;font-weight:800}.av-calendar__event-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-calendar__event-more{color:var(--av-calendar-muted);font-weight:800;padding-inline:.35rem}.av-calendar__dots,.av-calendar__mini-dots{align-items:center;display:flex;gap:.16rem;justify-content:center}.av-calendar__dots{display:none;margin-top:.2rem}.av-calendar__dot,.av-calendar__mini-dot{border-radius:var(--av-radius-full);flex:0 0 auto;height:.34rem;width:.34rem}.av-calendar__year{display:grid;gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr))}.av-calendar__year-month{background:var(--av-calendar-panel-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);display:grid;gap:.35rem;padding:.625rem}.av-calendar__year-month-title{align-items:center;background:transparent;border:0;border-radius:var(--av-radius-sm);color:var(--av-calendar-text);cursor:pointer;display:flex;font:inherit;font-size:.85rem;font-weight:800;justify-content:space-between;min-height:2rem;padding:.25rem .35rem;text-align:left;text-transform:capitalize}.av-calendar__year-month-count{background:var(--av-calendar-accent);border-radius:var(--av-radius-full);color:var(--av-white);font-size:.68rem;padding:.25rem .35rem}.av-calendar__mini-weekdays,.av-calendar__mini-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.av-calendar__mini-weekdays{color:var(--av-calendar-muted);font-size:.64rem;font-weight:800;text-align:center}.av-calendar__mini-day{align-items:center;aspect-ratio:1;background:transparent;border:0;border-radius:var(--av-radius-sm);color:var(--av-calendar-text);cursor:pointer;display:grid;gap:.08rem;justify-items:center;padding:.12rem}.av-calendar__mini-day:not(:disabled):hover,.av-calendar__mini-day--selected{background:var(--av-calendar-accent-soft);color:var(--av-calendar-accent-strong)}.av-calendar__mini-day-number{align-items:center;border-radius:var(--av-radius-full);display:inline-flex;font-size:.68rem;font-weight:800;height:1.25rem;justify-content:center;line-height:1;width:1.25rem}@container (max-width: 56rem){.av-calendar__year{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (max-width: 42rem){.av-calendar__year{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (max-width: 28rem){.av-calendar__year{grid-template-columns:1fr}}.av-calendar__selected{border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);padding:.75rem}.av-calendar__selected-header,.av-calendar__selected-event{align-items:center;display:flex;gap:.5rem;justify-content:space-between}.av-calendar__selected-date,.av-calendar__selected-event-title{font-weight:800}.av-calendar__selected-event-body{min-width:0}.av-calendar__selected-event{background:transparent;border:0;border-left:3px solid var(--av-calendar-event-color);color:var(--av-calendar-text);cursor:pointer;font:inherit;padding:.4rem;text-align:left;width:100%}.av-calendar__selected-event:hover{background:color-mix(in srgb,var(--av-calendar-event-color) 12%,transparent)}.av-calendar__selected-event-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-calendar__selected-count,.av-calendar__selected-event-time,.av-calendar__empty{color:var(--av-calendar-muted);font-size:.75rem;font-weight:700}@media(max-width:640px){.av-calendar{gap:.75rem;padding:.75rem}.av-calendar__header{align-items:stretch;display:grid}.av-calendar__nav,.av-calendar__actions{justify-content:space-between}.av-calendar__title{font-size:.98rem}.av-calendar__weekday{font-size:.68rem;padding:.2rem 0}.av-calendar__day{align-content:start;aspect-ratio:1;gap:.12rem;min-height:0;padding:.3rem .18rem}.av-calendar__day-number{font-size:.75rem;height:1.45rem;justify-self:center;width:1.45rem}.av-calendar__event-list{display:none}.av-calendar__dots{display:flex}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: AvIcon, selector: "span[av-icon], i[av-icon]", inputs: ["name", "size"] }] });
3849
+ }
3850
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AvCalendar, decorators: [{
3851
+ type: Component,
3852
+ args: [{ imports: [CommonModule, AvIcon], selector: 'av-calendar', standalone: true, template: "<div class=\"av-calendar\" [ngStyle]=\"themeVars()\">\n <header class=\"av-calendar__header\">\n <div class=\"av-calendar__nav\">\n <button type=\"button\" class=\"av-calendar__nav-button\" (click)=\"previous()\" aria-label=\"Periodo anterior\">\n <span av-icon name=\"chevron_left\"></span>\n </button>\n\n <h2 class=\"av-calendar__title\">{{ title }}</h2>\n\n <button type=\"button\" class=\"av-calendar__nav-button\" (click)=\"next()\" aria-label=\"Proximo periodo\">\n <span av-icon name=\"chevron_right\"></span>\n </button>\n </div>\n\n <div class=\"av-calendar__actions\">\n <button type=\"button\" class=\"av-calendar__today\" (click)=\"goToday()\">Hoje</button>\n\n <div class=\"av-calendar__view-switch\" role=\"tablist\" aria-label=\"Visualizacao do calendario\">\n <button\n type=\"button\"\n class=\"av-calendar__view-button\"\n [class.av-calendar__view-button--active]=\"currentView() === 'month'\"\n [attr.aria-selected]=\"currentView() === 'month'\"\n role=\"tab\"\n (click)=\"setView('month')\"\n >\n Mes\n </button>\n\n <button\n type=\"button\"\n class=\"av-calendar__view-button\"\n [class.av-calendar__view-button--active]=\"currentView() === 'year'\"\n [attr.aria-selected]=\"currentView() === 'year'\"\n role=\"tab\"\n (click)=\"setView('year')\"\n >\n Ano\n </button>\n </div>\n </div>\n </header>\n\n @if (currentView() === 'month') {\n <section class=\"av-calendar__month\" [attr.aria-label]=\"monthLabel()\">\n <div class=\"av-calendar__weekdays\">\n @for (weekday of weekdayLabels(); track weekday) {\n <span class=\"av-calendar__weekday\">{{ weekday }}</span>\n }\n </div>\n\n <div class=\"av-calendar__month-grid\">\n @for (day of monthDays(); track trackDay($index, day)) {\n <div\n class=\"av-calendar__day\"\n [class.av-calendar__day--adjacent]=\"day.isAdjacent\"\n [class.av-calendar__day--hidden]=\"day.isAdjacent && !showAdjacentDays()\"\n [class.av-calendar__day--selected]=\"day.isSelected\"\n [class.av-calendar__day--today]=\"day.isToday\"\n [attr.aria-label]=\"dayAriaLabel(day)\"\n [attr.tabindex]=\"day.isAdjacent && !showAdjacentDays() ? -1 : 0\"\n role=\"button\"\n (click)=\"selectDay(day)\"\n (keydown)=\"handleDayKeydown($event, day)\"\n >\n <span class=\"av-calendar__day-number\">{{ day.date.getDate() }}</span>\n\n @if (day.events.length) {\n <div class=\"av-calendar__event-list\">\n @for (event of visibleEvents(day.events); track trackEvent($index, event)) {\n <button\n type=\"button\"\n class=\"av-calendar__event\"\n [class.av-calendar__event--disabled]=\"event.disabled\"\n [style.--av-calendar-event-color]=\"eventColor(event)\"\n [title]=\"event.title\"\n (click)=\"selectEvent(event, day.date, $event)\"\n >\n @if (!event.allDay) {\n <span class=\"av-calendar__event-time\">{{ eventTimeLabel(event) }}</span>\n }\n <span class=\"av-calendar__event-title\">{{ event.title }}</span>\n </button>\n }\n\n @if (hiddenEventCount(day.events) > 0) {\n <span class=\"av-calendar__event-more\">+{{ hiddenEventCount(day.events) }}</span>\n }\n </div>\n\n <div class=\"av-calendar__dots\" aria-hidden=\"true\">\n @for (event of dotEvents(day.events); track trackEvent($index, event)) {\n <span class=\"av-calendar__dot\" [style.background]=\"eventColor(event)\"></span>\n }\n </div>\n }\n </div>\n }\n </div>\n </section>\n } @else {\n <section class=\"av-calendar__year\" [attr.aria-label]=\"yearLabel()\">\n @for (month of yearMonths(); track month.key) {\n <article class=\"av-calendar__year-month\">\n <button type=\"button\" class=\"av-calendar__year-month-title\" (click)=\"openMonth(month.date)\">\n <span>{{ month.label }}</span>\n @if (month.eventCount) {\n <span class=\"av-calendar__year-month-count\">{{ month.eventCount }}</span>\n }\n </button>\n\n <div class=\"av-calendar__mini-weekdays\">\n @for (weekday of weekdayLabels(); track weekday) {\n <span>{{ weekday.slice(0, 1) }}</span>\n }\n </div>\n\n <div class=\"av-calendar__mini-grid\">\n @for (day of month.days; track trackDay($index, day)) {\n <button\n type=\"button\"\n class=\"av-calendar__mini-day\"\n [class.av-calendar__mini-day--adjacent]=\"day.isAdjacent\"\n [class.av-calendar__mini-day--selected]=\"day.isSelected\"\n [class.av-calendar__mini-day--today]=\"day.isToday\"\n [disabled]=\"day.isAdjacent\"\n [attr.aria-label]=\"dayAriaLabel(day)\"\n (click)=\"selectDay(day)\"\n >\n @if (!day.isAdjacent) {\n <span class=\"av-calendar__mini-day-number\">{{ day.date.getDate() }}</span>\n\n @if (day.events.length) {\n <span class=\"av-calendar__mini-dots\" aria-hidden=\"true\">\n @for (event of dotEvents(day.events); track trackEvent($index, event)) {\n <span class=\"av-calendar__mini-dot\" [style.background]=\"eventColor(event)\"></span>\n }\n </span>\n }\n }\n </button>\n }\n </div>\n </article>\n }\n </section>\n }\n\n @if (selectedSummary(); as selected) {\n <section class=\"av-calendar__selected\">\n <div class=\"av-calendar__selected-header\">\n <span class=\"av-calendar__selected-date\">{{ selected.label }}</span>\n <span class=\"av-calendar__selected-count\">{{ selected.events.length }}</span>\n </div>\n\n @if (selected.events.length) {\n <div class=\"av-calendar__selected-events\">\n @for (event of selected.events; track trackEvent($index, event)) {\n <button\n type=\"button\"\n class=\"av-calendar__selected-event\"\n [style.--av-calendar-event-color]=\"eventColor(event)\"\n (click)=\"selectEvent(event, selected.date, $event)\"\n >\n <span class=\"av-calendar__selected-event-body\">\n <span class=\"av-calendar__selected-event-title\">{{ event.title }}</span>\n <span class=\"av-calendar__selected-event-time\">{{ eventTimeLabel(event) }}</span>\n </span>\n </button>\n }\n </div>\n } @else {\n <span class=\"av-calendar__empty\">Sem eventos</span>\n }\n </section>\n }\n</div>\n", styles: [":host{container-type:inline-size;display:block}.av-calendar{background:var(--av-calendar-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-calendar-radius);box-sizing:border-box;color:var(--av-calendar-text);display:grid;gap:1rem;padding:1rem}.av-calendar__header{align-items:center;display:flex;gap:.75rem;justify-content:space-between}.av-calendar__nav,.av-calendar__actions{align-items:center;display:flex;gap:.5rem}.av-calendar__title{color:var(--av-calendar-text);font-size:1.05rem;font-weight:800;line-height:1.2;margin:0;text-transform:capitalize}.av-calendar__nav-button,.av-calendar__today,.av-calendar__view-button{align-items:center;background:var(--av-calendar-cell-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);color:var(--av-calendar-text);cursor:pointer;display:inline-flex;font:inherit;justify-content:center}.av-calendar__nav-button{height:2.25rem;padding:0;width:2.25rem}.av-calendar__today,.av-calendar__view-button{font-size:.8125rem;font-weight:800;min-height:2.25rem;padding:.45rem .7rem}.av-calendar__nav-button:hover,.av-calendar__today:hover,.av-calendar__view-button:hover,.av-calendar__view-button--active{background:var(--av-calendar-accent-soft);border-color:color-mix(in srgb,var(--av-calendar-accent) 34%,var(--av-calendar-border));color:var(--av-calendar-accent-strong)}.av-calendar__nav-button:focus-visible,.av-calendar__today:focus-visible,.av-calendar__view-button:focus-visible,.av-calendar__day:focus-visible,.av-calendar__mini-day:focus-visible,.av-calendar__event:focus-visible,.av-calendar__selected-event:focus-visible,.av-calendar__year-month-title:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--av-calendar-accent) 24%,transparent);outline:none}.av-calendar__view-switch{background:var(--av-calendar-cell-muted-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);display:inline-flex;padding:.125rem}.av-calendar__view-button{background:transparent;border-color:transparent;min-height:2rem;padding-inline:.65rem}.av-calendar__weekdays,.av-calendar__month-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.av-calendar__weekdays{gap:.25rem;margin-bottom:.25rem}.av-calendar__weekday{color:var(--av-calendar-muted);font-size:.72rem;font-weight:800;padding:.25rem;text-align:center;text-transform:capitalize}.av-calendar__month-grid{background:var(--av-calendar-border);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);gap:1px;overflow:hidden}.av-calendar__day{background:var(--av-calendar-cell-bg);box-sizing:border-box;cursor:pointer;display:grid;grid-template-rows:auto 1fr auto;min-height:7rem;min-width:0;padding:.5rem}.av-calendar__day:hover{background:var(--av-calendar-accent-soft)}.av-calendar__day--adjacent{background:var(--av-calendar-cell-muted-bg);color:var(--av-calendar-muted)}.av-calendar__day--hidden{cursor:default;opacity:.28}.av-calendar__day--selected{box-shadow:inset 0 0 0 2px var(--av-calendar-accent)}.av-calendar__day--today .av-calendar__day-number,.av-calendar__mini-day--today .av-calendar__mini-day-number{background:var(--av-calendar-accent);color:var(--av-white)}.av-calendar__day-number{align-items:center;border-radius:var(--av-radius-full);display:inline-flex;font-size:.8125rem;font-weight:800;height:1.7rem;justify-content:center;justify-self:end;line-height:1;width:1.7rem}.av-calendar__event-list{align-content:start;display:grid;gap:.25rem;margin-top:.35rem;min-width:0}.av-calendar__event,.av-calendar__event-more{border-radius:var(--av-radius-xs);font-size:.72rem;line-height:1.2;min-width:0}.av-calendar__event{align-items:center;background:color-mix(in srgb,var(--av-calendar-event-color) 12%,transparent);border:0;border-left:3px solid var(--av-calendar-event-color);color:var(--av-calendar-text);cursor:pointer;display:flex;gap:.3rem;padding:.25rem .35rem;text-align:left}.av-calendar__event:hover{background:color-mix(in srgb,var(--av-calendar-event-color) 18%,transparent)}.av-calendar__event--disabled{cursor:not-allowed;opacity:.52}.av-calendar__event-time{color:var(--av-calendar-muted);flex:0 0 auto;font-weight:800}.av-calendar__event-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-calendar__event-more{color:var(--av-calendar-muted);font-weight:800;padding-inline:.35rem}.av-calendar__dots,.av-calendar__mini-dots{align-items:center;display:flex;gap:.16rem;justify-content:center}.av-calendar__dots{display:none;margin-top:.2rem}.av-calendar__dot,.av-calendar__mini-dot{border-radius:var(--av-radius-full);flex:0 0 auto;height:.34rem;width:.34rem}.av-calendar__year{display:grid;gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr))}.av-calendar__year-month{background:var(--av-calendar-panel-bg);border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);display:grid;gap:.35rem;padding:.625rem}.av-calendar__year-month-title{align-items:center;background:transparent;border:0;border-radius:var(--av-radius-sm);color:var(--av-calendar-text);cursor:pointer;display:flex;font:inherit;font-size:.85rem;font-weight:800;justify-content:space-between;min-height:2rem;padding:.25rem .35rem;text-align:left;text-transform:capitalize}.av-calendar__year-month-count{background:var(--av-calendar-accent);border-radius:var(--av-radius-full);color:var(--av-white);font-size:.68rem;padding:.25rem .35rem}.av-calendar__mini-weekdays,.av-calendar__mini-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.av-calendar__mini-weekdays{color:var(--av-calendar-muted);font-size:.64rem;font-weight:800;text-align:center}.av-calendar__mini-day{align-items:center;aspect-ratio:1;background:transparent;border:0;border-radius:var(--av-radius-sm);color:var(--av-calendar-text);cursor:pointer;display:grid;gap:.08rem;justify-items:center;padding:.12rem}.av-calendar__mini-day:not(:disabled):hover,.av-calendar__mini-day--selected{background:var(--av-calendar-accent-soft);color:var(--av-calendar-accent-strong)}.av-calendar__mini-day-number{align-items:center;border-radius:var(--av-radius-full);display:inline-flex;font-size:.68rem;font-weight:800;height:1.25rem;justify-content:center;line-height:1;width:1.25rem}@container (max-width: 56rem){.av-calendar__year{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (max-width: 42rem){.av-calendar__year{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (max-width: 28rem){.av-calendar__year{grid-template-columns:1fr}}.av-calendar__selected{border:1px solid var(--av-calendar-border);border-radius:var(--av-radius-sm);padding:.75rem}.av-calendar__selected-header,.av-calendar__selected-event{align-items:center;display:flex;gap:.5rem;justify-content:space-between}.av-calendar__selected-date,.av-calendar__selected-event-title{font-weight:800}.av-calendar__selected-event-body{min-width:0}.av-calendar__selected-event{background:transparent;border:0;border-left:3px solid var(--av-calendar-event-color);color:var(--av-calendar-text);cursor:pointer;font:inherit;padding:.4rem;text-align:left;width:100%}.av-calendar__selected-event:hover{background:color-mix(in srgb,var(--av-calendar-event-color) 12%,transparent)}.av-calendar__selected-event-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av-calendar__selected-count,.av-calendar__selected-event-time,.av-calendar__empty{color:var(--av-calendar-muted);font-size:.75rem;font-weight:700}@media(max-width:640px){.av-calendar{gap:.75rem;padding:.75rem}.av-calendar__header{align-items:stretch;display:grid}.av-calendar__nav,.av-calendar__actions{justify-content:space-between}.av-calendar__title{font-size:.98rem}.av-calendar__weekday{font-size:.68rem;padding:.2rem 0}.av-calendar__day{align-content:start;aspect-ratio:1;gap:.12rem;min-height:0;padding:.3rem .18rem}.av-calendar__day-number{font-size:.75rem;height:1.45rem;justify-self:center;width:1.45rem}.av-calendar__event-list{display:none}.av-calendar__dots{display:flex}}\n"] }]
3853
+ }], ctorParameters: () => [], propDecorators: { events: [{ type: i0.Input, args: [{ isSignal: true, alias: "events", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], maxVisibleEvents: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleEvents", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], selectedDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedDate", required: false }] }], showAdjacentDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAdjacentDays", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], view: [{ type: i0.Input, args: [{ isSignal: true, alias: "view", required: false }] }], viewDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewDate", required: false }] }], weekdayFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "weekdayFormat", required: false }] }], dateSelect: [{ type: i0.Output, args: ["dateSelect"] }], eventSelect: [{ type: i0.Output, args: ["eventSelect"] }], selectedDateChange: [{ type: i0.Output, args: ["selectedDateChange"] }], viewChange: [{ type: i0.Output, args: ["viewChange"] }], viewDateChange: [{ type: i0.Output, args: ["viewDateChange"] }] } });
3854
+
3264
3855
  class AvBadge {
3265
3856
  config = inject(VISUALS_CONFIG);
3266
3857
  variant = input(this.config.theme.defaultVariant, /* @ts-ignore */
@@ -3289,5 +3880,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
3289
3880
  * Generated bundle index. Do not edit.
3290
3881
  */
3291
3882
 
3292
- export { AvBadge, AvButton, AvCarousel, AvCarouselItem, AvCheckbox, AvCluster, AvCurrencyInput, AvDateTimePicker, AvDivider, AvDropdown, AvFileUpload, AvForm, AvGrid, AvIcon, AvIconRegistry, AvInline, AvInput, AvMultiSelect, AvNavLink, AvPaginator, AvProgressBar, AvProgressBarCircle, AvSelect, AvSidenav, AvSlider, AvStack, AvStep, AvStepper, AvSwitch, AvTab, AvTable, AvTabs, AvText, AvTextArea, AvTooltip, ThemeService, VISUALS_CONFIG, provideAngularVisuals };
3883
+ export { AvBadge, AvButton, AvCalendar, AvCard, AvCarousel, AvCarouselItem, AvCheckbox, AvCluster, AvCurrencyInput, AvDateTimePicker, AvDivider, AvDropdown, AvDropdownItem, AvFileUpload, AvForm, AvGrid, AvIcon, AvIconRegistry, AvInline, AvInput, AvMultiSelect, AvNavDropdown, AvNavLink, AvPaginator, AvProgressBar, AvProgressBarCircle, AvSelect, AvSidenav, AvSlider, AvStack, AvStep, AvStepper, AvSwitch, AvTab, AvTable, AvTabs, AvText, AvTextArea, AvTooltip, ThemeService, VISUALS_CONFIG, provideAngularVisuals };
3293
3884
  //# sourceMappingURL=angular-visuals.mjs.map