Errata · Component Systems
What this guide got wrong, and what it says now.
Every correction to the text is listed here, by chapter, with what the text said, why it was wrong, and what it says now.
- Entries
- 30
- Still open
- 0
- Last updated
- 22 October 2026
Introduction: Build your own component library
The stated Node version cannot run the toolchain
The introduction asked for Node 18 or later. Vite 7, installed in chapter 2, requires Node 20.19 or later, so a reader on Node 18 failed at the first install.
The prerequisite is now Node 20.19 or later.
Corrected 22 October 2026
Token files were presented as the stable DTCG format, and two libraries were mischaracterized
The token files use the draft syntax Style Dictionary v4 reads, with string colors and dimensions, while the stable 2025.10 spec uses objects. Untitled UI React launched in 2025, not 2026, and both it and HeroUI style with Tailwind, so they share React Aria with this library rather than its architecture.
Chapter 3 names the draft syntax and the change in the stable spec, and the comparisons are corrected.
Corrected 22 October 2026
The architecture before the code
Chapter 1A single package import does not bring the styles, and Tailwind utilities cannot override components
Chapter 2 said import 'rudiment-ui' gave consumers working styles, but Vite library mode emits the CSS as a separate dist/index.css that chapter 12 ships as rudiment-ui/styles. It also said tailwind-merge lets consumers override any component style with utilities. Components use rudi- classes that tailwind-merge never touches, and the library's unlayered CSS beats Tailwind's @layer utilities regardless of specificity.
Both passages now describe the separate stylesheet import and point consumers at the component tokens for restyling. Chapter 1 notes that tailwind-merge ships at runtime.
Corrected 22 October 2026
Token files were presented as the stable DTCG format, and two libraries were mischaracterized
The token files use the draft syntax Style Dictionary v4 reads, with string colors and dimensions, while the stable 2025.10 spec uses objects. Untitled UI React launched in 2025, not 2026, and both it and HeroUI style with Tailwind, so they share React Aria with this library rather than its architecture.
Chapter 3 names the draft syntax and the change in the stable spec, and the comparisons are corrected.
Corrected 22 October 2026
Project setup
Chapter 2__dirname is not defined once package.json declares a module type
Chapter 3 adds "type": "module" to package.json, which makes Vite load the config as an ES module, where __dirname does not exist. Every resolve(__dirname, ...) call after that point threw a ReferenceError before dev, test, or build could start. Chapter 11 even defined the correct shim and then used the bare global on the next line.
All three configs now derive dirname from fileURLToPath(import.meta.url), and chapter 11 uses the shim it defines.
Corrected 6 August 2026
The chapter's own verification step could not pass
src/index.ts imports a stylesheet, but the tsconfig declared no client types and the chapter never created an environment declaration file. npx tsc --noEmit therefore failed with TS2307 on the CSS import, immediately after the text said a clean run meant the foundation was solid. Every component from chapter 4 onward imports a colocated stylesheet, so the gap widened.
The chapter now adds src/vite-env.d.ts referencing vite/client, which declares the CSS module types.
Corrected 6 August 2026
A single package import does not bring the styles, and Tailwind utilities cannot override components
Chapter 2 said import 'rudiment-ui' gave consumers working styles, but Vite library mode emits the CSS as a separate dist/index.css that chapter 12 ships as rudiment-ui/styles. It also said tailwind-merge lets consumers override any component style with utilities. Components use rudi- classes that tailwind-merge never touches, and the library's unlayered CSS beats Tailwind's @layer utilities regardless of specificity.
Both passages now describe the separate stylesheet import and point consumers at the component tokens for restyling. Chapter 1 notes that tailwind-merge ships at runtime.
Corrected 22 October 2026
Design tokens from scratch
Chapter 3The medium button font size aliased the small one
component.button.font-size-md pointed at {font.size.sm}, the same value as font-size-sm, so small and medium buttons rendered identical text and the size scale collapsed at the default size.
font-size-md now aliases {font.size.base}.
Corrected 6 August 2026
The theme override trap was blamed on the wrong cause
:root and [data-theme] have equal specificity, so when data-theme sits on <html> the later stylesheet wins. The chapter said a consumer :root override only works in the light theme, which is true only if the consumer CSS loads before the library or a theme is applied to a subtree. The count of themes where a primitive override survives was also wrong, and chapter 3 claimed a primitive override moves aliases with it without saying that only holds on the root element.
The section now explains load order and subtree themes, tells consumers to load overrides after the library, and gives the correct theme counts. Chapter 3 states the root-element condition.
Corrected 22 October 2026
Token files were presented as the stable DTCG format, and two libraries were mischaracterized
The token files use the draft syntax Style Dictionary v4 reads, with string colors and dimensions, while the stable 2025.10 spec uses objects. Untitled UI React launched in 2025, not 2026, and both it and HeroUI style with Tailwind, so they share React Aria with this library rather than its architecture.
Chapter 3 names the draft syntax and the change in the stable spec, and the comparisons are corrected.
Corrected 22 October 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
Your first layout primitive: Stack
Chapter 4Storybook types imported from a package the project never installs
The guide installs storybook and @storybook/react-vite, then imported Meta, StoryObj, and Preview from @storybook/react. That path resolved only through npm hoisting of a transitive dependency, so a type check could fail outright under pnpm or Yarn PnP. The same file already imported StorybookConfig from the framework package.
All Storybook type imports now come from @storybook/react-vite.
Corrected 6 August 2026
Per-component CSS cannot be tree-shaken from this build
The library builds from a single entry with formats: ['es'] and no preserveModules, so Vite emits one JavaScript file and one concatenated stylesheet. A sideEffects field cannot drop rules from an already-merged file, so a consumer importing one component still receives every component's CSS. Chapter 4 called colocation hard to reverse on exactly this basis.
Both passages now describe what the build actually produces, and state authoring and maintenance as the reason for colocation.
Corrected 6 August 2026
Story placeholders used utilities the Tailwind setup never generates
The placeholder used border-border-default and bg-surface-raised. Chapter 3 deliberately maps no tokens into a Tailwind theme block, so those are not real utilities and Tailwind emitted nothing for them, leaving every Stack story unstyled. Chapter 10 says this outright, six chapters later.
The placeholder reads the token custom properties directly, the same way chapter 10's Storybook decorator does.
Corrected 6 August 2026
Several Storybook defaults were described incorrectly
ALLOWALL is not a valid X-Frame-Options value and never reaches the static build, so it was not what made embedded previews possible. requiredFirst sorts the remaining props alphabetically, so declaration order is not kept. Storybook's default story order is import order, not alphabetical, and storybook init already generates the MDX glob. Only Dialog portals, not Tooltip or Select. A missing tokens/build fails the build rather than rendering unstyled.
Each claim is corrected in place.
Corrected 22 October 2026
Layout chapters described a fallback, a selector, and a repository pattern inaccurately
The inline space prop overrides the class through the cascade, not a var() fallback chain. The Switcher limit selector :nth-child(n + 4) widens only items four and later, not every item. Both chapters pointed to a typed polymorphic ref pattern in the companion repository that does not exist there. The axe test was said to fail while the rest pass, though none of the tests run before chapter 11.
Each passage is corrected; the repository pointer is removed and the Switcher uses a quantity query.
Corrected 22 October 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
The rest of the layout system
Chapter 5Layout chapters described a fallback, a selector, and a repository pattern inaccurately
The inline space prop overrides the class through the cascade, not a var() fallback chain. The Switcher limit selector :nth-child(n + 4) widens only items four and later, not every item. Both chapters pointed to a typed polymorphic ref pattern in the companion repository that does not exist there. The axe test was said to fail while the rest pass, though none of the tests run before chapter 11.
Each passage is corrected; the repository pointer is removed and the Switcher uses a quantity query.
Corrected 22 October 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
Typography: Heading, Text, and Prose
Chapter 6Prose never reset its children's default margins
Stack zeroes its children's block margins; Prose did not. A heading kept the browser's own margin-block-end, which collapsed against the smaller heading-after token and won, so the spacing mechanism the section is built around silently did nothing.
prose.css now zeroes child block margins before applying its own spacing, matching the Stack pattern.
Corrected 6 August 2026
The consecutive-heading rule was credited with a fix it does not make
The heading + * rule has the same specificity as the heading rule and comes later, so an <h3> after an <h2> already gets heading-after. The text said it would otherwise float 2em away.
The paragraph now describes the rule as an explicit statement of existing behavior.
Corrected 22 October 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
Accessible components with React Aria
Chapter 7Disabled button styling matched an attribute React Aria never sets
useButton returns the native disabled attribute when it renders a real <button>, and only falls back to aria-disabled for other element types. The stylesheet keyed its disabled and hover rules off [aria-disabled='true'], so a disabled or loading button kept full opacity and a normal cursor.
The rules now key off :disabled, and the two prose passages that described aria-disabled on a native button have been corrected.
Corrected 6 August 2026
Nothing in the library honored a reduced-motion preference
The loading spinner ran an infinite rotation and every button transitioned color on state change, with no prefers-reduced-motion handling anywhere in the guide. Continuous rotation is a vestibular trigger and a WCAG 2.3.3 concern. The motion token namespace was presented as the answer without anything wiring it to the media query.
button.css now collapses its animation and transitions under prefers-reduced-motion: reduce.
Corrected 6 August 2026
The loading spinner and aria-busy were described as doing more than they do
aria-hidden removes the spinner from the accessibility tree, so its role="img" has no effect for users; it exists as a test handle. aria-busy on a button is not announced reliably by major screen readers. The chapter also said React 19 made RefObject.current nullable, when React 19 did the reverse, and that onClick fires only on click and Enter.
Each passage now states what the attribute or type actually does, and recommends a live region for announcing the loading state.
Corrected 22 October 2026
Form components
Chapter 8Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
Overlays and feedback
Chapter 9Dialog mixed a legacy overlay API with the current one and duplicated the scroll lock
useModalOverlay already prevents scroll and hides outside content, so the explicit usePreventScroll call registered the same lock twice. The example also paired the modern hook with OverlayContainer, which belongs to the API that hook replaced, and rebuilt the overlay state as a fresh object literal on every render with no-op open, toggle, and setOpen methods.
The example drops the duplicate scroll lock, uses Overlay, and takes the state object from useOverlayTriggerState rather than assembling one by hand.
Corrected 6 August 2026
Tooltip explained mergeProps and then never used it
A paragraph introduced mergeProps as the way the trigger props reach the trigger element, and the code never imported it. The trigger's event handlers were spread onto a wrapper span instead, with tabIndex discarded, leaving React Aria's handlers on an element that cannot take focus. useTooltip was also called without its state argument, so the props that keep a tooltip open while the pointer moves onto it were missing.
The trigger props are merged onto the trigger element itself, and useTooltip receives the state.
Corrected 6 August 2026
Packaging chapter overstated what consumers can do and what versions signal
Compound members such as RudiCard.Header cannot be reached with dot notation from a Server Component, despite the claim that the library drops into one. A wrong CSS path in exports fails to resolve rather than rendering unstyled. On 0.x, npm caret ranges already treat a minor bump as breaking, so the version number does carry that signal.
The Server Component limit is stated, and the CSS and versioning passages are corrected.
Corrected 22 October 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
Storybook as your documentation layer
Chapter 10Storybook types imported from a package the project never installs
The guide installs storybook and @storybook/react-vite, then imported Meta, StoryObj, and Preview from @storybook/react. That path resolved only through npm hoisting of a transitive dependency, so a type check could fail outright under pnpm or Yarn PnP. The same file already imported StorybookConfig from the framework package.
All Storybook type imports now come from @storybook/react-vite.
Corrected 6 August 2026
categorySort is not a Storybook parameter
The preview config set parameters.options.categorySort with an explicit order array, and the prose described it pinning the controls panel order. Storybook has no such parameter and ignores unknown ones silently, so control categories still appeared in encounter order. Chapter 4 then told the reader to assign categories consistently because chapter 10 pins their order.
The block is gone. The prose now describes what Storybook actually offers for the controls panel, and chapter 4's rationale is corrected.
Corrected 6 August 2026
The preview config declared controls twice
parameters held two controls keys, one with sort and one with matchers. TypeScript rejects a duplicate key in an object literal, and at runtime the second would have replaced the first, silently dropping the sort setting.
The two are merged into a single controls object.
Corrected 22 October 2026
Several Storybook defaults were described incorrectly
ALLOWALL is not a valid X-Frame-Options value and never reaches the static build, so it was not what made embedded previews possible. requiredFirst sorts the remaining props alphabetically, so declaration order is not kept. Storybook's default story order is import order, not alphabetical, and storybook init already generates the MDX glob. Only Dialog portals, not Tooltip or Select. A missing tokens/build fails the build rather than rendering unstyled.
Each claim is corrected in place.
Corrected 22 October 2026
Testing accessible components
Chapter 11__dirname is not defined once package.json declares a module type
Chapter 3 adds "type": "module" to package.json, which makes Vite load the config as an ES module, where __dirname does not exist. Every resolve(__dirname, ...) call after that point threw a ReferenceError before dev, test, or build could start. Chapter 11 even defined the correct shim and then used the bare global on the next line.
All three configs now derive dirname from fileURLToPath(import.meta.url), and chapter 11 uses the shim it defines.
Corrected 6 August 2026
Disabled button styling matched an attribute React Aria never sets
useButton returns the native disabled attribute when it renders a real <button>, and only falls back to aria-disabled for other element types. The stylesheet keyed its disabled and hover rules off [aria-disabled='true'], so a disabled or loading button kept full opacity and a normal cursor.
The rules now key off :disabled, and the two prose passages that described aria-disabled on a native button have been corrected.
Corrected 6 August 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
Packaging and distribution
Chapter 12__dirname is not defined once package.json declares a module type
Chapter 3 adds "type": "module" to package.json, which makes Vite load the config as an ES module, where __dirname does not exist. Every resolve(__dirname, ...) call after that point threw a ReferenceError before dev, test, or build could start. Chapter 11 even defined the correct shim and then used the bare global on the next line.
All three configs now derive dirname from fileURLToPath(import.meta.url), and chapter 11 uses the shim it defines.
Corrected 6 August 2026
Per-component CSS cannot be tree-shaken from this build
The library builds from a single entry with formats: ['es'] and no preserveModules, so Vite emits one JavaScript file and one concatenated stylesheet. A sideEffects field cannot drop rules from an already-merged file, so a consumer importing one component still receives every component's CSS. Chapter 4 called colocation hard to reverse on exactly this basis.
Both passages now describe what the build actually produces, and state authoring and maintenance as the reason for colocation.
Corrected 6 August 2026
Packaging chapter overstated what consumers can do and what versions signal
Compound members such as RudiCard.Header cannot be reached with dot notation from a Server Component, despite the claim that the library drops into one. A wrong CSS path in exports fails to resolve rather than rendering unstyled. On 0.x, npm caret ranges already treat a minor bump as breaking, so the version number does carry that signal.
The Server Component limit is stated, and the CSS and versioning passages are corrected.
Corrected 22 October 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
Theming: eight themes from one pipeline
Chapter 13The theme override trap was blamed on the wrong cause
:root and [data-theme] have equal specificity, so when data-theme sits on <html> the later stylesheet wins. The chapter said a consumer :root override only works in the light theme, which is true only if the consumer CSS loads before the library or a theme is applied to a subtree. The count of themes where a primitive override survives was also wrong, and chapter 3 claimed a primitive override moves aliases with it without saying that only holds on the root element.
The section now explains load order and subtree themes, tells consumers to load overrides after the library, and gives the correct theme counts. Chapter 3 states the root-element condition.
Corrected 22 October 2026
Counts and cross-references did not match the text
Chapter 3 said chapter 1 called the component tier optional, when chapter 1 argued the opposite, and said every feedback color has four tokens though info has three. Chapter 4 promised three details and gave four, and said the prefix costs six characters. Chapter 6 counted five code tokens instead of six. Chapter 8's helper comment named a component the code never uses. Chapter 9 said Alert used React Aria and omitted components from its lists. Chapter 11 cited tests in chapters that have none. Chapter 12 named ten of its eleven dependencies. Chapter 13 said a token was filtered from eight theme files instead of seven.
Every count, list, and reference now matches the text and the repository.
Corrected 22 October 2026
The component set beyond the core
Chapter 14The Menu example called IconButton with a prop it does not have
The example passed an icon string and no children. IconButton declares no icon prop and requires children, so the call failed to type check twice over and would have rendered an empty button.
The example passes the icon as children, matching the interface in chapter 7.
Corrected 6 August 2026
The Menu trigger passed RudiIcon a prop it does not have
The example rendered <RudiIcon name="…">, but the prop is icon, as the same chapter and chapter 7 both show. The line failed to type check.
The example uses icon.
Corrected 22 October 2026
Several later-chapter claims were inaccurate
Menu is not the only component without React Aria hooks (Badge, Card, and others use none); menus use roving focus, not virtual focus. ProgressBar's showValueLabel is off by default, so color was the only signal. Recharts 3 enables a focusable accessibility layer inside the role="img" wrapper. Consumers who skip charts still install Recharts. HTML5 drag and drop does work on some touch browsers. Tokens Studio's multi-file sync and themes are paid features.
Each claim is corrected, and the chart section recommends accessibilityLayer={false}.
Corrected 22 October 2026
Data visualization
Chapter 15The chart hook does not correct itself on hydration
The text said the hook's initial state came from the server during hydration and the effect replaced it with real tokens. React does not transfer state from server to client: the initializer runs again in the browser, so the first client render already differs from the server markup.
The text now explains the mismatch and shows the fix: initialize with the fallback palette on both sides and resolve tokens only in the effect.
Corrected 22 October 2026
Several later-chapter claims were inaccurate
Menu is not the only component without React Aria hooks (Badge, Card, and others use none); menus use roving focus, not virtual focus. ProgressBar's showValueLabel is off by default, so color was the only signal. Recharts 3 enables a focusable accessibility layer inside the role="img" wrapper. Consumers who skip charts still install Recharts. HTML5 drag and drop does work on some touch browsers. Tokens Studio's multi-file sync and themes are paid features.
Each claim is corrected, and the chart section recommends accessibilityLayer={false}.
Corrected 22 October 2026
Drag and drop that works from the keyboard
Chapter 16The live region asked for assertive announcements on a role that is implicitly polite
role="status" carries an implicit aria-live of polite. Pairing it with an explicit assertive value leaves the outcome to the screen reader, so drag announcements were polite in some combinations and assertive in others. The chapter argued carefully for assertive without noting that the role already declared otherwise.
The region uses role="alert", whose implicit politeness is assertive, and the explicit attribute is gone.
Corrected 6 August 2026
The keyboard drag test cannot pass in jsdom
sortableKeyboardCoordinates measures column positions, and jsdom reports every element at zero size, so the printed test never moves the card in the unit project. Two sentences also contradicted the handle-only design: links inside a card never reach the pointer sensor, and a card div with the drag attributes would be focusable, not unfocusable. Enter also drops a card, not only Space.
The chapter says to run the test in browser mode or a Storybook play function, and the sensor explanations match the handle design.
Corrected 22 October 2026
Several later-chapter claims were inaccurate
Menu is not the only component without React Aria hooks (Badge, Card, and others use none); menus use roving focus, not virtual focus. ProgressBar's showValueLabel is off by default, so color was the only signal. Recharts 3 enables a focusable accessibility layer inside the role="img" wrapper. Consumers who skip charts still install Recharts. HTML5 drag and drop does work on some touch browsers. Tokens Studio's multi-file sync and themes are paid features.
Each claim is corrected, and the chart section recommends accessibilityLayer={false}.
Corrected 22 October 2026
What comes next
Chapter 17Several later-chapter claims were inaccurate
Menu is not the only component without React Aria hooks (Badge, Card, and others use none); menus use roving focus, not virtual focus. ProgressBar's showValueLabel is off by default, so color was the only signal. Recharts 3 enables a focusable accessibility layer inside the role="img" wrapper. Consumers who skip charts still install Recharts. HTML5 drag and drop does work on some touch browsers. Tokens Studio's multi-file sync and themes are paid features.
Each claim is corrected, and the chart section recommends accessibilityLayer={false}.
Corrected 22 October 2026