@deneb-ui/create-template 2.0.32 → 2.0.34

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deneb-ui/create-template",
3
- "version": "2.0.32",
3
+ "version": "2.0.34",
4
4
  "description": "Scaffold production-ready DENEB UI storefront templates for Next.js in seconds.",
5
5
  "bin": {
6
6
  "create-deneb-template": "bin/index.js",
@@ -131,6 +131,18 @@
131
131
  },
132
132
  { "key": "body", "type": "textarea", "label": "Description" }
133
133
  ]
134
+ },
135
+ {
136
+ "key": "demoPreOrderCta",
137
+ "type": "list",
138
+ "label": "Demo Pre Order Cta",
139
+ "itemLabel": "Demo Pre Order Cta",
140
+ "minItems": 0,
141
+ "maxItems": 12,
142
+ "fields": [
143
+ { "key": "buttonLabel", "type": "text", "label": "Button Label" },
144
+ { "key": "buttonUrl", "type": "url", "label": "Button Url" }
145
+ ]
134
146
  }
135
147
  ]
136
148
  },
@@ -154,6 +166,22 @@
154
166
  "label": "About image",
155
167
  "recommendedWidth": 1200,
156
168
  "recommendedHeight": 900
169
+ },
170
+ { "key": "collageHeading", "type": "text", "label": "Collage Heading" },
171
+ { "key": "collageDescription", "type": "textarea", "label": "Collage Description" },
172
+ { "key": "historyHeading", "type": "text", "label": "History Heading" },
173
+ { "key": "history", "type": "textarea", "label": "History" },
174
+ {
175
+ "key": "collageImages",
176
+ "type": "list",
177
+ "label": "Collage Images",
178
+ "itemLabel": "Collage Image",
179
+ "minItems": 0,
180
+ "maxItems": 12,
181
+ "fields": [
182
+ { "key": "image", "type": "image", "label": "Image" },
183
+ { "key": "caption", "type": "text", "label": "Caption" }
184
+ ]
157
185
  }
158
186
  ]
159
187
  },
@@ -217,6 +245,8 @@
217
245
  { "key": "phone", "type": "tel", "label": "Phone" },
218
246
  { "key": "email", "type": "email", "label": "Email" },
219
247
  { "key": "address", "type": "textarea", "label": "Address" },
248
+ { "key": "directionsLabel", "type": "text", "label": "Directions Label" },
249
+ { "key": "directionsUrl", "type": "url", "label": "Directions Url" },
220
250
  { "key": "formTitle", "type": "text", "label": "Form heading" },
221
251
  { "key": "submitLabel", "type": "text", "label": "Submit button" }
222
252
  ]
@@ -18,7 +18,7 @@
18
18
  "next": "15.5.23",
19
19
  "react": "19.2.8",
20
20
  "react-dom": "19.2.8",
21
- "@deneb-ui/ui": "^2.0.32"
21
+ "@deneb-ui/ui": "^2.0.34"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@eslint/eslintrc": "3.3.6",
@@ -28,7 +28,7 @@
28
28
  "eslint": "9.39.5",
29
29
  "eslint-config-next": "15.5.23",
30
30
  "typescript": "5.8.3",
31
- "@deneb-ui/cli": "^2.0.32",
31
+ "@deneb-ui/cli": "^2.0.34",
32
32
  "tailwindcss": "^3.4.17",
33
33
  "postcss": "8.5.26",
34
34
  "autoprefixer": "^10.4.20"
@@ -1,11 +1,13 @@
1
1
  'use client';
2
2
 
3
- import { contentObject, contentText, useSiteData } from '@/lib/siteDataContext';
3
+ import { HeritageCollage } from '@deneb-ui/ui';
4
+ import { contentObject, contentText, contentList, useSiteData } from '@/lib/siteDataContext';
4
5
  import { withBasePath } from '@/lib/utils';
5
6
 
6
7
  export default function AboutPage() {
7
8
  const siteData = useSiteData();
8
9
  const about = contentObject(contentObject(siteData.content).about);
10
+ const collageImages = contentList(about.collageImages) as Array<{ id?: string; image?: string; caption?: string }>;
9
11
 
10
12
  return (
11
13
  <div data-preview-page-key="about_us">
@@ -21,6 +23,21 @@ export default function AboutPage() {
21
23
  data-preview-field-path="about.imageUrl"
22
24
  />
23
25
  </section>
26
+
27
+ <section className="page-section" data-design-section="about-heritage">
28
+ <HeritageCollage
29
+ collageHeading={contentText(about.collageHeading)}
30
+ collageDescription={contentText(about.collageDescription)}
31
+ historyHeading={contentText(about.historyHeading)}
32
+ history={contentText(about.history)}
33
+ images={collageImages}
34
+ collageHeadingPath="about.collageHeading"
35
+ collageDescriptionPath="about.collageDescription"
36
+ historyHeadingPath="about.historyHeading"
37
+ historyPath="about.history"
38
+ listPath="about.collageImages"
39
+ />
40
+ </section>
24
41
  </div>
25
42
  );
26
43
  }
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useState, type FormEvent } from 'react';
4
+ import { MapLink } from '@deneb-ui/ui';
4
5
  import { contentObject, contentText, useSiteData } from '@/lib/siteDataContext';
5
6
 
6
7
  export default function ContactPage() {
@@ -8,6 +9,13 @@ export default function ContactPage() {
8
9
  const contact = contentObject(contentObject(siteData.content).contact);
9
10
  const [status, setStatus] = useState('');
10
11
 
12
+ const directionsLabel = contentText(contact.directionsLabel) || 'Get Directions';
13
+ const directionsUrl =
14
+ contentText(contact.directionsUrl) ||
15
+ contentText(contact.mapUrl) ||
16
+ contentText(contact.addressUrl);
17
+ const address = contentText(contact.address);
18
+
11
19
  async function handleSubmit(event: FormEvent<HTMLFormElement>) {
12
20
  event.preventDefault();
13
21
  const form = event.currentTarget;
@@ -48,7 +56,16 @@ export default function ContactPage() {
48
56
  <div className="contact-details">
49
57
  <a href={`tel:${contentText(contact.phone)}`} data-preview-field-path="contact.phone">{contentText(contact.phone)}</a>
50
58
  <a href={`mailto:${contentText(contact.email)}`} data-preview-field-path="contact.email">{contentText(contact.email)}</a>
51
- <p data-preview-field-path="contact.address">{contentText(contact.address)}</p>
59
+ <p data-preview-field-path="contact.address">{address}</p>
60
+ <MapLink
61
+ mapUrl={directionsUrl}
62
+ address={address}
63
+ label={directionsLabel}
64
+ labelFieldPath="contact.directionsLabel"
65
+ urlFieldPath="contact.directionsUrl"
66
+ variant="outline"
67
+ size="md"
68
+ />
52
69
  </div>
53
70
  <form
54
71
  className="contact-form"
@@ -9,11 +9,9 @@ import {
9
9
  import { pageRoute, withBasePath } from '@/lib/utils';
10
10
  import {
11
11
  EditableText,
12
- EditableImage,
13
12
  EditableList,
14
13
  EditableCard,
15
- EditableBox,
16
- EditableGrid,
14
+ ListActionCta,
17
15
  } from '@deneb-ui/ui';
18
16
 
19
17
 
@@ -26,6 +24,11 @@ export default function HomePage() {
26
24
  const content = contentObject(siteData.content);
27
25
  const home = contentObject(content.home);
28
26
  const features = contentList(home.features);
27
+ const demoCta = contentObject(
28
+ (contentList(home.demoPreOrderCta)[0] as Record<string, unknown> | undefined) ?? {}
29
+ );
30
+ const demoCtaLabel = contentText(demoCta.buttonLabel) || 'Book a Demo';
31
+ const demoCtaUrl = contentText(demoCta.buttonUrl) || '';
29
32
  const selectedPages =
30
33
  siteData.requirements?.requiredPages ??
31
34
  siteData.template?.structure?.pages ??
@@ -133,6 +136,15 @@ export default function HomePage() {
133
136
  data-preview-field-path="home.introBody"
134
137
  defaultValue={contentText(home.introBody)}
135
138
  />
139
+ <div style={{ display: 'flex', justifyContent: 'center', marginTop: '1.5rem' }}>
140
+ <ListActionCta
141
+ listPath="home.demoPreOrderCta"
142
+ editable
143
+ buttonLabel={demoCtaLabel}
144
+ buttonUrl={demoCtaUrl}
145
+ className="button-primary"
146
+ />
147
+ </div>
136
148
  </div>
137
149
  </section>
138
150
 
@@ -63,12 +63,22 @@
63
63
  { "title": "Auto-Balancing Layouts", "body": "Cards, grids, and containers automatically balance and fill space seamlessly across all screen sizes." },
64
64
  { "title": "Strict Visual Editing", "body": "Direct bindings enable merchants to click, edit, and preview changes without breaking template styles." },
65
65
  { "title": "1-Click Clean Packaging", "body": "Built-in zip command strips heavy caches, node_modules, and git files so uploads pass instantly." }
66
- ]
66
+ ],
67
+ "demoPreOrderCta": [{ "buttonLabel": "Book a Demo", "buttonUrl": "https://wa.me/94771234567" }]
67
68
  },
68
69
  "about": {
69
70
  "heading": "Built for the next generation of online storefronts",
70
71
  "body": "The Fivora connects businesses with high-converting, beautifully crafted templates. This starter template demonstrates clean monorepo architecture, responsive typography, and auto-balancing components.",
71
- "imageUrl": "/placeholder.svg"
72
+ "imageUrl": "/placeholder.svg",
73
+ "collageHeading": "Our story in pictures",
74
+ "collageDescription": "A quick visual tour of how we design, build, and ship merchant-ready storefronts.",
75
+ "historyHeading": "Where we started",
76
+ "history": "We began as a small team helping local businesses move online. Today our templates power visual editing labs, strict Fivora contracts, and one-click packaging for developers worldwide.",
77
+ "collageImages": [
78
+ { "id": "studio", "image": "/placeholder.svg", "caption": "Design studio" },
79
+ { "id": "build", "image": "/placeholder.svg", "caption": "Build & test" },
80
+ { "id": "ship", "image": "/placeholder.svg", "caption": "Ship to Fivora" }
81
+ ]
72
82
  },
73
83
  "servicesPage": {
74
84
  "heading": "Template Services & Capabilities",
@@ -96,6 +106,8 @@
96
106
  "phone": "+94 11 234 5678",
97
107
  "email": "developer@fivora.lk",
98
108
  "address": "Colombo, Sri Lanka",
109
+ "directionsLabel": "Get Directions",
110
+ "directionsUrl": "https://maps.app.goo.gl/example",
99
111
  "formTitle": "Send an enquiry",
100
112
  "submitLabel": "Send Message",
101
113
  "directMessageText": "Send us a direct message",