@prosophia/personal-portfolio 0.0.2 → 0.0.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.
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { S as SiteSettings, c as Profile } from '../index-dczHpph_.mjs';
3
+
4
+ interface RootLayoutProps {
5
+ children: React.ReactNode;
6
+ settings?: SiteSettings | null;
7
+ profile?: Profile | null;
8
+ }
9
+ /**
10
+ * Root layout component that provides theme and site settings context
11
+ */
12
+ declare function RootLayout({ children, settings, profile, }: RootLayoutProps): react_jsx_runtime.JSX.Element;
13
+
14
+ export { RootLayout, type RootLayoutProps };
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { S as SiteSettings, c as Profile } from '../index-dczHpph_.js';
3
+
4
+ interface RootLayoutProps {
5
+ children: React.ReactNode;
6
+ settings?: SiteSettings | null;
7
+ profile?: Profile | null;
8
+ }
9
+ /**
10
+ * Root layout component that provides theme and site settings context
11
+ */
12
+ declare function RootLayout({ children, settings, profile, }: RootLayoutProps): react_jsx_runtime.JSX.Element;
13
+
14
+ export { RootLayout, type RootLayoutProps };
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/layouts/index.ts
21
+ var layouts_exports = {};
22
+ __export(layouts_exports, {
23
+ RootLayout: () => RootLayout
24
+ });
25
+ module.exports = __toCommonJS(layouts_exports);
26
+
27
+ // src/context/ThemeContext.tsx
28
+ var import_react = require("react");
29
+ var import_jsx_runtime = require("react/jsx-runtime");
30
+ var ThemeContext = (0, import_react.createContext)({
31
+ theme: "dark",
32
+ toggleTheme: () => {
33
+ },
34
+ mounted: false
35
+ });
36
+ function ThemeProvider({ children }) {
37
+ const [theme, setTheme] = (0, import_react.useState)("dark");
38
+ const [mounted, setMounted] = (0, import_react.useState)(false);
39
+ (0, import_react.useEffect)(() => {
40
+ setMounted(true);
41
+ const stored = localStorage.getItem("theme");
42
+ if (stored) {
43
+ setTheme(stored);
44
+ } else if (window.matchMedia("(prefers-color-scheme: light)").matches) {
45
+ setTheme("light");
46
+ }
47
+ }, []);
48
+ (0, import_react.useEffect)(() => {
49
+ if (mounted) {
50
+ document.documentElement.setAttribute("data-theme", theme);
51
+ localStorage.setItem("theme", theme);
52
+ }
53
+ }, [theme, mounted]);
54
+ const toggleTheme = () => {
55
+ setTheme((prev) => prev === "dark" ? "light" : "dark");
56
+ };
57
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: { theme, toggleTheme, mounted }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { "data-theme": theme, children }) });
58
+ }
59
+ function useTheme() {
60
+ const context = (0, import_react.useContext)(ThemeContext);
61
+ return context;
62
+ }
63
+
64
+ // src/context/SiteSettingsContext.tsx
65
+ var import_react2 = require("react");
66
+
67
+ // src/lib/themeColors.ts
68
+ var colorPresets = {
69
+ violet: {
70
+ light: {
71
+ primary: "#8b5cf6",
72
+ primaryHover: "#7c3aed",
73
+ primaryLight: "#a78bfa",
74
+ tagBg: "rgba(139, 92, 246, 0.1)",
75
+ shadow: "rgba(139, 92, 246, 0.15)",
76
+ borderHighlight: "rgba(139, 92, 246, 0.2)",
77
+ glassBorder: "rgba(139, 92, 246, 0.1)"
78
+ },
79
+ dark: {
80
+ primary: "#a78bfa",
81
+ primaryHover: "#8b5cf6",
82
+ primaryLight: "#c4b5fd",
83
+ tagBg: "rgba(167, 139, 250, 0.15)",
84
+ shadow: "rgba(139, 92, 246, 0.2)",
85
+ borderHighlight: "rgba(167, 139, 250, 0.2)",
86
+ glassBorder: "rgba(167, 139, 250, 0.1)"
87
+ }
88
+ },
89
+ blue: {
90
+ light: {
91
+ primary: "#3b82f6",
92
+ primaryHover: "#2563eb",
93
+ primaryLight: "#60a5fa",
94
+ tagBg: "rgba(59, 130, 246, 0.1)",
95
+ shadow: "rgba(59, 130, 246, 0.15)",
96
+ borderHighlight: "rgba(59, 130, 246, 0.2)",
97
+ glassBorder: "rgba(59, 130, 246, 0.1)"
98
+ },
99
+ dark: {
100
+ primary: "#60a5fa",
101
+ primaryHover: "#3b82f6",
102
+ primaryLight: "#93c5fd",
103
+ tagBg: "rgba(96, 165, 250, 0.15)",
104
+ shadow: "rgba(59, 130, 246, 0.2)",
105
+ borderHighlight: "rgba(96, 165, 250, 0.2)",
106
+ glassBorder: "rgba(96, 165, 250, 0.1)"
107
+ }
108
+ },
109
+ emerald: {
110
+ light: {
111
+ primary: "#10b981",
112
+ primaryHover: "#059669",
113
+ primaryLight: "#34d399",
114
+ tagBg: "rgba(16, 185, 129, 0.1)",
115
+ shadow: "rgba(16, 185, 129, 0.15)",
116
+ borderHighlight: "rgba(16, 185, 129, 0.2)",
117
+ glassBorder: "rgba(16, 185, 129, 0.1)"
118
+ },
119
+ dark: {
120
+ primary: "#34d399",
121
+ primaryHover: "#10b981",
122
+ primaryLight: "#6ee7b7",
123
+ tagBg: "rgba(52, 211, 153, 0.15)",
124
+ shadow: "rgba(16, 185, 129, 0.2)",
125
+ borderHighlight: "rgba(52, 211, 153, 0.2)",
126
+ glassBorder: "rgba(52, 211, 153, 0.1)"
127
+ }
128
+ },
129
+ rose: {
130
+ light: {
131
+ primary: "#f43f5e",
132
+ primaryHover: "#e11d48",
133
+ primaryLight: "#fb7185",
134
+ tagBg: "rgba(244, 63, 94, 0.1)",
135
+ shadow: "rgba(244, 63, 94, 0.15)",
136
+ borderHighlight: "rgba(244, 63, 94, 0.2)",
137
+ glassBorder: "rgba(244, 63, 94, 0.1)"
138
+ },
139
+ dark: {
140
+ primary: "#fb7185",
141
+ primaryHover: "#f43f5e",
142
+ primaryLight: "#fda4af",
143
+ tagBg: "rgba(251, 113, 133, 0.15)",
144
+ shadow: "rgba(244, 63, 94, 0.2)",
145
+ borderHighlight: "rgba(251, 113, 133, 0.2)",
146
+ glassBorder: "rgba(251, 113, 133, 0.1)"
147
+ }
148
+ },
149
+ amber: {
150
+ light: {
151
+ primary: "#f59e0b",
152
+ primaryHover: "#d97706",
153
+ primaryLight: "#fbbf24",
154
+ tagBg: "rgba(245, 158, 11, 0.1)",
155
+ shadow: "rgba(245, 158, 11, 0.15)",
156
+ borderHighlight: "rgba(245, 158, 11, 0.2)",
157
+ glassBorder: "rgba(245, 158, 11, 0.1)"
158
+ },
159
+ dark: {
160
+ primary: "#fbbf24",
161
+ primaryHover: "#f59e0b",
162
+ primaryLight: "#fcd34d",
163
+ tagBg: "rgba(251, 191, 36, 0.15)",
164
+ shadow: "rgba(245, 158, 11, 0.2)",
165
+ borderHighlight: "rgba(251, 191, 36, 0.2)",
166
+ glassBorder: "rgba(251, 191, 36, 0.1)"
167
+ }
168
+ },
169
+ cyan: {
170
+ light: {
171
+ primary: "#06b6d4",
172
+ primaryHover: "#0891b2",
173
+ primaryLight: "#22d3ee",
174
+ tagBg: "rgba(6, 182, 212, 0.1)",
175
+ shadow: "rgba(6, 182, 212, 0.15)",
176
+ borderHighlight: "rgba(6, 182, 212, 0.2)",
177
+ glassBorder: "rgba(6, 182, 212, 0.1)"
178
+ },
179
+ dark: {
180
+ primary: "#22d3ee",
181
+ primaryHover: "#06b6d4",
182
+ primaryLight: "#67e8f9",
183
+ tagBg: "rgba(34, 211, 238, 0.15)",
184
+ shadow: "rgba(6, 182, 212, 0.2)",
185
+ borderHighlight: "rgba(34, 211, 238, 0.2)",
186
+ glassBorder: "rgba(34, 211, 238, 0.1)"
187
+ }
188
+ }
189
+ };
190
+ function getColorConfig(preset, customColor) {
191
+ if (preset === "custom" && customColor) {
192
+ const hex = customColor.replace("#", "");
193
+ const r = parseInt(hex.substring(0, 2), 16);
194
+ const g = parseInt(hex.substring(2, 4), 16);
195
+ const b = parseInt(hex.substring(4, 6), 16);
196
+ const lighterR = Math.min(255, r + 40);
197
+ const lighterG = Math.min(255, g + 40);
198
+ const lighterB = Math.min(255, b + 40);
199
+ const lighter = `#${lighterR.toString(16).padStart(2, "0")}${lighterG.toString(16).padStart(2, "0")}${lighterB.toString(16).padStart(2, "0")}`;
200
+ const darkerR = Math.max(0, r - 20);
201
+ const darkerG = Math.max(0, g - 20);
202
+ const darkerB = Math.max(0, b - 20);
203
+ const darker = `#${darkerR.toString(16).padStart(2, "0")}${darkerG.toString(16).padStart(2, "0")}${darkerB.toString(16).padStart(2, "0")}`;
204
+ return {
205
+ light: {
206
+ primary: customColor,
207
+ primaryHover: darker,
208
+ primaryLight: lighter,
209
+ tagBg: `rgba(${r}, ${g}, ${b}, 0.1)`,
210
+ shadow: `rgba(${r}, ${g}, ${b}, 0.15)`,
211
+ borderHighlight: `rgba(${r}, ${g}, ${b}, 0.2)`,
212
+ glassBorder: `rgba(${r}, ${g}, ${b}, 0.1)`
213
+ },
214
+ dark: {
215
+ primary: lighter,
216
+ primaryHover: customColor,
217
+ primaryLight: lighter,
218
+ tagBg: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.15)`,
219
+ shadow: `rgba(${r}, ${g}, ${b}, 0.2)`,
220
+ borderHighlight: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.2)`,
221
+ glassBorder: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.1)`
222
+ }
223
+ };
224
+ }
225
+ return colorPresets[preset] || colorPresets.violet;
226
+ }
227
+ function applyThemeColors(preset, customColor, isDark = false) {
228
+ const config = getColorConfig(preset, customColor);
229
+ const colors = isDark ? config.dark : config.light;
230
+ document.documentElement.style.setProperty("--primary", colors.primary);
231
+ document.documentElement.style.setProperty("--primary-hover", colors.primaryHover);
232
+ document.documentElement.style.setProperty("--primary-light", colors.primaryLight);
233
+ document.documentElement.style.setProperty("--tag-bg", colors.tagBg);
234
+ document.documentElement.style.setProperty("--shadow", colors.shadow);
235
+ document.documentElement.style.setProperty("--border-highlight", colors.borderHighlight);
236
+ document.documentElement.style.setProperty("--glass-border", colors.glassBorder);
237
+ }
238
+
239
+ // src/lib/fonts.ts
240
+ var fontPresets = {
241
+ "inter": {
242
+ family: "Inter",
243
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
244
+ },
245
+ "roboto": {
246
+ family: "Roboto",
247
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
248
+ },
249
+ "open-sans": {
250
+ family: "Open Sans",
251
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
252
+ },
253
+ "lato": {
254
+ family: "Lato",
255
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
256
+ },
257
+ "poppins": {
258
+ family: "Poppins",
259
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
260
+ },
261
+ "montserrat": {
262
+ family: "Montserrat",
263
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
264
+ },
265
+ "playfair-display": {
266
+ family: "Playfair Display",
267
+ fallback: "Georgia, 'Times New Roman', serif"
268
+ },
269
+ "source-sans-pro": {
270
+ family: "Source Sans 3",
271
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
272
+ },
273
+ "merriweather": {
274
+ family: "Merriweather",
275
+ fallback: "Georgia, 'Times New Roman', serif"
276
+ }
277
+ };
278
+ function getFontFamily(preset) {
279
+ const config = fontPresets[preset] || fontPresets["inter"];
280
+ return `'${config.family}', ${config.fallback}`;
281
+ }
282
+ function applyFonts(headingFont, bodyFont) {
283
+ const heading = headingFont || "inter";
284
+ const body = bodyFont || "inter";
285
+ document.documentElement.style.setProperty("--font-heading", getFontFamily(heading));
286
+ document.documentElement.style.setProperty("--font-body", getFontFamily(body));
287
+ }
288
+
289
+ // src/context/SiteSettingsContext.tsx
290
+ var import_jsx_runtime2 = require("react/jsx-runtime");
291
+ var SiteSettingsContext = (0, import_react2.createContext)({
292
+ settings: null,
293
+ profile: null
294
+ });
295
+ function SiteSettingsProvider({
296
+ children,
297
+ settings,
298
+ profile
299
+ }) {
300
+ const { theme } = useTheme();
301
+ (0, import_react2.useEffect)(() => {
302
+ if (settings?.themeColor) {
303
+ applyThemeColors(
304
+ settings.themeColor.preset,
305
+ settings.themeColor.customColor,
306
+ theme === "dark"
307
+ );
308
+ }
309
+ }, [settings, theme]);
310
+ (0, import_react2.useEffect)(() => {
311
+ applyFonts(
312
+ settings?.fontFamily?.heading,
313
+ settings?.fontFamily?.body
314
+ );
315
+ }, [settings]);
316
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SiteSettingsContext.Provider, { value: { settings, profile }, children });
317
+ }
318
+
319
+ // src/layouts/RootLayout.tsx
320
+ var import_jsx_runtime3 = require("react/jsx-runtime");
321
+ function RootLayout({
322
+ children,
323
+ settings = null,
324
+ profile = null
325
+ }) {
326
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ThemeProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SiteSettingsProvider, { settings, profile, children }) });
327
+ }
328
+ // Annotate the CommonJS export names for ESM import in node:
329
+ 0 && (module.exports = {
330
+ RootLayout
331
+ });
@@ -0,0 +1,304 @@
1
+ // src/context/ThemeContext.tsx
2
+ import { createContext, useContext, useEffect, useState } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ var ThemeContext = createContext({
5
+ theme: "dark",
6
+ toggleTheme: () => {
7
+ },
8
+ mounted: false
9
+ });
10
+ function ThemeProvider({ children }) {
11
+ const [theme, setTheme] = useState("dark");
12
+ const [mounted, setMounted] = useState(false);
13
+ useEffect(() => {
14
+ setMounted(true);
15
+ const stored = localStorage.getItem("theme");
16
+ if (stored) {
17
+ setTheme(stored);
18
+ } else if (window.matchMedia("(prefers-color-scheme: light)").matches) {
19
+ setTheme("light");
20
+ }
21
+ }, []);
22
+ useEffect(() => {
23
+ if (mounted) {
24
+ document.documentElement.setAttribute("data-theme", theme);
25
+ localStorage.setItem("theme", theme);
26
+ }
27
+ }, [theme, mounted]);
28
+ const toggleTheme = () => {
29
+ setTheme((prev) => prev === "dark" ? "light" : "dark");
30
+ };
31
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { theme, toggleTheme, mounted }, children: /* @__PURE__ */ jsx("div", { "data-theme": theme, children }) });
32
+ }
33
+ function useTheme() {
34
+ const context = useContext(ThemeContext);
35
+ return context;
36
+ }
37
+
38
+ // src/context/SiteSettingsContext.tsx
39
+ import { createContext as createContext2, useContext as useContext2, useEffect as useEffect2 } from "react";
40
+
41
+ // src/lib/themeColors.ts
42
+ var colorPresets = {
43
+ violet: {
44
+ light: {
45
+ primary: "#8b5cf6",
46
+ primaryHover: "#7c3aed",
47
+ primaryLight: "#a78bfa",
48
+ tagBg: "rgba(139, 92, 246, 0.1)",
49
+ shadow: "rgba(139, 92, 246, 0.15)",
50
+ borderHighlight: "rgba(139, 92, 246, 0.2)",
51
+ glassBorder: "rgba(139, 92, 246, 0.1)"
52
+ },
53
+ dark: {
54
+ primary: "#a78bfa",
55
+ primaryHover: "#8b5cf6",
56
+ primaryLight: "#c4b5fd",
57
+ tagBg: "rgba(167, 139, 250, 0.15)",
58
+ shadow: "rgba(139, 92, 246, 0.2)",
59
+ borderHighlight: "rgba(167, 139, 250, 0.2)",
60
+ glassBorder: "rgba(167, 139, 250, 0.1)"
61
+ }
62
+ },
63
+ blue: {
64
+ light: {
65
+ primary: "#3b82f6",
66
+ primaryHover: "#2563eb",
67
+ primaryLight: "#60a5fa",
68
+ tagBg: "rgba(59, 130, 246, 0.1)",
69
+ shadow: "rgba(59, 130, 246, 0.15)",
70
+ borderHighlight: "rgba(59, 130, 246, 0.2)",
71
+ glassBorder: "rgba(59, 130, 246, 0.1)"
72
+ },
73
+ dark: {
74
+ primary: "#60a5fa",
75
+ primaryHover: "#3b82f6",
76
+ primaryLight: "#93c5fd",
77
+ tagBg: "rgba(96, 165, 250, 0.15)",
78
+ shadow: "rgba(59, 130, 246, 0.2)",
79
+ borderHighlight: "rgba(96, 165, 250, 0.2)",
80
+ glassBorder: "rgba(96, 165, 250, 0.1)"
81
+ }
82
+ },
83
+ emerald: {
84
+ light: {
85
+ primary: "#10b981",
86
+ primaryHover: "#059669",
87
+ primaryLight: "#34d399",
88
+ tagBg: "rgba(16, 185, 129, 0.1)",
89
+ shadow: "rgba(16, 185, 129, 0.15)",
90
+ borderHighlight: "rgba(16, 185, 129, 0.2)",
91
+ glassBorder: "rgba(16, 185, 129, 0.1)"
92
+ },
93
+ dark: {
94
+ primary: "#34d399",
95
+ primaryHover: "#10b981",
96
+ primaryLight: "#6ee7b7",
97
+ tagBg: "rgba(52, 211, 153, 0.15)",
98
+ shadow: "rgba(16, 185, 129, 0.2)",
99
+ borderHighlight: "rgba(52, 211, 153, 0.2)",
100
+ glassBorder: "rgba(52, 211, 153, 0.1)"
101
+ }
102
+ },
103
+ rose: {
104
+ light: {
105
+ primary: "#f43f5e",
106
+ primaryHover: "#e11d48",
107
+ primaryLight: "#fb7185",
108
+ tagBg: "rgba(244, 63, 94, 0.1)",
109
+ shadow: "rgba(244, 63, 94, 0.15)",
110
+ borderHighlight: "rgba(244, 63, 94, 0.2)",
111
+ glassBorder: "rgba(244, 63, 94, 0.1)"
112
+ },
113
+ dark: {
114
+ primary: "#fb7185",
115
+ primaryHover: "#f43f5e",
116
+ primaryLight: "#fda4af",
117
+ tagBg: "rgba(251, 113, 133, 0.15)",
118
+ shadow: "rgba(244, 63, 94, 0.2)",
119
+ borderHighlight: "rgba(251, 113, 133, 0.2)",
120
+ glassBorder: "rgba(251, 113, 133, 0.1)"
121
+ }
122
+ },
123
+ amber: {
124
+ light: {
125
+ primary: "#f59e0b",
126
+ primaryHover: "#d97706",
127
+ primaryLight: "#fbbf24",
128
+ tagBg: "rgba(245, 158, 11, 0.1)",
129
+ shadow: "rgba(245, 158, 11, 0.15)",
130
+ borderHighlight: "rgba(245, 158, 11, 0.2)",
131
+ glassBorder: "rgba(245, 158, 11, 0.1)"
132
+ },
133
+ dark: {
134
+ primary: "#fbbf24",
135
+ primaryHover: "#f59e0b",
136
+ primaryLight: "#fcd34d",
137
+ tagBg: "rgba(251, 191, 36, 0.15)",
138
+ shadow: "rgba(245, 158, 11, 0.2)",
139
+ borderHighlight: "rgba(251, 191, 36, 0.2)",
140
+ glassBorder: "rgba(251, 191, 36, 0.1)"
141
+ }
142
+ },
143
+ cyan: {
144
+ light: {
145
+ primary: "#06b6d4",
146
+ primaryHover: "#0891b2",
147
+ primaryLight: "#22d3ee",
148
+ tagBg: "rgba(6, 182, 212, 0.1)",
149
+ shadow: "rgba(6, 182, 212, 0.15)",
150
+ borderHighlight: "rgba(6, 182, 212, 0.2)",
151
+ glassBorder: "rgba(6, 182, 212, 0.1)"
152
+ },
153
+ dark: {
154
+ primary: "#22d3ee",
155
+ primaryHover: "#06b6d4",
156
+ primaryLight: "#67e8f9",
157
+ tagBg: "rgba(34, 211, 238, 0.15)",
158
+ shadow: "rgba(6, 182, 212, 0.2)",
159
+ borderHighlight: "rgba(34, 211, 238, 0.2)",
160
+ glassBorder: "rgba(34, 211, 238, 0.1)"
161
+ }
162
+ }
163
+ };
164
+ function getColorConfig(preset, customColor) {
165
+ if (preset === "custom" && customColor) {
166
+ const hex = customColor.replace("#", "");
167
+ const r = parseInt(hex.substring(0, 2), 16);
168
+ const g = parseInt(hex.substring(2, 4), 16);
169
+ const b = parseInt(hex.substring(4, 6), 16);
170
+ const lighterR = Math.min(255, r + 40);
171
+ const lighterG = Math.min(255, g + 40);
172
+ const lighterB = Math.min(255, b + 40);
173
+ const lighter = `#${lighterR.toString(16).padStart(2, "0")}${lighterG.toString(16).padStart(2, "0")}${lighterB.toString(16).padStart(2, "0")}`;
174
+ const darkerR = Math.max(0, r - 20);
175
+ const darkerG = Math.max(0, g - 20);
176
+ const darkerB = Math.max(0, b - 20);
177
+ const darker = `#${darkerR.toString(16).padStart(2, "0")}${darkerG.toString(16).padStart(2, "0")}${darkerB.toString(16).padStart(2, "0")}`;
178
+ return {
179
+ light: {
180
+ primary: customColor,
181
+ primaryHover: darker,
182
+ primaryLight: lighter,
183
+ tagBg: `rgba(${r}, ${g}, ${b}, 0.1)`,
184
+ shadow: `rgba(${r}, ${g}, ${b}, 0.15)`,
185
+ borderHighlight: `rgba(${r}, ${g}, ${b}, 0.2)`,
186
+ glassBorder: `rgba(${r}, ${g}, ${b}, 0.1)`
187
+ },
188
+ dark: {
189
+ primary: lighter,
190
+ primaryHover: customColor,
191
+ primaryLight: lighter,
192
+ tagBg: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.15)`,
193
+ shadow: `rgba(${r}, ${g}, ${b}, 0.2)`,
194
+ borderHighlight: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.2)`,
195
+ glassBorder: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.1)`
196
+ }
197
+ };
198
+ }
199
+ return colorPresets[preset] || colorPresets.violet;
200
+ }
201
+ function applyThemeColors(preset, customColor, isDark = false) {
202
+ const config = getColorConfig(preset, customColor);
203
+ const colors = isDark ? config.dark : config.light;
204
+ document.documentElement.style.setProperty("--primary", colors.primary);
205
+ document.documentElement.style.setProperty("--primary-hover", colors.primaryHover);
206
+ document.documentElement.style.setProperty("--primary-light", colors.primaryLight);
207
+ document.documentElement.style.setProperty("--tag-bg", colors.tagBg);
208
+ document.documentElement.style.setProperty("--shadow", colors.shadow);
209
+ document.documentElement.style.setProperty("--border-highlight", colors.borderHighlight);
210
+ document.documentElement.style.setProperty("--glass-border", colors.glassBorder);
211
+ }
212
+
213
+ // src/lib/fonts.ts
214
+ var fontPresets = {
215
+ "inter": {
216
+ family: "Inter",
217
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
218
+ },
219
+ "roboto": {
220
+ family: "Roboto",
221
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
222
+ },
223
+ "open-sans": {
224
+ family: "Open Sans",
225
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
226
+ },
227
+ "lato": {
228
+ family: "Lato",
229
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
230
+ },
231
+ "poppins": {
232
+ family: "Poppins",
233
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
234
+ },
235
+ "montserrat": {
236
+ family: "Montserrat",
237
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
238
+ },
239
+ "playfair-display": {
240
+ family: "Playfair Display",
241
+ fallback: "Georgia, 'Times New Roman', serif"
242
+ },
243
+ "source-sans-pro": {
244
+ family: "Source Sans 3",
245
+ fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
246
+ },
247
+ "merriweather": {
248
+ family: "Merriweather",
249
+ fallback: "Georgia, 'Times New Roman', serif"
250
+ }
251
+ };
252
+ function getFontFamily(preset) {
253
+ const config = fontPresets[preset] || fontPresets["inter"];
254
+ return `'${config.family}', ${config.fallback}`;
255
+ }
256
+ function applyFonts(headingFont, bodyFont) {
257
+ const heading = headingFont || "inter";
258
+ const body = bodyFont || "inter";
259
+ document.documentElement.style.setProperty("--font-heading", getFontFamily(heading));
260
+ document.documentElement.style.setProperty("--font-body", getFontFamily(body));
261
+ }
262
+
263
+ // src/context/SiteSettingsContext.tsx
264
+ import { jsx as jsx2 } from "react/jsx-runtime";
265
+ var SiteSettingsContext = createContext2({
266
+ settings: null,
267
+ profile: null
268
+ });
269
+ function SiteSettingsProvider({
270
+ children,
271
+ settings,
272
+ profile
273
+ }) {
274
+ const { theme } = useTheme();
275
+ useEffect2(() => {
276
+ if (settings?.themeColor) {
277
+ applyThemeColors(
278
+ settings.themeColor.preset,
279
+ settings.themeColor.customColor,
280
+ theme === "dark"
281
+ );
282
+ }
283
+ }, [settings, theme]);
284
+ useEffect2(() => {
285
+ applyFonts(
286
+ settings?.fontFamily?.heading,
287
+ settings?.fontFamily?.body
288
+ );
289
+ }, [settings]);
290
+ return /* @__PURE__ */ jsx2(SiteSettingsContext.Provider, { value: { settings, profile }, children });
291
+ }
292
+
293
+ // src/layouts/RootLayout.tsx
294
+ import { jsx as jsx3 } from "react/jsx-runtime";
295
+ function RootLayout({
296
+ children,
297
+ settings = null,
298
+ profile = null
299
+ }) {
300
+ return /* @__PURE__ */ jsx3(ThemeProvider, { children: /* @__PURE__ */ jsx3(SiteSettingsProvider, { settings, profile, children }) });
301
+ }
302
+ export {
303
+ RootLayout
304
+ };