From a6f6b5bb15487b7f9b3022751fc920774f057a40 Mon Sep 17 00:00:00 2001 From: Patrick Mulligan Date: Thu, 30 Jul 2026 20:54:30 +0200 Subject: [PATCH] feat(deck): add spend-breakdown slide and refine balances MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a "Where the money went" slide after the cash-over-time chart, using a bar chart of expenses by category (salaries, materials, operations, contributed equity, fuel) sourced from the ledger — it answers the obvious "where did the burn go?" question the cash curve leaves open. Rework the balances slide into two labelled zones (Liabilities the collective owes vs Equity claims on it) with a divider and larger type, rather than a proportional chart that would render a $65 balance invisible next to $100k. Also fix BarChart value labels: an absent Vue Boolean prop casts to false, so the old `showValues !== false` guard always hid the amounts — inverted to `hideValues`. Rename Waterfall -> WaterfallChart for the multi-word lint rule and enlarge chart type for projector readability. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/features/deck/components/BarChart.vue | 18 ++-- .../{Waterfall.vue => WaterfallChart.vue} | 0 src/features/deck/slides/07-Spend.vue | 37 +++++++++ src/features/deck/slides/08-Balances.vue | 53 ------------ .../slides/{07-Servers.vue => 08-Servers.vue} | 0 src/features/deck/slides/09-Balances.vue | 82 +++++++++++++++++++ .../{09-Snapshot.vue => 10-Snapshot.vue} | 4 +- .../deck/slides/{10-App.vue => 11-App.vue} | 0 .../slides/{11-Value.vue => 12-Value.vue} | 0 .../deck/slides/{12-Fava.vue => 13-Fava.vue} | 0 src/features/deck/slides/index.ts | 14 ++-- 11 files changed, 139 insertions(+), 69 deletions(-) rename src/features/deck/components/{Waterfall.vue => WaterfallChart.vue} (100%) create mode 100644 src/features/deck/slides/07-Spend.vue delete mode 100644 src/features/deck/slides/08-Balances.vue rename src/features/deck/slides/{07-Servers.vue => 08-Servers.vue} (100%) create mode 100644 src/features/deck/slides/09-Balances.vue rename src/features/deck/slides/{09-Snapshot.vue => 10-Snapshot.vue} (90%) rename src/features/deck/slides/{10-App.vue => 11-App.vue} (100%) rename src/features/deck/slides/{11-Value.vue => 12-Value.vue} (100%) rename src/features/deck/slides/{12-Fava.vue => 13-Fava.vue} (100%) diff --git a/src/features/deck/components/BarChart.vue b/src/features/deck/components/BarChart.vue index e3c2fdf..7fa1e90 100644 --- a/src/features/deck/components/BarChart.vue +++ b/src/features/deck/components/BarChart.vue @@ -2,24 +2,26 @@ import { computed } from 'vue' import { palette, money } from '../data' +// Note: Vue casts an absent Boolean prop to `false`, so a "showValues" default +// of true isn't possible without a runtime default — invert it to hideValues. const props = defineProps<{ items: readonly { label: string; amount: number; color: string }[] - showValues?: boolean + hideValues?: boolean }>() const max = computed(() => Math.max(...props.items.map((i) => i.amount), 1))