old backend core lib

This commit is contained in:
2026-07-18 11:44:58 -07:00
parent 994854d104
commit f599672a30
36 changed files with 3776 additions and 276 deletions
+46
View File
@@ -0,0 +1,46 @@
import { jadeScrollTheme } from './jadeScroll'
import type { OverlayThemeDefinition, OverlayThemeId } from './types'
export type { OverlayThemeDefinition, OverlayThemeId, ThemeParticle } from './types'
/** Ordered registry used by both the control select and OBS renderer. */
export const overlayThemes: readonly OverlayThemeDefinition[] = [jadeScrollTheme]
const themesById = new Map(overlayThemes.map(theme => [theme.id, theme]))
/**
* Resolve untrusted snapshots defensively. The Rust API rejects unknown IDs,
* while this fallback keeps older or cached OBS pages renderable during deploys.
*/
export function getOverlayTheme(id: unknown): OverlayThemeDefinition {
return themesById.get(id as OverlayThemeId) ?? jadeScrollTheme
}
export function normalizeThemeId(id: unknown): OverlayThemeId {
return getOverlayTheme(id).id
}
/** Translate semantic theme fields into the renderer's CSS contract. */
export function themeCssVariables(
theme: OverlayThemeDefinition,
): Readonly<Record<`--theme-${string}`, string>> {
return {
'--theme-text': theme.palette.text,
'--theme-user': theme.palette.user,
'--theme-compact-user': theme.palette.compactUser,
'--theme-accent': theme.palette.accent,
'--theme-price': theme.palette.price,
'--theme-card-border': theme.surfaces.cardBorder,
'--theme-card-background': theme.surfaces.cardBackground,
'--theme-pattern-divider': `url("${theme.ornaments.patterns.divider}")`,
'--theme-pattern-cluster': `url("${theme.ornaments.patterns.cluster}")`,
'--theme-pattern-vine': `url("${theme.ornaments.patterns.vine}")`,
'--theme-motion-arrive': theme.motion.arrive,
'--theme-motion-sheen': theme.motion.sheen,
'--theme-motion-featured': theme.motion.featured,
'--theme-motion-float': theme.motion.float,
'--theme-motion-sparkle': theme.motion.sparkle,
'--theme-motion-unfurl': theme.motion.unfurl,
'--theme-motion-rails-open': theme.motion.railsOpen,
}
}