diff --git a/change/@fluentui-web-components-8fa1a0aa-7dd4-4129-89c3-fe350ad0fa58.json b/change/@fluentui-web-components-8fa1a0aa-7dd4-4129-89c3-fe350ad0fa58.json new file mode 100644 index 00000000000000..d9fd162a58c391 --- /dev/null +++ b/change/@fluentui-web-components-8fa1a0aa-7dd4-4129-89c3-fe350ad0fa58.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "feat: update button and anchor button to leverage custom states for variants", + "packageName": "@fluentui/web-components", + "email": "13071055+chrisdholt@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/web-components/src/anchor-button/anchor-button.spec.ts b/packages/web-components/src/anchor-button/anchor-button.spec.ts index 4d2b2441c70bd6..079d82d42dd464 100644 --- a/packages/web-components/src/anchor-button/anchor-button.spec.ts +++ b/packages/web-components/src/anchor-button/anchor-button.spec.ts @@ -77,4 +77,69 @@ test.describe('Anchor Button', () => { await expect(proxy).toHaveAttribute(`${attribute}`, `${value}`); }); } + + test('should navigate to the provided url when clicked', async ({ page }) => { + const element = page.locator('fluent-anchor-button'); + const expectedUrl = '#foo'; + + await page.setContent(/* html */ ` + + `); + + await element.click(); + + expect(page.url()).toContain(expectedUrl); + }); + + test('should navigate to the provided url when clicked while pressing the `Control` key on Windows or Meta on Mac', async ({ + page, + context, + }) => { + const element = page.locator('fluent-anchor-button'); + const expectedUrl = '#foo'; + + await page.setContent(/* html */ ` + + `); + + const [newPage] = await Promise.all([ + context.waitForEvent('page'), + element.click({ modifiers: ['ControlOrMeta'] }), + ]); + + expect(newPage.url()).toContain(expectedUrl); + }); + + test('should navigate to the provided url when `Enter` is pressed via keyboard', async ({ page }) => { + const element = page.locator('fluent-anchor-button'); + const expectedUrl = '#foo'; + + await page.setContent(/* html */ ` + + `); + + await element.focus(); + + await element.press('Enter'); + + expect(page.url()).toContain(expectedUrl); + }); + + test('should navigate to the provided url when `ctrl` and `Enter` are pressed via keyboard', async ({ + page, + context, + }) => { + const element = page.locator('fluent-anchor-button'); + const expectedUrl = '#foo'; + + await page.setContent(/* html */ ` + + `); + + await element.focus(); + + const [newPage] = await Promise.all([context.waitForEvent('page'), element.press('ControlOrMeta+Enter')]); + + expect(newPage.url()).toContain(expectedUrl); + }); }); diff --git a/packages/web-components/src/anchor-button/anchor-button.styles.ts b/packages/web-components/src/anchor-button/anchor-button.styles.ts index 490bc3774b1cbd..3a1aea693695b1 100644 --- a/packages/web-components/src/anchor-button/anchor-button.styles.ts +++ b/packages/web-components/src/anchor-button/anchor-button.styles.ts @@ -3,7 +3,14 @@ import { baseButtonStyles } from '../button/button.styles.js'; import { forcedColorsStylesheetBehavior } from '../utils/index.js'; // Need to support icon hover styles -export const styles = baseButtonStyles.withBehaviors( +export const styles = css` + ${baseButtonStyles} + + ::slotted(a) { + position: absolute; + inset: 0; + } +`.withBehaviors( forcedColorsStylesheetBehavior(css` :host { border-color: LinkText; diff --git a/packages/web-components/src/anchor-button/anchor-button.template.ts b/packages/web-components/src/anchor-button/anchor-button.template.ts index 7445870c4c94b7..46770804823883 100644 --- a/packages/web-components/src/anchor-button/anchor-button.template.ts +++ b/packages/web-components/src/anchor-button/anchor-button.template.ts @@ -10,8 +10,8 @@ export function anchorTemplate(options: AnchorOptions = return html`