diff --git a/.cursorrules b/.cursorrules
index 382fabb9e..28262014c 100644
--- a/.cursorrules
+++ b/.cursorrules
@@ -55,6 +55,30 @@ This is a React + TypeScript application for building and running Machine Learni
- Common spacing/layout patterns → Suggest utility classes or component abstractions
- Similar form field styling → Create form field components
+### UI Primitives (Prefer Over Raw HTML)
+
+**Always prefer our UI primitives over raw HTML elements:**
+
+- **Layout**: Use `BlockStack` and `InlineStack` from `@/components/ui/layout` instead of `
`
+ - `BlockStack` = vertical flex (`flex-col`)
+ - `InlineStack` = horizontal flex (`flex-row`)
+ - Both support `gap`, `align`, `blockAlign` props
+ - Use `as` prop for semantic elements: ``, ``
+
+- **Typography**: Use `Text` from `@/components/ui/typography` instead of raw ``, `
`, ``, `
`, `
`
+ - `` instead of `
`
+ - `` instead of `
`
+ - `` instead of `
`
+ - Supports: `as`, `size`, `weight`, `tone`, `font` props
+
+- **Buttons**: Use `Button` from `@/components/ui/button`
+- **Icons**: Use `Icon` from `@/components/ui/icon`
+
+**When raw HTML is acceptable:**
+- Semantic elements not supported by primitives (e.g., `
`, `
`, ``, `
`)
+- Complex layouts where primitives don't fit
+- Performance-critical sections where abstraction overhead matters
+
### State Management
- Use Tanstack Query for server state
@@ -202,6 +226,7 @@ export const useContext = () => {
- Don't create side effects in render functions
- Don't use barrel exports
- Don't modify componentSpec structure without express permission
+- Don't use raw HTML elements when UI primitives exist (use `Text`, `BlockStack`, `InlineStack`, etc.)
## Other rules
diff --git a/src/components/Editor/PipelineDetails.tsx b/src/components/Editor/PipelineDetails.tsx
index e26529a56..e344af60b 100644
--- a/src/components/Editor/PipelineDetails.tsx
+++ b/src/components/Editor/PipelineDetails.tsx
@@ -7,6 +7,7 @@ import { CopyText } from "@/components/shared/CopyText/CopyText";
import { Button } from "@/components/ui/button";
import { Icon } from "@/components/ui/icon";
import { BlockStack, InlineStack } from "@/components/ui/layout";
+import { Text } from "@/components/ui/typography";
import useToastNotification from "@/hooks/useToastNotification";
import { useComponentSpec } from "@/providers/ComponentSpecProvider";
import { useContextPanel } from "@/providers/ContextPanelProvider";
@@ -145,85 +146,108 @@ const PipelineDetails = () => {
/>
- {/* General Metadata */}
-
-
- {fileMeta.createdBy && (
-
- Created by:{" "}
- {fileMeta.createdBy}
-
- )}
-
-
- {fileMeta.creationTime && (
-
- Created at:{" "}
- {new Date(fileMeta.creationTime).toLocaleString()}
-
- )}
- {fileMeta.modificationTime && (
-
- Last updated:{" "}
- {new Date(fileMeta.modificationTime).toLocaleString()}
-