Follow-up to the theme-leakage stack (LibreChat-AI#16482, LibreChat-AI#16483, LibreChat-AI#16484), which skipped every file an open canary PR touched. Sweep these once the owning PRs merge, using packages/client/src/theme/allowlist.md (added by LibreChat-AI#16482) for anything that must stay outside the theme.
Blocked by config (eslint.config.mjs, edited by LibreChat-AI#16248): stylesheet and marker classes the design rules misread need entries in the rule config, not suppressions: dark:prose-invert (EmptyText, SteerPart, Text, SearchContent, PendingTurn, PromptTextCard, VariableForm, SkillMarkdownRenderer, TermsAndConditionsModal), steer-render, split-parent (no-unknown-classes), and text-message, shadow-stroke (no-raw-colors false positives in Container, EmptyText, Landing, ConvoIconURL, MessageEndpointIcon). The brand marks recorded in the allowlist (Google, Facebook, Discord, Gemini, PaLM, Birthday) need the same file-scoped allow entry; inline disables are rejected by the static checks.
Blocked by a primitive: ToolApproval's invalid-JSON border-red-500 needs an invalid state on TextareaAutosize (edited by LibreChat-AI#16248).
Blocked by an app stylesheet copy: client/src/style.css repeats the .popover-ui rules from packages/client/src/components/Dropdown.css; both shadows move to --theme-shadow-lg together.
Blocked by client/src/utils/files.ts (LibreChat-AI#15684): the file-type tile fills, and the white ink in packages/client/src/svgs/*Paths.tsx that pairs with them.
Files an open PR touches, with counts at origin/canary 1d5062c (palette = raw palette utilities, dark = dark: colour utilities, literal = hex/rgb/hsl in TS/TSX, css = raw CSS literals / palette variables):
| File |
Open PR |
Counts |
client/src/components/Artifacts/ArtifactCodeEditor.tsx |
LibreChat-AI#15911 |
literal 1 |
client/src/components/Artifacts/Artifacts.tsx |
LibreChat-AI#15911, LibreChat-AI#16248 |
palette 2 |
client/src/components/Auth/Footer.tsx |
LibreChat-AI#16248 |
no-unknown-classes 1 |
client/src/components/Chat/Input/AddedConvo.tsx |
LibreChat-AI#16248 |
no-raw-colors 1 |
client/src/components/Chat/Input/ChatForm.tsx |
LibreChat-AI#16248, LibreChat-AI#16457 |
literal 2 |
client/src/components/Chat/Input/Files/ImagePreview.tsx |
LibreChat-AI#16248 |
palette 5 |
client/src/components/Chat/Input/Files/Table/DataTable.tsx |
LibreChat-AI#16248 |
no-unknown-classes 1 |
client/src/components/Chat/Messages/Content/ActivityPhaseGroup.tsx |
LibreChat-AI#16248 |
no-raw-colors 1 |
client/src/components/Chat/Messages/Content/DialogImage.tsx |
LibreChat-AI#16248 |
palette 10 |
client/src/components/Chat/Messages/Content/MessageContent.tsx |
LibreChat-AI#16248 |
no-unknown-classes 1 |
client/src/components/Chat/Messages/Content/Parts/Attachment.tsx |
LibreChat-AI#16248 |
no-raw-colors 1, no-unknown-classes 3 |
client/src/components/Chat/Messages/Content/Parts/BashCall.tsx |
LibreChat-AI#16248 |
palette 1, dark 1 |
client/src/components/Chat/Messages/Content/Parts/ExecuteCode.tsx |
LibreChat-AI#16248 |
dark 2 |
client/src/components/Chat/Messages/Content/Parts/FileAuthoringCall.tsx |
LibreChat-AI#16248 |
dark 1 |
client/src/components/Chat/Messages/Content/Parts/ReadFileCall.tsx |
LibreChat-AI#16248 |
dark 1 |
client/src/components/Chat/Messages/Content/Parts/Reasoning.tsx |
LibreChat-AI#16248 |
literal 2 |
client/src/components/Chat/Messages/Content/Wakeup.tsx |
LibreChat-AI#16248 |
no-unknown-classes 1 |
client/src/components/Chat/Messages/MinimalMessages.tsx |
LibreChat-AI#16248 |
palette 1, dark 1, no-raw-colors 1 |
client/src/components/Chat/Subagents/SubagentActivity.tsx |
LibreChat-AI#16248 |
no-unknown-classes 1 |
client/src/components/Endpoints/Settings/Examples.tsx |
LibreChat-AI#16248 |
dark 2 |
client/src/components/Insights/InsightsView.tsx |
LibreChat-AI#16248 |
dark 4 |
client/src/components/MCP/McpOAuthDialog.tsx |
LibreChat-AI#16248 |
palette 2 |
client/src/components/Nav/AccountSettings.tsx |
LibreChat-AI#16248 |
no-unknown-classes 2 |
client/src/components/Nav/KeyboardShortcutsDialog.tsx |
LibreChat-AI#16248 |
dark 3 |
client/src/components/Nav/SettingsTabs/Account/TwoFactorAuthentication.tsx |
LibreChat-AI#14731 |
literal 2 |
client/src/components/Projects/ProjectsView.tsx |
LibreChat-AI#15684, LibreChat-AI#16248 |
no-raw-colors 1 |
client/src/components/Prompts/editor/PromptEditor.tsx |
LibreChat-AI#16248 |
no-unknown-classes 1 |
client/src/components/Share/MessagesView.tsx |
LibreChat-AI#16248 |
palette 1, dark 1, no-raw-colors 1 |
client/src/components/SidePanel/Agents/AgentConfig.tsx |
LibreChat-AI#16248 |
palette 3, dark 1, no-raw-colors 1 |
client/src/components/SidePanel/Agents/Tools/ToolCard.tsx |
LibreChat-AI#16248 |
palette 1 |
client/src/components/SidePanel/Builder/Images.tsx |
LibreChat-AI#16248 |
palette 13, dark 7, no-raw-colors 6 |
client/src/components/Skills/forms/SkillContentEditor.tsx |
LibreChat-AI#16248 |
no-unknown-classes 1 |
client/src/components/Web/Sources.tsx |
LibreChat-AI#16248 |
palette 2, no-raw-colors 1, no-unknown-classes 1 |
client/src/hooks/Conversations/useUnseenBadge.ts |
LibreChat-AI#16248 |
literal 1 |
client/src/mobile.css |
LibreChat-AI#16248 |
cssLiteral 5 |
client/src/style.css |
LibreChat-AI#16248, LibreChat-AI#16478, LibreChat-AI#16479, LibreChat-AI#16480 |
cssLiteral 78, cssPaletteVar 150 |
client/src/utils/artifacts.ts |
LibreChat-AI#16248 |
literal 3 |
client/src/utils/files.ts |
LibreChat-AI#15684 |
literal 7 |
packages/client/src/components/AnimatedSearchInput.tsx |
LibreChat-AI#16248, LibreChat-AI#16478 |
no-raw-colors 1 |
packages/client/src/components/Badge.tsx |
LibreChat-AI#16248 |
literal 2, no-unknown-classes 6 |
packages/client/src/components/DataTable/DataTableErrorBoundary.tsx |
LibreChat-AI#16248, LibreChat-AI#16478 |
dark 1 |
Follow-up to the theme-leakage stack (LibreChat-AI#16482, LibreChat-AI#16483, LibreChat-AI#16484), which skipped every file an open canary PR touched. Sweep these once the owning PRs merge, using
packages/client/src/theme/allowlist.md(added by LibreChat-AI#16482) for anything that must stay outside the theme.Blocked by config (
eslint.config.mjs, edited by LibreChat-AI#16248): stylesheet and marker classes the design rules misread need entries in the rule config, not suppressions:dark:prose-invert(EmptyText, SteerPart, Text, SearchContent, PendingTurn, PromptTextCard, VariableForm, SkillMarkdownRenderer, TermsAndConditionsModal),steer-render,split-parent(no-unknown-classes), andtext-message,shadow-stroke(no-raw-colors false positives in Container, EmptyText, Landing, ConvoIconURL, MessageEndpointIcon). The brand marks recorded in the allowlist (Google, Facebook, Discord, Gemini, PaLM, Birthday) need the same file-scoped allow entry; inline disables are rejected by the static checks.Blocked by a primitive: ToolApproval's invalid-JSON
border-red-500needs an invalid state onTextareaAutosize(edited by LibreChat-AI#16248).Blocked by an app stylesheet copy:
client/src/style.cssrepeats the.popover-uirules frompackages/client/src/components/Dropdown.css; both shadows move to--theme-shadow-lgtogether.Blocked by
client/src/utils/files.ts(LibreChat-AI#15684): the file-type tile fills, and the white ink inpackages/client/src/svgs/*Paths.tsxthat pairs with them.Files an open PR touches, with counts at origin/canary 1d5062c (palette = raw palette utilities, dark =
dark:colour utilities, literal = hex/rgb/hsl in TS/TSX, css = raw CSS literals / palette variables):client/src/components/Artifacts/ArtifactCodeEditor.tsxclient/src/components/Artifacts/Artifacts.tsxclient/src/components/Auth/Footer.tsxclient/src/components/Chat/Input/AddedConvo.tsxclient/src/components/Chat/Input/ChatForm.tsxclient/src/components/Chat/Input/Files/ImagePreview.tsxclient/src/components/Chat/Input/Files/Table/DataTable.tsxclient/src/components/Chat/Messages/Content/ActivityPhaseGroup.tsxclient/src/components/Chat/Messages/Content/DialogImage.tsxclient/src/components/Chat/Messages/Content/MessageContent.tsxclient/src/components/Chat/Messages/Content/Parts/Attachment.tsxclient/src/components/Chat/Messages/Content/Parts/BashCall.tsxclient/src/components/Chat/Messages/Content/Parts/ExecuteCode.tsxclient/src/components/Chat/Messages/Content/Parts/FileAuthoringCall.tsxclient/src/components/Chat/Messages/Content/Parts/ReadFileCall.tsxclient/src/components/Chat/Messages/Content/Parts/Reasoning.tsxclient/src/components/Chat/Messages/Content/Wakeup.tsxclient/src/components/Chat/Messages/MinimalMessages.tsxclient/src/components/Chat/Subagents/SubagentActivity.tsxclient/src/components/Endpoints/Settings/Examples.tsxclient/src/components/Insights/InsightsView.tsxclient/src/components/MCP/McpOAuthDialog.tsxclient/src/components/Nav/AccountSettings.tsxclient/src/components/Nav/KeyboardShortcutsDialog.tsxclient/src/components/Nav/SettingsTabs/Account/TwoFactorAuthentication.tsxclient/src/components/Projects/ProjectsView.tsxclient/src/components/Prompts/editor/PromptEditor.tsxclient/src/components/Share/MessagesView.tsxclient/src/components/SidePanel/Agents/AgentConfig.tsxclient/src/components/SidePanel/Agents/Tools/ToolCard.tsxclient/src/components/SidePanel/Builder/Images.tsxclient/src/components/Skills/forms/SkillContentEditor.tsxclient/src/components/Web/Sources.tsxclient/src/hooks/Conversations/useUnseenBadge.tsclient/src/mobile.cssclient/src/style.cssclient/src/utils/artifacts.tsclient/src/utils/files.tspackages/client/src/components/AnimatedSearchInput.tsxpackages/client/src/components/Badge.tsxpackages/client/src/components/DataTable/DataTableErrorBoundary.tsx