@govbr-ds/webcomponents 2.0.0-next.63 → 2.0.0-next.64
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-skip-link.cjs.entry.js +1 -1
- package/dist/cjs/br-skip-link.entry.cjs.js.map +1 -1
- package/dist/collection/components/skip-link/skip-link.js +1 -1
- package/dist/collection/components/skip-link/skip-link.js.map +1 -1
- package/dist/components/br-skip-link.js +4 -5
- package/dist/components/br-skip-link.js.map +1 -1
- package/dist/custom-elements.json +385 -385
- package/dist/esm/br-skip-link.entry.js +1 -1
- package/dist/esm/br-skip-link.entry.js.map +1 -1
- package/dist/hydrate/index.js +1 -1
- package/dist/hydrate/index.mjs +1 -1
- package/dist/webcomponents/br-skip-link.entry.esm.js.map +1 -1
- package/dist/webcomponents/{p-1991135d.entry.js → p-2be1c309.entry.js} +5 -6
- package/dist/webcomponents/p-2be1c309.entry.js.map +1 -0
- package/dist/webcomponents/webcomponents.esm.js +1 -1
- package/dist/webcomponents.html-custom-data.json +44 -44
- package/package.json +1 -1
- package/dist/webcomponents/p-1991135d.entry.js.map +0 -1
|
@@ -302,7 +302,7 @@ const SkipLink = class {
|
|
|
302
302
|
};
|
|
303
303
|
}
|
|
304
304
|
render() {
|
|
305
|
-
return (index.h(index.Host, { key: '3da4abe22f44afcfaee67d02edf96ad2b0a96294' }, index.h("nav", { key: '
|
|
305
|
+
return (index.h(index.Host, { key: '3da4abe22f44afcfaee67d02edf96ad2b0a96294' }, index.h("nav", { key: '76c38f8f1484039a5134be1396b1d0a98dea4d5e', part: "container", class: this.getCssClassMap(), id: this.customId }, index.h("br-list", { key: '0d1e37896de8fe5f3e2eb4a057a2418e3e57e666' }, index.h("slot", { key: '276ee5442e5a119238416c614bef37688e52bd09' })))));
|
|
306
306
|
}
|
|
307
307
|
get el() { return index.getElement(this); }
|
|
308
308
|
static get watchers() { return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"br-skip-link.entry.cjs.js","sources":["../../packages/webcomponents/src/components/skip-link/skip-link.scss?tag=br-skip-link&encapsulation=shadow","../../packages/webcomponents/src/components/skip-link/skip-link.tsx"],"sourcesContent":["@import \"~@govbr-ds/core/src/components/skiplink/skiplink\";\n\n:host {\n @include skiplink-configs;\n}\n\n.br-skiplink {\n &.top-left {\n left: var(--spacing-scale-3x) !important;\n right: auto !important;\n }\n\n &.top-center {\n left: 50% !important;\n right: auto !important;\n transform: translateX(-50%);\n\n &.full {\n transform: translateX(-50%) translateY(-100%);\n\n &.visible {\n transform: translateX(-50%) translateY(0);\n }\n }\n }\n\n &.top-right {\n left: auto !important;\n right: var(--spacing-scale-3x) !important;\n }\n\n &.visible {\n top: 0 !important;\n }\n\n &.full {\n br-list {\n display: flex;\n flex-direction: row;\n gap: 0;\n\n ::slotted(br-skiplink-item) {\n list-style: none;\n }\n }\n }\n\n &:not(.full) {\n min-width: var(--skiplink-min-width);\n }\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 Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/skip-link?tab=designer).\n *\n * @slot default - Slot para inserir os itens de navegação rápida (br-skiplink-item).\n *\n * @part container - Parte para o contêiner principal do componente skip-link, usada para estilização via ::part().\n */\n@Component({\n tag: 'br-skip-link',\n styleUrl: 'skip-link.scss',\n shadow: true,\n})\nexport class SkipLink {\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: HTMLBrSkipLinkElement\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 = Helpers.generateUniqueId()\n\n /**\n * Define se o skip link apresenta um ou múltiplos itens visíveis.\n * - 'simple': Exibe apenas um item por vez.\n * - 'compound': Exibe uma lista com múltiplos itens.\n */\n @Prop({ reflect: true }) readonly variant: 'simple' | 'compound' = 'compound'\n\n /**\n * Define a posição do skip link na tela.\n * - 'top-left': Posicionado no canto superior esquerdo.\n * - 'top-center': Posicionado no centro superior.\n * - 'top-right': Posicionado no canto superior direito.\n */\n @Prop({ reflect: true }) readonly position: 'top-left' | 'top-center' | 'top-right' = 'top-left'\n\n /**\n * Define o z-index do componente.\n * Controla a ordem de empilhamento do componente na página.\n */\n @Prop({ reflect: true }) readonly zIndex: number | null = null\n\n /**\n * Exibe a contagem de itens no formato (1/4), (2/4), etc.\n * Quando `true`, cada item mostrará sua posição relativa ao total de itens.\n * Por padrão, é `true` para o modo simple e `false` para o modo compound.\n */\n @Prop({ reflect: true }) readonly showItemCount?: boolean\n\n /**\n * Estado interno que controla a visibilidade do componente.\n */\n @State() private isVisible: boolean = false\n\n /**\n * Define se o componente está em modo tela pequena\n */\n @State() private isSmallScreen: boolean = false\n\n /**\n * Define se o componente precisa mudar para modo simples por falta de espaço\n */\n @State() private needsSimpleMode: boolean = false\n\n /**\n * Largura do container pai\n */\n @State() private containerWidth: number = 0\n\n /**\n * ResizeObserver para monitorar mudanças no tamanho do container\n */\n private resizeObserver: ResizeObserver\n\n /**\n * Evento emitido quando um item do skiplink é ativado.\n * O evento contém informações sobre o item acionado e o elemento target.\n */\n @Event() brSkiplinkNavigation: EventEmitter<{ itemId: string; target: string }>\n\n /**\n * Evento emitido quando o skiplink se torna visível.\n */\n @Event() brDidShow: EventEmitter<void>\n\n /**\n * Evento emitido quando o skiplink se torna oculto.\n */\n @Event() brDidHide: EventEmitter<void>\n\n @Watch('zIndex')\n updateStyles() {\n if (this.zIndex !== null && this.zIndex !== undefined) {\n this.el.style.zIndex = `${this.zIndex}`\n this.el.style.setProperty('--skiplink-layer', `${this.zIndex}`)\n }\n }\n\n /**\n * Observa mudanças nos estados que afetam o modo efetivo (simple/compound)\n * e atualiza as contagens dos itens quando necessário.\n */\n @Watch('needsSimpleMode')\n @Watch('isSmallScreen')\n watchModeChanges() {\n this.updateItemCounts()\n }\n\n /**\n * Listener para eventos de navegação dos itens filhos.\n */\n @Listen('brSkiplinkItemClick')\n handleItemNavigation(event: CustomEvent<{ itemId: string; target: string }>) {\n this.brSkiplinkNavigation.emit(event.detail)\n this.hide()\n }\n\n /**\n * Listener para evento de foco no componente.\n */\n @Listen('focusin')\n handleFocusIn() {\n if (!this.isVisible) {\n this.show()\n }\n }\n\n /**\n * Listener para evento de perda de foco no componente.\n */\n @Listen('focusout')\n handleFocusOut(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement | null\n if (relatedTarget === null || !this.el.contains(relatedTarget)) {\n this.hide()\n }\n }\n\n /**\n * Listener para a tecla Escape.\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && this.isVisible) {\n event.preventDefault()\n this.hide()\n ;(document.activeElement as HTMLElement)?.blur()\n return\n }\n }\n\n connectedCallback() {\n document.addEventListener('keydown', this.globalKeyHandler)\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.updateContainerSize)\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.resizeObserver.observe(parentElement)\n }\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.globalKeyHandler)\n\n if (this.resizeObserver !== undefined && this.resizeObserver !== null) {\n this.resizeObserver.disconnect()\n }\n }\n\n componentWillLoad() {\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.containerWidth = parentElement.clientWidth\n }\n }\n\n componentDidLoad() {\n this.updateItemCounts()\n this.calculateItemsWidth()\n }\n\n /**\n * Manipulador global para atalhos de teclado Alt+[número].\n */\n private globalKeyHandler = (event: KeyboardEvent) => {\n if (event.altKey && /^[1-9]$/.test(event.key)) {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n const targetItem = Array.from(items).find((item) => {\n const keyNumber = item.getAttribute('key-number')\n return keyNumber === event.key\n })\n\n if (targetItem && typeof targetItem.navigateToTarget === 'function') {\n event.preventDefault()\n targetItem.navigateToTarget()\n this.show()\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens e atualiza os estados do componente\n */\n private updateContainerSize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const width = entry.contentRect.width\n this.containerWidth = width\n this.isSmallScreen = width < 570\n\n if (!this.isSmallScreen) {\n this.calculateItemsWidth()\n } else {\n this.needsSimpleMode = false\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens do skip-link e determina se deve usar modo simple ou compound.\n */\n private calculateItemsWidth() {\n requestAnimationFrame(() => {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n if (items.length === 0 || this.isSmallScreen) return\n if (items.length > 4) {\n this.needsSimpleMode = true\n return\n }\n\n this.needsSimpleMode = false\n const totalWidth = this.sumItemsWidth(items)\n\n const availableWidth = this.calculateAvailableWidth()\n\n if (totalWidth > availableWidth) {\n this.needsSimpleMode = true\n }\n })\n }\n\n /**\n * Soma a largura de todos os itens do skip-link\n */\n private sumItemsWidth(items: NodeListOf<HTMLBrSkiplinkItemElement>): number {\n let total = 0\n\n items.forEach((item) => {\n const brItem = item.shadowRoot?.querySelector('br-item') as HTMLElement | null\n if (brItem === null) return\n\n const width = brItem.offsetWidth || brItem.scrollWidth || brItem.getBoundingClientRect().width\n total += width\n })\n\n return total\n }\n\n /**\n * Calcula a largura disponível descontando margens e margem de segurança\n */\n private calculateAvailableWidth(): number {\n if (this.containerWidth === 0) return 0\n\n // Obtém o valor da margem definida no CSS\n const computedStyle = getComputedStyle(this.el)\n const spacingValue = computedStyle.getPropertyValue('--spacing-scale-3x').trim()\n const margin = parseFloat(spacingValue) || 24\n\n // Margem de segurança para evitar quebras visuais\n const safetyMargin = 20\n\n // Desconta: margem esquerda + margem direita + margem de segurança\n return this.containerWidth - margin * 2 - safetyMargin\n }\n\n /**\n * Atualiza os atributos de contagem nos itens filhos.\n * Adiciona data-item-index e data-item-total em cada br-skiplink-item.\n * A contagem é exibida quando o componente está em modo simple (incluindo modo responsivo).\n */\n private updateItemCounts() {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const shouldShowCount = this.showItemCount !== undefined ? this.showItemCount : effectiveVariant === 'simple'\n const isCompoundMode = effectiveVariant === 'compound'\n\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n items.forEach((item) => {\n if (isCompoundMode) {\n item.classList.add('compound-mode')\n } else {\n item.classList.remove('compound-mode')\n }\n })\n\n if (!shouldShowCount) {\n items.forEach((item) => {\n item.removeAttribute('data-item-index')\n item.removeAttribute('data-item-total')\n })\n return\n }\n\n const total = items.length\n items.forEach((item, index) => {\n item.setAttribute('data-item-index', (index + 1).toString())\n item.setAttribute('data-item-total', total.toString())\n })\n }\n\n /**\n * Oculta o componente programaticamente.\n */\n @Method()\n async hide(): Promise<void> {\n const focusedElement = this.el.querySelector(':focus')\n if (focusedElement instanceof HTMLElement) {\n focusedElement.blur()\n }\n this.isVisible = false\n this.brDidHide.emit()\n return Promise.resolve()\n }\n\n /**\n * Exibe o componente programaticamente.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const firstItem = this.el.querySelector('br-skiplink-item') as HTMLBrSkiplinkItemElement | null\n if (firstItem !== null) {\n if (typeof firstItem.itemFocus === 'function') {\n await firstItem.itemFocus()\n } else {\n const focusableElement = firstItem.shadowRoot?.querySelector('a, button') as HTMLElement | null\n if (focusableElement !== null) {\n focusableElement.focus()\n }\n }\n }\n\n this.brDidShow.emit()\n return Promise.resolve()\n }\n\n private getEffectivePosition(): 'top-left' | 'top-center' | 'top-right' {\n if (this.isSmallScreen) {\n return 'top-left'\n }\n return this.position\n }\n\n private getCssClassMap(): CssClassMap {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const effectivePosition = this.getEffectivePosition()\n\n return {\n 'br-skiplink': true,\n full: effectiveVariant === 'compound',\n [effectivePosition]: true,\n visible: this.isVisible,\n }\n }\n\n render() {\n return (\n <Host>\n <nav part=\"container\" class={this.getCssClassMap()} id={this.customId} role=\"navigation\">\n <br-list>\n <slot></slot>\n </br-list>\n </nav>\n </Host>\n )\n }\n}\n"],"names":["Helpers","h","Host"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"br-skip-link.entry.cjs.js","sources":["../../packages/webcomponents/src/components/skip-link/skip-link.scss?tag=br-skip-link&encapsulation=shadow","../../packages/webcomponents/src/components/skip-link/skip-link.tsx"],"sourcesContent":["@import \"~@govbr-ds/core/src/components/skiplink/skiplink\";\n\n:host {\n @include skiplink-configs;\n}\n\n.br-skiplink {\n &.top-left {\n left: var(--spacing-scale-3x) !important;\n right: auto !important;\n }\n\n &.top-center {\n left: 50% !important;\n right: auto !important;\n transform: translateX(-50%);\n\n &.full {\n transform: translateX(-50%) translateY(-100%);\n\n &.visible {\n transform: translateX(-50%) translateY(0);\n }\n }\n }\n\n &.top-right {\n left: auto !important;\n right: var(--spacing-scale-3x) !important;\n }\n\n &.visible {\n top: 0 !important;\n }\n\n &.full {\n br-list {\n display: flex;\n flex-direction: row;\n gap: 0;\n\n ::slotted(br-skiplink-item) {\n list-style: none;\n }\n }\n }\n\n &:not(.full) {\n min-width: var(--skiplink-min-width);\n }\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 Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/skip-link?tab=designer).\n *\n * @slot default - Slot para inserir os itens de navegação rápida (br-skiplink-item).\n *\n * @part container - Parte para o contêiner principal do componente skip-link, usada para estilização via ::part().\n */\n@Component({\n tag: 'br-skip-link',\n styleUrl: 'skip-link.scss',\n shadow: true,\n})\nexport class SkipLink {\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: HTMLBrSkipLinkElement\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 = Helpers.generateUniqueId()\n\n /**\n * Define se o skip link apresenta um ou múltiplos itens visíveis.\n * - 'simple': Exibe apenas um item por vez.\n * - 'compound': Exibe uma lista com múltiplos itens.\n */\n @Prop({ reflect: true }) readonly variant: 'simple' | 'compound' = 'compound'\n\n /**\n * Define a posição do skip link na tela.\n * - 'top-left': Posicionado no canto superior esquerdo.\n * - 'top-center': Posicionado no centro superior.\n * - 'top-right': Posicionado no canto superior direito.\n */\n @Prop({ reflect: true }) readonly position: 'top-left' | 'top-center' | 'top-right' = 'top-left'\n\n /**\n * Define o z-index do componente.\n * Controla a ordem de empilhamento do componente na página.\n */\n @Prop({ reflect: true }) readonly zIndex: number | null = null\n\n /**\n * Exibe a contagem de itens no formato (1/4), (2/4), etc.\n * Quando `true`, cada item mostrará sua posição relativa ao total de itens.\n * Por padrão, é `true` para o modo simple e `false` para o modo compound.\n */\n @Prop({ reflect: true }) readonly showItemCount?: boolean\n\n /**\n * Estado interno que controla a visibilidade do componente.\n */\n @State() private isVisible: boolean = false\n\n /**\n * Define se o componente está em modo tela pequena\n */\n @State() private isSmallScreen: boolean = false\n\n /**\n * Define se o componente precisa mudar para modo simples por falta de espaço\n */\n @State() private needsSimpleMode: boolean = false\n\n /**\n * Largura do container pai\n */\n @State() private containerWidth: number = 0\n\n /**\n * ResizeObserver para monitorar mudanças no tamanho do container\n */\n private resizeObserver: ResizeObserver\n\n /**\n * Evento emitido quando um item do skiplink é ativado.\n * O evento contém informações sobre o item acionado e o elemento target.\n */\n @Event() brSkiplinkNavigation: EventEmitter<{ itemId: string; target: string }>\n\n /**\n * Evento emitido quando o skiplink se torna visível.\n */\n @Event() brDidShow: EventEmitter<void>\n\n /**\n * Evento emitido quando o skiplink se torna oculto.\n */\n @Event() brDidHide: EventEmitter<void>\n\n @Watch('zIndex')\n updateStyles() {\n if (this.zIndex !== null && this.zIndex !== undefined) {\n this.el.style.zIndex = `${this.zIndex}`\n this.el.style.setProperty('--skiplink-layer', `${this.zIndex}`)\n }\n }\n\n /**\n * Observa mudanças nos estados que afetam o modo efetivo (simple/compound)\n * e atualiza as contagens dos itens quando necessário.\n */\n @Watch('needsSimpleMode')\n @Watch('isSmallScreen')\n watchModeChanges() {\n this.updateItemCounts()\n }\n\n /**\n * Listener para eventos de navegação dos itens filhos.\n */\n @Listen('brSkiplinkItemClick')\n handleItemNavigation(event: CustomEvent<{ itemId: string; target: string }>) {\n this.brSkiplinkNavigation.emit(event.detail)\n this.hide()\n }\n\n /**\n * Listener para evento de foco no componente.\n */\n @Listen('focusin')\n handleFocusIn() {\n if (!this.isVisible) {\n this.show()\n }\n }\n\n /**\n * Listener para evento de perda de foco no componente.\n */\n @Listen('focusout')\n handleFocusOut(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement | null\n if (relatedTarget === null || !this.el.contains(relatedTarget)) {\n this.hide()\n }\n }\n\n /**\n * Listener para a tecla Escape.\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && this.isVisible) {\n event.preventDefault()\n this.hide()\n ;(document.activeElement as HTMLElement)?.blur()\n return\n }\n }\n\n connectedCallback() {\n document.addEventListener('keydown', this.globalKeyHandler)\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.updateContainerSize)\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.resizeObserver.observe(parentElement)\n }\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.globalKeyHandler)\n\n if (this.resizeObserver !== undefined && this.resizeObserver !== null) {\n this.resizeObserver.disconnect()\n }\n }\n\n componentWillLoad() {\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.containerWidth = parentElement.clientWidth\n }\n }\n\n componentDidLoad() {\n this.updateItemCounts()\n this.calculateItemsWidth()\n }\n\n /**\n * Manipulador global para atalhos de teclado Alt+[número].\n */\n private globalKeyHandler = (event: KeyboardEvent) => {\n if (event.altKey && /^[1-9]$/.test(event.key)) {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n const targetItem = Array.from(items).find((item) => {\n const keyNumber = item.getAttribute('key-number')\n return keyNumber === event.key\n })\n\n if (targetItem && typeof targetItem.navigateToTarget === 'function') {\n event.preventDefault()\n targetItem.navigateToTarget()\n this.show()\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens e atualiza os estados do componente\n */\n private updateContainerSize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const width = entry.contentRect.width\n this.containerWidth = width\n this.isSmallScreen = width < 570\n\n if (!this.isSmallScreen) {\n this.calculateItemsWidth()\n } else {\n this.needsSimpleMode = false\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens do skip-link e determina se deve usar modo simple ou compound.\n */\n private calculateItemsWidth() {\n requestAnimationFrame(() => {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n if (items.length === 0 || this.isSmallScreen) return\n if (items.length > 4) {\n this.needsSimpleMode = true\n return\n }\n\n this.needsSimpleMode = false\n const totalWidth = this.sumItemsWidth(items)\n\n const availableWidth = this.calculateAvailableWidth()\n\n if (totalWidth > availableWidth) {\n this.needsSimpleMode = true\n }\n })\n }\n\n /**\n * Soma a largura de todos os itens do skip-link\n */\n private sumItemsWidth(items: NodeListOf<HTMLBrSkiplinkItemElement>): number {\n let total = 0\n\n items.forEach((item) => {\n const brItem = item.shadowRoot?.querySelector('br-item') as HTMLElement | null\n if (brItem === null) return\n\n const width = brItem.offsetWidth || brItem.scrollWidth || brItem.getBoundingClientRect().width\n total += width\n })\n\n return total\n }\n\n /**\n * Calcula a largura disponível descontando margens e margem de segurança\n */\n private calculateAvailableWidth(): number {\n if (this.containerWidth === 0) return 0\n\n // Obtém o valor da margem definida no CSS\n const computedStyle = getComputedStyle(this.el)\n const spacingValue = computedStyle.getPropertyValue('--spacing-scale-3x').trim()\n const margin = parseFloat(spacingValue) || 24\n\n // Margem de segurança para evitar quebras visuais\n const safetyMargin = 20\n\n // Desconta: margem esquerda + margem direita + margem de segurança\n return this.containerWidth - margin * 2 - safetyMargin\n }\n\n /**\n * Atualiza os atributos de contagem nos itens filhos.\n * Adiciona data-item-index e data-item-total em cada br-skiplink-item.\n * A contagem é exibida quando o componente está em modo simple (incluindo modo responsivo).\n */\n private updateItemCounts() {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const shouldShowCount = this.showItemCount !== undefined ? this.showItemCount : effectiveVariant === 'simple'\n const isCompoundMode = effectiveVariant === 'compound'\n\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n items.forEach((item) => {\n if (isCompoundMode) {\n item.classList.add('compound-mode')\n } else {\n item.classList.remove('compound-mode')\n }\n })\n\n if (!shouldShowCount) {\n items.forEach((item) => {\n item.removeAttribute('data-item-index')\n item.removeAttribute('data-item-total')\n })\n return\n }\n\n const total = items.length\n items.forEach((item, index) => {\n item.setAttribute('data-item-index', (index + 1).toString())\n item.setAttribute('data-item-total', total.toString())\n })\n }\n\n /**\n * Oculta o componente programaticamente.\n */\n @Method()\n async hide(): Promise<void> {\n const focusedElement = this.el.querySelector(':focus')\n if (focusedElement instanceof HTMLElement) {\n focusedElement.blur()\n }\n this.isVisible = false\n this.brDidHide.emit()\n return Promise.resolve()\n }\n\n /**\n * Exibe o componente programaticamente.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const firstItem = this.el.querySelector('br-skiplink-item') as HTMLBrSkiplinkItemElement | null\n if (firstItem !== null) {\n if (typeof firstItem.itemFocus === 'function') {\n await firstItem.itemFocus()\n } else {\n const focusableElement = firstItem.shadowRoot?.querySelector('a, button') as HTMLElement | null\n if (focusableElement !== null) {\n focusableElement.focus()\n }\n }\n }\n\n this.brDidShow.emit()\n return Promise.resolve()\n }\n\n private getEffectivePosition(): 'top-left' | 'top-center' | 'top-right' {\n if (this.isSmallScreen) {\n return 'top-left'\n }\n return this.position\n }\n\n private getCssClassMap(): CssClassMap {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const effectivePosition = this.getEffectivePosition()\n\n return {\n 'br-skiplink': true,\n full: effectiveVariant === 'compound',\n [effectivePosition]: true,\n visible: this.isVisible,\n }\n }\n\n render() {\n return (\n <Host>\n <nav part=\"container\" class={this.getCssClassMap()} id={this.customId}>\n <br-list>\n <slot></slot>\n </br-list>\n </nav>\n </Host>\n )\n }\n}\n"],"names":["Helpers","h","Host"],"mappings":"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"}
|
|
@@ -295,7 +295,7 @@ export class SkipLink {
|
|
|
295
295
|
};
|
|
296
296
|
}
|
|
297
297
|
render() {
|
|
298
|
-
return (h(Host, { key: '3da4abe22f44afcfaee67d02edf96ad2b0a96294' }, h("nav", { key: '
|
|
298
|
+
return (h(Host, { key: '3da4abe22f44afcfaee67d02edf96ad2b0a96294' }, h("nav", { key: '76c38f8f1484039a5134be1396b1d0a98dea4d5e', part: "container", class: this.getCssClassMap(), id: this.customId }, h("br-list", { key: '0d1e37896de8fe5f3e2eb4a057a2418e3e57e666' }, h("slot", { key: '276ee5442e5a119238416c614bef37688e52bd09' })))));
|
|
299
299
|
}
|
|
300
300
|
static get is() { return "br-skip-link"; }
|
|
301
301
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skip-link.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/skip-link/skip-link.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/skip-link?tab=designer).\n *\n * @slot default - Slot para inserir os itens de navegação rápida (br-skiplink-item).\n *\n * @part container - Parte para o contêiner principal do componente skip-link, usada para estilização via ::part().\n */\n@Component({\n tag: 'br-skip-link',\n styleUrl: 'skip-link.scss',\n shadow: true,\n})\nexport class SkipLink {\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: HTMLBrSkipLinkElement\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 = Helpers.generateUniqueId()\n\n /**\n * Define se o skip link apresenta um ou múltiplos itens visíveis.\n * - 'simple': Exibe apenas um item por vez.\n * - 'compound': Exibe uma lista com múltiplos itens.\n */\n @Prop({ reflect: true }) readonly variant: 'simple' | 'compound' = 'compound'\n\n /**\n * Define a posição do skip link na tela.\n * - 'top-left': Posicionado no canto superior esquerdo.\n * - 'top-center': Posicionado no centro superior.\n * - 'top-right': Posicionado no canto superior direito.\n */\n @Prop({ reflect: true }) readonly position: 'top-left' | 'top-center' | 'top-right' = 'top-left'\n\n /**\n * Define o z-index do componente.\n * Controla a ordem de empilhamento do componente na página.\n */\n @Prop({ reflect: true }) readonly zIndex: number | null = null\n\n /**\n * Exibe a contagem de itens no formato (1/4), (2/4), etc.\n * Quando `true`, cada item mostrará sua posição relativa ao total de itens.\n * Por padrão, é `true` para o modo simple e `false` para o modo compound.\n */\n @Prop({ reflect: true }) readonly showItemCount?: boolean\n\n /**\n * Estado interno que controla a visibilidade do componente.\n */\n @State() private isVisible: boolean = false\n\n /**\n * Define se o componente está em modo tela pequena\n */\n @State() private isSmallScreen: boolean = false\n\n /**\n * Define se o componente precisa mudar para modo simples por falta de espaço\n */\n @State() private needsSimpleMode: boolean = false\n\n /**\n * Largura do container pai\n */\n @State() private containerWidth: number = 0\n\n /**\n * ResizeObserver para monitorar mudanças no tamanho do container\n */\n private resizeObserver: ResizeObserver\n\n /**\n * Evento emitido quando um item do skiplink é ativado.\n * O evento contém informações sobre o item acionado e o elemento target.\n */\n @Event() brSkiplinkNavigation: EventEmitter<{ itemId: string; target: string }>\n\n /**\n * Evento emitido quando o skiplink se torna visível.\n */\n @Event() brDidShow: EventEmitter<void>\n\n /**\n * Evento emitido quando o skiplink se torna oculto.\n */\n @Event() brDidHide: EventEmitter<void>\n\n @Watch('zIndex')\n updateStyles() {\n if (this.zIndex !== null && this.zIndex !== undefined) {\n this.el.style.zIndex = `${this.zIndex}`\n this.el.style.setProperty('--skiplink-layer', `${this.zIndex}`)\n }\n }\n\n /**\n * Observa mudanças nos estados que afetam o modo efetivo (simple/compound)\n * e atualiza as contagens dos itens quando necessário.\n */\n @Watch('needsSimpleMode')\n @Watch('isSmallScreen')\n watchModeChanges() {\n this.updateItemCounts()\n }\n\n /**\n * Listener para eventos de navegação dos itens filhos.\n */\n @Listen('brSkiplinkItemClick')\n handleItemNavigation(event: CustomEvent<{ itemId: string; target: string }>) {\n this.brSkiplinkNavigation.emit(event.detail)\n this.hide()\n }\n\n /**\n * Listener para evento de foco no componente.\n */\n @Listen('focusin')\n handleFocusIn() {\n if (!this.isVisible) {\n this.show()\n }\n }\n\n /**\n * Listener para evento de perda de foco no componente.\n */\n @Listen('focusout')\n handleFocusOut(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement | null\n if (relatedTarget === null || !this.el.contains(relatedTarget)) {\n this.hide()\n }\n }\n\n /**\n * Listener para a tecla Escape.\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && this.isVisible) {\n event.preventDefault()\n this.hide()\n ;(document.activeElement as HTMLElement)?.blur()\n return\n }\n }\n\n connectedCallback() {\n document.addEventListener('keydown', this.globalKeyHandler)\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.updateContainerSize)\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.resizeObserver.observe(parentElement)\n }\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.globalKeyHandler)\n\n if (this.resizeObserver !== undefined && this.resizeObserver !== null) {\n this.resizeObserver.disconnect()\n }\n }\n\n componentWillLoad() {\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.containerWidth = parentElement.clientWidth\n }\n }\n\n componentDidLoad() {\n this.updateItemCounts()\n this.calculateItemsWidth()\n }\n\n /**\n * Manipulador global para atalhos de teclado Alt+[número].\n */\n private globalKeyHandler = (event: KeyboardEvent) => {\n if (event.altKey && /^[1-9]$/.test(event.key)) {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n const targetItem = Array.from(items).find((item) => {\n const keyNumber = item.getAttribute('key-number')\n return keyNumber === event.key\n })\n\n if (targetItem && typeof targetItem.navigateToTarget === 'function') {\n event.preventDefault()\n targetItem.navigateToTarget()\n this.show()\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens e atualiza os estados do componente\n */\n private updateContainerSize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const width = entry.contentRect.width\n this.containerWidth = width\n this.isSmallScreen = width < 570\n\n if (!this.isSmallScreen) {\n this.calculateItemsWidth()\n } else {\n this.needsSimpleMode = false\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens do skip-link e determina se deve usar modo simple ou compound.\n */\n private calculateItemsWidth() {\n requestAnimationFrame(() => {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n if (items.length === 0 || this.isSmallScreen) return\n if (items.length > 4) {\n this.needsSimpleMode = true\n return\n }\n\n this.needsSimpleMode = false\n const totalWidth = this.sumItemsWidth(items)\n\n const availableWidth = this.calculateAvailableWidth()\n\n if (totalWidth > availableWidth) {\n this.needsSimpleMode = true\n }\n })\n }\n\n /**\n * Soma a largura de todos os itens do skip-link\n */\n private sumItemsWidth(items: NodeListOf<HTMLBrSkiplinkItemElement>): number {\n let total = 0\n\n items.forEach((item) => {\n const brItem = item.shadowRoot?.querySelector('br-item') as HTMLElement | null\n if (brItem === null) return\n\n const width = brItem.offsetWidth || brItem.scrollWidth || brItem.getBoundingClientRect().width\n total += width\n })\n\n return total\n }\n\n /**\n * Calcula a largura disponível descontando margens e margem de segurança\n */\n private calculateAvailableWidth(): number {\n if (this.containerWidth === 0) return 0\n\n // Obtém o valor da margem definida no CSS\n const computedStyle = getComputedStyle(this.el)\n const spacingValue = computedStyle.getPropertyValue('--spacing-scale-3x').trim()\n const margin = parseFloat(spacingValue) || 24\n\n // Margem de segurança para evitar quebras visuais\n const safetyMargin = 20\n\n // Desconta: margem esquerda + margem direita + margem de segurança\n return this.containerWidth - margin * 2 - safetyMargin\n }\n\n /**\n * Atualiza os atributos de contagem nos itens filhos.\n * Adiciona data-item-index e data-item-total em cada br-skiplink-item.\n * A contagem é exibida quando o componente está em modo simple (incluindo modo responsivo).\n */\n private updateItemCounts() {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const shouldShowCount = this.showItemCount !== undefined ? this.showItemCount : effectiveVariant === 'simple'\n const isCompoundMode = effectiveVariant === 'compound'\n\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n items.forEach((item) => {\n if (isCompoundMode) {\n item.classList.add('compound-mode')\n } else {\n item.classList.remove('compound-mode')\n }\n })\n\n if (!shouldShowCount) {\n items.forEach((item) => {\n item.removeAttribute('data-item-index')\n item.removeAttribute('data-item-total')\n })\n return\n }\n\n const total = items.length\n items.forEach((item, index) => {\n item.setAttribute('data-item-index', (index + 1).toString())\n item.setAttribute('data-item-total', total.toString())\n })\n }\n\n /**\n * Oculta o componente programaticamente.\n */\n @Method()\n async hide(): Promise<void> {\n const focusedElement = this.el.querySelector(':focus')\n if (focusedElement instanceof HTMLElement) {\n focusedElement.blur()\n }\n this.isVisible = false\n this.brDidHide.emit()\n return Promise.resolve()\n }\n\n /**\n * Exibe o componente programaticamente.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const firstItem = this.el.querySelector('br-skiplink-item') as HTMLBrSkiplinkItemElement | null\n if (firstItem !== null) {\n if (typeof firstItem.itemFocus === 'function') {\n await firstItem.itemFocus()\n } else {\n const focusableElement = firstItem.shadowRoot?.querySelector('a, button') as HTMLElement | null\n if (focusableElement !== null) {\n focusableElement.focus()\n }\n }\n }\n\n this.brDidShow.emit()\n return Promise.resolve()\n }\n\n private getEffectivePosition(): 'top-left' | 'top-center' | 'top-right' {\n if (this.isSmallScreen) {\n return 'top-left'\n }\n return this.position\n }\n\n private getCssClassMap(): CssClassMap {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const effectivePosition = this.getEffectivePosition()\n\n return {\n 'br-skiplink': true,\n full: effectiveVariant === 'compound',\n [effectivePosition]: true,\n visible: this.isVisible,\n }\n }\n\n render() {\n return (\n <Host>\n <nav part=\"container\" class={this.getCssClassMap()} id={this.customId} role=\"navigation\">\n <br-list>\n <slot></slot>\n </br-list>\n </nav>\n </Host>\n )\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"skip-link.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/skip-link/skip-link.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,SAAS,EACT,OAAO,EACP,KAAK,EAEL,CAAC,EACD,IAAI,EACJ,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,GACN,MAAM,eAAe,CAAA;AAEtB,OAAO,OAAO,MAAM,qBAAqB,CAAA;AAGzC;;;;;;;;GAQG;AAMH,MAAM,OAAO,QAAQ;IALrB;QAcE;;;WAGG;QAC+B,aAAQ,GAAW,OAAO,CAAC,gBAAgB,EAAE,CAAA;QAE/E;;;;WAIG;QAC+B,YAAO,GAA0B,UAAU,CAAA;QAE7E;;;;;WAKG;QAC+B,aAAQ,GAA4C,UAAU,CAAA;QAEhG;;;WAGG;QAC+B,WAAM,GAAkB,IAAI,CAAA;QAS9D;;WAEG;QACc,cAAS,GAAY,KAAK,CAAA;QAE3C;;WAEG;QACc,kBAAa,GAAY,KAAK,CAAA;QAE/C;;WAEG;QACc,oBAAe,GAAY,KAAK,CAAA;QAEjD;;WAEG;QACc,mBAAc,GAAW,CAAC,CAAA;QAoH3C;;WAEG;QACK,qBAAgB,GAAG,CAAC,KAAoB,EAAE,EAAE;YAClD,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,kBAAkB,CAA0C,CAAA;gBACnG,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;oBACjD,OAAO,SAAS,KAAK,KAAK,CAAC,GAAG,CAAA;gBAChC,CAAC,CAAC,CAAA;gBAEF,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;oBACpE,KAAK,CAAC,cAAc,EAAE,CAAA;oBACtB,UAAU,CAAC,gBAAgB,EAAE,CAAA;oBAC7B,IAAI,CAAC,IAAI,EAAE,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC,CAAA;QAED;;WAEG;QACK,wBAAmB,GAAG,CAAC,OAA8B,EAAE,EAAE;YAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAA;gBACrC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;gBAC3B,IAAI,CAAC,aAAa,GAAG,KAAK,GAAG,GAAG,CAAA;gBAEhC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAA;gBAC5B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,CAAA;KAqKF;IAnSC,YAAY;QACV,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtD,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;YACvC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAED;;;OAGG;IAGH,gBAAgB;QACd,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED;;OAEG;IAEH,oBAAoB,CAAC,KAAsD;QACzE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAED;;OAEG;IAEH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IAEH,cAAc,CAAC,KAAiB;QAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAmC,CAAA;QAC/D,IAAI,aAAa,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IAEH,aAAa,CAAC,KAAoB;;QAChC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,IAAI,CAAC,IAAI,EAAE,CACV;YAAA,MAAC,QAAQ,CAAC,aAA6B,0CAAE,IAAI,EAAE,CAAA;YAChD,OAAM;QACR,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE3D,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;YAClE,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAA;YAC3C,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;QAClB,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE9D,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACtE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAClC,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAA;QAC3C,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC,WAAW,CAAA;QACjD,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACvB,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAsCD;;OAEG;IACK,mBAAmB;QACzB,qBAAqB,CAAC,GAAG,EAAE;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,kBAAkB,CAA0C,CAAA;YAEnG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa;gBAAE,OAAM;YACpD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;gBAC3B,OAAM;YACR,CAAC;YAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAA;YAErD,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;gBAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;YAC7B,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,KAA4C;QAChE,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;;YACrB,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,SAAS,CAAuB,CAAA;YAC9E,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAM;YAE3B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAA;YAC9F,KAAK,IAAI,KAAK,CAAA;QAChB,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,uBAAuB;QAC7B,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC;YAAE,OAAO,CAAC,CAAA;QAEvC,0CAA0C;QAC1C,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/C,MAAM,YAAY,GAAG,aAAa,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAA;QAChF,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;QAE7C,kDAAkD;QAClD,MAAM,YAAY,GAAG,EAAE,CAAA;QAEvB,mEAAmE;QACnE,OAAO,IAAI,CAAC,cAAc,GAAG,MAAM,GAAG,CAAC,GAAG,YAAY,CAAA;IACxD,CAAC;IAED;;;;OAIG;IACK,gBAAgB;QACtB,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAC7F,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,KAAK,QAAQ,CAAA;QAC7G,MAAM,cAAc,GAAG,gBAAgB,KAAK,UAAU,CAAA;QAEtD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,kBAAkB,CAA0C,CAAA;QAEnG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;YACrC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;YACxC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACrB,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAA;gBACvC,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5B,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC5D,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IAEH,KAAK,CAAC,IAAI;QACR,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACtD,IAAI,cAAc,YAAY,WAAW,EAAE,CAAC;YAC1C,cAAc,CAAC,IAAI,EAAE,CAAA;QACvB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACrB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED;;OAEG;IAEH,KAAK,CAAC,IAAI;;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QAErB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAA;QAE9D,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAqC,CAAA;QAC/F,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC9C,MAAM,SAAS,CAAC,SAAS,EAAE,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,gBAAgB,GAAG,MAAA,SAAS,CAAC,UAAU,0CAAE,aAAa,CAAC,WAAW,CAAuB,CAAA;gBAC/F,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;oBAC9B,gBAAgB,CAAC,KAAK,EAAE,CAAA;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACrB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,UAAU,CAAA;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAEO,cAAc;QACpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAC7F,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAErD,OAAO;YACL,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,gBAAgB,KAAK,UAAU;YACrC,CAAC,iBAAiB,CAAC,EAAE,IAAI;YACzB,OAAO,EAAE,IAAI,CAAC,SAAS;SACxB,CAAA;IACH,CAAC;IAED,MAAM;QACJ,OAAO,CACL,EAAC,IAAI;YACH,4DAAK,IAAI,EAAC,WAAW,EAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ;gBACnE;oBACE,8DAAa,CACL,CACN,CACD,CACR,CAAA;IACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/skip-link?tab=designer).\n *\n * @slot default - Slot para inserir os itens de navegação rápida (br-skiplink-item).\n *\n * @part container - Parte para o contêiner principal do componente skip-link, usada para estilização via ::part().\n */\n@Component({\n tag: 'br-skip-link',\n styleUrl: 'skip-link.scss',\n shadow: true,\n})\nexport class SkipLink {\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: HTMLBrSkipLinkElement\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 = Helpers.generateUniqueId()\n\n /**\n * Define se o skip link apresenta um ou múltiplos itens visíveis.\n * - 'simple': Exibe apenas um item por vez.\n * - 'compound': Exibe uma lista com múltiplos itens.\n */\n @Prop({ reflect: true }) readonly variant: 'simple' | 'compound' = 'compound'\n\n /**\n * Define a posição do skip link na tela.\n * - 'top-left': Posicionado no canto superior esquerdo.\n * - 'top-center': Posicionado no centro superior.\n * - 'top-right': Posicionado no canto superior direito.\n */\n @Prop({ reflect: true }) readonly position: 'top-left' | 'top-center' | 'top-right' = 'top-left'\n\n /**\n * Define o z-index do componente.\n * Controla a ordem de empilhamento do componente na página.\n */\n @Prop({ reflect: true }) readonly zIndex: number | null = null\n\n /**\n * Exibe a contagem de itens no formato (1/4), (2/4), etc.\n * Quando `true`, cada item mostrará sua posição relativa ao total de itens.\n * Por padrão, é `true` para o modo simple e `false` para o modo compound.\n */\n @Prop({ reflect: true }) readonly showItemCount?: boolean\n\n /**\n * Estado interno que controla a visibilidade do componente.\n */\n @State() private isVisible: boolean = false\n\n /**\n * Define se o componente está em modo tela pequena\n */\n @State() private isSmallScreen: boolean = false\n\n /**\n * Define se o componente precisa mudar para modo simples por falta de espaço\n */\n @State() private needsSimpleMode: boolean = false\n\n /**\n * Largura do container pai\n */\n @State() private containerWidth: number = 0\n\n /**\n * ResizeObserver para monitorar mudanças no tamanho do container\n */\n private resizeObserver: ResizeObserver\n\n /**\n * Evento emitido quando um item do skiplink é ativado.\n * O evento contém informações sobre o item acionado e o elemento target.\n */\n @Event() brSkiplinkNavigation: EventEmitter<{ itemId: string; target: string }>\n\n /**\n * Evento emitido quando o skiplink se torna visível.\n */\n @Event() brDidShow: EventEmitter<void>\n\n /**\n * Evento emitido quando o skiplink se torna oculto.\n */\n @Event() brDidHide: EventEmitter<void>\n\n @Watch('zIndex')\n updateStyles() {\n if (this.zIndex !== null && this.zIndex !== undefined) {\n this.el.style.zIndex = `${this.zIndex}`\n this.el.style.setProperty('--skiplink-layer', `${this.zIndex}`)\n }\n }\n\n /**\n * Observa mudanças nos estados que afetam o modo efetivo (simple/compound)\n * e atualiza as contagens dos itens quando necessário.\n */\n @Watch('needsSimpleMode')\n @Watch('isSmallScreen')\n watchModeChanges() {\n this.updateItemCounts()\n }\n\n /**\n * Listener para eventos de navegação dos itens filhos.\n */\n @Listen('brSkiplinkItemClick')\n handleItemNavigation(event: CustomEvent<{ itemId: string; target: string }>) {\n this.brSkiplinkNavigation.emit(event.detail)\n this.hide()\n }\n\n /**\n * Listener para evento de foco no componente.\n */\n @Listen('focusin')\n handleFocusIn() {\n if (!this.isVisible) {\n this.show()\n }\n }\n\n /**\n * Listener para evento de perda de foco no componente.\n */\n @Listen('focusout')\n handleFocusOut(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement | null\n if (relatedTarget === null || !this.el.contains(relatedTarget)) {\n this.hide()\n }\n }\n\n /**\n * Listener para a tecla Escape.\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && this.isVisible) {\n event.preventDefault()\n this.hide()\n ;(document.activeElement as HTMLElement)?.blur()\n return\n }\n }\n\n connectedCallback() {\n document.addEventListener('keydown', this.globalKeyHandler)\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.updateContainerSize)\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.resizeObserver.observe(parentElement)\n }\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.globalKeyHandler)\n\n if (this.resizeObserver !== undefined && this.resizeObserver !== null) {\n this.resizeObserver.disconnect()\n }\n }\n\n componentWillLoad() {\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.containerWidth = parentElement.clientWidth\n }\n }\n\n componentDidLoad() {\n this.updateItemCounts()\n this.calculateItemsWidth()\n }\n\n /**\n * Manipulador global para atalhos de teclado Alt+[número].\n */\n private globalKeyHandler = (event: KeyboardEvent) => {\n if (event.altKey && /^[1-9]$/.test(event.key)) {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n const targetItem = Array.from(items).find((item) => {\n const keyNumber = item.getAttribute('key-number')\n return keyNumber === event.key\n })\n\n if (targetItem && typeof targetItem.navigateToTarget === 'function') {\n event.preventDefault()\n targetItem.navigateToTarget()\n this.show()\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens e atualiza os estados do componente\n */\n private updateContainerSize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const width = entry.contentRect.width\n this.containerWidth = width\n this.isSmallScreen = width < 570\n\n if (!this.isSmallScreen) {\n this.calculateItemsWidth()\n } else {\n this.needsSimpleMode = false\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens do skip-link e determina se deve usar modo simple ou compound.\n */\n private calculateItemsWidth() {\n requestAnimationFrame(() => {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n if (items.length === 0 || this.isSmallScreen) return\n if (items.length > 4) {\n this.needsSimpleMode = true\n return\n }\n\n this.needsSimpleMode = false\n const totalWidth = this.sumItemsWidth(items)\n\n const availableWidth = this.calculateAvailableWidth()\n\n if (totalWidth > availableWidth) {\n this.needsSimpleMode = true\n }\n })\n }\n\n /**\n * Soma a largura de todos os itens do skip-link\n */\n private sumItemsWidth(items: NodeListOf<HTMLBrSkiplinkItemElement>): number {\n let total = 0\n\n items.forEach((item) => {\n const brItem = item.shadowRoot?.querySelector('br-item') as HTMLElement | null\n if (brItem === null) return\n\n const width = brItem.offsetWidth || brItem.scrollWidth || brItem.getBoundingClientRect().width\n total += width\n })\n\n return total\n }\n\n /**\n * Calcula a largura disponível descontando margens e margem de segurança\n */\n private calculateAvailableWidth(): number {\n if (this.containerWidth === 0) return 0\n\n // Obtém o valor da margem definida no CSS\n const computedStyle = getComputedStyle(this.el)\n const spacingValue = computedStyle.getPropertyValue('--spacing-scale-3x').trim()\n const margin = parseFloat(spacingValue) || 24\n\n // Margem de segurança para evitar quebras visuais\n const safetyMargin = 20\n\n // Desconta: margem esquerda + margem direita + margem de segurança\n return this.containerWidth - margin * 2 - safetyMargin\n }\n\n /**\n * Atualiza os atributos de contagem nos itens filhos.\n * Adiciona data-item-index e data-item-total em cada br-skiplink-item.\n * A contagem é exibida quando o componente está em modo simple (incluindo modo responsivo).\n */\n private updateItemCounts() {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const shouldShowCount = this.showItemCount !== undefined ? this.showItemCount : effectiveVariant === 'simple'\n const isCompoundMode = effectiveVariant === 'compound'\n\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n items.forEach((item) => {\n if (isCompoundMode) {\n item.classList.add('compound-mode')\n } else {\n item.classList.remove('compound-mode')\n }\n })\n\n if (!shouldShowCount) {\n items.forEach((item) => {\n item.removeAttribute('data-item-index')\n item.removeAttribute('data-item-total')\n })\n return\n }\n\n const total = items.length\n items.forEach((item, index) => {\n item.setAttribute('data-item-index', (index + 1).toString())\n item.setAttribute('data-item-total', total.toString())\n })\n }\n\n /**\n * Oculta o componente programaticamente.\n */\n @Method()\n async hide(): Promise<void> {\n const focusedElement = this.el.querySelector(':focus')\n if (focusedElement instanceof HTMLElement) {\n focusedElement.blur()\n }\n this.isVisible = false\n this.brDidHide.emit()\n return Promise.resolve()\n }\n\n /**\n * Exibe o componente programaticamente.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const firstItem = this.el.querySelector('br-skiplink-item') as HTMLBrSkiplinkItemElement | null\n if (firstItem !== null) {\n if (typeof firstItem.itemFocus === 'function') {\n await firstItem.itemFocus()\n } else {\n const focusableElement = firstItem.shadowRoot?.querySelector('a, button') as HTMLElement | null\n if (focusableElement !== null) {\n focusableElement.focus()\n }\n }\n }\n\n this.brDidShow.emit()\n return Promise.resolve()\n }\n\n private getEffectivePosition(): 'top-left' | 'top-center' | 'top-right' {\n if (this.isSmallScreen) {\n return 'top-left'\n }\n return this.position\n }\n\n private getCssClassMap(): CssClassMap {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const effectivePosition = this.getEffectivePosition()\n\n return {\n 'br-skiplink': true,\n full: effectiveVariant === 'compound',\n [effectivePosition]: true,\n visible: this.isVisible,\n }\n }\n\n render() {\n return (\n <Host>\n <nav part=\"container\" class={this.getCssClassMap()} id={this.customId}>\n <br-list>\n <slot></slot>\n </br-list>\n </nav>\n </Host>\n )\n }\n}\n"]}
|
|
@@ -281,15 +281,14 @@ const d = t(class t extends i {
|
|
|
281
281
|
return a(r, {
|
|
282
282
|
key: "3da4abe22f44afcfaee67d02edf96ad2b0a96294"
|
|
283
283
|
}, a("nav", {
|
|
284
|
-
key: "
|
|
284
|
+
key: "76c38f8f1484039a5134be1396b1d0a98dea4d5e",
|
|
285
285
|
part: "container",
|
|
286
286
|
class: this.getCssClassMap(),
|
|
287
|
-
id: this.customId
|
|
288
|
-
role: "navigation"
|
|
287
|
+
id: this.customId
|
|
289
288
|
}, a("br-list", {
|
|
290
|
-
key: "
|
|
289
|
+
key: "0d1e37896de8fe5f3e2eb4a057a2418e3e57e666"
|
|
291
290
|
}, a("slot", {
|
|
292
|
-
key: "
|
|
291
|
+
key: "276ee5442e5a119238416c614bef37688e52bd09"
|
|
293
292
|
}))));
|
|
294
293
|
}
|
|
295
294
|
get el() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["skipLinkCss","SkipLink","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","customId","Helpers","generateUniqueId","variant","position","zIndex","isVisible","isSmallScreen","needsSimpleMode","containerWidth","globalKeyHandler","event","altKey","test","key","items","el","querySelectorAll","targetItem","Array","from","find","item","keyNumber","getAttribute","navigateToTarget","preventDefault","show","updateContainerSize","entries","entry","width","contentRect","calculateItemsWidth","updateStyles","undefined","style","setProperty","watchModeChanges","updateItemCounts","handleItemNavigation","brSkiplinkNavigation","emit","detail","hide","handleFocusIn","handleFocusOut","relatedTarget","contains","handleKeyDown","_a","document","activeElement","blur","connectedCallback","addEventListener","ResizeObserver","resizeObserver","parentElement","observe","disconnectedCallback","removeEventListener","disconnect","componentWillLoad","clientWidth","componentDidLoad","requestAnimationFrame","length","totalWidth","sumItemsWidth","availableWidth","calculateAvailableWidth","total","forEach","brItem","shadowRoot","querySelector","offsetWidth","scrollWidth","getBoundingClientRect","computedStyle","getComputedStyle","spacingValue","getPropertyValue","trim","margin","parseFloat","safetyMargin","effectiveVariant","shouldShowCount","showItemCount","isCompoundMode","classList","add","remove","removeAttribute","index","setAttribute","toString","focusedElement","brDidHide","Promise","resolve","firstItem","itemFocus","focusableElement","focus","brDidShow","getEffectivePosition","getCssClassMap","effectivePosition","full","visible","render","h","Host","part","class","id","role"],"sources":["../../packages/webcomponents/src/components/skip-link/skip-link.scss?tag=br-skip-link&encapsulation=shadow","../../packages/webcomponents/src/components/skip-link/skip-link.tsx"],"sourcesContent":["@import \"~@govbr-ds/core/src/components/skiplink/skiplink\";\n\n:host {\n @include skiplink-configs;\n}\n\n.br-skiplink {\n &.top-left {\n left: var(--spacing-scale-3x) !important;\n right: auto !important;\n }\n\n &.top-center {\n left: 50% !important;\n right: auto !important;\n transform: translateX(-50%);\n\n &.full {\n transform: translateX(-50%) translateY(-100%);\n\n &.visible {\n transform: translateX(-50%) translateY(0);\n }\n }\n }\n\n &.top-right {\n left: auto !important;\n right: var(--spacing-scale-3x) !important;\n }\n\n &.visible {\n top: 0 !important;\n }\n\n &.full {\n br-list {\n display: flex;\n flex-direction: row;\n gap: 0;\n\n ::slotted(br-skiplink-item) {\n list-style: none;\n }\n }\n }\n\n &:not(.full) {\n min-width: var(--skiplink-min-width);\n }\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 Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/skip-link?tab=designer).\n *\n * @slot default - Slot para inserir os itens de navegação rápida (br-skiplink-item).\n *\n * @part container - Parte para o contêiner principal do componente skip-link, usada para estilização via ::part().\n */\n@Component({\n tag: 'br-skip-link',\n styleUrl: 'skip-link.scss',\n shadow: true,\n})\nexport class SkipLink {\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: HTMLBrSkipLinkElement\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 = Helpers.generateUniqueId()\n\n /**\n * Define se o skip link apresenta um ou múltiplos itens visíveis.\n * - 'simple': Exibe apenas um item por vez.\n * - 'compound': Exibe uma lista com múltiplos itens.\n */\n @Prop({ reflect: true }) readonly variant: 'simple' | 'compound' = 'compound'\n\n /**\n * Define a posição do skip link na tela.\n * - 'top-left': Posicionado no canto superior esquerdo.\n * - 'top-center': Posicionado no centro superior.\n * - 'top-right': Posicionado no canto superior direito.\n */\n @Prop({ reflect: true }) readonly position: 'top-left' | 'top-center' | 'top-right' = 'top-left'\n\n /**\n * Define o z-index do componente.\n * Controla a ordem de empilhamento do componente na página.\n */\n @Prop({ reflect: true }) readonly zIndex: number | null = null\n\n /**\n * Exibe a contagem de itens no formato (1/4), (2/4), etc.\n * Quando `true`, cada item mostrará sua posição relativa ao total de itens.\n * Por padrão, é `true` para o modo simple e `false` para o modo compound.\n */\n @Prop({ reflect: true }) readonly showItemCount?: boolean\n\n /**\n * Estado interno que controla a visibilidade do componente.\n */\n @State() private isVisible: boolean = false\n\n /**\n * Define se o componente está em modo tela pequena\n */\n @State() private isSmallScreen: boolean = false\n\n /**\n * Define se o componente precisa mudar para modo simples por falta de espaço\n */\n @State() private needsSimpleMode: boolean = false\n\n /**\n * Largura do container pai\n */\n @State() private containerWidth: number = 0\n\n /**\n * ResizeObserver para monitorar mudanças no tamanho do container\n */\n private resizeObserver: ResizeObserver\n\n /**\n * Evento emitido quando um item do skiplink é ativado.\n * O evento contém informações sobre o item acionado e o elemento target.\n */\n @Event() brSkiplinkNavigation: EventEmitter<{ itemId: string; target: string }>\n\n /**\n * Evento emitido quando o skiplink se torna visível.\n */\n @Event() brDidShow: EventEmitter<void>\n\n /**\n * Evento emitido quando o skiplink se torna oculto.\n */\n @Event() brDidHide: EventEmitter<void>\n\n @Watch('zIndex')\n updateStyles() {\n if (this.zIndex !== null && this.zIndex !== undefined) {\n this.el.style.zIndex = `${this.zIndex}`\n this.el.style.setProperty('--skiplink-layer', `${this.zIndex}`)\n }\n }\n\n /**\n * Observa mudanças nos estados que afetam o modo efetivo (simple/compound)\n * e atualiza as contagens dos itens quando necessário.\n */\n @Watch('needsSimpleMode')\n @Watch('isSmallScreen')\n watchModeChanges() {\n this.updateItemCounts()\n }\n\n /**\n * Listener para eventos de navegação dos itens filhos.\n */\n @Listen('brSkiplinkItemClick')\n handleItemNavigation(event: CustomEvent<{ itemId: string; target: string }>) {\n this.brSkiplinkNavigation.emit(event.detail)\n this.hide()\n }\n\n /**\n * Listener para evento de foco no componente.\n */\n @Listen('focusin')\n handleFocusIn() {\n if (!this.isVisible) {\n this.show()\n }\n }\n\n /**\n * Listener para evento de perda de foco no componente.\n */\n @Listen('focusout')\n handleFocusOut(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement | null\n if (relatedTarget === null || !this.el.contains(relatedTarget)) {\n this.hide()\n }\n }\n\n /**\n * Listener para a tecla Escape.\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && this.isVisible) {\n event.preventDefault()\n this.hide()\n ;(document.activeElement as HTMLElement)?.blur()\n return\n }\n }\n\n connectedCallback() {\n document.addEventListener('keydown', this.globalKeyHandler)\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.updateContainerSize)\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.resizeObserver.observe(parentElement)\n }\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.globalKeyHandler)\n\n if (this.resizeObserver !== undefined && this.resizeObserver !== null) {\n this.resizeObserver.disconnect()\n }\n }\n\n componentWillLoad() {\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.containerWidth = parentElement.clientWidth\n }\n }\n\n componentDidLoad() {\n this.updateItemCounts()\n this.calculateItemsWidth()\n }\n\n /**\n * Manipulador global para atalhos de teclado Alt+[número].\n */\n private globalKeyHandler = (event: KeyboardEvent) => {\n if (event.altKey && /^[1-9]$/.test(event.key)) {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n const targetItem = Array.from(items).find((item) => {\n const keyNumber = item.getAttribute('key-number')\n return keyNumber === event.key\n })\n\n if (targetItem && typeof targetItem.navigateToTarget === 'function') {\n event.preventDefault()\n targetItem.navigateToTarget()\n this.show()\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens e atualiza os estados do componente\n */\n private updateContainerSize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const width = entry.contentRect.width\n this.containerWidth = width\n this.isSmallScreen = width < 570\n\n if (!this.isSmallScreen) {\n this.calculateItemsWidth()\n } else {\n this.needsSimpleMode = false\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens do skip-link e determina se deve usar modo simple ou compound.\n */\n private calculateItemsWidth() {\n requestAnimationFrame(() => {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n if (items.length === 0 || this.isSmallScreen) return\n if (items.length > 4) {\n this.needsSimpleMode = true\n return\n }\n\n this.needsSimpleMode = false\n const totalWidth = this.sumItemsWidth(items)\n\n const availableWidth = this.calculateAvailableWidth()\n\n if (totalWidth > availableWidth) {\n this.needsSimpleMode = true\n }\n })\n }\n\n /**\n * Soma a largura de todos os itens do skip-link\n */\n private sumItemsWidth(items: NodeListOf<HTMLBrSkiplinkItemElement>): number {\n let total = 0\n\n items.forEach((item) => {\n const brItem = item.shadowRoot?.querySelector('br-item') as HTMLElement | null\n if (brItem === null) return\n\n const width = brItem.offsetWidth || brItem.scrollWidth || brItem.getBoundingClientRect().width\n total += width\n })\n\n return total\n }\n\n /**\n * Calcula a largura disponível descontando margens e margem de segurança\n */\n private calculateAvailableWidth(): number {\n if (this.containerWidth === 0) return 0\n\n // Obtém o valor da margem definida no CSS\n const computedStyle = getComputedStyle(this.el)\n const spacingValue = computedStyle.getPropertyValue('--spacing-scale-3x').trim()\n const margin = parseFloat(spacingValue) || 24\n\n // Margem de segurança para evitar quebras visuais\n const safetyMargin = 20\n\n // Desconta: margem esquerda + margem direita + margem de segurança\n return this.containerWidth - margin * 2 - safetyMargin\n }\n\n /**\n * Atualiza os atributos de contagem nos itens filhos.\n * Adiciona data-item-index e data-item-total em cada br-skiplink-item.\n * A contagem é exibida quando o componente está em modo simple (incluindo modo responsivo).\n */\n private updateItemCounts() {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const shouldShowCount = this.showItemCount !== undefined ? this.showItemCount : effectiveVariant === 'simple'\n const isCompoundMode = effectiveVariant === 'compound'\n\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n items.forEach((item) => {\n if (isCompoundMode) {\n item.classList.add('compound-mode')\n } else {\n item.classList.remove('compound-mode')\n }\n })\n\n if (!shouldShowCount) {\n items.forEach((item) => {\n item.removeAttribute('data-item-index')\n item.removeAttribute('data-item-total')\n })\n return\n }\n\n const total = items.length\n items.forEach((item, index) => {\n item.setAttribute('data-item-index', (index + 1).toString())\n item.setAttribute('data-item-total', total.toString())\n })\n }\n\n /**\n * Oculta o componente programaticamente.\n */\n @Method()\n async hide(): Promise<void> {\n const focusedElement = this.el.querySelector(':focus')\n if (focusedElement instanceof HTMLElement) {\n focusedElement.blur()\n }\n this.isVisible = false\n this.brDidHide.emit()\n return Promise.resolve()\n }\n\n /**\n * Exibe o componente programaticamente.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const firstItem = this.el.querySelector('br-skiplink-item') as HTMLBrSkiplinkItemElement | null\n if (firstItem !== null) {\n if (typeof firstItem.itemFocus === 'function') {\n await firstItem.itemFocus()\n } else {\n const focusableElement = firstItem.shadowRoot?.querySelector('a, button') as HTMLElement | null\n if (focusableElement !== null) {\n focusableElement.focus()\n }\n }\n }\n\n this.brDidShow.emit()\n return Promise.resolve()\n }\n\n private getEffectivePosition(): 'top-left' | 'top-center' | 'top-right' {\n if (this.isSmallScreen) {\n return 'top-left'\n }\n return this.position\n }\n\n private getCssClassMap(): CssClassMap {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const effectivePosition = this.getEffectivePosition()\n\n return {\n 'br-skiplink': true,\n full: effectiveVariant === 'compound',\n [effectivePosition]: true,\n visible: this.isVisible,\n }\n }\n\n render() {\n return (\n <Host>\n <nav part=\"container\" class={this.getCssClassMap()} id={this.customId} role=\"navigation\">\n <br-list>\n <slot></slot>\n </br-list>\n </nav>\n </Host>\n )\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["skipLinkCss","SkipLink","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","customId","Helpers","generateUniqueId","variant","position","zIndex","isVisible","isSmallScreen","needsSimpleMode","containerWidth","globalKeyHandler","event","altKey","test","key","items","el","querySelectorAll","targetItem","Array","from","find","item","keyNumber","getAttribute","navigateToTarget","preventDefault","show","updateContainerSize","entries","entry","width","contentRect","calculateItemsWidth","updateStyles","undefined","style","setProperty","watchModeChanges","updateItemCounts","handleItemNavigation","brSkiplinkNavigation","emit","detail","hide","handleFocusIn","handleFocusOut","relatedTarget","contains","handleKeyDown","_a","document","activeElement","blur","connectedCallback","addEventListener","ResizeObserver","resizeObserver","parentElement","observe","disconnectedCallback","removeEventListener","disconnect","componentWillLoad","clientWidth","componentDidLoad","requestAnimationFrame","length","totalWidth","sumItemsWidth","availableWidth","calculateAvailableWidth","total","forEach","brItem","shadowRoot","querySelector","offsetWidth","scrollWidth","getBoundingClientRect","computedStyle","getComputedStyle","spacingValue","getPropertyValue","trim","margin","parseFloat","safetyMargin","effectiveVariant","shouldShowCount","showItemCount","isCompoundMode","classList","add","remove","removeAttribute","index","setAttribute","toString","focusedElement","brDidHide","Promise","resolve","firstItem","itemFocus","focusableElement","focus","brDidShow","getEffectivePosition","getCssClassMap","effectivePosition","full","visible","render","h","Host","part","class","id"],"sources":["../../packages/webcomponents/src/components/skip-link/skip-link.scss?tag=br-skip-link&encapsulation=shadow","../../packages/webcomponents/src/components/skip-link/skip-link.tsx"],"sourcesContent":["@import \"~@govbr-ds/core/src/components/skiplink/skiplink\";\n\n:host {\n @include skiplink-configs;\n}\n\n.br-skiplink {\n &.top-left {\n left: var(--spacing-scale-3x) !important;\n right: auto !important;\n }\n\n &.top-center {\n left: 50% !important;\n right: auto !important;\n transform: translateX(-50%);\n\n &.full {\n transform: translateX(-50%) translateY(-100%);\n\n &.visible {\n transform: translateX(-50%) translateY(0);\n }\n }\n }\n\n &.top-right {\n left: auto !important;\n right: var(--spacing-scale-3x) !important;\n }\n\n &.visible {\n top: 0 !important;\n }\n\n &.full {\n br-list {\n display: flex;\n flex-direction: row;\n gap: 0;\n\n ::slotted(br-skiplink-item) {\n list-style: none;\n }\n }\n }\n\n &:not(.full) {\n min-width: var(--skiplink-min-width);\n }\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 Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/skip-link?tab=designer).\n *\n * @slot default - Slot para inserir os itens de navegação rápida (br-skiplink-item).\n *\n * @part container - Parte para o contêiner principal do componente skip-link, usada para estilização via ::part().\n */\n@Component({\n tag: 'br-skip-link',\n styleUrl: 'skip-link.scss',\n shadow: true,\n})\nexport class SkipLink {\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: HTMLBrSkipLinkElement\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 = Helpers.generateUniqueId()\n\n /**\n * Define se o skip link apresenta um ou múltiplos itens visíveis.\n * - 'simple': Exibe apenas um item por vez.\n * - 'compound': Exibe uma lista com múltiplos itens.\n */\n @Prop({ reflect: true }) readonly variant: 'simple' | 'compound' = 'compound'\n\n /**\n * Define a posição do skip link na tela.\n * - 'top-left': Posicionado no canto superior esquerdo.\n * - 'top-center': Posicionado no centro superior.\n * - 'top-right': Posicionado no canto superior direito.\n */\n @Prop({ reflect: true }) readonly position: 'top-left' | 'top-center' | 'top-right' = 'top-left'\n\n /**\n * Define o z-index do componente.\n * Controla a ordem de empilhamento do componente na página.\n */\n @Prop({ reflect: true }) readonly zIndex: number | null = null\n\n /**\n * Exibe a contagem de itens no formato (1/4), (2/4), etc.\n * Quando `true`, cada item mostrará sua posição relativa ao total de itens.\n * Por padrão, é `true` para o modo simple e `false` para o modo compound.\n */\n @Prop({ reflect: true }) readonly showItemCount?: boolean\n\n /**\n * Estado interno que controla a visibilidade do componente.\n */\n @State() private isVisible: boolean = false\n\n /**\n * Define se o componente está em modo tela pequena\n */\n @State() private isSmallScreen: boolean = false\n\n /**\n * Define se o componente precisa mudar para modo simples por falta de espaço\n */\n @State() private needsSimpleMode: boolean = false\n\n /**\n * Largura do container pai\n */\n @State() private containerWidth: number = 0\n\n /**\n * ResizeObserver para monitorar mudanças no tamanho do container\n */\n private resizeObserver: ResizeObserver\n\n /**\n * Evento emitido quando um item do skiplink é ativado.\n * O evento contém informações sobre o item acionado e o elemento target.\n */\n @Event() brSkiplinkNavigation: EventEmitter<{ itemId: string; target: string }>\n\n /**\n * Evento emitido quando o skiplink se torna visível.\n */\n @Event() brDidShow: EventEmitter<void>\n\n /**\n * Evento emitido quando o skiplink se torna oculto.\n */\n @Event() brDidHide: EventEmitter<void>\n\n @Watch('zIndex')\n updateStyles() {\n if (this.zIndex !== null && this.zIndex !== undefined) {\n this.el.style.zIndex = `${this.zIndex}`\n this.el.style.setProperty('--skiplink-layer', `${this.zIndex}`)\n }\n }\n\n /**\n * Observa mudanças nos estados que afetam o modo efetivo (simple/compound)\n * e atualiza as contagens dos itens quando necessário.\n */\n @Watch('needsSimpleMode')\n @Watch('isSmallScreen')\n watchModeChanges() {\n this.updateItemCounts()\n }\n\n /**\n * Listener para eventos de navegação dos itens filhos.\n */\n @Listen('brSkiplinkItemClick')\n handleItemNavigation(event: CustomEvent<{ itemId: string; target: string }>) {\n this.brSkiplinkNavigation.emit(event.detail)\n this.hide()\n }\n\n /**\n * Listener para evento de foco no componente.\n */\n @Listen('focusin')\n handleFocusIn() {\n if (!this.isVisible) {\n this.show()\n }\n }\n\n /**\n * Listener para evento de perda de foco no componente.\n */\n @Listen('focusout')\n handleFocusOut(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement | null\n if (relatedTarget === null || !this.el.contains(relatedTarget)) {\n this.hide()\n }\n }\n\n /**\n * Listener para a tecla Escape.\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && this.isVisible) {\n event.preventDefault()\n this.hide()\n ;(document.activeElement as HTMLElement)?.blur()\n return\n }\n }\n\n connectedCallback() {\n document.addEventListener('keydown', this.globalKeyHandler)\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.updateContainerSize)\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.resizeObserver.observe(parentElement)\n }\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.globalKeyHandler)\n\n if (this.resizeObserver !== undefined && this.resizeObserver !== null) {\n this.resizeObserver.disconnect()\n }\n }\n\n componentWillLoad() {\n const parentElement = this.el.parentElement\n if (parentElement !== null) {\n this.containerWidth = parentElement.clientWidth\n }\n }\n\n componentDidLoad() {\n this.updateItemCounts()\n this.calculateItemsWidth()\n }\n\n /**\n * Manipulador global para atalhos de teclado Alt+[número].\n */\n private globalKeyHandler = (event: KeyboardEvent) => {\n if (event.altKey && /^[1-9]$/.test(event.key)) {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n const targetItem = Array.from(items).find((item) => {\n const keyNumber = item.getAttribute('key-number')\n return keyNumber === event.key\n })\n\n if (targetItem && typeof targetItem.navigateToTarget === 'function') {\n event.preventDefault()\n targetItem.navigateToTarget()\n this.show()\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens e atualiza os estados do componente\n */\n private updateContainerSize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const width = entry.contentRect.width\n this.containerWidth = width\n this.isSmallScreen = width < 570\n\n if (!this.isSmallScreen) {\n this.calculateItemsWidth()\n } else {\n this.needsSimpleMode = false\n }\n }\n }\n\n /**\n * Calcula a largura total dos itens do skip-link e determina se deve usar modo simple ou compound.\n */\n private calculateItemsWidth() {\n requestAnimationFrame(() => {\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n if (items.length === 0 || this.isSmallScreen) return\n if (items.length > 4) {\n this.needsSimpleMode = true\n return\n }\n\n this.needsSimpleMode = false\n const totalWidth = this.sumItemsWidth(items)\n\n const availableWidth = this.calculateAvailableWidth()\n\n if (totalWidth > availableWidth) {\n this.needsSimpleMode = true\n }\n })\n }\n\n /**\n * Soma a largura de todos os itens do skip-link\n */\n private sumItemsWidth(items: NodeListOf<HTMLBrSkiplinkItemElement>): number {\n let total = 0\n\n items.forEach((item) => {\n const brItem = item.shadowRoot?.querySelector('br-item') as HTMLElement | null\n if (brItem === null) return\n\n const width = brItem.offsetWidth || brItem.scrollWidth || brItem.getBoundingClientRect().width\n total += width\n })\n\n return total\n }\n\n /**\n * Calcula a largura disponível descontando margens e margem de segurança\n */\n private calculateAvailableWidth(): number {\n if (this.containerWidth === 0) return 0\n\n // Obtém o valor da margem definida no CSS\n const computedStyle = getComputedStyle(this.el)\n const spacingValue = computedStyle.getPropertyValue('--spacing-scale-3x').trim()\n const margin = parseFloat(spacingValue) || 24\n\n // Margem de segurança para evitar quebras visuais\n const safetyMargin = 20\n\n // Desconta: margem esquerda + margem direita + margem de segurança\n return this.containerWidth - margin * 2 - safetyMargin\n }\n\n /**\n * Atualiza os atributos de contagem nos itens filhos.\n * Adiciona data-item-index e data-item-total em cada br-skiplink-item.\n * A contagem é exibida quando o componente está em modo simple (incluindo modo responsivo).\n */\n private updateItemCounts() {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const shouldShowCount = this.showItemCount !== undefined ? this.showItemCount : effectiveVariant === 'simple'\n const isCompoundMode = effectiveVariant === 'compound'\n\n const items = this.el.querySelectorAll('br-skiplink-item') as NodeListOf<HTMLBrSkiplinkItemElement>\n\n items.forEach((item) => {\n if (isCompoundMode) {\n item.classList.add('compound-mode')\n } else {\n item.classList.remove('compound-mode')\n }\n })\n\n if (!shouldShowCount) {\n items.forEach((item) => {\n item.removeAttribute('data-item-index')\n item.removeAttribute('data-item-total')\n })\n return\n }\n\n const total = items.length\n items.forEach((item, index) => {\n item.setAttribute('data-item-index', (index + 1).toString())\n item.setAttribute('data-item-total', total.toString())\n })\n }\n\n /**\n * Oculta o componente programaticamente.\n */\n @Method()\n async hide(): Promise<void> {\n const focusedElement = this.el.querySelector(':focus')\n if (focusedElement instanceof HTMLElement) {\n focusedElement.blur()\n }\n this.isVisible = false\n this.brDidHide.emit()\n return Promise.resolve()\n }\n\n /**\n * Exibe o componente programaticamente.\n */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const firstItem = this.el.querySelector('br-skiplink-item') as HTMLBrSkiplinkItemElement | null\n if (firstItem !== null) {\n if (typeof firstItem.itemFocus === 'function') {\n await firstItem.itemFocus()\n } else {\n const focusableElement = firstItem.shadowRoot?.querySelector('a, button') as HTMLElement | null\n if (focusableElement !== null) {\n focusableElement.focus()\n }\n }\n }\n\n this.brDidShow.emit()\n return Promise.resolve()\n }\n\n private getEffectivePosition(): 'top-left' | 'top-center' | 'top-right' {\n if (this.isSmallScreen) {\n return 'top-left'\n }\n return this.position\n }\n\n private getCssClassMap(): CssClassMap {\n const effectiveVariant = this.isSmallScreen || this.needsSimpleMode ? 'simple' : this.variant\n const effectivePosition = this.getEffectivePosition()\n\n return {\n 'br-skiplink': true,\n full: effectiveVariant === 'compound',\n [effectivePosition]: true,\n visible: this.isVisible,\n }\n }\n\n render() {\n return (\n <Host>\n <nav part=\"container\" class={this.getCssClassMap()} id={this.customId}>\n <br-list>\n <slot></slot>\n </br-list>\n </nav>\n </Host>\n )\n }\n}\n"],"mappings":"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","ignoreList":[]}
|