Files

168 lines
5.6 KiB
Vue
Raw Permalink Normal View History

2025-09-01 16:55:20 +03:30
<script setup>
import HC from "highcharts"
import { ref, onMounted } from "vue"
2025-09-24 12:12:33 +03:30
// Props for component reusability
const props = defineProps({
title: {
type: String,
default: "The Germanic Language Tree"
},
backgroundColor: {
type: String,
default: ""
},
showBackground: {
type: Boolean,
default: true
}
})
2025-09-01 16:55:20 +03:30
const cssRGB = name => getComputedStyle(document.documentElement).getPropertyValue(name).trim()
const toHex = rgb => {
const [r,g,b] = rgb.split(",").map(v => parseInt(v,10))
const h = n => n.toString(16).padStart(2,"0")
return `#${h(r)}${h(g)}${h(b)}`
}
const toRGBA = (rgb,a=1)=>`rgba(${rgb.split(",").map(v=>parseInt(v,10)).join(",")},${a})`
const leafs = [
"Bastarnisch","Brabantian","Burgundian","Crimean Gothic","Danish",
"Dutch","English","Faroese","Flemish","Frisian","Gepidisch","Gothic",
"Herulisch","(High) German","Hollandic","Icelandic","Limburgish",
"Low German","Norwegian","Rhinelandic","Rugisch","Skirisch","Swedish",
"Vandalic","Yiddish"
].map(leaf => ({ id: leaf, color: toHex(cssRGB("--v-theme-primary")) }))
const hangingNodes = [
{ id: "North Germanic", layout: "hanging", offsetHorizontal: -15 },
{ id: "West Germanic", layout: "hanging" },
{ id: "East Germanic", layout: "hanging" }
]
const nodes = hangingNodes.concat(leafs)
onMounted(() => {
HC.setOptions({
chart: {
backgroundColor: 'transparent',
style: { fontFamily: "Inter, Segoe UI, Roboto, sans-serif" }
},
title: { style: { color: toHex(cssRGB("--v-theme-on-surface")) } },
subtitle: { style: { color: toHex(cssRGB("--v-theme-on-surface")) } },
xAxis: {
lineColor: toRGBA(cssRGB("--v-theme-grey-300"), 0.25),
tickColor: toRGBA(cssRGB("--v-theme-grey-300"), 0.25),
labels: { style: { color: toHex(cssRGB("--v-theme-on-surface")) } },
gridLineColor: toRGBA(cssRGB("--v-theme-grey-300"), 0.25)
},
yAxis: {
lineColor: toRGBA(cssRGB("--v-theme-grey-300"), 0.25),
tickColor: toRGBA(cssRGB("--v-theme-grey-300"), 0.25),
labels: { style: { color: toHex(cssRGB("--v-theme-on-surface")) } },
gridLineColor: toRGBA(cssRGB("--v-theme-grey-300"), 0.25),
title: { style: { color: toHex(cssRGB("--v-theme-on-surface")) } }
},
legend: {
itemStyle: { color: toHex(cssRGB("--v-theme-on-surface")) },
itemHoverStyle: { color: toHex(cssRGB("--v-theme-on-surface")) }
},
tooltip: {
backgroundColor: toRGBA(cssRGB("--v-theme-surface"), 0.95),
borderColor: toRGBA(cssRGB("--v-theme-grey-300"), 0.25),
style: { color: toHex(cssRGB("--v-theme-on-surface")) }
},
credits: { enabled: false }
})
})
const chartOptions = ref({
chart: { inverted: true, height: 1200, backgroundColor: 'transparent' },
2025-09-24 12:12:33 +03:30
title: { text: props.title },
2025-09-01 16:55:20 +03:30
accessibility: { point: { descriptionFormat: "{add index 1}. {toNode.id} comes from {fromNode.id}" } },
tooltip: { outside: true },
series: [{
name: "Germanic language tree",
type: "organization",
keys: ["from", "to"],
nodeWidth: 40,
nodePadding: 20,
colorByPoint: false,
hangingIndentTranslation: "cumulative",
hangingIndent: 10,
levels: [
{ level: 0, color: toHex(cssRGB("--v-theme-background")) },
{ level: 1, color: toHex(cssRGB("--v-theme-background")) },
{ level: 2, color: toHex(cssRGB("--v-theme-success")) },
{ level: 3, color: toHex(cssRGB("--v-theme-warning")) },
{ level: 4, color: toHex(cssRGB("--v-theme-primary")) }
],
nodes,
data: [
["Germanic","West Germanic"],
["West Germanic","Old English"],
["Old English","Middle English"],
["Middle English","English"],
["West Germanic","Old Frisian"],
["Old Frisian","Frisian"],
["West Germanic","Old Dutch"],
["Old Dutch","Middle Dutch"],
["Middle Dutch","Hollandic"],
["Middle Dutch","Flemish"],
["Middle Dutch","Dutch"],
["Middle Dutch","Limburgish"],
["Middle Dutch","Brabantian"],
["Middle Dutch","Rhinelandic"],
["West Germanic","Old Low German"],
["Old Low German","Middle Low German"],
["Middle Low German","Low German"],
["West Germanic","Old High German"],
["Old High German","Middle High German"],
["Middle High German","(High) German"],
["Middle High German","Yiddish"],
["Germanic","East Germanic"],
["East Germanic","Gothic"],
["East Germanic","Vandalic"],
["East Germanic","Burgundian"],
["East Germanic","Bastarnisch"],
["East Germanic","Gepidisch"],
["East Germanic","Herulisch"],
["East Germanic","Rugisch"],
["East Germanic","Skirisch"],
["East Germanic","Crimean Gothic"],
["Germanic","North Germanic"],
["North Germanic","Old Norse"],
["Old Norse","Old Icelandic"],
["Old Icelandic","Icelandic"],
["Old Norse","Old Norwegian"],
["Old Norwegian","Norwegian"],
["Old Norse","Faroese"],
["North Germanic","Old Swedish"],
["Old Swedish","Middle Swedish"],
["Middle Swedish","Swedish"],
["North Germanic","Old Danish"],
["Old Danish","Middle Danish"],
["Middle Danish","Danish"]
]
}]
})
</script>
<template>
2025-09-24 12:12:33 +03:30
<div
class="chart-container"
:style="{
backgroundColor: showBackground ? backgroundColor : 'transparent'
}"
>
2025-09-01 16:55:20 +03:30
<highcharts :options="chartOptions" />
</div>
</template>
<style scoped>
.chart-container {
padding: 16px;
min-height: 100vh;
2025-09-24 12:12:33 +03:30
border-radius: 8px;
2025-09-01 16:55:20 +03:30
}
</style>