pleroma-fe/src/components/component_preview/component_preview.js

87 lines
1.8 KiB
JavaScript
Raw Normal View History

2025-07-02 00:36:37 +03:00
import Checkbox from 'src/components/checkbox/checkbox.vue'
import ColorInput from 'src/components/color_input/color_input.vue'
import genRandomSeed from 'src/services/random_seed/random_seed.service.js'
2026-01-06 16:22:52 +02:00
import {
createStyleSheet,
adoptStyleSheets,
} from 'src/services/style_setter/style_setter.js'
2025-07-02 00:36:37 +03:00
export default {
components: {
Checkbox,
2026-01-06 16:22:52 +02:00
ColorInput,
2025-07-02 00:36:37 +03:00
},
props: [
'shadow',
'shadowControl',
'previewClass',
'previewStyle',
'previewCss',
'disabled',
'invalid',
2026-01-06 16:22:52 +02:00
'noColorControl',
2025-07-02 00:36:37 +03:00
],
emits: ['update:shadow'],
2026-01-06 16:22:52 +02:00
data() {
2025-07-02 00:36:37 +03:00
return {
colorOverride: undefined,
lightGrid: false,
zoom: 100,
2026-01-06 16:22:52 +02:00
randomSeed: genRandomSeed(),
2025-07-02 00:36:37 +03:00
}
},
2026-01-06 16:22:52 +02:00
mounted() {
2025-07-02 16:18:07 +03:00
this.update()
},
2025-07-02 00:36:37 +03:00
computed: {
2026-01-06 16:22:52 +02:00
hideControls() {
2025-07-02 00:36:37 +03:00
return typeof this.shadow === 'string'
2026-01-06 16:22:52 +02:00
},
2025-07-02 00:36:37 +03:00
},
watch: {
2026-01-06 16:22:52 +02:00
previewCss() {
2025-07-02 00:36:37 +03:00
this.update()
},
2026-01-06 16:22:52 +02:00
previewStyle() {
2025-07-02 00:36:37 +03:00
this.update()
},
2026-01-06 16:22:52 +02:00
zoom() {
2025-07-02 00:36:37 +03:00
this.update()
2026-01-06 16:22:52 +02:00
},
2025-07-02 00:36:37 +03:00
},
methods: {
2026-01-06 16:22:52 +02:00
updateProperty(axis, value) {
2025-07-02 00:36:37 +03:00
this.$emit('update:shadow', { axis, value: Number(value) })
},
2026-01-06 16:22:52 +02:00
update() {
2025-07-03 17:11:23 +03:00
const sheet = createStyleSheet('style-component-preview', 90)
2025-07-02 00:36:37 +03:00
2025-07-02 22:54:45 +03:00
sheet.clear()
2025-07-02 00:36:37 +03:00
2025-07-02 22:54:45 +03:00
const result = [this.previewCss]
2025-07-02 00:36:37 +03:00
if (this.colorOverride) result.push(`--background: ${this.colorOverride}`)
const styleRule = [
2026-01-06 16:22:52 +02:00
'#component-preview-',
this.randomSeed,
' {\n',
2025-07-02 00:36:37 +03:00
'.preview-block {\n',
`zoom: ${this.zoom / 100};`,
this.previewStyle,
'\n}',
2026-01-06 16:22:52 +02:00
'\n}',
2025-07-02 00:36:37 +03:00
].join('')
2025-07-02 22:54:45 +03:00
sheet.addRule(styleRule)
2026-01-06 16:22:52 +02:00
sheet.addRule(
['#component-preview-', this.randomSeed, ' {\n', ...result, '\n}'].join(
'',
),
)
2025-07-02 22:54:45 +03:00
sheet.ready = true
adoptStyleSheets()
2026-01-06 16:22:52 +02:00
},
},
2025-07-02 00:36:37 +03:00
}