diff --git a/packages/runtime/example/conditional-render/hidden.html b/packages/runtime/example/conditional-render/hidden.html
new file mode 100644
index 00000000..aff85bf1
--- /dev/null
+++ b/packages/runtime/example/conditional-render/hidden.html
@@ -0,0 +1,79 @@
+
+
+
+
+
+ meta-ui runtime example: hidden trait
+
+
+
+
+
+
diff --git a/packages/runtime/src/traits/core/hidden.tsx b/packages/runtime/src/traits/core/hidden.tsx
new file mode 100644
index 00000000..c42f3b0a
--- /dev/null
+++ b/packages/runtime/src/traits/core/hidden.tsx
@@ -0,0 +1,47 @@
+import React from "react";
+import { createTrait } from "@meta-ui/core";
+import { Static, Type } from "@sinclair/typebox";
+import { TraitImplementation } from "../../registry";
+import { useExpression } from "../../store";
+
+type HiddenProps = {
+ hidden: Static;
+};
+
+const Hidden: React.FC = ({ hidden: _hidden, children }) => {
+ const hidden = useExpression(_hidden.toString());
+ if (hidden) {
+ return null;
+ }
+ return <>{children}>;
+};
+
+const useHiddenState: TraitImplementation = ({ hidden }) => {
+ return {
+ props: null,
+ component: (props) => ,
+ };
+};
+
+const HiddenPropertySchema = Type.Union([Type.Boolean(), Type.String()]);
+
+export default {
+ ...createTrait({
+ version: "core/v1",
+ metadata: {
+ name: "hidden",
+ description: "render component with condition",
+ },
+ spec: {
+ properties: [
+ {
+ name: "hidden",
+ ...HiddenPropertySchema,
+ },
+ ],
+ state: {},
+ methods: [],
+ },
+ }),
+ impl: useHiddenState,
+};