Skip to content

Commit

Permalink
Refactor #3965 - Add useStyle hook for dynamic styling
Browse files Browse the repository at this point in the history
  • Loading branch information
mertsincan committed May 16, 2023
1 parent 3c46461 commit 9911c8f
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 0 deletions.
70 changes: 70 additions & 0 deletions components/lib/usestyle/UseStyle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* 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);

const defaultDocument = DomHandler.isClient() ? window.document : undefined;
const { document = defaultDocument, immediate = true, manual = false, id = `primevue_style_${++_id}` } = options;

const cssRef = ref(css);

let stop = () => {};

const load = () => {
if (!document) return;

const el = document.getElementById(id) || document.createElement('style');

if (!el.isConnected) {
el.type = 'text/css';
el.id = id;
if (options.media) el.media = options.media;
document.head.appendChild(el);
}

if (isLoaded.value) return;

stop = watch(
cssRef,
(value) => {
el.textContent = value;
},
{ immediate: true }
);

isLoaded.value = true;
};

const unload = () => {
if (!document || !isLoaded.value) return;
stop();
document.head.removeChild(document.getElementById(id));
isLoaded.value = false;
};

if (immediate && !manual) tryOnMounted(load);

/*if (!manual)
tryOnScopeDispose(unload)*/

return {
id,
css: cssRef,
unload,
load,
isLoaded: readonly(isLoaded)
};
}
6 changes: 6 additions & 0 deletions components/lib/usestyle/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"main": "./usestyle.cjs.js",
"module": "./usestyle.esm.js",
"unpkg": "./usestyle.min.js",
"types": "./UseStyle.d.ts"
}
1 change: 1 addition & 0 deletions rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ let coreDependencies = {
'primevue/useconfirm': 'primevue.useconfirm',
'primevue/usetoast': 'primevue.usetoast',
'primevue/usedialog': 'primevue.usedialog',
'primevue/usestyle': 'primevue.usestyle',
'primevue/button': 'primevue.button',
'primevue/inputtext': 'primevue.inputtext',
'primevue/inputnumber': 'primevue.inputnumber',
Expand Down
1 change: 1 addition & 0 deletions vite.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export default {
'primevue/usetoast': path.resolve(__dirname, './components/lib/usetoast/UseToast.js'),
'primevue/usedialog': path.resolve(__dirname, './components/lib/usedialog/UseDialog.js'),
'primevue/utils': path.resolve(__dirname, './components/lib/utils/Utils.js'),
'primevue/usestyle': path.resolve(__dirname, './components/lib/usestyle/UseStyle.js'),
'primevue/api': path.resolve(__dirname, './components/lib/api/Api.js'),
'primevue/portal': path.resolve(__dirname, './components/lib/portal/Portal.vue'),
'primevue/basecomponent': path.resolve(__dirname, './components/lib/basecomponent/BaseComponent.vue'),
Expand Down

0 comments on commit 9911c8f

Please sign in to comment.