@begryp/blog-automation-admin 0.0.0-stage → 0.1.1

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.
Files changed (90) hide show
  1. package/dist/adapters/env-key-vault.d.ts +12 -0
  2. package/dist/adapters/env-key-vault.d.ts.map +1 -0
  3. package/dist/adapters/env-key-vault.js +46 -0
  4. package/dist/adapters/env-key-vault.js.map +1 -0
  5. package/dist/adapters/html.d.ts +18 -0
  6. package/dist/adapters/html.d.ts.map +1 -0
  7. package/dist/adapters/html.js +130 -0
  8. package/dist/adapters/html.js.map +1 -0
  9. package/dist/adapters/index.d.ts +5 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +5 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/supabase-publisher.d.ts +30 -0
  14. package/dist/adapters/supabase-publisher.d.ts.map +1 -0
  15. package/dist/adapters/supabase-publisher.js +120 -0
  16. package/dist/adapters/supabase-publisher.js.map +1 -0
  17. package/dist/adapters/supabase-run-store.d.ts +15 -0
  18. package/dist/adapters/supabase-run-store.d.ts.map +1 -0
  19. package/dist/adapters/supabase-run-store.js +92 -0
  20. package/dist/adapters/supabase-run-store.js.map +1 -0
  21. package/dist/automation/index.d.ts +3 -0
  22. package/dist/automation/index.d.ts.map +1 -0
  23. package/dist/automation/index.js +3 -0
  24. package/dist/automation/index.js.map +1 -0
  25. package/dist/automation/runner.d.ts +45 -0
  26. package/dist/automation/runner.d.ts.map +1 -0
  27. package/dist/automation/runner.js +195 -0
  28. package/dist/automation/runner.js.map +1 -0
  29. package/dist/automation/types.d.ts +41 -0
  30. package/dist/automation/types.d.ts.map +1 -0
  31. package/dist/automation/types.js +12 -0
  32. package/dist/automation/types.js.map +1 -0
  33. package/dist/components/AutoGenerateBlogModal.d.ts +18 -0
  34. package/dist/components/AutoGenerateBlogModal.d.ts.map +1 -0
  35. package/dist/components/AutoGenerateBlogModal.js +99 -0
  36. package/dist/components/AutoGenerateBlogModal.js.map +1 -0
  37. package/dist/components/RichText.d.ts +9 -0
  38. package/dist/components/RichText.d.ts.map +1 -0
  39. package/dist/components/RichText.js +56 -0
  40. package/dist/components/RichText.js.map +1 -0
  41. package/dist/components/Shell.d.ts +18 -0
  42. package/dist/components/Shell.d.ts.map +1 -0
  43. package/dist/components/Shell.js +35 -0
  44. package/dist/components/Shell.js.map +1 -0
  45. package/dist/components/index.d.ts +4 -0
  46. package/dist/components/index.d.ts.map +1 -0
  47. package/dist/components/index.js +4 -0
  48. package/dist/components/index.js.map +1 -0
  49. package/dist/entities/index.d.ts +5 -0
  50. package/dist/entities/index.d.ts.map +1 -0
  51. package/dist/entities/index.js +5 -0
  52. package/dist/entities/index.js.map +1 -0
  53. package/dist/entities/registry.d.ts +10 -0
  54. package/dist/entities/registry.d.ts.map +1 -0
  55. package/dist/entities/registry.js +43 -0
  56. package/dist/entities/registry.js.map +1 -0
  57. package/dist/entities/schemas/blogs.d.ts +3 -0
  58. package/dist/entities/schemas/blogs.d.ts.map +1 -0
  59. package/dist/entities/schemas/blogs.js +110 -0
  60. package/dist/entities/schemas/blogs.js.map +1 -0
  61. package/dist/entities/schemas/enquiries.d.ts +3 -0
  62. package/dist/entities/schemas/enquiries.d.ts.map +1 -0
  63. package/dist/entities/schemas/enquiries.js +67 -0
  64. package/dist/entities/schemas/enquiries.js.map +1 -0
  65. package/dist/entities/types.d.ts +38 -0
  66. package/dist/entities/types.d.ts.map +1 -0
  67. package/dist/entities/types.js +2 -0
  68. package/dist/entities/types.js.map +1 -0
  69. package/dist/index.d.ts +10 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +10 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/theme/defaultTheme.d.ts +3 -0
  74. package/dist/theme/defaultTheme.d.ts.map +1 -0
  75. package/dist/theme/defaultTheme.js +22 -0
  76. package/dist/theme/defaultTheme.js.map +1 -0
  77. package/dist/theme/index.d.ts +4 -0
  78. package/dist/theme/index.d.ts.map +1 -0
  79. package/dist/theme/index.js +4 -0
  80. package/dist/theme/index.js.map +1 -0
  81. package/dist/theme/inject.d.ts +10 -0
  82. package/dist/theme/inject.d.ts.map +1 -0
  83. package/dist/theme/inject.js +46 -0
  84. package/dist/theme/inject.js.map +1 -0
  85. package/dist/theme/types.d.ts +30 -0
  86. package/dist/theme/types.d.ts.map +1 -0
  87. package/dist/theme/types.js +2 -0
  88. package/dist/theme/types.js.map +1 -0
  89. package/package.json +72 -4
  90. package/README.md +0 -3
@@ -0,0 +1,195 @@
1
+ import { createEngineFromSettings, createLLMClientFromTenant, LLMDrafter } from "@begryp/blog-automation-core";
2
+ import { DRAFT_PROMPT_VERSION } from "@begryp/blog-automation-prompts";
3
+ import { EnvKeyVault } from "../adapters/env-key-vault.js";
4
+ import { SupabasePublisher } from "../adapters/supabase-publisher.js";
5
+ import { SupabaseRunStore } from "../adapters/supabase-run-store.js";
6
+ import { buildFullHtml, calculateReadingTime } from "../adapters/html.js";
7
+ const DAY_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
8
+ /**
9
+ * Normalizes time string (e.g. "09:00 AM" or "14:30") into 24-hour hours and minutes.
10
+ */
11
+ export function parsePublishTime(timeStr) {
12
+ if (!timeStr)
13
+ return { hours: 9, minutes: 0 };
14
+ const match = timeStr.trim().match(/^(\d{1,2}):(\d{2})(?:\s*(AM|PM))?$/i);
15
+ if (!match)
16
+ return { hours: 9, minutes: 0 };
17
+ let h = parseInt(match[1] || "9", 10);
18
+ const m = parseInt(match[2] || "0", 10);
19
+ const meridiem = match[3]?.toUpperCase();
20
+ if (meridiem === "PM" && h < 12)
21
+ h += 12;
22
+ if (meridiem === "AM" && h === 12)
23
+ h = 0;
24
+ return { hours: h, minutes: m };
25
+ }
26
+ /**
27
+ * Returns current date/time components localized to Africa/Nairobi (EAT, UTC+3).
28
+ */
29
+ export function getNairobiDateTime(now = new Date()) {
30
+ const formatter = new Intl.DateTimeFormat("en-US", {
31
+ timeZone: "Africa/Nairobi",
32
+ year: "numeric",
33
+ month: "2-digit",
34
+ day: "2-digit",
35
+ hour: "2-digit",
36
+ minute: "2-digit",
37
+ hour12: false
38
+ });
39
+ const parts = formatter.formatToParts(now);
40
+ const map = {};
41
+ for (const p of parts)
42
+ map[p.type] = p.value;
43
+ const year = map.year || "2026";
44
+ const month = map.month || "01";
45
+ const day = map.day || "01";
46
+ const hour = parseInt(map.hour || "0", 10);
47
+ const minute = parseInt(map.minute || "0", 10);
48
+ const localIsoDate = `${year}-${month}-${day}`;
49
+ const dayIndex = new Date(`${localIsoDate}T12:00:00Z`).getUTCDay();
50
+ const isoDay = dayIndex === 0 ? 7 : dayIndex; // 1 = Monday .. 7 = Sunday
51
+ return {
52
+ year,
53
+ month,
54
+ day,
55
+ hour,
56
+ minute,
57
+ isoDay,
58
+ dayName: DAY_NAMES[dayIndex] || "Monday",
59
+ localIsoDate
60
+ };
61
+ }
62
+ /**
63
+ * Evaluates whether automation cycle should run right now under Nairobi EAT schedule.
64
+ */
65
+ export function isScheduleDue(settings, now = new Date()) {
66
+ if (!settings.enabled) {
67
+ return { due: false, reason: "Automation is switched off in settings." };
68
+ }
69
+ const nairobi = getNairobiDateTime(now);
70
+ const activeDays = settings.publishDays || [];
71
+ if (!activeDays.includes(nairobi.isoDay)) {
72
+ return {
73
+ due: false,
74
+ reason: `Today (${nairobi.dayName}) is not an active publishing day.`
75
+ };
76
+ }
77
+ const { hours: targetH, minutes: targetM } = parsePublishTime(settings.publishTime);
78
+ const nowMinutes = nairobi.hour * 60 + nairobi.minute;
79
+ const targetMinutes = targetH * 60 + targetM;
80
+ // Window: from target time up to 120 minutes past
81
+ if (nowMinutes < targetMinutes) {
82
+ return {
83
+ due: false,
84
+ reason: `Scheduled time is ${settings.publishTime} EAT. Current Nairobi time is ${String(nairobi.hour).padStart(2, "0")}:${String(nairobi.minute).padStart(2, "0")} EAT.`
85
+ };
86
+ }
87
+ if (nowMinutes > targetMinutes + 120) {
88
+ return {
89
+ due: false,
90
+ reason: `Window for ${settings.publishTime} EAT has passed.`
91
+ };
92
+ }
93
+ return { due: true, reason: "Schedule matches active publishing window." };
94
+ }
95
+ /**
96
+ * Instantly generates a complete blog draft from a given title and category.
97
+ */
98
+ export async function generateInstantDraft(options) {
99
+ const { topicTitle, category, tenant } = options;
100
+ const title = topicTitle.trim();
101
+ if (title.length < 3) {
102
+ throw new Error("Topic title must be at least 3 characters.");
103
+ }
104
+ const keyVault = new EnvKeyVault();
105
+ const apiKey = options.apiKey ||
106
+ (tenant.llm.keyRef
107
+ ? await keyVault.resolveKey(tenant.llm.keyRef)
108
+ : await keyVault.resolveKeyForProvider(tenant.llm.provider));
109
+ if (!apiKey) {
110
+ throw new Error(`No AI API key found for provider ${tenant.llm.provider}.`);
111
+ }
112
+ const llm = createLLMClientFromTenant({
113
+ provider: tenant.llm.provider,
114
+ apiKey,
115
+ model: tenant.llm.model
116
+ });
117
+ const drafter = new LLMDrafter({ llm });
118
+ const catalog = options.publisher ? await options.publisher.getCatalog(tenant.tenantId) : [];
119
+ const topic = {
120
+ schemaVersion: 1,
121
+ id: `manual-${Date.now()}`,
122
+ tenantId: tenant.tenantId,
123
+ title,
124
+ primaryKeyword: title,
125
+ secondaryKeywords: [],
126
+ intent: "informational",
127
+ source: "provided",
128
+ status: "queued"
129
+ };
130
+ const draft = await drafter.draft(topic, tenant, DRAFT_PROMPT_VERSION, catalog);
131
+ const fullHtml = buildFullHtml(draft);
132
+ const readingTime = calculateReadingTime(draft);
133
+ return {
134
+ title: draft.title,
135
+ summary: draft.summary,
136
+ content: fullHtml,
137
+ category: draft.category || category || tenant.topics.categories[0] || "General",
138
+ reading_time_minutes: readingTime,
139
+ slug: draft.slug,
140
+ meta_title: draft.metaTitle,
141
+ meta_description: draft.metaDescription,
142
+ tags: draft.tags,
143
+ content_json: {
144
+ schemaVersion: draft.schemaVersion,
145
+ sections: draft.sections,
146
+ faq: draft.faq,
147
+ sources: draft.sources,
148
+ internalLinks: draft.internalLinks,
149
+ imageBriefs: draft.imageBriefs,
150
+ metaTitle: draft.metaTitle,
151
+ metaDescription: draft.metaDescription,
152
+ lastReviewed: draft.lastReviewed
153
+ }
154
+ };
155
+ }
156
+ /**
157
+ * Runs a full autonomous cycle with research, deduplication, drafting, and Supabase publishing.
158
+ */
159
+ export async function runAutonomousCycle(options) {
160
+ const { supabaseClient, tenant, settings, force } = options;
161
+ if (settings && !force) {
162
+ const check = isScheduleDue(settings);
163
+ if (!check.due) {
164
+ return { ok: true, skipped: true, reason: check.reason };
165
+ }
166
+ }
167
+ const publisher = new SupabasePublisher({ client: supabaseClient });
168
+ const runStore = new SupabaseRunStore({ client: supabaseClient });
169
+ const keyVault = new EnvKeyVault();
170
+ try {
171
+ const apiKey = (tenant.llm.keyRef
172
+ ? await keyVault.resolveKey(tenant.llm.keyRef)
173
+ : await keyVault.resolveKeyForProvider(tenant.llm.provider)) || "";
174
+ const engine = createEngineFromSettings({
175
+ tenant,
176
+ apiKey,
177
+ publisher,
178
+ runStore,
179
+ keyVault
180
+ });
181
+ const run = await engine.runPipeline(tenant);
182
+ return {
183
+ ok: run.status === "completed",
184
+ run,
185
+ postId: run.postRef
186
+ };
187
+ }
188
+ catch (err) {
189
+ return {
190
+ ok: false,
191
+ error: err.message || "Failed to execute autonomous blog cycle."
192
+ };
193
+ }
194
+ }
195
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/automation/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Run, TenantProfile } from "@begryp/blog-automation-core";
2
+ export interface BlogAutomationSettings {
3
+ enabled: boolean;
4
+ postsPerWeek: number;
5
+ publishDays: number[];
6
+ publishTime: string;
7
+ categories: string[];
8
+ targetWordCount: number;
9
+ targetGeography: string;
10
+ provider?: "openai" | "anthropic" | "gemini";
11
+ model?: string;
12
+ lastRunAt?: string;
13
+ }
14
+ export declare const defaultBlogAutomationSettings: BlogAutomationSettings;
15
+ export interface RunBlogAutomationOptions {
16
+ supabaseClient: any | (() => any);
17
+ tenant: TenantProfile;
18
+ settings?: BlogAutomationSettings;
19
+ force?: boolean;
20
+ }
21
+ export interface RunBlogAutomationResult {
22
+ ok: boolean;
23
+ skipped?: boolean;
24
+ reason?: string;
25
+ run?: Run;
26
+ error?: string;
27
+ postId?: string;
28
+ }
29
+ export interface GeneratedBlogDraft {
30
+ title: string;
31
+ summary: string;
32
+ content: string;
33
+ category: string;
34
+ reading_time_minutes: number;
35
+ slug: string;
36
+ meta_title?: string;
37
+ meta_description?: string;
38
+ tags?: string[];
39
+ content_json?: Record<string, unknown>;
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/automation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAU3C,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC"}
@@ -0,0 +1,12 @@
1
+ export const defaultBlogAutomationSettings = {
2
+ enabled: true,
3
+ postsPerWeek: 3,
4
+ publishDays: [1, 3, 5], // Mon, Wed, Fri
5
+ publishTime: "09:00 AM",
6
+ categories: ["General", "Guides", "Insights"],
7
+ targetWordCount: 1200,
8
+ targetGeography: "Kenya, East Africa",
9
+ provider: "openai",
10
+ model: "gpt-4o-mini"
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/automation/types.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,6BAA6B,GAA2B;IACnE,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB;IACxC,WAAW,EAAE,UAAU;IACvB,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC7C,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,oBAAoB;IACrC,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,aAAa;CACrB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { BlogAutomationSettings } from "../automation/types.js";
2
+ export interface AutoGenerateBlogModalProps {
3
+ initialSettings?: BlogAutomationSettings;
4
+ availableCategories?: string[];
5
+ onSaveSettings: (settings: BlogAutomationSettings) => Promise<{
6
+ ok: boolean;
7
+ error?: string;
8
+ }>;
9
+ onRunCycleNow: () => Promise<{
10
+ ok: boolean;
11
+ error?: string;
12
+ postId?: string;
13
+ skipped?: boolean;
14
+ reason?: string;
15
+ }>;
16
+ }
17
+ export declare function AutoGenerateBlogModal({ initialSettings, availableCategories, onSaveSettings, onRunCycleNow }: AutoGenerateBlogModalProps): import("react").JSX.Element;
18
+ //# sourceMappingURL=AutoGenerateBlogModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoGenerateBlogModal.d.ts","sourceRoot":"","sources":["../../src/components/AutoGenerateBlogModal.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAarE,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,aAAa,EAAE,MAAM,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpH;AAED,wBAAgB,qBAAqB,CAAC,EACpC,eAAe,EACf,mBAA0F,EAC1F,cAAc,EACd,aAAa,EACd,EAAE,0BAA0B,+BAkT5B"}
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useTransition, useEffect } from "react";
4
+ import { Sparkles, Loader2, X, CheckCircle2, AlertCircle, Calendar, Clock, Zap, Settings2 } from "lucide-react";
5
+ import { defaultBlogAutomationSettings } from "../automation/types.js";
6
+ const DAYS_OF_WEEK = [
7
+ { day: 1, label: "Mon" },
8
+ { day: 2, label: "Tue" },
9
+ { day: 3, label: "Wed" },
10
+ { day: 4, label: "Thu" },
11
+ { day: 5, label: "Fri" },
12
+ { day: 6, label: "Sat" },
13
+ { day: 7, label: "Sun" }
14
+ ];
15
+ export function AutoGenerateBlogModal({ initialSettings, availableCategories = ["General", "Guides", "Insights", "Industry Trends", "Case Studies"], onSaveSettings, onRunCycleNow }) {
16
+ const [open, setOpen] = useState(false);
17
+ const [settings, setSettings] = useState(initialSettings || defaultBlogAutomationSettings);
18
+ const [error, setError] = useState(null);
19
+ const [success, setSuccess] = useState(null);
20
+ const [statusText, setStatusText] = useState("");
21
+ const [isPending, startTransition] = useTransition();
22
+ const [isGenerating, setIsGenerating] = useState(false);
23
+ useEffect(() => {
24
+ if (initialSettings) {
25
+ setSettings(initialSettings);
26
+ }
27
+ }, [initialSettings]);
28
+ function toggleDay(dayNum) {
29
+ const current = settings.publishDays || [];
30
+ const next = current.includes(dayNum)
31
+ ? current.filter((d) => d !== dayNum)
32
+ : [...current, dayNum].sort((a, b) => a - b);
33
+ const finalDays = next.length ? next : [dayNum];
34
+ setSettings({
35
+ ...settings,
36
+ publishDays: finalDays,
37
+ postsPerWeek: finalDays.length
38
+ });
39
+ }
40
+ function toggleCategory(cat) {
41
+ const current = settings.categories || [];
42
+ const next = current.includes(cat)
43
+ ? current.filter((c) => c !== cat)
44
+ : [...current, cat];
45
+ setSettings({ ...settings, categories: next.length ? next : [cat] });
46
+ }
47
+ function handleSave() {
48
+ setError(null);
49
+ setSuccess(null);
50
+ startTransition(async () => {
51
+ const res = await onSaveSettings(settings);
52
+ if (!res.ok) {
53
+ setError(res.error || "Failed to save settings.");
54
+ }
55
+ else {
56
+ setSuccess("Automation settings saved successfully.");
57
+ setTimeout(() => setSuccess(null), 3000);
58
+ }
59
+ });
60
+ }
61
+ async function handleRunNow() {
62
+ setError(null);
63
+ setSuccess(null);
64
+ setIsGenerating(true);
65
+ setStatusText("Autonomous engine executing: topic selection, research, drafting & QA...");
66
+ try {
67
+ const res = await onRunCycleNow();
68
+ if (!res.ok) {
69
+ setError(res.error || "Generation cycle encountered an error.");
70
+ }
71
+ else if (res.skipped) {
72
+ setStatusText("");
73
+ setSuccess(`Cycle skipped: ${res.reason}`);
74
+ }
75
+ else {
76
+ setSuccess("Success! A new draft has been drafted and saved to your review queue.");
77
+ }
78
+ }
79
+ catch (err) {
80
+ setError(err?.message || "An unexpected error occurred during execution.");
81
+ }
82
+ finally {
83
+ setIsGenerating(false);
84
+ setStatusText("");
85
+ }
86
+ }
87
+ return (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => setOpen(true), className: "inline-flex items-center gap-2 rounded-lg bg-[var(--admin-primary,#2563eb)] px-3.5 py-2 text-sm font-medium text-white shadow-sm transition hover:opacity-95", children: [_jsx(Sparkles, { className: "size-4" }), _jsx("span", { children: "Automation Settings" })] }), open && (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-slate-900/60 p-4 backdrop-blur-sm", role: "dialog", "aria-modal": "true", children: _jsxs("div", { className: "relative w-full max-w-2xl rounded-2xl bg-white p-6 shadow-2xl transition-all max-h-[90vh] overflow-y-auto", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-slate-100 pb-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "grid size-10 place-items-center rounded-xl bg-[var(--admin-primary,#2563eb)]/10 text-[var(--admin-primary,#2563eb)]", children: _jsx(Sparkles, { className: "size-5" }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold text-slate-900", children: "AI Blog Automation Engine" }), _jsx("p", { className: "text-xs text-slate-500", children: "Autonomous scheduling, drafting, and quality assurance" })] })] }), _jsx("button", { type: "button", onClick: () => setOpen(false), className: "grid size-8 place-items-center rounded-lg text-slate-400 hover:bg-slate-100 hover:text-slate-600", children: _jsx(X, { className: "size-5" }) })] }), error && (_jsxs("div", { className: "mt-4 flex items-center gap-2 rounded-xl bg-red-50 p-3 text-sm text-red-700", children: [_jsx(AlertCircle, { className: "size-4 shrink-0" }), _jsx("span", { children: error })] })), success && (_jsxs("div", { className: "mt-4 flex items-center gap-2 rounded-xl bg-emerald-50 p-3 text-sm text-emerald-700", children: [_jsx(CheckCircle2, { className: "size-4 shrink-0" }), _jsx("span", { children: success })] })), _jsxs("div", { className: "mt-5 space-y-6", children: [_jsxs("div", { className: "flex items-center justify-between rounded-xl border border-slate-200 bg-slate-50/50 p-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-sm font-semibold text-slate-900", children: "Automation Engine" }), _jsx("p", { className: "text-xs text-slate-500", children: "When enabled, articles are drafted according to your weekly schedule." })] }), _jsx("button", { type: "button", onClick: () => setSettings({ ...settings, enabled: !settings.enabled }), className: `relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ${settings.enabled ? "bg-[var(--admin-primary,#2563eb)]" : "bg-slate-300"}`, children: _jsx("span", { className: `pointer-events-none inline-block size-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out ${settings.enabled ? "translate-x-5" : "translate-x-0"}` }) })] }), _jsxs("div", { children: [_jsxs("label", { className: "mb-2 flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-slate-600", children: [_jsx(Calendar, { className: "size-4" }), "Publishing Schedule Days"] }), _jsx("div", { className: "grid grid-cols-7 gap-2", children: DAYS_OF_WEEK.map(({ day, label }) => {
88
+ const active = (settings.publishDays || []).includes(day);
89
+ return (_jsx("button", { type: "button", onClick: () => toggleDay(day), className: `flex h-11 flex-col items-center justify-center rounded-xl border text-xs font-semibold transition ${active
90
+ ? "border-[var(--admin-primary,#2563eb)] bg-[var(--admin-primary,#2563eb)] text-white shadow-sm"
91
+ : "border-slate-200 bg-white text-slate-700 hover:border-slate-300"}`, children: label }, day));
92
+ }) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsxs("label", { className: "mb-1.5 flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-slate-600", children: [_jsx(Clock, { className: "size-4" }), "Time Window (Africa/Nairobi EAT)"] }), _jsx("input", { type: "text", value: settings.publishTime, onChange: (e) => setSettings({ ...settings, publishTime: e.target.value }), placeholder: "09:00 AM", className: "w-full rounded-xl border border-slate-200 px-3.5 py-2 text-sm text-slate-900 focus:border-[var(--admin-primary,#2563eb)] focus:outline-none focus:ring-2 focus:ring-[var(--admin-primary,#2563eb)]/20" })] }), _jsxs("div", { children: [_jsxs("label", { className: "mb-1.5 flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-slate-600", children: [_jsx(Settings2, { className: "size-4" }), "Target Word Count"] }), _jsx("input", { type: "number", value: settings.targetWordCount, onChange: (e) => setSettings({ ...settings, targetWordCount: parseInt(e.target.value, 10) || 1200 }), className: "w-full rounded-xl border border-slate-200 px-3.5 py-2 text-sm text-slate-900 focus:border-[var(--admin-primary,#2563eb)] focus:outline-none focus:ring-2 focus:ring-[var(--admin-primary,#2563eb)]/20" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "mb-2 block text-xs font-semibold uppercase tracking-wider text-slate-600", children: "Target Content Categories" }), _jsx("div", { className: "flex flex-wrap gap-2", children: availableCategories.map((cat) => {
93
+ const active = (settings.categories || []).includes(cat);
94
+ return (_jsx("button", { type: "button", onClick: () => toggleCategory(cat), className: `rounded-full border px-3 py-1 text-xs font-medium transition ${active
95
+ ? "border-[var(--admin-primary,#2563eb)] bg-[var(--admin-primary,#2563eb)]/10 text-[var(--admin-primary,#2563eb)]"
96
+ : "border-slate-200 bg-white text-slate-600 hover:border-slate-300"}`, children: cat }, cat));
97
+ }) })] })] }), isGenerating && (_jsx("div", { className: "mt-5 rounded-xl border border-blue-100 bg-blue-50/70 p-4", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Loader2, { className: "size-5 animate-spin text-[var(--admin-primary,#2563eb)]" }), _jsx("p", { className: "text-sm font-medium text-blue-900", children: statusText })] }) })), _jsxs("div", { className: "mt-8 flex flex-col-reverse gap-3 border-t border-slate-100 pt-5 sm:flex-row sm:items-center sm:justify-between", children: [_jsx("button", { type: "button", onClick: handleRunNow, disabled: isGenerating || isPending, className: "inline-flex items-center justify-center gap-2 rounded-xl border border-[var(--admin-primary,#2563eb)] bg-white px-4 py-2.5 text-sm font-semibold text-[var(--admin-primary,#2563eb)] shadow-sm hover:bg-[var(--admin-primary,#2563eb)]/5 disabled:opacity-50", children: isGenerating ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Executing Pipeline..." })] })) : (_jsxs(_Fragment, { children: [_jsx(Zap, { className: "size-4" }), _jsx("span", { children: "Run Cycle Now" })] })) }), _jsxs("div", { className: "flex items-center justify-end gap-2.5", children: [_jsx("button", { type: "button", onClick: () => setOpen(false), className: "rounded-xl border border-slate-200 px-4 py-2.5 text-sm font-medium text-slate-700 hover:bg-slate-50", children: "Close" }), _jsx("button", { type: "button", onClick: handleSave, disabled: isPending || isGenerating, className: "inline-flex items-center justify-center gap-2 rounded-xl bg-[var(--admin-primary,#2563eb)] px-5 py-2.5 text-sm font-semibold text-white shadow-sm hover:opacity-95 disabled:opacity-50", children: isPending ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Saving..." })] })) : (_jsx("span", { children: "Save Settings" })) })] })] })] }) }))] }));
98
+ }
99
+ //# sourceMappingURL=AutoGenerateBlogModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoGenerateBlogModal.js","sourceRoot":"","sources":["../../src/components/AutoGenerateBlogModal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface RichTextProps {
2
+ id?: string;
3
+ value: string;
4
+ onChange: (html: string) => void;
5
+ placeholder?: string;
6
+ invalid?: boolean;
7
+ }
8
+ export declare function RichText({ id, value, onChange, placeholder, invalid }: RichTextProps): import("react").JSX.Element;
9
+ //# sourceMappingURL=RichText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichText.d.ts","sourceRoot":"","sources":["../../src/components/RichText.tsx"],"names":[],"mappings":"AAgDA,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,aAAa,+BA0IpF"}
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEditor, EditorContent } from "@tiptap/react";
4
+ import StarterKit from "@tiptap/starter-kit";
5
+ import Link from "@tiptap/extension-link";
6
+ import { Bold, Heading3, Heading4, Italic, Link2, List, ListOrdered, Quote, Undo2, Redo2 } from "lucide-react";
7
+ function ToolbarButton({ onClick, active, label, children }) {
8
+ return (_jsx("button", { type: "button", onClick: onClick, "aria-label": label, title: label, "aria-pressed": active, className: `grid size-8 place-items-center rounded transition-colors ${active
9
+ ? "bg-[var(--admin-primary,#2563eb)] text-white shadow-sm"
10
+ : "text-slate-600 hover:bg-slate-100 hover:text-slate-900"}`, children: children }));
11
+ }
12
+ export function RichText({ id, value, onChange, placeholder, invalid }) {
13
+ const editor = useEditor({
14
+ immediatelyRender: false,
15
+ extensions: [
16
+ StarterKit.configure({
17
+ heading: { levels: [3, 4] },
18
+ codeBlock: false,
19
+ code: false
20
+ }),
21
+ Link.configure({
22
+ openOnClick: false,
23
+ autolink: true,
24
+ protocols: ["https", "mailto", "tel"]
25
+ })
26
+ ],
27
+ content: value || "",
28
+ editorProps: {
29
+ attributes: {
30
+ ...(id ? { id } : {}),
31
+ class: "prose-admin min-h-[160px] p-3.5 focus:outline-none text-base text-[var(--admin-text-primary,#0f172a)]",
32
+ "aria-multiline": "true",
33
+ role: "textbox"
34
+ }
35
+ },
36
+ onUpdate: ({ editor: ed }) => {
37
+ onChange(ed.isEmpty ? "" : ed.getHTML());
38
+ }
39
+ });
40
+ const iconClass = "size-4";
41
+ return (_jsxs("div", { className: `overflow-hidden rounded-lg border bg-[var(--admin-surface-bg,#ffffff)] transition-all ${invalid
42
+ ? "border-red-500 ring-2 ring-red-100"
43
+ : "border-[var(--admin-border,#e2e8f0)] focus-within:border-[var(--admin-primary,#2563eb)] focus-within:ring-2 focus-within:ring-[var(--admin-primary,#2563eb)]/20"}`, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-1 border-b border-[var(--admin-border,#e2e8f0)] bg-slate-50/80 p-1.5", role: "toolbar", "aria-label": "Text formatting", children: [_jsx(ToolbarButton, { label: "Bold", onClick: () => editor?.chain().focus().toggleBold().run(), active: editor?.isActive("bold"), children: _jsx(Bold, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Italic", onClick: () => editor?.chain().focus().toggleItalic().run(), active: editor?.isActive("italic"), children: _jsx(Italic, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Heading 3", onClick: () => editor?.chain().focus().toggleHeading({ level: 3 }).run(), active: editor?.isActive("heading", { level: 3 }), children: _jsx(Heading3, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Heading 4", onClick: () => editor?.chain().focus().toggleHeading({ level: 4 }).run(), active: editor?.isActive("heading", { level: 4 }), children: _jsx(Heading4, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Bullet list", onClick: () => editor?.chain().focus().toggleBulletList().run(), active: editor?.isActive("bulletList"), children: _jsx(List, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Numbered list", onClick: () => editor?.chain().focus().toggleOrderedList().run(), active: editor?.isActive("orderedList"), children: _jsx(ListOrdered, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Blockquote", onClick: () => editor?.chain().focus().toggleBlockquote().run(), active: editor?.isActive("blockquote"), children: _jsx(Quote, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Link", active: editor?.isActive("link"), onClick: () => {
44
+ const prev = editor?.getAttributes("link")?.href;
45
+ const url = window.prompt("Link address (https://…)", prev ?? "https://");
46
+ if (url === null)
47
+ return;
48
+ if (url === "" || url === "https://") {
49
+ editor?.chain().focus().unsetLink().run();
50
+ }
51
+ else {
52
+ editor?.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
53
+ }
54
+ }, children: _jsx(Link2, { className: iconClass }) }), _jsx("span", { className: "mx-1 h-5 w-px bg-slate-200" }), _jsx(ToolbarButton, { label: "Undo", onClick: () => editor?.chain().focus().undo().run(), children: _jsx(Undo2, { className: iconClass }) }), _jsx(ToolbarButton, { label: "Redo", onClick: () => editor?.chain().focus().redo().run(), children: _jsx(Redo2, { className: iconClass }) })] }), _jsx(EditorContent, { editor: editor })] }));
55
+ }
56
+ //# sourceMappingURL=RichText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichText.js","sourceRoot":"","sources":["../../src/components/RichText.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from "react";
2
+ import type { AdminThemeConfig } from "../theme/types.js";
3
+ export interface NavItem {
4
+ label: string;
5
+ href: string;
6
+ icon?: "dashboard" | "blogs" | "enquiries" | "custom";
7
+ badge?: number;
8
+ }
9
+ export interface AdminShellProps {
10
+ theme?: Partial<AdminThemeConfig>;
11
+ currentPath?: string;
12
+ navItems?: NavItem[];
13
+ userEmail?: string;
14
+ onSignOut?: () => void;
15
+ children: ReactNode;
16
+ }
17
+ export declare function Shell({ theme, currentPath, navItems, userEmail, onSignOut, children }: AdminShellProps): import("react").JSX.Element;
18
+ //# sourceMappingURL=Shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shell.d.ts","sourceRoot":"","sources":["../../src/components/Shell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAsBD,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,WAAsB,EACtB,QAA4B,EAC5B,SAAS,EACT,SAAS,EACT,QAAQ,EACT,EAAE,eAAe,+BAsIjB"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { FileText, Inbox, LayoutDashboard, ExternalLink, Menu, X } from "lucide-react";
5
+ import { defaultTheme } from "../theme/defaultTheme.js";
6
+ const DEFAULT_NAV_ITEMS = [
7
+ { label: "Dashboard", href: "/admin", icon: "dashboard" },
8
+ { label: "Blog Articles", href: "/admin/blogs", icon: "blogs" },
9
+ { label: "Lead Enquiries", href: "/admin/enquiries", icon: "enquiries" }
10
+ ];
11
+ function NavIcon({ type }) {
12
+ const iconClass = "size-4 shrink-0";
13
+ switch (type) {
14
+ case "blogs":
15
+ return _jsx(FileText, { className: iconClass });
16
+ case "enquiries":
17
+ return _jsx(Inbox, { className: iconClass });
18
+ case "dashboard":
19
+ return _jsx(LayoutDashboard, { className: iconClass });
20
+ default:
21
+ return _jsx(FileText, { className: iconClass });
22
+ }
23
+ }
24
+ export function Shell({ theme, currentPath = "/admin", navItems = DEFAULT_NAV_ITEMS, userEmail, onSignOut, children }) {
25
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
26
+ const brand = { ...defaultTheme.brand, ...theme?.brand };
27
+ const showAgencySig = theme?.agencySignature !== false;
28
+ return (_jsxs("div", { className: "min-h-screen bg-slate-50 text-slate-900 flex flex-col md:flex-row", children: [_jsxs("header", { className: "flex md:hidden items-center justify-between px-4 py-3 bg-[var(--admin-sidebar-bg,#0f172a)] text-white border-b border-slate-800", children: [_jsx("div", { className: "flex items-center gap-2", children: brand.logoUrl ? (_jsx("img", { src: brand.logoUrl, alt: brand.siteName, className: "h-7 w-auto object-contain" })) : (_jsx("span", { className: "font-bold text-base tracking-tight", children: brand.siteName })) }), _jsx("button", { type: "button", onClick: () => setMobileMenuOpen(!mobileMenuOpen), className: "p-1.5 rounded-lg text-slate-300 hover:bg-slate-800", "aria-label": "Toggle menu", children: mobileMenuOpen ? _jsx(X, { className: "size-5" }) : _jsx(Menu, { className: "size-5" }) })] }), _jsxs("aside", { className: `${mobileMenuOpen ? "block" : "hidden"} md:block md:w-64 shrink-0 bg-[var(--admin-sidebar-bg,#0f172a)] text-[var(--admin-sidebar-text,#f8fafc)] flex flex-col justify-between border-r border-slate-800/80 min-h-screen`, children: [_jsxs("div", { children: [_jsx("div", { className: "hidden md:flex items-center justify-between p-5 border-b border-slate-800/80", children: _jsxs("div", { className: "flex items-center gap-2.5", children: [brand.logoUrl ? (_jsx("img", { src: brand.logoUrl, alt: brand.siteName, className: "h-8 w-auto object-contain" })) : (_jsx("div", { className: "size-8 rounded-lg bg-[var(--admin-primary,#2563eb)] grid place-items-center text-white font-bold text-sm", children: brand.siteName.slice(0, 1) })), _jsx("span", { className: "font-semibold text-sm tracking-tight text-white", children: brand.siteName })] }) }), _jsxs("nav", { className: "p-3 space-y-1", children: [_jsx("div", { className: "px-3 py-2 text-[10px] font-semibold uppercase tracking-wider text-slate-400", children: "Content & Leads" }), navItems.map((item) => {
29
+ const active = currentPath === item.href || (item.href !== "/admin" && currentPath.startsWith(item.href));
30
+ return (_jsxs("a", { href: item.href, className: `flex items-center justify-between px-3.5 py-2.5 rounded-xl text-xs font-medium transition ${active
31
+ ? "bg-[var(--admin-primary,#2563eb)] text-white shadow-sm"
32
+ : "text-slate-300 hover:bg-slate-800/80 hover:text-white"}`, children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx(NavIcon, { type: item.icon }), _jsx("span", { children: item.label })] }), item.badge !== undefined && item.badge > 0 && (_jsx("span", { className: "rounded-full bg-white/20 px-2 py-0.5 text-[10px] font-bold", children: item.badge }))] }, item.href));
33
+ })] })] }), _jsxs("div", { className: "p-4 border-t border-slate-800/80 space-y-3", children: [brand.homeUrl && (_jsxs("a", { href: brand.homeUrl, target: "_blank", rel: "noopener noreferrer", className: "flex items-center justify-between text-xs text-slate-400 hover:text-white transition px-2 py-1.5", children: [_jsx("span", { children: "View Live Website" }), _jsx(ExternalLink, { className: "size-3.5" })] })), userEmail && (_jsxs("div", { className: "flex items-center justify-between px-2 pt-2 border-t border-slate-800/60 text-xs", children: [_jsx("span", { className: "truncate text-slate-400 max-w-[140px]", children: userEmail }), onSignOut && (_jsx("button", { type: "button", onClick: onSignOut, className: "text-slate-400 hover:text-red-400 transition", children: "Sign Out" }))] })), showAgencySig && (_jsx("div", { className: "pt-2 text-center text-[11px] text-slate-400 border-t border-slate-800/40", children: _jsx("a", { href: "https://mutisowebagency.com", target: "_blank", rel: "noopener noreferrer", className: "hover:text-slate-200 transition", children: "Made by Mutiso\u2019s Web Agency" }) }))] })] }), _jsx("main", { className: "flex-1 flex flex-col min-w-0", children: _jsx("div", { className: "flex-1 p-4 md:p-8 max-w-7xl mx-auto w-full", children: children }) })] }));
34
+ }
35
+ //# sourceMappingURL=Shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shell.js","sourceRoot":"","sources":["../../src/components/Shell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./RichText.js";
2
+ export * from "./AutoGenerateBlogModal.js";
3
+ export * from "./Shell.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./RichText.js";
2
+ export * from "./AutoGenerateBlogModal.js";
3
+ export * from "./Shell.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./types.js";
2
+ export * from "./schemas/blogs.js";
3
+ export * from "./schemas/enquiries.js";
4
+ export * from "./registry.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./types.js";
2
+ export * from "./schemas/blogs.js";
3
+ export * from "./schemas/enquiries.js";
4
+ export * from "./registry.js";
5
+ //# sourceMappingURL=index.js.map