geoproject-app/src/stores/stylesheet.js

75 lines
1.8 KiB
JavaScript
Raw Normal View History

import { defineStore } from 'pinia';
import { ref, watch } from 'vue';
import cssParsingUtils from '../utils/css-parsing';
import prettier from 'prettier/standalone';
import parserPostcss from 'prettier/plugins/postcss';
export const useStylesheetStore = defineStore('stylesheet', () => {
const content = ref('');
let formatTimer = null;
let isFormatting = false;
// Format CSS with Prettier
const formatContent = async () => {
if (isFormatting || !content.value) return;
try {
isFormatting = true;
const formatted = await prettier.format(content.value, {
parser: 'css',
plugins: [parserPostcss],
printWidth: 80,
tabWidth: 2,
useTabs: false,
});
content.value = formatted;
} catch (error) {
console.error('CSS formatting error:', error);
} finally {
isFormatting = false;
}
};
// Watch content and format after 500ms of inactivity
watch(content, () => {
if (isFormatting) return;
clearTimeout(formatTimer);
formatTimer = setTimeout(() => {
formatContent();
}, 500);
});
const loadStylesheet = async () => {
const response = await fetch('/assets/css/stylesheet.css');
content.value = await response.text();
};
const updateProperty = (selector, property, value, unit) => {
content.value = cssParsingUtils.updateCssValue({
css: content.value,
selector,
property,
value,
unit
});
};
const extractValue = (selector, property) => {
return cssParsingUtils.extractCssValue(content.value, selector, property);
};
const extractBlock = (selector) => {
return cssParsingUtils.extractCssBlock(content.value, selector);
};
return {
content,
loadStylesheet,
updateProperty,
extractValue,
extractBlock,
formatContent
};
});