@chaibuilder/sdk 2.4.3 → 2.4.4
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/dist/CssImportModal-CUuK4FZH.cjs +13 -0
- package/dist/CssImportModal-DXUM3oRB.js +296 -0
- package/dist/core.cjs +3 -15
- package/dist/core.js +1100 -1202
- package/dist/render.cjs +2 -2
- package/dist/render.js +101 -112
- package/package.json +2 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),V=require("react"),l=require("./toggle-D0REpYUl.cjs"),T=require("culori"),w=require("@chaibuilder/runtime"),R=require("react-i18next");function k(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(o,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return o.default=e,Object.freeze(o)}const x=k(V),y=k(T),d=e=>e?e%1===0?e:e.toFixed(4):"0",N=e=>`hsl(${d(e.h)} ${d(e.s*100)}% ${d(e.l*100)}%)`,E=(e,o="hsl",t="4")=>{try{const r=y.parse(e);if(!r)throw new Error("Invalid color input");switch(o){case"hsl":{const s=y.converter("hsl")(r);return t==="4"?N(s):`${d(s.h)} ${d(s.s*100)}% ${d(s.l*100)}%`}case"rgb":return y.formatRgb(r);case"oklch":{const s=y.converter("oklch")(r);return`oklch(${d(s.l)} ${d(s.c)} ${d(s.h)})`}case"hex":return y.formatHex(r);default:return e}}catch(r){return console.error(`Failed to convert color: ${e}`,r),e}},b=e=>E(e,"hex"),I=e=>{const o={fontFamily:{heading:"",body:""},borderRadius:"",colors:{}};try{const t=j(e);if(!t.isValid)return console.warn("CSS validation failed:",t.error),$();const r=C(e,":root"),s=C(e,".dark"),i=m(r,"--font-sans")||m(r,"--font-family")||m(r,"--font-heading")||m(r,"--font-body"),n=D(i);o.fontFamily={heading:n,body:n};const u=m(r,"--radius")||m(r,"--border-radius")||"0.5rem";o.borderRadius=P(u),["background","foreground","primary","primary-foreground","secondary","secondary-foreground","muted","muted-foreground","accent","accent-foreground","destructive","destructive-foreground","border","input","ring","card","card-foreground","popover","popover-foreground"].forEach(c=>{const p=m(r,`--${c}`),g=m(s,`--${c}`);if(p||g){const f=p?v(p):"#000000",S=g?v(g):f;o.colors[c]=[f,S]}})}catch(t){return console.error("Error parsing CSS to ChaiThemeValues:",t),$()}return o},C=(e,o)=>{var r,s;const t=new RegExp(`${F(o)}\\s*{([^}]+)}`);return((s=(r=e.match(t))==null?void 0:r[1])==null?void 0:s.trim())||null},m=(e,o)=>{var s;if(!e)return null;const t=new RegExp(`${F(o)}\\s*:\\s*([^;]+)`),r=e.match(t);return((s=r==null?void 0:r[1])==null?void 0:s.trim())||null},v=e=>{if(!e||typeof e!="string")return"#000000";try{const o=e.replace(/var\([^)]+\)/g,"").trim();if(!o)return"#000000";if(/^[a-z]+$/i.test(o))return b(o)||"#000000";if(/^#?([0-9A-F]{3,4}|[0-9A-F]{6}|[0-9A-F]{8})$/i.test(o.replace(/#/g,""))){const r=o.startsWith("#")?o:`#${o}`;return r.length<=5?`#${r.slice(1).split("").map(s=>s+s).join("")}`.slice(0,7):r.length>7?r.slice(0,7):r}if(/^(rgb|hsl|oklch)a?\(/i.test(o))return b(o)||"#000000";const t=o.match(/^(\d+\.?\d*)\s+(\d+\.?\d*)%\s+(\d+\.?\d*)%$/);if(t){const[r,s,i,n]=t,u=`hsl(${s} ${i}% ${n}%)`;return b(u)||"#000000"}if(/^[\d.]+[\s,]+[\d.]+[\s,]+[\d.]+(?:[\s,/]+[\d.]+)?$/.test(o)){const r=o.split(/[\s,]+/).filter(Boolean);if(r.length>=3){const i=r.some(n=>n.includes("%"))?`hsl(${r[0]} ${r[1]} ${r[2]})`:`rgb(${r[0]}, ${r[1]}, ${r[2]})`;return b(i)||"#000000"}}return b(o)||"#000000"}catch(o){return console.warn("Failed to process color:",e,o),"#000000"}},D=e=>{const o=w.getAllRegisteredFonts();if(!e)return"ui-sans-serif, system-ui, sans-serif";try{const r=e.replace(/["']/g,"").trim().split(",")[0].trim(),s=o.find(i=>i.family.toLowerCase()===r.toLowerCase());return(s==null?void 0:s.family)||"ui-sans-serif, system-ui, sans-serif"}catch(t){return console.warn("Error processing font family:",e,t),"ui-sans-serif, system-ui, sans-serif"}},P=e=>{if(!e)return"8px";try{const o=e.trim();if(o.endsWith("px"))return o;if(o.endsWith("rem")){const r=parseFloat(o.replace("rem",""));if(!isNaN(r))return`${Math.round(r*16)}px`}if(o.endsWith("em")){const r=parseFloat(o.replace("em",""));if(!isNaN(r))return`${Math.round(r*16)}px`}const t=parseFloat(o);return isNaN(t)?"8px":`${Math.round(t)}px`}catch(o){return console.warn("Error converting border radius to px:",e,o),"8px"}},$=()=>({fontFamily:{heading:"ui-sans-serif, system-ui, sans-serif",body:"ui-sans-serif, system-ui, sans-serif"},borderRadius:"8px",colors:{background:["#ffffff","#000000"],foreground:["#000000","#ffffff"],primary:["#3b82f6","#60a5fa"],"primary-foreground":["#ffffff","#1e293b"],secondary:["#f1f5f9","#334155"],"secondary-foreground":["#0f172a","#f8fafc"],muted:["#f8fafc","#1e293b"],"muted-foreground":["#64748b","#94a3b8"],accent:["#f1f5f9","#334155"],"accent-foreground":["#0f172a","#f8fafc"],destructive:["#ef4444","#f87171"],"destructive-foreground":["#ffffff","#1e293b"],border:["#e2e8f0","#475569"],input:["#e2e8f0","#475569"],ring:["#3b82f6","#60a5fa"],card:["#ffffff","#0f172a"],"card-foreground":["#000000","#f8fafc"],popover:["#ffffff","#0f172a"],"popover-foreground":["#000000","#f8fafc"]}}),F=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),q=e=>["background","foreground","primary","primary-foreground"].every(r=>e.colors[r]&&Array.isArray(e.colors[r])&&e.colors[r].length>=2)&&!!e.fontFamily.heading&&!!e.fontFamily.body&&!!e.borderRadius,j=e=>{if(!e||typeof e!="string")return{isValid:!1,error:"Please enter valid CSS content"};const o=e.trim();if(!o)return{isValid:!1,error:"Please enter CSS content"};try{if(!o.includes("{")||!o.includes("}"))return{isValid:!1,error:"Invalid CSS format. CSS should contain proper block structure with { }"};const t=(o.match(/{/g)||[]).length,r=(o.match(/}/g)||[]).length;return t!==r?{isValid:!1,error:"Invalid CSS format. Unmatched braces detected"}:!o.includes("--")||!o.includes(":")?{isValid:!1,error:"Invalid CSS format. CSS should contain variable definitions like --primary: #color"}:!o.includes(":root")&&!o.includes(".dark")?{isValid:!1,error:"CSS should contain at least :root or .dark selector with theme variables"}:{isValid:!0}}catch(t){return console.error("CSS validation error:",t),{isValid:!1,error:"Failed to parse CSS. Please check your syntax."}}},M=`:root {
|
|
2
|
+
--background: 0 0% 100%;
|
|
3
|
+
--foreground: oklch(0.52 0.13 144.17);
|
|
4
|
+
--primary: #3e2723;
|
|
5
|
+
--primary-foreground: #ffffff;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.dark {
|
|
9
|
+
--background: 222.2 84% 4.9%;
|
|
10
|
+
--foreground: hsl(37.50 36.36% 95.69%);
|
|
11
|
+
--primary: rgb(46, 125, 50);
|
|
12
|
+
--primary-foreground: #ffffff;
|
|
13
|
+
}`,A=({open:e,onOpenChange:o,onImport:t})=>{const[r,s]=x.useState(""),[i,n]=x.useState(null),[u,h]=x.useState(!1),{t:c}=R.useTranslation(),p=async()=>{h(!0),n(null);try{const f=j(r);if(!f.isValid){n(f.error||"Invalid CSS format"),setTimeout(()=>{n(null)},5e3),h(!1);return}const S=I(r);if(!q(S)){n("The CSS doesn't contain enough theme information. Please ensure it includes at least background, foreground, primary, and primary-foreground colors."),setTimeout(()=>{n(null)},5e3),h(!1);return}t(S),s(""),n(null),o(!1)}catch(f){console.error("Error importing CSS:",f),n("Failed to parse CSS. Please check your syntax and try again."),setTimeout(()=>{n(null)},5e3)}finally{h(!1)}},g=()=>{s(""),n(null),o(!1)};return a.jsx(l.Dialog,{open:e,onOpenChange:o,children:a.jsxs(l.DialogContent,{className:"max-w-2xl max-h-[80vh] flex flex-col",children:[a.jsxs(l.DialogHeader,{children:[a.jsx(l.DialogTitle,{children:c("Import CSS Theme")}),a.jsx(l.DialogDescription,{children:c("Paste your CSS variables to import a custom theme. The CSS should contain :root and .dark blocks with CSS custom properties.")})]}),a.jsxs("div",{className:"flex-1 space-y-4 overflow-hidden",children:[a.jsxs("div",{className:"space-y-2",children:[a.jsx(l.Label,{htmlFor:"css-input",children:c("CSS Variables")}),a.jsx(l.Textarea,{id:"css-input",placeholder:M,value:r,onChange:f=>s(f.target.value),className:"min-h-[300px] font-mono text-sm resize-none",disabled:u})]}),i&&a.jsx("div",{className:"rounded-md border border-red-200 bg-red-50 p-3",children:a.jsx("p",{className:"text-sm text-red-600",children:i})})]}),a.jsxs(l.DialogFooter,{className:"gap-2",children:[a.jsx(l.Button,{variant:"outline",onClick:g,disabled:u,children:c("Cancel")}),a.jsx(l.Button,{onClick:p,disabled:!r.trim()||u,children:c(u?"Importing...":"Import Theme")})]})]})})};exports.CssImportModal=A;
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { jsx as c, jsxs as g } from "react/jsx-runtime";
|
|
2
|
+
import * as C from "react";
|
|
3
|
+
import { a1 as T, a3 as w, a6 as R, a9 as E, a4 as N, au as I, b1 as D, a5 as A, v as x } from "./toggle-BKtuoy5e.js";
|
|
4
|
+
import * as y from "culori";
|
|
5
|
+
import { getAllRegisteredFonts as P } from "@chaibuilder/runtime";
|
|
6
|
+
import { useTranslation as H } from "react-i18next";
|
|
7
|
+
const f = (o) => o ? o % 1 === 0 ? o : o.toFixed(4) : "0", L = (o) => `hsl(${f(o.h)} ${f(o.s * 100)}% ${f(o.l * 100)}%)`, M = (o, e = "hsl", s = "4") => {
|
|
8
|
+
try {
|
|
9
|
+
const r = y.parse(o);
|
|
10
|
+
if (!r) throw new Error("Invalid color input");
|
|
11
|
+
switch (e) {
|
|
12
|
+
case "hsl": {
|
|
13
|
+
const t = y.converter("hsl")(r);
|
|
14
|
+
return s === "4" ? L(t) : `${f(t.h)} ${f(t.s * 100)}% ${f(t.l * 100)}%`;
|
|
15
|
+
}
|
|
16
|
+
case "rgb":
|
|
17
|
+
return y.formatRgb(r);
|
|
18
|
+
case "oklch": {
|
|
19
|
+
const t = y.converter("oklch")(r);
|
|
20
|
+
return `oklch(${f(t.l)} ${f(t.c)} ${f(t.h)})`;
|
|
21
|
+
}
|
|
22
|
+
case "hex":
|
|
23
|
+
return y.formatHex(r);
|
|
24
|
+
default:
|
|
25
|
+
return o;
|
|
26
|
+
}
|
|
27
|
+
} catch (r) {
|
|
28
|
+
return console.error(`Failed to convert color: ${o}`, r), o;
|
|
29
|
+
}
|
|
30
|
+
}, S = (o) => M(o, "hex"), B = (o) => {
|
|
31
|
+
const e = {
|
|
32
|
+
fontFamily: {
|
|
33
|
+
heading: "",
|
|
34
|
+
body: ""
|
|
35
|
+
},
|
|
36
|
+
borderRadius: "",
|
|
37
|
+
colors: {}
|
|
38
|
+
};
|
|
39
|
+
try {
|
|
40
|
+
const s = V(o);
|
|
41
|
+
if (!s.isValid)
|
|
42
|
+
return console.warn("CSS validation failed:", s.error), F();
|
|
43
|
+
const r = v(o, ":root"), t = v(o, ".dark"), a = u(r, "--font-sans") || u(r, "--font-family") || u(r, "--font-heading") || u(r, "--font-body"), n = q(a);
|
|
44
|
+
e.fontFamily = {
|
|
45
|
+
heading: n,
|
|
46
|
+
body: n
|
|
47
|
+
};
|
|
48
|
+
const d = u(r, "--radius") || u(r, "--border-radius") || "0.5rem";
|
|
49
|
+
e.borderRadius = W(d), [
|
|
50
|
+
"background",
|
|
51
|
+
"foreground",
|
|
52
|
+
"primary",
|
|
53
|
+
"primary-foreground",
|
|
54
|
+
"secondary",
|
|
55
|
+
"secondary-foreground",
|
|
56
|
+
"muted",
|
|
57
|
+
"muted-foreground",
|
|
58
|
+
"accent",
|
|
59
|
+
"accent-foreground",
|
|
60
|
+
"destructive",
|
|
61
|
+
"destructive-foreground",
|
|
62
|
+
"border",
|
|
63
|
+
"input",
|
|
64
|
+
"ring",
|
|
65
|
+
"card",
|
|
66
|
+
"card-foreground",
|
|
67
|
+
"popover",
|
|
68
|
+
"popover-foreground"
|
|
69
|
+
].forEach((i) => {
|
|
70
|
+
const h = u(r, `--${i}`), p = u(t, `--${i}`);
|
|
71
|
+
if (h || p) {
|
|
72
|
+
const l = h ? $(h) : "#000000", b = p ? $(p) : l;
|
|
73
|
+
e.colors[i] = [l, b];
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
} catch (s) {
|
|
77
|
+
return console.error("Error parsing CSS to ChaiThemeValues:", s), F();
|
|
78
|
+
}
|
|
79
|
+
return e;
|
|
80
|
+
}, v = (o, e) => {
|
|
81
|
+
var r, t;
|
|
82
|
+
const s = new RegExp(`${k(e)}\\s*{([^}]+)}`);
|
|
83
|
+
return ((t = (r = o.match(s)) == null ? void 0 : r[1]) == null ? void 0 : t.trim()) || null;
|
|
84
|
+
}, u = (o, e) => {
|
|
85
|
+
var t;
|
|
86
|
+
if (!o) return null;
|
|
87
|
+
const s = new RegExp(`${k(e)}\\s*:\\s*([^;]+)`), r = o.match(s);
|
|
88
|
+
return ((t = r == null ? void 0 : r[1]) == null ? void 0 : t.trim()) || null;
|
|
89
|
+
}, $ = (o) => {
|
|
90
|
+
if (!o || typeof o != "string")
|
|
91
|
+
return "#000000";
|
|
92
|
+
try {
|
|
93
|
+
const e = o.replace(/var\([^)]+\)/g, "").trim();
|
|
94
|
+
if (!e) return "#000000";
|
|
95
|
+
if (/^[a-z]+$/i.test(e))
|
|
96
|
+
return S(e) || "#000000";
|
|
97
|
+
if (/^#?([0-9A-F]{3,4}|[0-9A-F]{6}|[0-9A-F]{8})$/i.test(e.replace(/#/g, ""))) {
|
|
98
|
+
const r = e.startsWith("#") ? e : `#${e}`;
|
|
99
|
+
return r.length <= 5 ? `#${r.slice(1).split("").map((t) => t + t).join("")}`.slice(0, 7) : r.length > 7 ? r.slice(0, 7) : r;
|
|
100
|
+
}
|
|
101
|
+
if (/^(rgb|hsl|oklch)a?\(/i.test(e))
|
|
102
|
+
return S(e) || "#000000";
|
|
103
|
+
const s = e.match(/^(\d+\.?\d*)\s+(\d+\.?\d*)%\s+(\d+\.?\d*)%$/);
|
|
104
|
+
if (s) {
|
|
105
|
+
const [r, t, a, n] = s, d = `hsl(${t} ${a}% ${n}%)`;
|
|
106
|
+
return S(d) || "#000000";
|
|
107
|
+
}
|
|
108
|
+
if (/^[\d.]+[\s,]+[\d.]+[\s,]+[\d.]+(?:[\s,/]+[\d.]+)?$/.test(e)) {
|
|
109
|
+
const r = e.split(/[\s,]+/).filter(Boolean);
|
|
110
|
+
if (r.length >= 3) {
|
|
111
|
+
const a = r.some((n) => n.includes("%")) ? `hsl(${r[0]} ${r[1]} ${r[2]})` : `rgb(${r[0]}, ${r[1]}, ${r[2]})`;
|
|
112
|
+
return S(a) || "#000000";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return S(e) || "#000000";
|
|
116
|
+
} catch (e) {
|
|
117
|
+
return console.warn("Failed to process color:", o, e), "#000000";
|
|
118
|
+
}
|
|
119
|
+
}, q = (o) => {
|
|
120
|
+
const e = P();
|
|
121
|
+
if (!o)
|
|
122
|
+
return "ui-sans-serif, system-ui, sans-serif";
|
|
123
|
+
try {
|
|
124
|
+
const r = o.replace(/["']/g, "").trim().split(",")[0].trim(), t = e.find((a) => a.family.toLowerCase() === r.toLowerCase());
|
|
125
|
+
return (t == null ? void 0 : t.family) || "ui-sans-serif, system-ui, sans-serif";
|
|
126
|
+
} catch (s) {
|
|
127
|
+
return console.warn("Error processing font family:", o, s), "ui-sans-serif, system-ui, sans-serif";
|
|
128
|
+
}
|
|
129
|
+
}, W = (o) => {
|
|
130
|
+
if (!o)
|
|
131
|
+
return "8px";
|
|
132
|
+
try {
|
|
133
|
+
const e = o.trim();
|
|
134
|
+
if (e.endsWith("px"))
|
|
135
|
+
return e;
|
|
136
|
+
if (e.endsWith("rem")) {
|
|
137
|
+
const r = parseFloat(e.replace("rem", ""));
|
|
138
|
+
if (!isNaN(r))
|
|
139
|
+
return `${Math.round(r * 16)}px`;
|
|
140
|
+
}
|
|
141
|
+
if (e.endsWith("em")) {
|
|
142
|
+
const r = parseFloat(e.replace("em", ""));
|
|
143
|
+
if (!isNaN(r))
|
|
144
|
+
return `${Math.round(r * 16)}px`;
|
|
145
|
+
}
|
|
146
|
+
const s = parseFloat(e);
|
|
147
|
+
return isNaN(s) ? "8px" : `${Math.round(s)}px`;
|
|
148
|
+
} catch (e) {
|
|
149
|
+
return console.warn("Error converting border radius to px:", o, e), "8px";
|
|
150
|
+
}
|
|
151
|
+
}, F = () => ({
|
|
152
|
+
fontFamily: {
|
|
153
|
+
heading: "ui-sans-serif, system-ui, sans-serif",
|
|
154
|
+
body: "ui-sans-serif, system-ui, sans-serif"
|
|
155
|
+
},
|
|
156
|
+
borderRadius: "8px",
|
|
157
|
+
colors: {
|
|
158
|
+
background: ["#ffffff", "#000000"],
|
|
159
|
+
foreground: ["#000000", "#ffffff"],
|
|
160
|
+
primary: ["#3b82f6", "#60a5fa"],
|
|
161
|
+
"primary-foreground": ["#ffffff", "#1e293b"],
|
|
162
|
+
secondary: ["#f1f5f9", "#334155"],
|
|
163
|
+
"secondary-foreground": ["#0f172a", "#f8fafc"],
|
|
164
|
+
muted: ["#f8fafc", "#1e293b"],
|
|
165
|
+
"muted-foreground": ["#64748b", "#94a3b8"],
|
|
166
|
+
accent: ["#f1f5f9", "#334155"],
|
|
167
|
+
"accent-foreground": ["#0f172a", "#f8fafc"],
|
|
168
|
+
destructive: ["#ef4444", "#f87171"],
|
|
169
|
+
"destructive-foreground": ["#ffffff", "#1e293b"],
|
|
170
|
+
border: ["#e2e8f0", "#475569"],
|
|
171
|
+
input: ["#e2e8f0", "#475569"],
|
|
172
|
+
ring: ["#3b82f6", "#60a5fa"],
|
|
173
|
+
card: ["#ffffff", "#0f172a"],
|
|
174
|
+
"card-foreground": ["#000000", "#f8fafc"],
|
|
175
|
+
popover: ["#ffffff", "#0f172a"],
|
|
176
|
+
"popover-foreground": ["#000000", "#f8fafc"]
|
|
177
|
+
}
|
|
178
|
+
}), k = (o) => o.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), j = (o) => ["background", "foreground", "primary", "primary-foreground"].every(
|
|
179
|
+
(r) => o.colors[r] && Array.isArray(o.colors[r]) && o.colors[r].length >= 2
|
|
180
|
+
) && !!o.fontFamily.heading && !!o.fontFamily.body && !!o.borderRadius, V = (o) => {
|
|
181
|
+
if (!o || typeof o != "string")
|
|
182
|
+
return { isValid: !1, error: "Please enter valid CSS content" };
|
|
183
|
+
const e = o.trim();
|
|
184
|
+
if (!e)
|
|
185
|
+
return { isValid: !1, error: "Please enter CSS content" };
|
|
186
|
+
try {
|
|
187
|
+
if (!e.includes("{") || !e.includes("}"))
|
|
188
|
+
return {
|
|
189
|
+
isValid: !1,
|
|
190
|
+
error: "Invalid CSS format. CSS should contain proper block structure with { }"
|
|
191
|
+
};
|
|
192
|
+
const s = (e.match(/{/g) || []).length, r = (e.match(/}/g) || []).length;
|
|
193
|
+
return s !== r ? {
|
|
194
|
+
isValid: !1,
|
|
195
|
+
error: "Invalid CSS format. Unmatched braces detected"
|
|
196
|
+
} : !e.includes("--") || !e.includes(":") ? {
|
|
197
|
+
isValid: !1,
|
|
198
|
+
error: "Invalid CSS format. CSS should contain variable definitions like --primary: #color"
|
|
199
|
+
} : !e.includes(":root") && !e.includes(".dark") ? {
|
|
200
|
+
isValid: !1,
|
|
201
|
+
error: "CSS should contain at least :root or .dark selector with theme variables"
|
|
202
|
+
} : { isValid: !0 };
|
|
203
|
+
} catch (s) {
|
|
204
|
+
return console.error("CSS validation error:", s), { isValid: !1, error: "Failed to parse CSS. Please check your syntax." };
|
|
205
|
+
}
|
|
206
|
+
}, z = `:root {
|
|
207
|
+
--background: 0 0% 100%;
|
|
208
|
+
--foreground: oklch(0.52 0.13 144.17);
|
|
209
|
+
--primary: #3e2723;
|
|
210
|
+
--primary-foreground: #ffffff;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.dark {
|
|
214
|
+
--background: 222.2 84% 4.9%;
|
|
215
|
+
--foreground: hsl(37.50 36.36% 95.69%);
|
|
216
|
+
--primary: rgb(46, 125, 50);
|
|
217
|
+
--primary-foreground: #ffffff;
|
|
218
|
+
}`, J = ({
|
|
219
|
+
open: o,
|
|
220
|
+
onOpenChange: e,
|
|
221
|
+
onImport: s
|
|
222
|
+
}) => {
|
|
223
|
+
const [r, t] = C.useState(""), [a, n] = C.useState(null), [d, m] = C.useState(!1), { t: i } = H(), h = async () => {
|
|
224
|
+
m(!0), n(null);
|
|
225
|
+
try {
|
|
226
|
+
const l = V(r);
|
|
227
|
+
if (!l.isValid) {
|
|
228
|
+
n(l.error || "Invalid CSS format"), setTimeout(() => {
|
|
229
|
+
n(null);
|
|
230
|
+
}, 5e3), m(!1);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const b = B(r);
|
|
234
|
+
if (!j(b)) {
|
|
235
|
+
n("The CSS doesn't contain enough theme information. Please ensure it includes at least background, foreground, primary, and primary-foreground colors."), setTimeout(() => {
|
|
236
|
+
n(null);
|
|
237
|
+
}, 5e3), m(!1);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
s(b), t(""), n(null), e(!1);
|
|
241
|
+
} catch (l) {
|
|
242
|
+
console.error("Error importing CSS:", l), n("Failed to parse CSS. Please check your syntax and try again."), setTimeout(() => {
|
|
243
|
+
n(null);
|
|
244
|
+
}, 5e3);
|
|
245
|
+
} finally {
|
|
246
|
+
m(!1);
|
|
247
|
+
}
|
|
248
|
+
}, p = () => {
|
|
249
|
+
t(""), n(null), e(!1);
|
|
250
|
+
};
|
|
251
|
+
return /* @__PURE__ */ c(T, { open: o, onOpenChange: e, children: /* @__PURE__ */ g(w, { className: "max-w-2xl max-h-[80vh] flex flex-col", children: [
|
|
252
|
+
/* @__PURE__ */ g(R, { children: [
|
|
253
|
+
/* @__PURE__ */ c(E, { children: i("Import CSS Theme") }),
|
|
254
|
+
/* @__PURE__ */ c(N, { children: i("Paste your CSS variables to import a custom theme. The CSS should contain :root and .dark blocks with CSS custom properties.") })
|
|
255
|
+
] }),
|
|
256
|
+
/* @__PURE__ */ g("div", { className: "flex-1 space-y-4 overflow-hidden", children: [
|
|
257
|
+
/* @__PURE__ */ g("div", { className: "space-y-2", children: [
|
|
258
|
+
/* @__PURE__ */ c(I, { htmlFor: "css-input", children: i("CSS Variables") }),
|
|
259
|
+
/* @__PURE__ */ c(
|
|
260
|
+
D,
|
|
261
|
+
{
|
|
262
|
+
id: "css-input",
|
|
263
|
+
placeholder: z,
|
|
264
|
+
value: r,
|
|
265
|
+
onChange: (l) => t(l.target.value),
|
|
266
|
+
className: "min-h-[300px] font-mono text-sm resize-none",
|
|
267
|
+
disabled: d
|
|
268
|
+
}
|
|
269
|
+
)
|
|
270
|
+
] }),
|
|
271
|
+
a && /* @__PURE__ */ c("div", { className: "rounded-md border border-red-200 bg-red-50 p-3", children: /* @__PURE__ */ c("p", { className: "text-sm text-red-600", children: a }) })
|
|
272
|
+
] }),
|
|
273
|
+
/* @__PURE__ */ g(A, { className: "gap-2", children: [
|
|
274
|
+
/* @__PURE__ */ c(
|
|
275
|
+
x,
|
|
276
|
+
{
|
|
277
|
+
variant: "outline",
|
|
278
|
+
onClick: p,
|
|
279
|
+
disabled: d,
|
|
280
|
+
children: i("Cancel")
|
|
281
|
+
}
|
|
282
|
+
),
|
|
283
|
+
/* @__PURE__ */ c(
|
|
284
|
+
x,
|
|
285
|
+
{
|
|
286
|
+
onClick: h,
|
|
287
|
+
disabled: !r.trim() || d,
|
|
288
|
+
children: i(d ? "Importing..." : "Import Theme")
|
|
289
|
+
}
|
|
290
|
+
)
|
|
291
|
+
] })
|
|
292
|
+
] }) });
|
|
293
|
+
};
|
|
294
|
+
export {
|
|
295
|
+
J as CssImportModal
|
|
296
|
+
};
|