New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

@tapstack/siteio-react-sdk

Package Overview
Dependencies
Maintainers
3
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@tapstack/siteio-react-sdk - npm Package Compare versions

Comparing version
0.0.8
to
0.0.10
+36
-3
dist/index.d.mts
import * as react_jsx_runtime from 'react/jsx-runtime';
import * as react from 'react';
import * as React$1 from 'react';

@@ -160,3 +160,3 @@ interface BaseBlock {

}
declare const PreviewBlockRenderer: react.ForwardRefExoticComponent<Omit<PreviewBlockRendererProps, "ref"> & react.RefAttributes<HTMLElement>>;
declare const PreviewBlockRenderer: React$1.ForwardRefExoticComponent<Omit<PreviewBlockRendererProps, "ref"> & React$1.RefAttributes<HTMLElement>>;

@@ -170,2 +170,35 @@ interface FetchProjectOptions {

export { type BaseBlock, type Block, type BooleanExpression, type BooleanOperand, type ComparisonOperator, type ComparisonType, type Component, type ComponentBlock, type ComponentData, type ComponentRegistry, type DefaultComponentBlock, type ElementBlock, type FieldOperand, type LogicalOperatorType, type NAryLogicalOperator, type PageData, PreviewBlockRenderer, type ProjectData, type ProjectStyles, RewebProject, type RewebProjectProps, type RewebSDKConfig, type TextBlock, type Theme, type ThemeItem, type ValueOperand, fetchProject };
interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
asChild?: boolean;
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
size?: "default" | "sm" | "lg" | "icon";
}
declare const Button: React$1.ForwardRefExoticComponent<ButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
declare const Card: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardHeader: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardTitle: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardDescription: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardContent: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardFooter: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
interface BadgeProps extends React$1.HTMLAttributes<HTMLDivElement> {
variant?: "default" | "secondary" | "destructive" | "outline";
}
declare function Badge({ className, variant, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
declare const Input: React$1.ForwardRefExoticComponent<React$1.InputHTMLAttributes<HTMLInputElement> & React$1.RefAttributes<HTMLInputElement>>;
declare const Label: React$1.ForwardRefExoticComponent<React$1.LabelHTMLAttributes<HTMLLabelElement> & React$1.RefAttributes<HTMLLabelElement>>;
interface SeparatorProps extends React$1.HTMLAttributes<HTMLDivElement> {
orientation?: "horizontal" | "vertical";
decorative?: boolean;
}
declare const Separator: React$1.ForwardRefExoticComponent<SeparatorProps & React$1.RefAttributes<HTMLDivElement>>;
declare const Avatar: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLSpanElement> & React$1.RefAttributes<HTMLSpanElement>>;
declare const AvatarImage: React$1.ForwardRefExoticComponent<React$1.ImgHTMLAttributes<HTMLImageElement> & React$1.RefAttributes<HTMLImageElement>>;
declare const AvatarFallback: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLSpanElement> & React$1.RefAttributes<HTMLSpanElement>>;
export { Avatar, AvatarFallback, AvatarImage, Badge, type BaseBlock, type Block, type BooleanExpression, type BooleanOperand, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type ComparisonOperator, type ComparisonType, type Component, type ComponentBlock, type ComponentData, type ComponentRegistry, type DefaultComponentBlock, type ElementBlock, type FieldOperand, Input, Label, type LogicalOperatorType, type NAryLogicalOperator, type PageData, PreviewBlockRenderer, type ProjectData, type ProjectStyles, RewebProject, type RewebProjectProps, type RewebSDKConfig, Separator, type TextBlock, type Theme, type ThemeItem, type ValueOperand, fetchProject };
import * as react_jsx_runtime from 'react/jsx-runtime';
import * as react from 'react';
import * as React$1 from 'react';

@@ -160,3 +160,3 @@ interface BaseBlock {

}
declare const PreviewBlockRenderer: react.ForwardRefExoticComponent<Omit<PreviewBlockRendererProps, "ref"> & react.RefAttributes<HTMLElement>>;
declare const PreviewBlockRenderer: React$1.ForwardRefExoticComponent<Omit<PreviewBlockRendererProps, "ref"> & React$1.RefAttributes<HTMLElement>>;

@@ -170,2 +170,35 @@ interface FetchProjectOptions {

export { type BaseBlock, type Block, type BooleanExpression, type BooleanOperand, type ComparisonOperator, type ComparisonType, type Component, type ComponentBlock, type ComponentData, type ComponentRegistry, type DefaultComponentBlock, type ElementBlock, type FieldOperand, type LogicalOperatorType, type NAryLogicalOperator, type PageData, PreviewBlockRenderer, type ProjectData, type ProjectStyles, RewebProject, type RewebProjectProps, type RewebSDKConfig, type TextBlock, type Theme, type ThemeItem, type ValueOperand, fetchProject };
interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
asChild?: boolean;
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
size?: "default" | "sm" | "lg" | "icon";
}
declare const Button: React$1.ForwardRefExoticComponent<ButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
declare const Card: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardHeader: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardTitle: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardDescription: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardContent: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
declare const CardFooter: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
interface BadgeProps extends React$1.HTMLAttributes<HTMLDivElement> {
variant?: "default" | "secondary" | "destructive" | "outline";
}
declare function Badge({ className, variant, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
declare const Input: React$1.ForwardRefExoticComponent<React$1.InputHTMLAttributes<HTMLInputElement> & React$1.RefAttributes<HTMLInputElement>>;
declare const Label: React$1.ForwardRefExoticComponent<React$1.LabelHTMLAttributes<HTMLLabelElement> & React$1.RefAttributes<HTMLLabelElement>>;
interface SeparatorProps extends React$1.HTMLAttributes<HTMLDivElement> {
orientation?: "horizontal" | "vertical";
decorative?: boolean;
}
declare const Separator: React$1.ForwardRefExoticComponent<SeparatorProps & React$1.RefAttributes<HTMLDivElement>>;
declare const Avatar: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLSpanElement> & React$1.RefAttributes<HTMLSpanElement>>;
declare const AvatarImage: React$1.ForwardRefExoticComponent<React$1.ImgHTMLAttributes<HTMLImageElement> & React$1.RefAttributes<HTMLImageElement>>;
declare const AvatarFallback: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLSpanElement> & React$1.RefAttributes<HTMLSpanElement>>;
export { Avatar, AvatarFallback, AvatarImage, Badge, type BaseBlock, type Block, type BooleanExpression, type BooleanOperand, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type ComparisonOperator, type ComparisonType, type Component, type ComponentBlock, type ComponentData, type ComponentRegistry, type DefaultComponentBlock, type ElementBlock, type FieldOperand, Input, Label, type LogicalOperatorType, type NAryLogicalOperator, type PageData, PreviewBlockRenderer, type ProjectData, type ProjectStyles, RewebProject, type RewebProjectProps, type RewebSDKConfig, Separator, type TextBlock, type Theme, type ThemeItem, type ValueOperand, fetchProject };
'use strict';
var react = require('react');
var React2 = require('react');
var LucideIcons = require('lucide-react');

@@ -27,2 +27,3 @@ var jsxRuntime = require('react/jsx-runtime');

var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
var LucideIcons__namespace = /*#__PURE__*/_interopNamespace(LucideIcons);

@@ -42,3 +43,5 @@

"Content-Type": "application/json"
}
},
cache: "no-store"
// Disable caching for real-time updates
});

@@ -51,3 +54,3 @@ if (!response.ok) {

}
var Icon = react.forwardRef(
var Icon = React2.forwardRef(
({ name, size = 24, className, strokeWidth, ...props }, ref) => {

@@ -72,2 +75,179 @@ const IconComponent = LucideIcons__namespace[name];

Icon.displayName = "Icon";
function cn(...inputs) {
return tailwindMerge.twMerge(clsx.clsx(inputs));
}
var Button = React2__namespace.forwardRef(
({
className,
variant = "default",
size = "default",
asChild = false,
...props
}, ref) => {
const baseStyles = "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0";
const variants = {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline"
};
const sizes = {
default: "h-10 px-4 py-2",
sm: "h-9 rounded-md px-3",
lg: "h-11 rounded-md px-8",
icon: "h-10 w-10"
};
return /* @__PURE__ */ jsxRuntime.jsx(
"button",
{
className: cn(baseStyles, variants[variant], sizes[size], className),
ref,
...props
}
);
}
);
Button.displayName = "Button";
var Card = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"div",
{
ref,
className: cn(
"rounded-lg border bg-card text-card-foreground shadow-sm",
className
),
...props
}
));
Card.displayName = "Card";
var CardHeader = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"div",
{
ref,
className: cn("flex flex-col space-y-1.5 p-6", className),
...props
}
));
CardHeader.displayName = "CardHeader";
var CardTitle = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"div",
{
ref,
className: cn(
"text-2xl font-semibold leading-none tracking-tight",
className
),
...props
}
));
CardTitle.displayName = "CardTitle";
var CardDescription = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"div",
{
ref,
className: cn("text-sm text-muted-foreground", className),
...props
}
));
CardDescription.displayName = "CardDescription";
var CardContent = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
CardContent.displayName = "CardContent";
var CardFooter = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"div",
{
ref,
className: cn("flex items-center p-6 pt-0", className),
...props
}
));
CardFooter.displayName = "CardFooter";
function Badge({ className, variant = "default", ...props }) {
const baseStyles = "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2";
const variants = {
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
outline: "text-foreground"
};
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(baseStyles, variants[variant], className), ...props });
}
var Input = React2__namespace.forwardRef(({ className, type, ...props }, ref) => {
return /* @__PURE__ */ jsxRuntime.jsx(
"input",
{
type,
className: cn(
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className
),
ref,
...props
}
);
});
Input.displayName = "Input";
var Label = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"label",
{
ref,
className: cn(
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
className
),
...props
}
));
Label.displayName = "Label";
var Separator = React2__namespace.forwardRef(
({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"div",
{
ref,
role: decorative ? "none" : "separator",
"aria-orientation": decorative ? void 0 : orientation,
className: cn(
"shrink-0 bg-border",
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
className
),
...props
}
)
);
Separator.displayName = "Separator";
var Avatar = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"span",
{
ref,
className: cn(
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
className
),
...props
}
));
Avatar.displayName = "Avatar";
var AvatarImage = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"img",
{
ref,
className: cn("aspect-square h-full w-full", className),
...props
}
));
AvatarImage.displayName = "AvatarImage";
var AvatarFallback = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
"span",
{
ref,
className: cn(
"flex h-full w-full items-center justify-center rounded-full bg-muted",
className
),
...props
}
));
AvatarFallback.displayName = "AvatarFallback";

@@ -88,3 +268,24 @@ // src/utils/blockUtils.ts

var SDK_BUILT_IN_COMPONENTS = {
Icon
// Icons
Icon,
// Button
Button,
// Card
Card,
CardHeader,
CardFooter,
CardTitle,
CardDescription,
CardContent,
// Badge
Badge,
// Form elements
Input,
Label,
// Layout
Separator,
// Avatar
Avatar,
AvatarImage,
AvatarFallback
};

@@ -276,3 +477,2 @@ var DEFAULT_COMPONENT_TAGS = {

const {
asChild,
blurDataURL,

@@ -289,2 +489,6 @@ fill,

} = props;
const isAsChild = !!domProps?.asChild;
if (isAsChild) {
domProps["data-parent-block-id"] = block.id;
}
return {

@@ -295,6 +499,3 @@ ...domProps,

}
function cn(...inputs) {
return tailwindMerge.twMerge(clsx.clsx(inputs));
}
var PreviewChildrenRenderer = react.forwardRef(
var PreviewChildrenRenderer = React2.forwardRef(
({ block, ...restProps }, ref) => {

@@ -373,3 +574,3 @@ if (!block.children) return null;

};
var PreviewBlockRenderer = react.forwardRef(
var PreviewBlockRenderer = React2.forwardRef(
({

@@ -466,4 +667,29 @@ block,

return `
/* SiteIO Theme Variables - Global scope for CSS variable inheritance */
/* SiteIO Base Styles - Required for proper rendering */
:root {
/* Default fallback values - will be overridden by theme */
--background: 0 0% 5%;
--foreground: 0 0% 98%;
--card: 0 0% 17%;
--card-foreground: 0 0% 98%;
--popover: 0 0% 17%;
--popover-foreground: 0 0% 98%;
--primary: 217 91% 60%;
--primary-foreground: 210 40% 98%;
--secondary: 0 0% 17%;
--secondary-foreground: 0 0% 98%;
--muted: 0 0% 14.9%;
--muted-foreground: 0 0% 63.9%;
--accent: 0 0% 33%;
--accent-foreground: 0 0% 98%;
--destructive: 345 87% 53%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 15%;
--input: 0 0% 14.9%;
--ring: 0 0% 83.1%;
--radius: 0.75rem;
}
/* SiteIO Theme Variables - Override with project theme */
:root {
${styles.join("\n")}

@@ -481,2 +707,87 @@ }

}
/* SiteIO Base Element Styles */
[data-siteio-theme] {
background-color: hsl(var(--background));
color: hsl(var(--foreground));
}
/* Utility class mappings for Tailwind CDN compatibility */
.bg-background { background-color: hsl(var(--background)) !important; }
.bg-foreground { background-color: hsl(var(--foreground)) !important; }
.bg-card { background-color: hsl(var(--card)) !important; }
.bg-popover { background-color: hsl(var(--popover)) !important; }
.bg-primary { background-color: hsl(var(--primary)) !important; }
.bg-secondary { background-color: hsl(var(--secondary)) !important; }
.bg-muted { background-color: hsl(var(--muted)) !important; }
.bg-accent { background-color: hsl(var(--accent)) !important; }
.bg-destructive { background-color: hsl(var(--destructive)) !important; }
.text-foreground { color: hsl(var(--foreground)) !important; }
.text-background { color: hsl(var(--background)) !important; }
.text-card-foreground { color: hsl(var(--card-foreground)) !important; }
.text-popover-foreground { color: hsl(var(--popover-foreground)) !important; }
.text-primary { color: hsl(var(--primary)) !important; }
.text-primary-foreground { color: hsl(var(--primary-foreground)) !important; }
.text-secondary-foreground { color: hsl(var(--secondary-foreground)) !important; }
.text-muted-foreground { color: hsl(var(--muted-foreground)) !important; }
.text-accent-foreground { color: hsl(var(--accent-foreground)) !important; }
.text-destructive { color: hsl(var(--destructive)) !important; }
.text-destructive-foreground { color: hsl(var(--destructive-foreground)) !important; }
.border-border { border-color: hsl(var(--border)) !important; }
.border-input { border-color: hsl(var(--input)) !important; }
.ring-ring { --tw-ring-color: hsl(var(--ring)) !important; }
.ring-offset-background { --tw-ring-offset-color: hsl(var(--background)) !important; }
.rounded-lg { border-radius: var(--radius) !important; }
.rounded-md { border-radius: calc(var(--radius) - 2px) !important; }
.rounded-sm { border-radius: calc(var(--radius) - 4px) !important; }
/* Hover states with opacity */
.hover\\:bg-primary\\/90:hover { background-color: hsl(var(--primary) / 0.9) !important; }
.hover\\:bg-primary\\/80:hover { background-color: hsl(var(--primary) / 0.8) !important; }
.hover\\:bg-secondary\\/80:hover { background-color: hsl(var(--secondary) / 0.8) !important; }
.hover\\:bg-destructive\\/90:hover { background-color: hsl(var(--destructive) / 0.9) !important; }
.hover\\:bg-accent:hover { background-color: hsl(var(--accent)) !important; }
.hover\\:text-accent-foreground:hover { color: hsl(var(--accent-foreground)) !important; }
/* Focus visible states */
.focus-visible\\:outline-none:focus-visible { outline: 2px solid transparent; outline-offset: 2px; }
.focus-visible\\:ring-2:focus-visible {
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
.focus-visible\\:ring-ring:focus-visible { --tw-ring-color: hsl(var(--ring)); }
.focus-visible\\:ring-offset-2:focus-visible { --tw-ring-offset-width: 2px; }
/* Disabled states */
.disabled\\:opacity-50:disabled { opacity: 0.5; }
.disabled\\:pointer-events-none:disabled { pointer-events: none; }
/* Card styles */
.shadow-sm { box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); }
/* Input & Form elements */
input, textarea, select {
background-color: transparent;
border-color: hsl(var(--input));
}
/* Separator */
hr, [role="separator"] {
border-color: hsl(var(--border));
background-color: hsl(var(--border));
}
/* Button transitions */
button, [role="button"], a {
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
/* Border default */
.border { border-width: 1px; border-color: hsl(var(--border)); }
`.trim();

@@ -556,6 +867,20 @@ }

exports.Avatar = Avatar;
exports.AvatarFallback = AvatarFallback;
exports.AvatarImage = AvatarImage;
exports.Badge = Badge;
exports.Button = Button;
exports.Card = Card;
exports.CardContent = CardContent;
exports.CardDescription = CardDescription;
exports.CardFooter = CardFooter;
exports.CardHeader = CardHeader;
exports.CardTitle = CardTitle;
exports.Input = Input;
exports.Label = Label;
exports.PreviewBlockRenderer = PreviewBlockRenderer;
exports.RewebProject = RewebProject;
exports.Separator = Separator;
exports.fetchProject = fetchProject;
//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/utils/fetchProject.ts","../src/components/Icon.tsx","../src/utils/blockUtils.ts","../src/utils/booleanExpressions.ts","../src/utils/propsUtils.ts","../src/utils/cn.ts","../src/components/PreviewBlockRenderer.tsx","../src/utils/theme.ts","../src/components/RewebProject.tsx"],"names":["forwardRef","LucideIcons","jsx","twMerge","clsx","Fragment","component","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import { ProjectData } from \"../types\";\n\nexport interface FetchProjectOptions {\n projectId: string;\n token: string;\n apiUrl?: string;\n}\n\nexport async function fetchProject({\n projectId,\n token,\n apiUrl = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3000\",\n}: FetchProjectOptions): Promise<ProjectData> {\n const url = new URL(`${apiUrl}/api/project/${projectId}`);\n url.searchParams.set(\"token\", token);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(error.error || `Failed to fetch project: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n\n\n\n","import * as LucideIcons from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\ninterface IconProps {\n name: string;\n size?: number;\n className?: string;\n strokeWidth?: number;\n [key: string]: any;\n}\n\n/**\n * Dynamic icon component that renders Lucide React icons by name.\n * This allows the SDK to render any icon used in the SiteIO builder.\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(\n ({ name, size = 24, className, strokeWidth, ...props }, ref) => {\n // Get the icon component from Lucide\n const IconComponent = (LucideIcons as Record<string, any>)[name];\n\n if (!IconComponent) {\n // Return empty span if icon not found to avoid breaking the layout\n console.warn(`[SiteIO SDK] Icon \"${name}\" not found in lucide-react`);\n return <span className={className} style={{ width: size, height: size }} />;\n }\n\n return (\n <IconComponent\n ref={ref}\n size={size}\n className={className}\n strokeWidth={strokeWidth}\n {...props}\n />\n );\n },\n);\n\nIcon.displayName = \"Icon\";\n","import { Icon } from \"../components/Icon\";\nimport {\n Block,\n ElementBlock,\n DefaultComponentBlock,\n TextBlock,\n ComponentBlock,\n ComponentRegistry,\n} from \"../types\";\n\nexport function isTextBlock(block: Block): block is TextBlock {\n return block.type === \"text\";\n}\n\nexport function isElementBlock(block: Block): block is ElementBlock {\n return block.type === \"element\";\n}\n\nexport function isDefaultComponentBlock(block: Block): block is DefaultComponentBlock {\n return block.type === \"component\";\n}\n\nexport function isComponentBlock(block: Block): block is ComponentBlock {\n return block.type === \"custom-component\";\n}\n\n/**\n * Built-in SDK components that are always available.\n * These don't require the user to install any additional packages.\n */\nexport const SDK_BUILT_IN_COMPONENTS: ComponentRegistry = {\n Icon,\n};\n\n/**\n * Default fallback tags for components when no registry is provided.\n * Maps component names to semantic HTML elements.\n * Note: These are FALLBACKS - the actual styling comes from the compiled CSS.\n */\nconst DEFAULT_COMPONENT_TAGS: Record<string, keyof JSX.IntrinsicElements> = {\n Button: \"button\",\n Link: \"a\",\n Image: \"img\",\n Input: \"input\",\n Textarea: \"textarea\",\n Label: \"label\",\n Separator: \"hr\",\n Badge: \"span\",\n Card: \"div\",\n CardContent: \"div\",\n CardHeader: \"div\",\n CardTitle: \"h3\",\n CardDescription: \"p\",\n CardFooter: \"div\",\n Avatar: \"span\",\n AvatarImage: \"img\",\n AvatarFallback: \"span\",\n Table: \"table\",\n TableHeader: \"thead\",\n TableBody: \"tbody\",\n TableFooter: \"tfoot\",\n TableRow: \"tr\",\n TableHead: \"th\",\n TableCell: \"td\",\n TableCaption: \"caption\",\n};\n\nexport function getBlockCurrentClassNames(block: Block): string[] {\n const defaultClassNames = block.classNames?.default || [];\n const addedClassNames = block.classNames?.added || [];\n const removedClassNames = block.classNames?.removed || [];\n\n // Start with the default class names\n let currentClassNames = [...defaultClassNames];\n\n // Add the added class names\n currentClassNames = currentClassNames.concat(addedClassNames);\n\n // Remove the removed class names\n currentClassNames = currentClassNames.filter(\n (className) => !removedClassNames.includes(className),\n );\n\n // Return the unique set of class names\n return Array.from(new Set(currentClassNames));\n}\n\nconst VIEWPORT_HEIGHT = 900;\n\nexport function convertVhClassesToPx(classNames: string[]): string[] {\n const viewportHeight = VIEWPORT_HEIGHT;\n\n const vhUnits = [\"vh\", \"dvh\", \"svh\", \"lvh\"];\n const screenClasses = [\"h-screen\", \"h-dvh\", \"h-svh\", \"h-lvh\"];\n\n return classNames.map((className) => {\n // Handle h-screen and similar classes\n const screenMatch = screenClasses.find((sc) => className.includes(sc));\n if (screenMatch) {\n return className.replace(screenMatch, `h-[${viewportHeight}px]`);\n }\n\n // Handle percentage-based vh units\n for (const unit of vhUnits) {\n if (className.includes(unit)) {\n const match = className.match(new RegExp(`(\\\\d+)${unit}`));\n if (match) {\n const value = parseInt(match[1], 10);\n const pxValue = (value / 100) * viewportHeight;\n return className.replace(`${value}${unit}`, `${pxValue}px`);\n }\n }\n }\n\n return className;\n });\n}\n\nexport function getBlockClassnamesToApply(\n block: Block,\n options?: {\n isPreview?: boolean;\n replaceVhClasses?: boolean;\n },\n): string[] {\n const { isPreview = false, replaceVhClasses = true } = options || {};\n let currentClassNames = getBlockCurrentClassNames(block);\n\n if (isPreview) {\n const isLink = isElementBlock(block) && block.tag === \"a\";\n\n if (isLink) {\n currentClassNames = [...currentClassNames, \"cursor-pointer\"];\n }\n }\n\n if (replaceVhClasses) {\n return convertVhClassesToPx(currentClassNames);\n }\n\n return currentClassNames;\n}\n\n/**\n * Gets the tag or component to render for a block.\n *\n * @param block - The block to get the tag for\n * @param componentRegistry - Optional registry of React components\n * @returns A React component, HTML tag name, or undefined\n */\nexport function getBlockTagName(\n block: ElementBlock | DefaultComponentBlock,\n componentRegistry?: ComponentRegistry,\n): React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined {\n if (isDefaultComponentBlock(block)) {\n // First, check SDK built-in components (Icon, etc.)\n if (SDK_BUILT_IN_COMPONENTS[block.component]) {\n return SDK_BUILT_IN_COMPONENTS[block.component];\n }\n\n // Then, try to get the component from the user's registry\n if (componentRegistry && componentRegistry[block.component]) {\n return componentRegistry[block.component];\n }\n\n // Fallback to semantic HTML tags for common components\n if (DEFAULT_COMPONENT_TAGS[block.component]) {\n return DEFAULT_COMPONENT_TAGS[block.component];\n }\n\n // Last resort: render as div\n return \"div\";\n }\n\n return (block.tag as keyof JSX.IntrinsicElements) ?? \"div\";\n}\n","import { BooleanExpression, ComparisonOperator, NAryLogicalOperator } from \"../types\";\n\nexport function evaluateExpression(\n expression: BooleanExpression,\n props: Record<string, any>,\n): boolean {\n if (\"type\" in expression && (expression.type === \"and\" || expression.type === \"or\" || expression.type === \"not\")) {\n return evaluateNAryLogicalOperator(expression as NAryLogicalOperator, props);\n }\n\n if (\"type\" in expression && (expression.type === \"eq\" || expression.type === \"neq\")) {\n return evaluateComparisonOperator(expression as ComparisonOperator, props);\n }\n\n return true;\n}\n\nfunction evaluateNAryLogicalOperator(\n operator: NAryLogicalOperator,\n props: Record<string, any>,\n): boolean {\n if (operator.type === \"not\") {\n if (operator.operands.length !== 1) return true;\n return !evaluateExpression(operator.operands[0], props);\n }\n\n if (operator.type === \"and\") {\n return operator.operands.every((operand) => evaluateExpression(operand, props));\n }\n\n if (operator.type === \"or\") {\n return operator.operands.some((operand) => evaluateExpression(operand, props));\n }\n\n return true;\n}\n\nfunction evaluateComparisonOperator(\n operator: ComparisonOperator,\n props: Record<string, any>,\n): boolean {\n const leftValue = getOperandValue(operator.left, props);\n const rightValue = getOperandValue(operator.right, props);\n\n if (operator.type === \"eq\") {\n return leftValue === rightValue;\n }\n\n if (operator.type === \"neq\") {\n return leftValue !== rightValue;\n }\n\n return true;\n}\n\nfunction getOperandValue(operand: { type: string; value: any }, props: Record<string, any>): any {\n if (operand.type === \"field\") {\n return props[operand.value];\n }\n\n if (operand.type === \"value\") {\n return operand.value;\n }\n\n return undefined;\n}\n\n\n\n\n","import { Block, Component, TextBlock } from \"../types\";\nimport { isComponentBlock, isDefaultComponentBlock, isElementBlock } from \"./blockUtils\";\n\nexport interface CurrentComponent {\n id: string;\n props: Record<string, any>;\n propsConfig: Record<string, any>;\n}\n\nfunction isPropValue(value: any): boolean {\n return typeof value === \"string\" && value.startsWith(\"{{\") && value.endsWith(\"}}\");\n}\n\nfunction getPropNameFromValue(value: string): string {\n return value.slice(2, -2).trim();\n}\n\nexport function getBlockText(block: TextBlock, props?: Record<string, any>): string {\n if (block.text.startsWith(\"{\") && props) {\n const propName = block.text.slice(1, -1).replace(\"props.\", \"\");\n return props?.[propName]?.toString() || block.text;\n }\n return block.text;\n}\n\nexport function htmlToText(html: string): string {\n if (typeof window === \"undefined\") return html;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n return doc.body.textContent || \"\";\n}\n\nexport function getBlockProps(\n block: Block,\n currentComponent: CurrentComponent | null,\n): Record<string, any> {\n const props = { ...block.props };\n if (!currentComponent) return props;\n\n for (const key in props) {\n const value = props[key];\n\n // If a prop is set to the prop of a component, substitute it with the actual value of the component prop\n if (isPropValue(value)) {\n const propName = getPropNameFromValue(value);\n const componentPropValue = currentComponent.props[propName];\n\n if (componentPropValue !== undefined) {\n props[key] = componentPropValue;\n }\n }\n }\n\n return props;\n}\n\nexport function getBlockPropsToApply(\n block: Block,\n currentComponent: CurrentComponent | null,\n options?: {\n isPreview?: boolean;\n },\n): Record<string, any> {\n const { isPreview = false } = options || {};\n\n // If it's the instance of a component, the props don't need to be applied to the component block itself,\n // rather they are handled by the component block renderer.\n const props = isComponentBlock(block) ? {} : getBlockProps(block, currentComponent);\n\n if (!isPreview) {\n // If it's a Link component, set href to \"#\" so it doesn't navigate anywhere\n if (isDefaultComponentBlock(block) && block.component === \"Link\") {\n props.href = \"#\";\n } else {\n // Otherwise, just delete href (for a normal anchor tag)\n delete props.href;\n }\n\n const isButton =\n (isDefaultComponentBlock(block) && block.component === \"Button\") ||\n (isElementBlock(block) && block.tag === \"button\");\n if (isButton) {\n props.type = \"button\";\n }\n }\n\n // Remove React/Next.js-specific props that shouldn't be passed to DOM elements\n // This must happen for both preview and non-preview modes\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n asChild,\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n ...domProps\n } = props;\n\n return {\n ...domProps,\n \"data-block-id\": block.id,\n };\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n\n\n\n","import { forwardRef } from \"react\";\nimport { Block, Component, ComponentRegistry } from \"../types\";\nimport {\n isTextBlock,\n isComponentBlock,\n getBlockClassnamesToApply,\n getBlockTagName,\n} from \"../utils/blockUtils\";\nimport { evaluateExpression } from \"../utils/booleanExpressions\";\nimport {\n getBlockProps,\n getBlockPropsToApply,\n getBlockText,\n htmlToText,\n CurrentComponent,\n} from \"../utils/propsUtils\";\nimport { cn } from \"../utils/cn\";\n\ninterface PreviewBlockRendererProps {\n block: Block;\n components?: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[];\n currentComponent?: CurrentComponent | null;\n replaceVhClasses?: boolean;\n className?: string;\n /** Registry of UI components (Button, Card, etc.) for proper rendering */\n componentRegistry?: ComponentRegistry;\n [key: string]: any;\n}\n\nexport const PreviewChildrenRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n ({ block, ...restProps }, ref) => {\n if (!block.children) return null;\n\n if (block.children.length === 1) {\n return <PreviewBlockRenderer block={block.children[0]} ref={ref} {...restProps} />;\n }\n\n return (\n <>\n {block.children.map((child: Block) => (\n <PreviewBlockRenderer key={child.id} block={child} {...restProps} />\n ))}\n </>\n );\n },\n);\n\nPreviewChildrenRenderer.displayName = \"ChildrenRenderer\";\n\n/**\n * Strip props that are not valid DOM attributes.\n * This includes React-specific props, Next.js Image props, and Framer Motion animation props.\n */\nconst stripNonDomProps = (p: Record<string, any>) => {\n const {\n // React/Radix props\n asChild,\n // Next.js Image props\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n // Framer Motion animation props\n whileHover,\n whileTap,\n whileFocus,\n whileDrag,\n whileInView,\n animate,\n initial,\n exit,\n transition,\n variants,\n layout,\n layoutId,\n drag,\n dragConstraints,\n dragElastic,\n dragMomentum,\n dragTransition,\n dragPropagation,\n dragControls,\n dragListener,\n dragSnapToOrigin,\n onDrag,\n onDragStart,\n onDragEnd,\n onDirectionLock,\n onDragTransitionEnd,\n onAnimationStart,\n onAnimationComplete,\n onUpdate,\n onPan,\n onPanStart,\n onPanEnd,\n onTap,\n onTapStart,\n onTapCancel,\n onHoverStart,\n onHoverEnd,\n onViewportEnter,\n onViewportLeave,\n viewport,\n custom,\n inherit,\n // Other non-DOM props that might leak through\n motionValue,\n transformTemplate,\n ...clean\n } = p ?? {};\n return clean;\n};\n\nexport const PreviewBlockRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n (\n {\n block,\n components = [],\n currentComponent,\n replaceVhClasses = false,\n componentRegistry,\n ...rest\n },\n ref,\n ) => {\n const classNamesToApply = getBlockClassnamesToApply(block, {\n isPreview: false, // SSR mode - no preview features\n replaceVhClasses,\n });\n const className = cn(\n // If is text block, don't apply the className from the parent (with asChild), since text blocks normally can't have props at all since they're just text nodes.\n classNamesToApply,\n isTextBlock(block) ? undefined : rest?.className,\n );\n const blockProps = getBlockPropsToApply(block, currentComponent ?? null, {\n isPreview: false, // SSR mode - no preview/client-side features\n });\n\n if (block.renderCondition) {\n const shouldRender = evaluateExpression(block.renderCondition, currentComponent?.props ?? {});\n if (!shouldRender) return null;\n }\n\n if (isTextBlock(block)) {\n return <>{htmlToText(getBlockText(block, currentComponent?.props))}</>;\n }\n\n if (isComponentBlock(block)) {\n const component = components.find(\n (component: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">) =>\n component.id === block.componentId,\n );\n if (!component) return null;\n\n // For nested components, the props could be set to a prop of the outer component\n const currentComponentProps = getBlockProps(block, currentComponent ?? null);\n const innerCurrentComponent: CurrentComponent = {\n id: component.id,\n props: currentComponentProps,\n propsConfig: component.propsConfig,\n };\n\n return (\n <PreviewBlockRenderer\n block={component.blocks[0]}\n components={components}\n currentComponent={innerCurrentComponent}\n componentRegistry={componentRegistry}\n className={className}\n />\n );\n }\n\n const Tag = getBlockTagName(block, componentRegistry);\n if (!Tag) return null;\n\n const mergedProps: Record<string, any> = {\n // ...rest shouldn't be passed to text blocks because they normally can't have props at all since they're just text nodes.\n ...(isTextBlock(block) ? {} : rest),\n className,\n // blockProps Needs to be after ...rest to override the props passed from a parent component (e.g. data-block-id). (for child of asChild component)\n ...blockProps,\n ref,\n };\n\n // In SSR mode, links work normally - no client-side navigation needed\n // Remove onClick handlers that would require client-side code\n\n // Only strip non-DOM props when Tag is a real DOM element (string), not a React component\n const finalProps = typeof Tag === \"string\" ? stripNonDomProps(mergedProps) : mergedProps;\n\n if (!block.children?.length) {\n return <Tag {...finalProps} />;\n }\n\n return (\n <Tag {...finalProps}>\n <PreviewChildrenRenderer\n block={block}\n components={components}\n currentComponent={currentComponent}\n componentRegistry={componentRegistry}\n />\n </Tag>\n );\n },\n);\n\nPreviewBlockRenderer.displayName = \"BlockRenderer\";\n","import { Theme, ThemeItem } from \"../types\";\n\nexport function applyFontsToDocument(document: Document, fonts: ThemeItem[]) {\n const root = document.documentElement;\n const head = document.head;\n\n // Simple implementation - in production you'd want to handle Google Fonts and local fonts\n fonts.forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n root.style.setProperty(font.variable, fontFamily);\n });\n}\n\nexport function applyColorToDocument(document: Document, color: ThemeItem) {\n document.documentElement.style.setProperty(color.variable, color.value);\n}\n\nexport function applyBorderRadiusToDocument(document: Document, borderRadius: number) {\n document.documentElement.style.setProperty(\"--radius\", `${borderRadius}rem`);\n}\n\nexport function applyThemeToDocument(document: Document, theme: Theme) {\n applyFontsToDocument(document, Object.values(theme.fonts));\n applyBorderRadiusToDocument(document, theme.borderRadius);\n Object.values(theme.colors).forEach((color) => applyColorToDocument(document, color));\n}\n\n/**\n * Generate CSS styles for theme that can be injected into a style tag for SSR.\n * This is a pure function that works on the server.\n * Uses scoped selectors to ensure SiteIO theme variables take precedence over project theme.\n */\nexport function applyThemeToStyleTag(theme: Theme): string {\n const styles: string[] = [];\n\n // Apply fonts\n Object.values(theme.fonts).forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n styles.push(` ${font.variable}: ${fontFamily} !important;`);\n });\n\n // Apply border radius\n styles.push(` --radius: ${theme.borderRadius}rem !important;`);\n\n // Apply colors - SiteIO uses HSL format (e.g., \"250 93% 66%\")\n Object.values(theme.colors).forEach((color) => {\n styles.push(` ${color.variable}: ${color.value} !important;`);\n });\n\n // Use high specificity selectors to ensure SiteIO theme variables override consuming app\n // The [data-siteio-theme] attribute is added to the SDK wrapper element\n const scopedStyles = styles.map((s) => s.replace(\" !important\", \"\"));\n\n return `\n/* SiteIO Theme Variables - Global scope for CSS variable inheritance */\n:root {\n${styles.join(\"\\n\")}\n}\n\n/* SiteIO Theme Variables - Scoped to SDK component */\n[data-siteio-theme] {\n${styles.join(\"\\n\")}\n}\n\n/* Ensure child elements also have access to variables */\n[data-siteio-theme] * {\n${scopedStyles.join(\"\\n\")}\n}\n`.trim();\n}\n","import { fetchProject } from \"../utils/fetchProject\";\nimport { PreviewBlockRenderer } from \"./PreviewBlockRenderer\";\nimport { RewebProjectProps, Component, ProjectData } from \"../types\";\nimport { applyThemeToStyleTag } from \"../utils/theme\";\n\n/**\n * Pure SSR server component that fetches and renders project data on the server.\n * No client-side JavaScript required - works entirely in SSR mode.\n */\nexport async function RewebProject({\n projectId,\n token,\n initialPageId,\n config,\n className,\n componentRegistry,\n}: RewebProjectProps) {\n // Fetch data on the server\n let data: ProjectData;\n let error: Error | null = null;\n\n try {\n data = await fetchProject({\n projectId,\n token,\n apiUrl: config?.apiUrl,\n });\n } catch (err) {\n error = err instanceof Error ? err : new Error(\"Failed to fetch project\");\n // Return error UI - this will be rendered on server\n return (\n <div className={className}>\n <div>Error: {error.message}</div>\n </div>\n );\n }\n\n // Determine which page to render\n let currentPageId = initialPageId;\n if (!currentPageId) {\n // Find home page (url === \"/\")\n const homePage = data.pages.find((page) => page.url === \"/\");\n if (homePage) {\n currentPageId = homePage.public_id;\n } else if (data.pages.length > 0) {\n currentPageId = data.pages[0].public_id;\n }\n }\n\n const currentPage = data.pages.find((page) => page.public_id === currentPageId);\n if (!currentPage) {\n return (\n <div className={className}>\n <div>Page not found</div>\n </div>\n );\n }\n\n // Prepare components data\n const components: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[] = data.components.map(\n (component) => ({\n id: component.public_id,\n blocks: component.blocks,\n propsConfig: component.props_config,\n }),\n );\n\n // Generate theme styles for SSR\n const themeStyles = applyThemeToStyleTag(data.project.theme);\n const projectCss = data.styles?.css ?? \"\";\n\n // Debug info (visible in page source)\n const debugInfo = `\n/* SiteIO SDK Debug Info:\n * Theme colors count: ${Object.keys(data.project.theme?.colors || {}).length}\n * Project CSS length: ${projectCss.length} chars\n * Theme styles length: ${themeStyles.length} chars\n */`;\n\n return (\n <>\n {/* Inject theme styles for SSR - scoped to SiteIO component */}\n <style\n data-siteio-theme-styles\n dangerouslySetInnerHTML={{ __html: debugInfo + \"\\n\" + themeStyles }}\n />\n {projectCss ? (\n <style data-siteio-project-css dangerouslySetInnerHTML={{ __html: projectCss }} />\n ) : null}\n <div className={className} data-siteio-theme>\n {currentPage.blocks.map((block) => (\n <PreviewBlockRenderer\n key={block.id}\n block={block}\n components={components}\n componentRegistry={componentRegistry}\n />\n ))}\n </div>\n </>\n );\n}\n"]}
{"version":3,"sources":["../src/utils/fetchProject.ts","../src/components/Icon.tsx","../src/utils/cn.ts","../src/components/ui/button.tsx","../src/components/ui/card.tsx","../src/components/ui/badge.tsx","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/separator.tsx","../src/components/ui/avatar.tsx","../src/utils/blockUtils.ts","../src/utils/booleanExpressions.ts","../src/utils/propsUtils.ts","../src/components/PreviewBlockRenderer.tsx","../src/utils/theme.ts","../src/components/RewebProject.tsx"],"names":["forwardRef","LucideIcons","jsx","twMerge","clsx","React","React2","React3","React4","React5","React6","Fragment","component","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import { ProjectData } from \"../types\";\n\nexport interface FetchProjectOptions {\n projectId: string;\n token: string;\n apiUrl?: string;\n}\n\nexport async function fetchProject({\n projectId,\n token,\n apiUrl = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3000\",\n}: FetchProjectOptions): Promise<ProjectData> {\n const url = new URL(`${apiUrl}/api/project/${projectId}`);\n url.searchParams.set(\"token\", token);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n cache: \"no-store\", // Disable caching for real-time updates\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(error.error || `Failed to fetch project: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n\n\n\n","import * as LucideIcons from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\ninterface IconProps {\n name: string;\n size?: number;\n className?: string;\n strokeWidth?: number;\n [key: string]: any;\n}\n\n/**\n * Dynamic icon component that renders Lucide React icons by name.\n * This allows the SDK to render any icon used in the SiteIO builder.\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(\n ({ name, size = 24, className, strokeWidth, ...props }, ref) => {\n // Get the icon component from Lucide\n const IconComponent = (LucideIcons as Record<string, any>)[name];\n\n if (!IconComponent) {\n // Return empty span if icon not found to avoid breaking the layout\n console.warn(`[SiteIO SDK] Icon \"${name}\" not found in lucide-react`);\n return <span className={className} style={{ width: size, height: size }} />;\n }\n\n return (\n <IconComponent\n ref={ref}\n size={size}\n className={className}\n strokeWidth={strokeWidth}\n {...props}\n />\n );\n },\n);\n\nIcon.displayName = \"Icon\";\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n\n\n\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?:\n | \"default\"\n | \"destructive\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"link\";\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n },\n ref\n ) => {\n const baseStyles =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\n\n const variants: Record<string, string> = {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n };\n\n const sizes: Record<string, string> = {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n };\n\n return (\n <button\n className={cn(baseStyles, variants[variant], sizes[size], className)}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\n}\n\nfunction Badge({ className, variant = \"default\", ...props }: BadgeProps) {\n const baseStyles =\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\";\n\n const variants: Record<string, string> = {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n };\n\n return (\n <div className={cn(baseStyles, variants[variant], className)} {...props} />\n );\n}\n\nexport { Badge };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Input = React.forwardRef<\n HTMLInputElement,\n React.InputHTMLAttributes<HTMLInputElement>\n>(({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nInput.displayName = \"Input\";\n\nexport { Input };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement>\n>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n {...props}\n />\n));\nLabel.displayName = \"Label\";\n\nexport { Label };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\ninterface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n role={decorative ? \"none\" : \"separator\"}\n aria-orientation={decorative ? undefined : orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n);\nSeparator.displayName = \"Separator\";\n\nexport { Separator };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Avatar = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n));\nAvatar.displayName = \"Avatar\";\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = \"AvatarImage\";\n\nconst AvatarFallback = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import { Icon } from \"../components/Icon\";\nimport {\n Button,\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n Badge,\n Input,\n Label,\n Separator,\n Avatar,\n AvatarImage,\n AvatarFallback,\n} from \"../components/ui\";\nimport {\n Block,\n ElementBlock,\n DefaultComponentBlock,\n TextBlock,\n ComponentBlock,\n ComponentRegistry,\n} from \"../types\";\n\nexport function isTextBlock(block: Block): block is TextBlock {\n return block.type === \"text\";\n}\n\nexport function isElementBlock(block: Block): block is ElementBlock {\n return block.type === \"element\";\n}\n\nexport function isDefaultComponentBlock(\n block: Block\n): block is DefaultComponentBlock {\n return block.type === \"component\";\n}\n\nexport function isComponentBlock(block: Block): block is ComponentBlock {\n return block.type === \"custom-component\";\n}\n\n/**\n * Built-in SDK components that are always available.\n * These don't require the user to install any additional packages.\n * Includes all common UI components used in SiteIO projects.\n */\nexport const SDK_BUILT_IN_COMPONENTS: ComponentRegistry = {\n // Icons\n Icon,\n // Button\n Button,\n // Card\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n // Badge\n Badge,\n // Form elements\n Input,\n Label,\n // Layout\n Separator,\n // Avatar\n Avatar,\n AvatarImage,\n AvatarFallback,\n};\n\n/**\n * Default fallback tags for components when no registry is provided.\n * Maps component names to semantic HTML elements.\n * Note: These are FALLBACKS - the actual styling comes from the compiled CSS.\n */\nconst DEFAULT_COMPONENT_TAGS: Record<string, keyof JSX.IntrinsicElements> = {\n Button: \"button\",\n Link: \"a\",\n Image: \"img\",\n Input: \"input\",\n Textarea: \"textarea\",\n Label: \"label\",\n Separator: \"hr\",\n Badge: \"span\",\n Card: \"div\",\n CardContent: \"div\",\n CardHeader: \"div\",\n CardTitle: \"h3\",\n CardDescription: \"p\",\n CardFooter: \"div\",\n Avatar: \"span\",\n AvatarImage: \"img\",\n AvatarFallback: \"span\",\n Table: \"table\",\n TableHeader: \"thead\",\n TableBody: \"tbody\",\n TableFooter: \"tfoot\",\n TableRow: \"tr\",\n TableHead: \"th\",\n TableCell: \"td\",\n TableCaption: \"caption\",\n};\n\nexport function getBlockCurrentClassNames(block: Block): string[] {\n const defaultClassNames = block.classNames?.default || [];\n const addedClassNames = block.classNames?.added || [];\n const removedClassNames = block.classNames?.removed || [];\n\n // Start with the default class names\n let currentClassNames = [...defaultClassNames];\n\n // Add the added class names\n currentClassNames = currentClassNames.concat(addedClassNames);\n\n // Remove the removed class names\n currentClassNames = currentClassNames.filter(\n (className) => !removedClassNames.includes(className)\n );\n\n // Return the unique set of class names\n return Array.from(new Set(currentClassNames));\n}\n\nconst VIEWPORT_HEIGHT = 900;\n\nexport function convertVhClassesToPx(classNames: string[]): string[] {\n const viewportHeight = VIEWPORT_HEIGHT;\n\n const vhUnits = [\"vh\", \"dvh\", \"svh\", \"lvh\"];\n const screenClasses = [\"h-screen\", \"h-dvh\", \"h-svh\", \"h-lvh\"];\n\n return classNames.map((className) => {\n // Handle h-screen and similar classes\n const screenMatch = screenClasses.find((sc) => className.includes(sc));\n if (screenMatch) {\n return className.replace(screenMatch, `h-[${viewportHeight}px]`);\n }\n\n // Handle percentage-based vh units\n for (const unit of vhUnits) {\n if (className.includes(unit)) {\n const match = className.match(new RegExp(`(\\\\d+)${unit}`));\n if (match) {\n const value = parseInt(match[1], 10);\n const pxValue = (value / 100) * viewportHeight;\n return className.replace(`${value}${unit}`, `${pxValue}px`);\n }\n }\n }\n\n return className;\n });\n}\n\nexport function getBlockClassnamesToApply(\n block: Block,\n options?: {\n isPreview?: boolean;\n replaceVhClasses?: boolean;\n }\n): string[] {\n const { isPreview = false, replaceVhClasses = true } = options || {};\n let currentClassNames = getBlockCurrentClassNames(block);\n\n if (isPreview) {\n const isLink = isElementBlock(block) && block.tag === \"a\";\n\n if (isLink) {\n currentClassNames = [...currentClassNames, \"cursor-pointer\"];\n }\n }\n\n if (replaceVhClasses) {\n return convertVhClassesToPx(currentClassNames);\n }\n\n return currentClassNames;\n}\n\n/**\n * Gets the tag or component to render for a block.\n *\n * @param block - The block to get the tag for\n * @param componentRegistry - Optional registry of React components\n * @returns A React component, HTML tag name, or undefined\n */\nexport function getBlockTagName(\n block: ElementBlock | DefaultComponentBlock,\n componentRegistry?: ComponentRegistry\n): React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined {\n if (isDefaultComponentBlock(block)) {\n // First, check SDK built-in components (Icon, etc.)\n if (SDK_BUILT_IN_COMPONENTS[block.component]) {\n return SDK_BUILT_IN_COMPONENTS[block.component];\n }\n\n // Then, try to get the component from the user's registry\n if (componentRegistry && componentRegistry[block.component]) {\n return componentRegistry[block.component];\n }\n\n // Fallback to semantic HTML tags for common components\n if (DEFAULT_COMPONENT_TAGS[block.component]) {\n return DEFAULT_COMPONENT_TAGS[block.component];\n }\n\n // Last resort: render as div\n return \"div\";\n }\n\n return (block.tag as keyof JSX.IntrinsicElements) ?? \"div\";\n}\n","import { BooleanExpression, ComparisonOperator, NAryLogicalOperator } from \"../types\";\n\nexport function evaluateExpression(\n expression: BooleanExpression,\n props: Record<string, any>,\n): boolean {\n if (\"type\" in expression && (expression.type === \"and\" || expression.type === \"or\" || expression.type === \"not\")) {\n return evaluateNAryLogicalOperator(expression as NAryLogicalOperator, props);\n }\n\n if (\"type\" in expression && (expression.type === \"eq\" || expression.type === \"neq\")) {\n return evaluateComparisonOperator(expression as ComparisonOperator, props);\n }\n\n return true;\n}\n\nfunction evaluateNAryLogicalOperator(\n operator: NAryLogicalOperator,\n props: Record<string, any>,\n): boolean {\n if (operator.type === \"not\") {\n if (operator.operands.length !== 1) return true;\n return !evaluateExpression(operator.operands[0], props);\n }\n\n if (operator.type === \"and\") {\n return operator.operands.every((operand) => evaluateExpression(operand, props));\n }\n\n if (operator.type === \"or\") {\n return operator.operands.some((operand) => evaluateExpression(operand, props));\n }\n\n return true;\n}\n\nfunction evaluateComparisonOperator(\n operator: ComparisonOperator,\n props: Record<string, any>,\n): boolean {\n const leftValue = getOperandValue(operator.left, props);\n const rightValue = getOperandValue(operator.right, props);\n\n if (operator.type === \"eq\") {\n return leftValue === rightValue;\n }\n\n if (operator.type === \"neq\") {\n return leftValue !== rightValue;\n }\n\n return true;\n}\n\nfunction getOperandValue(operand: { type: string; value: any }, props: Record<string, any>): any {\n if (operand.type === \"field\") {\n return props[operand.value];\n }\n\n if (operand.type === \"value\") {\n return operand.value;\n }\n\n return undefined;\n}\n\n\n\n\n","import { Block, Component, TextBlock } from \"../types\";\nimport { isComponentBlock, isDefaultComponentBlock, isElementBlock } from \"./blockUtils\";\n\nexport interface CurrentComponent {\n id: string;\n props: Record<string, any>;\n propsConfig: Record<string, any>;\n}\n\nfunction isPropValue(value: any): boolean {\n return typeof value === \"string\" && value.startsWith(\"{{\") && value.endsWith(\"}}\");\n}\n\nfunction getPropNameFromValue(value: string): string {\n return value.slice(2, -2).trim();\n}\n\nexport function getBlockText(block: TextBlock, props?: Record<string, any>): string {\n if (block.text.startsWith(\"{\") && props) {\n const propName = block.text.slice(1, -1).replace(\"props.\", \"\");\n return props?.[propName]?.toString() || block.text;\n }\n return block.text;\n}\n\nexport function htmlToText(html: string): string {\n if (typeof window === \"undefined\") return html;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n return doc.body.textContent || \"\";\n}\n\nexport function getBlockProps(\n block: Block,\n currentComponent: CurrentComponent | null,\n): Record<string, any> {\n const props = { ...block.props };\n if (!currentComponent) return props;\n\n for (const key in props) {\n const value = props[key];\n\n // If a prop is set to the prop of a component, substitute it with the actual value of the component prop\n if (isPropValue(value)) {\n const propName = getPropNameFromValue(value);\n const componentPropValue = currentComponent.props[propName];\n\n if (componentPropValue !== undefined) {\n props[key] = componentPropValue;\n }\n }\n }\n\n return props;\n}\n\nexport function getBlockPropsToApply(\n block: Block,\n currentComponent: CurrentComponent | null,\n options?: {\n isPreview?: boolean;\n },\n): Record<string, any> {\n const { isPreview = false } = options || {};\n\n // If it's the instance of a component, the props don't need to be applied to the component block itself,\n // rather they are handled by the component block renderer.\n const props = isComponentBlock(block) ? {} : getBlockProps(block, currentComponent);\n\n if (!isPreview) {\n // If it's a Link component, set href to \"#\" so it doesn't navigate anywhere\n if (isDefaultComponentBlock(block) && block.component === \"Link\") {\n props.href = \"#\";\n } else {\n // Otherwise, just delete href (for a normal anchor tag)\n delete props.href;\n }\n\n const isButton =\n (isDefaultComponentBlock(block) && block.component === \"Button\") ||\n (isElementBlock(block) && block.tag === \"button\");\n if (isButton) {\n props.type = \"button\";\n }\n }\n\n // Remove Next.js Image-specific props that shouldn't be passed to DOM elements\n // Note: asChild is intentionally kept as it's needed by Radix components (Button, etc.)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n ...domProps\n } = props;\n\n // Handle asChild - add data-parent-block-id for proper block identification\n const isAsChild = !!domProps?.asChild;\n if (isAsChild) {\n domProps[\"data-parent-block-id\"] = block.id;\n }\n\n return {\n ...domProps,\n \"data-block-id\": block.id,\n };\n}\n","import { forwardRef } from \"react\";\nimport { Block, Component, ComponentRegistry } from \"../types\";\nimport {\n isTextBlock,\n isComponentBlock,\n getBlockClassnamesToApply,\n getBlockTagName,\n} from \"../utils/blockUtils\";\nimport { evaluateExpression } from \"../utils/booleanExpressions\";\nimport {\n getBlockProps,\n getBlockPropsToApply,\n getBlockText,\n htmlToText,\n CurrentComponent,\n} from \"../utils/propsUtils\";\nimport { cn } from \"../utils/cn\";\n\ninterface PreviewBlockRendererProps {\n block: Block;\n components?: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[];\n currentComponent?: CurrentComponent | null;\n replaceVhClasses?: boolean;\n className?: string;\n /** Registry of UI components (Button, Card, etc.) for proper rendering */\n componentRegistry?: ComponentRegistry;\n [key: string]: any;\n}\n\nexport const PreviewChildrenRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n ({ block, ...restProps }, ref) => {\n if (!block.children) return null;\n\n if (block.children.length === 1) {\n return <PreviewBlockRenderer block={block.children[0]} ref={ref} {...restProps} />;\n }\n\n return (\n <>\n {block.children.map((child: Block) => (\n <PreviewBlockRenderer key={child.id} block={child} {...restProps} />\n ))}\n </>\n );\n },\n);\n\nPreviewChildrenRenderer.displayName = \"ChildrenRenderer\";\n\n/**\n * Strip props that are not valid DOM attributes.\n * This includes React-specific props, Next.js Image props, and Framer Motion animation props.\n */\nconst stripNonDomProps = (p: Record<string, any>) => {\n const {\n // React/Radix props\n asChild,\n // Next.js Image props\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n // Framer Motion animation props\n whileHover,\n whileTap,\n whileFocus,\n whileDrag,\n whileInView,\n animate,\n initial,\n exit,\n transition,\n variants,\n layout,\n layoutId,\n drag,\n dragConstraints,\n dragElastic,\n dragMomentum,\n dragTransition,\n dragPropagation,\n dragControls,\n dragListener,\n dragSnapToOrigin,\n onDrag,\n onDragStart,\n onDragEnd,\n onDirectionLock,\n onDragTransitionEnd,\n onAnimationStart,\n onAnimationComplete,\n onUpdate,\n onPan,\n onPanStart,\n onPanEnd,\n onTap,\n onTapStart,\n onTapCancel,\n onHoverStart,\n onHoverEnd,\n onViewportEnter,\n onViewportLeave,\n viewport,\n custom,\n inherit,\n // Other non-DOM props that might leak through\n motionValue,\n transformTemplate,\n ...clean\n } = p ?? {};\n return clean;\n};\n\nexport const PreviewBlockRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n (\n {\n block,\n components = [],\n currentComponent,\n replaceVhClasses = false,\n componentRegistry,\n ...rest\n },\n ref,\n ) => {\n const classNamesToApply = getBlockClassnamesToApply(block, {\n isPreview: false, // SSR mode - no preview features\n replaceVhClasses,\n });\n const className = cn(\n // If is text block, don't apply the className from the parent (with asChild), since text blocks normally can't have props at all since they're just text nodes.\n classNamesToApply,\n isTextBlock(block) ? undefined : rest?.className,\n );\n const blockProps = getBlockPropsToApply(block, currentComponent ?? null, {\n isPreview: false, // SSR mode - no preview/client-side features\n });\n\n if (block.renderCondition) {\n const shouldRender = evaluateExpression(block.renderCondition, currentComponent?.props ?? {});\n if (!shouldRender) return null;\n }\n\n if (isTextBlock(block)) {\n return <>{htmlToText(getBlockText(block, currentComponent?.props))}</>;\n }\n\n if (isComponentBlock(block)) {\n const component = components.find(\n (component: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">) =>\n component.id === block.componentId,\n );\n if (!component) return null;\n\n // For nested components, the props could be set to a prop of the outer component\n const currentComponentProps = getBlockProps(block, currentComponent ?? null);\n const innerCurrentComponent: CurrentComponent = {\n id: component.id,\n props: currentComponentProps,\n propsConfig: component.propsConfig,\n };\n\n return (\n <PreviewBlockRenderer\n block={component.blocks[0]}\n components={components}\n currentComponent={innerCurrentComponent}\n componentRegistry={componentRegistry}\n className={className}\n />\n );\n }\n\n const Tag = getBlockTagName(block, componentRegistry);\n if (!Tag) return null;\n\n const mergedProps: Record<string, any> = {\n // ...rest shouldn't be passed to text blocks because they normally can't have props at all since they're just text nodes.\n ...(isTextBlock(block) ? {} : rest),\n className,\n // blockProps Needs to be after ...rest to override the props passed from a parent component (e.g. data-block-id). (for child of asChild component)\n ...blockProps,\n ref,\n };\n\n // In SSR mode, links work normally - no client-side navigation needed\n // Remove onClick handlers that would require client-side code\n\n // Only strip non-DOM props when Tag is a real DOM element (string), not a React component\n const finalProps = typeof Tag === \"string\" ? stripNonDomProps(mergedProps) : mergedProps;\n\n if (!block.children?.length) {\n return <Tag {...finalProps} />;\n }\n\n return (\n <Tag {...finalProps}>\n <PreviewChildrenRenderer\n block={block}\n components={components}\n currentComponent={currentComponent}\n componentRegistry={componentRegistry}\n />\n </Tag>\n );\n },\n);\n\nPreviewBlockRenderer.displayName = \"BlockRenderer\";\n","import { Theme, ThemeItem } from \"../types\";\n\nexport function applyFontsToDocument(document: Document, fonts: ThemeItem[]) {\n const root = document.documentElement;\n const head = document.head;\n\n // Simple implementation - in production you'd want to handle Google Fonts and local fonts\n fonts.forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n root.style.setProperty(font.variable, fontFamily);\n });\n}\n\nexport function applyColorToDocument(document: Document, color: ThemeItem) {\n document.documentElement.style.setProperty(color.variable, color.value);\n}\n\nexport function applyBorderRadiusToDocument(\n document: Document,\n borderRadius: number\n) {\n document.documentElement.style.setProperty(\"--radius\", `${borderRadius}rem`);\n}\n\nexport function applyThemeToDocument(document: Document, theme: Theme) {\n applyFontsToDocument(document, Object.values(theme.fonts));\n applyBorderRadiusToDocument(document, theme.borderRadius);\n Object.values(theme.colors).forEach((color) =>\n applyColorToDocument(document, color)\n );\n}\n\n/**\n * Generate CSS styles for theme that can be injected into a style tag for SSR.\n * This is a pure function that works on the server.\n * Uses scoped selectors to ensure SiteIO theme variables take precedence over project theme.\n */\nexport function applyThemeToStyleTag(theme: Theme): string {\n const styles: string[] = [];\n\n // Apply fonts\n Object.values(theme.fonts).forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n styles.push(` ${font.variable}: ${fontFamily} !important;`);\n });\n\n // Apply border radius\n styles.push(` --radius: ${theme.borderRadius}rem !important;`);\n\n // Apply colors - SiteIO uses HSL format (e.g., \"250 93% 66%\")\n Object.values(theme.colors).forEach((color) => {\n styles.push(` ${color.variable}: ${color.value} !important;`);\n });\n\n // Use high specificity selectors to ensure SiteIO theme variables override consuming app\n // The [data-siteio-theme] attribute is added to the SDK wrapper element\n const scopedStyles = styles.map((s) => s.replace(\" !important\", \"\"));\n\n return `\n/* SiteIO Base Styles - Required for proper rendering */\n:root {\n /* Default fallback values - will be overridden by theme */\n --background: 0 0% 5%;\n --foreground: 0 0% 98%;\n --card: 0 0% 17%;\n --card-foreground: 0 0% 98%;\n --popover: 0 0% 17%;\n --popover-foreground: 0 0% 98%;\n --primary: 217 91% 60%;\n --primary-foreground: 210 40% 98%;\n --secondary: 0 0% 17%;\n --secondary-foreground: 0 0% 98%;\n --muted: 0 0% 14.9%;\n --muted-foreground: 0 0% 63.9%;\n --accent: 0 0% 33%;\n --accent-foreground: 0 0% 98%;\n --destructive: 345 87% 53%;\n --destructive-foreground: 0 0% 98%;\n --border: 0 0% 15%;\n --input: 0 0% 14.9%;\n --ring: 0 0% 83.1%;\n --radius: 0.75rem;\n}\n\n/* SiteIO Theme Variables - Override with project theme */\n:root {\n${styles.join(\"\\n\")}\n}\n\n/* SiteIO Theme Variables - Scoped to SDK component */\n[data-siteio-theme] {\n${styles.join(\"\\n\")}\n}\n\n/* Ensure child elements also have access to variables */\n[data-siteio-theme] * {\n${scopedStyles.join(\"\\n\")}\n}\n\n/* SiteIO Base Element Styles */\n[data-siteio-theme] {\n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n}\n\n/* Utility class mappings for Tailwind CDN compatibility */\n.bg-background { background-color: hsl(var(--background)) !important; }\n.bg-foreground { background-color: hsl(var(--foreground)) !important; }\n.bg-card { background-color: hsl(var(--card)) !important; }\n.bg-popover { background-color: hsl(var(--popover)) !important; }\n.bg-primary { background-color: hsl(var(--primary)) !important; }\n.bg-secondary { background-color: hsl(var(--secondary)) !important; }\n.bg-muted { background-color: hsl(var(--muted)) !important; }\n.bg-accent { background-color: hsl(var(--accent)) !important; }\n.bg-destructive { background-color: hsl(var(--destructive)) !important; }\n\n.text-foreground { color: hsl(var(--foreground)) !important; }\n.text-background { color: hsl(var(--background)) !important; }\n.text-card-foreground { color: hsl(var(--card-foreground)) !important; }\n.text-popover-foreground { color: hsl(var(--popover-foreground)) !important; }\n.text-primary { color: hsl(var(--primary)) !important; }\n.text-primary-foreground { color: hsl(var(--primary-foreground)) !important; }\n.text-secondary-foreground { color: hsl(var(--secondary-foreground)) !important; }\n.text-muted-foreground { color: hsl(var(--muted-foreground)) !important; }\n.text-accent-foreground { color: hsl(var(--accent-foreground)) !important; }\n.text-destructive { color: hsl(var(--destructive)) !important; }\n.text-destructive-foreground { color: hsl(var(--destructive-foreground)) !important; }\n\n.border-border { border-color: hsl(var(--border)) !important; }\n.border-input { border-color: hsl(var(--input)) !important; }\n.ring-ring { --tw-ring-color: hsl(var(--ring)) !important; }\n.ring-offset-background { --tw-ring-offset-color: hsl(var(--background)) !important; }\n\n.rounded-lg { border-radius: var(--radius) !important; }\n.rounded-md { border-radius: calc(var(--radius) - 2px) !important; }\n.rounded-sm { border-radius: calc(var(--radius) - 4px) !important; }\n\n/* Hover states with opacity */\n.hover\\\\:bg-primary\\\\/90:hover { background-color: hsl(var(--primary) / 0.9) !important; }\n.hover\\\\:bg-primary\\\\/80:hover { background-color: hsl(var(--primary) / 0.8) !important; }\n.hover\\\\:bg-secondary\\\\/80:hover { background-color: hsl(var(--secondary) / 0.8) !important; }\n.hover\\\\:bg-destructive\\\\/90:hover { background-color: hsl(var(--destructive) / 0.9) !important; }\n.hover\\\\:bg-accent:hover { background-color: hsl(var(--accent)) !important; }\n.hover\\\\:text-accent-foreground:hover { color: hsl(var(--accent-foreground)) !important; }\n\n/* Focus visible states */\n.focus-visible\\\\:outline-none:focus-visible { outline: 2px solid transparent; outline-offset: 2px; }\n.focus-visible\\\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\\\:ring-ring:focus-visible { --tw-ring-color: hsl(var(--ring)); }\n.focus-visible\\\\:ring-offset-2:focus-visible { --tw-ring-offset-width: 2px; }\n\n/* Disabled states */\n.disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n.disabled\\\\:pointer-events-none:disabled { pointer-events: none; }\n\n/* Card styles */\n.shadow-sm { box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); }\n\n/* Input & Form elements */\ninput, textarea, select {\n background-color: transparent;\n border-color: hsl(var(--input));\n}\n\n/* Separator */\nhr, [role=\"separator\"] {\n border-color: hsl(var(--border));\n background-color: hsl(var(--border));\n}\n\n/* Button transitions */\nbutton, [role=\"button\"], a {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n/* Border default */\n.border { border-width: 1px; border-color: hsl(var(--border)); }\n`.trim();\n}\n","import { fetchProject } from \"../utils/fetchProject\";\nimport { PreviewBlockRenderer } from \"./PreviewBlockRenderer\";\nimport { RewebProjectProps, Component, ProjectData } from \"../types\";\nimport { applyThemeToStyleTag } from \"../utils/theme\";\n\n/**\n * Pure SSR server component that fetches and renders project data on the server.\n * No client-side JavaScript required - works entirely in SSR mode.\n */\nexport async function RewebProject({\n projectId,\n token,\n initialPageId,\n config,\n className,\n componentRegistry,\n}: RewebProjectProps) {\n // Fetch data on the server\n let data: ProjectData;\n let error: Error | null = null;\n\n try {\n data = await fetchProject({\n projectId,\n token,\n apiUrl: config?.apiUrl,\n });\n } catch (err) {\n error = err instanceof Error ? err : new Error(\"Failed to fetch project\");\n // Return error UI - this will be rendered on server\n return (\n <div className={className}>\n <div>Error: {error.message}</div>\n </div>\n );\n }\n\n // Determine which page to render\n let currentPageId = initialPageId;\n if (!currentPageId) {\n // Find home page (url === \"/\")\n const homePage = data.pages.find((page) => page.url === \"/\");\n if (homePage) {\n currentPageId = homePage.public_id;\n } else if (data.pages.length > 0) {\n currentPageId = data.pages[0].public_id;\n }\n }\n\n const currentPage = data.pages.find((page) => page.public_id === currentPageId);\n if (!currentPage) {\n return (\n <div className={className}>\n <div>Page not found</div>\n </div>\n );\n }\n\n // Prepare components data\n const components: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[] = data.components.map(\n (component) => ({\n id: component.public_id,\n blocks: component.blocks,\n propsConfig: component.props_config,\n }),\n );\n\n // Generate theme styles for SSR\n const themeStyles = applyThemeToStyleTag(data.project.theme);\n const projectCss = data.styles?.css ?? \"\";\n\n // Debug info (visible in page source)\n const debugInfo = `\n/* SiteIO SDK Debug Info:\n * Theme colors count: ${Object.keys(data.project.theme?.colors || {}).length}\n * Project CSS length: ${projectCss.length} chars\n * Theme styles length: ${themeStyles.length} chars\n */`;\n\n return (\n <>\n {/* Inject theme styles for SSR - scoped to SiteIO component */}\n <style\n data-siteio-theme-styles\n dangerouslySetInnerHTML={{ __html: debugInfo + \"\\n\" + themeStyles }}\n />\n {projectCss ? (\n <style data-siteio-project-css dangerouslySetInnerHTML={{ __html: projectCss }} />\n ) : null}\n <div className={className} data-siteio-theme>\n {currentPage.blocks.map((block) => (\n <PreviewBlockRenderer\n key={block.id}\n block={block}\n components={components}\n componentRegistry={componentRegistry}\n />\n ))}\n </div>\n </>\n );\n}\n"]}

@@ -0,1 +1,2 @@

import * as React2 from 'react';
import { forwardRef } from 'react';

@@ -19,3 +20,5 @@ import * as LucideIcons from 'lucide-react';

"Content-Type": "application/json"
}
},
cache: "no-store"
// Disable caching for real-time updates
});

@@ -48,2 +51,179 @@ if (!response.ok) {

Icon.displayName = "Icon";
function cn(...inputs) {
return twMerge(clsx(inputs));
}
var Button = React2.forwardRef(
({
className,
variant = "default",
size = "default",
asChild = false,
...props
}, ref) => {
const baseStyles = "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0";
const variants = {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline"
};
const sizes = {
default: "h-10 px-4 py-2",
sm: "h-9 rounded-md px-3",
lg: "h-11 rounded-md px-8",
icon: "h-10 w-10"
};
return /* @__PURE__ */ jsx(
"button",
{
className: cn(baseStyles, variants[variant], sizes[size], className),
ref,
...props
}
);
}
);
Button.displayName = "Button";
var Card = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"div",
{
ref,
className: cn(
"rounded-lg border bg-card text-card-foreground shadow-sm",
className
),
...props
}
));
Card.displayName = "Card";
var CardHeader = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"div",
{
ref,
className: cn("flex flex-col space-y-1.5 p-6", className),
...props
}
));
CardHeader.displayName = "CardHeader";
var CardTitle = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"div",
{
ref,
className: cn(
"text-2xl font-semibold leading-none tracking-tight",
className
),
...props
}
));
CardTitle.displayName = "CardTitle";
var CardDescription = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"div",
{
ref,
className: cn("text-sm text-muted-foreground", className),
...props
}
));
CardDescription.displayName = "CardDescription";
var CardContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
CardContent.displayName = "CardContent";
var CardFooter = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"div",
{
ref,
className: cn("flex items-center p-6 pt-0", className),
...props
}
));
CardFooter.displayName = "CardFooter";
function Badge({ className, variant = "default", ...props }) {
const baseStyles = "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2";
const variants = {
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
outline: "text-foreground"
};
return /* @__PURE__ */ jsx("div", { className: cn(baseStyles, variants[variant], className), ...props });
}
var Input = React2.forwardRef(({ className, type, ...props }, ref) => {
return /* @__PURE__ */ jsx(
"input",
{
type,
className: cn(
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className
),
ref,
...props
}
);
});
Input.displayName = "Input";
var Label = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"label",
{
ref,
className: cn(
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
className
),
...props
}
));
Label.displayName = "Label";
var Separator = React2.forwardRef(
({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
"div",
{
ref,
role: decorative ? "none" : "separator",
"aria-orientation": decorative ? void 0 : orientation,
className: cn(
"shrink-0 bg-border",
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
className
),
...props
}
)
);
Separator.displayName = "Separator";
var Avatar = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"span",
{
ref,
className: cn(
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
className
),
...props
}
));
Avatar.displayName = "Avatar";
var AvatarImage = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"img",
{
ref,
className: cn("aspect-square h-full w-full", className),
...props
}
));
AvatarImage.displayName = "AvatarImage";
var AvatarFallback = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
"span",
{
ref,
className: cn(
"flex h-full w-full items-center justify-center rounded-full bg-muted",
className
),
...props
}
));
AvatarFallback.displayName = "AvatarFallback";

@@ -64,3 +244,24 @@ // src/utils/blockUtils.ts

var SDK_BUILT_IN_COMPONENTS = {
Icon
// Icons
Icon,
// Button
Button,
// Card
Card,
CardHeader,
CardFooter,
CardTitle,
CardDescription,
CardContent,
// Badge
Badge,
// Form elements
Input,
Label,
// Layout
Separator,
// Avatar
Avatar,
AvatarImage,
AvatarFallback
};

@@ -252,3 +453,2 @@ var DEFAULT_COMPONENT_TAGS = {

const {
asChild,
blurDataURL,

@@ -265,2 +465,6 @@ fill,

} = props;
const isAsChild = !!domProps?.asChild;
if (isAsChild) {
domProps["data-parent-block-id"] = block.id;
}
return {

@@ -271,5 +475,2 @@ ...domProps,

}
function cn(...inputs) {
return twMerge(clsx(inputs));
}
var PreviewChildrenRenderer = forwardRef(

@@ -441,4 +642,29 @@ ({ block, ...restProps }, ref) => {

return `
/* SiteIO Theme Variables - Global scope for CSS variable inheritance */
/* SiteIO Base Styles - Required for proper rendering */
:root {
/* Default fallback values - will be overridden by theme */
--background: 0 0% 5%;
--foreground: 0 0% 98%;
--card: 0 0% 17%;
--card-foreground: 0 0% 98%;
--popover: 0 0% 17%;
--popover-foreground: 0 0% 98%;
--primary: 217 91% 60%;
--primary-foreground: 210 40% 98%;
--secondary: 0 0% 17%;
--secondary-foreground: 0 0% 98%;
--muted: 0 0% 14.9%;
--muted-foreground: 0 0% 63.9%;
--accent: 0 0% 33%;
--accent-foreground: 0 0% 98%;
--destructive: 345 87% 53%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 15%;
--input: 0 0% 14.9%;
--ring: 0 0% 83.1%;
--radius: 0.75rem;
}
/* SiteIO Theme Variables - Override with project theme */
:root {
${styles.join("\n")}

@@ -456,2 +682,87 @@ }

}
/* SiteIO Base Element Styles */
[data-siteio-theme] {
background-color: hsl(var(--background));
color: hsl(var(--foreground));
}
/* Utility class mappings for Tailwind CDN compatibility */
.bg-background { background-color: hsl(var(--background)) !important; }
.bg-foreground { background-color: hsl(var(--foreground)) !important; }
.bg-card { background-color: hsl(var(--card)) !important; }
.bg-popover { background-color: hsl(var(--popover)) !important; }
.bg-primary { background-color: hsl(var(--primary)) !important; }
.bg-secondary { background-color: hsl(var(--secondary)) !important; }
.bg-muted { background-color: hsl(var(--muted)) !important; }
.bg-accent { background-color: hsl(var(--accent)) !important; }
.bg-destructive { background-color: hsl(var(--destructive)) !important; }
.text-foreground { color: hsl(var(--foreground)) !important; }
.text-background { color: hsl(var(--background)) !important; }
.text-card-foreground { color: hsl(var(--card-foreground)) !important; }
.text-popover-foreground { color: hsl(var(--popover-foreground)) !important; }
.text-primary { color: hsl(var(--primary)) !important; }
.text-primary-foreground { color: hsl(var(--primary-foreground)) !important; }
.text-secondary-foreground { color: hsl(var(--secondary-foreground)) !important; }
.text-muted-foreground { color: hsl(var(--muted-foreground)) !important; }
.text-accent-foreground { color: hsl(var(--accent-foreground)) !important; }
.text-destructive { color: hsl(var(--destructive)) !important; }
.text-destructive-foreground { color: hsl(var(--destructive-foreground)) !important; }
.border-border { border-color: hsl(var(--border)) !important; }
.border-input { border-color: hsl(var(--input)) !important; }
.ring-ring { --tw-ring-color: hsl(var(--ring)) !important; }
.ring-offset-background { --tw-ring-offset-color: hsl(var(--background)) !important; }
.rounded-lg { border-radius: var(--radius) !important; }
.rounded-md { border-radius: calc(var(--radius) - 2px) !important; }
.rounded-sm { border-radius: calc(var(--radius) - 4px) !important; }
/* Hover states with opacity */
.hover\\:bg-primary\\/90:hover { background-color: hsl(var(--primary) / 0.9) !important; }
.hover\\:bg-primary\\/80:hover { background-color: hsl(var(--primary) / 0.8) !important; }
.hover\\:bg-secondary\\/80:hover { background-color: hsl(var(--secondary) / 0.8) !important; }
.hover\\:bg-destructive\\/90:hover { background-color: hsl(var(--destructive) / 0.9) !important; }
.hover\\:bg-accent:hover { background-color: hsl(var(--accent)) !important; }
.hover\\:text-accent-foreground:hover { color: hsl(var(--accent-foreground)) !important; }
/* Focus visible states */
.focus-visible\\:outline-none:focus-visible { outline: 2px solid transparent; outline-offset: 2px; }
.focus-visible\\:ring-2:focus-visible {
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
.focus-visible\\:ring-ring:focus-visible { --tw-ring-color: hsl(var(--ring)); }
.focus-visible\\:ring-offset-2:focus-visible { --tw-ring-offset-width: 2px; }
/* Disabled states */
.disabled\\:opacity-50:disabled { opacity: 0.5; }
.disabled\\:pointer-events-none:disabled { pointer-events: none; }
/* Card styles */
.shadow-sm { box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); }
/* Input & Form elements */
input, textarea, select {
background-color: transparent;
border-color: hsl(var(--input));
}
/* Separator */
hr, [role="separator"] {
border-color: hsl(var(--border));
background-color: hsl(var(--border));
}
/* Button transitions */
button, [role="button"], a {
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
/* Border default */
.border { border-width: 1px; border-color: hsl(var(--border)); }
`.trim();

@@ -531,4 +842,4 @@ }

export { PreviewBlockRenderer, RewebProject, fetchProject };
export { Avatar, AvatarFallback, AvatarImage, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input, Label, PreviewBlockRenderer, RewebProject, Separator, fetchProject };
//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/utils/fetchProject.ts","../src/components/Icon.tsx","../src/utils/blockUtils.ts","../src/utils/booleanExpressions.ts","../src/utils/propsUtils.ts","../src/utils/cn.ts","../src/components/PreviewBlockRenderer.tsx","../src/utils/theme.ts","../src/components/RewebProject.tsx"],"names":["forwardRef","jsx","component","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ProjectData } from \"../types\";\n\nexport interface FetchProjectOptions {\n projectId: string;\n token: string;\n apiUrl?: string;\n}\n\nexport async function fetchProject({\n projectId,\n token,\n apiUrl = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3000\",\n}: FetchProjectOptions): Promise<ProjectData> {\n const url = new URL(`${apiUrl}/api/project/${projectId}`);\n url.searchParams.set(\"token\", token);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(error.error || `Failed to fetch project: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n\n\n\n","import * as LucideIcons from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\ninterface IconProps {\n name: string;\n size?: number;\n className?: string;\n strokeWidth?: number;\n [key: string]: any;\n}\n\n/**\n * Dynamic icon component that renders Lucide React icons by name.\n * This allows the SDK to render any icon used in the SiteIO builder.\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(\n ({ name, size = 24, className, strokeWidth, ...props }, ref) => {\n // Get the icon component from Lucide\n const IconComponent = (LucideIcons as Record<string, any>)[name];\n\n if (!IconComponent) {\n // Return empty span if icon not found to avoid breaking the layout\n console.warn(`[SiteIO SDK] Icon \"${name}\" not found in lucide-react`);\n return <span className={className} style={{ width: size, height: size }} />;\n }\n\n return (\n <IconComponent\n ref={ref}\n size={size}\n className={className}\n strokeWidth={strokeWidth}\n {...props}\n />\n );\n },\n);\n\nIcon.displayName = \"Icon\";\n","import { Icon } from \"../components/Icon\";\nimport {\n Block,\n ElementBlock,\n DefaultComponentBlock,\n TextBlock,\n ComponentBlock,\n ComponentRegistry,\n} from \"../types\";\n\nexport function isTextBlock(block: Block): block is TextBlock {\n return block.type === \"text\";\n}\n\nexport function isElementBlock(block: Block): block is ElementBlock {\n return block.type === \"element\";\n}\n\nexport function isDefaultComponentBlock(block: Block): block is DefaultComponentBlock {\n return block.type === \"component\";\n}\n\nexport function isComponentBlock(block: Block): block is ComponentBlock {\n return block.type === \"custom-component\";\n}\n\n/**\n * Built-in SDK components that are always available.\n * These don't require the user to install any additional packages.\n */\nexport const SDK_BUILT_IN_COMPONENTS: ComponentRegistry = {\n Icon,\n};\n\n/**\n * Default fallback tags for components when no registry is provided.\n * Maps component names to semantic HTML elements.\n * Note: These are FALLBACKS - the actual styling comes from the compiled CSS.\n */\nconst DEFAULT_COMPONENT_TAGS: Record<string, keyof JSX.IntrinsicElements> = {\n Button: \"button\",\n Link: \"a\",\n Image: \"img\",\n Input: \"input\",\n Textarea: \"textarea\",\n Label: \"label\",\n Separator: \"hr\",\n Badge: \"span\",\n Card: \"div\",\n CardContent: \"div\",\n CardHeader: \"div\",\n CardTitle: \"h3\",\n CardDescription: \"p\",\n CardFooter: \"div\",\n Avatar: \"span\",\n AvatarImage: \"img\",\n AvatarFallback: \"span\",\n Table: \"table\",\n TableHeader: \"thead\",\n TableBody: \"tbody\",\n TableFooter: \"tfoot\",\n TableRow: \"tr\",\n TableHead: \"th\",\n TableCell: \"td\",\n TableCaption: \"caption\",\n};\n\nexport function getBlockCurrentClassNames(block: Block): string[] {\n const defaultClassNames = block.classNames?.default || [];\n const addedClassNames = block.classNames?.added || [];\n const removedClassNames = block.classNames?.removed || [];\n\n // Start with the default class names\n let currentClassNames = [...defaultClassNames];\n\n // Add the added class names\n currentClassNames = currentClassNames.concat(addedClassNames);\n\n // Remove the removed class names\n currentClassNames = currentClassNames.filter(\n (className) => !removedClassNames.includes(className),\n );\n\n // Return the unique set of class names\n return Array.from(new Set(currentClassNames));\n}\n\nconst VIEWPORT_HEIGHT = 900;\n\nexport function convertVhClassesToPx(classNames: string[]): string[] {\n const viewportHeight = VIEWPORT_HEIGHT;\n\n const vhUnits = [\"vh\", \"dvh\", \"svh\", \"lvh\"];\n const screenClasses = [\"h-screen\", \"h-dvh\", \"h-svh\", \"h-lvh\"];\n\n return classNames.map((className) => {\n // Handle h-screen and similar classes\n const screenMatch = screenClasses.find((sc) => className.includes(sc));\n if (screenMatch) {\n return className.replace(screenMatch, `h-[${viewportHeight}px]`);\n }\n\n // Handle percentage-based vh units\n for (const unit of vhUnits) {\n if (className.includes(unit)) {\n const match = className.match(new RegExp(`(\\\\d+)${unit}`));\n if (match) {\n const value = parseInt(match[1], 10);\n const pxValue = (value / 100) * viewportHeight;\n return className.replace(`${value}${unit}`, `${pxValue}px`);\n }\n }\n }\n\n return className;\n });\n}\n\nexport function getBlockClassnamesToApply(\n block: Block,\n options?: {\n isPreview?: boolean;\n replaceVhClasses?: boolean;\n },\n): string[] {\n const { isPreview = false, replaceVhClasses = true } = options || {};\n let currentClassNames = getBlockCurrentClassNames(block);\n\n if (isPreview) {\n const isLink = isElementBlock(block) && block.tag === \"a\";\n\n if (isLink) {\n currentClassNames = [...currentClassNames, \"cursor-pointer\"];\n }\n }\n\n if (replaceVhClasses) {\n return convertVhClassesToPx(currentClassNames);\n }\n\n return currentClassNames;\n}\n\n/**\n * Gets the tag or component to render for a block.\n *\n * @param block - The block to get the tag for\n * @param componentRegistry - Optional registry of React components\n * @returns A React component, HTML tag name, or undefined\n */\nexport function getBlockTagName(\n block: ElementBlock | DefaultComponentBlock,\n componentRegistry?: ComponentRegistry,\n): React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined {\n if (isDefaultComponentBlock(block)) {\n // First, check SDK built-in components (Icon, etc.)\n if (SDK_BUILT_IN_COMPONENTS[block.component]) {\n return SDK_BUILT_IN_COMPONENTS[block.component];\n }\n\n // Then, try to get the component from the user's registry\n if (componentRegistry && componentRegistry[block.component]) {\n return componentRegistry[block.component];\n }\n\n // Fallback to semantic HTML tags for common components\n if (DEFAULT_COMPONENT_TAGS[block.component]) {\n return DEFAULT_COMPONENT_TAGS[block.component];\n }\n\n // Last resort: render as div\n return \"div\";\n }\n\n return (block.tag as keyof JSX.IntrinsicElements) ?? \"div\";\n}\n","import { BooleanExpression, ComparisonOperator, NAryLogicalOperator } from \"../types\";\n\nexport function evaluateExpression(\n expression: BooleanExpression,\n props: Record<string, any>,\n): boolean {\n if (\"type\" in expression && (expression.type === \"and\" || expression.type === \"or\" || expression.type === \"not\")) {\n return evaluateNAryLogicalOperator(expression as NAryLogicalOperator, props);\n }\n\n if (\"type\" in expression && (expression.type === \"eq\" || expression.type === \"neq\")) {\n return evaluateComparisonOperator(expression as ComparisonOperator, props);\n }\n\n return true;\n}\n\nfunction evaluateNAryLogicalOperator(\n operator: NAryLogicalOperator,\n props: Record<string, any>,\n): boolean {\n if (operator.type === \"not\") {\n if (operator.operands.length !== 1) return true;\n return !evaluateExpression(operator.operands[0], props);\n }\n\n if (operator.type === \"and\") {\n return operator.operands.every((operand) => evaluateExpression(operand, props));\n }\n\n if (operator.type === \"or\") {\n return operator.operands.some((operand) => evaluateExpression(operand, props));\n }\n\n return true;\n}\n\nfunction evaluateComparisonOperator(\n operator: ComparisonOperator,\n props: Record<string, any>,\n): boolean {\n const leftValue = getOperandValue(operator.left, props);\n const rightValue = getOperandValue(operator.right, props);\n\n if (operator.type === \"eq\") {\n return leftValue === rightValue;\n }\n\n if (operator.type === \"neq\") {\n return leftValue !== rightValue;\n }\n\n return true;\n}\n\nfunction getOperandValue(operand: { type: string; value: any }, props: Record<string, any>): any {\n if (operand.type === \"field\") {\n return props[operand.value];\n }\n\n if (operand.type === \"value\") {\n return operand.value;\n }\n\n return undefined;\n}\n\n\n\n\n","import { Block, Component, TextBlock } from \"../types\";\nimport { isComponentBlock, isDefaultComponentBlock, isElementBlock } from \"./blockUtils\";\n\nexport interface CurrentComponent {\n id: string;\n props: Record<string, any>;\n propsConfig: Record<string, any>;\n}\n\nfunction isPropValue(value: any): boolean {\n return typeof value === \"string\" && value.startsWith(\"{{\") && value.endsWith(\"}}\");\n}\n\nfunction getPropNameFromValue(value: string): string {\n return value.slice(2, -2).trim();\n}\n\nexport function getBlockText(block: TextBlock, props?: Record<string, any>): string {\n if (block.text.startsWith(\"{\") && props) {\n const propName = block.text.slice(1, -1).replace(\"props.\", \"\");\n return props?.[propName]?.toString() || block.text;\n }\n return block.text;\n}\n\nexport function htmlToText(html: string): string {\n if (typeof window === \"undefined\") return html;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n return doc.body.textContent || \"\";\n}\n\nexport function getBlockProps(\n block: Block,\n currentComponent: CurrentComponent | null,\n): Record<string, any> {\n const props = { ...block.props };\n if (!currentComponent) return props;\n\n for (const key in props) {\n const value = props[key];\n\n // If a prop is set to the prop of a component, substitute it with the actual value of the component prop\n if (isPropValue(value)) {\n const propName = getPropNameFromValue(value);\n const componentPropValue = currentComponent.props[propName];\n\n if (componentPropValue !== undefined) {\n props[key] = componentPropValue;\n }\n }\n }\n\n return props;\n}\n\nexport function getBlockPropsToApply(\n block: Block,\n currentComponent: CurrentComponent | null,\n options?: {\n isPreview?: boolean;\n },\n): Record<string, any> {\n const { isPreview = false } = options || {};\n\n // If it's the instance of a component, the props don't need to be applied to the component block itself,\n // rather they are handled by the component block renderer.\n const props = isComponentBlock(block) ? {} : getBlockProps(block, currentComponent);\n\n if (!isPreview) {\n // If it's a Link component, set href to \"#\" so it doesn't navigate anywhere\n if (isDefaultComponentBlock(block) && block.component === \"Link\") {\n props.href = \"#\";\n } else {\n // Otherwise, just delete href (for a normal anchor tag)\n delete props.href;\n }\n\n const isButton =\n (isDefaultComponentBlock(block) && block.component === \"Button\") ||\n (isElementBlock(block) && block.tag === \"button\");\n if (isButton) {\n props.type = \"button\";\n }\n }\n\n // Remove React/Next.js-specific props that shouldn't be passed to DOM elements\n // This must happen for both preview and non-preview modes\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n asChild,\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n ...domProps\n } = props;\n\n return {\n ...domProps,\n \"data-block-id\": block.id,\n };\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n\n\n\n","import { forwardRef } from \"react\";\nimport { Block, Component, ComponentRegistry } from \"../types\";\nimport {\n isTextBlock,\n isComponentBlock,\n getBlockClassnamesToApply,\n getBlockTagName,\n} from \"../utils/blockUtils\";\nimport { evaluateExpression } from \"../utils/booleanExpressions\";\nimport {\n getBlockProps,\n getBlockPropsToApply,\n getBlockText,\n htmlToText,\n CurrentComponent,\n} from \"../utils/propsUtils\";\nimport { cn } from \"../utils/cn\";\n\ninterface PreviewBlockRendererProps {\n block: Block;\n components?: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[];\n currentComponent?: CurrentComponent | null;\n replaceVhClasses?: boolean;\n className?: string;\n /** Registry of UI components (Button, Card, etc.) for proper rendering */\n componentRegistry?: ComponentRegistry;\n [key: string]: any;\n}\n\nexport const PreviewChildrenRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n ({ block, ...restProps }, ref) => {\n if (!block.children) return null;\n\n if (block.children.length === 1) {\n return <PreviewBlockRenderer block={block.children[0]} ref={ref} {...restProps} />;\n }\n\n return (\n <>\n {block.children.map((child: Block) => (\n <PreviewBlockRenderer key={child.id} block={child} {...restProps} />\n ))}\n </>\n );\n },\n);\n\nPreviewChildrenRenderer.displayName = \"ChildrenRenderer\";\n\n/**\n * Strip props that are not valid DOM attributes.\n * This includes React-specific props, Next.js Image props, and Framer Motion animation props.\n */\nconst stripNonDomProps = (p: Record<string, any>) => {\n const {\n // React/Radix props\n asChild,\n // Next.js Image props\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n // Framer Motion animation props\n whileHover,\n whileTap,\n whileFocus,\n whileDrag,\n whileInView,\n animate,\n initial,\n exit,\n transition,\n variants,\n layout,\n layoutId,\n drag,\n dragConstraints,\n dragElastic,\n dragMomentum,\n dragTransition,\n dragPropagation,\n dragControls,\n dragListener,\n dragSnapToOrigin,\n onDrag,\n onDragStart,\n onDragEnd,\n onDirectionLock,\n onDragTransitionEnd,\n onAnimationStart,\n onAnimationComplete,\n onUpdate,\n onPan,\n onPanStart,\n onPanEnd,\n onTap,\n onTapStart,\n onTapCancel,\n onHoverStart,\n onHoverEnd,\n onViewportEnter,\n onViewportLeave,\n viewport,\n custom,\n inherit,\n // Other non-DOM props that might leak through\n motionValue,\n transformTemplate,\n ...clean\n } = p ?? {};\n return clean;\n};\n\nexport const PreviewBlockRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n (\n {\n block,\n components = [],\n currentComponent,\n replaceVhClasses = false,\n componentRegistry,\n ...rest\n },\n ref,\n ) => {\n const classNamesToApply = getBlockClassnamesToApply(block, {\n isPreview: false, // SSR mode - no preview features\n replaceVhClasses,\n });\n const className = cn(\n // If is text block, don't apply the className from the parent (with asChild), since text blocks normally can't have props at all since they're just text nodes.\n classNamesToApply,\n isTextBlock(block) ? undefined : rest?.className,\n );\n const blockProps = getBlockPropsToApply(block, currentComponent ?? null, {\n isPreview: false, // SSR mode - no preview/client-side features\n });\n\n if (block.renderCondition) {\n const shouldRender = evaluateExpression(block.renderCondition, currentComponent?.props ?? {});\n if (!shouldRender) return null;\n }\n\n if (isTextBlock(block)) {\n return <>{htmlToText(getBlockText(block, currentComponent?.props))}</>;\n }\n\n if (isComponentBlock(block)) {\n const component = components.find(\n (component: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">) =>\n component.id === block.componentId,\n );\n if (!component) return null;\n\n // For nested components, the props could be set to a prop of the outer component\n const currentComponentProps = getBlockProps(block, currentComponent ?? null);\n const innerCurrentComponent: CurrentComponent = {\n id: component.id,\n props: currentComponentProps,\n propsConfig: component.propsConfig,\n };\n\n return (\n <PreviewBlockRenderer\n block={component.blocks[0]}\n components={components}\n currentComponent={innerCurrentComponent}\n componentRegistry={componentRegistry}\n className={className}\n />\n );\n }\n\n const Tag = getBlockTagName(block, componentRegistry);\n if (!Tag) return null;\n\n const mergedProps: Record<string, any> = {\n // ...rest shouldn't be passed to text blocks because they normally can't have props at all since they're just text nodes.\n ...(isTextBlock(block) ? {} : rest),\n className,\n // blockProps Needs to be after ...rest to override the props passed from a parent component (e.g. data-block-id). (for child of asChild component)\n ...blockProps,\n ref,\n };\n\n // In SSR mode, links work normally - no client-side navigation needed\n // Remove onClick handlers that would require client-side code\n\n // Only strip non-DOM props when Tag is a real DOM element (string), not a React component\n const finalProps = typeof Tag === \"string\" ? stripNonDomProps(mergedProps) : mergedProps;\n\n if (!block.children?.length) {\n return <Tag {...finalProps} />;\n }\n\n return (\n <Tag {...finalProps}>\n <PreviewChildrenRenderer\n block={block}\n components={components}\n currentComponent={currentComponent}\n componentRegistry={componentRegistry}\n />\n </Tag>\n );\n },\n);\n\nPreviewBlockRenderer.displayName = \"BlockRenderer\";\n","import { Theme, ThemeItem } from \"../types\";\n\nexport function applyFontsToDocument(document: Document, fonts: ThemeItem[]) {\n const root = document.documentElement;\n const head = document.head;\n\n // Simple implementation - in production you'd want to handle Google Fonts and local fonts\n fonts.forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n root.style.setProperty(font.variable, fontFamily);\n });\n}\n\nexport function applyColorToDocument(document: Document, color: ThemeItem) {\n document.documentElement.style.setProperty(color.variable, color.value);\n}\n\nexport function applyBorderRadiusToDocument(document: Document, borderRadius: number) {\n document.documentElement.style.setProperty(\"--radius\", `${borderRadius}rem`);\n}\n\nexport function applyThemeToDocument(document: Document, theme: Theme) {\n applyFontsToDocument(document, Object.values(theme.fonts));\n applyBorderRadiusToDocument(document, theme.borderRadius);\n Object.values(theme.colors).forEach((color) => applyColorToDocument(document, color));\n}\n\n/**\n * Generate CSS styles for theme that can be injected into a style tag for SSR.\n * This is a pure function that works on the server.\n * Uses scoped selectors to ensure SiteIO theme variables take precedence over project theme.\n */\nexport function applyThemeToStyleTag(theme: Theme): string {\n const styles: string[] = [];\n\n // Apply fonts\n Object.values(theme.fonts).forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n styles.push(` ${font.variable}: ${fontFamily} !important;`);\n });\n\n // Apply border radius\n styles.push(` --radius: ${theme.borderRadius}rem !important;`);\n\n // Apply colors - SiteIO uses HSL format (e.g., \"250 93% 66%\")\n Object.values(theme.colors).forEach((color) => {\n styles.push(` ${color.variable}: ${color.value} !important;`);\n });\n\n // Use high specificity selectors to ensure SiteIO theme variables override consuming app\n // The [data-siteio-theme] attribute is added to the SDK wrapper element\n const scopedStyles = styles.map((s) => s.replace(\" !important\", \"\"));\n\n return `\n/* SiteIO Theme Variables - Global scope for CSS variable inheritance */\n:root {\n${styles.join(\"\\n\")}\n}\n\n/* SiteIO Theme Variables - Scoped to SDK component */\n[data-siteio-theme] {\n${styles.join(\"\\n\")}\n}\n\n/* Ensure child elements also have access to variables */\n[data-siteio-theme] * {\n${scopedStyles.join(\"\\n\")}\n}\n`.trim();\n}\n","import { fetchProject } from \"../utils/fetchProject\";\nimport { PreviewBlockRenderer } from \"./PreviewBlockRenderer\";\nimport { RewebProjectProps, Component, ProjectData } from \"../types\";\nimport { applyThemeToStyleTag } from \"../utils/theme\";\n\n/**\n * Pure SSR server component that fetches and renders project data on the server.\n * No client-side JavaScript required - works entirely in SSR mode.\n */\nexport async function RewebProject({\n projectId,\n token,\n initialPageId,\n config,\n className,\n componentRegistry,\n}: RewebProjectProps) {\n // Fetch data on the server\n let data: ProjectData;\n let error: Error | null = null;\n\n try {\n data = await fetchProject({\n projectId,\n token,\n apiUrl: config?.apiUrl,\n });\n } catch (err) {\n error = err instanceof Error ? err : new Error(\"Failed to fetch project\");\n // Return error UI - this will be rendered on server\n return (\n <div className={className}>\n <div>Error: {error.message}</div>\n </div>\n );\n }\n\n // Determine which page to render\n let currentPageId = initialPageId;\n if (!currentPageId) {\n // Find home page (url === \"/\")\n const homePage = data.pages.find((page) => page.url === \"/\");\n if (homePage) {\n currentPageId = homePage.public_id;\n } else if (data.pages.length > 0) {\n currentPageId = data.pages[0].public_id;\n }\n }\n\n const currentPage = data.pages.find((page) => page.public_id === currentPageId);\n if (!currentPage) {\n return (\n <div className={className}>\n <div>Page not found</div>\n </div>\n );\n }\n\n // Prepare components data\n const components: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[] = data.components.map(\n (component) => ({\n id: component.public_id,\n blocks: component.blocks,\n propsConfig: component.props_config,\n }),\n );\n\n // Generate theme styles for SSR\n const themeStyles = applyThemeToStyleTag(data.project.theme);\n const projectCss = data.styles?.css ?? \"\";\n\n // Debug info (visible in page source)\n const debugInfo = `\n/* SiteIO SDK Debug Info:\n * Theme colors count: ${Object.keys(data.project.theme?.colors || {}).length}\n * Project CSS length: ${projectCss.length} chars\n * Theme styles length: ${themeStyles.length} chars\n */`;\n\n return (\n <>\n {/* Inject theme styles for SSR - scoped to SiteIO component */}\n <style\n data-siteio-theme-styles\n dangerouslySetInnerHTML={{ __html: debugInfo + \"\\n\" + themeStyles }}\n />\n {projectCss ? (\n <style data-siteio-project-css dangerouslySetInnerHTML={{ __html: projectCss }} />\n ) : null}\n <div className={className} data-siteio-theme>\n {currentPage.blocks.map((block) => (\n <PreviewBlockRenderer\n key={block.id}\n block={block}\n components={components}\n componentRegistry={componentRegistry}\n />\n ))}\n </div>\n </>\n );\n}\n"]}
{"version":3,"sources":["../src/utils/fetchProject.ts","../src/components/Icon.tsx","../src/utils/cn.ts","../src/components/ui/button.tsx","../src/components/ui/card.tsx","../src/components/ui/badge.tsx","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/separator.tsx","../src/components/ui/avatar.tsx","../src/utils/blockUtils.ts","../src/utils/booleanExpressions.ts","../src/utils/propsUtils.ts","../src/components/PreviewBlockRenderer.tsx","../src/utils/theme.ts","../src/components/RewebProject.tsx"],"names":["React","jsx","React3","React4","React5","React6","forwardRef","component","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ProjectData } from \"../types\";\n\nexport interface FetchProjectOptions {\n projectId: string;\n token: string;\n apiUrl?: string;\n}\n\nexport async function fetchProject({\n projectId,\n token,\n apiUrl = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3000\",\n}: FetchProjectOptions): Promise<ProjectData> {\n const url = new URL(`${apiUrl}/api/project/${projectId}`);\n url.searchParams.set(\"token\", token);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n cache: \"no-store\", // Disable caching for real-time updates\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(error.error || `Failed to fetch project: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n\n\n\n","import * as LucideIcons from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\ninterface IconProps {\n name: string;\n size?: number;\n className?: string;\n strokeWidth?: number;\n [key: string]: any;\n}\n\n/**\n * Dynamic icon component that renders Lucide React icons by name.\n * This allows the SDK to render any icon used in the SiteIO builder.\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(\n ({ name, size = 24, className, strokeWidth, ...props }, ref) => {\n // Get the icon component from Lucide\n const IconComponent = (LucideIcons as Record<string, any>)[name];\n\n if (!IconComponent) {\n // Return empty span if icon not found to avoid breaking the layout\n console.warn(`[SiteIO SDK] Icon \"${name}\" not found in lucide-react`);\n return <span className={className} style={{ width: size, height: size }} />;\n }\n\n return (\n <IconComponent\n ref={ref}\n size={size}\n className={className}\n strokeWidth={strokeWidth}\n {...props}\n />\n );\n },\n);\n\nIcon.displayName = \"Icon\";\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n\n\n\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?:\n | \"default\"\n | \"destructive\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"link\";\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n },\n ref\n ) => {\n const baseStyles =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\n\n const variants: Record<string, string> = {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n };\n\n const sizes: Record<string, string> = {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n };\n\n return (\n <button\n className={cn(baseStyles, variants[variant], sizes[size], className)}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\n}\n\nfunction Badge({ className, variant = \"default\", ...props }: BadgeProps) {\n const baseStyles =\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\";\n\n const variants: Record<string, string> = {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n };\n\n return (\n <div className={cn(baseStyles, variants[variant], className)} {...props} />\n );\n}\n\nexport { Badge };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Input = React.forwardRef<\n HTMLInputElement,\n React.InputHTMLAttributes<HTMLInputElement>\n>(({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nInput.displayName = \"Input\";\n\nexport { Input };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement>\n>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n {...props}\n />\n));\nLabel.displayName = \"Label\";\n\nexport { Label };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\ninterface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n role={decorative ? \"none\" : \"separator\"}\n aria-orientation={decorative ? undefined : orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n);\nSeparator.displayName = \"Separator\";\n\nexport { Separator };\n","import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Avatar = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n));\nAvatar.displayName = \"Avatar\";\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = \"AvatarImage\";\n\nconst AvatarFallback = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import { Icon } from \"../components/Icon\";\nimport {\n Button,\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n Badge,\n Input,\n Label,\n Separator,\n Avatar,\n AvatarImage,\n AvatarFallback,\n} from \"../components/ui\";\nimport {\n Block,\n ElementBlock,\n DefaultComponentBlock,\n TextBlock,\n ComponentBlock,\n ComponentRegistry,\n} from \"../types\";\n\nexport function isTextBlock(block: Block): block is TextBlock {\n return block.type === \"text\";\n}\n\nexport function isElementBlock(block: Block): block is ElementBlock {\n return block.type === \"element\";\n}\n\nexport function isDefaultComponentBlock(\n block: Block\n): block is DefaultComponentBlock {\n return block.type === \"component\";\n}\n\nexport function isComponentBlock(block: Block): block is ComponentBlock {\n return block.type === \"custom-component\";\n}\n\n/**\n * Built-in SDK components that are always available.\n * These don't require the user to install any additional packages.\n * Includes all common UI components used in SiteIO projects.\n */\nexport const SDK_BUILT_IN_COMPONENTS: ComponentRegistry = {\n // Icons\n Icon,\n // Button\n Button,\n // Card\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n // Badge\n Badge,\n // Form elements\n Input,\n Label,\n // Layout\n Separator,\n // Avatar\n Avatar,\n AvatarImage,\n AvatarFallback,\n};\n\n/**\n * Default fallback tags for components when no registry is provided.\n * Maps component names to semantic HTML elements.\n * Note: These are FALLBACKS - the actual styling comes from the compiled CSS.\n */\nconst DEFAULT_COMPONENT_TAGS: Record<string, keyof JSX.IntrinsicElements> = {\n Button: \"button\",\n Link: \"a\",\n Image: \"img\",\n Input: \"input\",\n Textarea: \"textarea\",\n Label: \"label\",\n Separator: \"hr\",\n Badge: \"span\",\n Card: \"div\",\n CardContent: \"div\",\n CardHeader: \"div\",\n CardTitle: \"h3\",\n CardDescription: \"p\",\n CardFooter: \"div\",\n Avatar: \"span\",\n AvatarImage: \"img\",\n AvatarFallback: \"span\",\n Table: \"table\",\n TableHeader: \"thead\",\n TableBody: \"tbody\",\n TableFooter: \"tfoot\",\n TableRow: \"tr\",\n TableHead: \"th\",\n TableCell: \"td\",\n TableCaption: \"caption\",\n};\n\nexport function getBlockCurrentClassNames(block: Block): string[] {\n const defaultClassNames = block.classNames?.default || [];\n const addedClassNames = block.classNames?.added || [];\n const removedClassNames = block.classNames?.removed || [];\n\n // Start with the default class names\n let currentClassNames = [...defaultClassNames];\n\n // Add the added class names\n currentClassNames = currentClassNames.concat(addedClassNames);\n\n // Remove the removed class names\n currentClassNames = currentClassNames.filter(\n (className) => !removedClassNames.includes(className)\n );\n\n // Return the unique set of class names\n return Array.from(new Set(currentClassNames));\n}\n\nconst VIEWPORT_HEIGHT = 900;\n\nexport function convertVhClassesToPx(classNames: string[]): string[] {\n const viewportHeight = VIEWPORT_HEIGHT;\n\n const vhUnits = [\"vh\", \"dvh\", \"svh\", \"lvh\"];\n const screenClasses = [\"h-screen\", \"h-dvh\", \"h-svh\", \"h-lvh\"];\n\n return classNames.map((className) => {\n // Handle h-screen and similar classes\n const screenMatch = screenClasses.find((sc) => className.includes(sc));\n if (screenMatch) {\n return className.replace(screenMatch, `h-[${viewportHeight}px]`);\n }\n\n // Handle percentage-based vh units\n for (const unit of vhUnits) {\n if (className.includes(unit)) {\n const match = className.match(new RegExp(`(\\\\d+)${unit}`));\n if (match) {\n const value = parseInt(match[1], 10);\n const pxValue = (value / 100) * viewportHeight;\n return className.replace(`${value}${unit}`, `${pxValue}px`);\n }\n }\n }\n\n return className;\n });\n}\n\nexport function getBlockClassnamesToApply(\n block: Block,\n options?: {\n isPreview?: boolean;\n replaceVhClasses?: boolean;\n }\n): string[] {\n const { isPreview = false, replaceVhClasses = true } = options || {};\n let currentClassNames = getBlockCurrentClassNames(block);\n\n if (isPreview) {\n const isLink = isElementBlock(block) && block.tag === \"a\";\n\n if (isLink) {\n currentClassNames = [...currentClassNames, \"cursor-pointer\"];\n }\n }\n\n if (replaceVhClasses) {\n return convertVhClassesToPx(currentClassNames);\n }\n\n return currentClassNames;\n}\n\n/**\n * Gets the tag or component to render for a block.\n *\n * @param block - The block to get the tag for\n * @param componentRegistry - Optional registry of React components\n * @returns A React component, HTML tag name, or undefined\n */\nexport function getBlockTagName(\n block: ElementBlock | DefaultComponentBlock,\n componentRegistry?: ComponentRegistry\n): React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined {\n if (isDefaultComponentBlock(block)) {\n // First, check SDK built-in components (Icon, etc.)\n if (SDK_BUILT_IN_COMPONENTS[block.component]) {\n return SDK_BUILT_IN_COMPONENTS[block.component];\n }\n\n // Then, try to get the component from the user's registry\n if (componentRegistry && componentRegistry[block.component]) {\n return componentRegistry[block.component];\n }\n\n // Fallback to semantic HTML tags for common components\n if (DEFAULT_COMPONENT_TAGS[block.component]) {\n return DEFAULT_COMPONENT_TAGS[block.component];\n }\n\n // Last resort: render as div\n return \"div\";\n }\n\n return (block.tag as keyof JSX.IntrinsicElements) ?? \"div\";\n}\n","import { BooleanExpression, ComparisonOperator, NAryLogicalOperator } from \"../types\";\n\nexport function evaluateExpression(\n expression: BooleanExpression,\n props: Record<string, any>,\n): boolean {\n if (\"type\" in expression && (expression.type === \"and\" || expression.type === \"or\" || expression.type === \"not\")) {\n return evaluateNAryLogicalOperator(expression as NAryLogicalOperator, props);\n }\n\n if (\"type\" in expression && (expression.type === \"eq\" || expression.type === \"neq\")) {\n return evaluateComparisonOperator(expression as ComparisonOperator, props);\n }\n\n return true;\n}\n\nfunction evaluateNAryLogicalOperator(\n operator: NAryLogicalOperator,\n props: Record<string, any>,\n): boolean {\n if (operator.type === \"not\") {\n if (operator.operands.length !== 1) return true;\n return !evaluateExpression(operator.operands[0], props);\n }\n\n if (operator.type === \"and\") {\n return operator.operands.every((operand) => evaluateExpression(operand, props));\n }\n\n if (operator.type === \"or\") {\n return operator.operands.some((operand) => evaluateExpression(operand, props));\n }\n\n return true;\n}\n\nfunction evaluateComparisonOperator(\n operator: ComparisonOperator,\n props: Record<string, any>,\n): boolean {\n const leftValue = getOperandValue(operator.left, props);\n const rightValue = getOperandValue(operator.right, props);\n\n if (operator.type === \"eq\") {\n return leftValue === rightValue;\n }\n\n if (operator.type === \"neq\") {\n return leftValue !== rightValue;\n }\n\n return true;\n}\n\nfunction getOperandValue(operand: { type: string; value: any }, props: Record<string, any>): any {\n if (operand.type === \"field\") {\n return props[operand.value];\n }\n\n if (operand.type === \"value\") {\n return operand.value;\n }\n\n return undefined;\n}\n\n\n\n\n","import { Block, Component, TextBlock } from \"../types\";\nimport { isComponentBlock, isDefaultComponentBlock, isElementBlock } from \"./blockUtils\";\n\nexport interface CurrentComponent {\n id: string;\n props: Record<string, any>;\n propsConfig: Record<string, any>;\n}\n\nfunction isPropValue(value: any): boolean {\n return typeof value === \"string\" && value.startsWith(\"{{\") && value.endsWith(\"}}\");\n}\n\nfunction getPropNameFromValue(value: string): string {\n return value.slice(2, -2).trim();\n}\n\nexport function getBlockText(block: TextBlock, props?: Record<string, any>): string {\n if (block.text.startsWith(\"{\") && props) {\n const propName = block.text.slice(1, -1).replace(\"props.\", \"\");\n return props?.[propName]?.toString() || block.text;\n }\n return block.text;\n}\n\nexport function htmlToText(html: string): string {\n if (typeof window === \"undefined\") return html;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n return doc.body.textContent || \"\";\n}\n\nexport function getBlockProps(\n block: Block,\n currentComponent: CurrentComponent | null,\n): Record<string, any> {\n const props = { ...block.props };\n if (!currentComponent) return props;\n\n for (const key in props) {\n const value = props[key];\n\n // If a prop is set to the prop of a component, substitute it with the actual value of the component prop\n if (isPropValue(value)) {\n const propName = getPropNameFromValue(value);\n const componentPropValue = currentComponent.props[propName];\n\n if (componentPropValue !== undefined) {\n props[key] = componentPropValue;\n }\n }\n }\n\n return props;\n}\n\nexport function getBlockPropsToApply(\n block: Block,\n currentComponent: CurrentComponent | null,\n options?: {\n isPreview?: boolean;\n },\n): Record<string, any> {\n const { isPreview = false } = options || {};\n\n // If it's the instance of a component, the props don't need to be applied to the component block itself,\n // rather they are handled by the component block renderer.\n const props = isComponentBlock(block) ? {} : getBlockProps(block, currentComponent);\n\n if (!isPreview) {\n // If it's a Link component, set href to \"#\" so it doesn't navigate anywhere\n if (isDefaultComponentBlock(block) && block.component === \"Link\") {\n props.href = \"#\";\n } else {\n // Otherwise, just delete href (for a normal anchor tag)\n delete props.href;\n }\n\n const isButton =\n (isDefaultComponentBlock(block) && block.component === \"Button\") ||\n (isElementBlock(block) && block.tag === \"button\");\n if (isButton) {\n props.type = \"button\";\n }\n }\n\n // Remove Next.js Image-specific props that shouldn't be passed to DOM elements\n // Note: asChild is intentionally kept as it's needed by Radix components (Button, etc.)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n ...domProps\n } = props;\n\n // Handle asChild - add data-parent-block-id for proper block identification\n const isAsChild = !!domProps?.asChild;\n if (isAsChild) {\n domProps[\"data-parent-block-id\"] = block.id;\n }\n\n return {\n ...domProps,\n \"data-block-id\": block.id,\n };\n}\n","import { forwardRef } from \"react\";\nimport { Block, Component, ComponentRegistry } from \"../types\";\nimport {\n isTextBlock,\n isComponentBlock,\n getBlockClassnamesToApply,\n getBlockTagName,\n} from \"../utils/blockUtils\";\nimport { evaluateExpression } from \"../utils/booleanExpressions\";\nimport {\n getBlockProps,\n getBlockPropsToApply,\n getBlockText,\n htmlToText,\n CurrentComponent,\n} from \"../utils/propsUtils\";\nimport { cn } from \"../utils/cn\";\n\ninterface PreviewBlockRendererProps {\n block: Block;\n components?: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[];\n currentComponent?: CurrentComponent | null;\n replaceVhClasses?: boolean;\n className?: string;\n /** Registry of UI components (Button, Card, etc.) for proper rendering */\n componentRegistry?: ComponentRegistry;\n [key: string]: any;\n}\n\nexport const PreviewChildrenRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n ({ block, ...restProps }, ref) => {\n if (!block.children) return null;\n\n if (block.children.length === 1) {\n return <PreviewBlockRenderer block={block.children[0]} ref={ref} {...restProps} />;\n }\n\n return (\n <>\n {block.children.map((child: Block) => (\n <PreviewBlockRenderer key={child.id} block={child} {...restProps} />\n ))}\n </>\n );\n },\n);\n\nPreviewChildrenRenderer.displayName = \"ChildrenRenderer\";\n\n/**\n * Strip props that are not valid DOM attributes.\n * This includes React-specific props, Next.js Image props, and Framer Motion animation props.\n */\nconst stripNonDomProps = (p: Record<string, any>) => {\n const {\n // React/Radix props\n asChild,\n // Next.js Image props\n blurDataURL,\n fill,\n placeholder,\n priority,\n quality,\n sizes,\n unoptimized,\n loader,\n srcSet,\n // Framer Motion animation props\n whileHover,\n whileTap,\n whileFocus,\n whileDrag,\n whileInView,\n animate,\n initial,\n exit,\n transition,\n variants,\n layout,\n layoutId,\n drag,\n dragConstraints,\n dragElastic,\n dragMomentum,\n dragTransition,\n dragPropagation,\n dragControls,\n dragListener,\n dragSnapToOrigin,\n onDrag,\n onDragStart,\n onDragEnd,\n onDirectionLock,\n onDragTransitionEnd,\n onAnimationStart,\n onAnimationComplete,\n onUpdate,\n onPan,\n onPanStart,\n onPanEnd,\n onTap,\n onTapStart,\n onTapCancel,\n onHoverStart,\n onHoverEnd,\n onViewportEnter,\n onViewportLeave,\n viewport,\n custom,\n inherit,\n // Other non-DOM props that might leak through\n motionValue,\n transformTemplate,\n ...clean\n } = p ?? {};\n return clean;\n};\n\nexport const PreviewBlockRenderer = forwardRef<HTMLElement, PreviewBlockRendererProps>(\n (\n {\n block,\n components = [],\n currentComponent,\n replaceVhClasses = false,\n componentRegistry,\n ...rest\n },\n ref,\n ) => {\n const classNamesToApply = getBlockClassnamesToApply(block, {\n isPreview: false, // SSR mode - no preview features\n replaceVhClasses,\n });\n const className = cn(\n // If is text block, don't apply the className from the parent (with asChild), since text blocks normally can't have props at all since they're just text nodes.\n classNamesToApply,\n isTextBlock(block) ? undefined : rest?.className,\n );\n const blockProps = getBlockPropsToApply(block, currentComponent ?? null, {\n isPreview: false, // SSR mode - no preview/client-side features\n });\n\n if (block.renderCondition) {\n const shouldRender = evaluateExpression(block.renderCondition, currentComponent?.props ?? {});\n if (!shouldRender) return null;\n }\n\n if (isTextBlock(block)) {\n return <>{htmlToText(getBlockText(block, currentComponent?.props))}</>;\n }\n\n if (isComponentBlock(block)) {\n const component = components.find(\n (component: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">) =>\n component.id === block.componentId,\n );\n if (!component) return null;\n\n // For nested components, the props could be set to a prop of the outer component\n const currentComponentProps = getBlockProps(block, currentComponent ?? null);\n const innerCurrentComponent: CurrentComponent = {\n id: component.id,\n props: currentComponentProps,\n propsConfig: component.propsConfig,\n };\n\n return (\n <PreviewBlockRenderer\n block={component.blocks[0]}\n components={components}\n currentComponent={innerCurrentComponent}\n componentRegistry={componentRegistry}\n className={className}\n />\n );\n }\n\n const Tag = getBlockTagName(block, componentRegistry);\n if (!Tag) return null;\n\n const mergedProps: Record<string, any> = {\n // ...rest shouldn't be passed to text blocks because they normally can't have props at all since they're just text nodes.\n ...(isTextBlock(block) ? {} : rest),\n className,\n // blockProps Needs to be after ...rest to override the props passed from a parent component (e.g. data-block-id). (for child of asChild component)\n ...blockProps,\n ref,\n };\n\n // In SSR mode, links work normally - no client-side navigation needed\n // Remove onClick handlers that would require client-side code\n\n // Only strip non-DOM props when Tag is a real DOM element (string), not a React component\n const finalProps = typeof Tag === \"string\" ? stripNonDomProps(mergedProps) : mergedProps;\n\n if (!block.children?.length) {\n return <Tag {...finalProps} />;\n }\n\n return (\n <Tag {...finalProps}>\n <PreviewChildrenRenderer\n block={block}\n components={components}\n currentComponent={currentComponent}\n componentRegistry={componentRegistry}\n />\n </Tag>\n );\n },\n);\n\nPreviewBlockRenderer.displayName = \"BlockRenderer\";\n","import { Theme, ThemeItem } from \"../types\";\n\nexport function applyFontsToDocument(document: Document, fonts: ThemeItem[]) {\n const root = document.documentElement;\n const head = document.head;\n\n // Simple implementation - in production you'd want to handle Google Fonts and local fonts\n fonts.forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n root.style.setProperty(font.variable, fontFamily);\n });\n}\n\nexport function applyColorToDocument(document: Document, color: ThemeItem) {\n document.documentElement.style.setProperty(color.variable, color.value);\n}\n\nexport function applyBorderRadiusToDocument(\n document: Document,\n borderRadius: number\n) {\n document.documentElement.style.setProperty(\"--radius\", `${borderRadius}rem`);\n}\n\nexport function applyThemeToDocument(document: Document, theme: Theme) {\n applyFontsToDocument(document, Object.values(theme.fonts));\n applyBorderRadiusToDocument(document, theme.borderRadius);\n Object.values(theme.colors).forEach((color) =>\n applyColorToDocument(document, color)\n );\n}\n\n/**\n * Generate CSS styles for theme that can be injected into a style tag for SSR.\n * This is a pure function that works on the server.\n * Uses scoped selectors to ensure SiteIO theme variables take precedence over project theme.\n */\nexport function applyThemeToStyleTag(theme: Theme): string {\n const styles: string[] = [];\n\n // Apply fonts\n Object.values(theme.fonts).forEach((font) => {\n const fontFamily = `\"${font.value}\"`;\n styles.push(` ${font.variable}: ${fontFamily} !important;`);\n });\n\n // Apply border radius\n styles.push(` --radius: ${theme.borderRadius}rem !important;`);\n\n // Apply colors - SiteIO uses HSL format (e.g., \"250 93% 66%\")\n Object.values(theme.colors).forEach((color) => {\n styles.push(` ${color.variable}: ${color.value} !important;`);\n });\n\n // Use high specificity selectors to ensure SiteIO theme variables override consuming app\n // The [data-siteio-theme] attribute is added to the SDK wrapper element\n const scopedStyles = styles.map((s) => s.replace(\" !important\", \"\"));\n\n return `\n/* SiteIO Base Styles - Required for proper rendering */\n:root {\n /* Default fallback values - will be overridden by theme */\n --background: 0 0% 5%;\n --foreground: 0 0% 98%;\n --card: 0 0% 17%;\n --card-foreground: 0 0% 98%;\n --popover: 0 0% 17%;\n --popover-foreground: 0 0% 98%;\n --primary: 217 91% 60%;\n --primary-foreground: 210 40% 98%;\n --secondary: 0 0% 17%;\n --secondary-foreground: 0 0% 98%;\n --muted: 0 0% 14.9%;\n --muted-foreground: 0 0% 63.9%;\n --accent: 0 0% 33%;\n --accent-foreground: 0 0% 98%;\n --destructive: 345 87% 53%;\n --destructive-foreground: 0 0% 98%;\n --border: 0 0% 15%;\n --input: 0 0% 14.9%;\n --ring: 0 0% 83.1%;\n --radius: 0.75rem;\n}\n\n/* SiteIO Theme Variables - Override with project theme */\n:root {\n${styles.join(\"\\n\")}\n}\n\n/* SiteIO Theme Variables - Scoped to SDK component */\n[data-siteio-theme] {\n${styles.join(\"\\n\")}\n}\n\n/* Ensure child elements also have access to variables */\n[data-siteio-theme] * {\n${scopedStyles.join(\"\\n\")}\n}\n\n/* SiteIO Base Element Styles */\n[data-siteio-theme] {\n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n}\n\n/* Utility class mappings for Tailwind CDN compatibility */\n.bg-background { background-color: hsl(var(--background)) !important; }\n.bg-foreground { background-color: hsl(var(--foreground)) !important; }\n.bg-card { background-color: hsl(var(--card)) !important; }\n.bg-popover { background-color: hsl(var(--popover)) !important; }\n.bg-primary { background-color: hsl(var(--primary)) !important; }\n.bg-secondary { background-color: hsl(var(--secondary)) !important; }\n.bg-muted { background-color: hsl(var(--muted)) !important; }\n.bg-accent { background-color: hsl(var(--accent)) !important; }\n.bg-destructive { background-color: hsl(var(--destructive)) !important; }\n\n.text-foreground { color: hsl(var(--foreground)) !important; }\n.text-background { color: hsl(var(--background)) !important; }\n.text-card-foreground { color: hsl(var(--card-foreground)) !important; }\n.text-popover-foreground { color: hsl(var(--popover-foreground)) !important; }\n.text-primary { color: hsl(var(--primary)) !important; }\n.text-primary-foreground { color: hsl(var(--primary-foreground)) !important; }\n.text-secondary-foreground { color: hsl(var(--secondary-foreground)) !important; }\n.text-muted-foreground { color: hsl(var(--muted-foreground)) !important; }\n.text-accent-foreground { color: hsl(var(--accent-foreground)) !important; }\n.text-destructive { color: hsl(var(--destructive)) !important; }\n.text-destructive-foreground { color: hsl(var(--destructive-foreground)) !important; }\n\n.border-border { border-color: hsl(var(--border)) !important; }\n.border-input { border-color: hsl(var(--input)) !important; }\n.ring-ring { --tw-ring-color: hsl(var(--ring)) !important; }\n.ring-offset-background { --tw-ring-offset-color: hsl(var(--background)) !important; }\n\n.rounded-lg { border-radius: var(--radius) !important; }\n.rounded-md { border-radius: calc(var(--radius) - 2px) !important; }\n.rounded-sm { border-radius: calc(var(--radius) - 4px) !important; }\n\n/* Hover states with opacity */\n.hover\\\\:bg-primary\\\\/90:hover { background-color: hsl(var(--primary) / 0.9) !important; }\n.hover\\\\:bg-primary\\\\/80:hover { background-color: hsl(var(--primary) / 0.8) !important; }\n.hover\\\\:bg-secondary\\\\/80:hover { background-color: hsl(var(--secondary) / 0.8) !important; }\n.hover\\\\:bg-destructive\\\\/90:hover { background-color: hsl(var(--destructive) / 0.9) !important; }\n.hover\\\\:bg-accent:hover { background-color: hsl(var(--accent)) !important; }\n.hover\\\\:text-accent-foreground:hover { color: hsl(var(--accent-foreground)) !important; }\n\n/* Focus visible states */\n.focus-visible\\\\:outline-none:focus-visible { outline: 2px solid transparent; outline-offset: 2px; }\n.focus-visible\\\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\\\:ring-ring:focus-visible { --tw-ring-color: hsl(var(--ring)); }\n.focus-visible\\\\:ring-offset-2:focus-visible { --tw-ring-offset-width: 2px; }\n\n/* Disabled states */\n.disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n.disabled\\\\:pointer-events-none:disabled { pointer-events: none; }\n\n/* Card styles */\n.shadow-sm { box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); }\n\n/* Input & Form elements */\ninput, textarea, select {\n background-color: transparent;\n border-color: hsl(var(--input));\n}\n\n/* Separator */\nhr, [role=\"separator\"] {\n border-color: hsl(var(--border));\n background-color: hsl(var(--border));\n}\n\n/* Button transitions */\nbutton, [role=\"button\"], a {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n/* Border default */\n.border { border-width: 1px; border-color: hsl(var(--border)); }\n`.trim();\n}\n","import { fetchProject } from \"../utils/fetchProject\";\nimport { PreviewBlockRenderer } from \"./PreviewBlockRenderer\";\nimport { RewebProjectProps, Component, ProjectData } from \"../types\";\nimport { applyThemeToStyleTag } from \"../utils/theme\";\n\n/**\n * Pure SSR server component that fetches and renders project data on the server.\n * No client-side JavaScript required - works entirely in SSR mode.\n */\nexport async function RewebProject({\n projectId,\n token,\n initialPageId,\n config,\n className,\n componentRegistry,\n}: RewebProjectProps) {\n // Fetch data on the server\n let data: ProjectData;\n let error: Error | null = null;\n\n try {\n data = await fetchProject({\n projectId,\n token,\n apiUrl: config?.apiUrl,\n });\n } catch (err) {\n error = err instanceof Error ? err : new Error(\"Failed to fetch project\");\n // Return error UI - this will be rendered on server\n return (\n <div className={className}>\n <div>Error: {error.message}</div>\n </div>\n );\n }\n\n // Determine which page to render\n let currentPageId = initialPageId;\n if (!currentPageId) {\n // Find home page (url === \"/\")\n const homePage = data.pages.find((page) => page.url === \"/\");\n if (homePage) {\n currentPageId = homePage.public_id;\n } else if (data.pages.length > 0) {\n currentPageId = data.pages[0].public_id;\n }\n }\n\n const currentPage = data.pages.find((page) => page.public_id === currentPageId);\n if (!currentPage) {\n return (\n <div className={className}>\n <div>Page not found</div>\n </div>\n );\n }\n\n // Prepare components data\n const components: Pick<Component, \"id\" | \"blocks\" | \"propsConfig\">[] = data.components.map(\n (component) => ({\n id: component.public_id,\n blocks: component.blocks,\n propsConfig: component.props_config,\n }),\n );\n\n // Generate theme styles for SSR\n const themeStyles = applyThemeToStyleTag(data.project.theme);\n const projectCss = data.styles?.css ?? \"\";\n\n // Debug info (visible in page source)\n const debugInfo = `\n/* SiteIO SDK Debug Info:\n * Theme colors count: ${Object.keys(data.project.theme?.colors || {}).length}\n * Project CSS length: ${projectCss.length} chars\n * Theme styles length: ${themeStyles.length} chars\n */`;\n\n return (\n <>\n {/* Inject theme styles for SSR - scoped to SiteIO component */}\n <style\n data-siteio-theme-styles\n dangerouslySetInnerHTML={{ __html: debugInfo + \"\\n\" + themeStyles }}\n />\n {projectCss ? (\n <style data-siteio-project-css dangerouslySetInnerHTML={{ __html: projectCss }} />\n ) : null}\n <div className={className} data-siteio-theme>\n {currentPage.blocks.map((block) => (\n <PreviewBlockRenderer\n key={block.id}\n block={block}\n components={components}\n componentRegistry={componentRegistry}\n />\n ))}\n </div>\n </>\n );\n}\n"]}
{
"name": "@tapstack/siteio-react-sdk",
"version": "0.0.8",
"version": "0.0.10",
"description": "SDK for rendering SiteIO projects in external Next.js applications",

@@ -29,3 +29,3 @@ "main": "./dist/index.js",

"type": "git",
"url": "https://github.com/Tapni-GmbH/siteio.git",
"url": "https://github.com/Tapni-GmbH/monorepo-siteio-render.git",
"directory": "packages/siteio-react-sdk"

@@ -32,0 +32,0 @@ },

# @tapstack/siteio-react-sdk
SDK for rendering SiteIO projects in external Next.js applications.
## Installation

@@ -6,0 +8,0 @@