/
kaws
/
ui-kit-ce
Обзор
Документация
Войти
/
kaws
/
ui-kit-ce
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
packages/theme/src/ShadowDOMProvider.tsx
74 строки
2 KB
Denis Svyatovets
refactor: правки по тестированию
30 окт 2025, 11:29
30 окт 2025, 11:29
b487f36
Код
Авторство
О чём код?
'use client' import { JssProvider, SheetsRegistry, createGenerateId } from 'react-jss' import * as React from 'react' import { create as createJss, Jss } from 'jss' import preset from 'jss-preset-default' import { ThemeProvider } from './ThemeProvider' import { createTheme } from './createTheme' import { getThemeDefaults } from './utils' export type ShadowDOMContextProps = Record<string, unknown> const ShadowDOMContext = React.createContext<ShadowDOMContextProps>( undefined as unknown as ShadowDOMContextProps ) //#region Перезапись дефолтной темы с помощью глобальной переменной DEFAULT_UIK_THEME (только для команды ИДС, в остальных случаях не рекомендуется к использованию!!!) const defaultTheme = createTheme(getThemeDefaults()) //#endregion // паста из common, чтобы не было циклической зависимости type ComponentPropsWithRefFix<T extends React.ElementType> = Omit< React.ComponentPropsWithRef<T>, 'placeholder' | 'onPointerEnterCapture' | 'onPointerLeaveCapture' > & { /** * */ placeholder?: string } export const ShadowDOMProvider = React.forwardRef< HTMLDivElement, React.PropsWithChildren<ComponentPropsWithRefFix<'div'>> >(({ children, ...rest }, ref) => { const sheetsRegistry = new SheetsRegistry() const generateId = createGenerateId() const shadowRef = React.useRef<HTMLDivElement | null>(null) const [jssInstance, setJssInstance] = React.useState<Jss>() React.useLayoutEffect(() => { const jss = createJss({ ...preset(), insertionPoint: shadowRef.current as HTMLDivElement, }) setJssInstance(jss) }, []) return ( <ShadowDOMContext.Provider value={{}}> <div ref={ref} {...rest}> <JssProvider registry={sheetsRegistry} generateId={generateId} jss={jssInstance} > <div ref={shadowRef} data-v-uik-shadow-dom-style-container="true" /> <ThemeProvider theme={defaultTheme}>{children}</ThemeProvider> </JssProvider> </div> </ShadowDOMContext.Provider> ) }) export const useIsInsideShadowDOM = (): boolean => { return !!React.useContext( ShadowDOMContext as unknown as React.Context<ShadowDOMContextProps> ) }