Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Web Component Dialog #28569

Conversation

brianchristopherbrady
Copy link
Contributor

@brianchristopherbrady brianchristopherbrady commented Jul 19, 2023

Dialog

Dialog is a window overlaid on either the primary window or another dialog window. Windows under a modal dialog are inert. That is, users cannot interact with content outside an active dialog window. Inert content outside an active dialog is typically visually obscured or dimmed so it is difficult to discern, and in some implementations, attempts to interact with the inert content cause the dialog to close.

Design Spec

Link to Dialog in Figma

Engineering Spec

Fluent WC3 Dialog has feature parity with the Fluent UI React 9 Dialog implementation but not direct parity.

Superclass: FASTElement

Class: Dialog


Component Name

<fluent-dialog></fluent-dialog>

Basic Implemenation

<fluent-dialog open>
  <!-- Header -->
  <fluent-text slot="title">Dialog</fluent-text>
  <fluent-button slot="title-action"><svg></svg></fluent-button>
  <!-- Default Content -->
  <fluent-text>Content</fluent-text>

  <!-- Footer/Actions -->
  <fluent-button slot="footer-action">Do Something</fluent-button>
</fluent-dialog>

Attributes

Name Privacy Type Default Description
modal-type public DialogModalType DialogModalType.modal Indicates that the type of modal to render.
open public boolean false Controls the open state of the dialog
no-title-action public boolean false Used to set whether the default title action is rendered.
change-focus public string undefined Used to set id of desired focus target.
aria-labelledby public string undefined optional based on implementation**
aria-describedby public string undefined optional based on implementation**
aria-label public string undefined optional based on implementation**

** See the W3C Specification for requirements and details.


Methods

Name Privacy Description git pus Parameters Return Inherited From
hide public The method to hide the dialog. void FASTDialog
show public The method to show the dialog. void FASTDialog

Slots

Name Description
title slot for title content
title-action slot for close button
default slot for content rendered between title and footer
footer-action slot for actions content
start slot for content at the start of the dialog
end slot for content at the end of the dialog

Events

Name Description Details
onOpenChange Event fired when the component transitions from its open state. { open: this.dialog.open, dismissed: dismissed }

Preparation

Fluent Web Component v3 v.s Fluent React 9

Component, Element, and Slot Mapping

Fluent UI React 9 Fluent Web Components 3 Description of difference
<Dialog> <fluent-dialog> tag name
<DialogTrigger> methods: hide() show() In the React version of our components, a "DialogTrigger" component is utilized as part of a composite component of Dialog. The DialogTrigger component provides functionality for toggling the visibility of the Dialog component.
In the Web Component version does not include a dialog trigger. Instead, it expects the user to directly access methods on the Dialog class or utilize CSS to control the visibility of the dialog component.
<DialogSurface> dialog::backdrop In the React version of our components, the DialogSurface component is used as part of the composite Dialog component to represent the dimmed background of the dialog.
The Web Component version utilizes the HTML dialog ::backdrop pseudoelement.
<DialogTitle> slot: title In the React version of our components, the component is used to implement the title of the dialog.
In the Web Component version, the title is provided through the title slot.
<DialogTitle action=""> slot: title-action In the React version of our components, the component the DialogTitles action prop.
In the Web Component version, the title action is provided through the Dialogs title-action slot
<DialogActions> slot: footer-action In the React version of our components, the component is used to implement the actions within the dialog.
In the Web Component version, actions are passsed through the actions slot

Attribute and prop Mapping

Fluent UI React 9 Fluent Web Components 3 Description of difference
use effect to customize focus target change-focus Changing the default focused element can be done in an effect. In FUIWC3, the id of the desired target to focus can be passed through the change-focus slot

@fabricteam
Copy link
Collaborator

fabricteam commented Jul 19, 2023

📊 Bundle size report

🤖 This report was generated against 079abca6ac7a8572f51f7da2db9f2d21a32da31c

@size-auditor
Copy link

size-auditor bot commented Jul 19, 2023

Asset size changes

Size Auditor did not detect a change in bundle size for any component!

Baseline commit: 079abca6ac7a8572f51f7da2db9f2d21a32da31c (build)

@codesandbox-ci
Copy link

codesandbox-ci bot commented Jul 19, 2023

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit 25b97ae:

Sandbox Source
@fluentui/react 8 starter Configuration
@fluentui/react-components 9 starter Configuration

Copy link
Contributor

@procload procload left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work, @brianchristopherbrady! I left a few comments a couple of questions.

@chrisdholt, @miroslavstastny, or @levithomason I took a first pass on this PR and left my comments.

packages/web-components/src/input/README.md Outdated Show resolved Hide resolved
packages/web-components/src/dialog/dialog.ts Outdated Show resolved Hide resolved
packages/web-components/src/dialog/dialog.styles.ts Outdated Show resolved Hide resolved
packages/web-components/src/dialog/dialog.styles.ts Outdated Show resolved Hide resolved
packages/web-components/src/dialog/dialog.styles.ts Outdated Show resolved Hide resolved
packages/web-components/src/dialog/dialog.stories.ts Outdated Show resolved Hide resolved
@brianchristopherbrady brianchristopherbrady merged commit dd16c56 into microsoft:web-components-v3 Oct 25, 2023
23 checks passed
${when(
x => x.modalType === DialogModalType.nonModal && x.titleAction.length === 0 && !x.noTitleAction,
html`<fluent-button
tabindex="0"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does this have tabindex given the control is focusable already?

<slot ${slotted({ property: 'titleAction', filter: elements() })} name="title-action"></slot>
${when(
x => x.modalType === DialogModalType.nonModal && x.titleAction.length === 0 && !x.noTitleAction,
html`<fluent-button
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we baking in a button control which we cannot change out? We value composition - I can't manage anything about this button, I can't add telemetry for instance, there is not an aria-label for this...

<template ?open="${x => x.open}">
<dialog
role="${x => (x.modalType === DialogModalType.alert ? 'alertdialog' : 'dialog')}"
modal-type="${x => x.modalType}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this an actual valid attribute of dialog?

export const template: ElementViewTemplate<Dialog> = html`
<template ?open="${x => x.open}">
<dialog
role="${x => (x.modalType === DialogModalType.alert ? 'alertdialog' : 'dialog')}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dialog has implicit semantics of dialog, we should only set this if we're overriding the semantics.

* @public
*/
export const template: ElementViewTemplate<Dialog> = html`
<template ?open="${x => x.open}">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is going to reflect to the host anyways, the template element here doesn't offer anything IMO

class="dialog"
part="dialog"
aria-modal="${x =>
x.modalType === DialogModalType.modal || x.modalType === DialogModalType.alert ? 'true' : void 0}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be more efficient by checking for the singular case of !DialogModalType.nonModal.

Comment on lines +7 to +11
export const DialogModalType = {
modal: 'modal',
nonModal: 'non-modal',
alert: 'alert',
} as const;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How was this API decided upon?

<div class="title" part="title">
<slot name="title"></slot>
<slot ${slotted({ property: 'titleAction', filter: elements() })} name="title-action"></slot>
${when(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like a better pattern would follow allowing for this to be defined by the definition as an "optional" default such as the indicator in "switch". This feels misaligned with that approach.

chrisdholt pushed a commit that referenced this pull request Apr 29, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit to radium-v/fluentui that referenced this pull request Apr 29, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit to radium-v/fluentui that referenced this pull request Apr 29, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit to radium-v/fluentui that referenced this pull request Apr 30, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request Apr 30, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 2, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 2, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 2, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 3, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 6, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 6, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 8, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
radium-v pushed a commit that referenced this pull request May 10, 2024
* dialog init

* dialog: updates stories, styles, and docs

* dialog: updates styles

* dialog: removes dead code, cleans up

* dialog: updates styles

* updates docs

* deletes dead code

* dialog: addresses PR feedback

* reverts dead file

* dialog: updates styles per feedback

* drawer: updates template, styles

* dialog: removes attr changed callback

* dialog: updates slot names for react parity, updates docs

* yarn change

* dialog: addresses feedback

* dialog: updates README

* dialog: fixes responsive styles

* dialog: removes dead styles

* dialog: updates readme docs

* dialog: reworks dialog to use navtive html dialog element

* dialog: fixes jsdoc

* dialog: updates slot names for closer parity with fv9, updates stories and docs

* dialog: updates README

* dialog: updates template class names

* dialog: updates backdrop to use fluent token

* dialog: adds two column layout story

* dialog: adds additional stories

* dialog: adds exports to index and package json

* dialog: fixes style token imports

* dialog: cleans up open state

* dialog: updates template slot names

* dialog: updates property name

* dialog: removes change-focus

* dialog: syncs open attr

* dialog: sync open attribute

* dialog: updates storybook docs

* dialog: updates readme docs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants