watchEffect,
warn,
VNode,
- Fragment
+ Fragment,
+ ComponentInternalInstance
} from '@vue/runtime-core'
import { ShapeFlags } from '@vue/shared/src'
export function useCSSVars(
getter: (ctx: ComponentPublicInstance) => Record<string, string>,
- scopeId?: string
+ scoped = false
) {
const instance = getCurrentInstance()
if (!instance) {
}
onMounted(() => {
watchEffect(() => {
- setVarsOnVNode(instance.vnode, getter(instance.proxy!), scopeId)
+ setVarsOnVNode(
+ instance.subTree,
+ getter(instance.proxy!),
+ instance,
+ scoped
+ )
})
})
}
function setVarsOnVNode(
vnode: VNode,
vars: Record<string, string>,
- scopeId?: string
+ owner: ComponentInternalInstance,
+ scoped: boolean
) {
// drill down HOCs until it's a non-component vnode
while (vnode.component) {
}
if (vnode.shapeFlag & ShapeFlags.ELEMENT && vnode.el) {
const style = vnode.el.style
- const prefix = scopeId ? scopeId + '-' : ''
+ const prefix =
+ scoped && owner.type.__scopeId ? `${owner.type.__scopeId}-` : ``
for (const key in vars) {
style.setProperty(`--${prefix}${key}`, vars[key])
}
} else if (vnode.type === Fragment) {
- ;(vnode.children as VNode[]).forEach(c => setVarsOnVNode(c, vars, scopeId))
+ ;(vnode.children as VNode[]).forEach(c =>
+ setVarsOnVNode(c, vars, owner, scoped)
+ )
}
}