@govbr-ds/webcomponents 2.0.0-next.41 → 2.0.0-next.42

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.
Files changed (102) hide show
  1. package/dist/cjs/br-button.br-icon.entry.cjs.js.map +1 -1
  2. package/dist/cjs/br-button_2.cjs.entry.js +21 -2
  3. package/dist/cjs/br-button_2.cjs.entry.js.map +1 -1
  4. package/dist/cjs/br-collapse.br-list.entry.cjs.js.map +1 -1
  5. package/dist/cjs/br-collapse_2.cjs.entry.js +1 -1
  6. package/dist/cjs/br-collapse_2.cjs.entry.js.map +1 -1
  7. package/dist/cjs/br-dropdown.cjs.entry.js +324 -10
  8. package/dist/cjs/br-dropdown.cjs.entry.js.map +1 -1
  9. package/dist/cjs/br-dropdown.entry.cjs.js.map +1 -1
  10. package/dist/cjs/br-item.cjs.entry.js +1 -1
  11. package/dist/cjs/br-item.cjs.entry.js.map +1 -1
  12. package/dist/cjs/br-item.entry.cjs.js.map +1 -1
  13. package/dist/cjs/br-scrim.cjs.entry.js +1 -1
  14. package/dist/cjs/br-scrim.cjs.entry.js.map +1 -1
  15. package/dist/cjs/br-scrim.entry.cjs.js.map +1 -1
  16. package/dist/cjs/loader.cjs.js +1 -1
  17. package/dist/cjs/webcomponents.cjs.js +1 -1
  18. package/dist/collection/components/dropdown/dropdown.css +1 -1
  19. package/dist/collection/components/dropdown/dropdown.js +346 -9
  20. package/dist/collection/components/dropdown/dropdown.js.map +1 -1
  21. package/dist/collection/components/icon/icon.css +1 -1
  22. package/dist/collection/components/icon/icon.js +40 -1
  23. package/dist/collection/components/icon/icon.js.map +1 -1
  24. package/dist/collection/components/item/item.css +1 -1
  25. package/dist/collection/components/list/list.js +1 -1
  26. package/dist/collection/components/list/list.js.map +1 -1
  27. package/dist/collection/components/scrim/scrim.css +1 -1
  28. package/dist/collection/pages/scripts/menu.js +1 -1
  29. package/dist/components/br-avatar.js +1 -1
  30. package/dist/components/br-breadcrumb.js +4 -4
  31. package/dist/components/br-collapse.js +4 -4
  32. package/dist/components/br-dropdown.js +332 -25
  33. package/dist/components/br-dropdown.js.map +1 -1
  34. package/dist/components/br-footer-category.js +3 -3
  35. package/dist/components/br-footer-item.js +1 -1
  36. package/dist/components/br-footer-social.js +1 -1
  37. package/dist/components/br-icon.js +4 -4
  38. package/dist/components/br-input.js +3 -3
  39. package/dist/components/br-item.js +4 -4
  40. package/dist/components/br-list.js +4 -4
  41. package/dist/components/br-message.js +1 -1
  42. package/dist/components/br-scrim.js +1 -1
  43. package/dist/components/br-scrim.js.map +1 -1
  44. package/dist/components/br-select.js +4 -4
  45. package/dist/components/br-step-item.js +1 -1
  46. package/dist/components/br-tab-item.js +1 -1
  47. package/dist/components/br-tag.js +6 -6
  48. package/dist/components/br-upload.js +1 -1
  49. package/dist/components/{p-BxU9TOn1.js → p-BbFx1RUd.js} +3 -3
  50. package/dist/components/{p-pq3SZemh.js → p-CIINlcIu.js} +3 -3
  51. package/dist/components/{p-brOPUYUL.js → p-DJtFpYiN.js} +3 -3
  52. package/dist/components/p-DJtFpYiN.js.map +1 -0
  53. package/dist/components/{p-DlMJ2wZW.js → p-rHgHl2v-.js} +6 -6
  54. package/dist/components/{p-DlMJ2wZW.js.map → p-rHgHl2v-.js.map} +1 -1
  55. package/dist/components/{p-jx7aLpDh.js → p-vi3ehOfu.js} +40 -23
  56. package/dist/components/p-vi3ehOfu.js.map +1 -0
  57. package/dist/custom-elements.json +167 -0
  58. package/dist/esm/br-button.br-icon.entry.js.map +1 -1
  59. package/dist/esm/br-button_2.entry.js +21 -2
  60. package/dist/esm/br-button_2.entry.js.map +1 -1
  61. package/dist/esm/br-collapse.br-list.entry.js.map +1 -1
  62. package/dist/esm/br-collapse_2.entry.js +1 -1
  63. package/dist/esm/br-collapse_2.entry.js.map +1 -1
  64. package/dist/esm/br-dropdown.entry.js +324 -10
  65. package/dist/esm/br-dropdown.entry.js.map +1 -1
  66. package/dist/esm/br-item.entry.js +1 -1
  67. package/dist/esm/br-item.entry.js.map +1 -1
  68. package/dist/esm/br-scrim.entry.js +1 -1
  69. package/dist/esm/br-scrim.entry.js.map +1 -1
  70. package/dist/esm/loader.js +1 -1
  71. package/dist/esm/webcomponents.js +1 -1
  72. package/dist/hydrate/index.js +353 -18
  73. package/dist/hydrate/index.mjs +353 -18
  74. package/dist/types/components/dropdown/dropdown.d.ts +48 -1
  75. package/dist/types/components/icon/icon.d.ts +7 -0
  76. package/dist/types/components.d.ts +12 -0
  77. package/dist/webcomponents/br-button.br-icon.entry.esm.js.map +1 -1
  78. package/dist/webcomponents/br-collapse.br-list.entry.esm.js.map +1 -1
  79. package/dist/webcomponents/br-dropdown.entry.esm.js.map +1 -1
  80. package/dist/webcomponents/br-item.entry.esm.js.map +1 -1
  81. package/dist/webcomponents/br-scrim.entry.esm.js.map +1 -1
  82. package/dist/webcomponents/{p-713035b5.entry.js → p-0d6df204.entry.js} +3 -3
  83. package/dist/webcomponents/{p-713035b5.entry.js.map → p-0d6df204.entry.js.map} +1 -1
  84. package/dist/webcomponents/{p-c3267481.entry.js → p-3d5600cb.entry.js} +2 -2
  85. package/dist/webcomponents/p-3d5600cb.entry.js.map +1 -0
  86. package/dist/webcomponents/{p-ab251560.entry.js → p-8ac9dcff.entry.js} +329 -23
  87. package/dist/webcomponents/p-8ac9dcff.entry.js.map +1 -0
  88. package/dist/webcomponents/{p-dbfc2a44.entry.js → p-c25d500c.entry.js} +2 -2
  89. package/dist/webcomponents/p-c25d500c.entry.js.map +1 -0
  90. package/dist/webcomponents/{p-383a4240.entry.js → p-e33ca888.entry.js} +23 -7
  91. package/dist/webcomponents/p-e33ca888.entry.js.map +1 -0
  92. package/dist/webcomponents/webcomponents.esm.js +9 -7
  93. package/dist/webcomponents.html-custom-data.json +3 -2
  94. package/package.json +1 -1
  95. package/dist/components/p-brOPUYUL.js.map +0 -1
  96. package/dist/components/p-jx7aLpDh.js.map +0 -1
  97. package/dist/webcomponents/p-383a4240.entry.js.map +0 -1
  98. package/dist/webcomponents/p-ab251560.entry.js.map +0 -1
  99. package/dist/webcomponents/p-c3267481.entry.js.map +0 -1
  100. package/dist/webcomponents/p-dbfc2a44.entry.js.map +0 -1
  101. /package/dist/components/{p-BxU9TOn1.js.map → p-BbFx1RUd.js.map} +0 -0
  102. /package/dist/components/{p-pq3SZemh.js.map → p-CIINlcIu.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["dropdownCss","Dropdown","elementInternals","isOpen","customId","dropdownId","isOpenChanged","this","brDropdownChange","emit","connectedCallback","document","addEventListener","onClickOutside","bind","disconnectedCallback","removeEventListener","getCssClassMap","toggle","event","stopPropagation","path","composedPath","dropdownElement","el","shadowRoot","querySelector","includes","hide","open","render","h","Host","key","class","id","onClick","name"],"sources":["../../packages/webcomponents/src/components/dropdown/dropdown.scss?tag=br-dropdown&encapsulation=shadow","../../packages/webcomponents/src/components/dropdown/dropdown.tsx"],"sourcesContent":[":host {\n display: block;\n position: relative;\n\n #trigger {\n display: inline-block;\n cursor: pointer;\n }\n\n #target {\n display: none;\n position: absolute;\n top: 100%;\n left: 0;\n }\n}\n\n:host([is-open]) {\n #target {\n display: block;\n }\n}\n","import { AttachInternals, Component, Element, Event, EventEmitter, h, Host, Method, Prop, Watch } from '@stencil/core'\n\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/dropdown?tab=designer).\n *\n * @slot trigger - Slot que recebe o elemento acionador\n * @slot target - Slot que recebe o elemento alvo\n */\n@Component({\n tag: 'br-dropdown',\n styleUrl: 'dropdown.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Dropdown {\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el: HTMLBrDropdownElement\n\n @AttachInternals() elementInternals: ElementInternals\n\n /**\n * Indica se o dropdown está aberto ou fechado.\n * Esta propriedade é refletida no DOM e pode ser alterada externamente.\n * O valor padrão é falso (fechado).\n */\n @Prop({ reflect: true, mutable: true }) isOpen: boolean = false\n\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = `br-dropdown-${dropdownId++}`\n\n /**\n * Método chamado sempre que a propriedade `isOpen` muda.\n * Emite um evento com o novo estado do dropdown.\n */\n @Watch('isOpen')\n isOpenChanged() {\n this.brDropdownChange.emit({ 'is-opened': this.isOpen })\n }\n\n connectedCallback() {\n document.addEventListener('click', this.onClickOutside.bind(this))\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.onClickOutside.bind(this))\n }\n\n /**\n * Evento emitido quando o estado do dropdown muda.\n */\n @Event() brDropdownChange: EventEmitter<{ 'is-opened': boolean }>\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-dropdown': true,\n }\n }\n\n /**\n * Alterna o estado do dropdown entre aberto e fechado.\n */\n private readonly toggle = (event: Event) => {\n event.stopPropagation()\n this.isOpen = !this.isOpen\n }\n\n /**\n * Método que lida com cliques fora do dropdown.\n *\n * @param {MouseEvent} event - O evento de clique que ocorreu.\n */\n private onClickOutside(event: MouseEvent) {\n const path = event.composedPath()\n const dropdownElement = this.el.shadowRoot.querySelector('#target')\n\n if (dropdownElement && !path.includes(dropdownElement)) {\n this.hide()\n }\n }\n\n /**\n * Abre o dropdown.\n * Define a propriedade `isOpen` como verdadeira e retorna o novo estado.\n * Este método é marcado com @Method() para que possa ser chamado externamente.\n */\n @Method()\n async open(): Promise<{ isOpen: boolean }> {\n this.isOpen = true\n return { isOpen: this.isOpen } // Retorna o novo estado\n }\n\n /**\n * Esconde o dropdown.\n * Define a propriedade `isOpen` como falsa e retorna o novo estado.\n * Este método é marcado com @Method() para que possa ser chamado externamente.\n */\n @Method()\n async hide(): Promise<{ isOpen: boolean }> {\n this.isOpen = false\n return { isOpen: this.isOpen } // Retorna o novo estado\n }\n\n render() {\n return (\n <Host is-open={this.isOpen}>\n <div class={this.getCssClassMap()} id={this.customId}>\n <div\n id=\"trigger\"\n onClick={this.toggle}\n aria-controls=\"target\"\n aria-haspopup=\"true\"\n aria-expanded={this.isOpen}\n >\n <slot name=\"trigger\"></slot>\n </div>\n <div id=\"target\" aria-hidden={!this.isOpen}>\n <slot name=\"target\"></slot>\n </div>\n </div>\n </Host>\n )\n }\n}\n\nlet dropdownId = 0\n"],"mappings":";;;;;;AAAA,MAAMA,IAAc;;MCgBPC,IAAQ;;;;;;;;;;;;;;EAOAC;;;;;;EAOqBC,OAAkB;;;;;EAMxBC,SAAmB,eAAeC;;;;;EAOpE,aAAAC;IACEC,KAAKC,iBAAiBC,KAAK;MAAE,aAAaF,KAAKJ;;;EAGjD,iBAAAO;IACEC,SAASC,iBAAiB,SAASL,KAAKM,eAAeC,KAAKP;;EAG9D,oBAAAQ;IACEJ,SAASK,oBAAoB,SAAST,KAAKM,eAAeC,KAAKP;;;;SAMxDC;EAED,cAAAS;IACN,OAAO;MACL,eAAe;;;;;SAOFC,OAAUC;IACzBA,EAAMC;IACNb,KAAKJ,UAAUI,KAAKJ;AAAM;;;;;;EAQpB,cAAAU,CAAeM;IACrB,MAAME,IAAOF,EAAMG;IACnB,MAAMC,IAAkBhB,KAAKiB,GAAGC,WAAWC,cAAc;IAEzD,IAAIH,MAAoBF,EAAKM,SAASJ,IAAkB;MACtDhB,KAAKqB;;;;;;;SAUT,UAAMC;IACJtB,KAAKJ,SAAS;IACd,OAAO;MAAEA,QAAQI,KAAKJ;;;;;;;;SASxB,UAAMyB;IACJrB,KAAKJ,SAAS;IACd,OAAO;MAAEA,QAAQI,KAAKJ;;;;EAGxB,MAAA2B;IACE,OACEC,EAACC,GAAc;MAAAC,KAAA;MAAA,WAAA1B,KAAKJ;OAClB4B,EAAK;MAAAE,KAAA;MAAAC,OAAO3B,KAAKU;MAAkBkB,IAAI5B,KAAKH;OAC1C2B,EAAA;MAAAE,KAAA;MACEE,IAAG;MACHC,SAAS7B,KAAKW;MAAM,iBACN;MACA;MACC,iBAAAX,KAAKJ;OAEpB4B,EAAA;MAAAE,KAAA;MAAMI,MAAK;SAEbN,EAAA;MAAAE,KAAA;MAAKE,IAAG;MAAQ,gBAAe5B,KAAKJ;OAClC4B,EAAM;MAAAE,KAAA;MAAAI,MAAK;;;;;;;;;;;;;AAQvB,IAAIhC,IAAa","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["scrimCss","Scrim","elementInternals","customId","ScrimId","isOpen","positionContent","disableCloseOnClick","zIndex","customBackground","customOpacity","displayMode","scrollStrategy","scrollThreshold","activator","brScrimOpen","brScrimClose","isActive","hasActivatorSlot","contentRef","activatorElement","scrollOffset","lastScrollTop","previouslyFocusedElement","static","join","handleOpenChange","newValue","this","updateStyles","document","activeElement","applyScrollStrategy","setTimeout","focusFirstElement","emit","resetScrolling","restoreFocus","undefined","el","style","setProperty","handleActivatorChange","removeActivatorClickListener","setupActivator","componentWillLoad","checkActivatorSlot","componentDidLoad","setupActivatorSlotClick","addEventListener","handleKeyDown","connectedCallback","window","handleScrollClose","disconnectedCallback","removeEventListener","cleanupActivatorSlotClick","slotName","querySelector","slotEl","shadowRoot","assignedElements","length","handleActivatorClick","console","warn","parentElement","element","HTMLElement","addActivatorClickListener","toggle","enableScrollBlock","enableScrollWatcher","scrollY","body","documentElement","handleBlockScroll","e","scrollTo","preventDefault","stopPropagation","removeProperty","currentScroll","Math","abs","setAttribute","focus","focusableElements","getFocusableElements","firstElement","scrollIntoView","block","inline","preventScroll","targetElement","isConnected","error","defaultSlot","flatten","forEach","matches","FOCUSABLE_SELECTORS","push","nestedFocusables","Array","from","querySelectorAll","filterVisibleElements","elements","filter","offsetWidth","offsetHeight","getComputedStyle","visibility","event","shouldHandleEscape","key","handleTabNavigation","lastElement","isTabForward","shiftKey","shouldTrapFocus","wrapFocus","handleMaskClick","_event","close","getCssClassMap","opened","setScrollThreshold","threshold","open","render","h","Host","name","class","id","role","onClick","ref","tabIndex","onKeyDown"],"sources":["../../packages/webcomponents/src/components/scrim/scrim.scss?tag=br-scrim&encapsulation=shadow","../../packages/webcomponents/src/components/scrim/scrim.tsx"],"sourcesContent":[":host {\n --br-scrim-opacity: 1;\n\n .br-scrim {\n visibility: hidden;\n transition: visibility 0.3s ease;\n z-index: var(--z-index-layer-4);\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: auto;\n }\n\n .br-scrim.mode-fullscreen {\n position: fixed;\n inset: 0;\n }\n\n .br-scrim.mode-parent {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n }\n\n .br-scrim.opened {\n visibility: visible;\n pointer-events: auto;\n }\n\n .mask {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: var(--surface-overlay-scrim);\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: auto;\n }\n\n .br-scrim.opened .mask {\n opacity: var(--br-scrim-opacity);\n }\n\n .content {\n position: relative;\n outline: none;\n pointer-events: auto;\n opacity: 0;\n transform: scale(0.9);\n transition:\n opacity 0.3s ease,\n transform 0.3s ease;\n background: transparent;\n padding: 0;\n margin: 0;\n border: none;\n box-shadow: none;\n overflow: visible;\n contain: none;\n display: inline-block;\n width: fit-content;\n height: fit-content;\n z-index: calc(var(--z-index-layer-4) + 1);\n &:focus {\n outline: var(--focus-outline);\n outline-offset: var(--focus-offset);\n box-shadow: var(--focus-shadow);\n }\n }\n\n .br-scrim.opened .content {\n opacity: 1;\n transform: scale(1);\n pointer-events: auto;\n }\n\n .br-scrim.position-top .content {\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .br-scrim.position-bottom .content {\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .br-scrim.position-left .content {\n position: absolute;\n top: 50%;\n left: 0;\n transform: translateY(-50%);\n }\n\n .br-scrim.position-right .content {\n position: absolute;\n top: 50%;\n right: 0;\n transform: translateY(-50%);\n }\n\n .br-scrim.position-center .content {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .content ::slotted(*) {\n opacity: 1 !important;\n filter: none;\n }\n\n /* Estilos responsivos */\n @media (max-width: 768px) {\n .content {\n max-width: 95%;\n max-height: 95%;\n width: auto;\n }\n\n .br-scrim.position-top .content,\n .br-scrim.position-bottom .content {\n width: 100%;\n max-width: 100%;\n border-radius: 0;\n }\n }\n}\n","import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core'\n\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/scrim?tab=designer).\n *\n * @slot default - Elemento que será exibido junto com o Scrim, devendo ser fornecido através do slot. Esse elemento representa o conteúdo principal a ser destacado sobre o fundo escurecido.\n * @slot activator - Elemento que, quando clicado, ativa/desativa o scrim. Tem prioridade sobre a propriedade 'activator'.\n */\n@Component({\n tag: 'br-scrim',\n styleUrl: 'scrim.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Scrim {\n /**\n * Referência ao elemento host do componente.\n */\n @Element() el: HTMLBrScrimElement\n\n @AttachInternals() elementInternals: ElementInternals\n\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = `br-scrim-${ScrimId++}`\n\n /**\n * Ativa/desativa o scrim\n */\n @Prop({ reflect: true }) isOpen: boolean = false\n\n /**\n * Posiciona o conteúdo no topo, centro, direita, esquerda, abaixo dentro do scrim\n */\n @Prop() positionContent: 'top' | 'center' | 'right' | 'left' | 'bottom'\n\n /**\n * Desativa o fechamento do scrim ao ser clicado\n */\n @Prop() disableCloseOnClick: boolean = false\n\n /**\n * Define o valor de z-index do scrim\n */\n @Prop() zIndex: number | null = null\n\n /**\n * Define um valor CSS personalizado para o background do scrim\n */\n @Prop() customBackground: string | null = null\n\n /**\n * Define a opacidade personalizada do scrim\n */\n @Prop() customOpacity: number | null = null\n\n /**\n * Define o modo de exibição do scrim:\n * - 'fullscreen': Ocupa toda a tela (position: fixed).\n * - 'parent': Ocupa apenas o elemento pai (position: absolute).\n * O elemento pai deve ter `position: relative` ou outro valor de posicionamento diferente de `static`.\n */\n @Prop() displayMode: 'fullscreen' | 'parent' = 'fullscreen'\n\n /**\n * Define a estratégia de manipulação de rolagem quando scrim está aberto\n * - 'block': Impede a rolagem completamente\n * - 'close': Fecha o scrim quando ocorre rolagem\n */\n @Prop() scrollStrategy: 'block' | 'close'\n\n /**\n * Determina quanto de rolagem (em pixels) é necessário para acionar a ação de fechamento automático do scrim.\n */\n @Prop() scrollThreshold: number = 50\n\n /**\n * Define o seletor para o elemento activator.\n * Pode ser:\n * - Um seletor CSS (ex: '.button-class', '#button-id')\n * - A string 'parent' para usar o elemento pai como activator\n * Nota: O slot 'activator' tem prioridade sobre esta propriedade.\n */\n @Prop() activator: string | null = null\n\n /** Indica que o scrim foi aberto. */\n @Event() brScrimOpen: EventEmitter\n\n /** Indica que o scrim foi fechado */\n @Event() brScrimClose: EventEmitter\n\n @State() isActive: boolean = false\n @State() hasActivatorSlot: boolean = false\n\n // ======================================================================\n // PROPRIEDADES PRIVADAS E VARIÁVEIS INTERNAS\n // ======================================================================\n private contentRef: HTMLDivElement | null = null\n private activatorElement: HTMLElement | null = null\n private scrollOffset: number = 0\n private lastScrollTop: number = 0\n private previouslyFocusedElement: HTMLElement | null | undefined = null\n\n private static readonly FOCUSABLE_SELECTORS = [\n 'a[href]:not([disabled])',\n 'button:not([disabled])',\n 'br-button:not([disabled])',\n 'input:not([disabled])',\n 'br-input:not([disabled])',\n 'select:not([disabled])',\n 'br-select:not([disabled])',\n 'textarea:not([disabled])',\n 'br-textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(',')\n\n // ======================================================================\n // LIFECYCLE HOOKS E WATCHERS\n // ======================================================================\n @Watch('isOpen')\n handleOpenChange(newValue: boolean) {\n this.isActive = newValue\n this.updateStyles()\n\n if (this.isActive) {\n this.previouslyFocusedElement = document.activeElement as HTMLElement\n this.applyScrollStrategy()\n setTimeout(() => {\n this.focusFirstElement()\n }, 100)\n this.brScrimOpen.emit()\n } else {\n this.resetScrolling()\n this.restoreFocus()\n this.brScrimClose.emit()\n }\n }\n\n @Watch('zIndex')\n @Watch('customBackground')\n @Watch('customOpacity')\n updateStyles() {\n if (this.zIndex !== null && this.zIndex !== undefined) {\n this.el.style.zIndex = `${this.zIndex}`\n this.el.style.setProperty('--z-index-layer-4', `${this.zIndex}`)\n }\n if (this.customBackground !== null) {\n this.el.style.setProperty('--surface-overlay-scrim', this.customBackground)\n }\n if (this.customOpacity !== null) {\n this.el.style.setProperty('--br-scrim-opacity', `${this.customOpacity}`)\n }\n }\n\n @Watch('activator')\n handleActivatorChange() {\n this.removeActivatorClickListener()\n this.setupActivator()\n }\n\n componentWillLoad() {\n this.hasActivatorSlot = this.checkActivatorSlot('activator')\n }\n\n componentDidLoad() {\n this.isActive = this.isOpen\n this.updateStyles()\n if (this.isActive) {\n this.applyScrollStrategy()\n this.focusFirstElement()\n }\n this.setupActivator()\n this.setupActivatorSlotClick()\n this.contentRef.addEventListener('keydown', this.handleKeyDown)\n }\n\n connectedCallback() {\n if (this.scrollStrategy === 'close') {\n window.addEventListener('scroll', this.handleScrollClose)\n }\n }\n\n disconnectedCallback() {\n window.removeEventListener('scroll', this.handleScrollClose)\n this.contentRef.removeEventListener('keydown', this.handleKeyDown)\n this.removeActivatorClickListener()\n this.cleanupActivatorSlotClick()\n }\n\n // ======================================================================\n // GERENCIAMENTO DO ACTIVATOR (ELEMENTO ACIONADOR)\n // ======================================================================\n private checkActivatorSlot(slotName: string): boolean {\n return this.el.querySelector(`[slot=\"${slotName}\"]`) !== null\n }\n\n private setupActivatorSlotClick() {\n const slotEl = this.el.shadowRoot?.querySelector('slot[name=\"activator\"]') as HTMLSlotElement\n if (slotEl === null || slotEl === undefined) return\n\n const assignedElements = slotEl.assignedElements?.() ?? []\n\n if (assignedElements.length === 1) {\n const el = assignedElements[0] as HTMLElement\n el.addEventListener('click', this.handleActivatorClick)\n } else if (assignedElements.length > 1) {\n console.warn('br-scrim: Slot \"activator\" deve conter apenas um elemento para aplicar o onClick automaticamente.')\n }\n }\n\n private setupActivator() {\n this.removeActivatorClickListener()\n this.activatorElement = null\n\n if (this.hasActivatorSlot || this.activator == null || this.activator === '') {\n return\n }\n\n if (this.activator === 'parent') {\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.activatorElement = parentElement\n }\n } else {\n try {\n const element = document.querySelector(this.activator)\n if (element instanceof HTMLElement) {\n this.activatorElement = element\n }\n } catch {\n console.warn(`br-scrim: Seletor activator inválido: ${this.activator}`)\n }\n }\n\n this.addActivatorClickListener()\n }\n\n private handleActivatorClick = () => {\n this.toggle()\n }\n\n private addActivatorClickListener() {\n if (this.activatorElement === null || this.activatorElement === undefined) return\n this.activatorElement.addEventListener('click', this.handleActivatorClick)\n }\n\n private removeActivatorClickListener() {\n if (this.activatorElement === null || this.activatorElement === undefined) return\n this.activatorElement.removeEventListener('click', this.handleActivatorClick)\n }\n\n private cleanupActivatorSlotClick() {\n const slotEl = this.el.shadowRoot?.querySelector('slot[name=\"activator\"]') as HTMLSlotElement\n const assignedElements = slotEl?.assignedElements?.() ?? []\n\n if (assignedElements.length === 1) {\n assignedElements[0].removeEventListener('click', this.handleActivatorClick)\n }\n }\n\n // ======================================================================\n // ESTRATÉGIAS DE ROLAGEM (SCROLL)\n // ======================================================================\n private applyScrollStrategy() {\n if (this.scrollStrategy === 'block') {\n this.enableScrollBlock()\n } else if (this.scrollStrategy === 'close') {\n this.enableScrollWatcher()\n }\n }\n\n private enableScrollBlock() {\n this.scrollOffset = window.scrollY\n document.body.style.setProperty('position', 'fixed')\n document.body.style.setProperty('top', `-${this.scrollOffset}px`)\n document.body.style.setProperty('left', '0')\n document.body.style.setProperty('right', '0')\n document.body.style.setProperty('width', '100%')\n document.documentElement.style.setProperty('overflow', 'hidden')\n\n window.addEventListener('scroll', this.handleBlockScroll)\n }\n\n private enableScrollWatcher() {\n window.addEventListener('scroll', this.handleScrollClose)\n }\n\n private handleBlockScroll = (e: Event) => {\n if (this.scrollStrategy === 'block' && this.isActive) {\n window.scrollTo(0, this.scrollOffset)\n e.preventDefault()\n e.stopPropagation()\n }\n }\n\n private resetScrolling() {\n if (this.scrollStrategy === 'block') {\n document.body.style.removeProperty('position')\n document.body.style.removeProperty('top')\n document.body.style.removeProperty('left')\n document.body.style.removeProperty('right')\n document.body.style.removeProperty('width')\n document.documentElement.style.removeProperty('overflow')\n window.removeEventListener('scroll', this.handleBlockScroll)\n window.scrollTo(0, this.scrollOffset)\n }\n window.removeEventListener('scroll', this.handleScrollClose)\n }\n\n private handleScrollClose = () => {\n if (this.scrollStrategy === 'close' && this.isActive) {\n const currentScroll = window.scrollY\n if (Math.abs(currentScroll - this.lastScrollTop) > this.scrollThreshold) {\n this.handleOpenChange(false)\n }\n this.lastScrollTop = currentScroll\n }\n }\n\n // ======================================================================\n // ACESSIBILIDADE E GERENCIAMENTO DE FOCO\n // ======================================================================\n private focusFirstElement() {\n if (this.contentRef == null) return\n\n this.contentRef.setAttribute('tabindex', '-1')\n this.contentRef.focus()\n\n const focusableElements = this.getFocusableElements()\n\n if (focusableElements.length > 0) {\n const firstElement = focusableElements[0]\n if (firstElement !== null && firstElement !== undefined) {\n firstElement.scrollIntoView({ block: 'nearest', inline: 'nearest' })\n firstElement.focus({ preventScroll: true })\n }\n }\n }\n\n private restoreFocus() {\n let targetElement: HTMLElement | null = null\n\n if (this.previouslyFocusedElement instanceof HTMLElement && this.previouslyFocusedElement.isConnected) {\n targetElement = this.previouslyFocusedElement\n } else if (this.activatorElement instanceof HTMLElement) {\n targetElement = this.activatorElement\n } else {\n const slotEl = this.el.shadowRoot?.querySelector('slot[name=\"activator\"]') as HTMLSlotElement\n if (this.hasActivatorSlot) {\n const assignedElements = slotEl.assignedElements?.() ?? []\n if (assignedElements.length > 0 && assignedElements[0] instanceof HTMLElement) {\n targetElement = assignedElements[0] as HTMLElement\n }\n }\n }\n\n if (targetElement !== null && targetElement !== undefined) {\n setTimeout(() => {\n try {\n targetElement?.focus()\n } catch (error) {\n console.warn('br-scrim: Erro ao restaurar foco:', error)\n }\n }, 100)\n }\n }\n\n private getFocusableElements(): HTMLElement[] {\n if (this.contentRef == null) return []\n\n const defaultSlot = this.contentRef.querySelector('slot:not([name])') as HTMLSlotElement\n if (defaultSlot === null || defaultSlot === undefined) return []\n\n const assignedElements = defaultSlot.assignedElements({ flatten: true })\n const focusableElements: HTMLElement[] = []\n\n assignedElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return\n\n if (el.matches(Scrim.FOCUSABLE_SELECTORS)) {\n focusableElements.push(el)\n }\n\n const nestedFocusables = Array.from(el.querySelectorAll<HTMLElement>(Scrim.FOCUSABLE_SELECTORS))\n focusableElements.push(...nestedFocusables)\n })\n\n return this.filterVisibleElements(focusableElements)\n }\n\n private filterVisibleElements(elements: HTMLElement[]): HTMLElement[] {\n return elements.filter(\n (el) => el.offsetWidth > 0 && el.offsetHeight > 0 && getComputedStyle(el).visibility !== 'hidden'\n )\n }\n\n // ======================================================================\n // NAVEGAÇÃO POR TECLADO\n // ======================================================================\n private handleKeyDown = (event: KeyboardEvent) => {\n if (!this.isActive) return\n\n if (this.shouldHandleEscape(event)) {\n this.handleOpenChange(false)\n return\n }\n\n if (event.key === 'Tab') {\n this.handleTabNavigation(event)\n }\n }\n\n private shouldHandleEscape(event: KeyboardEvent): boolean {\n return (event.key === 'Escape' || event.key === 'Esc') && this.isActive && !this.disableCloseOnClick\n }\n\n private handleTabNavigation(event: KeyboardEvent): void {\n const focusableElements = this.getFocusableElements()\n if (focusableElements.length === 0) {\n event.preventDefault()\n return\n }\n\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n const isTabForward = !event.shiftKey\n\n if (this.shouldTrapFocus(isTabForward, firstElement, lastElement)) {\n event.preventDefault()\n this.wrapFocus(isTabForward, firstElement, lastElement)\n }\n }\n\n private shouldTrapFocus(isTabForward: boolean, firstElement: HTMLElement, lastElement: HTMLElement): boolean {\n return (\n (isTabForward && document.activeElement === lastElement) ||\n (!isTabForward && document.activeElement === firstElement)\n )\n }\n\n private wrapFocus(isTabForward: boolean, firstElement: HTMLElement, lastElement: HTMLElement): void {\n ;(isTabForward ? firstElement : lastElement).focus()\n }\n\n // ======================================================================\n // MANIPULAÇÃO DE EVENTOS E UTILITÁRIOS\n // ======================================================================\n private handleMaskClick = (_event: MouseEvent) => {\n if (!this.disableCloseOnClick) {\n this.close()\n }\n }\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-scrim': true,\n opened: this.isActive,\n 'scroll-block': this.scrollStrategy === 'block',\n 'position-top': this.positionContent === 'top',\n 'position-bottom': this.positionContent === 'bottom',\n 'position-left': this.positionContent === 'left',\n 'position-right': this.positionContent === 'right',\n 'position-center': this.positionContent === 'center',\n 'mode-fullscreen': this.displayMode === 'fullscreen',\n 'mode-parent': this.displayMode === 'parent',\n }\n }\n\n // ======================================================================\n // MÉTODOS PÚBLICOS (API)\n // ======================================================================\n /**\n * Define o limite de rolagem para o fechamento automático do scrim.\n */\n @Method()\n async setScrollThreshold(threshold: number) {\n this.scrollThreshold = threshold\n }\n\n /**\n * Método público para exibir o scrim\n */\n @Method()\n async open() {\n this.handleOpenChange(true)\n }\n\n /**\n * Método público para esconder o scrim\n */\n @Method()\n async close() {\n this.handleOpenChange(false)\n }\n\n /**\n * Método público para alternar o estado de exibição do scrim\n */\n @Method()\n async toggle() {\n this.handleOpenChange(!this.isActive)\n }\n\n render() {\n return (\n <Host>\n <slot name=\"activator\"></slot>\n <div\n class={this.getCssClassMap()}\n id={this.customId}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden={this.isActive ? 'false' : 'true'}\n data-visible={this.isActive ? 'true' : 'false'}\n >\n <div class=\"mask\" onClick={this.handleMaskClick}></div>\n <div\n ref={(el) => (this.contentRef = el)}\n class=\"content\"\n tabIndex={-1}\n onKeyDown={this.handleKeyDown}\n aria-label=\"Conteúdo do diálogo\"\n >\n <slot></slot>\n </div>\n </div>\n </Host>\n )\n }\n}\n\nlet ScrimId = 0\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["itemCss","Item","elementInternals","disabled","customId","itemId","isActive","isSelected","isInteractive","href","target","isButton","type","value","density","hasSlotDefault","hasSlotStart","hasSlotEnd","selectedValue","hasRadios","focusableElement","handleRadioChange","requestAnimationFrame","this","updateRadioSelectionState","handleCheckboxChange","event","el","contains","updateCheckboxSelectionState","brDidClick","brDidSelect","componentWillLoad","hasSlotContentDefault","hasSlotContent","radios","Array","from","querySelectorAll","checkboxes","length","forEach","checkbox","checked","innerHTML","slotName","querySelector","getCssClassMap","active","selected","getTagType","getAttributes","TagType","baseAttributes","some","emit","radio","isClickInsideInteractiveElement","interactiveSelectors","interactiveElements","updateCheckboxes","handleClick","preventDefault","stopPropagation","clickedElement","previousSelectedValue","handleKeydown","console","log","listContainer","closest","undefined","error","listItems","warn","currentIndex","indexOf","targetItem","key","MouseEvent","setFocus","scrollIntoView","behavior","block","inline","focus","render","attributes","classList","h","Host","class","onClick","id","tabIndex","ref","onKeyDown","onMouseDown","e","name"],"sources":["../../packages/webcomponents/src/components/item/item.scss?tag=br-item&encapsulation=shadow","../../packages/webcomponents/src/components/item/item.tsx"],"sourcesContent":["@import \"~@govbr-ds/core/src/components/item/item\";\n\n:host {\n display: block;\n}\n\n::slotted(br-checkbox) {\n max-width: fit-content;\n max-height: fit-content;\n}\n\n::slotted(br-radio) {\n max-width: fit-content;\n max-height: fit-content;\n}\n\n.br-item:focus {\n cursor: auto;\n outline-color: var(--focus);\n outline-offset: var(--focus-offset);\n outline-style: var(--focus-style);\n outline-width: var(--focus-width);\n}\n","import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n} from '@stencil/core'\n\nimport { CssClassMap } from '../../utils/interfaces'\n/**\n * Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/item?tab=designer).\n *\n * @slot default - Área de conteúdo, podendo conter qualquer componente, exceto botões primários e componentes relacionados à navegação (como carrosséis, paginações, abas, menus, etc.).\n *\n * @slot start - Área de recursos visuais, podendo conter elementos como ícones, avatares e mídias.\n *\n * @slot end - Área de recursos complementares, podendo conter componentes interativos, metadados e informações adicionais.\n */\n@Component({\n tag: 'br-item',\n styleUrl: 'item.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Item {\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el: HTMLBrItemElement\n\n @AttachInternals() elementInternals: ElementInternals\n\n /**\n * Desativa o item, tornando-o não interativo.\n */\n @Prop({ reflect: true }) readonly disabled: boolean = false\n\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = `br-item-${itemId++}`\n\n /**\n * Indica se o item está no estado ativo.\n * Se definido como verdadeiro, o item será exibido como ativo.\n */\n @Prop({ reflect: true }) readonly isActive: boolean = false\n\n /**\n * Indica se o item está no estado selecionado.\n * Se definido como verdadeiro, o item será exibido como selecionado.\n */\n @Prop({ reflect: true }) readonly isSelected: boolean = false\n\n /**\n * Marca o item como interativo, permitindo que toda a superfície do item seja clicável.\n */\n @Prop({ reflect: true }) readonly isInteractive: boolean = false\n\n /**\n * URL ou caminho para o qual o usuário será direcionado ao clicar no item. Quando definido, o item será renderizado como um link.\n */\n @Prop({ reflect: true }) readonly href?: string\n\n /**\n * Define o alvo do link quando `href` está presente. Pode ser:\n * - `_blank` para abrir em uma nova aba,\n * - `_self` para abrir na mesma aba,\n * - `_parent` para abrir na aba pai,\n * - `_top` para abrir na aba superior.\n */\n @Prop({ reflect: true }) readonly target?: '_blank' | '_self' | '_parent' | '_top'\n\n /**\n * Quando definido como `true`, o item será tratado como um botão.\n */\n @Prop({ reflect: true }) readonly isButton: boolean = false\n\n /**\n * Tipo do botão, aplicável apenas se `isButton` for `true`. Pode ser:\n * - `'submit'` para enviar um formulário,\n * - `'reset'` para redefinir um formulário,\n * - `'button'` para um botão padrão.\n */\n @Prop({ reflect: true, mutable: true }) type: 'submit' | 'reset' | 'button'\n\n /**\n * Define um valor associado ao br-item quando renderizado como um botão, utilizado em contextos de formulário.\n */\n @Prop({ reflect: true }) readonly value?: string\n\n /**\n * Ajusta a densidade, alterando o espaçamento interno para um visual mais compacto ou mais expandido.\n */\n @Prop({ reflect: true }) readonly density: 'large' | 'medium' | 'small' = 'medium'\n\n // Propriedade interna para verificar a presença de conteúdo no slot default\n @State() hasSlotDefault: boolean = false\n\n @State() hasSlotStart: boolean = false\n\n @State() hasSlotEnd: boolean = false\n\n // Propriedade interna para armazenar o valor selecionado\n @State() selectedValue: boolean = false\n\n // Propriedade para rastrear a presença de rádios dentro do item\n private hasRadios: boolean = false\n\n // Referência ao elemento interno que deve receber o foco\n private focusableElement?: HTMLElement\n\n @Listen('checkedChange', { target: 'document' })\n handleRadioChange() {\n requestAnimationFrame(() => {\n this.updateRadioSelectionState()\n })\n }\n\n @Listen('checkedChange', { target: 'document' })\n handleCheckboxChange(event: Event) {\n const target = event.target as HTMLElement\n\n if (this.el.contains(target)) {\n this.updateCheckboxSelectionState()\n }\n }\n\n /**\n * Evento customizado emitido quando o item é clicado, aplicável apenas se o item for um botão (`<button>`).\n * Pode ser utilizado para ações personalizadas, exceto quando o item está desativado.\n */\n @Event({ composed: true, cancelable: true, bubbles: true }) brDidClick: EventEmitter\n\n /**\n * Evento customizado aplicável para todos os tipos de elementos (`div`, `button`, `a`), emitido quando o item é selecionado e desde que a propriedade `isInteractive` esteja presente.\n */\n @Event({ bubbles: true, composed: true }) brDidSelect: EventEmitter<{ selected: boolean }>\n\n componentWillLoad() {\n this.hasSlotContentDefault()\n this.hasSlotStart = this.hasSlotContent('start')\n this.hasSlotEnd = this.hasSlotContent('end')\n this.selectedValue = this.isSelected\n if (this.isButton) {\n this.type = this.type || 'button'\n }\n const radios = Array.from(this.el.querySelectorAll('br-radio'))\n const checkboxes = Array.from(this.el.querySelectorAll('br-checkbox'))\n this.hasRadios = radios.length > 0\n\n if (this.isSelected) {\n if (checkboxes.length > 0) {\n checkboxes.forEach((checkbox) => (checkbox.checked = true))\n }\n if (radios.length > 0) {\n radios[0].checked = true\n }\n }\n\n this.updateRadioSelectionState()\n this.updateCheckboxSelectionState()\n }\n\n private hasSlotContentDefault(): void {\n this.hasSlotDefault = this.el.innerHTML !== ''\n }\n\n private hasSlotContent(slotName: string): boolean {\n return this.el.querySelector(`[slot=\"${slotName}\"]`) !== null\n }\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-item': true,\n disabled: this.disabled,\n active: this.isActive,\n selected: this.selectedValue,\n 'py-3': this.density === 'medium',\n 'py-4': this.density === 'small',\n }\n }\n\n private getTagType(): string {\n if (this.isButton) {\n return 'button'\n }\n if (this.href?.length > 0) {\n return 'a'\n }\n return 'div'\n }\n\n private getAttributes() {\n const TagType = this.getTagType()\n const baseAttributes =\n TagType === 'button' ? { type: this.type, value: this.value } : { href: this.href, target: this.target }\n\n return {\n ...baseAttributes,\n 'aria-disabled': this.disabled ? 'true' : null,\n 'aria-current': this.isActive ? 'true' : null,\n 'data-toggle': this.isInteractive ? 'selection' : null,\n 'is-selected': this.selectedValue ? true : null,\n }\n }\n\n private updateCheckboxSelectionState() {\n if (this.hasRadios) return\n\n const checkboxes = Array.from(this.el.querySelectorAll('br-checkbox'))\n\n this.selectedValue = checkboxes.some((checkbox) => checkbox.checked)\n this.brDidSelect.emit({ selected: this.selectedValue })\n }\n\n private updateRadioSelectionState() {\n if (!this.hasRadios) return\n\n const radios = Array.from(this.el.querySelectorAll('br-radio'))\n\n this.selectedValue = radios.some((radio) => radio.checked)\n this.brDidSelect.emit({ selected: this.selectedValue })\n }\n\n // Função para verificar se o clique foi dentro do slot do item.\n private isClickInsideInteractiveElement(target: HTMLElement): boolean {\n const interactiveSelectors = 'br-checkbox, br-radio, br-input, br-button, br-select, br-textarea'\n const interactiveElements = this.el.querySelectorAll(interactiveSelectors)\n return Array.from(interactiveElements).some((el) => el.contains(target) || target === el)\n }\n\n private updateCheckboxes() {\n const checkboxes = Array.from(this.el.querySelectorAll('br-checkbox'))\n\n checkboxes.forEach((checkbox) => {\n checkbox.checked = this.selectedValue\n })\n }\n\n private readonly handleClick = (event: MouseEvent) => {\n // Se o componente estiver desabilitado, impede a ação e sai imediatamente.\n if (this.disabled) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n\n const clickedElement = event.target as HTMLElement\n\n if (this.hasRadios) {\n return\n }\n\n if (this.isButton) {\n this.brDidClick.emit()\n } else if (this.isInteractive && !this.isClickInsideInteractiveElement(clickedElement)) {\n // Armazena o estado anterior para emitir o evento apenas se houver mudança.\n const previousSelectedValue = this.selectedValue\n this.selectedValue = !this.selectedValue\n\n if (previousSelectedValue !== this.selectedValue) {\n this.brDidSelect.emit({ selected: this.selectedValue })\n }\n\n // Atualiza o estado dos checkboxes internos.\n this.updateCheckboxes()\n }\n\n event.stopPropagation()\n }\n\n private handleKeydown(event: KeyboardEvent) {\n if (this.disabled) {\n console.log(`[br-item ${this.customId}] Item desativado, ignorando tecla pressionada(keydown).`)\n return\n }\n\n // Use closest para encontrar o br-list ancestral, mais robusto que parentElement\n const listContainer = this.el.closest('br-list')\n if (listContainer === null || listContainer === undefined) {\n console.error(`[br-item ${this.customId}] Não foi possível encontrar o container pai <br-list>.`)\n return\n }\n\n // Busca itens diretamente dentro do listContainer encontrado\n const listItems = Array.from(listContainer.querySelectorAll('br-item:not([disabled])')) as HTMLBrItemElement[]\n if (listItems.length === 0) {\n console.warn(`[br-item ${this.customId}] Nenhum item navegável encontrado no container da lista.`)\n return\n }\n\n // Encontra o índice do item atual na lista de itens navegáveis\n const currentIndex = listItems.indexOf(this.el)\n\n if (currentIndex === -1) {\n console.error(`[br-item ${this.customId}] Item atual não encontrado nos itens navegáveis.`)\n return // O item atual não está na lista (talvez desabilitado ou erro)\n }\n\n let targetItem: HTMLBrItemElement | null = null\n\n switch (event.key) {\n case 'ArrowDown': // Seta para baixo\n event.preventDefault()\n if (currentIndex < listItems.length - 1) {\n targetItem = listItems[currentIndex + 1]\n } else {\n console.log(`[br-item ${this.customId}] ArrowDown: Último item já selecionado.`)\n }\n break\n\n case 'ArrowUp': // Seta para cima\n event.preventDefault()\n if (currentIndex > 0) {\n targetItem = listItems[currentIndex - 1]\n } else {\n console.log(`[br-item ${this.customId}] ArrowUp: Usuário já está no primeiro item da lista.`)\n }\n break\n\n case 'Enter':\n case ' ': // Barra de espaço\n event.preventDefault()\n this.handleClick(new MouseEvent('click'))\n break\n\n case 'Home':\n event.preventDefault()\n targetItem = listItems[0]\n break\n\n case 'End':\n event.preventDefault()\n targetItem = listItems[listItems.length - 1]\n break\n\n default:\n return // Ignorar outras teclas\n }\n\n if (targetItem && targetItem !== this.el) {\n // Verifica se o item alvo é diferente do atual\n if ('setFocus' in targetItem) {\n // Se o item alvo tiver o método setFocus, chama-o\n ;(targetItem as { setFocus: () => void }).setFocus()\n }\n // Caso contrário, apenas defina o foco no elemento alvo\n targetItem.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n }\n }\n\n /**\n * Define o foco no elemento interno do componente.\n * Este método pode ser chamado externamente para garantir que o foco seja aplicado ao elemento correto.\n */\n @Method()\n async setFocus() {\n this.focusableElement?.focus()\n }\n\n render() {\n const TagType = this.getTagType()\n const attributes = this.getAttributes()\n const classList = this.getCssClassMap()\n return (\n <Host>\n <TagType\n class={classList}\n {...attributes}\n onClick={this.handleClick}\n id={this.customId}\n tabIndex={this.disabled ? -1 : this.isInteractive ? 0 : -1}\n ref={(el) => (this.focusableElement = el as HTMLElement)}\n onKeyDown={(event) => this.handleKeydown(event)}\n onMouseDown={(e) => e.preventDefault()}\n >\n {this.hasSlotStart || this.hasSlotEnd ? (\n <div class=\"row align-items-center\">\n {this.hasSlotStart && (\n <div class=\"col-auto\">\n <slot name=\"start\"></slot>\n </div>\n )}\n\n <div class=\"col\">\n <slot></slot>\n </div>\n\n {this.hasSlotEnd && (\n <div class=\"col-auto\">\n <slot name=\"end\"></slot>\n </div>\n )}\n </div>\n ) : (\n <slot></slot>\n )}\n </TagType>\n </Host>\n )\n }\n}\n\nlet itemId = 0\n"],"mappings":"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","ignoreList":[]}