@aglyn/shared-ui-theme

中文文档
1.19.0发布于 2026/11/07Apache-2.0TypeScriptES Module构建来源已验证近 30 天下载 1.9万

The Material UI theming layer the Aglyn packages share: a responsive theme factory, the console and site default themes, a provider that renders a site's stored theme document as a MUI theme with light and dark schemes, Emotion cache helpers, and WCAG con

原始使用文档
文档目录5 节
  1. Install
  2. What's in it
  3. Usage
  4. How it fits
  5. License

@aglyn/shared-ui-theme

The Material UI theming layer the Aglyn packages share: a responsive theme factory, the console and site default themes, a provider that renders a site's stored theme document as a MUI theme with light and dark schemes, Emotion cache helpers, and WCAG contrast utilities. It is mainly a dependency of the renderer, Besigner and the other @aglyn/shared-ui-* packages; the utilities are usable in any MUI app.

Published to npm from the Aglyn monorepo. Versions follow semantic versioning.

Install

npm install @aglyn/shared-ui-theme

Peer dependencies: react, @mui/material, @mui/system, @mui/utils, @mui/types and @mui/styles. @emotion/react and @emotion/cache are regular dependencies.

What's in it

From the root entry:

  • Theme factory. createResponsiveTheme({ themeOptions, responsiveFontSizesOptions? }) runs createTheme, derives shades for the extra palette colors, repairs derived shades that miss AA contrast, derives each palette color's hover shades (hover, the fill a hovered contained Button or Fab takes under its own contrastText, and hoverText, the hovered text/outlined label), and applies responsiveFontSizes across every breakpoint. createResponsiveCssVarTheme(light, dark, options?) combines two themes into one CSS-variables theme switched by class.
  • MUI module augmentation. Importing the package extends MUI's types with the palette additions these themes use (tertiary, surface, tint, and hover / hoverText on every palette color), extra typography variants such as displayXl, and the matching component color overrides. It also re-exports a selection of MUI types and helpers (Theme, ThemeOptions, SxProps, darkScrollbar, visuallyHidden).
  • Default themes. consoleThemeLight / consoleThemeDark / consoleThemeCssVar / getConsoleTheme(mode) and tenantThemeLight / tenantThemeDark, with their ThemeOptions (consoleOptions, tenantOptions and the dark variants). siteFallbackTheme(host, scheme) and siteBaseOptions(host, scheme) pick between them for a host.
  • Host theme. A HostTheme (the type lives in @aglyn/shared-data-types) is a site's theme customization as plain data. hostThemeToThemeOptions(theme, scheme) converts it to ThemeOptions; sanitizeHostTheme, mergeThemeOptions, hasHostTheme and getGoogleFontsUrl support it. HostThemeProvider renders children under it, taking theme, a required fallback theme or [light, dark] pair, baseOptions, and initialMode / initialDeviceMode so a server render can choose the scheme before hydration.
  • Self-hosted fonts. util/self-hosted-fonts reads a Google Fonts CSS2 stylesheet into @font-face rules (parseGoogleFontFaces), writes them back with every file on the site's own /api/fonts route (selfHostedFontFaceCss), and picks the one or two faces worth preloading (selfHostedFontPreloads). The tenant fetches and serves; this half is pure.
  • Light/dark mode. createWithThemeProvider({ theme }) returns a higher-order component that provides the theme and mode state; useThemeMode() reads and toggles it. The choice is stored in the theme-color-mode cookie (COOKIE_THEME_KEY).
  • Emotion. createEmotionCache, CacheProvider, createLayeredEmotionCache, createWithEmotionClientCache, and the constants EMOTION_CACHE_KEY, APP_EMOTION_CACHE_OPTIONS, MUI_CSS_LAYER_NAME.
  • Contrast. contrastRatio, relativeLuminance, meetsContrast, accessibleShade, accentTextColor, accentFillColor, accentHoverFillColor, accentHoverTextColor, hoverFillShade, inkContrast, auditPaletteContrast, with AA_TEXT_CONTRAST (4.5) and AA_NON_TEXT_CONTRAST (3).
  • Small helpers. mergeSxProps / useMergeSxProps, generateComponentClassKeys, FontFamily, buildFontFamilyList.

By subpath only: util/theme-editor-fields and util/theme-editor-defaults (the field vocabulary and readers/writers a theme editor uses over a HostTheme), util/theme-mode-cookie, util/color-scheme-hint and util/scheme-route-segment (server-side resolution of the visitor's scheme).

Usage

import {
  contrastRatio,
  createResponsiveTheme,
  createWithThemeProvider,
} from '@aglyn/shared-ui-theme'

const light = createResponsiveTheme({
  themeOptions: { palette: { primary: { main: '#1565c0' } } },
})
const dark = createResponsiveTheme({
  themeOptions: { palette: { mode: 'dark', primary: { main: '#90caf9' } } },
})

const withTheme = createWithThemeProvider({ theme: [light, dark] })

export const App = withTheme(function App() {
  return <main>Hello</main>
})

contrastRatio('#ffffff', '#1565c0') // a number; 4.5 or more passes AA for text
import { parseThemeModeCookie } from '@aglyn/shared-ui-theme/util/theme-mode-cookie'

How it fits

A shared UI package. It depends on @aglyn/shared-data-types, @aglyn/shared-util-tools and @aglyn/shared-util-vendor. @aglyn/shared-ui-jsx, @aglyn/shared-ui-jsx-forms, @aglyn/shared-ui-next, the node renderer and Besigner build on it. Shared packages are generic: they import only other shared packages and hold no plugin's domain.

License

Apache-2.0. Source: https://github.com/aglyn/aglyn/tree/main/libs/shared/ui/theme

版本与发布记录

@aglyn/shared-ui-theme 共发布 161 个版本,首次发布于 2026/09/21;过去 12 个月发布了 161 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.19.0latest2026/11/07今天
1.18.02026/11/07今天
1.17.02026/11/07今天
1.16.02026/11/07今天
1.15.22026/11/061 天前
1.15.12026/11/061 天前

其他发布通道:beta → 1.0.0-beta.296。

关于 @aglyn/shared-ui-theme 的常见问题

@aglyn/shared-ui-theme 是什么?

The Material UI theming layer the Aglyn packages share: a responsive theme factory, the console and site default themes, a provider that renders a site's stored theme document as a MUI theme with light and dark schemes, Emotion cache helpers, and WCAG con

如何安装 @aglyn/shared-ui-theme?

在项目目录运行 npm install @aglyn/shared-ui-theme,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^19.2.8)、@mui/types(^9.1.1)、@mui/utils(^9.2.0)、@mui/styles(^6.4.8)、@mui/system(^9.2.0)、@mui/material(^9.3.1)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@aglyn/shared-ui-theme 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@aglyn/shared-ui-theme 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@aglyn/shared-ui-theme 可以商用吗?

@aglyn/shared-ui-theme 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@aglyn/shared-ui-theme 的下载量有多少?

根据 npm 官方下载统计,@aglyn/shared-ui-theme 在 2026/10/05 – 2026/11/03 这 30 天内被下载 19,372 次,日均约 646 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@aglyn/shared-ui-theme 还在维护吗?

最新版本 1.19.0 发布于 2026/11/07(今天);至今共发布 161 个版本,其中过去 12 个月发布了 161 个;首次发布于 2026/09/21。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。