@lucaismyname/create-l1-stack 0.0.21 → 0.0.23

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +14 -14
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucaismyname/create-l1-stack",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
package/src/index.js CHANGED
@@ -341,6 +341,12 @@ async function applyContainerPreset(targetDir, language, presetKey) {
341
341
  'components',
342
342
  language === 'ts' ? 'TopNav.tsx' : 'TopNav.jsx'
343
343
  )
344
+ const sidebarPath = path.join(
345
+ targetDir,
346
+ 'src',
347
+ 'components',
348
+ language === 'ts' ? 'SidebarLayout.tsx' : 'SidebarLayout.jsx'
349
+ )
344
350
 
345
351
  const patchMaxW = async (filePath) => {
346
352
  try {
@@ -357,6 +363,7 @@ async function applyContainerPreset(targetDir, language, presetKey) {
357
363
 
358
364
  await patchMaxW(appPath)
359
365
  await patchMaxW(topNavPath)
366
+ await patchMaxW(sidebarPath)
360
367
  }
361
368
 
362
369
  function notFoundPageTs() {
@@ -375,14 +382,6 @@ function errorBoundaryJs() {
375
382
  return `import * as React from 'react'\n\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError(error) {\n return { hasError: true, error }\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"space-y-2\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Something went wrong</h1>\n <p className=\"text-muted-foreground\">An unexpected error occurred.</p>\n </div>\n )\n }\n\n return this.props.children\n }\n}\n`
376
383
  }
377
384
 
378
- function sidebarLayoutTs(containerMaxW) {
379
- return `import { useMemo, useState } from 'react'\nimport { Link, NavLink, useLocation } from 'react-router-dom'\n\nconst navLinkClassName = ({ isActive }: { isActive: boolean }) =>\n [\n 'flex items-center rounded-md px-3 py-2 text-sm font-medium transition-colors',\n isActive ? 'bg-accent text-accent-foreground' : 'text-muted-foreground hover:text-foreground hover:bg-accent/40',\n ].join(' ')\n\nexport default function SidebarLayout({ children }: { children: React.ReactNode }) {\n const [open, setOpen] = useState(false)\n const location = useLocation()\n\n useMemo(() => {\n setOpen(false)\n }, [location.pathname])\n\n return (\n <div className=\"min-h-dvh\">\n <header className=\"border-b md:hidden\">\n <div className=\"mx-auto flex h-14 ${containerMaxW} items-center justify-between px-4\">\n <Link to=\"/\" className=\"text-sm font-semibold\">\n L1 Stack\n </Link>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm\"\n onClick={() => setOpen((v) => !v)}\n >\n Menu\n </button>\n </div>\n </header>\n\n <div className=\"mx-auto ${containerMaxW} px-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-[240px_1fr] md:gap-8\">\n <aside className=\"md:sticky md:top-6 md:h-[calc(100dvh-3rem)] md:py-6\">\n <div className={open ? 'block' : 'hidden md:block'}>\n <div className=\"py-6 md:py-0\">\n <div className=\"mb-6 hidden md:block\">\n <Link to=\"/\" className=\"text-sm font-semibold\">\n L1 Stack\n </Link>\n </div>\n <nav className=\"space-y-1\">\n <NavLink to=\"/\" end className={navLinkClassName}>\n Home\n </NavLink>\n <NavLink to=\"/integrations\" className={navLinkClassName}>\n Integrations\n </NavLink>\n </nav>\n </div>\n </div>\n </aside>\n\n <main className=\"py-10\">{children}</main>\n </div>\n </div>\n </div>\n )\n}\n`
380
- }
381
-
382
- function sidebarLayoutJs(containerMaxW) {
383
- return `import { useMemo, useState } from 'react'\nimport { Link, NavLink, useLocation } from 'react-router-dom'\n\nconst navLinkClassName = ({ isActive }) =>\n [\n 'flex items-center rounded-md px-3 py-2 text-sm font-medium transition-colors',\n isActive ? 'bg-accent text-accent-foreground' : 'text-muted-foreground hover:text-foreground hover:bg-accent/40',\n ].join(' ')\n\nexport default function SidebarLayout({ children }) {\n const [open, setOpen] = useState(false)\n const location = useLocation()\n\n useMemo(() => {\n setOpen(false)\n }, [location.pathname])\n\n return (\n <div className=\"min-h-dvh\">\n <header className=\"border-b md:hidden\">\n <div className=\"mx-auto flex h-14 ${containerMaxW} items-center justify-between px-4\">\n <Link to=\"/\" className=\"text-sm font-semibold\">\n L1 Stack\n </Link>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm\"\n onClick={() => setOpen((v) => !v)}\n >\n Menu\n </button>\n </div>\n </header>\n\n <div className=\"mx-auto ${containerMaxW} px-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-[240px_1fr] md:gap-8\">\n <aside className=\"md:sticky md:top-6 md:h-[calc(100dvh-3rem)] md:py-6\">\n <div className={open ? 'block' : 'hidden md:block'}>\n <div className=\"py-6 md:py-0\">\n <div className=\"mb-6 hidden md:block\">\n <Link to=\"/\" className=\"text-sm font-semibold\">\n L1 Stack\n </Link>\n </div>\n <nav className=\"space-y-1\">\n <NavLink to=\"/\" end className={navLinkClassName}>\n Home\n </NavLink>\n <NavLink to=\"/integrations\" className={navLinkClassName}>\n Integrations\n </NavLink>\n </nav>\n </div>\n </div>\n </aside>\n\n <main className=\"py-10\">{children}</main>\n </div>\n </div>\n </div>\n )\n}\n`
384
- }
385
-
386
385
  async function applyLayout(targetDir, language, layoutKey, containerPresetKey) {
387
386
  const appPath = path.join(targetDir, 'src', language === 'ts' ? 'App.tsx' : 'App.jsx')
388
387
  const topNavPath = path.join(
@@ -419,12 +418,13 @@ async function applyLayout(targetDir, language, layoutKey, containerPresetKey) {
419
418
  const containerMaxW = preset.maxW
420
419
 
421
420
  if (layoutKey === 'sidebar') {
422
- await fs.mkdir(path.dirname(sidebarPath), { recursive: true })
423
- await fs.writeFile(
424
- sidebarPath,
425
- language === 'ts' ? sidebarLayoutTs(containerMaxW) : sidebarLayoutJs(containerMaxW),
426
- 'utf8'
427
- )
421
+ try {
422
+ const src = await fs.readFile(sidebarPath, 'utf8')
423
+ const next = src.replace(/__L1_CONTAINER_MAXW__/g, containerMaxW)
424
+ if (next !== src) await fs.writeFile(sidebarPath, next, 'utf8')
425
+ } catch {
426
+ // ignore
427
+ }
428
428
 
429
429
  await fse.remove(topNavPath)
430
430