@govbr-ds/webcomponents 2.0.0-next.40 → 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.
- package/dist/cjs/br-button.br-icon.entry.cjs.js.map +1 -1
- package/dist/cjs/br-button_2.cjs.entry.js +37 -4
- package/dist/cjs/br-button_2.cjs.entry.js.map +1 -1
- package/dist/cjs/br-collapse.br-list.entry.cjs.js.map +1 -1
- package/dist/cjs/br-collapse_2.cjs.entry.js +1 -1
- package/dist/cjs/br-collapse_2.cjs.entry.js.map +1 -1
- package/dist/cjs/br-dropdown.cjs.entry.js +324 -10
- package/dist/cjs/br-dropdown.cjs.entry.js.map +1 -1
- package/dist/cjs/br-dropdown.entry.cjs.js.map +1 -1
- package/dist/cjs/br-input.br-radio.entry.cjs.js.map +1 -1
- package/dist/cjs/br-input_2.cjs.entry.js +8 -4
- package/dist/cjs/br-input_2.cjs.entry.js.map +1 -1
- package/dist/cjs/br-item.cjs.entry.js +1 -1
- package/dist/cjs/br-item.cjs.entry.js.map +1 -1
- package/dist/cjs/br-item.entry.cjs.js.map +1 -1
- package/dist/cjs/br-scrim.cjs.entry.js +1 -1
- package/dist/cjs/br-scrim.cjs.entry.js.map +1 -1
- package/dist/cjs/br-scrim.entry.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/webcomponents.cjs.js +1 -1
- package/dist/collection/components/button/button.js +54 -2
- package/dist/collection/components/button/button.js.map +1 -1
- package/dist/collection/components/dropdown/dropdown.css +1 -1
- package/dist/collection/components/dropdown/dropdown.js +346 -9
- package/dist/collection/components/dropdown/dropdown.js.map +1 -1
- package/dist/collection/components/icon/icon.css +1 -1
- package/dist/collection/components/icon/icon.js +40 -1
- package/dist/collection/components/icon/icon.js.map +1 -1
- package/dist/collection/components/input/input.css +1 -1
- package/dist/collection/components/input/input.js +26 -3
- package/dist/collection/components/input/input.js.map +1 -1
- package/dist/collection/components/item/item.css +1 -1
- package/dist/collection/components/list/list.js +1 -1
- package/dist/collection/components/list/list.js.map +1 -1
- package/dist/collection/components/scrim/scrim.css +1 -1
- package/dist/collection/pages/scripts/menu.js +1 -1
- package/dist/components/br-avatar.js +1 -1
- package/dist/components/br-breadcrumb.js +5 -5
- package/dist/components/br-button.js +1 -1
- package/dist/components/br-collapse.js +4 -4
- package/dist/components/br-dropdown.js +332 -25
- package/dist/components/br-dropdown.js.map +1 -1
- package/dist/components/br-footer-category.js +3 -3
- package/dist/components/br-footer-item.js +1 -1
- package/dist/components/br-footer-social.js +2 -2
- package/dist/components/br-icon.js +4 -4
- package/dist/components/br-input.js +3 -3
- package/dist/components/br-item.js +4 -4
- package/dist/components/br-list.js +4 -4
- package/dist/components/br-message.js +2 -2
- package/dist/components/br-scrim.js +1 -1
- package/dist/components/br-scrim.js.map +1 -1
- package/dist/components/br-select.js +5 -5
- package/dist/components/br-step-item.js +2 -2
- package/dist/components/br-tab-item.js +1 -1
- package/dist/components/br-tag.js +2 -2
- package/dist/components/br-upload.js +2 -2
- package/dist/components/{p-THYai_l5.js → p-BbFx1RUd.js} +15 -9
- package/dist/components/p-BbFx1RUd.js.map +1 -0
- package/dist/components/{p-pq3SZemh.js → p-CIINlcIu.js} +3 -3
- package/dist/components/{p-CtvDP3zf.js → p-COPEUBKR.js} +27 -9
- package/dist/components/p-COPEUBKR.js.map +1 -0
- package/dist/components/{p-brOPUYUL.js → p-DJtFpYiN.js} +3 -3
- package/dist/components/p-DJtFpYiN.js.map +1 -0
- package/dist/components/{p-DlMJ2wZW.js → p-rHgHl2v-.js} +6 -6
- package/dist/components/{p-DlMJ2wZW.js.map → p-rHgHl2v-.js.map} +1 -1
- package/dist/components/{p-jx7aLpDh.js → p-vi3ehOfu.js} +40 -23
- package/dist/components/p-vi3ehOfu.js.map +1 -0
- package/dist/custom-elements.json +212 -0
- package/dist/esm/br-button.br-icon.entry.js.map +1 -1
- package/dist/esm/br-button_2.entry.js +37 -4
- package/dist/esm/br-button_2.entry.js.map +1 -1
- package/dist/esm/br-collapse.br-list.entry.js.map +1 -1
- package/dist/esm/br-collapse_2.entry.js +1 -1
- package/dist/esm/br-collapse_2.entry.js.map +1 -1
- package/dist/esm/br-dropdown.entry.js +324 -10
- package/dist/esm/br-dropdown.entry.js.map +1 -1
- package/dist/esm/br-input.br-radio.entry.js.map +1 -1
- package/dist/esm/br-input_2.entry.js +8 -4
- package/dist/esm/br-input_2.entry.js.map +1 -1
- package/dist/esm/br-item.entry.js +1 -1
- package/dist/esm/br-item.entry.js.map +1 -1
- package/dist/esm/br-scrim.entry.js +1 -1
- package/dist/esm/br-scrim.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/webcomponents.js +1 -1
- package/dist/hydrate/index.js +383 -27
- package/dist/hydrate/index.mjs +383 -27
- package/dist/types/components/button/button.d.ts +14 -0
- package/dist/types/components/dropdown/dropdown.d.ts +48 -1
- package/dist/types/components/icon/icon.d.ts +7 -0
- package/dist/types/components/input/input.d.ts +4 -0
- package/dist/types/components.d.ts +36 -0
- package/dist/webcomponents/br-button.br-icon.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-collapse.br-list.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-dropdown.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-input.br-radio.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-item.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-scrim.entry.esm.js.map +1 -1
- package/dist/webcomponents/{p-713035b5.entry.js → p-0d6df204.entry.js} +3 -3
- package/dist/webcomponents/{p-713035b5.entry.js.map → p-0d6df204.entry.js.map} +1 -1
- package/dist/webcomponents/{p-c3267481.entry.js → p-3d5600cb.entry.js} +2 -2
- package/dist/webcomponents/p-3d5600cb.entry.js.map +1 -0
- package/dist/webcomponents/{p-ab251560.entry.js → p-8ac9dcff.entry.js} +329 -23
- package/dist/webcomponents/p-8ac9dcff.entry.js.map +1 -0
- package/dist/webcomponents/{p-8fe3366e.entry.js → p-aaedb60b.entry.js} +11 -6
- package/dist/webcomponents/p-aaedb60b.entry.js.map +1 -0
- package/dist/webcomponents/{p-dbfc2a44.entry.js → p-c25d500c.entry.js} +2 -2
- package/dist/webcomponents/p-c25d500c.entry.js.map +1 -0
- package/dist/webcomponents/{p-bc417fe6.entry.js → p-e33ca888.entry.js} +45 -13
- package/dist/webcomponents/p-e33ca888.entry.js.map +1 -0
- package/dist/webcomponents/webcomponents.esm.js +14 -9
- package/dist/webcomponents.html-custom-data.json +8 -4
- package/package.json +1 -1
- package/dist/components/p-CtvDP3zf.js.map +0 -1
- package/dist/components/p-THYai_l5.js.map +0 -1
- package/dist/components/p-brOPUYUL.js.map +0 -1
- package/dist/components/p-jx7aLpDh.js.map +0 -1
- package/dist/webcomponents/p-8fe3366e.entry.js.map +0 -1
- package/dist/webcomponents/p-ab251560.entry.js.map +0 -1
- package/dist/webcomponents/p-bc417fe6.entry.js.map +0 -1
- package/dist/webcomponents/p-c3267481.entry.js.map +0 -1
- package/dist/webcomponents/p-dbfc2a44.entry.js.map +0 -1
- /package/dist/components/{p-pq3SZemh.js.map → p-CIINlcIu.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
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 inset: 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\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 (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":[]}
|