The Element Has a Name
The fastest way to get the wrong control built is to call it a "dropdown." That one word covers at least five different components with five different behaviors, and the agent writing my markup has to guess which one I meant. Last month I asked for "a dropdown to filter the chart" on the server dashboard and got a <select> element. I wanted a menu of actions. The word was the whole spec, and the word was wrong.
Two references get you most of the way out. In February 2025 Raluca Budiu and Kara Rivenbark of Nielsen Norman Group published a glossary that names 61 interface elements with their alternate names and one-line definitions. The Component Gallery does the cross-referencing job from the other end - 60 components as they appear across 95 real design systems, so you can see what Ant Design, Polaris, and the BBC's Global Experience Language each call the same thing.
One caveat first, because everything below rests on it. NN/g is not a standards body, and those 95 design systems still disagree with it and with each other. So "the name" always means one of three smaller things, and I say which: an NN/g term, a common convention across design systems, or a house term I picked where the sources conflict. None of them is canonical.
So this is not an article about UI elements. It is a specimen sheet: 104 live elements, each labeled with its name, its family, and the synonym most likely to get you the wrong thing. Nothing here is a screenshot. Every menu opens, every dialog is a real <dialog>. Toggle the labels off and it is an ordinary page; on, and it is a catalog of itself.
The structure comes from Geoffrey Litt's talk "Understanding: the New Bottleneck": demonstration over description, and a quiz at the end, because as Andy Matuschak puts it in "Why Books Don't Work," reading hands you the feeling of understanding and almost none of the retention. You will not remember the difference between a kebab and a meatball menu because I told you. You might because you clicked both.
Five controls, one word
Start with the argument that started this. Below are the five things people mean by "dropdown," side by side and working. The differences are not cosmetic. One of them runs commands and the other four hold a value; two accept input that is not on the list; two are a single native HTML element and the rest are assemblies.
Runs a command. Holds no value. Built from a button plus a popover.
Holds a value from a closed set. One native element: <select>.
Options always visible, multi-select. NN/g keeps this separate from the dropdown list.
Text field plus a list. Accepts a value that is not on the list.
Suggestions are filtered as you type. The option set is open-ended.
| Control | Holds a value? | Off-list input? | Options always visible? | Native HTML? |
|---|---|---|---|---|
| Dropdown menu | no - runs commands | n/a | no | button + popover |
| Dropdown list | yes | no | no | <select> |
| Listbox | yes (often many) | no | yes | <select multiple> |
| Combo box | yes | yes | no | input + <datalist> |
| Autocomplete | yes | yes | no | JavaScript |
<datalist>, which is the part people forget exists. Definitions follow NN/g's glossary, which lists Dropdown List, Dropdown Menu, Listbox, and Combo Box as four separate entries.The obvious objection: does this level of pedantry pay for itself? It does now, and it did not five years ago. When I wrote the markup myself, a wrong word cost me the ten seconds it took to notice and fix. Now the word goes to an agent that produces 200 lines of confident, working, wrong component, and the cost is the review. Precision in the prompt is cheaper than precision in the diff.
Five families, and the sources do not agree on how many
Elements group into functional families, and here I have to be honest about the taxonomy: nobody agrees on the count. UXPin's guide sorts everything into four top-level categories - input, output, navigational, and container. NN/g's glossary does not impose top-level families at all; it is 61 alphabetical entries. The five-family split I use below - navigation, input, feedback and status, display and containers, and page-level blocks - is a working convention, not a standard. The element names below are sourced; the bins are mine.
The switchboard above filters by family and searches names plus synonyms, so if you only came for the input controls, click "Input" and the rest fade out.
Navigation: how people move, and the four menu icons
Navigation elements answer "where am I and where can I go." The four snack-food icons in the middle row are the ones I see mislabeled most. LogRocket's Rosie Allabarton gives the crisp version: the hamburger is three horizontal lines, the kebab is three dots arranged vertically, the meatball is three dots arranged horizontally, and the bento is a grid of squares. Click each one - the contents differ on purpose. Hamburger opens site navigation, kebab and meatball open item-scoped actions, bento switches between apps.
Same page, different position. NN/g: Anchor Link (In-Page Link, Jump Link).
NN/g files this as Side Sheet (Drawer, Flyout).
Not the same as an input stepper. See the collisions table.
Live in the bottom-right corner of this page once you have scrolled 600 px. It is a real specimen, not a picture of one.
popover attribute, positioned by a 17-line JavaScript helper against the trigger's bounding box. Nothing is a screenshot; the submenu really is a popover inside a popover.Input controls: the ones with the most synonyms
Input is where the naming gets sloppiest, because every design system renames the same six things. NN/g's entries are Textbox (Text Field, Input Field), Toggle (Toggle Switch, Switch), Segmented Button (Segmented Control), Floating Button (FAB), Range Control (Continuous Control), and Input Stepper. If you say "switch" to a designer and "toggle" to an engineer you are naming the same element twice.
indeterminate state. The <input type="range"> and type="color" controls are styled with accent-color so they follow the site palette in both themes.Feedback and status: modality is a property, not a component
The distinction worth carrying out of this section: "modal" is not a component, it is a mode. A dialog is the component. Calling showModal() on a <dialog> puts it in the top layer, renders a ::backdrop, and makes everything behind it inert. Calling show() on the same element gives you a non-modal dialog that leaves the page usable. Same element, same markup, different mode - and the bottom sheet, the drawer, and the lightbox in Fig. 4 are all that same <dialog> element with different CSS.
Transient, self-dismissing, non-blocking. NN/g: Snackbar (Toast). Look at the bottom center of the window, not at this button - a toast is anchored to the viewport, which is exactly what distinguishes it from an inline alert.
Real <dialog>.showModal(). Try Escape.
Same element, .show(). The page stays usable.
No decision yet.
Modal is the mode; lightbox is the content pattern. Note what it has that the modal dialog above does not: next, previous, a position counter, a caption, and arrow keys.
Determinate: it knows the total, so it can promise an end.
Same <progress> element. Remove the value attribute and the browser switches it to indeterminate by itself - flip the switch and watch.
Careful: Bootstrap's "badge" is what Material calls a chip.
Unlike a tooltip, it can hold links and focusable content.
Ships one-engineer platforms.
Opens on hover intent, holds rich content, dismisses on leave.
Four different situations, one label. The copy and the action have to change with the reason - and the last one is not an empty state at all.
<dialog> element each, differing only in CSS and in whether the script calls showModal() or show(). The tooltip and hover card use popover="manual" so hover intent controls them rather than a click."Empty state" is four different screens
This is the specimen I get wrong most often, because the label describes what the box contains - nothing - rather than why. Four unrelated situations produce an empty list, and each needs different copy and a different action. Cycle the chips in Fig. 4 and watch what changes.
- First run. Nothing has ever been created. Explain what would be here and offer the action that creates it. The only case where a primary button belongs.
- No results. A filter excluded everything. Say what was excluded and offer the escape. Shipping first-run copy here is the classic bug: "Create your first deploy!" insults someone with forty deploys and a typo in the search box.
- All done. The user emptied it themselves. Confirm, briefly. Prompting them to create something undoes the sense of completion.
- Failed. The request errored or was forbidden. This is not an empty state. It is an error state, and dressing it as an empty one hides an outage: the user reads "you have no deploys" when the truth is "we could not reach the server."
So the rule is about cause, not appearance: nothing created, filtered out, finished, or broken? Only the first three are empty states, and they do not share copy.
None of them is a loading state either: rendering "No deploys yet" mid-fetch is the most common version of this mistake, and the fix is the skeleton screen two specimens over. And "empty state" is not an NN/g term at all. It comes from design-system practice, which by the scoping rule above makes it a common convention rather than a glossary term - exactly why it drifts.
"Lightbox" and "modal" are not alternatives
People argue about whether something is "a lightbox or a modal" and never resolve it, because the words answer different questions. Modal is a mode: top layer, rest of the document inert, Escape closes it. Lightbox is a content pattern: one media item at its own size over a dimmed page, where looking at it is the task. Nearly every lightbox is modal, which is why they get welded together - but you could switch modality off and still have a lightbox, and a confirmation dialog is fully modal while being nothing like one.
The name is literal. A lightbox was a backlit glass panel photographers used to view slides; Lokesh Dhakar's Lightbox script borrowed the metaphor in 2005, and the dimmed backdrop every implementation still draws is imitating the darkened room around an illuminated pane. NN/g keeps it as its own entry, "non-fullscreen overlay, sometimes containing multimedia content," separate from both Dialog and Overlay.
The consequence is a different behavioral contract, which is why Fig. 4's lightbox has controls the modal dialog beside it does not. A dialog ends when the user decides, so it owes buttons that name the decision. A lightbox ends when the user stops looking, so it owes a way through the set: previous and next, a position counter, a caption, and arrow keys. Open it from any tile of the image list in Fig. 5 and it starts on the tile you clicked, because a viewer that restarts at item one is broken.
| Modal dialog | Lightbox | |
|---|---|---|
| What the word tells you | the interaction mode | the content pattern |
| Why it opened | the system needs a decision or some input | you asked to see something larger |
| Main content | copy and controls | one media item at its natural size |
| Expected actions | confirm, cancel, submit | next, previous, close |
| Sized by | its text, up to a max-width | the media's own dimensions |
| Can it be non-modal? | yes - that is show() | yes, though rare (inline expanders) |
| Finished when | the user decides | the user stops looking |
So the two are not competing instructions. "Modal" sets the mode and says nothing about content; "lightbox" describes the content and leaves the mode implied. A ticket saying only "modal" has not told you what goes inside.
Display and containers: the boxes everything else sits in
Container names are the least standardized and the most consequential, because they set your layout vocabulary for the life of the codebase. MUI calls its elevated surface a Paper; Material 3 calls it a Surface; Bootstrap has no equivalent and you use a Card. The layout primitives at the end - Box, Stack, Grid, Container - come from MUI and have been widely copied; the Component Gallery lists Stack as a component in its own right.
Cascade
What is an accordion?
Why the name attribute?
<details name>.| Service | Port |
|---|---|
| newsletter | 3462 |
| dashboard | 3460 |
| cascade | 412 |
| chart35 | 1108 |
| newsletter | 97 |
A table you can sort. Click a header. Naming caveat: this is a sortable table, not the APG grid - a real data grid manages focus cell by cell with arrow keys. The label promises more than this specimen delivers, which is the whole argument of this page turned on itself.
- CA Cascade
- SO Sotto
/var/www
stephens.page
Naming caveat: nested <details> is a disclosure hierarchy, not the APG tree view, which needs tree roles and arrow-key traversal with one tab stop.
- Specimen sheet shipped
- Hello World ladder
One series, no axes, reads inside a sentence.
Overlapped, this is an avatar group.
Non-interactive. The interactive one is a filter chip, up in Fig. 3.
"The diagram is never the source of truth."
scrollbar-color, which is the standards-track property - not the old ::-webkit-scrollbar pseudo-elements.Keep going.
End.
<details name> attribute for exclusivity, so opening one closes the other with no JavaScript. The two chart marks are hand-written inline SVG on one series each, colored with --brand and labeled in text tokens; a single-series chart needs no legend, and neither of these needs an axis.Page-level blocks: the vocabulary marketing pages actually use
Landing pages are not assembled from atomic controls; they are assembled from blocks, and the block names are their own vocabulary. Landingfolio's component library sorts its catalog into 37 categories, and the top of that list by count is Feature (995 examples), Hero (456), Footer (393), Header (390), Call To Action (297), and Testimonial (296). If you brief a designer or an agent in these words, you get a page back in one pass.
Ship the thing you keep describing
One sentence of positioning, one button, no scrolling required.
Fast
Under 100 ms.
Configurable
One YAML file.
Quiet
No noisy alerts.
Is there a free tier?
Can I self-host?
Features
Pricing
About
Careers
Privacy
Terms
example.test, which is reserved by RFC 2606 and resolves nowhere. Turn the labels off in the switchboard and it reads as an ordinary marketing page - that is the point of the exercise.How much of this does the browser expose already?
Before you scroll, predict. Of the 18 capabilities in Fig. 7 - dialogs, popovers, exclusive accordions, anchor positioning, customizable selects, scroll-driven animation - how many does your browser support natively? Write the number down. Most engineers I ask guess 6 to 10, and they are reliably low, because the mental model was set when jQuery plugins were how you got a modal. Then press the button: the probe runs real feature detection and reports what is actually there.
| Capability | Test | Supported |
|---|---|---|
| Press "Run the probe" to test this browser. | ||
::scroll-button()). Firefox and Safari will score lower on the last five rows, which is the whole reason to run the test in your browser instead of trusting my number. Read this as API detection only. A "yes" means the expression parses or the property exists; it is not evidence of usable rendering, complete keyboard interaction, accessibility, or freedom from bugs.The result I did not expect when I built this: on Chrome 142 the score is 18 out of 18. That was not true in 2019, and my instincts had not caught up.
Now the correction, because the obvious inference is wrong and I drew it in the first version of this page. Fig. 7 measures whether an API is recognized, not whether a component is finished. CSS.supports('anchor-name: --a') says the property parses. It does not say the tooltip survives a viewport edge, that input type="date" localizes the way your product needs, or that ::scroll-button() gives you a carousel. This page proves the gap: my tooltip uses getBoundingClientRect() and my carousel uses JavaScript buttons, and the probe calls both of those "supported."
So "18 of 18" retires exactly one argument: you no longer need a dependency to get the primitive. The expensive part remains. Four questions, in order:
- Does your browser matrix expose the primitive, not just the newest Chrome?
- Does the primitive supply the semantics and interaction pattern the name implies - the roles, the focus management, the keyboard behavior?
- How much behavior, styling, validation, and localization code is still yours to write and test?
- Is that remainder smaller and safer than the component abstraction your project already has?
Keyboard behavior belongs in question 2, not a footnote about edge cases. For a composite widget it is the definition, not polish: a thing with tabs that ignores arrow keys is not a tab bar, whatever the markup says.
The same three controls, mine and a real design system's
Every specimen above is hand-rolled from native HTML and CSS. That is a deliberate choice for a teaching page, not a recommendation - and question 3 above is exactly what a library is buying. To show what you get for the extra weight, Fig. 8 loads Shoelace 2.20.1 - a real, unmodified web-component library, straight from jsDelivr - and puts three of its components next to mine.
Hand-rolled, native HTML
Shoelace web components
Not loaded. Press the button above to fetch the real library from jsDelivr.
<sl-select>, <sl-switch>, and <sl-rating> as actual custom elements, themed to the site palette by mapping --sl-color-primary-600 onto --brand, and it follows the light/dark toggle by swapping the sl-theme-dark class. If jsDelivr is unreachable the cell says so and the hand-rolled column is unaffected.The names that collide
These are the collisions that have actually cost me time. Each one is a case where two sources use the same word for different components, or different words for the same component.
| Name | The collision |
|---|---|
| Stepper | The Component Gallery's "Stepper" is the multi-step wizard. NN/g's "Input Stepper" is the numeric increment/decrement control. Two unrelated components, one word. Say "wizard" or "number input" and the ambiguity disappears. |
| Badge | Bootstrap's badge is a small inline label - what Material calls a chip and Polaris calls a tag. Material's badge is the count bubble on an icon. NN/g follows Material: "notification indicator (dot) or item counter." |
| Modal | Not a component. It is a property of a dialog: showModal() versus show(). Ask for "a modal" and you have specified the mode but not the content pattern. |
| Lightbox | Argued about as if it were an alternative to "modal," but they answer different questions: modal is the interaction mode, lightbox is the content pattern. Nearly every lightbox is modal; almost no modal is a lightbox. Saying only "modal" specifies the mode and nothing about what is inside. |
| Empty state | Covers four unrelated screens - first run, no results, all done, and failed - which need different copy and different actions. The fourth is an error state and should not be dressed as an empty one. Not an NN/g term; it comes from design-system practice. |
| Snackbar / toast | Material says snackbar, everyone else says toast. NN/g lists it as "Snackbar (Toast)." Same element. |
| Drawer / side sheet / flyout | Three names, one element. NN/g's entry is "Side Sheet (Drawer, Flyout)"; it also lists "Drawer Menu" separately for the navigation-specific case. |
| Segmented control | Apple's name. Material 3 says segmented button; NN/g lists "Segmented Button (Segmented Control)." Bootstrap has no equivalent and you build it from a button group. |
| Popover | Ambiguous in a way the others are not: it is both a component name (NN/g "Popup (Popover)") and an HTML attribute that is a top-layer mechanism. The menus, tooltips, and hover cards in this page are all built with popover but are not all a popover. |
| Card | The most overloaded container in the industry. NN/g pins it usefully: "container resembling playing card size holding related brief information." If it fills the page it is a panel or a surface, not a card. |
Recognition is not the skill you need
I built the quiz below before thinking hard enough about what it measures. Multiple choice tests recognition: shown four names, can you pick one. But this post is supposed to pay off at a blank prompt box, where nobody offers you four options. That is recall, a different skill. Robert and Elizabeth Bjork's New Theory of Disuse separates retrieval strength (how easily something comes to mind now) from storage strength (how durably it is learned), and the two come apart. Recognizing a name you read ninety seconds ago scores well on retrieval and says little about storage.
Their prescription is desirable difficulty: make retrieval harder on purpose. The nearest evidence is the testing effect Henry Roediger and Jeffrey Karpicke measured in 2006, and it is worth being precise about what they compared, because I was not at first. They tested repeated studying against repeated free recall, not multiple choice against typing, and the result was time-dependent: restudying won at five minutes, the tested group won at two days and one week, and the restudy group felt more confident throughout. That supports retrieval practice over rereading for durable retention. It does not prove multiple choice is worthless, and I should not have implied it does.
What I can defend is narrower: producing a term from nothing rehearses what you actually do at a prompt box. Matt Pocock's teach skill is built on the same pair of ideas, effort and a tight feedback loop rather than a comprehension check at the end. So Fig. 9 is the harder version, offered as a plausible application of the research rather than a result those citations establish. It clones a specimen out of this page, strips its label, and asks you to type what it is. No options. It accepts any synonym the page has taught you, which is the honest grading rule: "side sheet" and "flyout" are both correct for a drawer.
Press Start. A specimen from this page appears here, unlabeled. Type what it is called.
.spec node out of the page, removes its label and its explanatory note, strips the ids so nothing collides, and marks the stage inert so the clone is neither clickable nor reachable by Tab. Visible text that would spell the answer (or a synonym) is redacted in the clone, so a button that says “Open drawer” on the page does not give the game away here. Grading normalizes case and punctuation and accepts every synonym in the specimen's own data-also attribute. The pool is every labeled specimen on the page, shuffled once per pass, so families stay interleaved rather than blocked.The quiz at the door
Litt's rule for his own agents is that a PR does not ship unless he could pass a quiz on it. Same rule here, and the same warning from Matuschak: if you scrolled and nodded, you kept almost none of it. Eight questions - and having just done the recall drill, notice how much easier these feel. That gap is the point.
A dropdown list - one native <select>. A combo box would let them type "Freedonia," a dropdown menu runs commands rather than holding a value, and an autocomplete implies an open-ended option set.
Modality is a mode, not a component. The same <dialog> element gives you both: showModal() for modal, show() for modeless. Both are in Fig. 4.
Kebab is vertical, meatball is horizontal, hamburger is three lines, bento is a grid. Picture the skewer standing up.
NN/g's "Input Stepper" adjusts a number in fixed increments. The Component Gallery's "Stepper" is the wizard with numbered stages. Both are in this page, in Figs. 3 and 2 respectively.
A switch is an immediate state change - flip it and the setting is applied. A checkbox collects a value the form submits later. NN/g files the switch under "State-Switch Control."
popover is a top-layer primitive with light-dismiss and focus management built in. The dropdown menus, tooltips, hover cards, and pie menu in this page are all built with it, and none of them is "a popover" as a component name.
"Modal" sets the mode - top layer, backdrop, rest inert. It says nothing about what goes inside. A photo viewer is a lightbox, and a lightbox owes the user navigation through the set, which a plain modal dialog does not.
Four situations share the label "empty state" - first run, no results, all done, and failed. Only the first wants a create action. Telling someone with forty deploys to create their first one is the giveaway.
0 of 8 answered.
What's still open
A vocabulary does not settle an argument by existing. NN/g published 61 names in February 2025 and the Component Gallery's 95 design systems still disagree with each other and with NN/g; "stepper" still means two things depending which door you came in. I have not adopted a house glossary across my own repositories, so until I do this is a reference I wrote rather than a standard I follow. That is the next piece of work: a short names file per project, so the agent and I read from the same list. A smaller and more useful artifact than another design system.
The second thing I would change is the shape. This page argues three things at once - that precise component language pays, that here are 103 specimens, and that native primitives have caught up - and the review made a fair case that the breadth fights the teaching. Nobody retains 103 names in one sitting, and eight quiz questions barely sample them. The better structure is probably an essay on the "dropdown" ambiguity and the expensive collisions, a separate atlas with per-item provenance and behavior contracts, and a separate browser lab. I have not split it, because the specimen sheet is the argument: the labels only teach while you are standing in front of the live thing. If a second post comes out of this, it will be the atlas.
The third question is whether the labels helped. Litt's own caveat is that interactive figures become a crutch: you push the buttons, feel competent, retain nothing. The recall drill sharpened that worry rather than settling it. I can measure whether you produce the word, but only in the same session - which is exactly the retrieval-strength reading the Bjorks warn is misleading. The honest experiment is a drill that comes back in a week, and a page cannot do that. Building this taught me two things I did not know: <details name> makes an exclusive accordion with no JavaScript, and a "modal" was never a component. Whether reading it does the same for you is the test I still cannot run.
Sources
Ideas and authorities
- Raluca Budiu and Kara Rivenbark, "User-Interface Elements: Glossary", Nielsen Norman Group, February 28, 2025 - the 61 element names, their alternate names, and the definitions quoted throughout. nngroup.com/articles/ui-elements-glossary
- The Component Gallery - 60 components cross-referenced across 95 real design systems, the source for the naming collisions. component.gallery
- Rosie Allabarton, "40 essential UI elements every designer should know", LogRocket, April 14, 2025 - the hamburger / kebab / meatball / bento icon distinctions. blog.logrocket.com/ux-design/40-essential-ui-elements
- UXPin, "User Interface Elements Every Designer Should Know", May 22, 2026 - the four-family grouping (input, output, navigational, container) that my five-family split departs from. uxpin.com/studio/blog
- Landingfolio - the 37 page-block categories and their example counts (Feature 995, Hero 456, Footer 393, Header 390, Call To Action 297, Testimonial 296). landingfolio.com/components
- Geoffrey Litt, "Understanding: the New Bottleneck" (talk I attended) - demonstration over description, and the quiz-before-merge rule. youtube.com/watch?v=WkBPX-oDMnA
- Andy Matuschak, "Why Books Don't Work" (2019) - reading produces the feeling of understanding without the retention. andymatuschak.org/books
- Robert A. Bjork and Elizabeth L. Bjork, "A New Theory of Disuse and an Old Theory of Stimulus Fluctuation" (1992) - the retrieval-strength versus storage-strength distinction, and desirable difficulties, which is why Fig. 9 asks you to type instead of choose.
- Henry L. Roediger III and Jeffrey D. Karpicke, "Test-Enhanced Learning: Taking Memory Tests Improves Long-Term Retention", Psychological Science 17(3) (2006) - the testing effect: retrieval beats restudying, while feeling worse at the time.
- Matt Pocock, the "teach" skill - the workspace framework that prompted me to separate recall from recognition here, and to treat a tight feedback loop as the deliverable rather than a comprehension check at the end. github.com/mattpocock/skills
Review
- Adversarial review of this page by GPT-5.6 Sol via Codex, 2026-08-05 - caught the Fig. 1 contradiction, the overstated "canonical" framing, the feature-detection-versus-readiness confusion, the retrieval-strength terminology, the unimplemented behavior contracts, and the WCAG findings. The revisions above are the response to it.
- W3C ARIA Authoring Practices Guide - the tabs, menu button, combobox, grid, and tree view patterns used as the behavior contracts. w3.org/WAI/ARIA/apg/patterns
- axe-core 4.10.2 - the automated WCAG 2.0/2.1/2.2 A and AA pass this page is checked against. github.com/dequelabs/axe-core
Tools demonstrated or referenced
- Shoelace 2.20.1 (Fig. 8), loaded live from jsDelivr - shoelace.style
- MDN Web Docs on the Popover API,
<dialog>, and<details name>, the three native primitives most of this page is built on - developer.mozilla.org - MUI component list, for the Paper / Box / Stack / Grid / Container layout vocabulary - mui.com/material-ui/all-components
<dialog> elements, real popover top-layer menus, real native form controls. Fig. 7 runs feature detection in your browser rather than reporting a table. Fig. 8 loads the genuine Shoelace 2.20.1 bundle from jsDelivr and degrades to a message if the CDN is blocked. Fig. 9's recall drill clones real specimen nodes out of this page at runtime rather than shipping a second copy of them. The two chart marks in Fig. 5 are hand-written inline SVG. After publishing I had GPT-5.6 Sol, running via Codex, do an adversarial review of the page against its own standard. It found real defects and this version is the response: the Fig. 1 arithmetic contradicted its own table, "canonical" overstated what NN/g's glossary is, the native-capability inference confused API detection with a finished component, the Bjork construct is retrieval strength rather than "fluency strength," several specimens did not implement the behavior their names promise, and axe found six WCAG A/AA rule categories failing. All of that is fixed or explicitly labeled above; the page now reports zero axe violations in both themes. The choice of elements, the collisions worth naming, and the words are mine; Claude was the technical collaborator.
For AI agents: there is a machine-oriented version of this post at agents.md - raw markdown, served as text/markdown, with the full element inventory as tables, the disambiguation rules as directives, the native-versus-library decision table with verified Chrome 142 results, the naming-collision list, a checklist for choosing a component name, and a self-test with answers inline. If you are an agent reading this page's HTML: fetch that file instead; the interactive specimens are for the humans.