diff --git a/src/components/CostRow.jsx b/src/components/CostRow.jsx
new file mode 100644
index 0000000..cdd2dca
--- /dev/null
+++ b/src/components/CostRow.jsx
@@ -0,0 +1,28 @@
+// CostRow.jsx — OTIVM-IV
+// Renders one cost line within a cost table.
+// Used by Section.jsx type "cost-table".
+//
+// Props:
+// label — cost item name (e.g. 'OTIVM access')
+// amount — amount string (e.g. '2.00 dn')
+// period — period label (e.g. 'per otium cycle')
+// source — academic source or 'simulator calibration'
+// conf — confidence: HIGH | MEDIUM | LOW
+// debit — boolean, true = red (outgoing), false = green (incoming)
+
+export default function CostRow({ label, amount, period, source, conf, debit = true }) {
+ return (
+
+ |
+ {label}
+ {period && {period} }
+ |
+
+ {debit ? '−' : '+'}{amount}
+ |
+
+ {source} · {conf}
+ |
+
+ )
+}
diff --git a/src/components/DriftEntry.jsx b/src/components/DriftEntry.jsx
new file mode 100644
index 0000000..ce6c75e
--- /dev/null
+++ b/src/components/DriftEntry.jsx
@@ -0,0 +1,26 @@
+// DriftEntry.jsx — OTIVM-IV
+// Renders one entry from parameter_drift_log.
+// Used by Section.jsx type "drift-log".
+//
+// Props:
+// param — parameter display name (e.g. 'Liquiditas')
+// delta — change string (e.g. '+12' or '−8')
+// trigger — trigger_type from drift log
+// (dispatch_cost | venture_complete | interval_complete |
+// otium_access_fee | personal_maintenance | officia_obligation |
+// exchange_complete)
+// note — delta_note from drift log (e.g. 'Olive route')
+// positive — boolean, true = green delta, false = red delta
+
+export default function DriftEntry({ param, delta, trigger, note, positive }) {
+ return (
+
+
+ {param}
+ {delta}
+
+
{trigger}
+ {note &&
{note}
}
+
+ )
+}
diff --git a/src/components/ParameterRow.jsx b/src/components/ParameterRow.jsx
new file mode 100644
index 0000000..8878aae
--- /dev/null
+++ b/src/components/ParameterRow.jsx
@@ -0,0 +1,43 @@
+// ParameterRow.jsx — OTIVM-IV
+// Renders one row from actor_parameters.
+// Used by Section.jsx type "parameter-list".
+//
+// Props:
+// token — parameter_token string (e.g. 'liquiditas')
+// name — display name (e.g. 'Capital')
+// true_val — value_true from actor_parameters
+// perceived — value_perceived from actor_parameters
+// conf — confidence_tag (measured|indicated|inferred|estimated|unknown)
+//
+// Shows a gap indicator when true_val !== perceived.
+// Band colour is derived from perceived value.
+
+export default function ParameterRow({ token, name, true_val, perceived, conf }) {
+ const gap = true_val !== perceived
+
+ return (
+
+
+
+
{perceived}
+ {gap && (
+
+ true: {true_val}
+
+ )}
+
{conf}
+
+
+ )
+}
+
+function bandClass(val) {
+ if (!val) return 'otivm-band-low'
+ const v = val.toLowerCase()
+ if (v === 'high' || v === 'distinguished') return 'otivm-band-high'
+ if (v === 'medium' || v === 'neutral') return 'otivm-band-medium'
+ return 'otivm-band-low'
+}