react-layout-sdk 1.1.19 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/init.js CHANGED
@@ -146,14 +146,14 @@ async function main() {
146
146
  const footerContent = `import React from 'react';\n\nexport default function Footer(props: any) {\n const text = props?.text || '© 2026 JD Layout';\n return (\n <footer style={{ padding: '20px', background: '#333', color: '#fff', textAlign: 'center', marginTop: '40px' }}>\n <p style={{ margin: 0 }}>{text}</p>\n </footer>\n );\n}\n`;
147
147
  await writeWithPrompt(footerPath, footerContent, 'components/Footer.tsx');
148
148
 
149
- // 4. Create layout.tsx (lowercase)
150
- const layoutPath = path.join(basePath, 'layout.tsx');
151
- const layoutContent = `import React from 'react';\n\nexport default function Layout({ layoutData, placeholderComponent: Placeholder }: any) {\n const { route } = layoutData.strapi;\n\n return (\n <>\n <header>\n <div id="header">\n {route && <Placeholder name="headless-header" rendering={route.placeholders['headless-header'] || []} />}\n </div>\n </header>\n\n <main style={{ minHeight: 'calc(100vh - 100px)' }}>\n <div id="content" className="pageContent">\n {route && <Placeholder name="headless-main" rendering={route.placeholders['headless-main'] || []} />}\n </div>\n </main>\n\n <footer>\n <div id="footer">\n {route && <Placeholder name="headless-footer" rendering={route.placeholders['headless-footer'] || []} />}\n </div>\n </footer>\n </>\n );\n}\n`;
152
- await writeWithPrompt(layoutPath, layoutContent, 'layout.tsx (Root/src level)');
153
-
154
149
  if (hasAppRouter) {
155
150
  console.log('🔍 Detected Next.js App Router');
156
151
 
152
+ // Create Combined App Router Layout
153
+ const layoutPath = path.join(basePath, 'app', 'layout.tsx');
154
+ const layoutContent = `import React from 'react';\n\n// This file serves as both Next.js global layout and Strapi component layout\nexport default function Layout({ children, layoutData, placeholderComponent: Placeholder }: any) {\n \n // 1. When Next.js renders this as the global app/layout.tsx\n if (!layoutData) {\n return (\n <html lang="en">\n <body>{children}</body>\n </html>\n );\n }\n\n // 2. When JDPage renders this for Strapi placeholders\n const { route } = layoutData.strapi;\n return (\n <>\n <header>\n <div id="header">\n {route && <Placeholder name="headless-header" rendering={route.placeholders['headless-header'] || []} />}\n </div>\n </header>\n\n <main style={{ minHeight: 'calc(100vh - 100px)' }}>\n <div id="content" className="pageContent">\n {route && <Placeholder name="headless-main" rendering={route.placeholders['headless-main'] || []} />}\n </div>\n </main>\n\n <footer>\n <div id="footer">\n {route && <Placeholder name="headless-footer" rendering={route.placeholders['headless-footer'] || []} />}\n </div>\n </footer>\n </>\n );\n}\n`;
155
+ await writeWithPrompt(layoutPath, layoutContent, 'app/layout.tsx (Combined Layout)');
156
+
157
157
  const existingAppPage = path.join(basePath, 'app', 'page.tsx');
158
158
  if (fs.existsSync(existingAppPage)) {
159
159
  const answer = await prompt(`⚠️ File app/page.tsx exists. Should we rename it to avoid conflicts with catch-all route? (Y/n) `);
@@ -168,11 +168,17 @@ async function main() {
168
168
  ensureDirSync(pageDir);
169
169
 
170
170
  const appPagePath = path.join(pageDir, 'page.tsx');
171
- const importLayoutPath = hasSrc ? '@/layout' : '../../layout';
171
+ const importLayoutPath = '../../layout';
172
172
  const appPageContent = `import React from 'react';\nimport { JDPage, generateJDMetadata } from 'react-layout-sdk';\nimport { componentMap } from '@/components/factory';\nimport Layout from '${importLayoutPath}';\n\nconst STRAPI_URL = process.env.NEXT_PUBLIC_STRAPI_URL || 'http://localhost:1337';\n\nexport const generateMetadata = ({ params }: { params: Promise<{ slug?: string[] }> }) => {\n return generateJDMetadata(params, STRAPI_URL);\n}\n\nexport default function Page({ params }: { params: Promise<{ slug?: string[] }> }) {\n return <JDPage params={params} apiUrl={STRAPI_URL} componentMap={componentMap} layoutComponent={Layout} />;\n}\n`;
173
173
  await writeWithPrompt(appPagePath, appPageContent, 'app/[[...slug]]/page.tsx');
174
174
  } else if (hasPagesRouter) {
175
175
  console.log('🔍 Detected Next.js Pages Router');
176
+
177
+ // Create Pages Router Layout in src/ or root
178
+ const layoutPath = path.join(basePath, 'layout.tsx');
179
+ const layoutContent = `import React from 'react';\n\nexport default function Layout({ layoutData, placeholderComponent: Placeholder }: any) {\n const { route } = layoutData.strapi;\n\n return (\n <>\n <header>\n <div id="header">\n {route && <Placeholder name="headless-header" rendering={route.placeholders['headless-header'] || []} />}\n </div>\n </header>\n\n <main style={{ minHeight: 'calc(100vh - 100px)' }}>\n <div id="content" className="pageContent">\n {route && <Placeholder name="headless-main" rendering={route.placeholders['headless-main'] || []} />}\n </div>\n </main>\n\n <footer>\n <div id="footer">\n {route && <Placeholder name="headless-footer" rendering={route.placeholders['headless-footer'] || []} />}\n </div>\n </footer>\n </>\n );\n}\n`;
180
+ await writeWithPrompt(layoutPath, layoutContent, 'layout.tsx (Root/src level)');
181
+ console.log('🔍 Detected Next.js Pages Router');
176
182
 
177
183
  const existingPagesIndex = path.join(basePath, 'pages', 'index.tsx');
178
184
  if (fs.existsSync(existingPagesIndex)) {
package/dist/index.js CHANGED
@@ -89,7 +89,7 @@ var Placeholder = ({ name, rendering, customProps, componentMap }) => {
89
89
  )));
90
90
  };
91
91
 
92
- // src/Layout.tsx
92
+ // src/layout.tsx
93
93
  var import_react2 = __toESM(require("react"));
94
94
  var JDLayout = ({ layoutData, placeholderComponent: Placeholder2 }) => {
95
95
  const { route } = layoutData.strapi;
package/dist/index.mjs CHANGED
@@ -48,7 +48,7 @@ var Placeholder = ({ name, rendering, customProps, componentMap }) => {
48
48
  )));
49
49
  };
50
50
 
51
- // src/Layout.tsx
51
+ // src/layout.tsx
52
52
  import React2 from "react";
53
53
  var JDLayout = ({ layoutData, placeholderComponent: Placeholder2 }) => {
54
54
  const { route } = layoutData.strapi;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-layout-sdk",
3
- "version": "1.1.19",
3
+ "version": "1.1.21",
4
4
  "description": "React components for JD SDK (Sitecore-like routing)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
package/src/Page.tsx CHANGED
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { fetchJDLayout } from './index';
3
- import { JDLayout } from './Layout';
3
+ import { JDLayout } from './layout';
4
4
  import { Placeholder } from './Placeholder';
5
5
 
6
6
  export interface JDPageProps {
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { Placeholder, ComponentFactory } from './Placeholder';
2
2
  export type { PlaceholderProps, ComponentFactoryProps } from './Placeholder';
3
- export { JDLayout } from './Layout';
4
- export type { JDLayoutProps } from './Layout';
3
+ export { JDLayout } from './layout';
4
+ export type { JDLayoutProps } from './layout';
5
5
  export { JDPage, generateJDMetadata } from './Page';
6
6
  export type { JDPageProps } from './Page';
7
7
 
package/tsconfig.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "strict": true,
9
9
  "esModuleInterop": true,
10
10
  "skipLibCheck": true,
11
- "forceConsistentCasingInFileNames": true,
11
+ "forceConsistentCasingInFileNames": false,
12
12
  "moduleResolution": "node",
13
13
  "jsx": "react"
14
14
  },
File without changes