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.
- package/README.md +9 -8
- package/fesm2022/angular-visuals.mjs +608 -17
- package/fesm2022/angular-visuals.mjs.map +1 -1
- package/package.json +1 -1
- package/types/angular-visuals.d.ts +203 -17
|
@@ -228,7 +228,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
228
228
|
}]
|
|
229
229
|
}], ctorParameters: () => [] });
|
|
230
230
|
|
|
231
|
-
class
|
|
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:
|
|
280
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type:
|
|
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:
|
|
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
|
-
|
|
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
|