xertica-ui 2.9.6 → 2.9.8

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": "xertica-ui",
3
- "version": "2.9.6",
3
+ "version": "2.9.8",
4
4
  "description": "Xertica UI — Enterprise-grade React design system with Tailwind CSS v4, Radix UI, and AI-first documentation.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -54,7 +54,9 @@
54
54
  },
55
55
  "./style.css": "./dist/xertica-ui.css"
56
56
  },
57
- "bin": "./dist/cli.js",
57
+ "bin": {
58
+ "xertica-ui": "dist/cli.js"
59
+ },
58
60
  "scripts": {
59
61
  "dev": "npm run dev --prefix templates",
60
62
  "dev:pages": "vite",
@@ -1,3 +1,349 @@
1
- import { LandingPage } from 'xertica-ui/pages';
1
+ import React from 'react';
2
+ import {
3
+ BookOpen,
4
+ Braces,
5
+ Code2,
6
+ Component,
7
+ Figma,
8
+ FileCode2,
9
+ Github,
10
+ Layers,
11
+ Package,
12
+ ShieldCheck,
13
+ Sparkles,
14
+ SquareTerminal,
15
+ SwatchBook,
16
+ } from 'lucide-react';
17
+ import { useTranslation } from 'react-i18next';
18
+ import { IsotypeDiagonal, IsotypeFrames, XerticaLogo } from 'xertica-ui/brand';
19
+ import {
20
+ ComplianceBadgeRow,
21
+ CTASection,
22
+ FeatureRow,
23
+ Hero,
24
+ HowItWorksSteps,
25
+ MarketingFooter,
26
+ MarketingNavbar,
27
+ SectionHeading,
28
+ ServiceCardGrid,
29
+ StatBand,
30
+ TopAccentCards,
31
+ } from 'xertica-ui/blocks';
2
32
 
3
- export { LandingPage };
33
+ /**
34
+ * Landing page — starter demo content.
35
+ *
36
+ * This is the same marketing composition Xertica UI uses for its own landing
37
+ * page, given to you as an editable starting point. Replace the copy in
38
+ * `src/locales/<lang>/pages/landing.json` and swap out sections/blocks below
39
+ * to build your own page — everything here is yours to redesign.
40
+ */
41
+ export function LandingPage() {
42
+ const { t } = useTranslation();
43
+
44
+ return (
45
+ <div className="h-full w-full overflow-y-auto bg-background">
46
+ <MarketingNavbar
47
+ logo={<XerticaLogo className="h-8 w-auto text-primary dark:text-foreground" variant="theme" />}
48
+ links={[
49
+ { label: t('landing.nav.product'), href: '#' },
50
+ { label: t('landing.nav.resources'), href: '#' },
51
+ { label: t('landing.nav.pricing'), href: '#' },
52
+ { label: t('landing.nav.contact'), href: '#' },
53
+ ]}
54
+ cta={{ label: t('landing.nav.login'), href: '#' }}
55
+ openMenuLabel={t('landing.nav.openMenu')}
56
+ closeMenuLabel={t('landing.nav.closeMenu')}
57
+ />
58
+
59
+ <Hero
60
+ eyebrow={{ label: t('landing.hero.eyebrow'), icon: <Sparkles /> }}
61
+ title={t('landing.hero.title')}
62
+ description={t('landing.hero.description')}
63
+ primaryCta={{ label: t('landing.hero.primaryCta'), href: '#' }}
64
+ secondaryCta={{ label: t('landing.hero.secondaryCta'), href: '#' }}
65
+ visual={<IsotypeDiagonal className="mx-auto w-full max-w-md" />}
66
+ />
67
+
68
+ <section className="mx-auto max-w-7xl px-4 py-16 sm:px-6 lg:px-8 md:py-24">
69
+ <TopAccentCards
70
+ items={[
71
+ {
72
+ title: t('landing.framing.purpose.title'),
73
+ body: t('landing.framing.purpose.body'),
74
+ color: 'chart-4',
75
+ },
76
+ {
77
+ title: t('landing.framing.problem.title'),
78
+ body: t('landing.framing.problem.body'),
79
+ bullets: [
80
+ t('landing.framing.problem.bullet1'),
81
+ t('landing.framing.problem.bullet2'),
82
+ t('landing.framing.problem.bullet3'),
83
+ ],
84
+ color: 'chart-5',
85
+ },
86
+ ]}
87
+ />
88
+ </section>
89
+
90
+ <section className="bg-card">
91
+ <div className="mx-auto max-w-7xl px-4 py-16 sm:px-6 lg:px-8 md:py-24">
92
+ <SectionHeading
93
+ title={t('landing.ecosystem.title')}
94
+ accentColor="chart-1"
95
+ className="mb-12"
96
+ />
97
+
98
+ <ServiceCardGrid
99
+ variant="card"
100
+ columns={4}
101
+ items={[
102
+ {
103
+ icon: <Figma />,
104
+ color: 'primary',
105
+ title: t('landing.ecosystem.figma.title'),
106
+ description: t('landing.ecosystem.figma.description'),
107
+ bullets: [
108
+ t('landing.ecosystem.figma.bullet1'),
109
+ t('landing.ecosystem.figma.bullet2'),
110
+ ],
111
+ },
112
+ {
113
+ icon: <FileCode2 />,
114
+ color: 'chart-1',
115
+ title: t('landing.ecosystem.vscode.title'),
116
+ description: t('landing.ecosystem.vscode.description'),
117
+ bullets: [
118
+ t('landing.ecosystem.vscode.bullet1'),
119
+ t('landing.ecosystem.vscode.bullet2'),
120
+ ],
121
+ },
122
+ {
123
+ icon: <Component />,
124
+ color: 'chart-5',
125
+ title: t('landing.ecosystem.storybook.title'),
126
+ description: t('landing.ecosystem.storybook.description'),
127
+ bullets: [
128
+ t('landing.ecosystem.storybook.bullet1'),
129
+ t('landing.ecosystem.storybook.bullet2'),
130
+ ],
131
+ },
132
+ {
133
+ icon: <Github />,
134
+ color: 'chart-2',
135
+ title: t('landing.ecosystem.github.title'),
136
+ description: t('landing.ecosystem.github.description'),
137
+ bullets: [
138
+ t('landing.ecosystem.github.bullet1'),
139
+ t('landing.ecosystem.github.bullet2'),
140
+ ],
141
+ },
142
+ ]}
143
+ />
144
+ </div>
145
+ </section>
146
+
147
+ <FeatureRow
148
+ eyebrow={t('landing.features.theming.eyebrow')}
149
+ title={t('landing.features.theming.title')}
150
+ description={t('landing.features.theming.description')}
151
+ bullets={[
152
+ t('landing.features.theming.bullet1'),
153
+ t('landing.features.theming.bullet2'),
154
+ t('landing.features.theming.bullet3'),
155
+ ]}
156
+ visual={<IsotypeFrames variant="blue-magenta" className="mx-auto w-full max-w-md" />}
157
+ />
158
+
159
+ <FeatureRow
160
+ tone="card"
161
+ reverse
162
+ eyebrow={t('landing.features.composition.eyebrow')}
163
+ title={t('landing.features.composition.title')}
164
+ description={t('landing.features.composition.description')}
165
+ bullets={[
166
+ t('landing.features.composition.bullet1'),
167
+ t('landing.features.composition.bullet2'),
168
+ t('landing.features.composition.bullet3'),
169
+ ]}
170
+ visual={<IsotypeDiagonal className="mx-auto w-full max-w-md" />}
171
+ />
172
+
173
+ <FeatureRow
174
+ eyebrow={t('landing.features.onboarding.eyebrow')}
175
+ title={t('landing.features.onboarding.title')}
176
+ description={t('landing.features.onboarding.description')}
177
+ bullets={[
178
+ t('landing.features.onboarding.bullet1'),
179
+ t('landing.features.onboarding.bullet2'),
180
+ t('landing.features.onboarding.bullet3'),
181
+ ]}
182
+ visual={<IsotypeFrames variant="blue-yellow" className="mx-auto w-full max-w-md" />}
183
+ />
184
+
185
+ <section className="mx-auto max-w-7xl px-4 py-16 sm:px-6 lg:px-8 md:py-24">
186
+ <SectionHeading
187
+ title={t('landing.useCases.title')}
188
+ accentColor="chart-4"
189
+ className="mb-12"
190
+ />
191
+
192
+ <ServiceCardGrid
193
+ variant="card"
194
+ columns={3}
195
+ items={[
196
+ {
197
+ color: 'chart-2',
198
+ title: t('landing.useCases.ecommerce.title'),
199
+ description: t('landing.useCases.ecommerce.description'),
200
+ checklist: [
201
+ t('landing.useCases.ecommerce.check1'),
202
+ t('landing.useCases.ecommerce.check2'),
203
+ ],
204
+ className: 'border',
205
+ },
206
+ {
207
+ color: 'primary',
208
+ title: t('landing.useCases.saas.title'),
209
+ description: t('landing.useCases.saas.description'),
210
+ checklist: [t('landing.useCases.saas.check1'), t('landing.useCases.saas.check2')],
211
+ className: 'border',
212
+ },
213
+ {
214
+ color: 'chart-4',
215
+ title: t('landing.useCases.fintech.title'),
216
+ description: t('landing.useCases.fintech.description'),
217
+ checklist: [
218
+ t('landing.useCases.fintech.check1'),
219
+ t('landing.useCases.fintech.check2'),
220
+ ],
221
+ className: 'border',
222
+ },
223
+ ]}
224
+ />
225
+ </section>
226
+
227
+ <section className="bg-sidebar text-sidebar-foreground">
228
+ <div className="mx-auto max-w-5xl px-4 py-16 sm:px-6 lg:px-8 md:py-24">
229
+ <SectionHeading
230
+ title={t('landing.methodology.title')}
231
+ tone="sidebar"
232
+ accentColor="primary"
233
+ className="mb-12"
234
+ />
235
+
236
+ <HowItWorksSteps
237
+ items={[
238
+ {
239
+ icon: <SwatchBook />,
240
+ title: t('landing.methodology.tokensFirst.title'),
241
+ description: t('landing.methodology.tokensFirst.description'),
242
+ color: 'chart-4',
243
+ },
244
+ {
245
+ icon: <Layers />,
246
+ title: t('landing.methodology.primitives.title'),
247
+ description: t('landing.methodology.primitives.description'),
248
+ color: 'chart-2',
249
+ },
250
+ {
251
+ icon: <Braces />,
252
+ title: t('landing.methodology.compositionBlocks.title'),
253
+ description: t('landing.methodology.compositionBlocks.description'),
254
+ color: 'chart-1',
255
+ },
256
+ {
257
+ icon: <SquareTerminal />,
258
+ title: t('landing.methodology.cliTemplates.title'),
259
+ description: t('landing.methodology.cliTemplates.description'),
260
+ color: 'warning',
261
+ },
262
+ ]}
263
+ />
264
+ </div>
265
+ </section>
266
+
267
+ <section className="mx-auto max-w-7xl px-4 py-16 sm:px-6 lg:px-8 md:py-24">
268
+ <div className="rounded-2xl border border-border bg-card p-8 md:p-12">
269
+ <ComplianceBadgeRow
270
+ badges={[
271
+ {
272
+ icon: <ShieldCheck />,
273
+ label: t('landing.compliance.wcag.label'),
274
+ description: t('landing.compliance.wcag.description'),
275
+ },
276
+ {
277
+ icon: <Code2 />,
278
+ label: t('landing.compliance.typescript.label'),
279
+ description: t('landing.compliance.typescript.description'),
280
+ },
281
+ {
282
+ icon: <Package />,
283
+ label: t('landing.compliance.treeShakeable.label'),
284
+ description: t('landing.compliance.treeShakeable.description'),
285
+ },
286
+ {
287
+ icon: <BookOpen />,
288
+ label: t('landing.compliance.themeable.label'),
289
+ description: t('landing.compliance.themeable.description'),
290
+ },
291
+ ]}
292
+ />
293
+
294
+ <div className="my-10 border-t border-border" />
295
+
296
+ <StatBand
297
+ columns={3}
298
+ stats={[
299
+ { value: '99.9%', label: t('landing.stats.docsUptime'), color: 'success' },
300
+ { value: '<24h', label: t('landing.stats.avgResponseTime'), color: 'info' },
301
+ { value: '100%', label: t('landing.stats.typedComponents'), color: 'chart-5' },
302
+ ]}
303
+ />
304
+ </div>
305
+ </section>
306
+
307
+ <section className="mx-auto max-w-7xl px-4 pb-16 sm:px-6 lg:px-8 md:pb-24">
308
+ <CTASection
309
+ title={t('landing.cta.title')}
310
+ description={t('landing.cta.description')}
311
+ cta={{ label: t('landing.cta.primary'), href: '#' }}
312
+ secondaryCta={{ label: t('landing.cta.secondary'), href: '#' }}
313
+ />
314
+ </section>
315
+
316
+ <MarketingFooter
317
+ logo={<XerticaLogo className="h-8 w-auto text-primary dark:text-foreground" variant="theme" />}
318
+ tagline={t('landing.footer.tagline')}
319
+ columns={[
320
+ {
321
+ heading: t('landing.footer.product.heading'),
322
+ links: [
323
+ { label: t('landing.footer.product.components'), href: '#' },
324
+ { label: t('landing.footer.product.blocks'), href: '#' },
325
+ { label: t('landing.footer.product.themes'), href: '#' },
326
+ ],
327
+ },
328
+ {
329
+ heading: t('landing.footer.resources.heading'),
330
+ links: [
331
+ { label: t('landing.footer.resources.docs'), href: '#' },
332
+ { label: t('landing.footer.resources.cli'), href: '#' },
333
+ { label: t('landing.footer.resources.changelog'), href: '#' },
334
+ ],
335
+ },
336
+ {
337
+ heading: t('landing.footer.company.heading'),
338
+ links: [
339
+ { label: t('landing.footer.company.about'), href: '#' },
340
+ { label: t('landing.footer.company.contact'), href: '#' },
341
+ { label: t('landing.footer.company.careers'), href: '#' },
342
+ ],
343
+ },
344
+ ]}
345
+ copyright={t('landing.footer.copyright')}
346
+ />
347
+ </div>
348
+ );
349
+ }
@@ -93,3 +93,8 @@
93
93
  /* Gradients */
94
94
  --image-gradient-diagonal: var(--gradient-diagonal);
95
95
  }
96
+
97
+ /* Ensure the root element fills the screen height, allowing container-level scrolling */
98
+ #root {
99
+ height: 100%;
100
+ }
@@ -6,6 +6,7 @@
6
6
  "moduleResolution": "bundler",
7
7
  "allowSyntheticDefaultImports": true,
8
8
  "strict": true,
9
+ "skipLibCheck": true,
9
10
  "composite": true
10
11
  },
11
12
  "include": ["vite.config.ts"]