+ {surface.size && }
+
+
+ {surface.type}#{surface.id}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/tabletop/src/surfaces/SurfacePlane.tsx b/packages/tabletop/src/surfaces/SurfacePlane.tsx
new file mode 100644
index 0000000..64feb20
--- /dev/null
+++ b/packages/tabletop/src/surfaces/SurfacePlane.tsx
@@ -0,0 +1,24 @@
+/**
+ * `SurfacePlane` — a visible table surface.
+ *
+ * A flat rectangle at the surface's reference `size` (mm, converted to world
+ * units), centered on the mount anchor. Gives the parts a scale reference and
+ * reads as the table the game is played on. Rendered only when `showSurface`
+ * is enabled.
+ */
+import type { Surface } from '@tts/bgm';
+import { MM_TO_WORLD } from '../part.js';
+
+export function SurfacePlane({ surface }: { surface: Surface }) {
+ if (!surface.size) return null;
+ const [w, h] = surface.size;
+ const width = w * MM_TO_WORLD;
+ const height = h * MM_TO_WORLD;
+
+ return (
+