import { GenericImageSrcSet } from '@past3lle/types' import React from 'react' import { ThemedCssFunction } from 'styled-components' import { MediaWidths } from './styles' import { ThemeTemplates } from './templates' export type ImageKitUrl = `https://ik.imagekit.io/${string}/${string}` export type BackgroundPropertyFull = GenericImageSrcSet | ImageKitUrl | string export type Color = string export interface ThemeBaseColoursRequired { // black readonly black: Color readonly blackOpaque: Color readonly blackOpaqueMore: Color readonly blackOpaqueMost: Color // offblack readonly offblack: Color readonly offblackOpaque: Color readonly offblackOpaqueMore: Color readonly offblackOpaqueMost: Color // whites readonly white: Color readonly whiteOpaque: Color readonly whiteOpaqueMore: Color readonly whiteOpaqueMost: Color // offwhite readonly offwhite: Color readonly offwhiteOpaque: Color readonly offwhiteOpaqueMore: Color readonly offwhiteOpaqueMost: Color } export interface ThemeContentPartsRequired { button: { border: { radius: Color colour: Color border: Color } hoverColour: Color fontSize: { small: Color normal: Color large: Color } } input: { border: { radius: Color colour: Color border: Color } hoverColour: Color } content: { background: Color backgroundAlt: Color text: Color textAlt: Color } } export type ThemeContentPartsRequiredByMode = ThemeByModes export type AvailableThemeTemplate = keyof typeof ThemeTemplates export interface ThemeMinimumRequired { baseColours: ThemeBaseColoursRequired baseContent: ThemeContentPartsRequiredByMode } export type BasicUserTheme = Record export type CustomThemeOrTemplate = ThemeMediaWidthsBaseRequired & ThemeMinimumRequired & (T extends ThemeByModes ? T extends undefined ? ThemeMinimumRequired : T : K extends AvailableThemeTemplate ? (typeof ThemeTemplates)[K] : void) export type ThemeModesRequired = 'LIGHT' | 'DARK' export type Subset = { [attr in keyof K]?: K[attr] extends object ? Subset : K[attr] extends object ? Subset : K[attr] extends object | undefined ? Subset | undefined : K[attr] } export type ThemeByModes = { modes: { DEFAULT: T } & { [key in ThemeModesRequired]: Subset } } export interface ThemeStateBaseRequired { mode: M autoDetect: boolean setMode: React.Dispatch> setAutoDetect: React.Dispatch> } export interface ThemeMediaWidthsBaseRequired { // media queries mediaWidth: { upToExtraSmall: ThemedCssFunction> upToSmall: ThemedCssFunction> upToMedium: ThemedCssFunction> upToLarge: ThemedCssFunction> upToExtraLarge: ThemedCssFunction> } // from media size fromMediaWidth: { fromExtraSmall: ThemedCssFunction> fromSmall: ThemedCssFunction> fromMedium: ThemedCssFunction> fromLarge: ThemedCssFunction> fromExtraLarge: ThemedCssFunction> } // between media size betweenMediaWidth: { betweenExtraSmallAndSmall: ThemedCssFunction> betweenSmallAndMedium: ThemedCssFunction> betweenMediumAndLarge: ThemedCssFunction> betweenLargeAndExtraLarge: ThemedCssFunction> // random but useful betweenSmallAndLarge: ThemedCssFunction> } // height mediaHeight: { upToExtraSmallHeight: ThemedCssFunction> upToSmallHeight: ThemedCssFunction> upToMediumHeight: ThemedCssFunction> upToLargeHeight: ThemedCssFunction> upToExtraLargeHeight: ThemedCssFunction> } } export interface ThemeBaseRequired extends ThemeBaseColoursRequired, ThemeContentPartsRequired, ThemeStateBaseRequired, ThemeMediaWidthsBaseRequired {} declare module 'styled-components' { // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface DefaultTheme extends ThemeBaseRequired {} }