UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

273 lines 62.8 kB
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../icon/icon.component"; export class ListComponent { elementRef; listElement; items = []; title = ''; headerActions = false; layout = 'vertical'; lineHeight = null; showDividers = true; grouped = false; expandable = true; draggable = false; density = 'high'; accordion = null; itemClick = new EventEmitter(); actionClick = new EventEmitter(); checkboxChange = new EventEmitter(); itemsReordered = new EventEmitter(); expandedChange = new EventEmitter(); expandedGroups = new Set(); dragItemIndex = null; dragGroupIndex = null; dragGroupItemIndex = null; constructor(elementRef) { this.elementRef = elementRef; } ngOnInit() { if (!this.expandable && this.grouped) { this.items.forEach(group => { if (this.isGroup(group)) { this.expandedGroups.add(group.id); } }); } } ngAfterViewInit() { this._setupCollapseBehavior(); } get listClasses() { const classes = ['br-list']; if (this.layout === 'horizontal') { classes.push('horizontal'); } if (this.lineHeight) { classes.push(`data-${this._lineHeightWord(this.lineHeight)}-lines`); } return classes.join(' '); } densityClass(item) { const density = item?.density || this.density; switch (density) { case 'medium': return 'py-3'; case 'low': return 'py-4'; case 'high': default: return ''; } } isGroup(item) { return item && item.hasOwnProperty('items') && Array.isArray(item.items); } isGroupExpanded(groupId) { return this.expandedGroups.has(groupId); } toggleGroup(groupId) { if (this.expandedGroups.has(groupId)) { this.expandedGroups.delete(groupId); } else { if (this.accordion) { this.items.forEach(group => { if (this.isGroup(group) && group.accordion === this.accordion) { this.expandedGroups.delete(group.id); } }); } this.expandedGroups.add(groupId); } } onItemClick(item) { this.itemClick.emit(item); } onActionClick(event, item) { event.stopPropagation(); this.actionClick.emit(item); } onCheckboxChange(event, item) { event.stopPropagation(); item.checked = event.target.checked; this.checkboxChange.emit(item); } trackById(index, item) { return item?.id ?? index; } groupTargetId(group) { return `br-list-group-${group.id}`; } onDragStart(event, index) { this.dragItemIndex = index; this.dragGroupIndex = null; this.dragGroupItemIndex = null; this._setDragEffect(event); } onGroupItemDragStart(event, groupIndex, itemIndex) { this.dragGroupIndex = groupIndex; this.dragGroupItemIndex = itemIndex; this.dragItemIndex = null; this._setDragEffect(event, `${groupIndex}-${itemIndex}`); } onDragOver(event, index) { event.preventDefault(); const listItem = this._closestBrItem(event.target); if (listItem) { listItem.classList.add('drag-over'); } } onDragLeave(event) { const listItem = this._closestBrItem(event.target); if (listItem) { listItem.classList.remove('drag-over'); } } onDrop(event, index) { event.preventDefault(); this._removeDragOver(event); if (this.dragItemIndex !== null && this.dragItemIndex !== index) { const item = this.items[this.dragItemIndex]; this.items.splice(this.dragItemIndex, 1); this.items.splice(index, 0, item); this.itemsReordered.emit([...this.items]); } } onGroupItemDrop(event, groupIndex, itemIndex) { event.preventDefault(); this._removeDragOver(event); if (this.dragGroupIndex !== null && this.dragGroupItemIndex !== null) { if (this.dragGroupIndex === groupIndex && this.dragGroupItemIndex !== itemIndex) { const group = this.items[groupIndex]; const item = group.items[this.dragGroupItemIndex]; group.items.splice(this.dragGroupItemIndex, 1); group.items.splice(itemIndex, 0, item); } else if (this.dragGroupIndex !== groupIndex) { const sourceGroup = this.items[this.dragGroupIndex]; const targetGroup = this.items[groupIndex]; const item = sourceGroup.items[this.dragGroupItemIndex]; sourceGroup.items.splice(this.dragGroupItemIndex, 1); targetGroup.items.splice(itemIndex, 0, item); } this.itemsReordered.emit([...this.items]); } } onDragEnd(event) { const element = event.target; element.classList.remove('dragging'); this.dragItemIndex = null; this.dragGroupIndex = null; this.dragGroupItemIndex = null; } _lineHeightWord(value) { const map = { '1': 'one', '2': 'two', '3': 'three' }; return map[value]; } _setDragEffect(event, data) { if (event.dataTransfer) { event.dataTransfer.effectAllowed = 'move'; event.dataTransfer.setData('text/plain', data || (this.dragItemIndex ?? '').toString()); const element = event.target; setTimeout(() => element.classList.add('dragging'), 0); } } _closestBrItem(element) { return element.closest('.br-item'); } _removeDragOver(event) { const listItem = this._closestBrItem(event.target); if (listItem) { listItem.classList.remove('drag-over'); } } _setupCollapseBehavior() { const root = this.listElement?.nativeElement || this.elementRef.nativeElement; if (!root) return; root.querySelectorAll('[data-toggle="collapse"]').forEach((trigger) => { trigger.addEventListener('click', (event) => { event.preventDefault(); const targetId = trigger.getAttribute('data-target'); const target = targetId ? document.getElementById(targetId) : null; if (!target) return; const isHidden = target.hasAttribute('hidden'); if (isHidden) { target.removeAttribute('hidden'); trigger.setAttribute('aria-expanded', 'true'); trigger.setAttribute('data-visible', 'true'); } else { target.setAttribute('hidden', ''); trigger.setAttribute('aria-expanded', 'false'); trigger.setAttribute('data-visible', 'false'); } trigger.querySelectorAll('i.fas').forEach((icon) => { const iconElement = icon; if (isHidden) { iconElement.classList.remove('fa-angle-down'); iconElement.classList.add('fa-angle-up'); } else { iconElement.classList.remove('fa-angle-up'); iconElement.classList.add('fa-angle-down'); } }); const groupId = trigger.getAttribute('data-group-id'); if (groupId) { this.expandedChange.emit({ id: groupId, expanded: isHidden }); } }); trigger.setAttribute('tabindex', '0'); trigger.addEventListener('keydown', (event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); trigger.click(); } }); }); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ListComponent, selector: "cfc-list", inputs: { items: "items", title: "title", headerActions: "headerActions", layout: "layout", lineHeight: "lineHeight", showDividers: "showDividers", grouped: "grouped", expandable: "expandable", draggable: "draggable", density: "density", accordion: "accordion" }, outputs: { itemClick: "itemClick", actionClick: "actionClick", checkboxChange: "checkboxChange", itemsReordered: "itemsReordered", expandedChange: "expandedChange" }, viewQueries: [{ propertyName: "listElement", first: true, predicate: ["listElement"], descendants: true, static: true }], ngImport: i0, template: "<div [class]=\"listClasses\" role=\"list\" #listElement>\r\n <!-- Header -->\r\n <div class=\"header\" *ngIf=\"title\">\r\n <div class=\"title\">{{ title }}</div>\r\n <div class=\"header-actions\" *ngIf=\"headerActions\">\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'search'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'ellipsis-v'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <span class=\"br-divider\" *ngIf=\"title && showDividers\"></span>\r\n\r\n <!-- Lista simples -->\r\n <ng-container *ngIf=\"!grouped; else groupedTemplate\">\r\n <ng-container *ngFor=\"let item of items; let i = index; let last = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: item,\r\n index: i,\r\n groupIndex: null,\r\n last: last,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !last\"></span>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<!-- Template de agrupamento -->\r\n<ng-template #groupedTemplate>\r\n <ng-container *ngFor=\"let group of items; let groupIndex = index; let lastGroup = last; trackBy: trackById\">\r\n <div class=\"group\" *ngIf=\"isGroup(group)\">\r\n <!-- R\u00F3tulo simples (por r\u00F3tulo) -->\r\n <div class=\"br-item\" role=\"listitem\" *ngIf=\"!expandable\">\r\n {{ group.title }}\r\n </div>\r\n\r\n <!-- R\u00F3tulo expans\u00EDvel (por expans\u00E3o) -->\r\n <div\r\n class=\"br-item\"\r\n role=\"listitem\"\r\n *ngIf=\"expandable\"\r\n data-toggle=\"collapse\"\r\n [attr.data-target]=\"groupTargetId(group)\"\r\n [attr.data-group-id]=\"group.id\"\r\n [attr.aria-expanded]=\"isGroupExpanded(group.id)\"\r\n aria-controls=\"groupTargetId(group)\">\r\n <div class=\"content\">\r\n <div class=\"flex-fill\">{{ group.title }}</div>\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"isGroupExpanded(group.id) ? 'angle-up' : 'angle-down'\" size=\"20px\"></cfc-icon>\r\n </div>\r\n </div>\r\n\r\n <!-- Itens do grupo -->\r\n <div class=\"br-list\" [id]=\"groupTargetId(group)\" role=\"list\" [hidden]=\"!isGroupExpanded(group.id)\">\r\n <ng-container *ngFor=\"let subItem of group.items; let i = index; let lastItem = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: subItem,\r\n index: i,\r\n groupIndex: groupIndex,\r\n last: lastItem,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onGroupItemDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onGroupItemDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastItem\"></span>\r\n </ng-container>\r\n </div>\r\n\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastGroup\"></span>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template de item -->\r\n<ng-template #itemTemplate\r\n let-item\r\n let-index=\"index\"\r\n let-groupIndex=\"groupIndex\"\r\n let-clickHandler=\"clickHandler\"\r\n let-dragStartHandler=\"dragStartHandler\"\r\n let-dragOverHandler=\"dragOverHandler\"\r\n let-dragLeaveHandler=\"dragLeaveHandler\"\r\n let-dropHandler=\"dropHandler\"\r\n let-dragEndHandler=\"dragEndHandler\">\r\n <div\r\n class=\"br-item\"\r\n [class]=\"densityClass(item)\"\r\n [class.item-checked]=\"item.checked\"\r\n role=\"listitem\"\r\n [draggable]=\"draggable\"\r\n (click)=\"clickHandler(item)\"\r\n (dragstart)=\"dragStartHandler($event, index, groupIndex)\"\r\n (dragover)=\"dragOverHandler($event, index)\"\r\n (dragleave)=\"dragLeaveHandler($event)\"\r\n (drop)=\"dropHandler($event, index, groupIndex)\"\r\n (dragend)=\"dragEndHandler($event)\">\r\n\r\n <!-- R\u00F3tulo simples (sem conte\u00FAdo complexo) -->\r\n <ng-container *ngIf=\"item.label && !item.primaryText && !item.icon && !item.avatar && !item.image && !item.meta && !item.hasAction && !item.hasOwnProperty('checked')\">\r\n {{ item.label }}\r\n </ng-container>\r\n\r\n <!-- Conte\u00FAdo complexo -->\r\n <div class=\"row align-items-center\" *ngIf=\"item.primaryText || item.icon || item.avatar || item.image || item.meta || item.hasAction || item.hasOwnProperty('checked') || draggable\">\r\n <div class=\"col-auto\" *ngIf=\"draggable || item.icon || item.avatar || item.image\">\r\n <cfc-icon\r\n *ngIf=\"draggable\"\r\n [familyName]=\"'fas'\"\r\n [iconName]=\"'grip-lines'\"\r\n size=\"16px\"\r\n className=\"drag-handle\">\r\n </cfc-icon>\r\n <img *ngIf=\"item.avatar\" class=\"avatar\" [src]=\"item.avatar\" alt=\"Avatar\">\r\n <img *ngIf=\"item.image\" class=\"image\" [src]=\"item.image\" alt=\"Imagem\">\r\n <cfc-icon\r\n *ngIf=\"item.icon\"\r\n [familyName]=\"item.iconFamily || 'fas'\"\r\n [iconName]=\"item.icon\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"subtitle\" *ngIf=\"item.subtitle\">{{ item.subtitle }}</div>\r\n <div class=\"primary-text\">{{ item.primaryText }}</div>\r\n <div class=\"secondary-text\" *ngIf=\"item.secondaryText\">{{ item.secondaryText }}</div>\r\n </div>\r\n <div class=\"col-auto\" *ngIf=\"item.meta || item.hasAction || item.hasOwnProperty('checked')\">\r\n <span class=\"meta\" *ngIf=\"item.meta\">{{ item.meta }}</span>\r\n <input\r\n *ngIf=\"item.hasOwnProperty('checked')\"\r\n type=\"checkbox\"\r\n [checked]=\"item.checked\"\r\n (change)=\"onCheckboxChange($event, item)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <button\r\n *ngIf=\"item.hasAction\"\r\n class=\"action-button\"\r\n type=\"button\"\r\n (click)=\"onActionClick($event, item)\">\r\n <cfc-icon\r\n [familyName]=\"item.actionIconFamily || 'fas'\"\r\n [iconName]=\"item.actionIcon || 'chevron-right'\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block;width:100%}.header{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;font-weight:600}.header .title{font-size:14px}.header .header-actions{display:flex;gap:8px}.header .header-action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.header .header-action-button:hover{color:var(--interactive-light, #1351b4)}.row{display:flex;flex-wrap:wrap;align-items:center;width:100%;gap:8px}.align-items-center{align-items:center}.col{flex:1 1 0;min-width:0}.col-auto{flex:0 0 auto;display:flex;align-items:center;gap:8px}.flex-fill{flex:1;min-width:0}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.subtitle{font-size:12px;color:var(--color-secondary-06, #888);margin-bottom:2px}.primary-text{font-size:14px;color:var(--color, #333);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.secondary-text{font-size:12px;color:var(--color-secondary-06, #888);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meta{font-size:12px;color:var(--color-secondary-06, #888);white-space:nowrap}.avatar{width:40px;height:40px;border-radius:50%;object-fit:cover}.image{width:56px;height:56px;object-fit:cover;border-radius:4px}.action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.action-button:hover{color:var(--interactive-light, #1351b4)}.drag-handle{cursor:grab;color:var(--color-secondary-05, #9e9d9d)}.drag-handle:active{cursor:grabbing}.br-item.dragging{opacity:.5}.br-item.drag-over{background-color:var(--blue-cool-vivid-10, #c3ebfa)}.br-item.item-checked{background-color:var(--info-alternative, #c3ebfa)}.group{width:100%}input[type=checkbox]{cursor:pointer}.br-list.horizontal .group{flex:1;min-width:200px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IconComponent, selector: "cfc-icon", inputs: ["iconName", "familyName", "className", "size", "color"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-list', template: "<div [class]=\"listClasses\" role=\"list\" #listElement>\r\n <!-- Header -->\r\n <div class=\"header\" *ngIf=\"title\">\r\n <div class=\"title\">{{ title }}</div>\r\n <div class=\"header-actions\" *ngIf=\"headerActions\">\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'search'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'ellipsis-v'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <span class=\"br-divider\" *ngIf=\"title && showDividers\"></span>\r\n\r\n <!-- Lista simples -->\r\n <ng-container *ngIf=\"!grouped; else groupedTemplate\">\r\n <ng-container *ngFor=\"let item of items; let i = index; let last = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: item,\r\n index: i,\r\n groupIndex: null,\r\n last: last,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !last\"></span>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<!-- Template de agrupamento -->\r\n<ng-template #groupedTemplate>\r\n <ng-container *ngFor=\"let group of items; let groupIndex = index; let lastGroup = last; trackBy: trackById\">\r\n <div class=\"group\" *ngIf=\"isGroup(group)\">\r\n <!-- R\u00F3tulo simples (por r\u00F3tulo) -->\r\n <div class=\"br-item\" role=\"listitem\" *ngIf=\"!expandable\">\r\n {{ group.title }}\r\n </div>\r\n\r\n <!-- R\u00F3tulo expans\u00EDvel (por expans\u00E3o) -->\r\n <div\r\n class=\"br-item\"\r\n role=\"listitem\"\r\n *ngIf=\"expandable\"\r\n data-toggle=\"collapse\"\r\n [attr.data-target]=\"groupTargetId(group)\"\r\n [attr.data-group-id]=\"group.id\"\r\n [attr.aria-expanded]=\"isGroupExpanded(group.id)\"\r\n aria-controls=\"groupTargetId(group)\">\r\n <div class=\"content\">\r\n <div class=\"flex-fill\">{{ group.title }}</div>\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"isGroupExpanded(group.id) ? 'angle-up' : 'angle-down'\" size=\"20px\"></cfc-icon>\r\n </div>\r\n </div>\r\n\r\n <!-- Itens do grupo -->\r\n <div class=\"br-list\" [id]=\"groupTargetId(group)\" role=\"list\" [hidden]=\"!isGroupExpanded(group.id)\">\r\n <ng-container *ngFor=\"let subItem of group.items; let i = index; let lastItem = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: subItem,\r\n index: i,\r\n groupIndex: groupIndex,\r\n last: lastItem,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onGroupItemDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onGroupItemDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastItem\"></span>\r\n </ng-container>\r\n </div>\r\n\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastGroup\"></span>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template de item -->\r\n<ng-template #itemTemplate\r\n let-item\r\n let-index=\"index\"\r\n let-groupIndex=\"groupIndex\"\r\n let-clickHandler=\"clickHandler\"\r\n let-dragStartHandler=\"dragStartHandler\"\r\n let-dragOverHandler=\"dragOverHandler\"\r\n let-dragLeaveHandler=\"dragLeaveHandler\"\r\n let-dropHandler=\"dropHandler\"\r\n let-dragEndHandler=\"dragEndHandler\">\r\n <div\r\n class=\"br-item\"\r\n [class]=\"densityClass(item)\"\r\n [class.item-checked]=\"item.checked\"\r\n role=\"listitem\"\r\n [draggable]=\"draggable\"\r\n (click)=\"clickHandler(item)\"\r\n (dragstart)=\"dragStartHandler($event, index, groupIndex)\"\r\n (dragover)=\"dragOverHandler($event, index)\"\r\n (dragleave)=\"dragLeaveHandler($event)\"\r\n (drop)=\"dropHandler($event, index, groupIndex)\"\r\n (dragend)=\"dragEndHandler($event)\">\r\n\r\n <!-- R\u00F3tulo simples (sem conte\u00FAdo complexo) -->\r\n <ng-container *ngIf=\"item.label && !item.primaryText && !item.icon && !item.avatar && !item.image && !item.meta && !item.hasAction && !item.hasOwnProperty('checked')\">\r\n {{ item.label }}\r\n </ng-container>\r\n\r\n <!-- Conte\u00FAdo complexo -->\r\n <div class=\"row align-items-center\" *ngIf=\"item.primaryText || item.icon || item.avatar || item.image || item.meta || item.hasAction || item.hasOwnProperty('checked') || draggable\">\r\n <div class=\"col-auto\" *ngIf=\"draggable || item.icon || item.avatar || item.image\">\r\n <cfc-icon\r\n *ngIf=\"draggable\"\r\n [familyName]=\"'fas'\"\r\n [iconName]=\"'grip-lines'\"\r\n size=\"16px\"\r\n className=\"drag-handle\">\r\n </cfc-icon>\r\n <img *ngIf=\"item.avatar\" class=\"avatar\" [src]=\"item.avatar\" alt=\"Avatar\">\r\n <img *ngIf=\"item.image\" class=\"image\" [src]=\"item.image\" alt=\"Imagem\">\r\n <cfc-icon\r\n *ngIf=\"item.icon\"\r\n [familyName]=\"item.iconFamily || 'fas'\"\r\n [iconName]=\"item.icon\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"subtitle\" *ngIf=\"item.subtitle\">{{ item.subtitle }}</div>\r\n <div class=\"primary-text\">{{ item.primaryText }}</div>\r\n <div class=\"secondary-text\" *ngIf=\"item.secondaryText\">{{ item.secondaryText }}</div>\r\n </div>\r\n <div class=\"col-auto\" *ngIf=\"item.meta || item.hasAction || item.hasOwnProperty('checked')\">\r\n <span class=\"meta\" *ngIf=\"item.meta\">{{ item.meta }}</span>\r\n <input\r\n *ngIf=\"item.hasOwnProperty('checked')\"\r\n type=\"checkbox\"\r\n [checked]=\"item.checked\"\r\n (change)=\"onCheckboxChange($event, item)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <button\r\n *ngIf=\"item.hasAction\"\r\n class=\"action-button\"\r\n type=\"button\"\r\n (click)=\"onActionClick($event, item)\">\r\n <cfc-icon\r\n [familyName]=\"item.actionIconFamily || 'fas'\"\r\n [iconName]=\"item.actionIcon || 'chevron-right'\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block;width:100%}.header{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;font-weight:600}.header .title{font-size:14px}.header .header-actions{display:flex;gap:8px}.header .header-action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.header .header-action-button:hover{color:var(--interactive-light, #1351b4)}.row{display:flex;flex-wrap:wrap;align-items:center;width:100%;gap:8px}.align-items-center{align-items:center}.col{flex:1 1 0;min-width:0}.col-auto{flex:0 0 auto;display:flex;align-items:center;gap:8px}.flex-fill{flex:1;min-width:0}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.subtitle{font-size:12px;color:var(--color-secondary-06, #888);margin-bottom:2px}.primary-text{font-size:14px;color:var(--color, #333);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.secondary-text{font-size:12px;color:var(--color-secondary-06, #888);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meta{font-size:12px;color:var(--color-secondary-06, #888);white-space:nowrap}.avatar{width:40px;height:40px;border-radius:50%;object-fit:cover}.image{width:56px;height:56px;object-fit:cover;border-radius:4px}.action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.action-button:hover{color:var(--interactive-light, #1351b4)}.drag-handle{cursor:grab;color:var(--color-secondary-05, #9e9d9d)}.drag-handle:active{cursor:grabbing}.br-item.dragging{opacity:.5}.br-item.drag-over{background-color:var(--blue-cool-vivid-10, #c3ebfa)}.br-item.item-checked{background-color:var(--info-alternative, #c3ebfa)}.group{width:100%}input[type=checkbox]{cursor:pointer}.br-list.horizontal .group{flex:1;min-width:200px}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { listElement: [{ type: ViewChild, args: ['listElement', { static: true }] }], items: [{ type: Input }], title: [{ type: Input }], headerActions: [{ type: Input }], layout: [{ type: Input }], lineHeight: [{ type: Input }], showDividers: [{ type: Input }], grouped: [{ type: Input }], expandable: [{ type: Input }], draggable: [{ type: Input }], density: [{ type: Input }], accordion: [{ type: Input }], itemClick: [{ type: Output }], actionClick: [{ type: Output }], checkboxChange: [{ type: Output }], itemsReordered: [{ type: Output }], expandedChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2xpc3QvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2xpc3QvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUF5QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFPckgsTUFBTSxPQUFPLGFBQWE7SUEwQko7SUF6QndCLFdBQVcsQ0FBYztJQUU1RCxLQUFLLEdBQVUsRUFBRSxDQUFDO0lBQ2xCLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUMvQixNQUFNLEdBQThCLFVBQVUsQ0FBQztJQUMvQyxVQUFVLEdBQTJCLElBQUksQ0FBQztJQUMxQyxZQUFZLEdBQVksSUFBSSxDQUFDO0lBQzdCLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFDekIsVUFBVSxHQUFZLElBQUksQ0FBQztJQUMzQixTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzNCLE9BQU8sR0FBOEIsTUFBTSxDQUFDO0lBQzVDLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBRS9CLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3RDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3pDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBQzNDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBcUMsQ0FBQztJQUVqRixjQUFjLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDakQsYUFBYSxHQUFr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bmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjZmMtbGlzdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xpc3QuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnbGlzdEVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBsaXN0RWxlbWVudCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbGF5b3V0OiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnID0gJ3ZlcnRpY2FsJztcclxuICBASW5wdXQoKSBsaW5lSGVpZ2h0OiAnMScgfCAnMicgfCAnMycgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBzaG93RGl2aWRlcnM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGdyb3VwZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBleHBhbmRhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBkcmFnZ2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBkZW5zaXR5OiAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnID0gJ2hpZ2gnO1xyXG4gIEBJbnB1dCgpIGFjY29yZGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgY2hlY2tib3hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaXRlbXNSZW9yZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG4gIEBPdXRwdXQoKSBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBleHBhbmRlZDogYm9vbGVhbiB9PigpO1xyXG5cclxuICBleHBhbmRlZEdyb3VwczogU2V0PHN0cmluZyB8IG51bWJlcj4gPSBuZXcgU2V0KCk7XHJcbiAgZHJhZ0l0ZW1JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgZHJhZ0dyb3VwSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIGRyYWdHcm91cEl0ZW1JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmV4cGFuZGFibGUgJiYgdGhpcy5ncm91cGVkKSB7XHJcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNHcm91cChncm91cCkpIHtcclxuICAgICAgICAgIHRoaXMuZXhwYW5kZWRHcm91cHMuYWRkKGdyb3VwLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2V0dXBDb2xsYXBzZUJlaGF2aW9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbGlzdENsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSBbJ2JyLWxpc3QnXTtcclxuICAgIGlmICh0aGlzLmxheW91dCA9PT0gJ2hvcml6b250YWwnKSB7XHJcbiAgICAgIGNsYXNzZXMucHVzaCgnaG9yaXpvbnRhbCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGluZUhlaWdodCkge1xyXG4gICAgICBjbGFzc2VzLnB1c2goYGRhdGEtJHt0aGlzLl9saW5lSGVpZ2h0V29yZCh0aGlzLmxpbmVIZWlnaHQpfS1saW5lc2ApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgZGVuc2l0eUNsYXNzKGl0ZW0/OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGVuc2l0eSA9IGl0ZW0/LmRlbnNpdHkgfHwgdGhpcy5kZW5zaXR5O1xyXG4gICAgc3dpdGNoIChkZW5zaXR5KSB7XHJcbiAgICAgIGNhc2UgJ21lZGl1bSc6IHJldHVybiAncHktMyc7XHJcbiAgICAgIGNhc2UgJ2xvdyc6IHJldHVybiAncHktNCc7XHJcbiAgICAgIGNhc2UgJ2hpZ2gnOlxyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0dyb3VwKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGl0ZW0gJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBBcnJheS5pc0FycmF5KGl0ZW0uaXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgaXNHcm91cEV4cGFuZGVkKGdyb3VwSWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRHcm91cHMuaGFzKGdyb3VwSWQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlR3JvdXAoZ3JvdXBJZDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5leHBhbmRlZEdyb3Vwcy5oYXMoZ3JvdXBJZCkpIHtcclxuICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5kZWxldGUoZ3JvdXBJZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5hY2NvcmRpb24pIHtcclxuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goZ3JvdXAgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNHcm91cChncm91cCkgJiYgZ3JvdXAuYWNjb3JkaW9uID09PSB0aGlzLmFjY29yZGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkR3JvdXBzLmRlbGV0ZShncm91cC5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5hZGQoZ3JvdXBJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1DbGljayhpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaXRlbUNsaWNrLmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBvbkFjdGlvbkNsaWNrKGV2ZW50OiBFdmVudCwgaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdChpdGVtKTtcclxuICB9XHJcblxyXG4gIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnQ6IEV2ZW50LCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaXRlbS5jaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgdGhpcy5jaGVja2JveENoYW5nZS5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gaXRlbT8uaWQgPz8gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBncm91cFRhcmdldElkKGdyb3VwOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBici1saXN0LWdyb3VwLSR7Z3JvdXAuaWR9YDtcclxuICB9XHJcblxyXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZ0l0ZW1JbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5kcmFnR3JvdXBJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLl9zZXREcmFnRWZmZWN0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uR3JvdXBJdGVtRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGdyb3VwSW5kZXg6IG51bWJlciwgaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZ0dyb3VwSW5kZXggPSBncm91cEluZGV4O1xyXG4gICAgdGhpcy5kcmFnR3JvdXBJdGVtSW5kZXggPSBpdGVtSW5kZXg7XHJcbiAgICB0aGlzLmRyYWdJdGVtSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5fc2V0RHJhZ0VmZmVjdChldmVudCwgYCR7Z3JvdXBJbmRleH0tJHtpdGVtSW5kZXh9YCk7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBjb25zdCBsaXN0SXRlbSA9IHRoaXMuX2Nsb3Nlc3RCckl0ZW0oZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcclxuICAgIGlmIChsaXN0SXRlbSkge1xyXG4gICAgICBsaXN0SXRlbS5jbGFzc0xpc3QuYWRkKCdkcmFnLW92ZXInKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxpc3RJdGVtID0gdGhpcy5fY2xvc2VzdEJySXRlbShldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgaWYgKGxpc3RJdGVtKSB7XHJcbiAgICAgIGxpc3RJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9yZW1vdmVEcmFnT3ZlcihldmVudCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZHJhZ0l0ZW1JbmRleCAhPT0gbnVsbCAmJiB0aGlzLmRyYWdJdGVtSW5kZXggIT09IGluZGV4KSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW3RoaXMuZHJhZ0l0ZW1JbmRleF07XHJcbiAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuZHJhZ0l0ZW1JbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGluZGV4LCAwLCBpdGVtKTtcclxuICAgICAgdGhpcy5pdGVtc1Jlb3JkZXJlZC5lbWl0KFsuLi50aGlzLml0ZW1zXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkdyb3VwSXRlbURyb3AoZXZlbnQ6IERyYWdFdmVudCwgZ3JvdXBJbmRleDogbnVtYmVyLCBpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuX3JlbW92ZURyYWdPdmVyKGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5kcmFnR3JvdXBJbmRleCAhPT0gbnVsbCAmJiB0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5kcmFnR3JvdXBJbmRleCA9PT0gZ3JvdXBJbmRleCAmJiB0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCAhPT0gaXRlbUluZGV4KSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLml0ZW1zW2dyb3VwSW5kZXhdIGFzIGFueTtcclxuICAgICAgICBjb25zdCBpdGVtID0gZ3JvdXAuaXRlbXNbdGhpcy5kcmFnR3JvdXBJdGVtSW5kZXhdO1xyXG4gICAgICAgIGdyb3VwLml0ZW1zLnNwbGljZSh0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCwgMSk7XHJcbiAgICAgICAgZ3JvdXAuaXRlbXMuc3BsaWNlKGl0ZW1JbmRleCwgMCwgaXRlbSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnR3JvdXBJbmRleCAhPT0gZ3JvdXBJbmRleCkge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZUdyb3VwID0gdGhpcy5pdGVtc1t0aGlzLmRyYWdHcm91cEluZGV4XSBhcyBhbnk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0R3JvdXAgPSB0aGlzLml0ZW1zW2dyb3VwSW5kZXhdIGFzIGFueTtcclxuICAgICAgICBjb25zdCBpdGVtID0gc291cmNlR3JvdXAuaXRlbXNbdGhpcy5kcmFnR3JvdXBJdGVtSW5kZXhdO1xyXG4gICAgICAgIHNvdXJjZUdyb3VwLml0ZW1zLnNwbGljZSh0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCwgMSk7XHJcbiAgICAgICAgdGFyZ2V0R3JvdXAuaXRlbXMuc3BsaWNlKGl0ZW1JbmRleCwgMCwgaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pdGVtc1Jlb3JkZXJlZC5lbWl0KFsuLi50aGlzLml0ZW1zXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyYWdFbmQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTtcclxuICAgIHRoaXMuZHJhZ0l0ZW1JbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLmRyYWdHcm91cEluZGV4ID0gbnVsbDtcclxuICAgIHRoaXMuZHJhZ0dyb3VwSXRlbUluZGV4ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xpbmVIZWlnaHRXb3JkKHZhbHVlOiAnMScgfCAnMicgfCAnMycpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnMSc6ICdvbmUnLCAnMic6ICd0d28nLCAnMyc6ICd0aHJlZScgfTtcclxuICAgIHJldHVybiBtYXBbdmFsdWVdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0RHJhZ0VmZmVjdChldmVudDogRHJhZ0V2ZW50LCBkYXRhPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZXZlb