aboutsummaryrefslogtreecommitdiff
path: root/src/components/BaseLine.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/BaseLine.vue')
-rw-r--r--src/components/BaseLine.vue39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/components/BaseLine.vue b/src/components/BaseLine.vue
index f0008f9..bde2e56 100644
--- a/src/components/BaseLine.vue
+++ b/src/components/BaseLine.vue
@@ -1,21 +1,28 @@
<template>
-<div class="bg-stone-900 text-stone-50 flex" :class="{'flex-col': vert}">
+<div class="bg-stone-900 text-stone-50 flex relative" :class="{'flex-col': vert}">
<div v-for="p in periods" :key="p.label" :style="periodStyles(p)">
<div :style="labelStyles">{{p.label}}</div>
</div>
+ <TransitionGroup name="fade">
+ <div v-for="d in timelineData" :key="d.id"
+ class="absolute bg-yellow-200/50" :style="spanStyles(d)">
+ {{d.id}}
+ </div>
+ </TransitionGroup>
</div>
</template>
<script setup lang="ts">
-import {ref, computed, PropType} from 'vue';
+import {ref, computed} from 'vue';
+import {MIN_DATE, MAX_DATE} from '../lib';
// Props
const props = defineProps({
vert: {type: Boolean, required: true},
- timelineData: {type: Object as PropType<number[][]>, required: true},
+ timelineData: {type: Object, required: true},
});
-// Time periods to represent
+// Static time periods to represent
const periods = ref([
{label: 'One', len: 1},
{label: 'Two', len: 2},
@@ -35,4 +42,28 @@ const labelStyles = computed(() => ({
width: props.vert ? '40px' : 'auto',
padding: props.vert ? '0' : '4px',
}));
+function spanStyles(d){
+ let styles: Record<string,string>;
+ let beforeFrac = Math.max(0, (d.start - MIN_DATE) / (MAX_DATE - MIN_DATE)); // Clip at zero due to end-padding
+ let lenFrac = Math.min(1 - beforeFrac, (d.end - d.start) / (MAX_DATE - MIN_DATE));
+ if (props.vert){
+ styles = {
+ top: beforeFrac * 100 + '%',
+ left: 0,
+ height: lenFrac * 100 + '%',
+ width: '100%',
+ }
+ } else {
+ styles = {
+ top: 0,
+ left: beforeFrac * 100 + '%',
+ height: '100%',
+ width: lenFrac * 100 + '%',
+ }
+ }
+ return {
+ ...styles,
+ transition: 'all 300ms ease-out',
+ };
+}
</script>