keevo-components 2.0.209 → 2.0.211

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.
@@ -3414,6 +3414,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
3414
3414
  args: ['window:resize', ['$event']]
3415
3415
  }] } });
3416
3416
 
3417
+ ;
3418
+ function createEnumUtils(config) {
3419
+ return {
3420
+ listar: () => Object.values(config),
3421
+ getLabel: (value) => config[value]?.label ?? 'Desconhecido',
3422
+ getSeverity: (value) => config[value]?.severity,
3423
+ getHexColor: (value) => config[value]?.hexColor,
3424
+ isValid: (value) => Object.keys(config).includes(value)
3425
+ };
3426
+ }
3427
+
3428
+ const mapaSeverityColors = {
3429
+ primary: '#0A8765', // Verde
3430
+ secondary: '#0A3A78', // Azul escuro
3431
+ tertiary: '#778599', // Cinza
3432
+ info: '#0091C2', // Azul claro
3433
+ warning: '#E1963D', // Amarelo
3434
+ danger: '#B91C1C', // Laranja
3435
+ };
3436
+
3417
3437
  class DocsService {
3418
3438
  static validaCpfCnpj(cpfcnpj) {
3419
3439
  cpfcnpj = cpfcnpj.replace(/\D/g, '');
@@ -5629,122 +5649,6 @@ const TIMEOUTS = {
5629
5649
  autoSave: 3000
5630
5650
  };
5631
5651
 
5632
- class KvFilterCardsFormatterPipe {
5633
- transform(value, formato) {
5634
- if (value == null)
5635
- return '';
5636
- switch (formato) {
5637
- case 'currency':
5638
- return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(value));
5639
- case 'percent':
5640
- return `${(Number(value) * 100).toFixed(0)}%`;
5641
- case 'decimal':
5642
- return new Intl.NumberFormat('pt-BR').format(Number(value));
5643
- case 'int':
5644
- return `${Math.round(Number(value))}`;
5645
- case 'date':
5646
- return new Intl.DateTimeFormat('pt-BR').format(new Date(value));
5647
- case 'text':
5648
- default:
5649
- return value.toString();
5650
- }
5651
- }
5652
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsFormatterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
5653
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsFormatterPipe, name: "kvFilterCardsFormatter" }); }
5654
- }
5655
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsFormatterPipe, decorators: [{
5656
- type: Pipe,
5657
- args: [{ name: 'kvFilterCardsFormatter' }]
5658
- }] });
5659
-
5660
- class KvFilterCardsComponent {
5661
- constructor() {
5662
- // Lista de cards de filtro, cada um com um ícone e valor específico
5663
- this.cards = input();
5664
- this.staticCards = input(false);
5665
- this.cursorPointer = input(true);
5666
- this.selectedCards = model([]);
5667
- this.selectedCardsTratado = computed(() => {
5668
- const cardsSelecionados = this.selectedCards();
5669
- const cards = this.cards() ?? [];
5670
- if (!cardsSelecionados || cardsSelecionados.length === 0)
5671
- return [];
5672
- // Se for array de number, converte
5673
- if (typeof cardsSelecionados[0] === 'number') {
5674
- return cards.filter(c => cardsSelecionados.includes(c.id));
5675
- }
5676
- // Já é array de objeto
5677
- return cardsSelecionados;
5678
- });
5679
- this.loadingCards = input(false);
5680
- // Define se os cards devem ser exibidos em uma linha ou coluna
5681
- this.wrapCards = input(false);
5682
- // Define se os cards devem ser centralizados
5683
- this.alignCardsCenter = input(false);
5684
- this.onCardClick = output();
5685
- this.color = computed(() => (card) => {
5686
- const color = mapaSeverityColors[card.severity];
5687
- return color ? color : mapaSeverityColors.tertiary;
5688
- });
5689
- this.mixedColor = computed(() => (card) => {
5690
- return this.getTransparentMix(this.color()(card));
5691
- });
5692
- }
5693
- getTransparentMix(baseHex, opacity = 0.3) {
5694
- const r = parseInt(baseHex.slice(1, 3), 16);
5695
- const g = parseInt(baseHex.slice(3, 5), 16);
5696
- const b = parseInt(baseHex.slice(5, 7), 16);
5697
- return `rgba(${r}, ${g}, ${b}, ${opacity})`;
5698
- }
5699
- handleCardClick(card) {
5700
- this.onCardClick.emit(card);
5701
- this.selectedCards.update((raw) => {
5702
- let selected;
5703
- // Se vier como number[], converter usando this.cards()
5704
- if (typeof raw[0] === 'number') {
5705
- const allCards = this.cards() ?? [];
5706
- selected = allCards.filter(c => raw.includes(c.id));
5707
- }
5708
- else {
5709
- selected = raw;
5710
- }
5711
- const exists = selected.some(c => c.id === card.id);
5712
- const updated = exists
5713
- ? selected.filter(c => c.id !== card.id)
5714
- : [...selected, card];
5715
- return updated;
5716
- });
5717
- }
5718
- verificarSeCardEstaSelecionado(card) {
5719
- return this.selectedCardsTratado()?.find(c => c.id === card.id) !== undefined;
5720
- }
5721
- getColorFillPolygon(card) {
5722
- if (this.staticCards()) {
5723
- return 'var(--main-color)';
5724
- }
5725
- if (!this.selectedCardsTratado()?.includes(card)) {
5726
- return 'color-mix(in srgb, var(--mixed-color) 40%, white 60%)';
5727
- }
5728
- else {
5729
- return 'color-mix(in srgb, var(--mixed-color) 99%, white 1%)';
5730
- }
5731
- }
5732
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5733
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvFilterCardsComponent, selector: "kv-filter-cards", inputs: { cards: { classPropertyName: "cards", publicName: "cards", isSignal: true, isRequired: false, transformFunction: null }, staticCards: { classPropertyName: "staticCards", publicName: "staticCards", isSignal: true, isRequired: false, transformFunction: null }, cursorPointer: { classPropertyName: "cursorPointer", publicName: "cursorPointer", isSignal: true, isRequired: false, transformFunction: null }, selectedCards: { classPropertyName: "selectedCards", publicName: "selectedCards", isSignal: true, isRequired: false, transformFunction: null }, loadingCards: { classPropertyName: "loadingCards", publicName: "loadingCards", isSignal: true, isRequired: false, transformFunction: null }, wrapCards: { classPropertyName: "wrapCards", publicName: "wrapCards", isSignal: true, isRequired: false, transformFunction: null }, alignCardsCenter: { classPropertyName: "alignCardsCenter", publicName: "alignCardsCenter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedCards: "selectedCardsChange", onCardClick: "onCardClick" }, ngImport: i0, template: "<div\r\n id=\"filter-card-container\"\r\n class=\"flex flex-row w-full justify-content-between\"\r\n>\r\n <div\r\n class=\"flex p-fluid formgrid w-full gap-2 overflow-y-hidden\"\r\n [ngClass]=\"[\r\n wrapCards() ? 'flex-wrap' : 'flex-nowrap overflow-x-auto',\r\n alignCardsCenter() ? 'justify-content-center' : 'justify-content-start'\r\n ]\"\r\n #filterCardsContainer\r\n >\r\n @for (card of cards(); track card.id) {\r\n\r\n <div\r\n (click)=\"handleCardClick(card)\"\r\n [style.--main-color]=\"color()(card)\"\r\n [style.--mixed-color]=\"mixedColor()(card)\"\r\n class=\"filter-card\"\r\n [ngClass]=\"[\r\n 'filter-card-size',\r\n verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-active'\r\n : 'clickable',\r\n staticCards() ? 'filter-card-active' : '',\r\n !staticCards() && !verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-hover'\r\n : '',\r\n cursorPointer() ? 'cursor-pointer' : ''\r\n ]\"\r\n >\r\n <div class=\"filter-card-content\">\r\n <div class=\"filter-card-title\">\r\n <div class=\"flex flex-column\">\r\n <div\r\n style=\"font-weight: semibold; font-size: 0.75em\"\r\n [style.color]=\"color()(card)\"\r\n >\r\n {{ card?.titulo }}\r\n </div>\r\n\r\n <div class=\"h-1rem\">\r\n @if(loadingCards()){\r\n\r\n <span class=\"loading-spinner\"></span>\r\n\r\n } @else {\r\n\r\n <span\r\n class=\"flex align-items-center\"\r\n [style.color]=\"color()(card)\"\r\n style=\"font-size: 0.825em; font-weight: 600\"\r\n >\r\n {{ card.valor | kvFilterCardsFormatter : card.formato }}\r\n </span>\r\n\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (card.icon) {\r\n\r\n <div class=\"hex-icon-svg\">\r\n <!-- <svg style=\"overflow: visible\" viewBox=\"0 0 100 100\" class=\"hex-bg\">\r\n <polygon\r\n [attr.fill]=\"getColorFillPolygon(card)\"\r\n points=\"93.3 75,50 100,6.7 75,6.7 25,50 0,93.3 25\"\r\n stroke=\"var(--main-color)\"\r\n stroke-width=\"3\"\r\n stroke-linejoin=\"round\"\r\n stroke-linecap=\"round\"\r\n opacity=\"0.8\"\r\n />\r\n </svg> -->\r\n\r\n <div class=\"flex align-items-center justify-content-center p-2 border-round-lg transition-all transition-duration-300\" \r\n [style.backgroundColor]=\"getColorFillPolygon(card)\">\r\n <span\r\n [style.color]=\"'var(--main-color)'\"\r\n class=\"material-symbols-outlined icon\"\r\n >\r\n {{ card?.icon }}\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.card,.card-disabled,.filter-card-active{transition:border .3s ease,background-color .3s ease;border:1px solid #cbd5e1}.filter-card{cursor:pointer;transition:all ease-in-out .2s;border:1px solid #cbd5e1;border-radius:.5rem;-webkit-user-select:none;user-select:none}.filter-card-hover:hover{background:#f8fafc;transition:border .3s ease,background-color .3s ease;border:var(--main-color) .5px solid}.filter-card-hover:active{background:#f8fafc;border:var(--main-color) .5px solid}.filter-card-active{border:var(--main-color) .5px solid;background-color:color-mix(in srgb,var(--mixed-color) 10%,white 90%)}p{font-size:.75rem}.select-none{-webkit-user-select:none;user-select:none}.filter-card-content{display:flex;flex-direction:row;align-items:center;padding:.5rem;gap:.5rem}.filter-card-title{flex:1 1 0%;display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem}.hex-icon-svg{position:relative;width:1.75rem;height:1.75rem;font-size:1.5rem;display:flex;align-items:center;justify-content:center}.icon{font-weight:500!important;font-size:.75em!important}div.filter-card-hover:hover .hex-icon-svg>svg>polygon{fill:var(--mixed-color)}polygon{transition:all ease-in-out .25s}#filter-card-container{container:filter-card-container/inline-size}.filter-card-size{flex:1 1 auto;padding:0 .25rem;box-sizing:border-box}@container filter-card-container (min-width: 360px){.filter-card-size{width:50%}}@container filter-card-container (min-width: 600px){.filter-card-size{width:33.3333%}}@container filter-card-container (min-width: 900px){.filter-card-size{width:25%}}@container filter-card-container (min-width: 1200px){.filter-card-size{width:16.6667%}}@container filter-card-container (min-width: 1500px){.filter-card-size{width:14.2857%}}@media (min-width: 360px){.filter-card-size{width:50%}}@media (min-width: 600px){.filter-card-size{width:33.3333%}}@media (min-width: 900px){.filter-card-size{width:25%}}@media (min-width: 1200px){.filter-card-size{width:16.6667%}}@media (min-width: 1500px){.filter-card-size{width:14.2857%}}.flex-nowrap.overflow-x-auto{overflow-x:auto;scrollbar-width:thin}.flex-wrap .filter-card-size{flex:1 1 auto}.loading-spinner{width:.85rem;height:.85rem;border:2px solid var(--main-color);border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:rotation .8s linear infinite}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: KvFilterCardsFormatterPipe, name: "kvFilterCardsFormatter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5734
- }
5735
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsComponent, decorators: [{
5736
- type: Component,
5737
- args: [{ selector: 'kv-filter-cards', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n id=\"filter-card-container\"\r\n class=\"flex flex-row w-full justify-content-between\"\r\n>\r\n <div\r\n class=\"flex p-fluid formgrid w-full gap-2 overflow-y-hidden\"\r\n [ngClass]=\"[\r\n wrapCards() ? 'flex-wrap' : 'flex-nowrap overflow-x-auto',\r\n alignCardsCenter() ? 'justify-content-center' : 'justify-content-start'\r\n ]\"\r\n #filterCardsContainer\r\n >\r\n @for (card of cards(); track card.id) {\r\n\r\n <div\r\n (click)=\"handleCardClick(card)\"\r\n [style.--main-color]=\"color()(card)\"\r\n [style.--mixed-color]=\"mixedColor()(card)\"\r\n class=\"filter-card\"\r\n [ngClass]=\"[\r\n 'filter-card-size',\r\n verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-active'\r\n : 'clickable',\r\n staticCards() ? 'filter-card-active' : '',\r\n !staticCards() && !verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-hover'\r\n : '',\r\n cursorPointer() ? 'cursor-pointer' : ''\r\n ]\"\r\n >\r\n <div class=\"filter-card-content\">\r\n <div class=\"filter-card-title\">\r\n <div class=\"flex flex-column\">\r\n <div\r\n style=\"font-weight: semibold; font-size: 0.75em\"\r\n [style.color]=\"color()(card)\"\r\n >\r\n {{ card?.titulo }}\r\n </div>\r\n\r\n <div class=\"h-1rem\">\r\n @if(loadingCards()){\r\n\r\n <span class=\"loading-spinner\"></span>\r\n\r\n } @else {\r\n\r\n <span\r\n class=\"flex align-items-center\"\r\n [style.color]=\"color()(card)\"\r\n style=\"font-size: 0.825em; font-weight: 600\"\r\n >\r\n {{ card.valor | kvFilterCardsFormatter : card.formato }}\r\n </span>\r\n\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (card.icon) {\r\n\r\n <div class=\"hex-icon-svg\">\r\n <!-- <svg style=\"overflow: visible\" viewBox=\"0 0 100 100\" class=\"hex-bg\">\r\n <polygon\r\n [attr.fill]=\"getColorFillPolygon(card)\"\r\n points=\"93.3 75,50 100,6.7 75,6.7 25,50 0,93.3 25\"\r\n stroke=\"var(--main-color)\"\r\n stroke-width=\"3\"\r\n stroke-linejoin=\"round\"\r\n stroke-linecap=\"round\"\r\n opacity=\"0.8\"\r\n />\r\n </svg> -->\r\n\r\n <div class=\"flex align-items-center justify-content-center p-2 border-round-lg transition-all transition-duration-300\" \r\n [style.backgroundColor]=\"getColorFillPolygon(card)\">\r\n <span\r\n [style.color]=\"'var(--main-color)'\"\r\n class=\"material-symbols-outlined icon\"\r\n >\r\n {{ card?.icon }}\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.card,.card-disabled,.filter-card-active{transition:border .3s ease,background-color .3s ease;border:1px solid #cbd5e1}.filter-card{cursor:pointer;transition:all ease-in-out .2s;border:1px solid #cbd5e1;border-radius:.5rem;-webkit-user-select:none;user-select:none}.filter-card-hover:hover{background:#f8fafc;transition:border .3s ease,background-color .3s ease;border:var(--main-color) .5px solid}.filter-card-hover:active{background:#f8fafc;border:var(--main-color) .5px solid}.filter-card-active{border:var(--main-color) .5px solid;background-color:color-mix(in srgb,var(--mixed-color) 10%,white 90%)}p{font-size:.75rem}.select-none{-webkit-user-select:none;user-select:none}.filter-card-content{display:flex;flex-direction:row;align-items:center;padding:.5rem;gap:.5rem}.filter-card-title{flex:1 1 0%;display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem}.hex-icon-svg{position:relative;width:1.75rem;height:1.75rem;font-size:1.5rem;display:flex;align-items:center;justify-content:center}.icon{font-weight:500!important;font-size:.75em!important}div.filter-card-hover:hover .hex-icon-svg>svg>polygon{fill:var(--mixed-color)}polygon{transition:all ease-in-out .25s}#filter-card-container{container:filter-card-container/inline-size}.filter-card-size{flex:1 1 auto;padding:0 .25rem;box-sizing:border-box}@container filter-card-container (min-width: 360px){.filter-card-size{width:50%}}@container filter-card-container (min-width: 600px){.filter-card-size{width:33.3333%}}@container filter-card-container (min-width: 900px){.filter-card-size{width:25%}}@container filter-card-container (min-width: 1200px){.filter-card-size{width:16.6667%}}@container filter-card-container (min-width: 1500px){.filter-card-size{width:14.2857%}}@media (min-width: 360px){.filter-card-size{width:50%}}@media (min-width: 600px){.filter-card-size{width:33.3333%}}@media (min-width: 900px){.filter-card-size{width:25%}}@media (min-width: 1200px){.filter-card-size{width:16.6667%}}@media (min-width: 1500px){.filter-card-size{width:14.2857%}}.flex-nowrap.overflow-x-auto{overflow-x:auto;scrollbar-width:thin}.flex-wrap .filter-card-size{flex:1 1 auto}.loading-spinner{width:.85rem;height:.85rem;border:2px solid var(--main-color);border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:rotation .8s linear infinite}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
5738
- }] });
5739
- const mapaSeverityColors = {
5740
- primary: '#0A8765', // Verde
5741
- secondary: '#0A3A78', // Azul escuro
5742
- tertiary: '#778599', // Cinza
5743
- info: '#0091C2', // Azul claro
5744
- warning: '#E1963D', // Amarelo
5745
- danger: '#B91C1C', // Laranja
5746
- };
5747
-
5748
5652
  class KvTagsComponent {
5749
5653
  constructor() {
5750
5654
  this.tags = input();
@@ -10886,6 +10790,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
10886
10790
  }]
10887
10791
  }] });
10888
10792
 
10793
+ class KvFilterCardsFormatterPipe {
10794
+ transform(value, formato) {
10795
+ if (value == null)
10796
+ return '';
10797
+ switch (formato) {
10798
+ case 'currency':
10799
+ return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(value));
10800
+ case 'percent':
10801
+ return `${(Number(value) * 100).toFixed(0)}%`;
10802
+ case 'decimal':
10803
+ return new Intl.NumberFormat('pt-BR').format(Number(value));
10804
+ case 'int':
10805
+ return `${Math.round(Number(value))}`;
10806
+ case 'date':
10807
+ return new Intl.DateTimeFormat('pt-BR').format(new Date(value));
10808
+ case 'text':
10809
+ default:
10810
+ return value.toString();
10811
+ }
10812
+ }
10813
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsFormatterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
10814
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsFormatterPipe, name: "kvFilterCardsFormatter" }); }
10815
+ }
10816
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsFormatterPipe, decorators: [{
10817
+ type: Pipe,
10818
+ args: [{ name: 'kvFilterCardsFormatter' }]
10819
+ }] });
10820
+
10821
+ class KvFilterCardsComponent {
10822
+ constructor() {
10823
+ // Lista de cards de filtro, cada um com um ícone e valor específico
10824
+ this.cards = input();
10825
+ this.staticCards = input(false);
10826
+ this.cursorPointer = input(true);
10827
+ this.selectedCards = model([]);
10828
+ this.selectedCardsTratado = computed(() => {
10829
+ const cardsSelecionados = this.selectedCards();
10830
+ const cards = this.cards() ?? [];
10831
+ if (!cardsSelecionados || cardsSelecionados.length === 0)
10832
+ return [];
10833
+ // Se for array de number, converte
10834
+ if (typeof cardsSelecionados[0] === 'number') {
10835
+ return cards.filter(c => cardsSelecionados.includes(c.id));
10836
+ }
10837
+ // Já é array de objeto
10838
+ return cardsSelecionados;
10839
+ });
10840
+ this.loadingCards = input(false);
10841
+ // Define se os cards devem ser exibidos em uma linha ou coluna
10842
+ this.wrapCards = input(false);
10843
+ // Define se os cards devem ser centralizados
10844
+ this.alignCardsCenter = input(false);
10845
+ this.onCardClick = output();
10846
+ this.color = computed(() => (card) => {
10847
+ const color = mapaSeverityColors[card.severity];
10848
+ return color ? color : mapaSeverityColors.tertiary;
10849
+ });
10850
+ this.mixedColor = computed(() => (card) => {
10851
+ return this.getTransparentMix(this.color()(card));
10852
+ });
10853
+ }
10854
+ getTransparentMix(baseHex, opacity = 0.3) {
10855
+ const r = parseInt(baseHex.slice(1, 3), 16);
10856
+ const g = parseInt(baseHex.slice(3, 5), 16);
10857
+ const b = parseInt(baseHex.slice(5, 7), 16);
10858
+ return `rgba(${r}, ${g}, ${b}, ${opacity})`;
10859
+ }
10860
+ handleCardClick(card) {
10861
+ this.onCardClick.emit(card);
10862
+ this.selectedCards.update((raw) => {
10863
+ let selected;
10864
+ // Se vier como number[], converter usando this.cards()
10865
+ if (typeof raw[0] === 'number') {
10866
+ const allCards = this.cards() ?? [];
10867
+ selected = allCards.filter(c => raw.includes(c.id));
10868
+ }
10869
+ else {
10870
+ selected = raw;
10871
+ }
10872
+ const exists = selected.some(c => c.id === card.id);
10873
+ const updated = exists
10874
+ ? selected.filter(c => c.id !== card.id)
10875
+ : [...selected, card];
10876
+ return updated;
10877
+ });
10878
+ }
10879
+ verificarSeCardEstaSelecionado(card) {
10880
+ return this.selectedCardsTratado()?.find(c => c.id === card.id) !== undefined;
10881
+ }
10882
+ getColorFillPolygon(card) {
10883
+ if (this.staticCards()) {
10884
+ return 'var(--main-color)';
10885
+ }
10886
+ if (!this.selectedCardsTratado()?.includes(card)) {
10887
+ return 'color-mix(in srgb, var(--mixed-color) 40%, white 60%)';
10888
+ }
10889
+ else {
10890
+ return 'color-mix(in srgb, var(--mixed-color) 99%, white 1%)';
10891
+ }
10892
+ }
10893
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10894
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvFilterCardsComponent, selector: "kv-filter-cards", inputs: { cards: { classPropertyName: "cards", publicName: "cards", isSignal: true, isRequired: false, transformFunction: null }, staticCards: { classPropertyName: "staticCards", publicName: "staticCards", isSignal: true, isRequired: false, transformFunction: null }, cursorPointer: { classPropertyName: "cursorPointer", publicName: "cursorPointer", isSignal: true, isRequired: false, transformFunction: null }, selectedCards: { classPropertyName: "selectedCards", publicName: "selectedCards", isSignal: true, isRequired: false, transformFunction: null }, loadingCards: { classPropertyName: "loadingCards", publicName: "loadingCards", isSignal: true, isRequired: false, transformFunction: null }, wrapCards: { classPropertyName: "wrapCards", publicName: "wrapCards", isSignal: true, isRequired: false, transformFunction: null }, alignCardsCenter: { classPropertyName: "alignCardsCenter", publicName: "alignCardsCenter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedCards: "selectedCardsChange", onCardClick: "onCardClick" }, ngImport: i0, template: "<div\r\n id=\"filter-card-container\"\r\n class=\"flex flex-row w-full justify-content-between\"\r\n>\r\n <div\r\n class=\"flex p-fluid formgrid w-full gap-2 overflow-y-hidden\"\r\n [ngClass]=\"[\r\n wrapCards() ? 'flex-wrap' : 'flex-nowrap overflow-x-auto',\r\n alignCardsCenter() ? 'justify-content-center' : 'justify-content-start'\r\n ]\"\r\n #filterCardsContainer\r\n >\r\n @for (card of cards(); track card.id) {\r\n\r\n <div\r\n (click)=\"handleCardClick(card)\"\r\n [style.--main-color]=\"color()(card)\"\r\n [style.--mixed-color]=\"mixedColor()(card)\"\r\n class=\"filter-card\"\r\n [ngClass]=\"[\r\n 'filter-card-size',\r\n verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-active'\r\n : 'clickable',\r\n staticCards() ? 'filter-card-active' : '',\r\n !staticCards() && !verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-hover'\r\n : '',\r\n cursorPointer() ? 'cursor-pointer' : ''\r\n ]\"\r\n >\r\n <div class=\"filter-card-content\">\r\n <div class=\"filter-card-title\">\r\n <div class=\"flex flex-column\">\r\n <div\r\n style=\"font-weight: semibold; font-size: 0.75em\"\r\n [style.color]=\"color()(card)\"\r\n >\r\n {{ card?.titulo }}\r\n </div>\r\n\r\n <div class=\"h-1rem\">\r\n @if(loadingCards()){\r\n\r\n <span class=\"loading-spinner\"></span>\r\n\r\n } @else {\r\n\r\n <span\r\n class=\"flex align-items-center\"\r\n [style.color]=\"color()(card)\"\r\n style=\"font-size: 0.825em; font-weight: 600\"\r\n >\r\n {{ card.valor | kvFilterCardsFormatter : card.formato }}\r\n </span>\r\n\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (card.icon) {\r\n\r\n <div class=\"hex-icon-svg\">\r\n <!-- <svg style=\"overflow: visible\" viewBox=\"0 0 100 100\" class=\"hex-bg\">\r\n <polygon\r\n [attr.fill]=\"getColorFillPolygon(card)\"\r\n points=\"93.3 75,50 100,6.7 75,6.7 25,50 0,93.3 25\"\r\n stroke=\"var(--main-color)\"\r\n stroke-width=\"3\"\r\n stroke-linejoin=\"round\"\r\n stroke-linecap=\"round\"\r\n opacity=\"0.8\"\r\n />\r\n </svg> -->\r\n\r\n <div class=\"flex align-items-center justify-content-center p-2 border-round-lg transition-all transition-duration-300\" \r\n [style.backgroundColor]=\"getColorFillPolygon(card)\">\r\n <span\r\n [style.color]=\"'var(--main-color)'\"\r\n class=\"material-symbols-outlined icon\"\r\n >\r\n {{ card?.icon }}\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.card,.card-disabled,.filter-card-active{transition:border .3s ease,background-color .3s ease;border:1px solid #cbd5e1}.filter-card{cursor:pointer;transition:all ease-in-out .2s;border:1px solid #cbd5e1;border-radius:.5rem;-webkit-user-select:none;user-select:none}.filter-card-hover:hover{background:#f8fafc;transition:border .3s ease,background-color .3s ease;border:var(--main-color) .5px solid}.filter-card-hover:active{background:#f8fafc;border:var(--main-color) .5px solid}.filter-card-active{border:var(--main-color) .5px solid;background-color:color-mix(in srgb,var(--mixed-color) 10%,white 90%)}p{font-size:.75rem}.select-none{-webkit-user-select:none;user-select:none}.filter-card-content{display:flex;flex-direction:row;align-items:center;padding:.5rem;gap:.5rem}.filter-card-title{flex:1 1 0%;display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem}.hex-icon-svg{position:relative;width:1.75rem;height:1.75rem;font-size:1.5rem;display:flex;align-items:center;justify-content:center}.icon{font-weight:500!important;font-size:.75em!important}div.filter-card-hover:hover .hex-icon-svg>svg>polygon{fill:var(--mixed-color)}polygon{transition:all ease-in-out .25s}#filter-card-container{container:filter-card-container/inline-size}.filter-card-size{flex:1 1 auto;padding:0 .25rem;box-sizing:border-box}@container filter-card-container (min-width: 360px){.filter-card-size{width:50%}}@container filter-card-container (min-width: 600px){.filter-card-size{width:33.3333%}}@container filter-card-container (min-width: 900px){.filter-card-size{width:25%}}@container filter-card-container (min-width: 1200px){.filter-card-size{width:16.6667%}}@container filter-card-container (min-width: 1500px){.filter-card-size{width:14.2857%}}@media (min-width: 360px){.filter-card-size{width:50%}}@media (min-width: 600px){.filter-card-size{width:33.3333%}}@media (min-width: 900px){.filter-card-size{width:25%}}@media (min-width: 1200px){.filter-card-size{width:16.6667%}}@media (min-width: 1500px){.filter-card-size{width:14.2857%}}.flex-nowrap.overflow-x-auto{overflow-x:auto;scrollbar-width:thin}.flex-wrap .filter-card-size{flex:1 1 auto}.loading-spinner{width:.85rem;height:.85rem;border:2px solid var(--main-color);border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:rotation .8s linear infinite}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: KvFilterCardsFormatterPipe, name: "kvFilterCardsFormatter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10895
+ }
10896
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsComponent, decorators: [{
10897
+ type: Component,
10898
+ args: [{ selector: 'kv-filter-cards', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n id=\"filter-card-container\"\r\n class=\"flex flex-row w-full justify-content-between\"\r\n>\r\n <div\r\n class=\"flex p-fluid formgrid w-full gap-2 overflow-y-hidden\"\r\n [ngClass]=\"[\r\n wrapCards() ? 'flex-wrap' : 'flex-nowrap overflow-x-auto',\r\n alignCardsCenter() ? 'justify-content-center' : 'justify-content-start'\r\n ]\"\r\n #filterCardsContainer\r\n >\r\n @for (card of cards(); track card.id) {\r\n\r\n <div\r\n (click)=\"handleCardClick(card)\"\r\n [style.--main-color]=\"color()(card)\"\r\n [style.--mixed-color]=\"mixedColor()(card)\"\r\n class=\"filter-card\"\r\n [ngClass]=\"[\r\n 'filter-card-size',\r\n verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-active'\r\n : 'clickable',\r\n staticCards() ? 'filter-card-active' : '',\r\n !staticCards() && !verificarSeCardEstaSelecionado(card)\r\n ? 'filter-card-hover'\r\n : '',\r\n cursorPointer() ? 'cursor-pointer' : ''\r\n ]\"\r\n >\r\n <div class=\"filter-card-content\">\r\n <div class=\"filter-card-title\">\r\n <div class=\"flex flex-column\">\r\n <div\r\n style=\"font-weight: semibold; font-size: 0.75em\"\r\n [style.color]=\"color()(card)\"\r\n >\r\n {{ card?.titulo }}\r\n </div>\r\n\r\n <div class=\"h-1rem\">\r\n @if(loadingCards()){\r\n\r\n <span class=\"loading-spinner\"></span>\r\n\r\n } @else {\r\n\r\n <span\r\n class=\"flex align-items-center\"\r\n [style.color]=\"color()(card)\"\r\n style=\"font-size: 0.825em; font-weight: 600\"\r\n >\r\n {{ card.valor | kvFilterCardsFormatter : card.formato }}\r\n </span>\r\n\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (card.icon) {\r\n\r\n <div class=\"hex-icon-svg\">\r\n <!-- <svg style=\"overflow: visible\" viewBox=\"0 0 100 100\" class=\"hex-bg\">\r\n <polygon\r\n [attr.fill]=\"getColorFillPolygon(card)\"\r\n points=\"93.3 75,50 100,6.7 75,6.7 25,50 0,93.3 25\"\r\n stroke=\"var(--main-color)\"\r\n stroke-width=\"3\"\r\n stroke-linejoin=\"round\"\r\n stroke-linecap=\"round\"\r\n opacity=\"0.8\"\r\n />\r\n </svg> -->\r\n\r\n <div class=\"flex align-items-center justify-content-center p-2 border-round-lg transition-all transition-duration-300\" \r\n [style.backgroundColor]=\"getColorFillPolygon(card)\">\r\n <span\r\n [style.color]=\"'var(--main-color)'\"\r\n class=\"material-symbols-outlined icon\"\r\n >\r\n {{ card?.icon }}\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.card,.card-disabled,.filter-card-active{transition:border .3s ease,background-color .3s ease;border:1px solid #cbd5e1}.filter-card{cursor:pointer;transition:all ease-in-out .2s;border:1px solid #cbd5e1;border-radius:.5rem;-webkit-user-select:none;user-select:none}.filter-card-hover:hover{background:#f8fafc;transition:border .3s ease,background-color .3s ease;border:var(--main-color) .5px solid}.filter-card-hover:active{background:#f8fafc;border:var(--main-color) .5px solid}.filter-card-active{border:var(--main-color) .5px solid;background-color:color-mix(in srgb,var(--mixed-color) 10%,white 90%)}p{font-size:.75rem}.select-none{-webkit-user-select:none;user-select:none}.filter-card-content{display:flex;flex-direction:row;align-items:center;padding:.5rem;gap:.5rem}.filter-card-title{flex:1 1 0%;display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:.5rem}.hex-icon-svg{position:relative;width:1.75rem;height:1.75rem;font-size:1.5rem;display:flex;align-items:center;justify-content:center}.icon{font-weight:500!important;font-size:.75em!important}div.filter-card-hover:hover .hex-icon-svg>svg>polygon{fill:var(--mixed-color)}polygon{transition:all ease-in-out .25s}#filter-card-container{container:filter-card-container/inline-size}.filter-card-size{flex:1 1 auto;padding:0 .25rem;box-sizing:border-box}@container filter-card-container (min-width: 360px){.filter-card-size{width:50%}}@container filter-card-container (min-width: 600px){.filter-card-size{width:33.3333%}}@container filter-card-container (min-width: 900px){.filter-card-size{width:25%}}@container filter-card-container (min-width: 1200px){.filter-card-size{width:16.6667%}}@container filter-card-container (min-width: 1500px){.filter-card-size{width:14.2857%}}@media (min-width: 360px){.filter-card-size{width:50%}}@media (min-width: 600px){.filter-card-size{width:33.3333%}}@media (min-width: 900px){.filter-card-size{width:25%}}@media (min-width: 1200px){.filter-card-size{width:16.6667%}}@media (min-width: 1500px){.filter-card-size{width:14.2857%}}.flex-nowrap.overflow-x-auto{overflow-x:auto;scrollbar-width:thin}.flex-wrap .filter-card-size{flex:1 1 auto}.loading-spinner{width:.85rem;height:.85rem;border:2px solid var(--main-color);border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:rotation .8s linear infinite}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
10899
+ }] });
10900
+
10889
10901
  // Importação do componente que será declarado neste módulo
10890
10902
  class KvFilterCardsModule {
10891
10903
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFilterCardsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -13999,5 +14011,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
13999
14011
  * Generated bundle index. Do not edit.
14000
14012
  */
14001
14013
 
14002
- export { BaseApiService, BaseChartComponent, BaseComponent, BaseComponentButton, BaseComponentCrud, BaseComponentCrudForm, BaseComponentCrudList, BaseComponentDropDown, BaseComponentDropDownExternal, BaseComponentInput, BaseComponentMultiSelect, BasecomponentTable, BreadcrumbsService, CDN_URLS, CUSTOM_FONTS, CapitalizePipe, ChatService, ComponentProviders, ComponentService, CpfCnpjPipe, DEBOUNCE_TIME, DEFAULT_KV_EDITOR_CONFIG, DEFAULT_QUILL_CONFIG, DocsService, DragDirective, DynamicInputDirective, ERROR_MESSAGES, FONT_SIZES, FormService, ImageCutterService, ImagensService, KeevoComponentsModule, KeevoValidators, KvAvatarComponent, KvAvatarModule, KvButtonComponent, KvButtonModule, KvButtonPersonalizeComponent, KvButtonPopupComponent, KvButtonSecondaryComponent, KvButtonSuccessComponent, KvButtonsModule, KvCardSelectionComponent, KvCardSelectionModule, KvCarouselComponent, KvCarouselModule, KvChartComponent, KvChartModule, KvCheckComponent, KvConfirmationModalComponent, KvConfirmationModalModule, KvContentViewerComponent, KvContentViewerModule, KvDetailedListComponent, KvDropdownComponent, KvEditorComponent, KvEditorMentionService, KvEditorPdfService, KvEditorQuillService, KvEditorRelatorioService, KvErrorComponent, KvFileUploadComponent, KvFileUploadModule, KvFileViewerComponent, KvFileViewerModule, KvFileViewerNovoComponent, KvFileViewerNovoModule, KvFilterCardComponent, KvFilterCardModule, KvFilterCardsComponent, KvFilterCardsModule, KvFilterFieldsetComponent, KvFilterFieldsetModule, KvGIconComponent, KvGIconModule, KvHomeCardComponent, KvHomeCardModule, KvIconComponent, KvIconModule, KvImageUploadComponent, KvImageUploadModule, KvInputCalendarComponent, KvInputMaskComponent, KvInputNumberAddonComponent, KvInputNumberComponent, KvInputPasswordComponent, KvInputTextAddonComponent, KvInputTextCheckboxComponent, KvInputTextComponent, KvInputTextareaComponent, KvInputTimeComponent, KvInputsModule, KvLayoutComponent, KvLayoutModule, KvLoaderComponent, KvLoaderModule, KvLoaderService, KvLoginComponent, KvLoginModule, KvModalComponent, KvModalModule, KvMultiSelectComponent, KvOrgchartComponent, KvOrgchartModule, KvPageFormComponent, KvPageFormModule, KvPageStepperComponent, KvPageStepperodule, KvPickListComponent, KvPickListModule, KvProgressBarAlternativeComponent, KvProgressBarAlternativeModule, KvProgressBarModule, KvRadioGroupComponent, KvReportComponent, KvReportModule, KvSelectButtonComponent, KvSelectButtonsComponent, KvStackedBarChartComponent, KvStepperComponent, KvStepperModule, KvStepsComponent, KvSwitchComponent, KvTableComponent, KvTableDraggableComponent, KvTableDraggableModule, KvTableEditComponent, KvTableEditModule, KvTableExpandableComponent, KvTableExpandableModule, KvTableModule, KvTableViewerComponent, KvTagComponent, KvTagModule, KvTagsComponent, KvTagsModule, KvTimelineComponent, KvTreeEnvironmentComponent, KvTreeMultiSelectComponent, KvTreeViewComponent, KvTreetableComponent, KvTreetableModule, KvWidgetCardComponent, KvWorkspaceModule, KvtreeViewModule, MaskPipe, NoArvoreComponent, NotificationService, ObjectService, OrgChartService, PDF_STYLES, PeriodosChart, PipesModule, PrimeNgModule, ProgressBarComponent, TIMEOUTS, TablePaginate, TelefonePipe, TemplateDirective, TranslatePrimeng, WorkspaceComponent, getOrExecute, kvErrorModule, loading, mapToMenuItem, mapaSeverityColors };
14014
+ export { BaseApiService, BaseChartComponent, BaseComponent, BaseComponentButton, BaseComponentCrud, BaseComponentCrudForm, BaseComponentCrudList, BaseComponentDropDown, BaseComponentDropDownExternal, BaseComponentInput, BaseComponentMultiSelect, BasecomponentTable, BreadcrumbsService, CDN_URLS, CUSTOM_FONTS, CapitalizePipe, ChatService, ComponentProviders, ComponentService, CpfCnpjPipe, DEBOUNCE_TIME, DEFAULT_KV_EDITOR_CONFIG, DEFAULT_QUILL_CONFIG, DocsService, DragDirective, DynamicInputDirective, ERROR_MESSAGES, FONT_SIZES, FormService, ImageCutterService, ImagensService, KeevoComponentsModule, KeevoValidators, KvAvatarComponent, KvAvatarModule, KvButtonComponent, KvButtonModule, KvButtonPersonalizeComponent, KvButtonPopupComponent, KvButtonSecondaryComponent, KvButtonSuccessComponent, KvButtonsModule, KvCardSelectionComponent, KvCardSelectionModule, KvCarouselComponent, KvCarouselModule, KvChartComponent, KvChartModule, KvCheckComponent, KvConfirmationModalComponent, KvConfirmationModalModule, KvContentViewerComponent, KvContentViewerModule, KvDetailedListComponent, KvDropdownComponent, KvEditorComponent, KvEditorMentionService, KvEditorPdfService, KvEditorQuillService, KvEditorRelatorioService, KvErrorComponent, KvFileUploadComponent, KvFileUploadModule, KvFileViewerComponent, KvFileViewerModule, KvFileViewerNovoComponent, KvFileViewerNovoModule, KvFilterCardComponent, KvFilterCardModule, KvFilterCardsComponent, KvFilterCardsModule, KvFilterFieldsetComponent, KvFilterFieldsetModule, KvGIconComponent, KvGIconModule, KvHomeCardComponent, KvHomeCardModule, KvIconComponent, KvIconModule, KvImageUploadComponent, KvImageUploadModule, KvInputCalendarComponent, KvInputMaskComponent, KvInputNumberAddonComponent, KvInputNumberComponent, KvInputPasswordComponent, KvInputTextAddonComponent, KvInputTextCheckboxComponent, KvInputTextComponent, KvInputTextareaComponent, KvInputTimeComponent, KvInputsModule, KvLayoutComponent, KvLayoutModule, KvLoaderComponent, KvLoaderModule, KvLoaderService, KvLoginComponent, KvLoginModule, KvModalComponent, KvModalModule, KvMultiSelectComponent, KvOrgchartComponent, KvOrgchartModule, KvPageFormComponent, KvPageFormModule, KvPageStepperComponent, KvPageStepperodule, KvPickListComponent, KvPickListModule, KvProgressBarAlternativeComponent, KvProgressBarAlternativeModule, KvProgressBarModule, KvRadioGroupComponent, KvReportComponent, KvReportModule, KvSelectButtonComponent, KvSelectButtonsComponent, KvStackedBarChartComponent, KvStepperComponent, KvStepperModule, KvStepsComponent, KvSwitchComponent, KvTableComponent, KvTableDraggableComponent, KvTableDraggableModule, KvTableEditComponent, KvTableEditModule, KvTableExpandableComponent, KvTableExpandableModule, KvTableModule, KvTableViewerComponent, KvTagComponent, KvTagModule, KvTagsComponent, KvTagsModule, KvTimelineComponent, KvTreeEnvironmentComponent, KvTreeMultiSelectComponent, KvTreeViewComponent, KvTreetableComponent, KvTreetableModule, KvWidgetCardComponent, KvWorkspaceModule, KvtreeViewModule, MaskPipe, NoArvoreComponent, NotificationService, ObjectService, OrgChartService, PDF_STYLES, PeriodosChart, PipesModule, PrimeNgModule, ProgressBarComponent, TIMEOUTS, TablePaginate, TelefonePipe, TemplateDirective, TranslatePrimeng, WorkspaceComponent, createEnumUtils, getOrExecute, kvErrorModule, loading, mapToMenuItem, mapaSeverityColors };
14003
14015
  //# sourceMappingURL=keevo-components.mjs.map