UNPKG

vuetify

Version:

Vue Material Component Framework

101 lines 3.96 kB
// Utilities import { computed, inject, provide, ref, shallowRef, unref, watchEffect } from 'vue'; import { getCurrentInstance } from "../util/getCurrentInstance.js"; import { mergeDeep, toKebabCase } from "../util/helpers.js"; import { injectSelf } from "../util/injectSelf.js"; // Types export const DefaultsSymbol = Symbol.for('vuetify:defaults'); export function createDefaults(options) { return ref(options); } export function injectDefaults() { const defaults = inject(DefaultsSymbol); if (!defaults) throw new Error('[Vuetify] Could not find defaults instance'); return defaults; } export function provideDefaults(defaults, options) { const injectedDefaults = injectDefaults(); const providedDefaults = ref(defaults); const newDefaults = computed(() => { const disabled = unref(options?.disabled); if (disabled) return injectedDefaults.value; const scoped = unref(options?.scoped); const reset = unref(options?.reset); const root = unref(options?.root); if (providedDefaults.value == null && !(scoped || reset || root)) return injectedDefaults.value; let properties = mergeDeep(providedDefaults.value, { prev: injectedDefaults.value }); if (scoped) return properties; if (reset || root) { const len = Number(reset || Infinity); for (let i = 0; i <= len; i++) { if (!properties || !('prev' in properties)) { break; } properties = properties.prev; } if (properties && typeof root === 'string' && root in properties) { properties = mergeDeep(mergeDeep(properties, { prev: properties }), properties[root]); } return properties; } return properties.prev ? mergeDeep(properties.prev, properties, undefined, (_, v) => v !== undefined) : properties; }); provide(DefaultsSymbol, newDefaults); return newDefaults; } function propIsDefined(vnode, prop) { return vnode.props && (typeof vnode.props[prop] !== 'undefined' || typeof vnode.props[toKebabCase(prop)] !== 'undefined'); } export function internalUseDefaults(props = {}, name, defaults = injectDefaults()) { const vm = getCurrentInstance('useDefaults'); name = name ?? vm.type.name ?? vm.type.__name; if (!name) { throw new Error('[Vuetify] Could not determine component name'); } const componentDefaults = computed(() => defaults.value?.[props._as ?? name]); const _props = new Proxy(props, { get(target, prop) { const propValue = Reflect.get(target, prop); if (prop === 'class' || prop === 'style') { return [componentDefaults.value?.[prop], propValue].filter(v => v != null); } if (propIsDefined(vm.vnode, prop)) return propValue; const _componentDefault = componentDefaults.value?.[prop]; if (_componentDefault !== undefined) return _componentDefault; const _globalDefault = defaults.value?.global?.[prop]; if (_globalDefault !== undefined) return _globalDefault; return propValue; } }); const _subcomponentDefaults = shallowRef(); watchEffect(() => { if (componentDefaults.value) { const subComponents = Object.entries(componentDefaults.value).filter(([key]) => key.startsWith(key[0].toUpperCase())); _subcomponentDefaults.value = subComponents.length ? Object.fromEntries(subComponents) : undefined; } else { _subcomponentDefaults.value = undefined; } }); function provideSubDefaults() { const injected = injectSelf(DefaultsSymbol, vm); provide(DefaultsSymbol, computed(() => { return _subcomponentDefaults.value ? mergeDeep(injected?.value ?? {}, _subcomponentDefaults.value) : injected?.value; })); } return { props: _props, provideSubDefaults }; } export function useDefaults(props = {}, name) { const { props: _props, provideSubDefaults } = internalUseDefaults(props, name); provideSubDefaults(); return _props; } //# sourceMappingURL=defaults.js.map