@actuate-media/cms-admin 0.1.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/dist/AdminRoot.d.ts +21 -0
- package/dist/AdminRoot.d.ts.map +1 -0
- package/dist/AdminRoot.js +136 -0
- package/dist/AdminRoot.js.map +1 -0
- package/dist/components/Breadcrumbs.d.ts +6 -0
- package/dist/components/Breadcrumbs.d.ts.map +1 -0
- package/dist/components/Breadcrumbs.js +52 -0
- package/dist/components/Breadcrumbs.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +7 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +152 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +17 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +24 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/FocalPointPicker.d.ts +9 -0
- package/dist/components/FocalPointPicker.d.ts.map +1 -0
- package/dist/components/FocalPointPicker.js +19 -0
- package/dist/components/FocalPointPicker.js.map +1 -0
- package/dist/components/FolderTree.d.ts +28 -0
- package/dist/components/FolderTree.d.ts.map +1 -0
- package/dist/components/FolderTree.js +198 -0
- package/dist/components/FolderTree.js.map +1 -0
- package/dist/components/LivePreview.d.ts +10 -0
- package/dist/components/LivePreview.d.ts.map +1 -0
- package/dist/components/LivePreview.js +62 -0
- package/dist/components/LivePreview.js.map +1 -0
- package/dist/components/LocaleProvider.d.ts +28 -0
- package/dist/components/LocaleProvider.d.ts.map +1 -0
- package/dist/components/LocaleProvider.js +29 -0
- package/dist/components/LocaleProvider.js.map +1 -0
- package/dist/components/LocaleSwitcher.d.ts +2 -0
- package/dist/components/LocaleSwitcher.d.ts.map +1 -0
- package/dist/components/LocaleSwitcher.js +13 -0
- package/dist/components/LocaleSwitcher.js.map +1 -0
- package/dist/components/MediaPickerModal.d.ts +8 -0
- package/dist/components/MediaPickerModal.d.ts.map +1 -0
- package/dist/components/MediaPickerModal.js +53 -0
- package/dist/components/MediaPickerModal.js.map +1 -0
- package/dist/components/PresenceIndicator.d.ts +7 -0
- package/dist/components/PresenceIndicator.d.ts.map +1 -0
- package/dist/components/PresenceIndicator.js +37 -0
- package/dist/components/PresenceIndicator.js.map +1 -0
- package/dist/components/SEOPanel.d.ts +26 -0
- package/dist/components/SEOPanel.d.ts.map +1 -0
- package/dist/components/SEOPanel.js +249 -0
- package/dist/components/SEOPanel.js.map +1 -0
- package/dist/components/ThemeProvider.d.ts +13 -0
- package/dist/components/ThemeProvider.d.ts.map +1 -0
- package/dist/components/ThemeProvider.js +62 -0
- package/dist/components/ThemeProvider.js.map +1 -0
- package/dist/components/TipTapEditor.d.ts +9 -0
- package/dist/components/TipTapEditor.d.ts.map +1 -0
- package/dist/components/TipTapEditor.js +167 -0
- package/dist/components/TipTapEditor.js.map +1 -0
- package/dist/components/VersionHistory.d.ts +9 -0
- package/dist/components/VersionHistory.d.ts.map +1 -0
- package/dist/components/VersionHistory.js +70 -0
- package/dist/components/VersionHistory.js.map +1 -0
- package/dist/components/ui/Avatar.d.ts +9 -0
- package/dist/components/ui/Avatar.d.ts.map +1 -0
- package/dist/components/ui/Avatar.js +21 -0
- package/dist/components/ui/Avatar.js.map +1 -0
- package/dist/components/ui/Badge.d.ts +5 -0
- package/dist/components/ui/Badge.d.ts.map +1 -0
- package/dist/components/ui/Badge.js +17 -0
- package/dist/components/ui/Badge.js.map +1 -0
- package/dist/components/ui/Button.d.ts +12 -0
- package/dist/components/ui/Button.d.ts.map +1 -0
- package/dist/components/ui/Button.js +17 -0
- package/dist/components/ui/Button.js.map +1 -0
- package/dist/components/ui/CommandPalette.d.ts +14 -0
- package/dist/components/ui/CommandPalette.d.ts.map +1 -0
- package/dist/components/ui/CommandPalette.js +52 -0
- package/dist/components/ui/CommandPalette.js.map +1 -0
- package/dist/components/ui/ConfirmDialog.d.ts +12 -0
- package/dist/components/ui/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/ui/ConfirmDialog.js +11 -0
- package/dist/components/ui/ConfirmDialog.js.map +1 -0
- package/dist/components/ui/DataTable.d.ts +30 -0
- package/dist/components/ui/DataTable.d.ts.map +1 -0
- package/dist/components/ui/DataTable.js +40 -0
- package/dist/components/ui/DataTable.js.map +1 -0
- package/dist/components/ui/EmptyState.d.ts +10 -0
- package/dist/components/ui/EmptyState.d.ts.map +1 -0
- package/dist/components/ui/EmptyState.js +6 -0
- package/dist/components/ui/EmptyState.js.map +1 -0
- package/dist/components/ui/Modal.d.ts +10 -0
- package/dist/components/ui/Modal.d.ts.map +1 -0
- package/dist/components/ui/Modal.js +19 -0
- package/dist/components/ui/Modal.js.map +1 -0
- package/dist/components/ui/Pagination.d.ts +9 -0
- package/dist/components/ui/Pagination.d.ts.map +1 -0
- package/dist/components/ui/Pagination.js +21 -0
- package/dist/components/ui/Pagination.js.map +1 -0
- package/dist/components/ui/SearchInput.d.ts +7 -0
- package/dist/components/ui/SearchInput.d.ts.map +1 -0
- package/dist/components/ui/SearchInput.js +6 -0
- package/dist/components/ui/SearchInput.js.map +1 -0
- package/dist/components/ui/Skeleton.d.ts +9 -0
- package/dist/components/ui/Skeleton.d.ts.map +1 -0
- package/dist/components/ui/Skeleton.js +11 -0
- package/dist/components/ui/Skeleton.js.map +1 -0
- package/dist/components/ui/Toast.d.ts +18 -0
- package/dist/components/ui/Toast.d.ts.map +1 -0
- package/dist/components/ui/Toast.js +29 -0
- package/dist/components/ui/Toast.js.map +1 -0
- package/dist/components/ui/index.d.ts +25 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +13 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/fields/ArrayField.d.ts +9 -0
- package/dist/fields/ArrayField.d.ts.map +1 -0
- package/dist/fields/ArrayField.js +21 -0
- package/dist/fields/ArrayField.js.map +1 -0
- package/dist/fields/BlockBuilderField.d.ts +16 -0
- package/dist/fields/BlockBuilderField.d.ts.map +1 -0
- package/dist/fields/BlockBuilderField.js +110 -0
- package/dist/fields/BlockBuilderField.js.map +1 -0
- package/dist/fields/DateField.d.ts +9 -0
- package/dist/fields/DateField.d.ts.map +1 -0
- package/dist/fields/DateField.js +6 -0
- package/dist/fields/DateField.js.map +1 -0
- package/dist/fields/FieldRenderer.d.ts +22 -0
- package/dist/fields/FieldRenderer.d.ts.map +1 -0
- package/dist/fields/FieldRenderer.js +38 -0
- package/dist/fields/FieldRenderer.js.map +1 -0
- package/dist/fields/GroupField.d.ts +8 -0
- package/dist/fields/GroupField.d.ts.map +1 -0
- package/dist/fields/GroupField.js +8 -0
- package/dist/fields/GroupField.js.map +1 -0
- package/dist/fields/MediaField.d.ts +13 -0
- package/dist/fields/MediaField.d.ts.map +1 -0
- package/dist/fields/MediaField.js +6 -0
- package/dist/fields/MediaField.js.map +1 -0
- package/dist/fields/NavBuilderField.d.ts +15 -0
- package/dist/fields/NavBuilderField.d.ts.map +1 -0
- package/dist/fields/NavBuilderField.js +19 -0
- package/dist/fields/NavBuilderField.js.map +1 -0
- package/dist/fields/NumberField.d.ts +12 -0
- package/dist/fields/NumberField.d.ts.map +1 -0
- package/dist/fields/NumberField.js +6 -0
- package/dist/fields/NumberField.js.map +1 -0
- package/dist/fields/RelationshipField.d.ts +13 -0
- package/dist/fields/RelationshipField.d.ts.map +1 -0
- package/dist/fields/RelationshipField.js +119 -0
- package/dist/fields/RelationshipField.js.map +1 -0
- package/dist/fields/RichTextField.d.ts +9 -0
- package/dist/fields/RichTextField.d.ts.map +1 -0
- package/dist/fields/RichTextField.js +7 -0
- package/dist/fields/RichTextField.js.map +1 -0
- package/dist/fields/SelectField.d.ts +11 -0
- package/dist/fields/SelectField.d.ts.map +1 -0
- package/dist/fields/SelectField.js +31 -0
- package/dist/fields/SelectField.js.map +1 -0
- package/dist/fields/SlugField.d.ts +10 -0
- package/dist/fields/SlugField.d.ts.map +1 -0
- package/dist/fields/SlugField.js +15 -0
- package/dist/fields/SlugField.js.map +1 -0
- package/dist/fields/TextField.d.ts +11 -0
- package/dist/fields/TextField.d.ts.map +1 -0
- package/dist/fields/TextField.js +8 -0
- package/dist/fields/TextField.js.map +1 -0
- package/dist/fields/ToggleField.d.ts +8 -0
- package/dist/fields/ToggleField.d.ts.map +1 -0
- package/dist/fields/ToggleField.js +6 -0
- package/dist/fields/ToggleField.js.map +1 -0
- package/dist/fields/block-types.d.ts +18 -0
- package/dist/fields/block-types.d.ts.map +1 -0
- package/dist/fields/block-types.js +88 -0
- package/dist/fields/block-types.js.map +1 -0
- package/dist/fields/index.d.ts +18 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.js +16 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/hooks/useContentLock.d.ts +12 -0
- package/dist/hooks/useContentLock.d.ts.map +1 -0
- package/dist/hooks/useContentLock.js +38 -0
- package/dist/hooks/useContentLock.js.map +1 -0
- package/dist/hooks/useDebounce.d.ts +2 -0
- package/dist/hooks/useDebounce.d.ts.map +1 -0
- package/dist/hooks/useDebounce.js +11 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +6 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.js +26 -0
- package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/Header.d.ts +7 -0
- package/dist/layout/Header.d.ts.map +1 -0
- package/dist/layout/Header.js +18 -0
- package/dist/layout/Header.js.map +1 -0
- package/dist/layout/Layout.d.ts +10 -0
- package/dist/layout/Layout.d.ts.map +1 -0
- package/dist/layout/Layout.js +25 -0
- package/dist/layout/Layout.js.map +1 -0
- package/dist/layout/Sidebar.d.ts +9 -0
- package/dist/layout/Sidebar.d.ts.map +1 -0
- package/dist/layout/Sidebar.js +63 -0
- package/dist/layout/Sidebar.js.map +1 -0
- package/dist/lib/api.d.ts +8 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +59 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/search.d.ts +11 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +46 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/useApiData.d.ts +8 -0
- package/dist/lib/useApiData.d.ts.map +1 -0
- package/dist/lib/useApiData.js +36 -0
- package/dist/lib/useApiData.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/router/index.d.ts +10 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +61 -0
- package/dist/router/index.js.map +1 -0
- package/dist/views/CollectionList.d.ts +7 -0
- package/dist/views/CollectionList.d.ts.map +1 -0
- package/dist/views/CollectionList.js +107 -0
- package/dist/views/CollectionList.js.map +1 -0
- package/dist/views/Dashboard.d.ts +5 -0
- package/dist/views/Dashboard.d.ts.map +1 -0
- package/dist/views/Dashboard.js +17 -0
- package/dist/views/Dashboard.js.map +1 -0
- package/dist/views/DocumentEdit.d.ts +8 -0
- package/dist/views/DocumentEdit.d.ts.map +1 -0
- package/dist/views/DocumentEdit.js +210 -0
- package/dist/views/DocumentEdit.js.map +1 -0
- package/dist/views/FormEditor.d.ts +6 -0
- package/dist/views/FormEditor.d.ts.map +1 -0
- package/dist/views/FormEditor.js +126 -0
- package/dist/views/FormEditor.js.map +1 -0
- package/dist/views/FormSubmissions.d.ts +6 -0
- package/dist/views/FormSubmissions.d.ts.map +1 -0
- package/dist/views/FormSubmissions.js +88 -0
- package/dist/views/FormSubmissions.js.map +1 -0
- package/dist/views/Forms.d.ts +5 -0
- package/dist/views/Forms.d.ts.map +1 -0
- package/dist/views/Forms.js +24 -0
- package/dist/views/Forms.js.map +1 -0
- package/dist/views/Login.d.ts +10 -0
- package/dist/views/Login.d.ts.map +1 -0
- package/dist/views/Login.js +83 -0
- package/dist/views/Login.js.map +1 -0
- package/dist/views/MediaBrowser.d.ts +5 -0
- package/dist/views/MediaBrowser.d.ts.map +1 -0
- package/dist/views/MediaBrowser.js +245 -0
- package/dist/views/MediaBrowser.js.map +1 -0
- package/dist/views/PageEditor.d.ts +6 -0
- package/dist/views/PageEditor.d.ts.map +1 -0
- package/dist/views/PageEditor.js +74 -0
- package/dist/views/PageEditor.js.map +1 -0
- package/dist/views/Pages.d.ts +5 -0
- package/dist/views/Pages.d.ts.map +1 -0
- package/dist/views/Pages.js +127 -0
- package/dist/views/Pages.js.map +1 -0
- package/dist/views/PostEditor.d.ts +6 -0
- package/dist/views/PostEditor.d.ts.map +1 -0
- package/dist/views/PostEditor.js +79 -0
- package/dist/views/PostEditor.js.map +1 -0
- package/dist/views/Posts.d.ts +5 -0
- package/dist/views/Posts.d.ts.map +1 -0
- package/dist/views/Posts.js +67 -0
- package/dist/views/Posts.js.map +1 -0
- package/dist/views/Redirects.d.ts +5 -0
- package/dist/views/Redirects.d.ts.map +1 -0
- package/dist/views/Redirects.js +79 -0
- package/dist/views/Redirects.js.map +1 -0
- package/dist/views/SEO.d.ts +6 -0
- package/dist/views/SEO.d.ts.map +1 -0
- package/dist/views/SEO.js +120 -0
- package/dist/views/SEO.js.map +1 -0
- package/dist/views/Settings.d.ts +5 -0
- package/dist/views/Settings.d.ts.map +1 -0
- package/dist/views/Settings.js +95 -0
- package/dist/views/Settings.js.map +1 -0
- package/dist/views/SetupWizard.d.ts +13 -0
- package/dist/views/SetupWizard.d.ts.map +1 -0
- package/dist/views/SetupWizard.js +68 -0
- package/dist/views/SetupWizard.js.map +1 -0
- package/dist/views/Users.d.ts +5 -0
- package/dist/views/Users.d.ts.map +1 -0
- package/dist/views/Users.js +69 -0
- package/dist/views/Users.js.map +1 -0
- package/package.json +71 -0
- package/src/styles/tailwind.css +2 -0
- package/src/styles/theme.css +175 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useMemo } from 'react';
|
|
4
|
+
import { Search, RefreshCw, EyeOff, ChevronDown, ChevronUp, Globe, Share2, Settings2, Target, BookOpen, CheckCircle2, AlertCircle, XCircle, BarChart3, Star, } from 'lucide-react';
|
|
5
|
+
const SCHEMA_TYPES = [
|
|
6
|
+
'Article',
|
|
7
|
+
'BlogPosting',
|
|
8
|
+
'WebPage',
|
|
9
|
+
'FAQPage',
|
|
10
|
+
'Product',
|
|
11
|
+
'Event',
|
|
12
|
+
'LocalBusiness',
|
|
13
|
+
'HowTo',
|
|
14
|
+
'Recipe',
|
|
15
|
+
];
|
|
16
|
+
function stripHtml(html) {
|
|
17
|
+
return html.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
|
|
18
|
+
}
|
|
19
|
+
function countWords(text) {
|
|
20
|
+
if (!text.trim())
|
|
21
|
+
return 0;
|
|
22
|
+
return text.trim().split(/\s+/).length;
|
|
23
|
+
}
|
|
24
|
+
function countSentences(text) {
|
|
25
|
+
if (!text.trim())
|
|
26
|
+
return 0;
|
|
27
|
+
const matches = text.match(/[.!?]+/g);
|
|
28
|
+
return matches ? matches.length : 1;
|
|
29
|
+
}
|
|
30
|
+
function countSyllables(word) {
|
|
31
|
+
const w = word.toLowerCase().replace(/[^a-z]/g, '');
|
|
32
|
+
if (w.length <= 3)
|
|
33
|
+
return 1;
|
|
34
|
+
let count = 0;
|
|
35
|
+
const vowels = 'aeiouy';
|
|
36
|
+
let prevVowel = false;
|
|
37
|
+
for (let i = 0; i < w.length; i++) {
|
|
38
|
+
const isVowel = vowels.includes(w[i] ?? '');
|
|
39
|
+
if (isVowel && !prevVowel)
|
|
40
|
+
count++;
|
|
41
|
+
prevVowel = isVowel;
|
|
42
|
+
}
|
|
43
|
+
if (w.endsWith('e') && count > 1)
|
|
44
|
+
count--;
|
|
45
|
+
return Math.max(count, 1);
|
|
46
|
+
}
|
|
47
|
+
function analyzeReadability(text) {
|
|
48
|
+
const plainText = stripHtml(text);
|
|
49
|
+
const wordCount = countWords(plainText);
|
|
50
|
+
const sentenceCount = countSentences(plainText);
|
|
51
|
+
const avgSentenceLength = sentenceCount > 0 ? wordCount / sentenceCount : 0;
|
|
52
|
+
const readingTime = Math.max(1, Math.ceil(wordCount / 200));
|
|
53
|
+
let fleschScore = 0;
|
|
54
|
+
if (wordCount > 0 && sentenceCount > 0) {
|
|
55
|
+
const words = plainText.split(/\s+/);
|
|
56
|
+
const totalSyllables = words.reduce((sum, w) => sum + countSyllables(w), 0);
|
|
57
|
+
fleschScore = Math.round(206.835 - 1.015 * (wordCount / sentenceCount) - 84.6 * (totalSyllables / wordCount));
|
|
58
|
+
fleschScore = Math.max(0, Math.min(100, fleschScore));
|
|
59
|
+
}
|
|
60
|
+
const passivePatterns = /\b(is|are|was|were|been|being|be)\s+\w+ed\b/gi;
|
|
61
|
+
const passiveMatches = plainText.match(passivePatterns);
|
|
62
|
+
const passiveEstimate = passiveMatches
|
|
63
|
+
? Math.round((passiveMatches.length / Math.max(sentenceCount, 1)) * 100)
|
|
64
|
+
: 0;
|
|
65
|
+
return { fleschScore, avgSentenceLength, wordCount, readingTime, passiveEstimate };
|
|
66
|
+
}
|
|
67
|
+
function runSEOChecks(seoData, title, slug, content) {
|
|
68
|
+
const checks = [];
|
|
69
|
+
const plainText = stripHtml(content);
|
|
70
|
+
const wordCount = countWords(plainText);
|
|
71
|
+
const keyphrase = (seoData.focusKeyphrase ?? '').toLowerCase().trim();
|
|
72
|
+
const metaTitle = seoData.metaTitle ?? '';
|
|
73
|
+
const metaDesc = seoData.metaDescription ?? '';
|
|
74
|
+
// Meta title length
|
|
75
|
+
if (!metaTitle) {
|
|
76
|
+
checks.push({ id: 'title-missing', label: 'Meta title', status: 'bad', detail: 'No meta title set' });
|
|
77
|
+
}
|
|
78
|
+
else if (metaTitle.length >= 30 && metaTitle.length <= 60) {
|
|
79
|
+
checks.push({ id: 'title-length', label: 'Meta title length', status: 'good', detail: `${metaTitle.length} chars (ideal: 30-60)` });
|
|
80
|
+
}
|
|
81
|
+
else if (metaTitle.length > 60) {
|
|
82
|
+
checks.push({ id: 'title-length', label: 'Meta title length', status: 'ok', detail: `${metaTitle.length} chars — too long, may be truncated` });
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
checks.push({ id: 'title-length', label: 'Meta title length', status: 'ok', detail: `${metaTitle.length} chars — quite short` });
|
|
86
|
+
}
|
|
87
|
+
// Meta description length
|
|
88
|
+
if (!metaDesc) {
|
|
89
|
+
checks.push({ id: 'desc-missing', label: 'Meta description', status: 'bad', detail: 'No meta description set' });
|
|
90
|
+
}
|
|
91
|
+
else if (metaDesc.length >= 120 && metaDesc.length <= 160) {
|
|
92
|
+
checks.push({ id: 'desc-length', label: 'Meta description length', status: 'good', detail: `${metaDesc.length} chars (ideal: 120-160)` });
|
|
93
|
+
}
|
|
94
|
+
else if (metaDesc.length > 160) {
|
|
95
|
+
checks.push({ id: 'desc-length', label: 'Meta description length', status: 'ok', detail: `${metaDesc.length} chars — may be truncated` });
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
checks.push({ id: 'desc-length', label: 'Meta description length', status: 'ok', detail: `${metaDesc.length} chars — could be longer` });
|
|
99
|
+
}
|
|
100
|
+
// Content length
|
|
101
|
+
if (wordCount >= 300) {
|
|
102
|
+
checks.push({ id: 'content-length', label: 'Content length', status: 'good', detail: `${wordCount} words` });
|
|
103
|
+
}
|
|
104
|
+
else if (wordCount >= 150) {
|
|
105
|
+
checks.push({ id: 'content-length', label: 'Content length', status: 'ok', detail: `${wordCount} words — aim for 300+` });
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
checks.push({ id: 'content-length', label: 'Content length', status: 'bad', detail: `${wordCount} words — too short` });
|
|
109
|
+
}
|
|
110
|
+
// Focus keyphrase checks
|
|
111
|
+
if (!keyphrase) {
|
|
112
|
+
checks.push({ id: 'keyphrase-missing', label: 'Focus keyphrase', status: 'bad', detail: 'No focus keyphrase set' });
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const inTitle = metaTitle.toLowerCase().includes(keyphrase);
|
|
116
|
+
checks.push({
|
|
117
|
+
id: 'keyphrase-title',
|
|
118
|
+
label: 'Keyphrase in title',
|
|
119
|
+
status: inTitle ? 'good' : 'bad',
|
|
120
|
+
detail: inTitle ? 'Found in meta title' : 'Not found in meta title',
|
|
121
|
+
});
|
|
122
|
+
const inDesc = metaDesc.toLowerCase().includes(keyphrase);
|
|
123
|
+
checks.push({
|
|
124
|
+
id: 'keyphrase-desc',
|
|
125
|
+
label: 'Keyphrase in description',
|
|
126
|
+
status: inDesc ? 'good' : 'ok',
|
|
127
|
+
detail: inDesc ? 'Found in meta description' : 'Not found in meta description',
|
|
128
|
+
});
|
|
129
|
+
const inSlug = slug.toLowerCase().includes(keyphrase.replace(/\s+/g, '-'));
|
|
130
|
+
checks.push({
|
|
131
|
+
id: 'keyphrase-slug',
|
|
132
|
+
label: 'Keyphrase in slug',
|
|
133
|
+
status: inSlug ? 'good' : 'ok',
|
|
134
|
+
detail: inSlug ? 'Found in URL slug' : 'Not found in URL slug',
|
|
135
|
+
});
|
|
136
|
+
const firstParagraph = plainText.slice(0, 300).toLowerCase();
|
|
137
|
+
const inIntro = firstParagraph.includes(keyphrase);
|
|
138
|
+
checks.push({
|
|
139
|
+
id: 'keyphrase-intro',
|
|
140
|
+
label: 'Keyphrase in introduction',
|
|
141
|
+
status: inIntro ? 'good' : 'ok',
|
|
142
|
+
detail: inIntro ? 'Found in first paragraph' : 'Not found in first paragraph',
|
|
143
|
+
});
|
|
144
|
+
if (wordCount > 0) {
|
|
145
|
+
const kpWords = keyphrase.split(/\s+/).length;
|
|
146
|
+
const regex = new RegExp(keyphrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
|
|
147
|
+
const matches = plainText.match(regex);
|
|
148
|
+
const occurrences = matches ? matches.length : 0;
|
|
149
|
+
const density = (occurrences * kpWords) / wordCount * 100;
|
|
150
|
+
const densityOk = density >= 0.5 && density <= 3;
|
|
151
|
+
checks.push({
|
|
152
|
+
id: 'keyphrase-density',
|
|
153
|
+
label: 'Keyphrase density',
|
|
154
|
+
status: densityOk ? 'good' : density === 0 ? 'bad' : 'ok',
|
|
155
|
+
detail: `${density.toFixed(1)}% (aim for 0.5-3%)`,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Image alt text
|
|
160
|
+
const imgTags = content.match(/<img[^>]*>/gi) ?? [];
|
|
161
|
+
if (imgTags.length > 0) {
|
|
162
|
+
const withoutAlt = imgTags.filter(tag => !tag.match(/alt\s*=\s*["'][^"']+["']/i));
|
|
163
|
+
if (withoutAlt.length === 0) {
|
|
164
|
+
checks.push({ id: 'img-alt', label: 'Image alt text', status: 'good', detail: 'All images have alt text' });
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
checks.push({ id: 'img-alt', label: 'Image alt text', status: 'ok', detail: `${withoutAlt.length} image(s) missing alt text` });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// OG checks
|
|
171
|
+
const hasOgTitle = !!(seoData.ogTitle || metaTitle);
|
|
172
|
+
const hasOgDesc = !!(seoData.ogDescription || metaDesc);
|
|
173
|
+
const hasOgImage = !!seoData.ogImage;
|
|
174
|
+
checks.push({
|
|
175
|
+
id: 'og-title',
|
|
176
|
+
label: 'Social title',
|
|
177
|
+
status: hasOgTitle ? 'good' : 'ok',
|
|
178
|
+
detail: hasOgTitle ? 'Set' : 'Missing — will fall back to page title',
|
|
179
|
+
});
|
|
180
|
+
checks.push({
|
|
181
|
+
id: 'og-desc',
|
|
182
|
+
label: 'Social description',
|
|
183
|
+
status: hasOgDesc ? 'good' : 'ok',
|
|
184
|
+
detail: hasOgDesc ? 'Set' : 'Missing — will fall back to meta description',
|
|
185
|
+
});
|
|
186
|
+
checks.push({
|
|
187
|
+
id: 'og-image',
|
|
188
|
+
label: 'Social image',
|
|
189
|
+
status: hasOgImage ? 'good' : 'bad',
|
|
190
|
+
detail: hasOgImage ? 'Set' : 'No OG image set — strongly recommended',
|
|
191
|
+
});
|
|
192
|
+
return checks;
|
|
193
|
+
}
|
|
194
|
+
function computeOverallScore(checks) {
|
|
195
|
+
if (checks.length === 0)
|
|
196
|
+
return 0;
|
|
197
|
+
const scoreMap = { good: 100, ok: 50, bad: 0 };
|
|
198
|
+
const total = checks.reduce((sum, c) => sum + scoreMap[c.status], 0);
|
|
199
|
+
return Math.round(total / checks.length);
|
|
200
|
+
}
|
|
201
|
+
function StatusDot({ status }) {
|
|
202
|
+
if (status === 'good')
|
|
203
|
+
return _jsx(CheckCircle2, { className: "h-4 w-4 shrink-0 text-green-500" });
|
|
204
|
+
if (status === 'ok')
|
|
205
|
+
return _jsx(AlertCircle, { className: "h-4 w-4 shrink-0 text-amber-500" });
|
|
206
|
+
return _jsx(XCircle, { className: "h-4 w-4 shrink-0 text-red-500" });
|
|
207
|
+
}
|
|
208
|
+
function ScoreRing({ score }) {
|
|
209
|
+
const radius = 28;
|
|
210
|
+
const circumference = 2 * Math.PI * radius;
|
|
211
|
+
const offset = circumference - (score / 100) * circumference;
|
|
212
|
+
const color = score >= 70 ? '#22c55e' : score >= 40 ? '#f59e0b' : '#ef4444';
|
|
213
|
+
return (_jsxs("div", { className: "relative inline-flex items-center justify-center", children: [_jsxs("svg", { width: "72", height: "72", className: "-rotate-90", children: [_jsx("circle", { cx: "36", cy: "36", r: radius, fill: "none", stroke: "var(--border)", strokeWidth: "5" }), _jsx("circle", { cx: "36", cy: "36", r: radius, fill: "none", stroke: color, strokeWidth: "5", strokeDasharray: circumference, strokeDashoffset: offset, strokeLinecap: "round", className: "transition-all duration-500" })] }), _jsx("span", { className: "absolute text-sm font-bold", style: { color }, children: score })] }));
|
|
214
|
+
}
|
|
215
|
+
function Section({ id, title, icon, expanded, onToggle, children, badge, }) {
|
|
216
|
+
return (_jsxs("div", { className: "border border-[var(--border)] rounded-lg overflow-hidden", children: [_jsxs("button", { onClick: () => onToggle(id), className: "flex items-center justify-between w-full px-4 py-2.5 text-left text-sm font-medium text-[var(--foreground)] hover:bg-[var(--muted)] transition-colors", children: [_jsxs("span", { className: "flex items-center gap-2", children: [icon, title, badge] }), expanded ? _jsx(ChevronUp, { className: "h-4 w-4 text-[var(--muted-foreground)]" }) : _jsx(ChevronDown, { className: "h-4 w-4 text-[var(--muted-foreground)]" })] }), expanded && _jsx("div", { className: "px-4 pb-4 pt-1", children: children })] }));
|
|
217
|
+
}
|
|
218
|
+
function ToggleSwitch({ label, description, checked, onChange, }) {
|
|
219
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("label", { className: "text-sm font-medium text-[var(--foreground)]", children: label }), _jsx("p", { className: "text-xs text-[var(--muted-foreground)] mt-0.5", children: description })] }), _jsx("button", { type: "button", role: "switch", "aria-checked": checked, onClick: () => onChange(!checked), className: `relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full transition-colors ${checked ? 'bg-[var(--primary)]' : 'bg-[var(--muted)]'}`, children: _jsx("span", { className: `pointer-events-none block h-5 w-5 rounded-full bg-white shadow-sm transition-transform mt-0.5 ${checked ? 'translate-x-[22px]' : 'translate-x-0.5'}` }) })] }));
|
|
220
|
+
}
|
|
221
|
+
function InputField({ label, value, onChange, placeholder, type = 'text', charCount, charTarget, }) {
|
|
222
|
+
return (_jsxs("div", { children: [_jsx("label", { className: "block text-xs font-medium text-[var(--muted-foreground)] mb-1", children: label }), _jsx("input", { type: type, value: value, onChange: (e) => onChange(e.target.value), className: "w-full px-3 py-1.5 text-sm border border-[var(--border)] rounded-lg bg-[var(--background)] text-[var(--foreground)] focus:outline-none focus:ring-2 focus:ring-[var(--primary)] placeholder:text-[var(--muted-foreground)]", placeholder: placeholder }), charCount !== undefined && charTarget && (_jsxs("p", { className: "text-xs mt-1 text-[var(--muted-foreground)]", children: [charCount, " chars ", charTarget] }))] }));
|
|
223
|
+
}
|
|
224
|
+
function TextareaField({ label, value, onChange, placeholder, rows = 3, charCount, charTarget, }) {
|
|
225
|
+
return (_jsxs("div", { children: [_jsx("label", { className: "block text-xs font-medium text-[var(--muted-foreground)] mb-1", children: label }), _jsx("textarea", { value: value, onChange: (e) => onChange(e.target.value), rows: rows, className: "w-full px-3 py-1.5 text-sm border border-[var(--border)] rounded-lg bg-[var(--background)] text-[var(--foreground)] focus:outline-none focus:ring-2 focus:ring-[var(--primary)] resize-none placeholder:text-[var(--muted-foreground)]", placeholder: placeholder }), charCount !== undefined && charTarget && (_jsxs("p", { className: "text-xs mt-1 text-[var(--muted-foreground)]", children: [charCount, " chars ", charTarget] }))] }));
|
|
226
|
+
}
|
|
227
|
+
export function SEOPanel({ title, slug, content = '', seoData, onChange, siteUrl = 'https://example.com' }) {
|
|
228
|
+
const [expandedSections, setExpandedSections] = useState(['analysis']);
|
|
229
|
+
const update = (partial) => {
|
|
230
|
+
onChange({ ...seoData, ...partial });
|
|
231
|
+
};
|
|
232
|
+
const toggleSection = (id) => {
|
|
233
|
+
setExpandedSections((prev) => prev.includes(id) ? prev.filter((s) => s !== id) : [...prev, id]);
|
|
234
|
+
};
|
|
235
|
+
const checks = useMemo(() => runSEOChecks(seoData, title, slug, content), [seoData, title, slug, content]);
|
|
236
|
+
const readability = useMemo(() => analyzeReadability(content), [content]);
|
|
237
|
+
const score = useMemo(() => computeOverallScore(checks), [checks]);
|
|
238
|
+
const goodCount = checks.filter((c) => c.status === 'good').length;
|
|
239
|
+
const okCount = checks.filter((c) => c.status === 'ok').length;
|
|
240
|
+
const badCount = checks.filter((c) => c.status === 'bad').length;
|
|
241
|
+
const metaTitle = seoData.metaTitle ?? '';
|
|
242
|
+
const metaDesc = seoData.metaDescription ?? '';
|
|
243
|
+
const displayTitle = seoData.ogTitle || metaTitle || title || 'Page Title';
|
|
244
|
+
const displayDesc = seoData.ogDescription || metaDesc || 'Add a meta description to see how this page will appear in search results.';
|
|
245
|
+
const fleschLabel = readability.fleschScore >= 60 ? 'Easy to read' : readability.fleschScore >= 30 ? 'Fairly difficult' : 'Very difficult';
|
|
246
|
+
const fleschColor = readability.fleschScore >= 60 ? 'text-green-500' : readability.fleschScore >= 30 ? 'text-amber-500' : 'text-red-500';
|
|
247
|
+
return (_jsxs("div", { className: "rounded-lg border border-[var(--border)] bg-[var(--card)]", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-[var(--border)]", children: [_jsxs("h3", { className: "font-semibold text-[var(--foreground)] flex items-center gap-2 text-sm", children: [_jsx(Search, { className: "w-4 h-4" }), "SEO"] }), _jsxs("button", { onClick: () => update({ metaTitle: title, ogTitle: '', ogDescription: '' }), className: "text-xs text-[var(--primary)] hover:opacity-80 flex items-center gap-1", children: [_jsx(RefreshCw, { className: "w-3 h-3" }), "Reset"] })] }), _jsxs("div", { className: "flex items-center gap-4 px-4 py-3 border-b border-[var(--border)]", children: [_jsx(ScoreRing, { score: score }), _jsxs("div", { className: "text-xs text-[var(--muted-foreground)] space-y-0.5", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(CheckCircle2, { className: "h-3 w-3 text-green-500" }), " ", goodCount, " passed"] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(AlertCircle, { className: "h-3 w-3 text-amber-500" }), " ", okCount, " improvements"] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(XCircle, { className: "h-3 w-3 text-red-500" }), " ", badCount, " issues"] })] })] }), _jsxs("div", { className: "p-3 space-y-2", children: [_jsx(Section, { id: "analysis", title: "SEO Analysis", icon: _jsx(BarChart3, { className: "h-4 w-4" }), expanded: expandedSections.includes('analysis'), onToggle: toggleSection, badge: _jsxs("span", { className: "ml-1 inline-flex items-center rounded-full bg-[var(--muted)] px-2 py-0.5 text-[10px] font-medium text-[var(--muted-foreground)]", children: [goodCount, "/", checks.length] }), children: _jsx("div", { className: "space-y-1.5", children: checks.map((c) => (_jsxs("div", { className: "flex items-start gap-2 py-1", children: [_jsx(StatusDot, { status: c.status }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-sm text-[var(--foreground)] leading-snug", children: c.label }), _jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: c.detail })] })] }, c.id))) }) }), _jsxs(Section, { id: "readability", title: "Readability", icon: _jsx(BookOpen, { className: "h-4 w-4" }), expanded: expandedSections.includes('readability'), onToggle: toggleSection, children: [_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { className: "rounded-lg bg-[var(--muted)] p-2.5", children: [_jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: "Flesch Score" }), _jsx("p", { className: `text-lg font-bold ${fleschColor}`, children: readability.fleschScore }), _jsx("p", { className: `text-[10px] ${fleschColor}`, children: fleschLabel })] }), _jsxs("div", { className: "rounded-lg bg-[var(--muted)] p-2.5", children: [_jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: "Word Count" }), _jsx("p", { className: "text-lg font-bold text-[var(--foreground)]", children: readability.wordCount }), _jsx("p", { className: "text-[10px] text-[var(--muted-foreground)]", children: "words" })] }), _jsxs("div", { className: "rounded-lg bg-[var(--muted)] p-2.5", children: [_jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: "Avg. Sentence" }), _jsx("p", { className: "text-lg font-bold text-[var(--foreground)]", children: readability.avgSentenceLength.toFixed(1) }), _jsx("p", { className: "text-[10px] text-[var(--muted-foreground)]", children: "words/sentence" })] }), _jsxs("div", { className: "rounded-lg bg-[var(--muted)] p-2.5", children: [_jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: "Reading Time" }), _jsx("p", { className: "text-lg font-bold text-[var(--foreground)]", children: readability.readingTime }), _jsx("p", { className: "text-[10px] text-[var(--muted-foreground)]", children: "min" })] })] }), _jsxs("div", { className: "mt-3 flex items-center gap-2 text-xs text-[var(--muted-foreground)]", children: [_jsx("span", { children: "Passive voice est.:" }), _jsxs("span", { className: readability.passiveEstimate > 15 ? 'text-amber-500 font-medium' : 'text-green-500 font-medium', children: [readability.passiveEstimate, "%"] })] })] }), _jsx(Section, { id: "basic", title: "Basic SEO", icon: _jsx(Target, { className: "h-4 w-4" }), expanded: expandedSections.includes('basic'), onToggle: toggleSection, children: _jsxs("div", { className: "space-y-3", children: [_jsx(InputField, { label: "Meta Title", value: metaTitle, onChange: (v) => update({ metaTitle: v }), placeholder: title || 'Enter meta title', charCount: metaTitle.length, charTarget: "(ideal: 30-60)" }), _jsx(TextareaField, { label: "Meta Description", value: metaDesc, onChange: (v) => update({ metaDescription: v }), placeholder: "Brief description for search engines", charCount: metaDesc.length, charTarget: "(ideal: 120-160)" }), _jsx(InputField, { label: "Focus Keyphrase", value: seoData.focusKeyphrase ?? '', onChange: (v) => update({ focusKeyphrase: v }), placeholder: "Primary keyword or phrase" }), _jsx(InputField, { label: "Canonical URL", value: seoData.canonical ?? '', onChange: (v) => update({ canonical: v }), placeholder: "https://example.com/canonical-url", type: "url" })] }) }), _jsx(Section, { id: "robots", title: "Robots Meta", icon: _jsx(EyeOff, { className: "h-4 w-4" }), expanded: expandedSections.includes('robots'), onToggle: toggleSection, children: _jsxs("div", { className: "space-y-4", children: [_jsx(ToggleSwitch, { label: "No Index", description: "Prevent search engines from indexing this page", checked: seoData.noIndex ?? false, onChange: (v) => update({ noIndex: v }) }), _jsx(ToggleSwitch, { label: "No Follow", description: "Prevent search engines from following links", checked: seoData.noFollow ?? false, onChange: (v) => update({ noFollow: v }) })] }) }), _jsx(Section, { id: "preview", title: "Search Preview", icon: _jsx(Globe, { className: "h-4 w-4" }), expanded: expandedSections.includes('preview'), onToggle: toggleSection, children: _jsxs("div", { className: "rounded-lg border border-[var(--border)] p-3 bg-[var(--background)]", children: [_jsx("div", { className: "text-sm text-blue-600 hover:underline cursor-pointer line-clamp-1", children: metaTitle || title || 'Page Title' }), _jsxs("div", { className: "text-xs text-green-700 mt-1 truncate", children: [siteUrl, "/", slug] }), _jsx("div", { className: "text-sm text-[var(--muted-foreground)] mt-1 line-clamp-2", children: metaDesc || 'Add a meta description to see how this page will appear in search results.' })] }) }), _jsx(Section, { id: "social", title: "Social Media", icon: _jsx(Share2, { className: "h-4 w-4" }), expanded: expandedSections.includes('social'), onToggle: toggleSection, children: _jsxs("div", { className: "space-y-3", children: [_jsx(InputField, { label: "OG Title", value: seoData.ogTitle ?? '', onChange: (v) => update({ ogTitle: v }), placeholder: metaTitle || title || 'Leave blank to use meta title' }), _jsx(TextareaField, { label: "OG Description", value: seoData.ogDescription ?? '', onChange: (v) => update({ ogDescription: v }), rows: 2, placeholder: metaDesc || 'Leave blank to use meta description' }), _jsx(InputField, { label: "OG Image URL", value: seoData.ogImage ?? '', onChange: (v) => update({ ogImage: v }), placeholder: "https://example.com/og-image.jpg", type: "url" }), _jsxs("div", { className: "border-t border-[var(--border)] pt-3 mt-3", children: [_jsx("p", { className: "text-xs font-medium text-[var(--muted-foreground)] mb-2", children: "Twitter / X Overrides" }), _jsxs("div", { className: "space-y-3", children: [_jsx(InputField, { label: "Twitter Title", value: seoData.twitterTitle ?? '', onChange: (v) => update({ twitterTitle: v }), placeholder: "Leave blank to use OG title" }), _jsx(TextareaField, { label: "Twitter Description", value: seoData.twitterDescription ?? '', onChange: (v) => update({ twitterDescription: v }), rows: 2, placeholder: "Leave blank to use OG description" }), _jsx(InputField, { label: "Twitter Image URL", value: seoData.twitterImage ?? '', onChange: (v) => update({ twitterImage: v }), placeholder: "Leave blank to use OG image", type: "url" })] })] }), _jsxs("div", { className: "mt-3", children: [_jsx("p", { className: "text-xs font-medium text-[var(--muted-foreground)] mb-2", children: "Social Preview" }), _jsxs("div", { className: "rounded-lg border border-[var(--border)] overflow-hidden bg-[var(--muted)]", children: [seoData.ogImage ? (_jsx("div", { className: "aspect-video bg-[var(--muted)] flex items-center justify-center overflow-hidden", children: _jsx("img", { src: seoData.ogImage, alt: "OG preview", className: "w-full h-full object-cover" }) })) : (_jsx("div", { className: "aspect-video bg-[var(--muted)] flex items-center justify-center text-[var(--muted-foreground)] text-sm", children: "No OG image set" })), _jsxs("div", { className: "p-3", children: [_jsx("div", { className: "text-sm font-medium text-[var(--foreground)] line-clamp-1", children: displayTitle }), _jsx("div", { className: "text-xs text-[var(--muted-foreground)] mt-1 line-clamp-2", children: displayDesc.slice(0, 100) }), _jsx("div", { className: "text-xs text-[var(--muted-foreground)] mt-1 truncate", children: siteUrl })] })] })] })] }) }), _jsx(Section, { id: "advanced", title: "Advanced", icon: _jsx(Settings2, { className: "h-4 w-4" }), expanded: expandedSections.includes('advanced'), onToggle: toggleSection, children: _jsxs("div", { className: "space-y-4", children: [_jsx(ToggleSwitch, { label: "Cornerstone Content", description: "Mark as cornerstone \u2014 your most important, comprehensive articles", checked: seoData.isCornerstone ?? false, onChange: (v) => update({ isCornerstone: v }) }), seoData.isCornerstone && (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-amber-600 bg-amber-50 rounded-md px-2.5 py-1.5", children: [_jsx(Star, { className: "h-3.5 w-3.5" }), "Cornerstone content is held to stricter SEO standards"] })), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-medium text-[var(--muted-foreground)] mb-1", children: "Schema Type" }), _jsx("select", { value: seoData.schemaType ?? 'Article', onChange: (e) => update({ schemaType: e.target.value }), className: "w-full px-3 py-1.5 text-sm border border-[var(--border)] rounded-lg bg-[var(--background)] text-[var(--foreground)] focus:outline-none focus:ring-2 focus:ring-[var(--primary)]", children: SCHEMA_TYPES.map((t) => (_jsx("option", { value: t, children: t }, t))) })] })] }) })] })] }));
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=SEOPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SEOPanel.js","sourceRoot":"","sources":["../../src/components/SEOPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
type Theme = 'light' | 'dark' | 'system';
|
|
3
|
+
interface ThemeContextValue {
|
|
4
|
+
theme: Theme;
|
|
5
|
+
resolvedTheme: 'light' | 'dark';
|
|
6
|
+
setTheme: (theme: Theme) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function useTheme(): ThemeContextValue;
|
|
9
|
+
export declare function ThemeProvider({ children }: {
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=ThemeProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpG,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzC,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAQD,wBAAgB,QAAQ,sBAEvB;AAaD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAuClE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext, useState, useEffect, useCallback } from 'react';
|
|
4
|
+
const ThemeContext = createContext({
|
|
5
|
+
theme: 'system',
|
|
6
|
+
resolvedTheme: 'light',
|
|
7
|
+
setTheme: () => { },
|
|
8
|
+
});
|
|
9
|
+
export function useTheme() {
|
|
10
|
+
return useContext(ThemeContext);
|
|
11
|
+
}
|
|
12
|
+
function getSystemTheme() {
|
|
13
|
+
if (typeof window === 'undefined')
|
|
14
|
+
return 'light';
|
|
15
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
16
|
+
}
|
|
17
|
+
function resolveTheme(theme) {
|
|
18
|
+
return theme === 'system' ? getSystemTheme() : theme;
|
|
19
|
+
}
|
|
20
|
+
const STORAGE_KEY = 'actuate-theme';
|
|
21
|
+
export function ThemeProvider({ children }) {
|
|
22
|
+
const [theme, setThemeState] = useState('system');
|
|
23
|
+
const [resolvedTheme, setResolvedTheme] = useState('light');
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
26
|
+
const initial = stored && ['light', 'dark', 'system'].includes(stored) ? stored : 'system';
|
|
27
|
+
setThemeState(initial);
|
|
28
|
+
const resolved = resolveTheme(initial);
|
|
29
|
+
setResolvedTheme(resolved);
|
|
30
|
+
applyTheme(resolved);
|
|
31
|
+
}, []);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
|
34
|
+
const handler = () => {
|
|
35
|
+
if (theme === 'system') {
|
|
36
|
+
const resolved = getSystemTheme();
|
|
37
|
+
setResolvedTheme(resolved);
|
|
38
|
+
applyTheme(resolved);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
mq.addEventListener('change', handler);
|
|
42
|
+
return () => mq.removeEventListener('change', handler);
|
|
43
|
+
}, [theme]);
|
|
44
|
+
const setTheme = useCallback((next) => {
|
|
45
|
+
setThemeState(next);
|
|
46
|
+
localStorage.setItem(STORAGE_KEY, next);
|
|
47
|
+
const resolved = resolveTheme(next);
|
|
48
|
+
setResolvedTheme(resolved);
|
|
49
|
+
applyTheme(resolved);
|
|
50
|
+
}, []);
|
|
51
|
+
return (_jsx(ThemeContext.Provider, { value: { theme, resolvedTheme, setTheme }, children: children }));
|
|
52
|
+
}
|
|
53
|
+
function applyTheme(resolved) {
|
|
54
|
+
const root = document.documentElement;
|
|
55
|
+
if (resolved === 'dark') {
|
|
56
|
+
root.classList.add('dark');
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
root.classList.remove('dark');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=ThemeProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider.js","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface TipTapEditorProps {
|
|
2
|
+
content: string;
|
|
3
|
+
onChange: (html: string) => void;
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
editable?: boolean;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function TipTapEditor({ content, onChange, placeholder, editable, className, }: TipTapEditorProps): import("react/jsx-runtime").JSX.Element | null;
|
|
9
|
+
//# sourceMappingURL=TipTapEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TipTapEditor.d.ts","sourceRoot":"","sources":["../../src/components/TipTapEditor.tsx"],"names":[],"mappings":"AA+CA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkWD,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAe,EACf,SAAS,GACV,EAAE,iBAAiB,kDAuDnB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { useEditor, EditorContent } from '@tiptap/react';
|
|
5
|
+
import { MediaPickerModal } from './MediaPickerModal';
|
|
6
|
+
import StarterKit from '@tiptap/starter-kit';
|
|
7
|
+
import UnderlineExt from '@tiptap/extension-underline';
|
|
8
|
+
import Link from '@tiptap/extension-link';
|
|
9
|
+
import Image from '@tiptap/extension-image';
|
|
10
|
+
import Table from '@tiptap/extension-table';
|
|
11
|
+
import TableRow from '@tiptap/extension-table-row';
|
|
12
|
+
import TableHeader from '@tiptap/extension-table-header';
|
|
13
|
+
import TableCell from '@tiptap/extension-table-cell';
|
|
14
|
+
import TextAlign from '@tiptap/extension-text-align';
|
|
15
|
+
import Placeholder from '@tiptap/extension-placeholder';
|
|
16
|
+
import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight';
|
|
17
|
+
import HorizontalRule from '@tiptap/extension-horizontal-rule';
|
|
18
|
+
import { common, createLowlight } from 'lowlight';
|
|
19
|
+
import { Bold, Italic, Underline, Strikethrough, Code, Heading1, Heading2, Heading3, List, ListOrdered, Quote, FileCode, Minus, AlignLeft, AlignCenter, AlignRight, Link as LinkIcon, Image as ImageIcon, Table as TableIcon, Columns, Rows, Trash2, Undo, Redo, } from 'lucide-react';
|
|
20
|
+
const lowlight = createLowlight(common);
|
|
21
|
+
const editorStyles = `
|
|
22
|
+
.ProseMirror {
|
|
23
|
+
min-height: 300px;
|
|
24
|
+
outline: none;
|
|
25
|
+
padding: 1rem;
|
|
26
|
+
}
|
|
27
|
+
.ProseMirror h1 { font-size: 2em; font-weight: 700; margin: 0.67em 0; }
|
|
28
|
+
.ProseMirror h2 { font-size: 1.5em; font-weight: 700; margin: 0.75em 0; }
|
|
29
|
+
.ProseMirror h3 { font-size: 1.17em; font-weight: 700; margin: 0.83em 0; }
|
|
30
|
+
.ProseMirror h4 { font-size: 1em; font-weight: 700; margin: 1em 0; }
|
|
31
|
+
.ProseMirror h5 { font-size: 0.83em; font-weight: 700; margin: 1.17em 0; }
|
|
32
|
+
.ProseMirror h6 { font-size: 0.67em; font-weight: 700; margin: 1.33em 0; }
|
|
33
|
+
.ProseMirror ul { list-style: disc; padding-left: 1.5rem; margin: 0.5em 0; }
|
|
34
|
+
.ProseMirror ol { list-style: decimal; padding-left: 1.5rem; margin: 0.5em 0; }
|
|
35
|
+
.ProseMirror li { margin: 0.25em 0; }
|
|
36
|
+
.ProseMirror p { margin: 0.5em 0; }
|
|
37
|
+
.ProseMirror table {
|
|
38
|
+
border-collapse: collapse;
|
|
39
|
+
width: 100%;
|
|
40
|
+
margin: 1rem 0;
|
|
41
|
+
}
|
|
42
|
+
.ProseMirror th,
|
|
43
|
+
.ProseMirror td {
|
|
44
|
+
border: 1px solid #d1d5db;
|
|
45
|
+
padding: 0.5rem;
|
|
46
|
+
text-align: left;
|
|
47
|
+
min-width: 80px;
|
|
48
|
+
}
|
|
49
|
+
.ProseMirror th {
|
|
50
|
+
background-color: #f3f4f6;
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
}
|
|
53
|
+
.ProseMirror img {
|
|
54
|
+
max-width: 100%;
|
|
55
|
+
height: auto;
|
|
56
|
+
border-radius: 0.375rem;
|
|
57
|
+
}
|
|
58
|
+
.ProseMirror blockquote {
|
|
59
|
+
border-left: 3px solid #3b82f6;
|
|
60
|
+
padding-left: 1rem;
|
|
61
|
+
margin: 1rem 0;
|
|
62
|
+
color: #4b5563;
|
|
63
|
+
}
|
|
64
|
+
.ProseMirror pre {
|
|
65
|
+
background: #1e293b;
|
|
66
|
+
color: #e2e8f0;
|
|
67
|
+
padding: 1rem;
|
|
68
|
+
border-radius: 0.5rem;
|
|
69
|
+
overflow-x: auto;
|
|
70
|
+
margin: 0.75rem 0;
|
|
71
|
+
}
|
|
72
|
+
.ProseMirror code {
|
|
73
|
+
background: #f1f5f9;
|
|
74
|
+
padding: 0.125rem 0.375rem;
|
|
75
|
+
border-radius: 0.25rem;
|
|
76
|
+
font-size: 0.875em;
|
|
77
|
+
}
|
|
78
|
+
.ProseMirror pre code {
|
|
79
|
+
background: none;
|
|
80
|
+
padding: 0;
|
|
81
|
+
border-radius: 0;
|
|
82
|
+
font-size: inherit;
|
|
83
|
+
}
|
|
84
|
+
.ProseMirror hr {
|
|
85
|
+
border: none;
|
|
86
|
+
border-top: 2px solid #e5e7eb;
|
|
87
|
+
margin: 1.5rem 0;
|
|
88
|
+
}
|
|
89
|
+
.ProseMirror p.is-editor-empty:first-child::before {
|
|
90
|
+
content: attr(data-placeholder);
|
|
91
|
+
float: left;
|
|
92
|
+
color: #9ca3af;
|
|
93
|
+
pointer-events: none;
|
|
94
|
+
height: 0;
|
|
95
|
+
}
|
|
96
|
+
.ProseMirror .selectedCell {
|
|
97
|
+
background-color: #dbeafe;
|
|
98
|
+
}
|
|
99
|
+
`;
|
|
100
|
+
function ToolbarButton({ onClick, isActive = false, disabled = false, title, children, }) {
|
|
101
|
+
return (_jsx("button", { type: "button", onClick: onClick, disabled: disabled, title: title, className: `p-1.5 rounded transition-colors ${isActive
|
|
102
|
+
? 'bg-blue-100 text-blue-700'
|
|
103
|
+
: 'text-gray-600 hover:bg-gray-100 hover:text-gray-900'} ${disabled ? 'opacity-40 cursor-not-allowed' : ''}`, children: children }));
|
|
104
|
+
}
|
|
105
|
+
function Divider() {
|
|
106
|
+
return _jsx("div", { className: "w-px h-6 bg-gray-200 mx-1" });
|
|
107
|
+
}
|
|
108
|
+
function Toolbar({ editor, onOpenMediaPicker }) {
|
|
109
|
+
const addLink = () => {
|
|
110
|
+
const previousUrl = editor.getAttributes('link').href ?? '';
|
|
111
|
+
const url = window.prompt('Enter URL:', previousUrl);
|
|
112
|
+
if (url === null)
|
|
113
|
+
return;
|
|
114
|
+
if (url === '') {
|
|
115
|
+
editor.chain().focus().extendMarkRange('link').unsetLink().run();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();
|
|
119
|
+
};
|
|
120
|
+
const insertTable = () => {
|
|
121
|
+
editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();
|
|
122
|
+
};
|
|
123
|
+
const isInTable = editor.isActive('table');
|
|
124
|
+
return (_jsxs("div", { className: "border-b border-gray-200 bg-gray-50 p-2 flex items-center gap-0.5 flex-wrap sticky top-0 z-10", children: [_jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), isActive: editor.isActive('bold'), title: "Bold (Ctrl+B)", children: _jsx(Bold, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), isActive: editor.isActive('italic'), title: "Italic (Ctrl+I)", children: _jsx(Italic, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleUnderline().run(), isActive: editor.isActive('underline'), title: "Underline (Ctrl+U)", children: _jsx(Underline, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), isActive: editor.isActive('strike'), title: "Strikethrough", children: _jsx(Strikethrough, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), isActive: editor.isActive('code'), title: "Inline code", children: _jsx(Code, { className: "w-4 h-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), isActive: editor.isActive('heading', { level: 1 }), title: "Heading 1", children: _jsx(Heading1, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), isActive: editor.isActive('heading', { level: 2 }), title: "Heading 2", children: _jsx(Heading2, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), isActive: editor.isActive('heading', { level: 3 }), title: "Heading 3", children: _jsx(Heading3, { className: "w-4 h-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBulletList().run(), isActive: editor.isActive('bulletList'), title: "Bullet list", children: _jsx(List, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleOrderedList().run(), isActive: editor.isActive('orderedList'), title: "Ordered list", children: _jsx(ListOrdered, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBlockquote().run(), isActive: editor.isActive('blockquote'), title: "Blockquote", children: _jsx(Quote, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleCodeBlock().run(), isActive: editor.isActive('codeBlock'), title: "Code block", children: _jsx(FileCode, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setHorizontalRule().run(), title: "Horizontal rule", children: _jsx(Minus, { className: "w-4 h-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('left').run(), isActive: editor.isActive({ textAlign: 'left' }), title: "Align left", children: _jsx(AlignLeft, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('center').run(), isActive: editor.isActive({ textAlign: 'center' }), title: "Align center", children: _jsx(AlignCenter, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('right').run(), isActive: editor.isActive({ textAlign: 'right' }), title: "Align right", children: _jsx(AlignRight, { className: "w-4 h-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: addLink, isActive: editor.isActive('link'), title: "Insert link", children: _jsx(LinkIcon, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: onOpenMediaPicker, title: "Insert image", children: _jsx(ImageIcon, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: insertTable, title: "Insert table (3\u00D73)", children: _jsx(TableIcon, { className: "w-4 h-4" }) }), isInTable && (_jsxs(_Fragment, { children: [_jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addColumnBefore().run(), title: "Add column before", children: _jsx(Columns, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addColumnAfter().run(), title: "Add column after", children: _jsx(Columns, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteColumn().run(), title: "Delete column", children: _jsx(Columns, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addRowBefore().run(), title: "Add row before", children: _jsx(Rows, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addRowAfter().run(), title: "Add row after", children: _jsx(Rows, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteRow().run(), title: "Delete row", children: _jsx(Rows, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteTable().run(), title: "Delete table", children: _jsx(Trash2, { className: "w-4 h-4" }) })] })), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().undo().run(), disabled: !editor.can().undo(), title: "Undo", children: _jsx(Undo, { className: "w-4 h-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().redo().run(), disabled: !editor.can().redo(), title: "Redo", children: _jsx(Redo, { className: "w-4 h-4" }) })] }));
|
|
125
|
+
}
|
|
126
|
+
export function TipTapEditor({ content, onChange, placeholder, editable = true, className, }) {
|
|
127
|
+
const [mediaPickerOpen, setMediaPickerOpen] = useState(false);
|
|
128
|
+
const editor = useEditor({
|
|
129
|
+
extensions: [
|
|
130
|
+
StarterKit.configure({
|
|
131
|
+
codeBlock: false,
|
|
132
|
+
horizontalRule: false,
|
|
133
|
+
}),
|
|
134
|
+
UnderlineExt,
|
|
135
|
+
Link.configure({
|
|
136
|
+
openOnClick: false,
|
|
137
|
+
HTMLAttributes: { class: 'text-blue-600 underline' },
|
|
138
|
+
}),
|
|
139
|
+
Image.configure({
|
|
140
|
+
inline: true,
|
|
141
|
+
allowBase64: true,
|
|
142
|
+
}),
|
|
143
|
+
Table.configure({ resizable: true }),
|
|
144
|
+
TableRow,
|
|
145
|
+
TableHeader,
|
|
146
|
+
TableCell,
|
|
147
|
+
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
|
148
|
+
Placeholder.configure({
|
|
149
|
+
placeholder: placeholder || 'Start writing...',
|
|
150
|
+
}),
|
|
151
|
+
CodeBlockLowlight.configure({ lowlight }),
|
|
152
|
+
HorizontalRule,
|
|
153
|
+
],
|
|
154
|
+
content,
|
|
155
|
+
editable: editable !== false,
|
|
156
|
+
onUpdate: ({ editor: ed }) => {
|
|
157
|
+
onChange(ed.getHTML());
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
if (!editor)
|
|
161
|
+
return null;
|
|
162
|
+
const handleImageSelected = (url, alt) => {
|
|
163
|
+
editor.chain().focus().setImage({ src: url, alt: alt ?? '' }).run();
|
|
164
|
+
};
|
|
165
|
+
return (_jsxs("div", { className: `border border-gray-200 rounded-lg overflow-hidden bg-white ${className ?? ''}`, children: [editable && _jsx(Toolbar, { editor: editor, onOpenMediaPicker: () => setMediaPickerOpen(true) }), _jsx(EditorContent, { editor: editor }), _jsx("style", { dangerouslySetInnerHTML: { __html: editorStyles } }), _jsx(MediaPickerModal, { open: mediaPickerOpen, onClose: () => setMediaPickerOpen(false), onSelect: handleImageSelected, accept: "image/*" })] }));
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=TipTapEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TipTapEditor.js","sourceRoot":"","sources":["../../src/components/TipTapEditor.tsx"],"names":[],"mappings":"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"}
|