File pickers:
<input type="file">
Color pickers: <input type="color">
Date/time pickers: <input type="month">
<input type="date">
<input type="time">
<input type="datetime-local">
Numeric sliders: <input type="range" min="0" max="5">
Suggested options for text fields: <input list="fonts">
<datalist id="fonts">
<option value="Courier New"></option>
<option value="Garamond"></option>
<option value="Georgia"></option>
<option value="Tahoma"></option>
<option value="Times New Roman"></option>
</datalist>
Summaries with expandable details: <h2>FAQs</h2>
<details name="faq">
<summary>Why are interactive HTML elements cool?</summary>
They’re lightweight and semantic!
</details>
<details name="faq">
<summary>Will the previous answer close when I open this one?</summary>
Yes, because the <code><details></code> elements share the same name.
</details>
Media players with controls: <audio controls src="example.mp3"></audio>
<video controls src="example.mp4"></video>Well some other comment mentioned audio/video and those are seemingly aways different
> <audio controls src="example.mp3"></audio>
> <video controls src="example.mp4"></video>
Which look different in every single browser and can't be styled without JavaScript. Wish these were implemented better.
And an unfortunate number of recreated controls seem to have the serious UX sins.
"looks different in every single browser" is a minor issue. Might be nice if they were restylable via CSS, though.
But my biggest let-down with the <dialog> element is that it's comnpletely unstyled, beyond a very basic (and very un-Chrome-like) thick black line pixel border with sharp edges. Whereas my-hope-and-expectation (and indeed: what got me interested in <dialog> in the first place) was that I was hoping that the browser itself would provide for a lot of the tedium involved in UI dialog dev-work in-general, especially for things like automaticallyt conforming to the host OS' conventions on dialog/window layout and placement: I was hoping that I could mark-up an actual semantic model of a dialog and the browser would do the hard-work of making it look like a real native macOS (or iOS) - or Windows - dialog resource.
I was also hoping that, because open <dialog> elements exist in a distinct top-level layer, that they might even able to escape the bounds of the browser viewport, which would provide real value to the end-user in a lot of places (e.g. no-one wants an unmovable popup or modal-dialog that completely obscures the user's view of an underlying document (like macOS's old "Sheets" dialogs) - so another false-hope of mine got popped that day.
-----
I get the feeling that browser vendors would all like to see us stop using `alert()`, `prompt()` and `confirm()` in JavaScript (because they block the JS/main thred), but the same browser-vendors really haven't come-up with an adequate replacement: the beeauty of alert/prompt/confirm is that their API is incredibly simple yet effective and also doesn't require the proggrammer to have any UI design-skills; I don't understand why browsers still don't offer a non-blocking Promie-based API for alert/prompt/confirm instead of them trying, in vain, to convince us that <dialog> is better in every situastion when it clearly isn't. ]
I do agree <dialog> could have done with at least a little bit of TLC on the styling though, I just don't think it has to be 100% look and function like a system dialog outside the DOM to do it. Some base default styling to match the rest of the browser's default style would do wonders.
For PWAs (or any "web apps with more permissions than a random page should get just for being loaded") I could see where you wanted <dialogs> to go as a more well received idea though, similar to how there are separate things for styling the windows and interacting with the system for those more privileged pages.
Another reason might be that vendor making it look like a native browser window would blur the line of death[1]. It would make it easier for malicious website to make a popup "browser update" in the middle of the page that redirects to seemingly legit Chrome download page and downloads modified executable.
[1]: https://textslashplain.com/2017/01/14/the-line-of-death/
You also have to be incredibly careful about how much visual control you allow over an actual dialog - especially making it look like the host OS. People get bamboozled by shitty in-browser fake virus alerts all the time, now add a real dialog, with real looks, that the user is forced to interact with, and you have a slam-dunk.
Good news then, because alert/prompt/confirm do not block the window in any modern browser!
In Firefox it only blocks the viewport of the current tab, so it behaves exactly like a DIY modal. In Chromium browsers it does pop over part of the browser UI, but it still doesn't block the window; You interact with the tab bar, address bar, menu, etc.
It might be Gnome/Firefox only, IDK. But this modal thing is very bad UX.
The alternative is also bad, TBH: where the file picker is now gone somewhere in the sea of open windows. Maybe the middle-ground, where the file-picker is "attached" to the one tab that opened it, and goes away once other tabs and window chrome is engaged, but I guess thats hard to do in a WM?
There are lots of cases where they're almost mandatory. I have an app where some interactions will end up with 4 to 5 layers of stacked modals. Like you edit a node, then you open the sharing dialog to share it, then you need pick a person to share to, then you need to add a new person, then you need to select who to add, etc. Most websites are trivial and thus don't need dialogs at all but there are some which are full featured apps (like mine) where Modals are a critical thing to have.
this is what completely holds back most built-in browser components from widespread usage, i suspect the vendors implementing it just don't care at all because it's not their problem
every company i've ever worked at had at least a somewhat consistently defined design language and it would look completely amateurish and out of place to use built in browser components in most places, regardless of how much html/css purists want that to be the case
unless that is fixed, it will never happen
The dialog element behaves exactly how you'd want it to behave for a company with their own design language — you can style every part of it exactly how you need it (including the backdrop, the positioning and size of the dialog element itself, borders, colours, contents, etc). Depending on how you implement the design language, you can either apply those styles to the dialog element in general, or provide a custom component that wraps the dialog element and provides the styles you need.
What the previous poster was complaining about was the opposite situation: they aren't working with their own design language, and instead want to use native-looking HTML elements (the default inputs, selects, buttons, etc). However, the dialog element does not provide a native look-and-feel, and instead is very minimalistic, providing only the base that developers can add their own styles to.
That said, I think the browser implementors have made the correct choice here. The dialog element is not a native popup, and doesn't behave like a native popup at all, so it doesn't make sense to style it natively. In addition, the more styles they provide as part of the user-agent styling, the harder it is to reset those styles if you want to do something different. Apart from inputs, browsers fairly consistently stick with providing the minimum possible styling for an element to be usable, and this means that developers have the largest range of freedom to use those elements as they like.
await Prompts.alert("This is an alert message!");
const resultBoolean = await Prompts.confirm("Do you want to proceed?");
const name = await Prompts.prompt("What is your name?");
Demo here: https://tools.simonwillison.net/prompts-js - code written by o1: https://chatgpt.com/share/67539c28-4df0-8006-b021-4f468e011f...I recently re-created parts of it from memory for a hobby project and just now open-sourced it: https://github.com/jtwaleson/wizard-engine
The neat thing is that we can program the complex logic of the wizard with the full power of the programming language. By making each screen in the wizard a function that has input parameters and a return value, we can treat it like any other function. Show the same screen 3x in a row? Use a for loop. Show a screen with input that depends on the output of the previous step? Just use a variable to store the results.
Code here: https://github.com/simonw/prompts-js
Blog writeup: https://simonwillison.net/2024/Dec/7/prompts-js/
And, within three seconds of release, a <dialog> with this ability would be misused by advertisers to bring back the old pop-up windows that all browser's block by default now, because of advertiser misuse.
Nevertheless, I was also let down by it because it turns out if your <body> has a scrollbar, scroll wheel events bubble. There is a CSS property to stop them from bubbling but it doesn't work!
As a user, I would absolutely not want this. I appreciate being able to know which windows actually come from my browser and which are coming from a webpage.
I typically have lots of tabs open at once. Hundreds, in some cases. A window escaping the bounds of the viewport would imply that it also escapes the bounds of the browser tab - which is to say, can pop up no matter which tab I'm on at any given moment.
The better solution, I believe, would be to pop up any notification using the notification API, and then once the user has been taken to the browser tab, you can then show your dialog (restricted to the viewport, of course).
If I want a window to pop up over anything else, I'll use native apps, not browser apps.
sadly this only reminds me of bad actors spoofing native dialog UI's to phish passwords and such
I use it everywhere. Optkit.com
I’ve long hoped for more APIs in the style of alert/prompt/confirm, which are more like ready-made building blocks rather than cement to make cinderblocks with as most web APIs tend to be. Anything that helps cut down on the amount of HTML, CSS, and JS required to be written or imported would be a substantial QoL improvement. This does not seem to be a popular view, unfortunately.
I haven't done any serious web development for a decade, but did they ever get around to adding sane styling for drop-down menus?
And it can't be styled without JavaScript? That's how it works with <audio>. So utterly frustrating.
Edit: Example: https://gist.github.com/fzzzy/f5f1af66ee8fff478ffb3698ac9f80...
Yep. Welcome to the wonderful world of web standards.
Eh, I beg to differ. Lots of use cases for that kind of dialog, for saving, confirming changes, etc etc.
...how can I confirm a set of changes if the popup is blocking my view of said changes?
All the wonderful value is in that they are standard. The web is great in its ubiquity. Love the web! Sure it's a mess, how could it not be?!
<dialog> is a win here in my view, especially for internal admin tools, I don't want to care about the latest flavor of frontend insanity. I just want to save screen space and open content as modal overlay on top of a main view.
They should err on the side of keeping the APIs small. Maybe it would be better if Web Components weren't a thing. I thought ARIA was handling dialogs well when it comes to accessibility. I like the idea of splitting JavaScript into JSSugar and JS0. (It will be nice if in the Deno lawsuit that the USPTO clarifies that Oracle owns the term JavaScript and JS is a free-for-all.)
and yet:
> I don't want to care about the latest flavor of frontend insanity.
Those not well managed, not well-designed and not-well managed standards somehow get a pass because that insanity is now a part of the browser?
Do you know that Chrome argued that <dialog> should be removed from the platform because it's a bad API with multiple issues? https://github.com/whatwg/html/pull/4184#issuecomment-440405...
SIGH...
To be honest, I think it's unlikely you will ever try to open the same dialog modally twice. If you need user input to open the dialog, and a modal dialog blocks user input, the only way for this to happen is if you have an input on the dialog that opens the dialog. If you are using asynchronous tasks to open the dialog, then you probably should keep track of what is open and what is not.
The same thing would happen if you were doing it on Qt, for example.
This is a strange reaction to the blog post, because as you read, it's a certainty that my code did try to open the same dialog modally twice. This was a bug, of course, which would have been revealed in development if not for the change in the standard.
Edit: I looked up standards positions and both support URLPattern.
Did you mean Firefox and Safari? Anyway, WebKit appears to be adding support for URLPattern.
There's a <combobox> proposal in the works which is like a <select> on steroids [1].
Also the Popover API [1] already in browsers for toast alerts. And a popover hint proposal for tooltips[2].
[1] https://open-ui.org/components/combobox.explainer/
[2] https://mdn.github.io/dom-examples/popover-api/
[3] https://open-ui.org/components/popover-hint.research.explain...
That said, my one major bugbear with it is the reliance on javascript. Yep, I expect all* users on my sites to arrive with JS enabled. But I also (selfishly?) derive some satisfaction from them not having to. Why can't I control the dialog's open state with CSS or a targeted button?
Would love to learn I'm wrong about this.
Unsure about accessibility on this front, though it can't be worse than my previous attempts with hidden labels/checkboxes/form elements, while being much simpler and less hacky.
Popovers are always non-modal, which can be problematic depending on the use-case. Of course it's possible to manually implement a focus trap, but it's complex and it's javascript.
https://css-tricks.com/invoker-commands-additional-ways-to-w...
Each PAGE should be able to pull in common sections from the same page such as the header, sidebar, footer etc based on specific states selectable in each PAGE.
Yes, you can do the same thing with the current approaches by hiding and showing divs etc.. But if it were possible to support these approaches via specific tags in HTML it may help.
EXAMPLE:
<COMMON>
<script>
.. common javascript elements here
</script>
<SECTION id="header">
...
</SECTION>
<SECTION id="sidebar">
...
</SECTION>
<SECTION id="footer">
...
</SECTION>
</COMMON>
<PAGE default name="Home">
<INCLUDE from="header"/>
<INCLUDE from="sidebar"/>
<DIV>
.....
</DIV>
<INCLUDE from="footer"/>
</PAGE>
<PAGE name="Login">
<INCLUDE from="header"/>
<DIV>
.....
</DIV>
<INCLUDE from="footer"/>
</PAGE>
<PAGE name="Profile">
<INCLUDE from="header"/>
<INCLUDE from="sidebar"/>
<DIV>
.....
</DIV>
<INCLUDE from="footer"/>
</PAGE>Normally a form will reload the page anyways so I guess this isn't a normal problem but I was using htmx.
I've been using a dialog form to update an iframe (it's an editor) so it does work as normal the target iframe gets reloaded. It does not close the dialog though.
I can't produce the case where hitting enter closes the dialog. It should be the same as `<button type='submit'>submit</button>` which also does not close the dialog.
FWIW I learned yesterday that a button _can_ close the dialog:
<button formmethod="dialog">Update & Close</button>preventDefault and stopPropagation?
There is an event for the dialog about to close from pressing the escape key. No idea why it's only for closing via escape key.
Dialog works well for the most part, with a couple of CSS kludges here and there for the older browsers but otherwise straightforward to deal with. It's a decent addition to the web platform, but after 20 years of this I would like to stop making custom multi select controls every couple of years. Native controls good.
MDN says this should work as intended out of the box
```HTML <form method="dialog"> <button>Close</button> </form> ```
Only the listeners added via JS seem to work correctly.
This perplexes me. Why is it not recommended? Why put it in a standard and then recommend against it? What's wrong with it? The documentation is silent.
Or a little userscript walking the DOM to find dialog elements and removes them. Or you could check if one can listen on them for show/open events, or hijack the show() method to do nothing
Lots of options I'd say
Not something I'd have in mind when using dialogs for legitimate purposes as a developer though. Don't wonder why you don't get my "do you really want to delete this item?" on my software when you block these altogether, but I guess you mean this for specific domains where it's used for ads (have yet to see dialog used for that, but no surprise that they'd exist)
Now you can just "mdn <something>" in your omnibar and it will take you straight to the subject page or to a search results page.
I find this shortcut invaluable when developing for the web.
And then boom! It was shipped everywhere with none of the issues discussed or fixed.
Why?
My tiny conspiracy theory is because browsers are hellbent on removing "legacy" APIs like confirm/prompt, and Chrome tried to remove it about half-a-year to a year before <dialog> was suddenly shipped everywhere: https://dev.to/richharris/stay-alert-d
https://github.com/whatwg/html/wiki/dialog--initial-focus,-a...
- Argued that dialog should be removed: 2018
- Tried to force-remove confirm/prompt: mid-2021
- Dialog rushed into all browsers: March 8-14, 2022.
- The linked proposal for a fix: March 04, 2022
- Request for position on standard: Jan 18, 2023
- The proposal merged into the standard: Jan 26, 2023
- Implemented in browsers: ?? (Webkit is possibly July 2024: https://bugs.webkit.org/show_bug.cgi?id=250795)
"Actually"
Dialog was literally rushed into all browsers without bothering to fix the issues that plagued it for a decade. Some of them were fixed post-factum because now you couldn't ignore these issues.
https://tane.dev/2021/02/revisiting-dark-patterns-with-the-h...
Vignettes set their `z-index` CSS property to the max (2147483647), but a <dialog> is still higher on the z-plane (with no way to adjust that).
So if you click a link from a <dialog>, and an interstitial gets displayed, it’s under the <dialog>. It looks like nothing happened, that clicking is broken.
Fix in my case was to close() the <dialog> onclick.
That you cannot adjust the z-index is disturbing, especially given that you have to style <dialog> yourself if you wanna make it look any good (as others have reported here).
Also, for the record, alert() is still higher than <dialog> on the plane (see https://i.imgur.com/tzKOEF2.png).
For instance, see this recent thread https://news.ycombinator.com/item?id=41967897 about the “418 I’m a teapot” HTTP status code, also linking to MDN. It was nothing new neither.
https://developer.mozilla.org/en-US/docs/Web/HTML/Global_att...
> This page was last modified on Oct 29, 2024
https://github.com/mdn/content/commit/d2421d25d1676cc11b01cc...
https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogE...
(<dialog> has been around for a decade)