create-lacspace-app 1.0.0 → 1.1.0

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 (3) hide show
  1. package/README.md +4 -0
  2. package/dist/index.js +130 -1
  3. package/package.json +44 -10
package/README.md CHANGED
@@ -29,6 +29,10 @@ It asks for a project name and a template, scaffolds the project, installs depen
29
29
  | **business** | A professional company / agency site with services + CTA |
30
30
  | **ecommerce** | A modern storefront home with a featured product grid |
31
31
  | **saas** | A high-converting SaaS landing page with features + pricing |
32
+ | **blog** | An editorial blog / magazine home with a featured post + grid |
33
+ | **docs** | A documentation landing with quick-start + feature cards |
34
+ | **dashboard** | An admin app shell with a sidebar, stat cards and activity |
35
+ | **restaurant** | A warm restaurant / cafe site with a menu and reservations |
32
36
 
33
37
  Every template is a real Next.js 15 App Router + Tailwind v4 project — dark, modern, responsive, with a gradient accent you can theme.
34
38
 
package/dist/index.js CHANGED
@@ -20,7 +20,11 @@ var TEMPLATES = [
20
20
  { key: "personal", label: "Personal portfolio", description: "A sleek personal / developer portfolio with projects and contact.", accent: ["#6366f1", "#a855f7"], siteName: "Your Name", siteDescription: "Developer, designer & maker. Selected work and writing." },
21
21
  { key: "business", label: "Business site", description: "A professional company / agency site with services and a CTA.", accent: ["#2563eb", "#06b6d4"], siteName: "Acme Studio", siteDescription: "We design and build digital products that grow businesses." },
22
22
  { key: "ecommerce", label: "E-commerce storefront", description: "A modern product storefront home with a featured grid.", accent: ["#0d9488", "#84cc16"], siteName: "Acme Store", siteDescription: "Beautiful things, thoughtfully made. Free shipping worldwide." },
23
- { key: "saas", label: "SaaS landing", description: "A high-converting SaaS landing page with features and pricing.", accent: ["#7c3aed", "#ec4899"], siteName: "Acme Cloud", siteDescription: "The all-in-one platform your team will love. Ship faster." }
23
+ { key: "saas", label: "SaaS landing", description: "A high-converting SaaS landing page with features and pricing.", accent: ["#7c3aed", "#ec4899"], siteName: "Acme Cloud", siteDescription: "The all-in-one platform your team will love. Ship faster." },
24
+ { key: "blog", label: "Blog / magazine", description: "A clean editorial blog home with a featured post and a grid.", accent: ["#f97316", "#ef4444"], siteName: "The Journal", siteDescription: "Essays, notes and stories on building things that matter." },
25
+ { key: "docs", label: "Documentation", description: "A docs landing with quick-start and feature cards.", accent: ["#0ea5e9", "#6366f1"], siteName: "Acme Docs", siteDescription: "Everything you need to build with Acme \u2014 guides, API and examples." },
26
+ { key: "dashboard", label: "Admin dashboard", description: "An app dashboard shell with stat cards and a table.", accent: ["#10b981", "#14b8a6"], siteName: "Acme Admin", siteDescription: "Your control center \u2014 metrics, activity and management in one place." },
27
+ { key: "restaurant", label: "Restaurant / cafe", description: "A warm restaurant home with menu highlights and reservations.", accent: ["#e11d48", "#f59e0b"], siteName: "Olive & Ember", siteDescription: "Seasonal plates, natural wine and a warm room. Book a table." }
24
28
  ];
25
29
  var pkgJson = (ctx) => JSON.stringify({
26
30
  name: ctx.name,
@@ -276,6 +280,131 @@ function homePage(ctx) {
276
280
  </section>
277
281
  ${FOOTER(n)}`);
278
282
  }
283
+ if (ctx.template.key === "blog") {
284
+ return shell(`${NAV(n, ["Latest", "Topics", "About"])}
285
+ <section className="mx-auto max-w-3xl px-6 py-24">
286
+ <p className="mb-3 text-sm font-semibold uppercase tracking-widest text-white/40">The Journal</p>
287
+ <h1 className="text-5xl font-black leading-tight sm:text-6xl gradient-text">${n}</h1>
288
+ <p className="mt-6 text-lg text-white/60">${ctx.template.siteDescription}</p>
289
+ </section>
290
+ <section id="latest" className="mx-auto max-w-5xl px-6 pb-8">
291
+ <a href="#" className="group block rounded-3xl border border-white/10 bg-white/[0.02] p-8 transition hover:border-white/20">
292
+ <div className="mb-6 h-56 rounded-2xl gradient-bg opacity-80" />
293
+ <span className="text-xs font-semibold uppercase tracking-wider text-white/40">Featured</span>
294
+ <h2 className="mt-2 text-3xl font-bold group-hover:opacity-90">The one thing every product needs before launch</h2>
295
+ <p className="mt-2 text-white/60">A short, punchy dek that pulls the reader into the piece and makes them want more.</p>
296
+ </a>
297
+ </section>
298
+ <section className="mx-auto max-w-5xl px-6 py-12">
299
+ <div className="grid gap-8 sm:grid-cols-2">
300
+ {[1, 2, 3, 4].map((i) => (
301
+ <a key={i} href="#" className="group">
302
+ <div className="mb-4 h-40 rounded-xl gradient-bg opacity-70" />
303
+ <span className="text-xs uppercase tracking-wider text-white/40">Essay</span>
304
+ <h3 className="mt-1 text-xl font-semibold group-hover:opacity-90">A thoughtful headline for post {i}</h3>
305
+ <p className="mt-1 text-sm text-white/50">Two lines of supporting copy to set the scene for the reader.</p>
306
+ </a>
307
+ ))}
308
+ </div>
309
+ </section>
310
+ ${FOOTER(n)}`);
311
+ }
312
+ if (ctx.template.key === "docs") {
313
+ return shell(`${NAV(n, ["Guides", "API", "Examples"])}
314
+ <section className="mx-auto max-w-4xl px-6 py-28 text-center">
315
+ <h1 className="text-5xl font-black leading-tight sm:text-6xl"><span className="gradient-text">${n}</span></h1>
316
+ <p className="mx-auto mt-6 max-w-2xl text-lg text-white/60">${ctx.template.siteDescription}</p>
317
+ <div className="mt-8 inline-flex items-center gap-3 rounded-lg border border-white/10 bg-black/40 px-4 py-3 font-mono text-sm text-white/80">
318
+ <span className="text-white/40">$</span> npm install @acme/sdk
319
+ </div>
320
+ </section>
321
+ <section id="guides" className="mx-auto max-w-6xl px-6 py-12">
322
+ <div className="grid gap-6 md:grid-cols-3">
323
+ {[
324
+ { t: "Quick start", d: "Go from zero to your first request in five minutes." },
325
+ { t: "Guides", d: "Task-focused walkthroughs for the common paths." },
326
+ { t: "API reference", d: "Every endpoint, typed, with copy-paste examples." },
327
+ ].map((c) => (
328
+ <a key={c.t} href="#" className="rounded-2xl border border-white/10 bg-white/[0.02] p-8 transition hover:border-white/20">
329
+ <h3 className="text-xl font-bold gradient-text">{c.t}</h3>
330
+ <p className="mt-2 text-white/60">{c.d}</p>
331
+ </a>
332
+ ))}
333
+ </div>
334
+ </section>
335
+ ${FOOTER(n)}`);
336
+ }
337
+ if (ctx.template.key === "dashboard") {
338
+ return shell(`<div className="flex min-h-screen">
339
+ <aside className="hidden w-56 shrink-0 border-r border-white/10 p-6 md:block">
340
+ <div className="mb-8 text-lg font-black gradient-text">${n}</div>
341
+ <nav className="space-y-1 text-sm text-white/60">
342
+ {["Overview", "Analytics", "Customers", "Settings"].map((l) => (
343
+ <a key={l} href="#" className="block rounded-lg px-3 py-2 hover:bg-white/5 hover:text-white">{l}</a>
344
+ ))}
345
+ </nav>
346
+ </aside>
347
+ <main className="flex-1 p-6 md:p-10">
348
+ <h1 className="text-2xl font-bold">Overview</h1>
349
+ <p className="mt-1 text-white/50">${ctx.template.siteDescription}</p>
350
+ <div className="mt-8 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
351
+ {[
352
+ { l: "Revenue", v: "$48.2k", c: "+12%" }, { l: "Users", v: "12,480", c: "+3.4%" },
353
+ { l: "Orders", v: "1,204", c: "+8%" }, { l: "Churn", v: "1.2%", c: "-0.3%" },
354
+ ].map((s) => (
355
+ <div key={s.l} className="rounded-2xl border border-white/10 bg-white/[0.02] p-5">
356
+ <div className="text-sm text-white/50">{s.l}</div>
357
+ <div className="mt-1 text-2xl font-bold">{s.v}</div>
358
+ <div className="mt-1 text-xs text-emerald-400">{s.c}</div>
359
+ </div>
360
+ ))}
361
+ </div>
362
+ <div className="mt-6 rounded-2xl border border-white/10 bg-white/[0.02] p-6">
363
+ <div className="mb-4 font-semibold">Recent activity</div>
364
+ <div className="space-y-3">
365
+ {[1, 2, 3, 4].map((i) => (
366
+ <div key={i} className="flex items-center justify-between border-b border-white/5 pb-3 text-sm">
367
+ <span className="text-white/70">Event #{i}</span>
368
+ <span className="text-white/40">just now</span>
369
+ </div>
370
+ ))}
371
+ </div>
372
+ </div>
373
+ </main>
374
+ </div>`);
375
+ }
376
+ if (ctx.template.key === "restaurant") {
377
+ return shell(`${NAV(n, ["Menu", "Story", "Reserve"])}
378
+ <section className="mx-auto max-w-4xl px-6 py-28 text-center">
379
+ <p className="mb-4 text-sm font-semibold uppercase tracking-widest text-white/40">Est. 2026</p>
380
+ <h1 className="text-5xl font-black leading-tight sm:text-7xl gradient-text">${n}</h1>
381
+ <p className="mx-auto mt-6 max-w-xl text-lg text-white/60">${ctx.template.siteDescription}</p>
382
+ <a href="#reserve" className="mt-10 inline-block gradient-bg rounded-full px-8 py-3 font-semibold text-black">Reserve a table</a>
383
+ </section>
384
+ <section id="menu" className="mx-auto max-w-4xl px-6 py-16">
385
+ <h2 className="mb-10 text-center text-3xl font-bold">Tonight's plates</h2>
386
+ <div className="grid gap-6 sm:grid-cols-2">
387
+ {[
388
+ { n: "Charred leeks", p: "$14" }, { n: "Handmade tagliatelle", p: "$22" },
389
+ { n: "Wood-fired trout", p: "$28" }, { n: "Olive oil cake", p: "$11" },
390
+ ].map((d) => (
391
+ <div key={d.n} className="flex items-baseline justify-between gap-4 border-b border-white/10 pb-4">
392
+ <div>
393
+ <h3 className="text-lg font-semibold">{d.n}</h3>
394
+ <p className="text-sm text-white/50">A short, mouth-watering description of the dish.</p>
395
+ </div>
396
+ <span className="shrink-0 gradient-text font-bold">{d.p}</span>
397
+ </div>
398
+ ))}
399
+ </div>
400
+ </section>
401
+ <section id="reserve" className="mx-auto max-w-2xl px-6 py-24 text-center">
402
+ <h2 className="text-3xl font-bold">Join us</h2>
403
+ <p className="mt-3 text-white/60">Open Wed\u2013Sun, 5pm till late. Walk-ins welcome; bookings recommended.</p>
404
+ <a href="tel:+10000000000" className="mt-8 inline-block rounded-full border border-white/20 px-8 py-3 font-semibold hover:bg-white/5">Call to book</a>
405
+ </section>
406
+ ${FOOTER(n)}`);
407
+ }
279
408
  return shell(`${NAV(n, ["Features", "Pricing", "Sign in"])}
280
409
  <section className="mx-auto max-w-4xl px-6 py-28 text-center">
281
410
  <p className="mb-4 inline-block rounded-full border border-white/15 px-4 py-1 text-xs font-semibold text-white/60">New \xB7 v1.0</p>
package/package.json CHANGED
@@ -1,17 +1,51 @@
1
1
  {
2
2
  "name": "create-lacspace-app",
3
- "version": "1.0.0",
4
- "description": "Scaffold a beautiful, production-ready Next.js app from a Lacspace template — personal portfolio, business site, e-commerce or SaaS landing — pre-wired with SEO metadata + JSON-LD, security headers, sitemap and robots. Like create-next-app, but you start gorgeous.",
3
+ "version": "1.1.0",
4
+ "description": "Scaffold a beautiful, production-ready Next.js app from a Lacspace template — portfolio, business, e-commerce, SaaS, blog, docs, dashboard or restaurant — pre-wired with SEO, security headers, sitemap and robots. Like create-next-app, but you start gorgeous.",
5
5
  "type": "module",
6
- "bin": { "create-lacspace-app": "./dist/index.js" },
7
- "files": ["dist"],
8
- "scripts": { "build": "tsup", "prepublishOnly": "npm run build" },
9
- "keywords": ["create-lacspace-app", "nextjs", "next-app", "starter", "template", "scaffold", "boilerplate", "portfolio-template", "ecommerce-template", "saas-template", "cli", "create-next-app-alternative", "typescript"],
6
+ "bin": {
7
+ "create-lacspace-app": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "create-lacspace-app",
18
+ "nextjs",
19
+ "next-app",
20
+ "starter",
21
+ "template",
22
+ "scaffold",
23
+ "boilerplate",
24
+ "portfolio-template",
25
+ "ecommerce-template",
26
+ "saas-template",
27
+ "blog-template",
28
+ "dashboard-template",
29
+ "docs-template",
30
+ "cli",
31
+ "create-next-app-alternative",
32
+ "typescript"
33
+ ],
10
34
  "author": "Lacspace <contact@lacspace.com>",
11
35
  "license": "SEE LICENSE IN LICENSE",
12
36
  "homepage": "https://lacspace.com/packages",
13
- "repository": { "type": "git", "url": "git+https://github.com/lacspace/npm-packages.git", "directory": "create-lacspace-app" },
14
- "bugs": { "url": "https://github.com/lacspace/npm-packages/issues" },
15
- "engines": { "node": ">=18" },
16
- "publishConfig": { "access": "public" }
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/lacspace/npm-packages.git",
40
+ "directory": "create-lacspace-app"
41
+ },
42
+ "bugs": {
43
+ "url": "https://github.com/lacspace/npm-packages/issues"
44
+ },
45
+ "engines": {
46
+ "node": ">=18"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public"
50
+ }
17
51
  }