-

-
Macroplan
-
- A week-granular, learning-oriented view of the features a team has
- committed to deliver.
+
-
+
+
+
+
+
+
+
+ {{ plan.title }}
+
+ Nothing to render yet — fix the source on the left.
+
+
+
diff --git a/src/components/MacroplanGrid.vue b/src/components/MacroplanGrid.vue
new file mode 100644
index 0000000..e65959e
--- /dev/null
+++ b/src/components/MacroplanGrid.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
diff --git a/src/components/PlanEditor.vue b/src/components/PlanEditor.vue
new file mode 100644
index 0000000..e12b839
--- /dev/null
+++ b/src/components/PlanEditor.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
diff --git a/src/composables/useMacroplan.ts b/src/composables/useMacroplan.ts
new file mode 100644
index 0000000..682c1e0
--- /dev/null
+++ b/src/composables/useMacroplan.ts
@@ -0,0 +1,50 @@
+import { ref, computed, watch } from 'vue'
+import { parseMacroplan } from '../model/parse'
+import { buildPlan } from '../model/plan'
+import type { Plan } from '../model/types'
+import { SAMPLE_PLAN } from '../data/sample'
+
+const STORAGE_KEY = 'macroplan:source'
+
+/**
+ * Authoring state for a single Macroplan: the TOML source (autosaved to
+ * localStorage), the parsed Plan, and the current parse error. The last
+ * successfully-parsed Plan keeps rendering through transient typos (F3).
+ */
+export function useMacroplan() {
+ const source = ref(localStorage.getItem(STORAGE_KEY) ?? SAMPLE_PLAN)
+ const lastGood = ref