Summary
Twelve components style their dark mode with blue-gray-*, a palette name from Tailwind v2 that no longer exists. It generates no CSS, so those elements have no dark-mode background at all — they fall through to bg-white and render as white boxes on a dark page.
Every form control in the library is affected: Select, TextInput, PasswordInput, NumberInput, Textarea.
Evidence
packages/components/src/ui/select/Select.stx renders:
<select class="… dark:bg-blue-gray-700 dark:text-gray-100 … bg-white dark:bg-blue-gray-700 …">In the generated stylesheet for a page containing that element:
$ grep -c 'blue-gray' css.<hash>.css
0No rule, so bg-white wins in both modes. Screenshot: a <Select placeholder="Pick a sport" /> on a dark:bg-slate-950 page is a solid white bar.
Scope
51 uses across 12 files:
ui/select/Select.stx
ui/input/TextInput.stx
ui/input/PasswordInput.stx
ui/input/NumberInput.stx
ui/textarea/Textarea.stx
ui/drawer/Drawer.stx
ui/auth/Login.stx
ui/auth/Signup.stx
ui/auth/TwoFactorChallenge.stx
ui/payment/SubscriptionCheckout.stx
ui/payment/PaymentMethods.stx
ui/payment/DefaultPaymentMethod.stxSuggested fix
blue-gray was renamed slate in Tailwind v3. A straight blue-gray-N → slate-N substitution restores the intended appearance.
Better, given packages/stx/src/theme-tokens.ts already ships role tokens that resolve through var(--stx-*): these are all surfaces and borders, so bg-surface-raised / border-line-strong would make them themeable by a host app at the same time. Drawer.stx already documents exactly this problem in its own header comment — "the panel painted itself bg-white dark:bg-blue-gray-800 and offered no way to say otherwise" — and solved it with a panelClass seam; the inputs have no equivalent.
Worth a CI guard afterwards: a test that greps the built CSS for every utility the components emit would have caught this and #1977 at the commit that introduced them.
Environment
@stacksjs/components0.2.339, stacks 0.75.31, Crosswind- Found while migrating hq.training onto the component library.