import * as React from 'react' import { useMemo, } from '@wordpress/element' import { withFilters, } from '@wordpress/components' import { applyFilters, } from '@wordpress/hooks' import { useStyleOverride, } from '@ska/utils' import { usePluginOptionsEdit, } from '../options' import { useTailwind4Options, } from '../tailwind4' import { PresetsStylesLoader, usePresets, useRecompilePresets, } from '../../supports/presets' const useFontStyles = () => { const { fontFamily, } = useTailwind4Options() return useMemo(() => { return Object.keys(fontFamily) .map(id => { const value = fontFamily[id] const [externalFontJson] = (value.indexOf('[&]') === -1 ? `{}[&]${value}` : value).split('[&]') const conf = JSON.parse(externalFontJson) const {source} = conf if(!source) { return '' } return applyFilters('ska.blocks.getFontUrl', '', id, conf) as string }) .filter(v => v) .map(url => `@import url('${url}');`) .join('\n') }, [fontFamily]) } export const useTailwindStyles = () => { const [select] = usePluginOptionsEdit() const components = (select.getOption('tailwindGlobalStyles') || []) as any as string[] const { compiledTheme, compiledPreflight, compiledProperties, compiledCompat, } = useTailwind4Options() return useMemo( () => { return ` @layer ska-properties, ska-reset, ska-base; ${components.includes('theme') ? compiledTheme : ''} @layer ska-reset { ${components.includes('preflight') ? compiledPreflight : ''} ${components.includes('properties') ? compiledProperties : ''} ${components.includes('compat') ? compiledCompat : ''} } ${components.includes('properties') ? compiledProperties : ''} `.replaceAll('\n', '').replaceAll('\t', '').trim() }, // eslint-disable-next-line react-compiler/react-compiler // eslint-disable-next-line react-hooks/exhaustive-deps [JSON.stringify(components), compiledTheme, compiledPreflight, compiledProperties, compiledCompat] ) } /** Allows using Tailwind theme variables in the block editor context. */ const BlockEditorTailwindThemeLoader: React.FC<{theme: string}> = ({theme}) => { const css = useMemo(() => { return theme .replace(':root,:host', '.ska-blocks--use-global-theme') // New selector .replace(':root', '.ska-blocks--use-global-theme') // Old selector }, [theme]) return } /** Always rendered, does global things. */ const GlobalPlugin: React.FC = () => { const options = useTailwind4Options() const presets = usePresets() useRecompilePresets(presets) useStyleOverride('ska-blocks-fonts', useFontStyles()) useStyleOverride('ska-blocks-tailwind4', useTailwindStyles()) return <> } export default { name: 'ska-blocks-global', render: withFilters('ska.blocks.globalPlugin')(GlobalPlugin), }