@@ -69,8 +71,8 @@ export function StartImage
(props: StartImageProps): JSX.Element {
})}
>
- }>
- {cb => }
+ }>
+ {cb => }
(props: StartImageProps): JSX.Element {
{
if (!defer()) {
diff --git a/packages/image/src/__tests__/components.test.tsx b/packages/image/src/__tests__/components.test.tsx
new file mode 100644
index 000000000..175e496df
--- /dev/null
+++ b/packages/image/src/__tests__/components.test.tsx
@@ -0,0 +1,118 @@
+import { describe, it, expect } from "vitest";
+import { createRoot } from "solid-js";
+import { renderToString } from "solid-js/web";
+import { createLazyRender } from "../create-lazy-render";
+import { createClientSignal, ClientOnly } from "../client-only";
+import { StartImage } from "../Image";
+
+// ---------------------------------------------------------------------------
+// createLazyRender
+// ---------------------------------------------------------------------------
+describe("createLazyRender", () => {
+ it("starts with visible = false", () => {
+ let visible: boolean | undefined;
+
+ createRoot(dispose => {
+ const laze = createLazyRender();
+ visible = laze.visible;
+ dispose();
+ });
+
+ expect(visible).toBe(false);
+ });
+
+ it("exposes a callable ref setter", () => {
+ createRoot(dispose => {
+ const laze = createLazyRender();
+ expect(typeof laze.ref).toBe("function");
+ dispose();
+ });
+ });
+
+ it("returns correct shape with refresh option", () => {
+ createRoot(dispose => {
+ const laze = createLazyRender({ refresh: true });
+ expect(typeof laze.ref).toBe("function");
+ expect(laze.visible).toBe(false);
+ dispose();
+ });
+ });
+});
+
+// ---------------------------------------------------------------------------
+// createClientSignal (server context -- isServer is true in Node)
+// ---------------------------------------------------------------------------
+describe("createClientSignal", () => {
+ it("returns a function that resolves to false on the server", () => {
+ const signal = createClientSignal();
+ expect(typeof signal).toBe("function");
+ expect(signal()).toBe(false);
+ });
+});
+
+// ---------------------------------------------------------------------------
+// ClientOnly (server context)
+// ---------------------------------------------------------------------------
+describe("ClientOnly", () => {
+ it("renders the fallback in a server environment", () => {
+ const html = renderToString(() => (
+ loading}>
+ client content
+
+ ));
+
+ expect(html).toContain("loading");
+ expect(html).not.toContain("client content");
+ });
+
+ it("renders the fallback element when no children are given", () => {
+ const html = renderToString(() => (
+ placeholder } />
+ ));
+
+ expect(html).toContain("placeholder");
+ });
+});
+
+// ---------------------------------------------------------------------------
+// StartImage SSR regression
+// ---------------------------------------------------------------------------
+describe("StartImage SSR", () => {
+ it("does not throw ReferenceError: document is not defined", () => {
+ expect(() => {
+ renderToString(() => (
+