import { useStore } from '@nanostores/react'
import type { TokenDataTypes } from '@pandacss/types'
import React, { useEffect, useState } from 'react'
import { css } from '../../styled-system/css'
import { Center } from '../../styled-system/jsx'
import { availableThemes } from '../lib/panda-context'
import { currentThemeStore } from '../lib/theme-store'
import { useThemeTokens } from '../lib/use-theme-tokens'
import { Colors } from './colors'
import { FontFamily } from './font-family'
import FontTokens from './font-tokens'
import { Radii } from './radii'
import Sizes from './sizes'
type TokenCategory = keyof TokenDataTypes
const hasThemes = availableThemes.length > 0
const loadingStyles = css({
width: '40px',
height: '40px',
border: '2px solid #FFF',
borderColor: 'yellow.400',
borderBottomColor: 'transparent',
borderRadius: '50%',
display: 'inline-block',
boxSizing: 'border-box',
animation: 'spin 0.6s linear infinite',
})
function Loader() {
return (
)
}
function ThemeLoading({ children }: { children: React.ReactNode }) {
const [isHydrated, setIsHydrated] = useState(false)
useStore(currentThemeStore)
useEffect(() => {
setIsHydrated(true)
}, [])
if (!isHydrated) {
return
}
return <>{children}>
}
function createTokenPage(
tokenType: T,
render: (tokens: ReturnType) => React.ReactNode,
) {
return function TokenPage() {
const tokens = useThemeTokens(tokenType)
return hasThemes ? {render(tokens)} : <>{render(tokens)}>
}
}
export const SizesPage = createTokenPage('sizes', (tokens) => )
export const SpacingPage = createTokenPage('spacing', (tokens) => )
export const FontSizesPage = createTokenPage('fontSizes', (tokens) => (
))
export const FontWeightsPage = createTokenPage('fontWeights', (tokens) => (
))
export const LetterSpacingsPage = createTokenPage('letterSpacings', (tokens) => (
))
export const LineHeightsPage = createTokenPage('lineHeights', (tokens) => (
))
export const RadiiPage = createTokenPage('radii', (tokens) => )
export const FontsPage = createTokenPage('fonts', (tokens) => )
export function ColorsPage() {
const theme = hasThemes ? useStore(currentThemeStore) : undefined
return hasThemes ? (
) : (
)
}