p-stream/themes/list/popsicle.ts
2025-11-07 16:50:35 -07:00

343 lines
9.9 KiB
TypeScript

import { createTheme } from "../types";
const tokens = {
black: "hsla(0, 0%, 0%, 1)", // General black color
white: "hsla(0, 0%, 100%, 1)", // General white color
semantic: {
red: {
c100: "hsla(0, 86%, 69%, 1)", // Error text
c200: "hsla(0, 73%, 60%, 1)", // Video player scraping error
c300: "hsla(0, 66%, 56%, 1)", // Danger button
c400: "hsla(0, 55%, 45%, 1)", // Not currently used
},
green: {
c100: "hsla(125, 60%, 60%, 1)", // Success text
c200: "hsla(125, 49%, 48%, 1)", // Video player scraping success
c300: "hsla(125, 54%, 42%, 1)", // Not currently used
c400: "hsla(125, 54%, 31%, 1)", // Not currently used
},
silver: {
c100: "hsla(0, 0%, 87%, 1)", // Primary button hover
c200: "hsla(206, 33%, 78%, 1)", // Not currently used
c300: "hsla(206, 19%, 62%, 1)", // Secondary button text
c400: "hsla(206, 18%, 46%, 1)", // Main text in video player context
},
yellow: {
c100: "hsla(56, 100%, 80%, 1)", // Best onboarding highlight
c200: "hsla(56, 96%, 68%, 1)", // Dropdown highlight hover
c300: "hsla(56, 55%, 56%, 1)", // Not currently used
c400: "hsla(56, 38%, 48%, 1)", // Dropdown highlight
},
rose: {
c100: "hsla(348, 68%, 55%, 1)", // Authentication error text
c200: "hsla(348, 55%, 35%, 1)", // Danger button hover
c300: "hsla(348, 57%, 32%, 1)", // Danger button
c400: "hsla(348, 60%, 27%, 1)", // Not currently used
},
},
blue: {
c50: "hsla(200, 100%, 85%, 1)", // soft cyan
c100: "hsla(200, 80%, 70%, 1)", // brighter cyan
c200: "hsla(200, 70%, 60%, 1)", // theme primary: cyan-blue
c300: "hsla(200, 60%, 45%, 1)", // accent B: darker cyan-blue
c400: "hsla(200, 50%, 35%, 1)", // light bar
c500: "hsla(200, 45%, 25%, 1)", // accent B background
c600: "hsla(200, 42%, 20%, 1)",
c700: "hsla(200, 40%, 16%, 1)",
c800: "hsla(200, 35%, 10%, 1)",
c900: "hsla(200, 30%, 7%, 1)",
},
purple: {
c50: "hsla(280, 100%, 85%, 1)", // lavender for link hover
c100: "hsla(300, 100%, 75%, 1)", // pink-violet logo/link
c200: "hsla(300, 80%, 65%, 1)", // pinkish progress/loader
c300: "hsla(310, 65%, 55%, 1)", // toggle/onboarding bar
c400: "hsla(320, 60%, 47%, 1)", // card icon
c500: "hsla(325, 50%, 36%, 1)", // accent A background
c600: "hsla(325, 50%, 28%, 1)",
c700: "hsla(325, 50%, 20%, 1)",
c800: "hsla(325, 45%, 14%, 1)",
c900: "hsla(325, 40%, 9%, 1)",
},
ash: {
c50: "hsla(60, 8%, 60%, 1)", // neutral gold-tinted gray
c100: "hsla(60, 10%, 45%, 1)", // warm muted gray
c200: "hsla(60, 11%, 35%, 1)", // sidebar border
c300: "hsla(60, 12%, 28%, 1)", // card divider
c400: "hsla(60, 14%, 22%, 1)", // bg + hover accents
c500: "hsla(200, 45%, 25%, 1)", // accent B background
c600: "hsla(200, 42%, 20%, 1)",
c700: "hsla(200, 40%, 16%, 1)",
c800: "hsla(200, 35%, 10%, 1)",
c900: "hsla(200, 30%, 7%, 1)", // deepest shade, shadows
},
shade: {
c25: "hsla(0, 80%, 70%, 1)", // red hover accent
c50: "hsla(30, 100%, 72%, 1)", // orange for main text
c100: "hsla(30, 80%, 60%, 1)", // placeholder/icon
c200: "hsla(200, 60%, 45%, 1)", // hover bg
c300: "hsla(30, 60%, 35%, 1)", // pill background, auth border
c400: "hsla(200, 50%, 35%, 1)", // light bar
c500: "hsla(30, 50%, 21%, 1)", // dropdown background
c600: "hsla(30, 45%, 16%, 1)", // modal/dropdown background
c700: "hsla(30, 40%, 12%, 1)", // alt bg
c800: "hsla(30, 38%, 9%, 1)", // main bg
c900: "hsla(30, 35%, 6%, 1)", // hover shadow
},
};
export default createTheme({
name: "popsicle",
extend: {
colors: {
themePreview: {
primary: tokens.blue.c200,
secondary: tokens.shade.c50,
ghost: tokens.purple.c400,
},
// Branding
pill: {
background: tokens.shade.c300,
backgroundHover: tokens.shade.c200,
highlight: tokens.blue.c200,
activeBackground: tokens.shade.c300,
},
// meta data for the theme itself
global: {
accentA: tokens.blue.c200,
accentB: tokens.blue.c300,
},
// light bar
lightBar: {
light: tokens.blue.c400,
},
// Buttons
buttons: {
toggle: tokens.purple.c300,
toggleDisabled: tokens.ash.c500,
danger: tokens.semantic.rose.c300,
dangerHover: tokens.semantic.rose.c200,
secondary: tokens.ash.c700,
secondaryText: tokens.semantic.silver.c300,
secondaryHover: tokens.ash.c700,
primary: tokens.white,
primaryText: tokens.black,
primaryHover: tokens.semantic.silver.c100,
purple: tokens.purple.c500,
purpleHover: tokens.purple.c400,
cancel: tokens.ash.c500,
cancelHover: tokens.ash.c300,
},
// only used for body colors/textures
background: {
main: tokens.shade.c900,
secondary: tokens.shade.c600,
secondaryHover: tokens.shade.c400,
accentA: tokens.purple.c500,
accentB: tokens.blue.c500,
},
// Modals
modal: {
background: tokens.shade.c800,
},
// typography
type: {
logo: tokens.purple.c100,
emphasis: tokens.white,
text: tokens.shade.c50,
dimmed: tokens.shade.c50,
divider: tokens.ash.c500,
secondary: tokens.ash.c100,
danger: tokens.semantic.red.c100,
success: tokens.semantic.green.c100,
link: tokens.purple.c100,
linkHover: tokens.purple.c50,
},
// search bar
search: {
background: tokens.shade.c500,
hoverBackground: tokens.shade.c600,
focused: tokens.shade.c400,
placeholder: tokens.shade.c100,
icon: tokens.shade.c100,
text: tokens.white,
},
// media cards
mediaCard: {
hoverBackground: tokens.purple.c900,
hoverAccent: tokens.blue.c100,
hoverShadow: tokens.shade.c900,
shadow: tokens.purple.c700,
barColor: tokens.ash.c200,
barFillColor: tokens.purple.c100,
badge: tokens.shade.c700,
badgeText: tokens.ash.c100,
},
// Large card
largeCard: {
background: tokens.shade.c600,
icon: tokens.purple.c400,
},
// Dropdown
dropdown: {
background: tokens.shade.c600,
altBackground: tokens.shade.c700,
hoverBackground: tokens.shade.c500,
highlight: tokens.semantic.yellow.c400,
highlightHover: tokens.semantic.yellow.c200,
text: tokens.shade.c50,
secondary: tokens.shade.c100,
border: tokens.shade.c400,
contentBackground: tokens.shade.c500,
},
// Passphrase
authentication: {
border: tokens.shade.c300,
inputBg: tokens.shade.c600,
inputBgHover: tokens.shade.c500,
wordBackground: tokens.shade.c500,
copyText: tokens.shade.c100,
copyTextHover: tokens.ash.c50,
errorText: tokens.semantic.rose.c100,
},
// Settings page
settings: {
sidebar: {
activeLink: tokens.shade.c600,
badge: tokens.shade.c900,
type: {
secondary: tokens.shade.c200,
inactive: tokens.shade.c50,
icon: tokens.shade.c50,
iconActivated: tokens.purple.c200,
activated: tokens.purple.c50,
},
},
card: {
border: tokens.shade.c400,
background: tokens.shade.c400,
altBackground: tokens.shade.c400,
},
saveBar: {
background: tokens.shade.c800,
},
},
// Utilities
utils: {
divider: tokens.ash.c300,
},
// Onboarding
onboarding: {
bar: tokens.shade.c400,
barFilled: tokens.purple.c300,
divider: tokens.shade.c200,
card: tokens.shade.c800,
cardHover: tokens.shade.c700,
border: tokens.shade.c600,
good: tokens.purple.c100,
best: tokens.semantic.yellow.c100,
link: tokens.purple.c100,
},
// Error page
errors: {
card: tokens.shade.c800,
border: tokens.ash.c500,
type: {
secondary: tokens.ash.c100,
},
},
// About page
about: {
circle: tokens.ash.c500,
circleText: tokens.ash.c50,
},
// About page
editBadge: {
bg: tokens.ash.c500,
bgHover: tokens.ash.c400,
text: tokens.ash.c50,
},
progress: {
background: tokens.ash.c50,
preloaded: tokens.ash.c50,
filled: tokens.purple.c200,
},
// video player
video: {
buttonBackground: tokens.ash.c200,
autoPlay: {
background: tokens.ash.c700,
hover: tokens.ash.c500,
},
scraping: {
card: tokens.shade.c700,
error: tokens.semantic.red.c200,
success: tokens.semantic.green.c200,
loading: tokens.purple.c200,
noresult: tokens.ash.c100,
},
audio: {
set: tokens.purple.c200,
},
context: {
background: tokens.ash.c900,
light: tokens.shade.c50,
border: tokens.ash.c600,
hoverColor: tokens.ash.c600,
buttonFocus: tokens.ash.c500,
flagBg: tokens.ash.c500,
inputBg: tokens.ash.c600,
buttonOverInputHover: tokens.ash.c500,
inputPlaceholder: tokens.ash.c200,
cardBorder: tokens.ash.c700,
slider: tokens.ash.c50,
sliderFilled: tokens.purple.c200,
error: tokens.semantic.red.c200,
buttons: {
list: tokens.ash.c700,
active: tokens.ash.c900,
},
closeHover: tokens.ash.c800,
type: {
main: tokens.semantic.silver.c400,
secondary: tokens.ash.c200,
accent: tokens.purple.c200,
},
},
},
},
},
});