@lacspace/logo 1.0.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/LICENSE +51 -0
- package/README.md +130 -0
- package/dist/index.cjs +736 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +112 -0
- package/dist/index.d.ts +112 -0
- package/dist/index.js +726 -0
- package/dist/index.js.map +1 -0
- package/package.json +71 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,736 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/data/palettes.json
|
|
4
|
+
var palettes_default = [
|
|
5
|
+
{ id: "midnight-azure", name: "Midnight Azure", mood: ["tech", "trust", "bold", "corporate"], bg: "#0b1020", surface: "#141a2e", primary: "#3b82f6", accent: "#22d3ee", on: "#eef4ff", from: "#0BB9D9", to: "#3B82F6" },
|
|
6
|
+
{ id: "electric-violet", name: "Electric Violet", mood: ["tech", "creative", "bold", "future"], bg: "#0c0a1a", surface: "#171235", primary: "#7c3aed", accent: "#3b82f6", on: "#f3efff", from: "#3B82F6", to: "#7C3AED" },
|
|
7
|
+
{ id: "sunset-flame", name: "Sunset Flame", mood: ["warm", "bold", "food", "energy"], bg: "#1a0d08", surface: "#2a140b", primary: "#f97316", accent: "#ef4444", on: "#fff4ec", from: "#F97316", to: "#EF4444" },
|
|
8
|
+
{ id: "forest-verdant", name: "Forest Verdant", mood: ["eco", "calm", "organic", "health"], bg: "#08140f", surface: "#0f2119", primary: "#22c55e", accent: "#84cc16", on: "#eefef4", from: "#22C55E", to: "#84CC16" },
|
|
9
|
+
{ id: "royal-gold", name: "Royal Gold", mood: ["luxe", "heritage", "premium", "elegant"], bg: "#12100a", surface: "#1e1a10", primary: "#d4af37", accent: "#b08d2b", on: "#fbf6e6", from: "#E7C767", to: "#B08D2B" },
|
|
10
|
+
{ id: "rose-blush", name: "Rose Blush", mood: ["playful", "beauty", "warm", "friendly"], bg: "#1a0d14", surface: "#2a1420", primary: "#f472b6", accent: "#fb7185", on: "#fff0f7", from: "#F472B6", to: "#FB7185" },
|
|
11
|
+
{ id: "ocean-teal", name: "Ocean Teal", mood: ["calm", "trust", "medical", "clean"], bg: "#06141a", surface: "#0b2029", primary: "#14b8a6", accent: "#06b6d4", on: "#e8fdfb", from: "#14B8A6", to: "#06B6D4" },
|
|
12
|
+
{ id: "slate-mono", name: "Slate Mono", mood: ["minimal", "mono", "corporate", "modern"], bg: "#0a0a0b", surface: "#17181b", primary: "#e5e7eb", accent: "#9ca3af", on: "#f8fafc", from: "#E5E7EB", to: "#9CA3AF" },
|
|
13
|
+
{ id: "ink-noir", name: "Ink Noir", mood: ["minimal", "mono", "luxe", "bold"], bg: "#0a0a0a", surface: "#161616", primary: "#fafafa", accent: "#d4d4d4", on: "#ffffff", from: "#FAFAFA", to: "#A3A3A3" },
|
|
14
|
+
{ id: "coral-crush", name: "Coral Crush", mood: ["playful", "food", "warm", "energy"], bg: "#1a0f0c", surface: "#2a1712", primary: "#fb7185", accent: "#fbbf24", on: "#fff3ee", from: "#FB7185", to: "#FBBF24" },
|
|
15
|
+
{ id: "deep-indigo", name: "Deep Indigo", mood: ["finance", "trust", "corporate", "tech"], bg: "#0a0d1a", surface: "#12172b", primary: "#6366f1", accent: "#818cf8", on: "#eef0ff", from: "#6366F1", to: "#818CF8" },
|
|
16
|
+
{ id: "emerald-lux", name: "Emerald Lux", mood: ["luxe", "finance", "premium", "eco"], bg: "#06140d", surface: "#0c2117", primary: "#10b981", accent: "#d4af37", on: "#eafef4", from: "#10B981", to: "#D4AF37" },
|
|
17
|
+
{ id: "cyber-lime", name: "Cyber Lime", mood: ["tech", "bold", "future", "energy"], bg: "#0a0f08", surface: "#141d0d", primary: "#a3e635", accent: "#22d3ee", on: "#f4ffe6", from: "#A3E635", to: "#22D3EE" },
|
|
18
|
+
{ id: "berry-wine", name: "Berry Wine", mood: ["luxe", "beauty", "warm", "premium"], bg: "#160a12", surface: "#25121f", primary: "#be185d", accent: "#9333ea", on: "#fdeef6", from: "#BE185D", to: "#9333EA" },
|
|
19
|
+
{ id: "sky-fresh", name: "Sky Fresh", mood: ["clean", "friendly", "calm", "medical"], bg: "#081018", surface: "#0f1d2b", primary: "#0ea5e9", accent: "#38bdf8", on: "#eef8ff", from: "#0EA5E9", to: "#38BDF8" },
|
|
20
|
+
{ id: "terra-clay", name: "Terra Clay", mood: ["organic", "warm", "earthy", "heritage"], bg: "#150f0a", surface: "#241a11", primary: "#c2703d", accent: "#a3762b", on: "#fbf1e6", from: "#C2703D", to: "#A3762B" },
|
|
21
|
+
{ id: "grape-soda", name: "Grape Soda", mood: ["playful", "creative", "bold", "friendly"], bg: "#100a1a", surface: "#1c122b", primary: "#8b5cf6", accent: "#ec4899", on: "#f4efff", from: "#8B5CF6", to: "#EC4899" },
|
|
22
|
+
{ id: "mint-clean", name: "Mint Clean", mood: ["clean", "eco", "health", "calm"], bg: "#08140f", surface: "#0f231b", primary: "#34d399", accent: "#a7f3d0", on: "#effef7", from: "#34D399", to: "#A7F3D0" },
|
|
23
|
+
{ id: "crimson-bold", name: "Crimson Bold", mood: ["bold", "energy", "sport", "food"], bg: "#160809", surface: "#260d0f", primary: "#dc2626", accent: "#f59e0b", on: "#fff0ee", from: "#DC2626", to: "#F59E0B" },
|
|
24
|
+
{ id: "steel-blue", name: "Steel Blue", mood: ["corporate", "trust", "industrial", "tech"], bg: "#0a0e12", surface: "#141b22", primary: "#64748b", accent: "#0ea5e9", on: "#eef3f8", from: "#64748B", to: "#0EA5E9" },
|
|
25
|
+
{ id: "amber-glow", name: "Amber Glow", mood: ["warm", "friendly", "energy", "food"], bg: "#161005", surface: "#261c0a", primary: "#f59e0b", accent: "#fcd34d", on: "#fff8e8", from: "#F59E0B", to: "#FCD34D" },
|
|
26
|
+
{ id: "aqua-marine", name: "Aqua Marine", mood: ["calm", "clean", "travel", "fresh"], bg: "#06131a", surface: "#0b2029", primary: "#06b6d4", accent: "#2dd4bf", on: "#e8fcff", from: "#06B6D4", to: "#2DD4BF" },
|
|
27
|
+
{ id: "plum-noir", name: "Plum Noir", mood: ["luxe", "creative", "mono", "elegant"], bg: "#0d0912", surface: "#181020", primary: "#a855f7", accent: "#6b7280", on: "#f2ecfb", from: "#A855F7", to: "#6B7280" },
|
|
28
|
+
{ id: "graphite-orange", name: "Graphite Orange", mood: ["industrial", "bold", "sport", "modern"], bg: "#0b0b0d", surface: "#17181c", primary: "#f97316", accent: "#e5e7eb", on: "#fafafa", from: "#F97316", to: "#E5E7EB" }
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
// src/data/fonts.json
|
|
32
|
+
var fonts_default = [
|
|
33
|
+
{ id: "grotesk-modern", display: "Space Grotesk", body: "Inter", weight: 700, mood: ["tech", "modern", "bold", "startup"], stack: "'Space Grotesk', 'Inter', system-ui, sans-serif" },
|
|
34
|
+
{ id: "geist-clean", display: "Sora", body: "Inter", weight: 700, mood: ["tech", "clean", "corporate", "modern"], stack: "'Sora', 'Inter', system-ui, sans-serif" },
|
|
35
|
+
{ id: "poppins-round", display: "Poppins", body: "Poppins", weight: 700, mood: ["playful", "friendly", "startup", "food"], stack: "'Poppins', 'Segoe UI', system-ui, sans-serif" },
|
|
36
|
+
{ id: "montserrat-strong", display: "Montserrat", body: "Inter", weight: 800, mood: ["bold", "corporate", "sport", "modern"], stack: "'Montserrat', system-ui, sans-serif" },
|
|
37
|
+
{ id: "playfair-luxe", display: "Playfair Display", body: "Lora", weight: 700, mood: ["luxe", "heritage", "elegant", "beauty"], stack: "'Playfair Display', Georgia, serif" },
|
|
38
|
+
{ id: "cormorant-lux", display: "Cormorant Garamond", body: "EB Garamond", weight: 600, mood: ["luxe", "elegant", "premium", "heritage"], stack: "'Cormorant Garamond', Georgia, serif" },
|
|
39
|
+
{ id: "dmserif-editorial", display: "DM Serif Display", body: "DM Sans", weight: 400, mood: ["editorial", "elegant", "creative", "premium"], stack: "'DM Serif Display', Georgia, serif" },
|
|
40
|
+
{ id: "archivo-industrial", display: "Archivo", body: "Archivo", weight: 800, mood: ["industrial", "bold", "sport", "modern"], stack: "'Archivo', 'Arial Narrow', system-ui, sans-serif" },
|
|
41
|
+
{ id: "manrope-soft", display: "Manrope", body: "Manrope", weight: 700, mood: ["clean", "calm", "medical", "startup"], stack: "'Manrope', system-ui, sans-serif" },
|
|
42
|
+
{ id: "outfit-geometric", display: "Outfit", body: "Inter", weight: 600, mood: ["modern", "minimal", "tech", "clean"], stack: "'Outfit', system-ui, sans-serif" },
|
|
43
|
+
{ id: "fraunces-craft", display: "Fraunces", body: "Newsreader", weight: 600, mood: ["organic", "heritage", "craft", "warm"], stack: "'Fraunces', Georgia, serif" },
|
|
44
|
+
{ id: "quicksand-friendly", display: "Quicksand", body: "Nunito", weight: 700, mood: ["friendly", "playful", "beauty", "calm"], stack: "'Quicksand', 'Nunito', system-ui, sans-serif" },
|
|
45
|
+
{ id: "orbitron-future", display: "Orbitron", body: "Rajdhani", weight: 700, mood: ["future", "tech", "sport", "bold"], stack: "'Orbitron', 'Rajdhani', system-ui, sans-serif" },
|
|
46
|
+
{ id: "bricolage-quirk", display: "Bricolage Grotesque", body: "Inter", weight: 700, mood: ["creative", "startup", "modern", "playful"], stack: "'Bricolage Grotesque', system-ui, sans-serif" }
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
// src/data/icons.json
|
|
50
|
+
var icons_default = [
|
|
51
|
+
{ key: "bolt", keywords: ["energy", "power", "fast", "electric", "speed", "charge", "quick"], svg: "<path d='M13 2 L4 14 H11 L10 22 L20 9 H13 Z'/>" },
|
|
52
|
+
{ key: "leaf", keywords: ["eco", "nature", "green", "organic", "plant", "garden", "bio", "sustainable"], svg: "<path d='M4 20 C4 10 10 4 20 4 C20 14 14 20 4 20 Z'/><path d='M4 20 C9 15 14 12 18 10'/>" },
|
|
53
|
+
{ key: "cup", keywords: ["coffee", "cafe", "tea", "drink", "warm", "beverage", "espresso", "brew"], svg: "<path d='M5 8 H17 V13 A5 5 0 0 1 12 18 H10 A5 5 0 0 1 5 13 Z'/><path d='M17 9 H19 A2 2 0 0 1 19 13 H17'/><path d='M8 3 V5 M11 3 V5 M14 3 V5'/>" },
|
|
54
|
+
{ key: "rocket", keywords: ["launch", "startup", "fast", "space", "growth", "boost", "ship"], svg: "<path d='M12 3 C15 6 16 10 16 13 L8 13 C8 10 9 6 12 3 Z'/><circle cx='12' cy='9' r='1.5'/><path d='M8 13 L6 17 L9 15 M16 13 L18 17 L15 15'/>" },
|
|
55
|
+
{ key: "cart", keywords: ["shop", "store", "ecommerce", "retail", "buy", "market", "cart", "grocery"], svg: "<circle cx='9' cy='20' r='1'/><circle cx='17' cy='20' r='1'/><path d='M3 4 H5 L7 15 H18 L20 7 H6'/>" },
|
|
56
|
+
{ key: "chart", keywords: ["finance", "growth", "analytics", "data", "stats", "trade", "invest", "report"], svg: "<path d='M4 4 V20 H20'/><polyline points='7 15 11 10 14 13 19 6'/>" },
|
|
57
|
+
{ key: "code", keywords: ["dev", "tech", "software", "api", "program", "developer", "engineering", "web"], svg: "<polyline points='9 8 5 12 9 16'/><polyline points='15 8 19 12 15 16'/>" },
|
|
58
|
+
{ key: "cloud", keywords: ["cloud", "saas", "storage", "hosting", "weather", "backup", "server"], svg: "<path d='M7 18 A4 4 0 0 1 7 10 A5 5 0 0 1 17 10 A3.5 3.5 0 0 1 17 18 Z'/>" },
|
|
59
|
+
{ key: "heart", keywords: ["health", "care", "love", "charity", "beauty", "wellness", "dating"], svg: "<path d='M12 20 C6 15 3 12 3 8 A4 4 0 0 1 12 6 A4 4 0 0 1 21 8 C21 12 18 15 12 20 Z'/>" },
|
|
60
|
+
{ key: "star", keywords: ["quality", "rating", "premium", "favorite", "best", "review", "award"], svg: "<path d='M12 3 L14.6 9 L21 9.5 L16 13.8 L17.6 20 L12 16.5 L6.4 20 L8 13.8 L3 9.5 L9.4 9 Z'/>" },
|
|
61
|
+
{ key: "shield", keywords: ["security", "trust", "protect", "insurance", "safe", "guard", "defense", "cyber"], svg: "<path d='M12 3 L20 6 V11 C20 16 16 20 12 21 C8 20 4 16 4 11 V6 Z'/>" },
|
|
62
|
+
{ key: "globe", keywords: ["global", "world", "travel", "network", "web", "international", "geo"], svg: "<circle cx='12' cy='12' r='9'/><path d='M3 12 H21 M12 3 C15 6 15 18 12 21 C9 18 9 6 12 3'/>" },
|
|
63
|
+
{ key: "camera", keywords: ["photo", "media", "studio", "creative", "photography", "video", "capture"], svg: "<rect x='3' y='7' width='18' height='13' rx='2'/><circle cx='12' cy='13' r='3.5'/><path d='M8 7 L9.5 4 H14.5 L16 7'/>" },
|
|
64
|
+
{ key: "brush", keywords: ["art", "design", "paint", "creative", "studio", "agency", "draw"], svg: "<path d='M4 20 C4 16 7 15 9 15 C9 18 8 20 4 20 Z'/><path d='M9 15 L18 6 A1.5 1.5 0 0 1 20 8 L11 17'/>" },
|
|
65
|
+
{ key: "book", keywords: ["education", "learn", "publish", "read", "school", "academy", "course", "library"], svg: "<path d='M4 5 A2 2 0 0 1 6 3 H12 V19 H6 A2 2 0 0 0 4 21 Z'/><path d='M20 5 A2 2 0 0 0 18 3 H12 V19 H18 A2 2 0 0 1 20 21 Z'/>" },
|
|
66
|
+
{ key: "wrench", keywords: ["repair", "service", "build", "tools", "fix", "maintenance", "mechanic"], svg: "<path d='M15 4 A5 5 0 0 0 8.5 10.5 L4 15 V20 H9 L13.5 15.5 A5 5 0 0 0 20 9 L16.5 12.5 H11.5 V7.5 Z'/>" },
|
|
67
|
+
{ key: "gear", keywords: ["settings", "tech", "engineering", "config", "industrial", "system", "process"], svg: "<circle cx='12' cy='12' r='3.2'/><path d='M12 3 V6 M12 18 V21 M3 12 H6 M18 12 H21 M5.6 5.6 L7.7 7.7 M16.3 16.3 L18.4 18.4 M18.4 5.6 L16.3 7.7 M7.7 16.3 L5.6 18.4'/>" },
|
|
68
|
+
{ key: "chat", keywords: ["message", "community", "social", "support", "talk", "forum", "chat", "connect"], svg: "<path d='M4 5 H20 V16 H12 L7 20 V16 H4 Z'/>" },
|
|
69
|
+
{ key: "pin", keywords: ["location", "map", "place", "local", "travel", "navigation", "geo", "address"], svg: "<path d='M12 21 C12 21 5 14 5 9 A7 7 0 0 1 19 9 C19 14 12 21 12 21 Z'/><circle cx='12' cy='9' r='2.5'/>" },
|
|
70
|
+
{ key: "home", keywords: ["home", "realestate", "house", "property", "living", "estate", "build", "interior"], svg: "<path d='M4 11 L12 4 L20 11'/><path d='M6 10 V20 H18 V10'/>" },
|
|
71
|
+
{ key: "shop", keywords: ["store", "market", "retail", "boutique", "business", "vendor", "mall"], svg: "<path d='M4 9 L5 4 H19 L20 9 A3 3 0 0 1 14 9 A3 3 0 0 1 8 9 A3 3 0 0 1 4 9 Z'/><path d='M5 9 V20 H19 V9'/>" },
|
|
72
|
+
{ key: "truck", keywords: ["delivery", "logistics", "shipping", "transport", "move", "courier", "freight"], svg: "<rect x='2' y='7' width='12' height='9'/><path d='M14 10 H18 L21 13 V16 H14 Z'/><circle cx='7' cy='18' r='1.5'/><circle cx='17' cy='18' r='1.5'/>" },
|
|
73
|
+
{ key: "wallet", keywords: ["finance", "money", "pay", "bank", "wallet", "fintech", "payment", "budget"], svg: "<rect x='3' y='6' width='18' height='13' rx='2'/><path d='M3 10 H21'/><circle cx='17' cy='14' r='1'/>" },
|
|
74
|
+
{ key: "coin", keywords: ["money", "finance", "crypto", "currency", "pay", "token", "gold", "cash"], svg: "<circle cx='12' cy='12' r='8'/><path d='M12 8 V16 M9.5 9.5 H13.5 A2 2 0 0 1 13.5 12 H10.5 A2 2 0 0 0 10.5 14.5 H14.5'/>" },
|
|
75
|
+
{ key: "phone", keywords: ["mobile", "contact", "call", "app", "telecom", "device", "smartphone"], svg: "<rect x='7' y='3' width='10' height='18' rx='2'/><path d='M11 18 H13'/>" },
|
|
76
|
+
{ key: "wifi", keywords: ["network", "internet", "connect", "signal", "telecom", "wireless", "isp"], svg: "<path d='M4 9 A12 12 0 0 1 20 9'/><path d='M7 12.5 A8 8 0 0 1 17 12.5'/><path d='M10 16 A3.5 3.5 0 0 1 14 16'/><circle cx='12' cy='19' r='0.6'/>" },
|
|
77
|
+
{ key: "music", keywords: ["music", "audio", "sound", "media", "entertainment", "podcast", "song"], svg: "<circle cx='7' cy='18' r='2'/><circle cx='17' cy='16' r='2'/><path d='M9 18 V6 L19 4 V16'/>" },
|
|
78
|
+
{ key: "fork", keywords: ["food", "restaurant", "dining", "cafe", "kitchen", "chef", "meal", "eat"], svg: "<path d='M7 3 V9 A2 2 0 0 0 11 9 V3 M9 9 V21 M15 3 C13 4 13 9 15 10 V21'/>" },
|
|
79
|
+
{ key: "scissors", keywords: ["barber", "salon", "beauty", "craft", "cut", "hair", "tailor", "stylist"], svg: "<circle cx='7' cy='7' r='2.5'/><circle cx='7' cy='17' r='2.5'/><path d='M9 8.5 L20 17 M9 15.5 L20 7'/>" },
|
|
80
|
+
{ key: "paw", keywords: ["pet", "animal", "vet", "care", "dog", "cat", "wildlife"], svg: "<circle cx='8' cy='9' r='1.7'/><circle cx='16' cy='9' r='1.7'/><circle cx='5.5' cy='13' r='1.4'/><circle cx='18.5' cy='13' r='1.4'/><path d='M12 12 C15 12 17 15 16 18 C15 20 9 20 8 18 C7 15 9 12 12 12 Z'/>" },
|
|
81
|
+
{ key: "sun", keywords: ["energy", "solar", "weather", "bright", "summer", "power", "light"], svg: "<circle cx='12' cy='12' r='4'/><path d='M12 2 V5 M12 19 V22 M2 12 H5 M19 12 H22 M4.9 4.9 L7 7 M17 17 L19.1 19.1 M19.1 4.9 L17 7 M7 17 L4.9 19.1'/>" },
|
|
82
|
+
{ key: "mountain", keywords: ["travel", "outdoor", "adventure", "nature", "peak", "hiking", "summit"], svg: "<path d='M3 19 L9 8 L13 14 L16 9 L21 19 Z'/>" },
|
|
83
|
+
{ key: "wave", keywords: ["water", "ocean", "flow", "fluid", "beach", "sea", "surf", "liquid"], svg: "<path d='M3 8 C6 5 8 11 12 8 C16 5 18 11 21 8 M3 13 C6 10 8 16 12 13 C16 10 18 16 21 13 M3 18 C6 15 8 21 12 18 C16 15 18 21 21 18'/>" },
|
|
84
|
+
{ key: "hexagon", keywords: ["tech", "blockchain", "structure", "geometric", "hex", "modular", "grid"], svg: "<path d='M12 3 L20 7.5 V16.5 L12 21 L4 16.5 V7.5 Z'/>" },
|
|
85
|
+
{ key: "spark", keywords: ["magic", "ai", "new", "creative", "shine", "smart", "innovation"], svg: "<path d='M12 3 C12 8 13 11 20 12 C13 13 12 16 12 21 C12 16 11 13 4 12 C11 11 12 8 12 3 Z'/>" },
|
|
86
|
+
{ key: "drop", keywords: ["water", "clean", "eco", "medical", "liquid", "pure", "hydro", "laundry"], svg: "<path d='M12 3 C12 3 6 10 6 15 A6 6 0 0 0 18 15 C18 10 12 3 12 3 Z'/>" },
|
|
87
|
+
{ key: "flame", keywords: ["fire", "energy", "hot", "cook", "passion", "grill", "heat", "bbq"], svg: "<path d='M12 21 A6 6 0 0 0 18 15 C18 10 14 9 15 4 C11 6 8 9 8 13 A4 4 0 0 0 10 16 C9 12 11 11 12 10 C12 13 15 13 14 17 A3 3 0 0 1 12 21 Z'/>" },
|
|
88
|
+
{ key: "cube", keywords: ["product", "box", "package", "build", "3d", "block", "logistics", "supply"], svg: "<path d='M12 3 L20 7.5 V16.5 L12 21 L4 16.5 V7.5 Z'/><path d='M4 7.5 L12 12 L20 7.5 M12 12 V21'/>" },
|
|
89
|
+
{ key: "eye", keywords: ["vision", "watch", "view", "security", "media", "optics", "monitor"], svg: "<path d='M2 12 C5 6 9 5 12 5 C15 5 19 6 22 12 C19 18 15 19 12 19 C9 19 5 18 2 12 Z'/><circle cx='12' cy='12' r='3'/>" },
|
|
90
|
+
{ key: "crown", keywords: ["luxe", "premium", "royal", "king", "best", "vip", "elite", "gold"], svg: "<path d='M4 18 V8 L8 12 L12 5 L16 12 L20 8 V18 Z'/><path d='M4 18 H20'/>" }
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
// src/data/moods.json
|
|
94
|
+
var moods_default = [
|
|
95
|
+
{ id: "techy", name: "Techy", keywords: ["tech", "software", "ai", "app", "saas", "digital", "cyber", "dev", "platform", "data", "cloud", "startup"], paletteMood: ["tech", "future", "bold", "trust"], fontMood: ["tech", "modern", "startup"], shapes: ["hexagon", "squircle", "rounded"], layouts: ["icon-left", "icon-top"], engines: ["wordmark", "abstract", "monogram"] },
|
|
96
|
+
{ id: "minimal", name: "Minimal", keywords: ["minimal", "simple", "clean", "modern", "mono", "essential"], paletteMood: ["minimal", "mono", "clean"], fontMood: ["minimal", "modern", "clean"], shapes: ["circle", "rounded", "squircle"], layouts: ["icon-left", "wordmark-only"], engines: ["monogram", "wordmark", "lettermark"] },
|
|
97
|
+
{ id: "luxe", name: "Luxe", keywords: ["luxury", "premium", "elegant", "gold", "boutique", "exclusive", "high-end", "couture"], paletteMood: ["luxe", "premium", "elegant", "heritage"], fontMood: ["luxe", "elegant", "editorial"], shapes: ["seal", "circle", "diamond"], layouts: ["icon-top", "emblem"], engines: ["emblem", "monogram", "wordmark"] },
|
|
98
|
+
{ id: "playful", name: "Playful", keywords: ["playful", "fun", "kids", "friendly", "colorful", "bright", "toy", "game"], paletteMood: ["playful", "friendly", "bold"], fontMood: ["playful", "friendly", "startup"], shapes: ["squircle", "blob", "rounded"], layouts: ["icon-top", "icon-left"], engines: ["wordmark", "monogram", "abstract"] },
|
|
99
|
+
{ id: "eco", name: "Eco", keywords: ["eco", "green", "organic", "nature", "sustainable", "natural", "plant", "bio", "earth"], paletteMood: ["eco", "organic", "calm", "earthy"], fontMood: ["organic", "craft", "clean"], shapes: ["circle", "blob", "seal"], layouts: ["icon-left", "icon-top"], engines: ["wordmark", "abstract", "emblem"] },
|
|
100
|
+
{ id: "bold", name: "Bold", keywords: ["bold", "strong", "sport", "power", "dynamic", "energy", "fitness", "gym"], paletteMood: ["bold", "energy", "sport", "industrial"], fontMood: ["bold", "industrial", "sport"], shapes: ["shield", "hexagon", "rounded"], layouts: ["icon-left", "stacked"], engines: ["wordmark", "monogram", "emblem"] },
|
|
101
|
+
{ id: "food", name: "Food", keywords: ["food", "restaurant", "cafe", "kitchen", "bakery", "dining", "coffee", "eat", "meal"], paletteMood: ["warm", "food", "energy", "friendly"], fontMood: ["friendly", "craft", "playful"], shapes: ["circle", "seal", "squircle"], layouts: ["icon-top", "emblem"], engines: ["emblem", "wordmark", "monogram"] },
|
|
102
|
+
{ id: "medical", name: "Medical", keywords: ["medical", "health", "clinic", "care", "wellness", "pharma", "hospital", "therapy"], paletteMood: ["medical", "clean", "calm", "trust"], fontMood: ["clean", "medical", "modern"], shapes: ["circle", "shield", "rounded"], layouts: ["icon-left", "icon-top"], engines: ["wordmark", "monogram", "abstract"] },
|
|
103
|
+
{ id: "finance", name: "Finance", keywords: ["finance", "bank", "invest", "fintech", "money", "trade", "capital", "wealth"], paletteMood: ["finance", "trust", "corporate", "luxe"], fontMood: ["corporate", "modern", "tech"], shapes: ["shield", "hexagon", "rounded"], layouts: ["icon-left", "wordmark-only"], engines: ["monogram", "wordmark", "abstract"] },
|
|
104
|
+
{ id: "creative", name: "Creative", keywords: ["creative", "art", "studio", "design", "agency", "media", "brand", "photography"], paletteMood: ["creative", "bold", "elegant"], fontMood: ["creative", "editorial", "modern"], shapes: ["squircle", "blob", "circle"], layouts: ["icon-top", "icon-left"], engines: ["abstract", "wordmark", "monogram"] },
|
|
105
|
+
{ id: "heritage", name: "Heritage", keywords: ["heritage", "classic", "traditional", "craft", "artisan", "vintage", "estate", "co"], paletteMood: ["heritage", "warm", "earthy", "luxe"], fontMood: ["heritage", "craft", "elegant"], shapes: ["seal", "circle", "shield"], layouts: ["emblem", "icon-top"], engines: ["emblem", "monogram", "wordmark"] },
|
|
106
|
+
{ id: "modern", name: "Modern", keywords: ["modern", "business", "company", "professional", "corporate", "service", "solutions"], paletteMood: ["tech", "corporate", "modern", "trust"], fontMood: ["modern", "clean", "startup"], shapes: ["rounded", "squircle", "circle"], layouts: ["icon-left", "icon-top"], engines: ["wordmark", "monogram", "abstract"] }
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
// src/data/keywords.json
|
|
110
|
+
var keywords_default = {
|
|
111
|
+
colorWords: {
|
|
112
|
+
blue: "midnight-azure",
|
|
113
|
+
azure: "midnight-azure",
|
|
114
|
+
navy: "deep-indigo",
|
|
115
|
+
purple: "electric-violet",
|
|
116
|
+
violet: "electric-violet",
|
|
117
|
+
indigo: "deep-indigo",
|
|
118
|
+
orange: "sunset-flame",
|
|
119
|
+
amber: "amber-glow",
|
|
120
|
+
sunset: "sunset-flame",
|
|
121
|
+
green: "forest-verdant",
|
|
122
|
+
mint: "mint-clean",
|
|
123
|
+
emerald: "emerald-lux",
|
|
124
|
+
gold: "royal-gold",
|
|
125
|
+
golden: "royal-gold",
|
|
126
|
+
pink: "rose-blush",
|
|
127
|
+
rose: "rose-blush",
|
|
128
|
+
coral: "coral-crush",
|
|
129
|
+
teal: "ocean-teal",
|
|
130
|
+
cyan: "aqua-marine",
|
|
131
|
+
aqua: "aqua-marine",
|
|
132
|
+
black: "ink-noir",
|
|
133
|
+
mono: "slate-mono",
|
|
134
|
+
grey: "slate-mono",
|
|
135
|
+
gray: "slate-mono",
|
|
136
|
+
monochrome: "ink-noir",
|
|
137
|
+
red: "crimson-bold",
|
|
138
|
+
crimson: "crimson-bold",
|
|
139
|
+
wine: "berry-wine",
|
|
140
|
+
maroon: "berry-wine",
|
|
141
|
+
burgundy: "berry-wine",
|
|
142
|
+
sky: "sky-fresh",
|
|
143
|
+
clay: "terra-clay",
|
|
144
|
+
brown: "terra-clay",
|
|
145
|
+
earth: "terra-clay",
|
|
146
|
+
lime: "cyber-lime",
|
|
147
|
+
steel: "steel-blue"
|
|
148
|
+
},
|
|
149
|
+
vibeWords: {
|
|
150
|
+
fast: "bold",
|
|
151
|
+
quick: "bold",
|
|
152
|
+
speed: "bold",
|
|
153
|
+
power: "bold",
|
|
154
|
+
strong: "bold",
|
|
155
|
+
calm: "minimal",
|
|
156
|
+
quiet: "minimal",
|
|
157
|
+
simple: "minimal",
|
|
158
|
+
clean: "minimal",
|
|
159
|
+
fun: "playful",
|
|
160
|
+
friendly: "playful",
|
|
161
|
+
happy: "playful",
|
|
162
|
+
bright: "playful",
|
|
163
|
+
premium: "luxe",
|
|
164
|
+
luxury: "luxe",
|
|
165
|
+
elegant: "luxe",
|
|
166
|
+
exclusive: "luxe",
|
|
167
|
+
royal: "luxe",
|
|
168
|
+
smart: "techy",
|
|
169
|
+
digital: "techy",
|
|
170
|
+
future: "techy",
|
|
171
|
+
innovative: "techy",
|
|
172
|
+
natural: "eco",
|
|
173
|
+
fresh: "eco",
|
|
174
|
+
pure: "eco",
|
|
175
|
+
sustainable: "eco",
|
|
176
|
+
trust: "finance",
|
|
177
|
+
secure: "finance",
|
|
178
|
+
reliable: "finance",
|
|
179
|
+
professional: "modern"
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// src/data.ts
|
|
184
|
+
var PALETTES = palettes_default;
|
|
185
|
+
var FONTS = fonts_default;
|
|
186
|
+
var ICONS = icons_default;
|
|
187
|
+
var MOODS = moods_default;
|
|
188
|
+
var KEYWORDS = keywords_default;
|
|
189
|
+
var paletteById = (id) => PALETTES.find((p) => p.id === id);
|
|
190
|
+
var fontById = (id) => FONTS.find((f) => f.id === id);
|
|
191
|
+
var iconByKey = (key) => ICONS.find((i) => i.key === key);
|
|
192
|
+
var moodById = (id) => MOODS.find((m) => m.id === id);
|
|
193
|
+
|
|
194
|
+
// src/brief.ts
|
|
195
|
+
var STOP = new Set(
|
|
196
|
+
"the a an and or for of to with we our is are your you it this that in on at by as be brand company business co inc ltd studio group solutions services".split(
|
|
197
|
+
/\s+/
|
|
198
|
+
)
|
|
199
|
+
);
|
|
200
|
+
function tokenize(brief) {
|
|
201
|
+
const raw = [];
|
|
202
|
+
if (Array.isArray(brief.keywords)) raw.push(...brief.keywords);
|
|
203
|
+
else if (typeof brief.keywords === "string") raw.push(...brief.keywords.split(/[,\s]+/));
|
|
204
|
+
if (brief.brief) raw.push(...brief.brief.split(/[^\p{L}\p{N}]+/u));
|
|
205
|
+
if (brief.industry) raw.push(brief.industry);
|
|
206
|
+
if (brief.style) raw.push(brief.style);
|
|
207
|
+
const seen = /* @__PURE__ */ new Set();
|
|
208
|
+
const out = [];
|
|
209
|
+
for (const t of raw) {
|
|
210
|
+
const w = t.trim().toLowerCase();
|
|
211
|
+
if (w.length < 2 || STOP.has(w) || seen.has(w)) continue;
|
|
212
|
+
seen.add(w);
|
|
213
|
+
out.push(w);
|
|
214
|
+
}
|
|
215
|
+
return out;
|
|
216
|
+
}
|
|
217
|
+
function overlap(a, b) {
|
|
218
|
+
const set = new Set(b);
|
|
219
|
+
let c = 0;
|
|
220
|
+
for (const x of a) if (set.has(x)) c++;
|
|
221
|
+
return c;
|
|
222
|
+
}
|
|
223
|
+
function chooseMood(tokens, rng, forced) {
|
|
224
|
+
if (forced) {
|
|
225
|
+
const m = moodById(forced.toLowerCase()) || MOODS.find((x) => x.keywords.includes(forced.toLowerCase()));
|
|
226
|
+
if (m) return m;
|
|
227
|
+
}
|
|
228
|
+
const scored = MOODS.map((m) => {
|
|
229
|
+
let score = overlap(tokens, m.keywords) * 3;
|
|
230
|
+
for (const t of tokens) if (KEYWORDS.vibeWords[t] === m.id) score += 2;
|
|
231
|
+
return { m, score };
|
|
232
|
+
});
|
|
233
|
+
const max = Math.max(...scored.map((s) => s.score));
|
|
234
|
+
const top = scored.filter((s) => s.score === max && max > 0).map((s) => s.m);
|
|
235
|
+
if (top.length) return rng.pick(top);
|
|
236
|
+
return moodById("modern");
|
|
237
|
+
}
|
|
238
|
+
function byMood(items, tags) {
|
|
239
|
+
const scored = items.map((i) => ({ i, s: overlap(i.mood, tags) }));
|
|
240
|
+
const max = Math.max(0, ...scored.map((x) => x.s));
|
|
241
|
+
if (max === 0) return items;
|
|
242
|
+
return scored.filter((x) => x.s === max).map((x) => x.i);
|
|
243
|
+
}
|
|
244
|
+
function choosePalette(tokens, mood, rng, forced) {
|
|
245
|
+
if (forced) {
|
|
246
|
+
const p = paletteById(forced);
|
|
247
|
+
if (p) return p;
|
|
248
|
+
}
|
|
249
|
+
for (const t of tokens) {
|
|
250
|
+
const id = KEYWORDS.colorWords[t];
|
|
251
|
+
if (id) {
|
|
252
|
+
const p = paletteById(id);
|
|
253
|
+
if (p) return p;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return rng.pick(byMood(PALETTES, mood.paletteMood));
|
|
257
|
+
}
|
|
258
|
+
function chooseFont(mood, rng, forced) {
|
|
259
|
+
if (forced) {
|
|
260
|
+
const f = fontById(forced);
|
|
261
|
+
if (f) return f;
|
|
262
|
+
}
|
|
263
|
+
return rng.pick(byMood(FONTS, mood.fontMood));
|
|
264
|
+
}
|
|
265
|
+
function chooseIcon(tokens, rng, forced) {
|
|
266
|
+
if (forced) {
|
|
267
|
+
const i = iconByKey(forced);
|
|
268
|
+
if (i) return i;
|
|
269
|
+
}
|
|
270
|
+
const scored = ICONS.map((icon) => ({ icon, score: overlap(tokens, icon.keywords) }));
|
|
271
|
+
const max = Math.max(0, ...scored.map((s) => s.score));
|
|
272
|
+
if (max === 0) return void 0;
|
|
273
|
+
return rng.pick(scored.filter((s) => s.score === max).map((s) => s.icon));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// src/rng.ts
|
|
277
|
+
function hashString(str) {
|
|
278
|
+
let h = 2166136261 >>> 0;
|
|
279
|
+
for (let i = 0; i < str.length; i++) {
|
|
280
|
+
h ^= str.charCodeAt(i);
|
|
281
|
+
h = Math.imul(h, 16777619);
|
|
282
|
+
}
|
|
283
|
+
return h >>> 0;
|
|
284
|
+
}
|
|
285
|
+
function makeRng(seed) {
|
|
286
|
+
let s = seed >>> 0 || 1;
|
|
287
|
+
const next = () => {
|
|
288
|
+
s |= 0;
|
|
289
|
+
s = s + 1831565813 | 0;
|
|
290
|
+
let t = Math.imul(s ^ s >>> 15, 1 | s);
|
|
291
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
292
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
293
|
+
};
|
|
294
|
+
const int = (min, max) => min + Math.floor(next() * (max - min + 1));
|
|
295
|
+
const pick = (arr) => arr[Math.floor(next() * arr.length)] ?? arr[0];
|
|
296
|
+
const chance = (p) => next() < p;
|
|
297
|
+
const shuffle = (arr) => {
|
|
298
|
+
const a = [...arr];
|
|
299
|
+
for (let i = a.length - 1; i > 0; i--) {
|
|
300
|
+
const j = Math.floor(next() * (i + 1));
|
|
301
|
+
[a[i], a[j]] = [a[j], a[i]];
|
|
302
|
+
}
|
|
303
|
+
return a;
|
|
304
|
+
};
|
|
305
|
+
return { next, int, pick, chance, shuffle };
|
|
306
|
+
}
|
|
307
|
+
function resolveSeed(seed, fallback) {
|
|
308
|
+
if (typeof seed === "number") return seed >>> 0;
|
|
309
|
+
if (typeof seed === "string" && seed.length) return hashString(seed);
|
|
310
|
+
return hashString(fallback);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// src/text.ts
|
|
314
|
+
var NARROW = new Set("iIl.,:;'|!ftrj()[]{} ".split(""));
|
|
315
|
+
var WIDE = new Set("mwMW@%".split(""));
|
|
316
|
+
var CAPS = new Set("ABCDEFGHKNOQRSUVXYZ".split(""));
|
|
317
|
+
function estimateTextWidth(text, fontSize, tracking = 0) {
|
|
318
|
+
let em = 0;
|
|
319
|
+
for (const ch of text) {
|
|
320
|
+
if (ch === " ") em += 0.3;
|
|
321
|
+
else if (NARROW.has(ch)) em += 0.3;
|
|
322
|
+
else if (WIDE.has(ch)) em += 0.92;
|
|
323
|
+
else if (CAPS.has(ch)) em += 0.7;
|
|
324
|
+
else em += 0.56;
|
|
325
|
+
}
|
|
326
|
+
return em * fontSize + Math.max(0, text.length - 1) * tracking;
|
|
327
|
+
}
|
|
328
|
+
function initials(name, max = 2) {
|
|
329
|
+
const words = name.replace(/[^\p{L}\p{N}\s]/gu, " ").split(/\s+/).filter(Boolean);
|
|
330
|
+
if (words.length === 0) return "\u2022";
|
|
331
|
+
if (words.length === 1) {
|
|
332
|
+
const w = words[0];
|
|
333
|
+
return (w.length <= max ? w : w.slice(0, max)).toUpperCase();
|
|
334
|
+
}
|
|
335
|
+
return words.slice(0, max).map((w) => w[0]).join("").toUpperCase();
|
|
336
|
+
}
|
|
337
|
+
function esc(s) {
|
|
338
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
339
|
+
}
|
|
340
|
+
function firstLetter(name) {
|
|
341
|
+
const m = name.match(/\p{L}/u);
|
|
342
|
+
return (m ? m[0] : "\u2022").toUpperCase();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// src/shapes.ts
|
|
346
|
+
function linearGradient(id, from, to, angle = 60) {
|
|
347
|
+
const a = angle * Math.PI / 180;
|
|
348
|
+
const x2 = (0.5 + Math.cos(a) / 2).toFixed(3);
|
|
349
|
+
const y2 = (0.5 + Math.sin(a) / 2).toFixed(3);
|
|
350
|
+
const x1 = (0.5 - Math.cos(a) / 2).toFixed(3);
|
|
351
|
+
const y1 = (0.5 - Math.sin(a) / 2).toFixed(3);
|
|
352
|
+
return `<linearGradient id="${id}" x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}"><stop offset="0" stop-color="${from}"/><stop offset="1" stop-color="${to}"/></linearGradient>`;
|
|
353
|
+
}
|
|
354
|
+
var n = (v) => Math.round(v * 100) / 100;
|
|
355
|
+
function shapeEl(kind, size, fill, stroke, strokeW = 0) {
|
|
356
|
+
const c = size / 2;
|
|
357
|
+
const pad = size * 0.06;
|
|
358
|
+
const r = c - pad;
|
|
359
|
+
const attrs = `fill="${fill}"${""}`;
|
|
360
|
+
switch (kind) {
|
|
361
|
+
case "none":
|
|
362
|
+
return "";
|
|
363
|
+
case "circle":
|
|
364
|
+
return `<circle cx="${n(c)}" cy="${n(c)}" r="${n(r)}" ${attrs}/>`;
|
|
365
|
+
case "rounded":
|
|
366
|
+
return `<rect x="${n(pad)}" y="${n(pad)}" width="${n(size - pad * 2)}" height="${n(size - pad * 2)}" rx="${n(size * 0.16)}" ${attrs}/>`;
|
|
367
|
+
case "squircle":
|
|
368
|
+
return `<rect x="${n(pad)}" y="${n(pad)}" width="${n(size - pad * 2)}" height="${n(size - pad * 2)}" rx="${n(size * 0.3)}" ${attrs}/>`;
|
|
369
|
+
case "diamond": {
|
|
370
|
+
const pts = [
|
|
371
|
+
[c, c - r],
|
|
372
|
+
[c + r, c],
|
|
373
|
+
[c, c + r],
|
|
374
|
+
[c - r, c]
|
|
375
|
+
].map((p) => `${n(p[0])},${n(p[1])}`).join(" ");
|
|
376
|
+
return `<polygon points="${pts}" rx="8" ${attrs}/>`;
|
|
377
|
+
}
|
|
378
|
+
case "hexagon": {
|
|
379
|
+
const pts = [];
|
|
380
|
+
for (let i = 0; i < 6; i++) {
|
|
381
|
+
const a = Math.PI / 180 * (60 * i - 90);
|
|
382
|
+
pts.push(`${n(c + r * Math.cos(a))},${n(c + r * Math.sin(a))}`);
|
|
383
|
+
}
|
|
384
|
+
return `<polygon points="${pts.join(" ")}" ${attrs}/>`;
|
|
385
|
+
}
|
|
386
|
+
case "shield": {
|
|
387
|
+
const d = `M ${n(c)} ${n(c - r)} L ${n(c + r * 0.82)} ${n(c - r * 0.55)} L ${n(c + r * 0.82)} ${n(c + r * 0.1)} C ${n(c + r * 0.82)} ${n(c + r * 0.6)} ${n(c + r * 0.45)} ${n(c + r * 0.9)} ${n(c)} ${n(c + r)} C ${n(c - r * 0.45)} ${n(c + r * 0.9)} ${n(c - r * 0.82)} ${n(c + r * 0.6)} ${n(c - r * 0.82)} ${n(c + r * 0.1)} L ${n(c - r * 0.82)} ${n(c - r * 0.55)} Z`;
|
|
388
|
+
return `<path d="${d}" ${attrs}/>`;
|
|
389
|
+
}
|
|
390
|
+
case "seal": {
|
|
391
|
+
const teeth = 24;
|
|
392
|
+
const inner = r * 0.9;
|
|
393
|
+
let d = "";
|
|
394
|
+
const steps = teeth * 6;
|
|
395
|
+
for (let i = 0; i <= steps; i++) {
|
|
396
|
+
const t = i / steps * Math.PI * 2;
|
|
397
|
+
const rad = inner + (r - inner) * (0.5 + 0.5 * Math.cos(teeth * t));
|
|
398
|
+
const x = c + rad * Math.cos(t - Math.PI / 2);
|
|
399
|
+
const y = c + rad * Math.sin(t - Math.PI / 2);
|
|
400
|
+
d += `${i === 0 ? "M" : "L"} ${n(x)} ${n(y)} `;
|
|
401
|
+
}
|
|
402
|
+
return `<path d="${d}Z" ${attrs}/>`;
|
|
403
|
+
}
|
|
404
|
+
case "blob": {
|
|
405
|
+
const k = size / 100;
|
|
406
|
+
const p = (x, y) => `${n(x * k)} ${n(y * k)}`;
|
|
407
|
+
const d = `M ${p(50, 8)} C ${p(74, 8)} ${p(92, 24)} ${p(92, 48)} C ${p(92, 72)} ${p(78, 92)} ${p(52, 92)} C ${p(28, 92)} ${p(8, 78)} ${p(8, 52)} C ${p(8, 28)} ${p(26, 8)} ${p(50, 8)} Z`;
|
|
408
|
+
return `<path d="${d}" ${attrs}/>`;
|
|
409
|
+
}
|
|
410
|
+
default:
|
|
411
|
+
return `<circle cx="${n(c)}" cy="${n(c)}" r="${n(r)}" ${attrs}/>`;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
function iconEl(icon, box, cx, cy, color, strokeW = 2) {
|
|
415
|
+
const sc = box / 24;
|
|
416
|
+
const tx = cx - box / 2;
|
|
417
|
+
const ty = cy - box / 2;
|
|
418
|
+
return `<g transform="translate(${n(tx)} ${n(ty)}) scale(${n(sc)})" fill="none" stroke="${color}" stroke-width="${strokeW}" stroke-linecap="round" stroke-linejoin="round">${icon.svg}</g>`;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// src/engines.ts
|
|
422
|
+
var nn = (v) => Math.round(v * 100) / 100;
|
|
423
|
+
var inkFor = (spec) => spec.background === "transparent" ? spec.palette.primary : spec.palette.on;
|
|
424
|
+
function monogramMark(spec) {
|
|
425
|
+
const s = spec.size;
|
|
426
|
+
const gid = spec.uid("m");
|
|
427
|
+
const defs = linearGradient(gid, spec.palette.from, spec.palette.to, spec.rng.int(30, 120));
|
|
428
|
+
const shape = spec.shape === "none" ? "squircle" : spec.shape;
|
|
429
|
+
const fs = spec.initials.length >= 2 ? s * 0.42 : s * 0.54;
|
|
430
|
+
const body = shapeEl(shape, s, `url(#${gid})`) + `<text x="${nn(s / 2)}" y="${nn(s / 2 + fs * 0.02)}" font-family="${spec.font.stack}" font-weight="${spec.font.weight}" font-size="${nn(fs)}" fill="${spec.palette.on}" text-anchor="middle" dominant-baseline="central">${esc(spec.initials)}</text>`;
|
|
431
|
+
return { svg: body, size: s, defs };
|
|
432
|
+
}
|
|
433
|
+
function lettermarkMark(spec) {
|
|
434
|
+
const s = spec.size;
|
|
435
|
+
const gid = spec.uid("l");
|
|
436
|
+
const defs = linearGradient(gid, spec.palette.from, spec.palette.to, spec.rng.int(20, 120));
|
|
437
|
+
const enclosed = spec.shape !== "none" && spec.rng.chance(0.4);
|
|
438
|
+
const fs = s * 0.86;
|
|
439
|
+
let body = "";
|
|
440
|
+
let fill = `url(#${gid})`;
|
|
441
|
+
if (enclosed) {
|
|
442
|
+
body += shapeEl(spec.shape, s, `url(#${gid})`);
|
|
443
|
+
fill = spec.palette.on;
|
|
444
|
+
}
|
|
445
|
+
body += `<text x="${nn(s / 2)}" y="${nn(s / 2 + fs * 0.03)}" font-family="${spec.font.stack}" font-weight="${spec.font.weight}" font-size="${nn(fs)}" fill="${fill}" text-anchor="middle" dominant-baseline="central">${esc(spec.letter)}</text>`;
|
|
446
|
+
return { svg: body, size: s, defs };
|
|
447
|
+
}
|
|
448
|
+
function iconMark(spec) {
|
|
449
|
+
const s = spec.size;
|
|
450
|
+
const gid = spec.uid("i");
|
|
451
|
+
const defs = linearGradient(gid, spec.palette.from, spec.palette.to, spec.rng.int(30, 120));
|
|
452
|
+
if (!spec.icon) return monogramMark(spec);
|
|
453
|
+
if (spec.shape === "none") {
|
|
454
|
+
const body2 = iconEl(spec.icon, s * 0.94, s / 2, s / 2, `url(#${gid})`, 2.1);
|
|
455
|
+
return { svg: body2, size: s, defs };
|
|
456
|
+
}
|
|
457
|
+
const body = shapeEl(spec.shape, s, `url(#${gid})`) + iconEl(spec.icon, s * 0.52, s / 2, s / 2, spec.palette.on, 2);
|
|
458
|
+
return { svg: body, size: s, defs };
|
|
459
|
+
}
|
|
460
|
+
function abstractMark(spec) {
|
|
461
|
+
const s = spec.size;
|
|
462
|
+
const c = s / 2;
|
|
463
|
+
const gid = spec.uid("a");
|
|
464
|
+
const defs = linearGradient(gid, spec.palette.from, spec.palette.to, spec.rng.int(20, 140));
|
|
465
|
+
const g = `url(#${gid})`;
|
|
466
|
+
const styles = ["orbit", "venn", "arcs", "burst", "waves", "grid"];
|
|
467
|
+
const style = spec.rng.pick(styles);
|
|
468
|
+
let body = "";
|
|
469
|
+
if (style === "orbit") {
|
|
470
|
+
const R = s * 0.34;
|
|
471
|
+
body += `<circle cx="${nn(c)}" cy="${nn(c)}" r="${nn(R)}" fill="none" stroke="${g}" stroke-width="${nn(s * 0.035)}"/>`;
|
|
472
|
+
body += `<circle cx="${nn(c)}" cy="${nn(c)}" r="${nn(s * 0.1)}" fill="${g}"/>`;
|
|
473
|
+
const base = spec.rng.int(0, 360);
|
|
474
|
+
for (let k = 0; k < 3; k++) {
|
|
475
|
+
const a = (base + k * 120) * Math.PI / 180;
|
|
476
|
+
const x = c + R * Math.cos(a);
|
|
477
|
+
const y = c + R * Math.sin(a);
|
|
478
|
+
body += `<circle cx="${nn(x)}" cy="${nn(y)}" r="${nn(s * 0.06)}" fill="${spec.palette.accent}"/>`;
|
|
479
|
+
body += `<line x1="${nn(c)}" y1="${nn(c)}" x2="${nn(x)}" y2="${nn(y)}" stroke="${g}" stroke-width="${nn(s * 0.02)}" opacity="0.5"/>`;
|
|
480
|
+
}
|
|
481
|
+
} else if (style === "venn") {
|
|
482
|
+
const r = s * 0.24;
|
|
483
|
+
const off = s * 0.14;
|
|
484
|
+
const centers = [
|
|
485
|
+
[c - off, c - off * 0.4],
|
|
486
|
+
[c + off, c - off * 0.4],
|
|
487
|
+
[c, c + off]
|
|
488
|
+
];
|
|
489
|
+
centers.forEach((p, i) => {
|
|
490
|
+
body += `<circle cx="${nn(p[0])}" cy="${nn(p[1])}" r="${nn(r)}" fill="${i === 0 ? spec.palette.from : i === 1 ? spec.palette.to : spec.palette.accent}" opacity="0.75"/>`;
|
|
491
|
+
});
|
|
492
|
+
} else if (style === "arcs") {
|
|
493
|
+
for (let i = 0; i < 3; i++) {
|
|
494
|
+
const R = s * (0.16 + i * 0.11);
|
|
495
|
+
const a0 = spec.rng.int(0, 180) * Math.PI / 180;
|
|
496
|
+
const a1 = a0 + Math.PI * 1.3;
|
|
497
|
+
const x0 = c + R * Math.cos(a0);
|
|
498
|
+
const y0 = c + R * Math.sin(a0);
|
|
499
|
+
const x1 = c + R * Math.cos(a1);
|
|
500
|
+
const y1 = c + R * Math.sin(a1);
|
|
501
|
+
body += `<path d="M ${nn(x0)} ${nn(y0)} A ${nn(R)} ${nn(R)} 0 1 1 ${nn(x1)} ${nn(y1)}" fill="none" stroke="${g}" stroke-width="${nn(s * 0.05)}" stroke-linecap="round"/>`;
|
|
502
|
+
}
|
|
503
|
+
} else if (style === "burst") {
|
|
504
|
+
const spokes = spec.rng.int(6, 10);
|
|
505
|
+
const base = spec.rng.int(0, 360);
|
|
506
|
+
for (let k = 0; k < spokes; k++) {
|
|
507
|
+
const a = (base + 360 / spokes * k) * Math.PI / 180;
|
|
508
|
+
const r0 = s * 0.12;
|
|
509
|
+
const r1 = s * 0.4;
|
|
510
|
+
body += `<line x1="${nn(c + r0 * Math.cos(a))}" y1="${nn(c + r0 * Math.sin(a))}" x2="${nn(c + r1 * Math.cos(a))}" y2="${nn(c + r1 * Math.sin(a))}" stroke="${g}" stroke-width="${nn(s * 0.035)}" stroke-linecap="round"/>`;
|
|
511
|
+
}
|
|
512
|
+
body += `<circle cx="${nn(c)}" cy="${nn(c)}" r="${nn(s * 0.09)}" fill="${spec.palette.accent}"/>`;
|
|
513
|
+
} else if (style === "waves") {
|
|
514
|
+
for (let i = 0; i < 3; i++) {
|
|
515
|
+
const y = c - s * 0.14 + i * s * 0.14;
|
|
516
|
+
const amp = s * 0.06;
|
|
517
|
+
const d = `M ${nn(s * 0.14)} ${nn(y)} C ${nn(s * 0.32)} ${nn(y - amp)} ${nn(s * 0.42)} ${nn(y + amp)} ${nn(s * 0.5)} ${nn(y)} C ${nn(s * 0.58)} ${nn(y - amp)} ${nn(s * 0.68)} ${nn(y + amp)} ${nn(s * 0.86)} ${nn(y)}`;
|
|
518
|
+
body += `<path d="${d}" fill="none" stroke="${g}" stroke-width="${nn(s * 0.045)}" stroke-linecap="round" opacity="${nn(1 - i * 0.22)}"/>`;
|
|
519
|
+
}
|
|
520
|
+
} else {
|
|
521
|
+
const n2 = 3;
|
|
522
|
+
const gap = s * 0.2;
|
|
523
|
+
const start = c - gap;
|
|
524
|
+
for (let r = 0; r < n2; r++) {
|
|
525
|
+
for (let col = 0; col < n2; col++) {
|
|
526
|
+
const x = start + col * gap;
|
|
527
|
+
const y = start + r * gap;
|
|
528
|
+
const rad = s * 0.055 * (1 + (r + col) % 2 * 0.4);
|
|
529
|
+
body += `<circle cx="${nn(x)}" cy="${nn(y)}" r="${nn(rad)}" fill="${(r + col) % 2 ? spec.palette.accent : g}"/>`;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return { svg: body, size: s, defs };
|
|
534
|
+
}
|
|
535
|
+
function emblemLogo(spec) {
|
|
536
|
+
const s = spec.size;
|
|
537
|
+
const c = s / 2;
|
|
538
|
+
const gid = spec.uid("e");
|
|
539
|
+
const defs0 = linearGradient(gid, spec.palette.from, spec.palette.to, spec.rng.int(30, 120));
|
|
540
|
+
const g = `url(#${gid})`;
|
|
541
|
+
const ink = inkFor(spec);
|
|
542
|
+
const R = s * 0.46;
|
|
543
|
+
const arcId = spec.uid("arc");
|
|
544
|
+
const ar = s * 0.34;
|
|
545
|
+
const arcPath = `M ${nn(c - ar)} ${nn(c + ar * 0.35)} A ${nn(ar)} ${nn(ar)} 0 0 0 ${nn(c + ar)} ${nn(c + ar * 0.35)}`;
|
|
546
|
+
const defs = defs0 + `<path id="${arcId}" d="${arcPath}" fill="none"/>`;
|
|
547
|
+
let body = "";
|
|
548
|
+
body += `<circle cx="${nn(c)}" cy="${nn(c)}" r="${nn(R)}" fill="none" stroke="${g}" stroke-width="${nn(s * 0.03)}"/>`;
|
|
549
|
+
body += `<circle cx="${nn(c)}" cy="${nn(c)}" r="${nn(R - s * 0.05)}" fill="none" stroke="${ink}" stroke-width="${nn(s * 6e-3)}" opacity="0.6"/>`;
|
|
550
|
+
if (spec.icon) body += iconEl(spec.icon, s * 0.34, c, c - s * 0.09, g, 2);
|
|
551
|
+
else
|
|
552
|
+
body += `<text x="${nn(c)}" y="${nn(c - s * 0.05)}" font-family="${spec.font.stack}" font-weight="${spec.font.weight}" font-size="${nn(s * 0.32)}" fill="${g}" text-anchor="middle" dominant-baseline="central">${esc(spec.initials)}</text>`;
|
|
553
|
+
body += `<circle cx="${nn(c - s * 0.3)}" cy="${nn(c + s * 0.1)}" r="${nn(s * 0.014)}" fill="${ink}"/>`;
|
|
554
|
+
body += `<circle cx="${nn(c + s * 0.3)}" cy="${nn(c + s * 0.1)}" r="${nn(s * 0.014)}" fill="${ink}"/>`;
|
|
555
|
+
const fs = s * 0.088;
|
|
556
|
+
body += `<text font-family="${spec.font.stack}" font-weight="${spec.font.weight}" font-size="${nn(fs)}" fill="${ink}" letter-spacing="${nn(fs * 0.14)}"><textPath href="#${arcId}" startOffset="50%" text-anchor="middle">${esc(spec.name.toUpperCase())}</textPath></text>`;
|
|
557
|
+
return { svg: body, size: s, defs };
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// src/render.ts
|
|
561
|
+
var nn2 = (v) => Math.round(v * 100) / 100;
|
|
562
|
+
function fontImport(font) {
|
|
563
|
+
const fam = font.display.replace(/ /g, "+");
|
|
564
|
+
return `<style>@import url('https://fonts.googleapis.com/css2?family=${fam}:wght@${font.weight}&display=swap');</style>`;
|
|
565
|
+
}
|
|
566
|
+
function inkColor(spec) {
|
|
567
|
+
return spec.background === "transparent" ? spec.palette.primary : spec.palette.on;
|
|
568
|
+
}
|
|
569
|
+
function wordmarkEl(spec, x, y, fontSize, anchor) {
|
|
570
|
+
const isLuxe = spec.font.mood.includes("luxe") || spec.font.mood.includes("elegant");
|
|
571
|
+
const tracking = isLuxe ? fontSize * 0.04 : 0;
|
|
572
|
+
const ls = tracking ? ` letter-spacing="${nn2(tracking)}"` : "";
|
|
573
|
+
return `<text x="${nn2(x)}" y="${nn2(y)}" font-family="${spec.font.stack}" font-weight="${spec.font.weight}" font-size="${nn2(fontSize)}" fill="${inkColor(spec)}" text-anchor="${anchor}" dominant-baseline="middle"${ls}>${esc(spec.name)}</text>`;
|
|
574
|
+
}
|
|
575
|
+
function background(spec, w, h, defsId) {
|
|
576
|
+
if (spec.background === "transparent") return "";
|
|
577
|
+
if (spec.background === "solid") return `<rect width="${w}" height="${h}" fill="${spec.palette.bg}"/>`;
|
|
578
|
+
if (spec.background === "surface") return `<rect width="${w}" height="${h}" fill="${spec.palette.surface}"/>`;
|
|
579
|
+
return `<rect width="${w}" height="${h}" fill="url(#${defsId})"/>`;
|
|
580
|
+
}
|
|
581
|
+
function wrapSvg(spec, w, h, defs, body) {
|
|
582
|
+
const bgId = "bg";
|
|
583
|
+
const bgDefs = spec.background === "gradient" ? `<linearGradient id="${bgId}" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="${spec.palette.from}"/><stop offset="1" stop-color="${spec.palette.to}"/></linearGradient>` : "";
|
|
584
|
+
const fontStyle = spec.embedFont ? fontImport(spec.font) : "";
|
|
585
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${nn2(w)}" height="${nn2(h)}" viewBox="0 0 ${nn2(w)} ${nn2(h)}" role="img" aria-label="${esc(spec.name)} logo">` + fontStyle + `<defs>${bgDefs}${defs}</defs>` + background(spec, w, h, bgId) + body + `</svg>`;
|
|
586
|
+
}
|
|
587
|
+
function compose(spec, mark) {
|
|
588
|
+
const pad = Math.round(spec.size * 0.12);
|
|
589
|
+
const defs = mark.defs ?? "";
|
|
590
|
+
if (spec.layout === "mark-only" || spec.layout === "emblem") {
|
|
591
|
+
const w2 = mark.size + pad * 2;
|
|
592
|
+
const body2 = `<g transform="translate(${pad} ${pad})">${mark.svg}</g>`;
|
|
593
|
+
return { svg: wrapSvg(spec, w2, w2, defs, body2), width: w2, height: w2 };
|
|
594
|
+
}
|
|
595
|
+
if (spec.layout === "wordmark-only") {
|
|
596
|
+
const fontSize2 = Math.round(spec.size * 0.4);
|
|
597
|
+
const tw2 = estimateTextWidth(spec.name, fontSize2, spec.font.mood.includes("luxe") ? fontSize2 * 0.04 : 0);
|
|
598
|
+
const w2 = Math.round(tw2 + pad * 2);
|
|
599
|
+
const h2 = Math.round(fontSize2 * 1.5);
|
|
600
|
+
const tick = `<rect x="${pad - Math.round(spec.size * 0.03)}" y="${Math.round(h2 / 2 - fontSize2 * 0.36)}" width="${Math.round(spec.size * 0.014)}" height="${Math.round(fontSize2 * 0.72)}" rx="2" fill="${spec.palette.primary}"/>`;
|
|
601
|
+
const body2 = tick + wordmarkEl(spec, pad, h2 / 2, fontSize2, "start");
|
|
602
|
+
return { svg: wrapSvg(spec, w2, h2, defs, body2), width: w2, height: h2 };
|
|
603
|
+
}
|
|
604
|
+
if (spec.layout === "icon-top" || spec.layout === "stacked") {
|
|
605
|
+
const markSize2 = spec.size;
|
|
606
|
+
const fontSize2 = Math.round(spec.size * (spec.layout === "stacked" ? 0.34 : 0.28));
|
|
607
|
+
const gap2 = Math.round(spec.size * 0.14);
|
|
608
|
+
const tw2 = estimateTextWidth(spec.name, fontSize2, spec.font.mood.includes("luxe") ? fontSize2 * 0.04 : 0);
|
|
609
|
+
const w2 = Math.round(Math.max(markSize2, tw2) + pad * 2);
|
|
610
|
+
const h2 = Math.round(markSize2 + gap2 + fontSize2 * 1.3 + pad);
|
|
611
|
+
const markX = (w2 - markSize2) / 2;
|
|
612
|
+
const body2 = `<g transform="translate(${nn2(markX)} ${pad})">${mark.svg}</g>` + wordmarkEl(spec, w2 / 2, pad + markSize2 + gap2 + fontSize2 * 0.5, fontSize2, "middle");
|
|
613
|
+
return { svg: wrapSvg(spec, w2, h2, defs, body2), width: w2, height: h2 };
|
|
614
|
+
}
|
|
615
|
+
const markSize = spec.size;
|
|
616
|
+
const fontSize = Math.round(spec.size * 0.4);
|
|
617
|
+
const gap = Math.round(spec.size * 0.16);
|
|
618
|
+
const tw = estimateTextWidth(spec.name, fontSize, spec.font.mood.includes("luxe") ? fontSize * 0.04 : 0);
|
|
619
|
+
const w = Math.round(markSize + gap + tw + pad * 2);
|
|
620
|
+
const h = Math.round(markSize + pad * 2);
|
|
621
|
+
const body = `<g transform="translate(${pad} ${pad})">${mark.svg}</g>` + wordmarkEl(spec, pad + markSize + gap, h / 2, fontSize, "start");
|
|
622
|
+
return { svg: wrapSvg(spec, w, h, defs, body), width: w, height: h };
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
// src/generate.ts
|
|
626
|
+
function chooseEngine(mood, rng, forced) {
|
|
627
|
+
if (forced) return forced;
|
|
628
|
+
return rng.pick(mood.engines);
|
|
629
|
+
}
|
|
630
|
+
function chooseLayout(mood, engine, rng, forced) {
|
|
631
|
+
if (forced) return forced;
|
|
632
|
+
if (engine === "emblem") return "emblem";
|
|
633
|
+
const opts = mood.layouts.filter((l) => l !== "emblem");
|
|
634
|
+
return opts.length ? rng.pick(opts) : "icon-left";
|
|
635
|
+
}
|
|
636
|
+
function markFor(engine, spec) {
|
|
637
|
+
switch (engine) {
|
|
638
|
+
case "monogram":
|
|
639
|
+
return monogramMark(spec);
|
|
640
|
+
case "lettermark":
|
|
641
|
+
return lettermarkMark(spec);
|
|
642
|
+
case "abstract":
|
|
643
|
+
return abstractMark(spec);
|
|
644
|
+
case "emblem":
|
|
645
|
+
return emblemLogo(spec);
|
|
646
|
+
case "wordmark":
|
|
647
|
+
default:
|
|
648
|
+
return iconMark(spec);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
function generateLogo(brief) {
|
|
652
|
+
if (!brief.name || !brief.name.trim()) throw new Error("generateLogo: `name` is required.");
|
|
653
|
+
const seed = resolveSeed(brief.seed, brief.name + "|" + (typeof brief.keywords === "string" ? brief.keywords : (brief.keywords || []).join(",")));
|
|
654
|
+
const rng = makeRng(seed);
|
|
655
|
+
const tokens = tokenize(brief);
|
|
656
|
+
const mood = chooseMood(tokens, rng, brief.industry || brief.style);
|
|
657
|
+
const palette = choosePalette(tokens, mood, rng, brief.palette);
|
|
658
|
+
const font = chooseFont(mood, rng, brief.font);
|
|
659
|
+
const iconDef = chooseIcon(tokens, rng, brief.icon);
|
|
660
|
+
const engine = chooseEngine(mood, rng, brief.engine);
|
|
661
|
+
const shape = brief.shape ?? rng.pick(mood.shapes);
|
|
662
|
+
const layout = chooseLayout(mood, engine, rng, brief.layout);
|
|
663
|
+
let idc = 0;
|
|
664
|
+
const uid = (p = "g") => `${p}${seed.toString(36)}${idc++}`;
|
|
665
|
+
const spec = {
|
|
666
|
+
name: brief.name.trim(),
|
|
667
|
+
initials: initials(brief.name),
|
|
668
|
+
letter: firstLetter(brief.name),
|
|
669
|
+
palette,
|
|
670
|
+
font,
|
|
671
|
+
icon: iconDef,
|
|
672
|
+
shape,
|
|
673
|
+
layout,
|
|
674
|
+
size: brief.size ?? 480,
|
|
675
|
+
background: brief.background ?? "surface",
|
|
676
|
+
rng,
|
|
677
|
+
tokens,
|
|
678
|
+
embedFont: true,
|
|
679
|
+
uid
|
|
680
|
+
};
|
|
681
|
+
const mark = markFor(engine, spec);
|
|
682
|
+
const composed = compose(spec, mark);
|
|
683
|
+
const notes = [
|
|
684
|
+
`mood "${mood.name}"${tokens.length ? " from keywords" : " (default)"}`,
|
|
685
|
+
`palette ${palette.name}`,
|
|
686
|
+
`type ${font.display} / ${font.body}`,
|
|
687
|
+
iconDef ? `icon "${iconDef.key}"` : `no icon match \u2192 ${engine} mark`,
|
|
688
|
+
`engine ${engine}, layout ${layout}, shape ${shape}`
|
|
689
|
+
];
|
|
690
|
+
const interpreted = {
|
|
691
|
+
keywords: tokens,
|
|
692
|
+
mood: mood.id,
|
|
693
|
+
iconKey: iconDef?.key,
|
|
694
|
+
paletteId: palette.id,
|
|
695
|
+
fontId: font.id,
|
|
696
|
+
notes
|
|
697
|
+
};
|
|
698
|
+
return {
|
|
699
|
+
svg: composed.svg,
|
|
700
|
+
width: composed.width,
|
|
701
|
+
height: composed.height,
|
|
702
|
+
engine,
|
|
703
|
+
palette,
|
|
704
|
+
font,
|
|
705
|
+
icon: iconDef?.key,
|
|
706
|
+
shape,
|
|
707
|
+
layout,
|
|
708
|
+
mood: mood.id,
|
|
709
|
+
name: spec.name,
|
|
710
|
+
seed,
|
|
711
|
+
interpreted
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
function generateLogoSet(brief, count = 12) {
|
|
715
|
+
const base = resolveSeed(brief.seed, brief.name);
|
|
716
|
+
const out = [];
|
|
717
|
+
for (let i = 0; i < count; i++) {
|
|
718
|
+
out.push(generateLogo({ ...brief, seed: base + i * 2654435761 >>> 0 }));
|
|
719
|
+
}
|
|
720
|
+
return out;
|
|
721
|
+
}
|
|
722
|
+
function suggest(brief) {
|
|
723
|
+
return generateLogo(brief).interpreted;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
exports.FONTS = FONTS;
|
|
727
|
+
exports.ICONS = ICONS;
|
|
728
|
+
exports.MOODS = MOODS;
|
|
729
|
+
exports.PALETTES = PALETTES;
|
|
730
|
+
exports.generateLogo = generateLogo;
|
|
731
|
+
exports.generateLogoSet = generateLogoSet;
|
|
732
|
+
exports.initials = initials;
|
|
733
|
+
exports.suggest = suggest;
|
|
734
|
+
exports.tokenize = tokenize;
|
|
735
|
+
//# sourceMappingURL=index.cjs.map
|
|
736
|
+
//# sourceMappingURL=index.cjs.map
|