diff --git a/apps/widget-builder/src/components/widget-components/badge.tsx b/apps/widget-builder/src/components/widget-components/badge.tsx index 1f2d718..e2ef988 100644 --- a/apps/widget-builder/src/components/widget-components/badge.tsx +++ b/apps/widget-builder/src/components/widget-components/badge.tsx @@ -32,9 +32,15 @@ const Base = cva( export interface BadgeProps extends React.HTMLAttributes, VariantProps { children: React.ReactNode; + hidden?: boolean; } -const Badge = React.forwardRef(({ className, variant, size, ...props }, ref) => { +const Badge = React.forwardRef(({ className, variant, size, hidden, ...props }, ref) => { + // Return null if hidden is true + if (hidden) { + return null; + } + return
; }); Badge.displayName = "Badge"; @@ -60,6 +66,12 @@ const BadgeDefinition: ComponentDefinition = { type: "React.ReactNode", description: "Content to display inside the badge.", }, + { + name: "hidden", + type: "boolean", + required: false, + description: "When true, hides the component by returning null.", + }, ], category: "Display", usage: `New`, diff --git a/apps/widget-builder/src/components/widget-components/box.tsx b/apps/widget-builder/src/components/widget-components/box.tsx index ba6092e..bd31495 100644 --- a/apps/widget-builder/src/components/widget-components/box.tsx +++ b/apps/widget-builder/src/components/widget-components/box.tsx @@ -17,6 +17,7 @@ import { Shrink, Margin, Gap, + Hidden, } from "./variants"; const Variants = variants({ @@ -31,6 +32,7 @@ const Variants = variants({ grow: Grow, shrink: Shrink, gap: Gap, + hidden: Hidden, }); export interface BoxProps extends React.HTMLAttributes, VariantsProps { @@ -55,10 +57,16 @@ const Box = React.forwardRef( grow, shrink, gap, + hidden, ...props }, ref ) => { + // Return null if hidden is true + if (hidden) { + return null; + } + // Merge with existing style prop const [variantClasses, variantStyles] = Variants.format({ size, diff --git a/apps/widget-builder/src/components/widget-components/col.tsx b/apps/widget-builder/src/components/widget-components/col.tsx index bac4855..2769d19 100644 --- a/apps/widget-builder/src/components/widget-components/col.tsx +++ b/apps/widget-builder/src/components/widget-components/col.tsx @@ -18,6 +18,7 @@ import { Grow, Shrink, Gap, + Hidden, } from "./variants"; const Base = cva("flex flex-col", { @@ -37,6 +38,7 @@ const Variants = variants({ gap: Gap, minWidth: MinWidth, minHeight: MinHeight, + hidden: Hidden, }); export interface ColProps extends React.HTMLAttributes, VariantsProps { @@ -60,10 +62,16 @@ const Col = React.forwardRef( gap, minWidth, minHeight, + hidden, ...props }, ref ) => { + // Return null if hidden is true + if (hidden) { + return null; + } + const [variantClasses, variantStyles] = Variants.format({ align, padding, diff --git a/apps/widget-builder/src/components/widget-components/image.tsx b/apps/widget-builder/src/components/widget-components/image.tsx index e974409..1a96285 100644 --- a/apps/widget-builder/src/components/widget-components/image.tsx +++ b/apps/widget-builder/src/components/widget-components/image.tsx @@ -4,7 +4,7 @@ import React from "react"; import { cn } from "@/lib/utils"; -import { variants, Margin, Radius, Size, VariantsProps } from "./variants"; +import { variants, Margin, Radius, Size, VariantsProps, Hidden } from "./variants"; const Base = cva("object-cover", { @@ -41,6 +41,7 @@ const Variants = variants({ radius: Radius, margin: Margin, size: Size, + hidden: Hidden, }); export interface ImageProps @@ -51,9 +52,14 @@ export interface ImageProps } const Image = React.forwardRef( - ({ className, style, fit, aspect, position, fallback, radius, margin, size, onError, ...props }, ref) => { + ({ className, style, fit, aspect, position, fallback, radius, margin, size, hidden, onError, ...props }, ref) => { const [imageError, setImageError] = React.useState(false); + // Return null if hidden is true + if (hidden) { + return null; + } + const handleError = (e: React.SyntheticEvent) => { setImageError(true); onError?.(e); diff --git a/apps/widget-builder/src/components/widget-components/row.tsx b/apps/widget-builder/src/components/widget-components/row.tsx index 8fc4eca..e001a67 100644 --- a/apps/widget-builder/src/components/widget-components/row.tsx +++ b/apps/widget-builder/src/components/widget-components/row.tsx @@ -21,6 +21,7 @@ import { Grow, Shrink, Margin, + Hidden, } from "./variants"; const Base = cva("flex flex-row", { @@ -43,6 +44,7 @@ const Variants = variants({ width: Width, height: Height, size: Size, + hidden: Hidden, }); export interface RowProps extends React.HTMLAttributes, VariantsProps { @@ -69,10 +71,16 @@ const Row = React.forwardRef( width, height, size, + hidden, ...props }, ref ) => { + // Return null if hidden is true + if (hidden) { + return null; + } + const [variantClasses, variantStyles] = Variants.format({ align, justify, diff --git a/apps/widget-builder/src/components/widget-components/variants/hidden.ts b/apps/widget-builder/src/components/widget-components/variants/hidden.ts new file mode 100644 index 0000000..01d7769 --- /dev/null +++ b/apps/widget-builder/src/components/widget-components/variants/hidden.ts @@ -0,0 +1,22 @@ +import { Variant } from "./types"; + +export interface HiddenProps { + hidden?: boolean; +} + +// Hidden variant +export const Hidden: Variant = { + variant: {}, + + definition: { + name: "hidden", + type: "boolean", + required: false, + description: "When true, hides the component by returning null.", + }, + + format: (): string | [string, React.CSSProperties] => { + // Hidden is handled in the component logic, not through CSS + return ""; + }, +}; diff --git a/apps/widget-builder/src/components/widget-components/variants/index.ts b/apps/widget-builder/src/components/widget-components/variants/index.ts index 8d4404f..e151296 100644 --- a/apps/widget-builder/src/components/widget-components/variants/index.ts +++ b/apps/widget-builder/src/components/widget-components/variants/index.ts @@ -11,6 +11,7 @@ export * from "./radius"; export * from "./background"; export * from "./border"; export * from "./flex"; +export * from "./hidden"; /** * Utility to combine multiple variant to a single object diff --git a/apps/widget-builder/src/pages/gallery/widgets/email-preview.ts b/apps/widget-builder/src/pages/gallery/widgets/email-preview.ts index 2d84350..518b533 100644 --- a/apps/widget-builder/src/pages/gallery/widgets/email-preview.ts +++ b/apps/widget-builder/src/pages/gallery/widgets/email-preview.ts @@ -12,7 +12,7 @@ export const emailPreview: Omit = { /> {data.sender.name} - {data.unread && New} + {data.sender.email} diff --git a/apps/widget-builder/src/pages/gallery/widgets/social-media-post.ts b/apps/widget-builder/src/pages/gallery/widgets/social-media-post.ts index b47e6da..736c881 100644 --- a/apps/widget-builder/src/pages/gallery/widgets/social-media-post.ts +++ b/apps/widget-builder/src/pages/gallery/widgets/social-media-post.ts @@ -22,12 +22,13 @@ export const socialMediaPost: Omit = { {data.content} - {data.image && } + hidden={!data.image} + />