<template> <DocSectionText v-bind="$attrs"> <p> A chart is configured with 3 properties; <i>type</i>, <i>data</i> and <i>options</i>. Chart type is defined using the <i>type</i> property that accepts <i>pie</i>, <i>doughtnut</i>, <i>line</i>, <i>bar</i>, <i>radar</i> and <i>polarArea</i> as a value. The <i>data</i> defines datasets represented with the chart and the <i>options</i> provide numerous customization options to customize the presentation. </p> </DocSectionText> <div class="card"> <Chart type="bar" :data="chartData" :options="chartOptions" /> </div> <DocSectionCode :code="code" :dependencies="{ 'chart.js': '3.3.2' }" component="Chart" /> </template> <script> import EventBus from '@/layouts/AppEventBus'; export default { themeChangeListener: null, data() { return { chartData: null, chartOptions: null, code: { basic: ` <Chart type="bar" :data="chartData" :options="chartOptions" /> `, options: ` <template> <div class="card"> <Chart type="bar" :data="chartData" :options="chartOptions" /> </div> </template> <script> export default { data() { return { chartData: null, chartOptions: null }; }, mounted() { this.chartData = this.setChartData(); this.chartOptions = this.setChartOptions(); }, methods: { setChartData() { return { labels: ['Q1', 'Q2', 'Q3', 'Q4'], datasets: [ { label: 'Sales', data: [540, 325, 702, 620], backgroundColor: ['rgba(249, 115, 22, 0.2)', 'rgba(6, 182, 212, 0.2)', 'rgb(107, 114, 128, 0.2)', 'rgba(139, 92, 246, 0.2)'], borderColor: ['rgb(249, 115, 22)', 'rgb(6, 182, 212)', 'rgb(107, 114, 128)', 'rgb(139, 92, 246)'], borderWidth: 1 } ] }; }, setChartOptions() { const documentStyle = getComputedStyle(document.documentElement); const textColor = documentStyle.getPropertyValue('--text-color'); const textColorSecondary = documentStyle.getPropertyValue('--text-color-secondary'); const surfaceBorder = documentStyle.getPropertyValue('--surface-border'); return { plugins: { legend: { labels: { color: textColor } } }, scales: { x: { ticks: { color: textColorSecondary }, grid: { color: surfaceBorder } }, y: { beginAtZero: true, ticks: { color: textColorSecondary }, grid: { color: surfaceBorder } } } }; } } }; <\/script> `, composition: ` <template> <div class="card"> <Chart type="bar" :data="chartData" :options="chartOptions" /> </div> </template> <script setup> import { ref, onMounted } from "vue"; onMounted(() => { chartData.value = setChartData(); chartOptions.value = setChartOptions(); }); const chartData = ref(); const chartOptions = ref(); const setChartData = () => { return { labels: ['Q1', 'Q2', 'Q3', 'Q4'], datasets: [ { label: 'Sales', data: [540, 325, 702, 620], backgroundColor: ['rgba(249, 115, 22, 0.2)', 'rgba(6, 182, 212, 0.2)', 'rgb(107, 114, 128, 0.2)', 'rgba(139, 92, 246 0.2)'], borderColor: ['rgb(249, 115, 22)', 'rgb(6, 182, 212)', 'rgb(107, 114, 128)', 'rgb(139, 92, 246)'], borderWidth: 1 } ] }; }; const setChartOptions = () => { const documentStyle = getComputedStyle(document.documentElement); const textColor = documentStyle.getPropertyValue('--text-color'); const textColorSecondary = documentStyle.getPropertyValue('--text-color-secondary'); const surfaceBorder = documentStyle.getPropertyValue('--surface-border'); return { plugins: { legend: { labels: { color: textColor } } }, scales: { x: { ticks: { color: textColorSecondary }, grid: { color: surfaceBorder } }, y: { beginAtZero: true, ticks: { color: textColorSecondary }, grid: { color: surfaceBorder } } } }; } <\/script> ` } }; }, beforeUnmount() { EventBus.off('theme-change-complete', this.themeChangeListener); }, mounted() { this.chartData = this.setChartData(); this.chartOptions = this.setChartOptions(); this.themeChangeListener = () => { this.chartOptions = this.setChartOptions(); }; EventBus.on('theme-change-complete', this.themeChangeListener); }, methods: { setChartData() { return { labels: ['Q1', 'Q2', 'Q3', 'Q4'], datasets: [ { label: 'Sales', data: [540, 325, 702, 620], backgroundColor: ['rgba(249, 115, 22, 0.2)', 'rgba(6, 182, 212, 0.2)', 'rgb(107, 114, 128, 0.2)', 'rgba(139, 92, 246, 0.2)'], borderColor: ['rgb(249, 115, 22)', 'rgb(6, 182, 212)', 'rgb(107, 114, 128)', 'rgb(139, 92, 246)'], borderWidth: 1 } ] }; }, setChartOptions() { const documentStyle = getComputedStyle(document.documentElement); const textColor = documentStyle.getPropertyValue('--text-color'); const textColorSecondary = documentStyle.getPropertyValue('--text-color-secondary'); const surfaceBorder = documentStyle.getPropertyValue('--surface-border'); return { plugins: { legend: { labels: { color: textColor } } }, scales: { x: { ticks: { color: textColorSecondary }, grid: { color: surfaceBorder } }, y: { beginAtZero: true, ticks: { color: textColorSecondary }, grid: { color: surfaceBorder } } } }; } } }; </script>