@utopia-studio-design/design-system-cli 0.6.1 → 0.7.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.
- package/README.md +28 -10
- package/bin/utopia-ds-mcp.mjs +6 -2
- package/bin/utopia-ds.mjs +94 -21
- package/data/docs/arabic-friendly.md +19 -2
- package/data/docs/billing-setup.md +80 -0
- package/data/docs/cer-003-032-033-round-8-repair.md +41 -0
- package/data/docs/cer-007-checkout.md +51 -0
- package/data/docs/cer-008-011-qa-repair.md +64 -0
- package/data/docs/cer-016-023-round-6-repair.md +92 -0
- package/data/docs/cer-024-031-round-7-repair.md +51 -0
- package/data/docs/cer-033-035-036-round-12-repair.md +37 -0
- package/data/docs/cer-035-037-round-10-repair.md +34 -0
- package/data/docs/charts.md +34 -3
- package/data/docs/chat-service-methodology.md +181 -0
- package/data/docs/code-block.md +20 -0
- package/data/docs/creative-production.md +149 -0
- package/data/docs/designer-agent-backend-contract.md +552 -0
- package/data/docs/email-resend.md +29 -0
- package/data/docs/foundations.md +46 -8
- package/data/docs/guide.md +9 -9
- package/data/docs/handover-billing-aiden.md +132 -0
- package/data/docs/logo-maker-methodology.md +109 -0
- package/data/docs/presentation-asset-repository.md +53 -0
- package/data/docs/product-architecture.md +42 -0
- package/data/docs/quick-start-ai.md +4 -4
- package/data/docs/shadcn-conversion.md +1 -1
- package/data/docs/sidebar-placement.md +56 -0
- package/data/docs/theme-authoring.md +6 -3
- package/data/manifests/catalog.json +42 -46
- package/data/manifests/components.json +317 -66
- package/data/manifests/logo-skills.json +174 -0
- package/data/manifests/motion-profiles.json +2 -2
- package/data/manifests/patterns.json +201 -7
- package/data/manifests/presentation-assets.schema.json +44 -0
- package/data/manifests/templates.json +87 -1
- package/data/manifests/theme-dextrum.json +7 -7
- package/data/manifests/theme-prism-mono.json +19 -0
- package/data/manifests/theme-utopia-cloudblur.json +135 -0
- package/data/manifests/theme-utopia-default.json +31 -31
- package/data/manifests/theme-vyapti.json +17 -1
- package/data/manifests/theme-y2k-pop.json +18 -0
- package/data/manifests/themes.json +285 -57
- package/data/templates/analytics-dashboard/main.tsx +14 -1
- package/data/templates/calendar-application/main.tsx +14 -1
- package/data/templates/chat-workspace/README.md +12 -0
- package/data/templates/chat-workspace/index.html +11 -0
- package/data/templates/chat-workspace/main.tsx +97 -0
- package/data/templates/chat-workspace/styles.css +19 -0
- package/data/templates/chat-workspace/template.manifest.json +13 -0
- package/data/templates/composition-registry-lab/main.tsx +12 -1
- package/data/templates/dashboard-composer/main.tsx +14 -1
- package/data/templates/database-workspace/main.tsx +14 -1
- package/data/templates/interaction-lab/main.tsx +12 -1
- package/data/templates/quantum-verification-story/README.md +12 -0
- package/data/templates/quantum-verification-story/components.json +21 -0
- package/data/templates/quantum-verification-story/eslint.config.mjs +13 -0
- package/data/templates/quantum-verification-story/next-env.d.ts +7 -0
- package/data/templates/quantum-verification-story/next.config.mjs +11 -0
- package/data/templates/quantum-verification-story/package-lock.json +7535 -0
- package/data/templates/quantum-verification-story/package.json +46 -0
- package/data/templates/quantum-verification-story/postcss.config.js +6 -0
- package/data/templates/quantum-verification-story/src/app/assessment/page.tsx +138 -0
- package/data/templates/quantum-verification-story/src/app/ceramic-theme.css +48 -0
- package/data/templates/quantum-verification-story/src/app/deployment/page.tsx +178 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Bold.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Medium.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Regular.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/ReadexPro-Variable.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-350.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-500.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-700.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/globals.css +175 -0
- package/data/templates/quantum-verification-story/src/app/layout.tsx +45 -0
- package/data/templates/quantum-verification-story/src/app/not-found.tsx +39 -0
- package/data/templates/quantum-verification-story/src/app/page.tsx +24 -0
- package/data/templates/quantum-verification-story/src/app/products/page.tsx +132 -0
- package/data/templates/quantum-verification-story/src/app/utopia-default.css +312 -0
- package/data/templates/quantum-verification-story/src/components/RotatingText.css +36 -0
- package/data/templates/quantum-verification-story/src/components/RotatingText.tsx +189 -0
- package/data/templates/quantum-verification-story/src/components/brand-mark.tsx +14 -0
- package/data/templates/quantum-verification-story/src/components/console-preview-section.tsx +57 -0
- package/data/templates/quantum-verification-story/src/components/console-preview.tsx +72 -0
- package/data/templates/quantum-verification-story/src/components/fade-up.tsx +54 -0
- package/data/templates/quantum-verification-story/src/components/floating-network.tsx +125 -0
- package/data/templates/quantum-verification-story/src/components/footer.tsx +83 -0
- package/data/templates/quantum-verification-story/src/components/harvest-timeline.tsx +70 -0
- package/data/templates/quantum-verification-story/src/components/lattice-diagram.tsx +73 -0
- package/data/templates/quantum-verification-story/src/components/lattice-field.tsx +129 -0
- package/data/templates/quantum-verification-story/src/components/nav.tsx +104 -0
- package/data/templates/quantum-verification-story/src/components/presentation-layout.tsx +91 -0
- package/data/templates/quantum-verification-story/src/components/readiness-estimator.tsx +135 -0
- package/data/templates/quantum-verification-story/src/components/scramble-text.tsx +60 -0
- package/data/templates/quantum-verification-story/src/components/section-backdrop.tsx +38 -0
- package/data/templates/quantum-verification-story/src/components/sections/clients.tsx +140 -0
- package/data/templates/quantum-verification-story/src/components/sections/contact.tsx +125 -0
- package/data/templates/quantum-verification-story/src/components/sections/hero.tsx +92 -0
- package/data/templates/quantum-verification-story/src/components/sections/moat.tsx +73 -0
- package/data/templates/quantum-verification-story/src/components/sections/offer.tsx +113 -0
- package/data/templates/quantum-verification-story/src/components/sections/pilot.tsx +63 -0
- package/data/templates/quantum-verification-story/src/components/sections/problem.tsx +53 -0
- package/data/templates/quantum-verification-story/src/components/text-particle.tsx +204 -0
- package/data/templates/quantum-verification-story/src/components/ticker.tsx +27 -0
- package/data/templates/quantum-verification-story/src/components/ui/badge.tsx +29 -0
- package/data/templates/quantum-verification-story/src/components/ui/button.tsx +55 -0
- package/data/templates/quantum-verification-story/src/components/ui/card.tsx +46 -0
- package/data/templates/quantum-verification-story/src/components/ui/cursor-driven-particle-typography.tsx +288 -0
- package/data/templates/quantum-verification-story/src/components/ui/input.tsx +20 -0
- package/data/templates/quantum-verification-story/src/components/ui/label.tsx +21 -0
- package/data/templates/quantum-verification-story/src/components/ui/separator.tsx +25 -0
- package/data/templates/quantum-verification-story/src/components/ui/textarea.tsx +19 -0
- package/data/templates/quantum-verification-story/src/lib/utils.ts +6 -0
- package/data/templates/quantum-verification-story/tailwind.config.js +95 -0
- package/data/templates/quantum-verification-story/template.manifest.json +23 -0
- package/data/templates/quantum-verification-story/tsconfig.json +42 -0
- package/data/templates/saas-solution-homepage/main.tsx +91 -14
- package/data/templates/saas-solution-homepage/privacy/index.html +1 -0
- package/data/templates/saas-solution-homepage/styles.css +47 -2
- package/data/templates/saas-solution-homepage/team/index.html +1 -0
- package/data/templates/saas-solution-homepage/template.manifest.json +41 -0
- package/data/templates/saas-solution-homepage/terms/index.html +1 -0
- package/lib/api.mjs +52 -3
- package/lib/template-runtime.mjs +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import Link from "next/link"
|
|
2
|
+
import { Button } from "@/components/ui/button"
|
|
3
|
+
import { LatticeField } from "@/components/lattice-field"
|
|
4
|
+
|
|
5
|
+
export default function NotFound() {
|
|
6
|
+
return (
|
|
7
|
+
<section className="bg-[var(--gray-950)] px-2 sm:px-3 py-2 sm:py-3">
|
|
8
|
+
<div className="relative overflow-hidden rounded-[24px] sm:rounded-[32px] bg-[var(--deep-900)]">
|
|
9
|
+
<div className="absolute inset-0 pointer-events-none"
|
|
10
|
+
style={{ background: "linear-gradient(180deg, var(--deep-800) 0%, var(--deep-900) 55%, var(--deep-950) 100%)" }} />
|
|
11
|
+
<LatticeField className="opacity-50" />
|
|
12
|
+
<div className="absolute inset-x-0 bottom-0 h-[70%] pointer-events-none"
|
|
13
|
+
style={{ background: "radial-gradient(60% 80% at 50% 120%, color-mix(in srgb, var(--primary-200) 40%, transparent) 0%, color-mix(in srgb, var(--primary-500) 20%, transparent) 35%, transparent 70%)" }} />
|
|
14
|
+
|
|
15
|
+
<div className="container-main relative z-10 py-28 lg:py-36 text-center">
|
|
16
|
+
<div className="font-mono text-[11px] tracking-[0.15em] uppercase text-[var(--primary-300)] mb-6">
|
|
17
|
+
Error 404 · Decryption failed
|
|
18
|
+
</div>
|
|
19
|
+
<h1 className="text-white font-bold leading-[1.05] tracking-tight mb-5 mx-auto"
|
|
20
|
+
style={{ fontSize: "clamp(3rem, 8vw + 1rem, 7rem)" }}>
|
|
21
|
+
404
|
|
22
|
+
</h1>
|
|
23
|
+
<p className="text-white/65 text-[17px] leading-[1.65] mx-auto mb-10" style={{ maxWidth: "44ch" }}>
|
|
24
|
+
This page couldn't be found — the only thing on this site that's harder to recover
|
|
25
|
+
than your pre-quantum keys.
|
|
26
|
+
</p>
|
|
27
|
+
<div className="flex flex-wrap items-center justify-center gap-3">
|
|
28
|
+
<Button asChild className="rounded-full bg-[var(--primary-500)] text-[var(--primary-foreground)] hover:bg-[var(--primary-400)] font-semibold h-11 px-7 text-[15px]">
|
|
29
|
+
<Link href="/">Back to safety</Link>
|
|
30
|
+
</Button>
|
|
31
|
+
<Button asChild variant="outline" className="rounded-full border-white/25 text-white hover:bg-white/10 hover:border-white/40 h-11 px-7 text-[15px] bg-transparent">
|
|
32
|
+
<Link href="/#contact">Contact us</Link>
|
|
33
|
+
</Button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</section>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HeroSection } from "@/components/sections/hero"
|
|
2
|
+
import { ProblemSection } from "@/components/sections/problem"
|
|
3
|
+
import { OfferSection } from "@/components/sections/offer"
|
|
4
|
+
import { MoatSection } from "@/components/sections/moat"
|
|
5
|
+
import { ClientsSection } from "@/components/sections/clients"
|
|
6
|
+
import { PilotSection } from "@/components/sections/pilot"
|
|
7
|
+
import { ContactSection } from "@/components/sections/contact"
|
|
8
|
+
import { PresentationLayout } from "@/components/presentation-layout"
|
|
9
|
+
|
|
10
|
+
export default function HomePage() {
|
|
11
|
+
return (
|
|
12
|
+
<PresentationLayout
|
|
13
|
+
sections={[
|
|
14
|
+
<HeroSection key="hero" />,
|
|
15
|
+
<ProblemSection key="problem" />,
|
|
16
|
+
<OfferSection key="offer" />,
|
|
17
|
+
<MoatSection key="moat" />,
|
|
18
|
+
<ClientsSection key="clients" />,
|
|
19
|
+
<PilotSection key="pilot" />,
|
|
20
|
+
<ContactSection key="contact" />,
|
|
21
|
+
]}
|
|
22
|
+
/>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { Metadata } from "next"
|
|
2
|
+
import Link from "next/link"
|
|
3
|
+
import { Search, GitBranch, Layers, GaugeCircle, ArrowRight } from "lucide-react"
|
|
4
|
+
import { Button } from "@/components/ui/button"
|
|
5
|
+
import { ScrambleText } from "@/components/scramble-text"
|
|
6
|
+
import { ConsolePreviewSection } from "@/components/console-preview-section"
|
|
7
|
+
|
|
8
|
+
export const metadata: Metadata = {
|
|
9
|
+
title: "Enterprise Products — Your Company",
|
|
10
|
+
description:
|
|
11
|
+
"Quantum-safe architecture products: cryptographic inventory, PQC migration engine, crypto-agility layer, and a compliance console — covering every stage of your post-quantum readiness.",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const products = [
|
|
15
|
+
{
|
|
16
|
+
icon: Search,
|
|
17
|
+
name: "Cryptographic Inventory",
|
|
18
|
+
tag: "Discover",
|
|
19
|
+
desc: "An automated scan of every key, certificate, library, and protocol across your stack — so you know exactly what's exposed before you migrate.",
|
|
20
|
+
specs: ["Agentless network + code scanning", "RSA / ECC / DH exposure mapping", "Certificate & key-lifecycle inventory"],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
icon: GitBranch,
|
|
24
|
+
name: "PQC Migration Engine",
|
|
25
|
+
tag: "Replace",
|
|
26
|
+
desc: "Automated rip-and-replace of legacy cryptography with NIST-standardized algorithms — validated against your real traffic, not a lab.",
|
|
27
|
+
specs: ["ML-KEM-768 / ML-DSA-65 integration", "Hybrid classical+PQC rollout", "Zero-downtime cutover playbooks"],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
icon: Layers,
|
|
31
|
+
name: "Crypto-Agility Layer",
|
|
32
|
+
tag: "Adapt",
|
|
33
|
+
desc: "A negotiation layer that lets you swap algorithms at runtime — so you're ready for the next standard, not locked to this one.",
|
|
34
|
+
specs: ["Runtime algorithm negotiation", "Policy-driven cipher selection", "Drop-in for TLS & API layers"],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
icon: GaugeCircle,
|
|
38
|
+
name: "Compliance Console",
|
|
39
|
+
tag: "Prove",
|
|
40
|
+
desc: "A single dashboard that tracks your post-quantum posture against every framework that matters — with board-ready evidence on demand.",
|
|
41
|
+
specs: ["NIST · RBI · CERT-In mapping", "Continuous posture scoring", "Exportable audit evidence"],
|
|
42
|
+
},
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
export default function ProductsPage() {
|
|
46
|
+
return (
|
|
47
|
+
<>
|
|
48
|
+
{/* Hero */}
|
|
49
|
+
<section className="section-y border-b border-[var(--color-border)] bg-white">
|
|
50
|
+
<div className="container-main">
|
|
51
|
+
<ScrambleText text="Enterprise Products" className="eyebrow mb-4 block" />
|
|
52
|
+
<h1 className="font-bold leading-[1.08] tracking-tight text-[var(--color-text-primary)] mb-6"
|
|
53
|
+
style={{ fontSize: "clamp(36px, 4vw, 60px)" }}>
|
|
54
|
+
Quantum-Safe<br />
|
|
55
|
+
<span className="text-[var(--primary-500)]">Architecture Products</span>
|
|
56
|
+
</h1>
|
|
57
|
+
<p className="text-[17px] leading-[1.7] text-[var(--color-text-secondary)] max-w-2xl">
|
|
58
|
+
From cryptographic inventory to crypto-agility — four modules that cover every stage of your
|
|
59
|
+
post-quantum readiness. Automated, verifiable, board-ready.
|
|
60
|
+
</p>
|
|
61
|
+
</div>
|
|
62
|
+
</section>
|
|
63
|
+
|
|
64
|
+
{/* Live console */}
|
|
65
|
+
<ConsolePreviewSection
|
|
66
|
+
eyebrow="The Compliance Console"
|
|
67
|
+
heading="See your posture, live."
|
|
68
|
+
body="The same console your team runs — continuous posture scoring, exposure mapping, and board-ready evidence in one place."
|
|
69
|
+
/>
|
|
70
|
+
|
|
71
|
+
{/* Products */}
|
|
72
|
+
<section className="section-y border-b border-[var(--color-border)] bg-white">
|
|
73
|
+
<div className="container-main">
|
|
74
|
+
<div className="mb-8">
|
|
75
|
+
<ScrambleText text="Enterprise Products" className="eyebrow mb-3 block" />
|
|
76
|
+
</div>
|
|
77
|
+
<div className="grid sm:grid-cols-2 gap-5">
|
|
78
|
+
{products.map((p) => {
|
|
79
|
+
const Icon = p.icon
|
|
80
|
+
return (
|
|
81
|
+
<div key={p.name}
|
|
82
|
+
className="rounded-2xl border border-[var(--color-border)] bg-white p-8 hover:shadow-md hover:border-[var(--color-border-strong)] transition-all flex flex-col">
|
|
83
|
+
<div className="flex items-center gap-4 mb-5">
|
|
84
|
+
<div className="flex items-center justify-center w-12 h-12 rounded-xl bg-[var(--deep-900)] shrink-0">
|
|
85
|
+
<Icon size={20} className="text-[var(--primary-400)]" strokeWidth={2} />
|
|
86
|
+
</div>
|
|
87
|
+
<div>
|
|
88
|
+
<div className="font-mono text-[10px] tracking-[0.14em] uppercase text-[var(--primary-500)] font-semibold">{p.tag}</div>
|
|
89
|
+
<h3 className="text-[19px] font-bold tracking-tight text-[var(--color-text-primary)]">{p.name}</h3>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
<p className="text-[14px] leading-[1.7] text-[var(--color-text-secondary)] mb-6">{p.desc}</p>
|
|
93
|
+
<ul className="space-y-2 list-none p-0 m-0 mt-auto border-t border-[var(--color-border)] pt-5">
|
|
94
|
+
{p.specs.map((s) => (
|
|
95
|
+
<li key={s} className="flex items-start gap-2 text-[13px] text-[var(--color-text-primary)] leading-snug">
|
|
96
|
+
<span className="text-[var(--primary-500)] mt-px shrink-0">→</span>{s}
|
|
97
|
+
</li>
|
|
98
|
+
))}
|
|
99
|
+
</ul>
|
|
100
|
+
</div>
|
|
101
|
+
)
|
|
102
|
+
})}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</section>
|
|
106
|
+
|
|
107
|
+
{/* CTA */}
|
|
108
|
+
<section className="section-y bg-white">
|
|
109
|
+
<div className="container-main">
|
|
110
|
+
<div className="rounded-2xl bg-[var(--deep-900)] px-8 py-12 sm:px-12 sm:py-14 text-center">
|
|
111
|
+
<h2 className="text-white font-bold leading-[1.15] tracking-tight mb-4"
|
|
112
|
+
style={{ fontSize: "clamp(24px, 3vw, 36px)" }}>
|
|
113
|
+
Not sure where you're exposed?
|
|
114
|
+
</h2>
|
|
115
|
+
<p className="text-white/60 text-[16px] leading-[1.7] mx-auto mb-8" style={{ maxWidth: "48ch" }}>
|
|
116
|
+
Run a scan and get a board-ready readiness report — see exactly where you're exposed,
|
|
117
|
+
in days.
|
|
118
|
+
</p>
|
|
119
|
+
<div className="flex flex-wrap items-center justify-center gap-3">
|
|
120
|
+
<Button asChild className="rounded-full bg-[var(--primary-500)] text-[var(--gray-950)] hover:bg-[var(--primary-400)] font-semibold h-11 px-7 text-[15px]">
|
|
121
|
+
<Link href="/assessment">Run a Free Scan</Link>
|
|
122
|
+
</Button>
|
|
123
|
+
<Button asChild variant="outline" className="rounded-full border-white/25 text-white hover:bg-white/10 hover:border-white/40 h-11 px-7 text-[15px] bg-transparent">
|
|
124
|
+
<Link href="/#contact">Talk to Sales <ArrowRight size={16} className="ml-1" /></Link>
|
|
125
|
+
</Button>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
</section>
|
|
130
|
+
</>
|
|
131
|
+
)
|
|
132
|
+
}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: "TWK Lausanne";
|
|
3
|
+
src: url("./fonts/TWKLausanne-350.ttf") format("truetype");
|
|
4
|
+
font-weight: 350;
|
|
5
|
+
font-style: normal;
|
|
6
|
+
font-display: swap;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@font-face {
|
|
10
|
+
font-family: "TWK Lausanne";
|
|
11
|
+
src: url("./fonts/TWKLausanne-500.ttf") format("truetype");
|
|
12
|
+
font-weight: 500;
|
|
13
|
+
font-style: normal;
|
|
14
|
+
font-display: swap;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@font-face {
|
|
18
|
+
font-family: "TWK Lausanne";
|
|
19
|
+
src: url("./fonts/TWKLausanne-700.ttf") format("truetype");
|
|
20
|
+
font-weight: 700;
|
|
21
|
+
font-style: normal;
|
|
22
|
+
font-display: swap;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@font-face {
|
|
26
|
+
font-family: "IBM Plex Sans Arabic";
|
|
27
|
+
src: url("./fonts/IBMPlexSansArabic-Regular.ttf") format("truetype");
|
|
28
|
+
font-weight: 400;
|
|
29
|
+
font-style: normal;
|
|
30
|
+
font-display: swap;
|
|
31
|
+
unicode-range:
|
|
32
|
+
U+0600-06FF,
|
|
33
|
+
U+0750-077F,
|
|
34
|
+
U+0870-089F,
|
|
35
|
+
U+08A0-08FF,
|
|
36
|
+
U+FB50-FDFF,
|
|
37
|
+
U+FE70-FEFF;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@font-face {
|
|
41
|
+
font-family: "IBM Plex Sans Arabic";
|
|
42
|
+
src: url("./fonts/IBMPlexSansArabic-Medium.ttf") format("truetype");
|
|
43
|
+
font-weight: 500;
|
|
44
|
+
font-style: normal;
|
|
45
|
+
font-display: swap;
|
|
46
|
+
unicode-range:
|
|
47
|
+
U+0600-06FF,
|
|
48
|
+
U+0750-077F,
|
|
49
|
+
U+0870-089F,
|
|
50
|
+
U+08A0-08FF,
|
|
51
|
+
U+FB50-FDFF,
|
|
52
|
+
U+FE70-FEFF;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@font-face {
|
|
56
|
+
font-family: "IBM Plex Sans Arabic";
|
|
57
|
+
src: url("./fonts/IBMPlexSansArabic-Bold.ttf") format("truetype");
|
|
58
|
+
font-weight: 700;
|
|
59
|
+
font-style: normal;
|
|
60
|
+
font-display: swap;
|
|
61
|
+
unicode-range:
|
|
62
|
+
U+0600-06FF,
|
|
63
|
+
U+0750-077F,
|
|
64
|
+
U+0870-089F,
|
|
65
|
+
U+08A0-08FF,
|
|
66
|
+
U+FB50-FDFF,
|
|
67
|
+
U+FE70-FEFF;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@font-face {
|
|
71
|
+
font-family: "Readex Pro";
|
|
72
|
+
src: url("./fonts/ReadexPro-Variable.ttf") format("truetype-variations");
|
|
73
|
+
font-weight: 200 700;
|
|
74
|
+
font-style: normal;
|
|
75
|
+
font-display: swap;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
:root,
|
|
79
|
+
:is([data-brand="utopia-default"], [data-theme="utopia-default"]) {
|
|
80
|
+
color-scheme: dark;
|
|
81
|
+
|
|
82
|
+
--utopia-brick-red: #cc5536;
|
|
83
|
+
--utopia-special-black: #3c3235;
|
|
84
|
+
--utopia-light-grey: #eeeeee;
|
|
85
|
+
--utopia-white: #ffffff;
|
|
86
|
+
|
|
87
|
+
--utopia-black-80: #635b5e;
|
|
88
|
+
--utopia-black-60: #8f898b;
|
|
89
|
+
--utopia-black-50: #a6a0a2;
|
|
90
|
+
--utopia-black-40: #bdb7b9;
|
|
91
|
+
--utopia-black-20: #e3e1e2;
|
|
92
|
+
|
|
93
|
+
--utopia-red-80: #d77a59;
|
|
94
|
+
--utopia-red-60: #e3a385;
|
|
95
|
+
--utopia-red-40: #f0c6af;
|
|
96
|
+
--utopia-red-20: #f6e2d7;
|
|
97
|
+
|
|
98
|
+
/* Brand-studio visual grammar */
|
|
99
|
+
--brand-panel-dark: var(--utopia-special-black);
|
|
100
|
+
--brand-panel-accent: var(--utopia-brick-red);
|
|
101
|
+
--brand-panel-light: var(--utopia-light-grey);
|
|
102
|
+
--brand-ink-dark: var(--utopia-special-black);
|
|
103
|
+
--brand-ink-deep: #100b0c;
|
|
104
|
+
--brand-ink-light: var(--utopia-white);
|
|
105
|
+
--brand-rule-dark: rgb(60 50 53 / 24%);
|
|
106
|
+
--brand-rule-light: rgb(255 255 255 / 18%);
|
|
107
|
+
--brand-display-size: clamp(3.25rem, 7vw, 6.75rem);
|
|
108
|
+
--brand-display-leading: 0.88;
|
|
109
|
+
--brand-display-tracking: -0.035em;
|
|
110
|
+
--brand-label-tracking: 0.1em;
|
|
111
|
+
--brand-panel-gutter: clamp(1.5rem, 5vw, 4.5rem);
|
|
112
|
+
--brand-section-space: clamp(4.5rem, 9vw, 8rem);
|
|
113
|
+
|
|
114
|
+
--background: var(--utopia-special-black);
|
|
115
|
+
--foreground: var(--utopia-white);
|
|
116
|
+
--foreground-muted: var(--utopia-black-40);
|
|
117
|
+
--foreground-subtle: var(--utopia-black-50);
|
|
118
|
+
--card: var(--surface);
|
|
119
|
+
--card-foreground: var(--foreground);
|
|
120
|
+
--primary: #b8472c;
|
|
121
|
+
--primary-foreground: var(--utopia-white);
|
|
122
|
+
--primary-hover: #a9442a;
|
|
123
|
+
--primary-active: #9e3d25;
|
|
124
|
+
--destructive: #6f403b;
|
|
125
|
+
--destructive-hover: #7d4842;
|
|
126
|
+
--destructive-active: #5d3430;
|
|
127
|
+
--destructive-foreground: var(--utopia-white);
|
|
128
|
+
--destructive-surface: rgb(111 64 59 / 14%);
|
|
129
|
+
--destructive-border: rgb(215 122 89 / 44%);
|
|
130
|
+
--destructive-text: var(--utopia-red-80);
|
|
131
|
+
--warning: var(--utopia-red-80);
|
|
132
|
+
--warning-foreground: var(--utopia-special-black);
|
|
133
|
+
--warning-surface: rgb(215 122 89 / 12%);
|
|
134
|
+
--warning-border: rgb(215 122 89 / 38%);
|
|
135
|
+
--warning-text: var(--utopia-red-60);
|
|
136
|
+
--success: var(--utopia-light-grey);
|
|
137
|
+
--success-foreground: var(--utopia-special-black);
|
|
138
|
+
--success-surface: rgb(247 244 237 / 8%);
|
|
139
|
+
--success-border: rgb(247 244 237 / 24%);
|
|
140
|
+
--success-text: var(--utopia-white);
|
|
141
|
+
--secondary: var(--utopia-light-grey);
|
|
142
|
+
--secondary-foreground: var(--utopia-special-black);
|
|
143
|
+
--secondary-hover: var(--utopia-black-20);
|
|
144
|
+
--secondary-active: var(--utopia-black-40);
|
|
145
|
+
--muted: var(--utopia-black-80);
|
|
146
|
+
--muted-foreground: var(--utopia-black-40);
|
|
147
|
+
--border: rgb(255 255 255 / 16%);
|
|
148
|
+
--input: rgb(255 255 255 / 24%);
|
|
149
|
+
--ring: var(--utopia-red-80);
|
|
150
|
+
--interaction-selection-surface: color-mix(in srgb, var(--primary) 20%, var(--background) 80%);
|
|
151
|
+
--interaction-selection-border: color-mix(in srgb, var(--primary) 68%, var(--foreground) 32%);
|
|
152
|
+
|
|
153
|
+
--surface: rgb(255 255 255 / 4.5%);
|
|
154
|
+
--surface-strong: rgb(255 255 255 / 8%);
|
|
155
|
+
--surface-elevated: rgb(255 255 255 / 7%);
|
|
156
|
+
--surface-hover: var(--surface-strong);
|
|
157
|
+
--surface-inverse: var(--utopia-white);
|
|
158
|
+
--inverse-foreground: var(--utopia-special-black);
|
|
159
|
+
--inverse-foreground-muted: var(--utopia-black-80);
|
|
160
|
+
--inverse-foreground-subtle: var(--utopia-black-60);
|
|
161
|
+
--inverse-hover: var(--utopia-black-20);
|
|
162
|
+
--inverse-focus-ring: var(--utopia-brick-red);
|
|
163
|
+
--overlay: rgb(60 50 53 / 86%);
|
|
164
|
+
--modal-surface: var(--utopia-special-black);
|
|
165
|
+
--popover-surface: var(--utopia-special-black);
|
|
166
|
+
--ghost-hover: rgb(255 255 255 / 8%);
|
|
167
|
+
--ghost-active: rgb(255 255 255 / 12%);
|
|
168
|
+
--outline-hover: rgb(255 255 255 / 8%);
|
|
169
|
+
--outline-active: rgb(255 255 255 / 12%);
|
|
170
|
+
|
|
171
|
+
--radius: 0;
|
|
172
|
+
--radius-control: 0;
|
|
173
|
+
--radius-surface: 0;
|
|
174
|
+
--radius-chat-bubble: var(--radius-surface);
|
|
175
|
+
--radius-chat-composer: var(--radius-surface);
|
|
176
|
+
--radius-chat-token: var(--radius-control);
|
|
177
|
+
|
|
178
|
+
--font-sans: "TWK Lausanne", "Helvetica Neue", Arial, sans-serif;
|
|
179
|
+
--font-arabic: "Readex Pro", "Noto Sans Arabic", "IBM Plex Sans Arabic", system-ui, sans-serif;
|
|
180
|
+
--font-arabic-display: var(--font-arabic);
|
|
181
|
+
--font-arabic-body: var(--font-arabic);
|
|
182
|
+
--font-mono: "JetBrains Mono", Menlo, Consolas, monospace;
|
|
183
|
+
--font-weight-body: 350;
|
|
184
|
+
--font-weight-regular: 350;
|
|
185
|
+
--font-weight-medium: 500;
|
|
186
|
+
--font-weight-semibold: 500;
|
|
187
|
+
--font-weight-strong: 700;
|
|
188
|
+
--font-weight-arabic-body: 300;
|
|
189
|
+
--font-weight-arabic-display: 500;
|
|
190
|
+
--font-size-small: 13px;
|
|
191
|
+
--font-size-2: 16px;
|
|
192
|
+
--font-size-eyebrow: 12px;
|
|
193
|
+
--font-size-supporting: 12px;
|
|
194
|
+
--font-size-body: 16px;
|
|
195
|
+
--font-size-body-lg: 18px;
|
|
196
|
+
--font-size-display: clamp(44px, 8vw, 96px);
|
|
197
|
+
--font-size-arabic-body: 16px;
|
|
198
|
+
--font-size-arabic-body-lg: 19px;
|
|
199
|
+
--font-size-arabic-display: clamp(40px, 7.3vw, 87px);
|
|
200
|
+
--line-height-tight: 1.14;
|
|
201
|
+
--line-height-supporting: 14px;
|
|
202
|
+
--line-height-arabic: 1.75;
|
|
203
|
+
--line-height-arabic-body: 1.85;
|
|
204
|
+
--line-height-arabic-display: 1.28;
|
|
205
|
+
|
|
206
|
+
--tracking-heading: 0.03em;
|
|
207
|
+
--tracking-eyebrow: 0.08em;
|
|
208
|
+
--tracking-arabic: 0;
|
|
209
|
+
--tracking-arabic-display: 0;
|
|
210
|
+
|
|
211
|
+
--space-1: 4px;
|
|
212
|
+
--space-2: 8px;
|
|
213
|
+
--space-4: 16px;
|
|
214
|
+
--space-8: 32px;
|
|
215
|
+
--space-16: 64px;
|
|
216
|
+
--space-24: 96px;
|
|
217
|
+
--space-32: 128px;
|
|
218
|
+
|
|
219
|
+
--shadow-surface: none;
|
|
220
|
+
--shadow-popover: none;
|
|
221
|
+
--shadow-control: none;
|
|
222
|
+
|
|
223
|
+
--duration-fast: 120ms;
|
|
224
|
+
--duration-medium: 220ms;
|
|
225
|
+
--duration-slow: 420ms;
|
|
226
|
+
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
|
|
227
|
+
--motion-duration-press: 160ms;
|
|
228
|
+
--motion-duration-page: 420ms;
|
|
229
|
+
--motion-duration-expand: 360ms;
|
|
230
|
+
--motion-duration-reveal: 440ms;
|
|
231
|
+
--motion-duration-icon: 640ms;
|
|
232
|
+
--motion-duration-fast: var(--motion-duration-press);
|
|
233
|
+
--motion-ease-standard: cubic-bezier(0.2, 0, 0, 1);
|
|
234
|
+
--motion-ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1);
|
|
235
|
+
--motion-ease-icon: var(--motion-ease-emphasized);
|
|
236
|
+
--motion-press-scale: 0.97;
|
|
237
|
+
--motion-distance-page: var(--space-2);
|
|
238
|
+
--motion-distance-reveal: var(--space-2);
|
|
239
|
+
--border-width-hairline: 0.0625rem;
|
|
240
|
+
--control-height-sm: var(--button-height-sm);
|
|
241
|
+
--sidebar-width: 17rem;
|
|
242
|
+
--sidebar-width-collapsed: 4rem;
|
|
243
|
+
--sidebar-min-block-size: 30rem;
|
|
244
|
+
--sidebar-rail-size: var(--space-2);
|
|
245
|
+
|
|
246
|
+
--focus-ring-width: 2px;
|
|
247
|
+
--focus-ring-offset: 2px;
|
|
248
|
+
--focus-ring: var(--ring);
|
|
249
|
+
--icon-system: phosphor;
|
|
250
|
+
|
|
251
|
+
--button-height: 40px;
|
|
252
|
+
--button-height-sm: 32px;
|
|
253
|
+
--button-height-lg: 48px;
|
|
254
|
+
--button-padding-inline: 16px;
|
|
255
|
+
--button-padding-inline-sm: 12px;
|
|
256
|
+
--button-padding-inline-lg: 24px;
|
|
257
|
+
--button-font-size: 14px;
|
|
258
|
+
--button-font-size-sm: 13px;
|
|
259
|
+
--button-font-size-lg: 16px;
|
|
260
|
+
--button-group-gap: 8px;
|
|
261
|
+
--button-group-gap-compact: 4px;
|
|
262
|
+
|
|
263
|
+
--badge-padding-block: 4px;
|
|
264
|
+
--badge-padding-inline: 8px;
|
|
265
|
+
--badge-font-size: 12px;
|
|
266
|
+
|
|
267
|
+
--card-padding: 24px;
|
|
268
|
+
--card-title-size: 20px;
|
|
269
|
+
--z-overlay: 40;
|
|
270
|
+
--z-popover: 45;
|
|
271
|
+
--z-modal: 50;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
:where(:lang(ar), [lang|="ar"]) {
|
|
275
|
+
font-family: var(--font-arabic-body);
|
|
276
|
+
font-weight: var(--font-weight-arabic-body);
|
|
277
|
+
line-height: var(--line-height-arabic-body);
|
|
278
|
+
letter-spacing: var(--tracking-arabic);
|
|
279
|
+
text-transform: none;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
:is([data-brand="utopia-default"], [data-theme="utopia-default"])[data-color-mode="light"] {
|
|
283
|
+
color-scheme: light;
|
|
284
|
+
--background: var(--utopia-white);
|
|
285
|
+
--foreground: var(--utopia-special-black);
|
|
286
|
+
--foreground-muted: color-mix(in srgb, var(--foreground) 64%, var(--background) 36%);
|
|
287
|
+
--foreground-subtle: color-mix(in srgb, var(--foreground) 44%, var(--background) 56%);
|
|
288
|
+
--card: color-mix(in srgb, var(--foreground) 3%, var(--background) 97%);
|
|
289
|
+
--card-foreground: var(--foreground);
|
|
290
|
+
--secondary: var(--utopia-light-grey);
|
|
291
|
+
--secondary-foreground: var(--foreground);
|
|
292
|
+
--muted: color-mix(in srgb, var(--foreground) 12%, var(--background) 88%);
|
|
293
|
+
--muted-foreground: color-mix(in srgb, var(--foreground) 62%, var(--background) 38%);
|
|
294
|
+
--border: color-mix(in srgb, var(--foreground) 18%, var(--background) 82%);
|
|
295
|
+
--input: color-mix(in srgb, var(--foreground) 24%, var(--background) 76%);
|
|
296
|
+
--surface: color-mix(in srgb, var(--foreground) 4%, var(--background) 96%);
|
|
297
|
+
--surface-strong: color-mix(in srgb, var(--foreground) 8%, var(--background) 92%);
|
|
298
|
+
--surface-elevated: var(--utopia-white);
|
|
299
|
+
--surface-hover: var(--surface-strong);
|
|
300
|
+
--overlay: color-mix(in srgb, var(--background) 84%, transparent);
|
|
301
|
+
--modal-surface: var(--utopia-white);
|
|
302
|
+
--popover-surface: var(--utopia-white);
|
|
303
|
+
--success: var(--utopia-special-black);
|
|
304
|
+
--success-foreground: var(--utopia-white);
|
|
305
|
+
--success-surface: color-mix(in srgb, var(--success) 7%, var(--background) 93%);
|
|
306
|
+
--success-border: color-mix(in srgb, var(--success) 20%, var(--background) 80%);
|
|
307
|
+
--success-text: var(--success);
|
|
308
|
+
--ghost-hover: color-mix(in srgb, var(--foreground) 8%, transparent);
|
|
309
|
+
--ghost-active: color-mix(in srgb, var(--foreground) 12%, transparent);
|
|
310
|
+
--outline-hover: var(--surface-strong);
|
|
311
|
+
--outline-active: var(--muted);
|
|
312
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
.text-rotate {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-wrap: wrap;
|
|
4
|
+
white-space: pre-wrap;
|
|
5
|
+
position: relative;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.text-rotate-sr-only {
|
|
9
|
+
position: absolute;
|
|
10
|
+
width: 1px;
|
|
11
|
+
height: 1px;
|
|
12
|
+
padding: 0;
|
|
13
|
+
margin: -1px;
|
|
14
|
+
overflow: hidden;
|
|
15
|
+
clip: rect(0, 0, 0, 0);
|
|
16
|
+
white-space: nowrap;
|
|
17
|
+
border: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.text-rotate-word {
|
|
21
|
+
display: inline-flex;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.text-rotate-lines {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
width: 100%;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.text-rotate-element {
|
|
31
|
+
display: inline-block;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.text-rotate-space {
|
|
35
|
+
white-space: pre;
|
|
36
|
+
}
|