primevue-mirror/components/lib/usestyle/UseStyle.js

83 lines
2.4 KiB
JavaScript
Raw Normal View History

/*
* Ported from useStyleTag in @vueuse/core
* https://github.com/vueuse
*/
import { DomHandler } from 'primevue/utils';
import { getCurrentInstance, nextTick, onMounted, readonly, ref, watch } from 'vue';
function tryOnMounted(fn, sync = true) {
if (getCurrentInstance()) onMounted(fn);
else if (sync) fn();
else nextTick(fn);
}
let _id = 0;
export function useStyle(css, options = {}) {
const isLoaded = ref(false);
2023-07-12 09:19:35 +00:00
const cssRef = ref(css);
const styleRef = ref(null);
const defaultDocument = DomHandler.isClient() ? window.document : undefined;
2024-03-18 10:57:17 +00:00
const { document = defaultDocument, immediate = true, manual = false, name = `style_${++_id}`, id = undefined, media = undefined, nonce = undefined, first = false, props = {} } = options;
let stop = () => {};
/* @todo: Improve _options params */
const load = (_css, _props = {}) => {
if (!document) return;
const _styleProps = { ...props, ..._props };
const [_name, _id, _nonce] = [_styleProps.name || name, _styleProps.id || id, _styleProps.nonce || nonce];
styleRef.value = document.querySelector(`style[data-primevue-style-id="${_name}"]`) || document.getElementById(_id) || document.createElement('style');
2023-07-12 09:19:35 +00:00
if (!styleRef.value.isConnected) {
cssRef.value = _css || css;
DomHandler.setAttributes(styleRef.value, {
type: 'text/css',
id: _id,
media,
nonce: _nonce
});
2024-03-18 10:57:17 +00:00
first ? document.head.prepend(styleRef.value) : document.head.appendChild(styleRef.value);
DomHandler.setAttribute(styleRef.value, 'data-primevue-style-id', name);
DomHandler.setAttributes(styleRef.value, _styleProps);
}
if (isLoaded.value) return;
stop = watch(
cssRef,
(value) => {
2023-07-12 09:19:35 +00:00
styleRef.value.textContent = value;
},
{ immediate: true }
);
isLoaded.value = true;
};
const unload = () => {
if (!document || !isLoaded.value) return;
stop();
2023-07-12 09:19:35 +00:00
DomHandler.isExist(styleRef.value) && document.head.removeChild(styleRef.value);
isLoaded.value = false;
};
if (immediate && !manual) tryOnMounted(load);
/*if (!manual)
tryOnScopeDispose(unload)*/
return {
id,
2023-07-12 09:19:35 +00:00
name,
css: cssRef,
unload,
load,
isLoaded: readonly(isLoaded)
};
}