From 37aa54fe0665ad0633371437c2e75c6378840f53 Mon Sep 17 00:00:00 2001 From: Boris Rorsvort Date: Tue, 20 Jan 2026 18:11:47 +0100 Subject: [PATCH] feat(ui): Add Nautiline like theme (#4909) * wip * add main file * fixes * linting * refactor * fix player * fix lint * fix pr comments * Add font locally * fix: quickfix --- ui/public/fonts/Unbounded-Variable.woff2 | Bin 0 -> 50892 bytes ui/src/themes/index.js | 2 + ui/src/themes/nautiline.js | 905 +++++++++++++++++++++++ 3 files changed, 907 insertions(+) create mode 100644 ui/public/fonts/Unbounded-Variable.woff2 create mode 100644 ui/src/themes/nautiline.js diff --git a/ui/public/fonts/Unbounded-Variable.woff2 b/ui/public/fonts/Unbounded-Variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..96d8ff5fa1426b92047112b5c3c7b02279dd523e GIT binary patch literal 50892 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 { + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) + return result + ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16), + } + : null +} + +const rgb = hexToRgb(ACCENT_COLOR) +const rgba = (alpha) => + rgb ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})` : 'transparent' + +const tokens = { + colors: { + accent: { + main: ACCENT_COLOR, + faded: rgba(0.1), + hover: rgba(0.15), + }, + background: { + primary: '#FFFFFF', + secondary: '#F5F5F7', + tertiary: '#E5E5EA', + }, + text: { + primary: '#1A1A1A', + secondary: '#8E8E93', + tertiary: '#AEAEB2', + }, + ui: { + separator: 'rgba(0, 0, 0, 0.08)', + shadow: 'rgba(0, 0, 0, 0.04)', + glassBg: 'rgba(255, 255, 255, 0.72)', + }, + }, + typography: { + fontFamily: { + base: [ + '-apple-system', + 'BlinkMacSystemFont', + '"SF Pro Text"', + '"Helvetica Neue"', + 'Arial', + 'sans-serif', + ].join(','), + heading: '"Unbounded", sans-serif', + }, + fontFace: ` + @font-face { + font-family: 'Unbounded'; + font-style: normal; + font-weight: 300 800; + font-display: swap; + src: url('/fonts/Unbounded-Variable.woff2') format('woff2'); + } + `, + }, + spacing: { + xs: '0.25rem', + sm: '0.5rem', + md: '0.75rem', + lg: '1rem', + xl: '1.5rem', + }, + radii: { + sm: '0.25rem', + md: '0.5rem', + lg: '0.625rem', + xl: '0.75rem', + full: '50%', + pill: '1rem', + }, + breakpoints: { + xs: 599, + sm: 600, + md: 720, + lg: 1280, + }, + sizing: { + cover: { + sm: '14em', + lg: '18em', + }, + icon: '1.25rem', + iconMinWidth: '2.5rem', + }, + blur: '1.25rem', +} + +const { colors, typography, spacing, radii, sizing, breakpoints } = tokens + +// ============================================ +// REUSABLE STYLE FACTORIES +// ============================================ + +const headingStyle = (weight, letterSpacing) => ({ + fontFamily: typography.fontFamily.heading, + fontWeight: weight, + ...(letterSpacing && { letterSpacing }), +}) + +const coverSizing = () => ({ + [`@media (min-width: ${breakpoints.sm}px)`]: { + height: sizing.cover.sm, + width: sizing.cover.sm, + minWidth: sizing.cover.sm, + }, + [`@media (min-width: ${breakpoints.lg}px)`]: { + height: sizing.cover.lg, + width: sizing.cover.lg, + minWidth: sizing.cover.lg, + }, +}) + +const customTooltipStyle = () => ({ + display: 'inline', + position: 'absolute', + bottom: '100%', + left: '50%', + transform: 'translateX(-50%)', + marginBottom: spacing.xs, + fontSize: '0.75rem', + whiteSpace: 'nowrap', + backgroundColor: colors.text.primary, + color: colors.background.primary, + padding: `${spacing.xs} ${spacing.sm}`, + borderRadius: radii.sm, + zIndex: 9999, +}) + +const actionButtonsStyle = () => ({ + padding: `${spacing.lg} 0`, + alignItems: 'center', + '@global': { + button: { + border: '1px solid transparent', + backgroundColor: colors.background.secondary, + color: colors.text.secondary, + margin: `0 ${spacing.sm}`, + borderRadius: radii.full, + minWidth: 0, + padding: spacing.lg, + position: 'relative', + '&:hover': { + backgroundColor: `${colors.background.tertiary} !important`, + border: '1px solid transparent', + }, + }, + 'button:first-child:not(:only-child)': { + [`@media screen and (max-width: ${breakpoints.md}px)`]: { + transform: 'scale(1.5)', + margin: spacing.lg, + '&:hover': { + transform: 'scale(1.6) !important', + }, + }, + transform: 'scale(2)', + margin: spacing.xl, + minWidth: 0, + padding: '0.3125rem', + transition: 'transform .3s ease', + background: colors.accent.main, + color: '#fff', + borderRadius: radii.full, + border: 0, + '&:hover': { + transform: 'scale(2.1)', + backgroundColor: `${colors.accent.main} !important`, + border: 0, + }, + }, + 'button:only-child': { + margin: spacing.xl, + }, + 'button:first-child>span:first-child': { + padding: 0, + }, + 'button>span:first-child>span': { + display: 'none', + }, + 'button:not(:first-child):hover>span:first-child>span': + customTooltipStyle(), + 'button:not(:first-child)>span:first-child>svg': { + color: colors.text.secondary, + }, + }, +}) + +const menuIconStyle = () => ({ + color: colors.text.primary, + minWidth: sizing.iconMinWidth, + '& svg': { + fontSize: sizing.icon, + }, +}) + +const activeLinkStyle = { + color: `${colors.accent.main} !important`, + '& .MuiListItemIcon-root': { + color: `${colors.accent.main} !important`, + }, +} + +// ============================================ +// THEME DEFINITION +// ============================================ + +// Note: !important declarations are required to override react-admin and third-party component styles +const NautilineTheme = { + themeName: 'Nautiline', + palette: { + type: 'light', + primary: { + main: colors.accent.main, + contrastText: '#FFFFFF', + }, + secondary: { + main: colors.accent.main, + contrastText: '#FFFFFF', + }, + background: { + default: colors.background.primary, + paper: colors.background.primary, + }, + text: { + primary: colors.text.primary, + secondary: colors.text.secondary, + }, + action: { + active: colors.accent.main, + hover: colors.accent.faded, + selected: colors.accent.faded, + }, + }, + typography: { + fontFamily: typography.fontFamily.base, + h1: headingStyle(700, '-0.02em'), + h2: headingStyle(700, '-0.02em'), + h3: headingStyle(600, '-0.01em'), + h4: headingStyle(600), + h5: headingStyle(600), + h6: headingStyle(600), + subtitle1: { fontWeight: 500 }, + subtitle2: { fontWeight: 500 }, + body1: { fontWeight: 400 }, + body2: { fontWeight: 400 }, + button: { fontWeight: 500, textTransform: 'none' }, + }, + shape: { + borderRadius: radii.xl, + }, + overrides: { + MuiCssBaseline: { + '@global': { + '@font-face': { + fontFamily: 'Unbounded', + fontStyle: 'normal', + fontWeight: '300 800', + fontDisplay: 'swap', + src: "url('/fonts/Unbounded-Variable.woff2') format('woff2')", + }, + body: { + backgroundColor: colors.background.primary, + }, + }, + }, + MuiAppBar: { + root: { + boxShadow: 'none', + borderBottom: `1px solid ${colors.ui.separator}`, + }, + colorSecondary: { + backgroundColor: colors.background.primary, + color: colors.text.primary, + }, + }, + MuiToolbar: { + root: { + backgroundColor: colors.background.primary, + }, + }, + MuiPaper: { + root: { + backgroundColor: colors.background.primary, + }, + elevation1: { + boxShadow: `0 0.0625rem 0.1875rem ${colors.ui.shadow}`, + }, + elevation2: { + boxShadow: `0 0.125rem ${spacing.sm} ${colors.ui.shadow}`, + }, + }, + MuiCard: { + root: { + backgroundColor: colors.background.primary, + borderRadius: radii.xl, + boxShadow: `0 0.125rem ${spacing.sm} ${colors.ui.shadow}`, + }, + }, + MuiButton: { + root: { + borderRadius: radii.md, + textTransform: 'none', + fontWeight: 600, + }, + contained: { + boxShadow: 'none', + '&:hover': { boxShadow: 'none' }, + }, + containedPrimary: { + backgroundColor: colors.accent.main, + '&:hover': { + backgroundColor: colors.accent.main, + filter: 'brightness(0.9)', + }, + }, + text: { + color: colors.accent.main, + }, + }, + MuiIconButton: { + root: { + color: colors.text.primary, + '&:hover': { + backgroundColor: colors.accent.faded, + }, + }, + colorPrimary: { + color: colors.accent.main, + }, + sizeSmall: { + padding: spacing.md, + }, + }, + MuiSvgIcon: { + colorPrimary: { + color: colors.accent.main, + }, + }, + MuiCheckbox: { + root: { + color: 'rgba(0, 0, 0, 0.15)', + '&$checked': { + color: colors.accent.main, + }, + }, + }, + MuiChip: { + root: { + backgroundColor: colors.background.secondary, + color: colors.text.primary, + borderRadius: radii.pill, + }, + colorPrimary: { + backgroundColor: colors.accent.faded, + color: colors.accent.main, + }, + }, + MuiTableRow: { + root: { + '&:hover': { + backgroundColor: `${colors.accent.faded} !important`, + }, + }, + }, + MuiTableCell: { + root: { + borderBottomColor: 'rgba(0, 0, 0, 0.04)', + }, + head: { + backgroundColor: colors.background.secondary, + color: colors.text.secondary, + fontWeight: 600, + fontSize: '0.75rem', + textTransform: 'uppercase', + letterSpacing: '0.05em', + }, + body: { + color: colors.text.primary, + }, + }, + MuiListItem: { + root: { + color: colors.text.primary, + '&:hover': { + backgroundColor: colors.accent.faded, + }, + '&$selected': { + backgroundColor: colors.accent.faded, + color: colors.accent.main, + '& .MuiListItemIcon-root': { + color: colors.accent.main, + }, + '&:hover': { + backgroundColor: colors.accent.faded, + }, + }, + }, + button: { + color: colors.text.primary, + '&:hover': { + backgroundColor: colors.accent.faded, + color: colors.text.primary, + }, + }, + }, + MuiListItemIcon: { + root: menuIconStyle(), + }, + MuiListItemText: { + primary: { + color: 'inherit', + }, + }, + MuiMenuItem: { + root: { + fontSize: '0.875rem', + paddingTop: '4px', + paddingBottom: '4px', + paddingLeft: '10px', + margin: '5px', + borderRadius: radii.md, + color: colors.text.primary, + }, + }, + MuiDrawer: { + paper: { + backgroundColor: colors.background.primary, + borderRight: `1px solid ${colors.ui.separator}`, + }, + }, + MuiSlider: { + root: { + color: colors.accent.main, + }, + track: { + backgroundColor: colors.accent.main, + }, + thumb: { + backgroundColor: colors.accent.main, + '&:hover': { + boxShadow: `0 0 0 ${spacing.sm} ${colors.accent.faded}`, + }, + }, + rail: { + backgroundColor: colors.background.tertiary, + }, + }, + MuiLinearProgress: { + root: { + backgroundColor: colors.background.tertiary, + borderRadius: radii.sm, + }, + bar: { + backgroundColor: colors.accent.main, + borderRadius: radii.sm, + }, + }, + MuiTabs: { + root: { + borderBottom: `1px solid ${colors.ui.separator}`, + }, + indicator: { + backgroundColor: colors.accent.main, + height: '0.1875rem', + borderRadius: '0.1875rem 0.1875rem 0 0', + }, + }, + MuiTab: { + root: { + textTransform: 'none', + fontWeight: 500, + fontFamily: typography.fontFamily.heading, + '&$selected': { + color: colors.accent.main, + fontWeight: 600, + }, + }, + }, + MuiInputBase: { + root: { + backgroundColor: colors.background.secondary, + borderRadius: radii.lg, + }, + }, + MuiOutlinedInput: { + root: { + borderRadius: radii.lg, + '& $notchedOutline': { + borderColor: colors.ui.separator, + }, + '&:hover $notchedOutline': { + borderColor: colors.text.tertiary, + }, + '&$focused $notchedOutline': { + borderColor: colors.accent.main, + borderWidth: '0.125rem', + }, + }, + }, + MuiFilledInput: { + root: { + backgroundColor: colors.background.secondary, + borderRadius: radii.lg, + '&:hover': { + backgroundColor: colors.background.tertiary, + }, + '&$focused': { + backgroundColor: colors.background.secondary, + }, + }, + }, + MuiFab: { + primary: { + backgroundColor: colors.accent.main, + '&:hover': { + backgroundColor: colors.accent.main, + filter: 'brightness(0.9)', + }, + }, + }, + MuiAvatar: { + root: { + borderRadius: radii.md, + }, + }, + MuiRating: { + iconFilled: { + color: colors.accent.main, + }, + iconHover: { + color: colors.accent.main, + }, + }, + MuiTooltip: { + tooltip: { + backgroundColor: colors.text.primary, + color: colors.background.primary, + fontSize: '0.75rem', + padding: `${spacing.xs} ${spacing.sm}`, + borderRadius: radii.sm, + }, + }, + MuiBottomNavigation: { + root: { + backgroundColor: colors.ui.glassBg, + backdropFilter: `blur(${tokens.blur})`, + borderTop: `1px solid ${colors.ui.separator}`, + }, + }, + MuiBottomNavigationAction: { + root: { + color: colors.text.secondary, + '&$selected': { + color: colors.accent.main, + }, + }, + label: { + fontFamily: typography.fontFamily.heading, + fontSize: '0.65rem', + '&$selected': { + fontSize: '0.65rem', + }, + }, + }, + NDAppBar: { + root: { + color: colors.text.primary, + }, + }, + NDLogin: { + main: { + backgroundColor: colors.background.primary, + }, + card: { + backgroundColor: colors.background.primary, + borderRadius: radii.pill, + boxShadow: `0 ${spacing.xs} ${spacing.xl} ${colors.ui.shadow}`, + }, + }, + NDAlbumGridView: { + albumContainer: { + borderRadius: radii.md, + '& img': { + borderRadius: radii.md, + }, + }, + albumTitle: { + fontWeight: 600, + color: colors.text.primary, + }, + albumSubtitle: { + color: colors.text.secondary, + }, + albumPlayButton: { + backgroundColor: colors.accent.main, + borderRadius: radii.full, + boxShadow: `0 ${spacing.sm} ${spacing.sm} rgba(0, 0, 0, 0.15)`, + padding: '0.35rem', + transition: 'padding .3s ease', + '&:hover': { + backgroundColor: `${colors.accent.main} !important`, + padding: '0.45rem', + }, + }, + }, + NDAlbumDetails: { + root: { + [`@media (max-width: ${breakpoints.xs}px)`]: { + padding: '0.7em', + width: '100%', + minWidth: 'unset', + }, + }, + cardContents: { + [`@media (max-width: ${breakpoints.xs}px)`]: { + flexDirection: 'column', + alignItems: 'center', + }, + }, + details: { + [`@media (max-width: ${breakpoints.xs}px)`]: { + width: '100%', + }, + }, + cover: { + borderRadius: radii.md, + }, + coverParent: { + marginRight: spacing.xl, + [`@media (max-width: ${breakpoints.xs}px)`]: { + width: '100%', + height: 'auto', + minWidth: 'unset', + aspectRatio: '1', + marginRight: 0, + marginBottom: spacing.lg, + }, + ...coverSizing(), + }, + recordName: { + fontSize: '1.75rem', + fontWeight: 700, + marginBottom: '0.15rem', + }, + recordArtist: { + marginBottom: spacing.md, + }, + recordMeta: { + marginBottom: spacing.sm, + }, + genreList: { + marginTop: spacing.md, + }, + loveButton: { + marginLeft: spacing.sm, + }, + }, + NDAlbumShow: { + albumActions: actionButtonsStyle(), + }, + NDPlaylistShow: { + playlistActions: actionButtonsStyle(), + }, + NDSubMenu: { + icon: menuIconStyle(), + menuHeader: { + color: colors.text.primary, + '& .MuiTypography-root': { + color: colors.text.primary, + }, + }, + actionIcon: { + marginLeft: spacing.sm, + }, + }, + RaMenuItemLink: { + root: { + color: `${colors.text.primary} !important`, + '& .MuiListItemIcon-root': menuIconStyle(), + '&[class*="makeStyles-active"]': activeLinkStyle, + }, + active: activeLinkStyle, + }, + NDDesktopArtistDetails: { + root: { + [`@media (min-width: ${breakpoints.sm}px)`]: { + padding: '1em', + }, + [`@media (min-width: ${breakpoints.lg}px)`]: { + padding: '1em', + }, + }, + cover: { + borderRadius: radii.md, + ...coverSizing(), + }, + artistImage: { + borderRadius: radii.md, + marginRight: spacing.xl, + [`@media (min-width: ${breakpoints.sm}px)`]: { + height: sizing.cover.sm, + width: sizing.cover.sm, + minWidth: sizing.cover.sm, + maxHeight: sizing.cover.sm, + minHeight: sizing.cover.sm, + }, + [`@media (min-width: ${breakpoints.lg}px)`]: { + height: sizing.cover.lg, + width: sizing.cover.lg, + minWidth: sizing.cover.lg, + maxHeight: sizing.cover.lg, + minHeight: sizing.cover.lg, + }, + }, + artistName: { + fontSize: '1.75rem', + fontWeight: 700, + marginBottom: spacing.sm, + }, + }, + NDMobileArtistDetails: { + cover: { + borderRadius: radii.md, + }, + artistImage: { + borderRadius: radii.md, + }, + }, + RaList: { + content: { + overflow: 'visible', + }, + }, + RaBulkActionsToolbar: { + topToolbar: { + backgroundColor: 'transparent', + boxShadow: 'none', + padding: spacing.sm, + '@global': { + button: { + border: '1px solid transparent', + backgroundColor: colors.background.secondary, + color: colors.text.secondary, + margin: `0 ${spacing.xs}`, + borderRadius: radii.full, + minWidth: 0, + padding: spacing.sm, + position: 'relative', + '&:hover': { + backgroundColor: `${colors.background.tertiary} !important`, + border: '1px solid transparent', + }, + }, + 'button>span:first-child>span': { + display: 'none', + }, + 'button:hover>span:first-child>span': customTooltipStyle(), + 'button>span:first-child>svg': { + color: colors.text.secondary, + }, + }, + }, + }, + RaPaginationActions: { + currentPageButton: { + backgroundColor: colors.accent.faded, + }, + }, + }, + player: { + theme: 'light', + stylesheet: ` + @font-face { + font-family: 'Unbounded'; + font-style: normal; + font-weight: 300 800; + font-display: swap; + src: url('/fonts/Unbounded-Variable.woff2') format('woff2'); + } + + .react-jinke-music-player-main { + background-color: ${colors.background.primary} !important; + font-family: ${typography.fontFamily.base} !important; + } + + .react-jinke-music-player-main .music-player-panel { + background-color: ${colors.ui.glassBg} !important; + backdrop-filter: blur(${tokens.blur}) !important; + -webkit-backdrop-filter: blur(${tokens.blur}) !important; + border-top: 1px solid ${colors.ui.separator} !important; + box-shadow: 0 -0.125rem 1.25rem rgba(0, 0, 0, 0.06) !important; + } + + .react-jinke-music-player-main svg { + color: ${colors.text.primary} !important; + } + + .react-jinke-music-player-main svg:hover { + color: ${colors.accent.main} !important; + } + + .react-jinke-music-player-main .rc-slider-track, + .react-jinke-music-player-main .rc-slider-handle { + background-color: ${colors.accent.main} !important; + } + + .react-jinke-music-player-main .rc-slider-handle { + border-color: ${colors.accent.main} !important; + } + + .react-jinke-music-player-main .rc-slider-rail { + background-color: ${colors.background.secondary} !important; + } + + .react-jinke-music-player-main .rc-slider { + height: 4px !important; + } + + .react-jinke-music-player-main .rc-slider-rail, + .react-jinke-music-player-main .rc-slider-track { + height: 4px !important; + border-radius: 2px !important; + } + + .react-jinke-music-player-main .rc-slider-handle { + width: 12px !important; + height: 12px !important; + margin-top: -4px !important; + } + + .react-jinke-music-player-main .audio-lists-panel, + .react-jinke-music-player-main .audio-lists-panel-content { + background-color: ${colors.background.primary} !important; + } + + .react-jinke-music-player-main .audio-lists-panel-content .audio-item { + background-color: transparent !important; + color: ${colors.text.primary} !important; + } + + .react-jinke-music-player-main .audio-lists-panel-content .audio-item:hover { + background-color: ${colors.accent.faded} !important; + } + + .react-jinke-music-player-main .audio-lists-panel-content .audio-item.playing { + background-color: ${colors.accent.faded} !important; + color: ${colors.accent.main} !important; + } + + .react-jinke-music-player-main .lyric-btn-active, + .react-jinke-music-player-main .play-mode-title { + color: ${colors.accent.main} !important; + } + + .react-jinke-music-player-main .music-player-panel .player-content .music-player-controller .music-player-info .music-player-title { + color: ${colors.text.primary} !important; + font-weight: 600 !important; + font-family: ${typography.fontFamily.heading} !important; + } + + .react-jinke-music-player-main .music-player-panel .player-content .music-player-controller .music-player-info .music-player-artist { + color: ${colors.text.secondary} !important; + } + + .react-jinke-music-player-main.mini-player { + background-color: ${colors.ui.glassBg} !important; + backdrop-filter: blur(${tokens.blur}) !important; + -webkit-backdrop-filter: blur(${tokens.blur}) !important; + border-radius: ${radii.xl} !important; + box-shadow: 0 ${spacing.xs} 1.25rem rgba(0, 0, 0, 0.08) !important; + } + + + .MuiTypography-h1, + .MuiTypography-h2, + .MuiTypography-h3, + .MuiTypography-h4, + .MuiTypography-h5, + .MuiTypography-h6 { + font-family: ${typography.fontFamily.heading} !important; + } + `, + }, +} + +export default NautilineTheme