reka-ui
Version:
Vue port for Radix UI Primitives.
27 lines (25 loc) • 1.21 kB
text/typescript
import { getCurrentInstance } from 'vue'
/**
* Returns the parent component's `<style scoped>` id (e.g. `data-v-xxxxxxx`) as a
* bindable attribute object, so it can be manually forwarded onto the chosen root
* element of a multi-root component.
*
* Vue only auto-applies the parent's scope id to a **single-root** component's root.
* When a component renders multiple root nodes (e.g. an interactive control plus a
* sibling hidden form input), that fallthrough is dropped and the parent's scoped
* styles can no longer reach the component. Spread the returned object onto the
* element that should stay styleable by the parent.
*
* @example
* ```ts
* const scopeIdAttrs = useForwardScopeId()
* // <Primitive v-bind="{ ...$attrs, ...scopeIdAttrs }" />
* ```
*/
export function useForwardScopeId(): Record<string, string> {
// `vnode.scopeId` is the scope id the parent set on this component's placeholder
// vnode for scoped-CSS fallthrough. It is populated during the parent's render,
// so it is already available by the time `setup()` runs.
const scopeId = (getCurrentInstance()?.vnode as { scopeId?: string } | undefined)?.scopeId
return scopeId ? { [scopeId]: '' } : {}
}