@jhits/plugin-blog 0.0.9 → 0.0.11

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 (276) hide show
  1. package/package.json +58 -59
  2. package/src/api/categories.ts +0 -43
  3. package/src/api/check-title.ts +0 -60
  4. package/src/api/config-handler.ts +0 -76
  5. package/src/api/handler.ts +0 -418
  6. package/src/api/index.ts +0 -33
  7. package/src/api/route.ts +0 -116
  8. package/src/api/router.ts +0 -128
  9. package/src/api-server.ts +0 -11
  10. package/src/config.ts +0 -161
  11. package/src/hooks/index.d.ts +0 -8
  12. package/src/hooks/index.d.ts.map +0 -1
  13. package/src/hooks/index.js +0 -7
  14. package/src/hooks/index.ts +0 -9
  15. package/src/hooks/useBlog.d.ts +0 -31
  16. package/src/hooks/useBlog.d.ts.map +0 -1
  17. package/src/hooks/useBlog.js +0 -57
  18. package/src/hooks/useBlog.ts +0 -85
  19. package/src/hooks/useBlogs.d.ts +0 -39
  20. package/src/hooks/useBlogs.d.ts.map +0 -1
  21. package/src/hooks/useBlogs.js +0 -82
  22. package/src/hooks/useBlogs.ts +0 -123
  23. package/src/hooks/useCategories.d.ts +0 -9
  24. package/src/hooks/useCategories.d.ts.map +0 -1
  25. package/src/hooks/useCategories.js +0 -70
  26. package/src/hooks/useCategories.ts +0 -76
  27. package/src/index.d.ts +0 -55
  28. package/src/index.d.ts.map +0 -1
  29. package/src/index.js +0 -228
  30. package/src/index.server.ts +0 -14
  31. package/src/index.tsx +0 -335
  32. package/src/init.d.ts +0 -40
  33. package/src/init.d.ts.map +0 -1
  34. package/src/init.js +0 -41
  35. package/src/init.tsx +0 -63
  36. package/src/lib/blocks/BlockRenderer.d.ts +0 -54
  37. package/src/lib/blocks/BlockRenderer.d.ts.map +0 -1
  38. package/src/lib/blocks/BlockRenderer.js +0 -54
  39. package/src/lib/blocks/BlockRenderer.tsx +0 -141
  40. package/src/lib/blocks/index.ts +0 -6
  41. package/src/lib/config-storage.d.ts +0 -30
  42. package/src/lib/config-storage.d.ts.map +0 -1
  43. package/src/lib/config-storage.js +0 -31
  44. package/src/lib/config-storage.ts +0 -65
  45. package/src/lib/index.ts +0 -9
  46. package/src/lib/layouts/blocks/ColumnsBlock.d.ts +0 -25
  47. package/src/lib/layouts/blocks/ColumnsBlock.d.ts.map +0 -1
  48. package/src/lib/layouts/blocks/ColumnsBlock.js +0 -182
  49. package/src/lib/layouts/blocks/ColumnsBlock.tsx +0 -298
  50. package/src/lib/layouts/blocks/ColumnsBlock.tsx.tmp +0 -81
  51. package/src/lib/layouts/blocks/SectionBlock.d.ts +0 -25
  52. package/src/lib/layouts/blocks/SectionBlock.d.ts.map +0 -1
  53. package/src/lib/layouts/blocks/SectionBlock.js +0 -44
  54. package/src/lib/layouts/blocks/SectionBlock.tsx +0 -104
  55. package/src/lib/layouts/blocks/index.ts +0 -8
  56. package/src/lib/layouts/index.d.ts +0 -23
  57. package/src/lib/layouts/index.d.ts.map +0 -1
  58. package/src/lib/layouts/index.js +0 -45
  59. package/src/lib/layouts/index.ts +0 -52
  60. package/src/lib/layouts/registerLayoutBlocks.d.ts +0 -9
  61. package/src/lib/layouts/registerLayoutBlocks.d.ts.map +0 -1
  62. package/src/lib/layouts/registerLayoutBlocks.js +0 -60
  63. package/src/lib/layouts/registerLayoutBlocks.ts +0 -64
  64. package/src/lib/mappers/apiMapper.d.ts +0 -66
  65. package/src/lib/mappers/apiMapper.d.ts.map +0 -1
  66. package/src/lib/mappers/apiMapper.js +0 -191
  67. package/src/lib/mappers/apiMapper.ts +0 -254
  68. package/src/lib/migration/index.ts +0 -6
  69. package/src/lib/migration/mapper.ts +0 -140
  70. package/src/lib/rich-text/RichTextEditor.d.ts +0 -45
  71. package/src/lib/rich-text/RichTextEditor.d.ts.map +0 -1
  72. package/src/lib/rich-text/RichTextEditor.js +0 -564
  73. package/src/lib/rich-text/RichTextEditor.tsx +0 -826
  74. package/src/lib/rich-text/RichTextPreview.d.ts +0 -16
  75. package/src/lib/rich-text/RichTextPreview.d.ts.map +0 -1
  76. package/src/lib/rich-text/RichTextPreview.js +0 -144
  77. package/src/lib/rich-text/RichTextPreview.tsx +0 -210
  78. package/src/lib/rich-text/index.d.ts +0 -9
  79. package/src/lib/rich-text/index.d.ts.map +0 -1
  80. package/src/lib/rich-text/index.js +0 -6
  81. package/src/lib/rich-text/index.ts +0 -10
  82. package/src/lib/utils/blockHelpers.d.ts +0 -23
  83. package/src/lib/utils/blockHelpers.d.ts.map +0 -1
  84. package/src/lib/utils/blockHelpers.js +0 -65
  85. package/src/lib/utils/blockHelpers.ts +0 -72
  86. package/src/lib/utils/configValidation.d.ts +0 -23
  87. package/src/lib/utils/configValidation.d.ts.map +0 -1
  88. package/src/lib/utils/configValidation.js +0 -113
  89. package/src/lib/utils/configValidation.ts +0 -137
  90. package/src/lib/utils/index.ts +0 -8
  91. package/src/lib/utils/slugify.ts +0 -79
  92. package/src/registry/BlockRegistry.d.ts +0 -62
  93. package/src/registry/BlockRegistry.d.ts.map +0 -1
  94. package/src/registry/BlockRegistry.js +0 -112
  95. package/src/registry/BlockRegistry.ts +0 -139
  96. package/src/registry/index.d.ts +0 -6
  97. package/src/registry/index.d.ts.map +0 -1
  98. package/src/registry/index.js +0 -4
  99. package/src/registry/index.ts +0 -11
  100. package/src/state/EditorContext.d.ts +0 -45
  101. package/src/state/EditorContext.d.ts.map +0 -1
  102. package/src/state/EditorContext.js +0 -215
  103. package/src/state/EditorContext.tsx +0 -283
  104. package/src/state/index.d.ts +0 -7
  105. package/src/state/index.d.ts.map +0 -1
  106. package/src/state/index.js +0 -6
  107. package/src/state/index.ts +0 -8
  108. package/src/state/reducer.d.ts +0 -11
  109. package/src/state/reducer.d.ts.map +0 -1
  110. package/src/state/reducer.js +0 -443
  111. package/src/state/reducer.ts +0 -694
  112. package/src/state/types.d.ts +0 -162
  113. package/src/state/types.d.ts.map +0 -1
  114. package/src/state/types.js +0 -27
  115. package/src/state/types.ts +0 -160
  116. package/src/types/block.d.ts +0 -221
  117. package/src/types/block.d.ts.map +0 -1
  118. package/src/types/block.js +0 -6
  119. package/src/types/block.ts +0 -269
  120. package/src/types/index.d.ts +0 -8
  121. package/src/types/index.d.ts.map +0 -1
  122. package/src/types/index.js +0 -5
  123. package/src/types/index.ts +0 -17
  124. package/src/types/post.d.ts +0 -136
  125. package/src/types/post.d.ts.map +0 -1
  126. package/src/types/post.js +0 -5
  127. package/src/types/post.ts +0 -169
  128. package/src/utils/client.d.ts +0 -48
  129. package/src/utils/client.d.ts.map +0 -1
  130. package/src/utils/client.js +0 -77
  131. package/src/utils/client.ts +0 -122
  132. package/src/utils/index.ts +0 -7
  133. package/src/views/CanvasEditor/BlockWrapper.d.ts +0 -16
  134. package/src/views/CanvasEditor/BlockWrapper.d.ts.map +0 -1
  135. package/src/views/CanvasEditor/BlockWrapper.js +0 -276
  136. package/src/views/CanvasEditor/BlockWrapper.tsx +0 -522
  137. package/src/views/CanvasEditor/CanvasEditorView.d.ts +0 -14
  138. package/src/views/CanvasEditor/CanvasEditorView.d.ts.map +0 -1
  139. package/src/views/CanvasEditor/CanvasEditorView.js +0 -209
  140. package/src/views/CanvasEditor/CanvasEditorView.tsx +0 -337
  141. package/src/views/CanvasEditor/EditorBody.d.ts +0 -22
  142. package/src/views/CanvasEditor/EditorBody.d.ts.map +0 -1
  143. package/src/views/CanvasEditor/EditorBody.js +0 -505
  144. package/src/views/CanvasEditor/EditorBody.tsx +0 -665
  145. package/src/views/CanvasEditor/EditorHeader.d.ts +0 -18
  146. package/src/views/CanvasEditor/EditorHeader.d.ts.map +0 -1
  147. package/src/views/CanvasEditor/EditorHeader.js +0 -101
  148. package/src/views/CanvasEditor/EditorHeader.tsx +0 -268
  149. package/src/views/CanvasEditor/LayoutContainer.d.ts +0 -17
  150. package/src/views/CanvasEditor/LayoutContainer.d.ts.map +0 -1
  151. package/src/views/CanvasEditor/LayoutContainer.js +0 -222
  152. package/src/views/CanvasEditor/LayoutContainer.tsx +0 -322
  153. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts +0 -13
  154. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts.map +0 -1
  155. package/src/views/CanvasEditor/SaveConfirmationModal.js +0 -78
  156. package/src/views/CanvasEditor/SaveConfirmationModal.tsx +0 -233
  157. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts +0 -14
  158. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts.map +0 -1
  159. package/src/views/CanvasEditor/components/CustomBlockItem.js +0 -44
  160. package/src/views/CanvasEditor/components/CustomBlockItem.tsx +0 -92
  161. package/src/views/CanvasEditor/components/EditorCanvas.d.ts +0 -29
  162. package/src/views/CanvasEditor/components/EditorCanvas.d.ts.map +0 -1
  163. package/src/views/CanvasEditor/components/EditorCanvas.js +0 -32
  164. package/src/views/CanvasEditor/components/EditorCanvas.tsx +0 -160
  165. package/src/views/CanvasEditor/components/EditorLibrary.d.ts +0 -7
  166. package/src/views/CanvasEditor/components/EditorLibrary.d.ts.map +0 -1
  167. package/src/views/CanvasEditor/components/EditorLibrary.js +0 -25
  168. package/src/views/CanvasEditor/components/EditorLibrary.tsx +0 -122
  169. package/src/views/CanvasEditor/components/EditorSidebar.d.ts +0 -13
  170. package/src/views/CanvasEditor/components/EditorSidebar.d.ts.map +0 -1
  171. package/src/views/CanvasEditor/components/EditorSidebar.js +0 -20
  172. package/src/views/CanvasEditor/components/EditorSidebar.tsx +0 -181
  173. package/src/views/CanvasEditor/components/ErrorBanner.d.ts +0 -6
  174. package/src/views/CanvasEditor/components/ErrorBanner.d.ts.map +0 -1
  175. package/src/views/CanvasEditor/components/ErrorBanner.js +0 -8
  176. package/src/views/CanvasEditor/components/ErrorBanner.tsx +0 -31
  177. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts +0 -25
  178. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +0 -1
  179. package/src/views/CanvasEditor/components/FeaturedMediaSection.js +0 -182
  180. package/src/views/CanvasEditor/components/FeaturedMediaSection.tsx +0 -341
  181. package/src/views/CanvasEditor/components/LibraryItem.d.ts +0 -14
  182. package/src/views/CanvasEditor/components/LibraryItem.d.ts.map +0 -1
  183. package/src/views/CanvasEditor/components/LibraryItem.js +0 -43
  184. package/src/views/CanvasEditor/components/LibraryItem.tsx +0 -80
  185. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts +0 -15
  186. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +0 -1
  187. package/src/views/CanvasEditor/components/PrivacySettingsSection.js +0 -63
  188. package/src/views/CanvasEditor/components/PrivacySettingsSection.tsx +0 -212
  189. package/src/views/CanvasEditor/components/index.d.ts +0 -21
  190. package/src/views/CanvasEditor/components/index.d.ts.map +0 -1
  191. package/src/views/CanvasEditor/components/index.js +0 -12
  192. package/src/views/CanvasEditor/components/index.ts +0 -28
  193. package/src/views/CanvasEditor/hooks/index.d.ts +0 -10
  194. package/src/views/CanvasEditor/hooks/index.d.ts.map +0 -1
  195. package/src/views/CanvasEditor/hooks/index.js +0 -9
  196. package/src/views/CanvasEditor/hooks/index.ts +0 -10
  197. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts +0 -8
  198. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +0 -1
  199. package/src/views/CanvasEditor/hooks/useHeroBlock.js +0 -79
  200. package/src/views/CanvasEditor/hooks/useHeroBlock.ts +0 -103
  201. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +0 -3
  202. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +0 -1
  203. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.js +0 -114
  204. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.ts +0 -142
  205. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts +0 -5
  206. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts.map +0 -1
  207. package/src/views/CanvasEditor/hooks/usePostLoader.js +0 -32
  208. package/src/views/CanvasEditor/hooks/usePostLoader.ts +0 -39
  209. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +0 -2
  210. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +0 -1
  211. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.js +0 -47
  212. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.ts +0 -55
  213. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts +0 -25
  214. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts.map +0 -1
  215. package/src/views/CanvasEditor/hooks/useUnsavedChanges.js +0 -285
  216. package/src/views/CanvasEditor/hooks/useUnsavedChanges.ts +0 -339
  217. package/src/views/CanvasEditor/index.d.ts +0 -16
  218. package/src/views/CanvasEditor/index.d.ts.map +0 -1
  219. package/src/views/CanvasEditor/index.js +0 -9
  220. package/src/views/CanvasEditor/index.ts +0 -16
  221. package/src/views/PostManager/EmptyState.d.ts +0 -10
  222. package/src/views/PostManager/EmptyState.d.ts.map +0 -1
  223. package/src/views/PostManager/EmptyState.js +0 -12
  224. package/src/views/PostManager/EmptyState.tsx +0 -42
  225. package/src/views/PostManager/PostActionsMenu.d.ts +0 -12
  226. package/src/views/PostManager/PostActionsMenu.d.ts.map +0 -1
  227. package/src/views/PostManager/PostActionsMenu.js +0 -58
  228. package/src/views/PostManager/PostActionsMenu.tsx +0 -112
  229. package/src/views/PostManager/PostCards.d.ts +0 -15
  230. package/src/views/PostManager/PostCards.d.ts.map +0 -1
  231. package/src/views/PostManager/PostCards.js +0 -79
  232. package/src/views/PostManager/PostCards.tsx +0 -197
  233. package/src/views/PostManager/PostFilters.d.ts +0 -16
  234. package/src/views/PostManager/PostFilters.d.ts.map +0 -1
  235. package/src/views/PostManager/PostFilters.js +0 -10
  236. package/src/views/PostManager/PostFilters.tsx +0 -95
  237. package/src/views/PostManager/PostManagerView.d.ts +0 -11
  238. package/src/views/PostManager/PostManagerView.d.ts.map +0 -1
  239. package/src/views/PostManager/PostManagerView.js +0 -174
  240. package/src/views/PostManager/PostManagerView.tsx +0 -289
  241. package/src/views/PostManager/PostStats.d.ts +0 -11
  242. package/src/views/PostManager/PostStats.d.ts.map +0 -1
  243. package/src/views/PostManager/PostStats.js +0 -46
  244. package/src/views/PostManager/PostStats.tsx +0 -81
  245. package/src/views/PostManager/PostTable.d.ts +0 -15
  246. package/src/views/PostManager/PostTable.d.ts.map +0 -1
  247. package/src/views/PostManager/PostTable.js +0 -79
  248. package/src/views/PostManager/PostTable.tsx +0 -230
  249. package/src/views/PostManager/index.d.ts +0 -12
  250. package/src/views/PostManager/index.d.ts.map +0 -1
  251. package/src/views/PostManager/index.js +0 -11
  252. package/src/views/PostManager/index.ts +0 -15
  253. package/src/views/Preview/PreviewBridgeView.d.ts +0 -12
  254. package/src/views/Preview/PreviewBridgeView.d.ts.map +0 -1
  255. package/src/views/Preview/PreviewBridgeView.js +0 -11
  256. package/src/views/Preview/PreviewBridgeView.tsx +0 -64
  257. package/src/views/Preview/index.d.ts +0 -6
  258. package/src/views/Preview/index.d.ts.map +0 -1
  259. package/src/views/Preview/index.js +0 -4
  260. package/src/views/Preview/index.ts +0 -7
  261. package/src/views/Settings/SettingsView.d.ts +0 -10
  262. package/src/views/Settings/SettingsView.d.ts.map +0 -1
  263. package/src/views/Settings/SettingsView.js +0 -111
  264. package/src/views/Settings/SettingsView.tsx +0 -298
  265. package/src/views/Settings/index.d.ts +0 -6
  266. package/src/views/Settings/index.d.ts.map +0 -1
  267. package/src/views/Settings/index.js +0 -4
  268. package/src/views/Settings/index.ts +0 -7
  269. package/src/views/SlugSEO/SlugSEOManagerView.d.ts +0 -12
  270. package/src/views/SlugSEO/SlugSEOManagerView.d.ts.map +0 -1
  271. package/src/views/SlugSEO/SlugSEOManagerView.js +0 -11
  272. package/src/views/SlugSEO/SlugSEOManagerView.tsx +0 -94
  273. package/src/views/SlugSEO/index.d.ts +0 -6
  274. package/src/views/SlugSEO/index.d.ts.map +0 -1
  275. package/src/views/SlugSEO/index.js +0 -4
  276. package/src/views/SlugSEO/index.ts +0 -7
@@ -1,230 +0,0 @@
1
- /**
2
- * Post Table Component
3
- * Professional table layout for displaying posts
4
- */
5
-
6
- 'use client';
7
-
8
- import React, { useState, useEffect } from 'react';
9
- import { Calendar, User, UserCheck } from 'lucide-react';
10
- import { Image } from '@jhits/plugin-images';
11
- import { PostListItem, PostStatus } from '../../types/post';
12
- import { PostActionsMenu } from './PostActionsMenu';
13
- import { useSession } from 'next-auth/react';
14
-
15
- export interface PostTableProps {
16
- posts: PostListItem[];
17
- locale: string;
18
- onEdit: (postId: string) => void;
19
- onPreview: (postId: string) => void;
20
- onDuplicate: (postId: string) => void;
21
- onDelete: (postId: string) => void;
22
- }
23
-
24
- function getStatusBadgeColor(status: PostStatus) {
25
- switch (status) {
26
- case 'published':
27
- return 'bg-green-500/10 text-green-700 dark:text-green-400 border-green-500/20';
28
- case 'draft':
29
- return 'bg-amber-500/10 text-amber-700 dark:text-amber-400 border-amber-500/20';
30
- case 'scheduled':
31
- return 'bg-blue-500/10 text-blue-700 dark:text-blue-400 border-blue-500/20';
32
- case 'archived':
33
- return 'bg-neutral-500/10 text-neutral-700 dark:text-neutral-400 border-neutral-500/20';
34
- default:
35
- return 'bg-neutral-500/10 text-neutral-700 dark:text-neutral-400 border-neutral-500/20';
36
- }
37
- }
38
-
39
- function formatDate(dateString: string | undefined, locale: string) {
40
- if (!dateString) return 'No date';
41
- return new Date(dateString).toLocaleDateString(locale, {
42
- day: 'numeric',
43
- month: 'short',
44
- year: 'numeric',
45
- });
46
- }
47
-
48
- export function PostTable({
49
- posts,
50
- locale,
51
- onEdit,
52
- onPreview,
53
- onDuplicate,
54
- onDelete,
55
- }: PostTableProps) {
56
- const { data: session, status: sessionStatus } = useSession();
57
- const currentUserId = (session?.user as any)?.id;
58
- const [userMap, setUserMap] = useState<Record<string, string>>({});
59
-
60
- // Helper function to check if user is the owner
61
- const isPostOwner = (post: PostListItem): boolean => {
62
- if (sessionStatus === 'loading') return false; // Don't show actions while loading
63
- if (!currentUserId || !post.authorId) return false;
64
- // Convert both to strings for comparison to handle ObjectId vs string
65
- return String(currentUserId) === String(post.authorId);
66
- };
67
-
68
- // Fetch users to map IDs to names
69
- useEffect(() => {
70
- const fetchUsers = async () => {
71
- try {
72
- const response = await fetch('/api/users');
73
- const users = await response.json();
74
- if (Array.isArray(users)) {
75
- const map: Record<string, string> = {};
76
- users.forEach((user: { _id: string; name?: string; email?: string }) => {
77
- const id = user._id?.toString();
78
- if (id) {
79
- map[id] = user.name || user.email || 'Unknown';
80
- }
81
- });
82
- setUserMap(map);
83
- }
84
- } catch (error) {
85
- console.error('Failed to fetch users:', error);
86
- }
87
- };
88
- fetchUsers();
89
- }, []);
90
-
91
- const getAuthorName = (authorId?: string) => {
92
- if (!authorId) return 'Unknown';
93
- return userMap[authorId] || authorId;
94
- };
95
-
96
- return (
97
- <div className="bg-neutral-100 dark:bg-neutral-800/50 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700 overflow-hidden">
98
- <div className="overflow-x-auto">
99
- <table className="w-full">
100
- <thead className="bg-neutral-200 dark:bg-neutral-900/50 border-b border-neutral-300 dark:border-neutral-700">
101
- <tr>
102
- <th className="px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
103
- Post
104
- </th>
105
- <th className="px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
106
- Author
107
- </th>
108
- <th className="px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
109
- Category
110
- </th>
111
- <th className="px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
112
- Status
113
- </th>
114
- <th className="px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
115
- Last Modified
116
- </th>
117
- <th className="px-6 py-4 text-right text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
118
- Actions
119
- </th>
120
- </tr>
121
- </thead>
122
- <tbody className="divide-y divide-neutral-300 dark:divide-neutral-700">
123
- {posts.map((post) => (
124
- <tr
125
- key={post.id}
126
- className="hover:bg-white dark:hover:bg-neutral-900/50 transition-colors cursor-pointer"
127
- >
128
- {/* Featured Image & Title */}
129
- <td className="px-6 py-4">
130
- <div className="flex items-center gap-4">
131
- {post.featuredImage ? (
132
- <div className="w-16 h-16 rounded-xl bg-neutral-200 dark:bg-neutral-700 overflow-hidden flex-shrink-0 relative">
133
- <Image
134
- id={post.featuredImage}
135
- alt={post.title}
136
- fill
137
- editable={false}
138
- className="w-full h-full object-cover"
139
- />
140
- </div>
141
- ) : (
142
- <div className="w-16 h-16 rounded-xl bg-neutral-200 dark:bg-neutral-700 flex items-center justify-center flex-shrink-0">
143
- <span className="text-xs text-neutral-400">No Image</span>
144
- </div>
145
- )}
146
- <div className="min-w-0 flex-1">
147
- <button
148
- onClick={() => onEdit(post.id)}
149
- className="text-left w-full hover:cursor-pointer p-0 m-0 border-0 bg-transparent"
150
- >
151
- <h3 className="font-bold hover:underline text-neutral-950 dark:text-white mb-1 line-clamp-1 text-left">
152
- {post.title.trim()}
153
- </h3>
154
- </button>
155
- <p className="text-xs text-neutral-500 dark:text-neutral-400 font-mono text-left">
156
- /{post.slug}
157
- </p>
158
- </div>
159
- </div>
160
- </td>
161
-
162
- {/* Author */}
163
- <td className="px-6 py-4">
164
- <div className="flex items-center gap-2">
165
- {isPostOwner(post) ? (
166
- <UserCheck size={14} className="text-primary" />
167
- ) : (
168
- <User size={14} className="text-neutral-400" />
169
- )}
170
- <span className={`text-sm ${isPostOwner(post) ? 'text-primary font-semibold' : 'text-neutral-600 dark:text-neutral-400'}`}>
171
- {getAuthorName(post.authorId)}
172
- {isPostOwner(post) && (
173
- <span className="ml-2 text-xs text-primary/70">(Jij)</span>
174
- )}
175
- </span>
176
- </div>
177
- </td>
178
-
179
- {/* Category */}
180
- <td className="px-6 py-4">
181
- <span className="text-sm text-neutral-600 dark:text-neutral-400">
182
- {post.category || 'Uncategorized'}
183
- </span>
184
- </td>
185
-
186
- {/* Status Badge */}
187
- <td className="px-6 py-4">
188
- <span
189
- className={`inline-flex items-center px-3 py-1 rounded-full text-[10px] font-black uppercase tracking-wider border ${getStatusBadgeColor(post.status)}`}
190
- >
191
- {post.status}
192
- </span>
193
- </td>
194
-
195
- {/* Last Modified */}
196
- <td className="px-6 py-4">
197
- <div className="flex items-center gap-2">
198
- <Calendar size={14} className="text-neutral-400" />
199
- <span className="text-sm text-neutral-600 dark:text-neutral-400">
200
- {formatDate(post.updatedAt, locale)}
201
- </span>
202
- </div>
203
- </td>
204
-
205
- {/* Actions Menu - Only show for own posts */}
206
- <td className="px-6 py-4">
207
- {isPostOwner(post) ? (
208
- <div className="flex items-center justify-end">
209
- <PostActionsMenu
210
- onEdit={() => onEdit(post.id)}
211
- onPreview={() => onPreview(post.id)}
212
- onDuplicate={() => onDuplicate(post.id)}
213
- onDelete={() => onDelete(post.id)}
214
- />
215
- </div>
216
- ) : (
217
- <div className="flex items-center justify-end text-neutral-400 text-xs">
218
- Alleen auteur
219
- </div>
220
- )}
221
- </td>
222
- </tr>
223
- ))}
224
- </tbody>
225
- </table>
226
- </div>
227
- </div>
228
- );
229
- }
230
-
@@ -1,12 +0,0 @@
1
- /**
2
- * Post Manager View Exports
3
- */
4
- export { PostManagerView } from './PostManagerView';
5
- export type { PostManagerViewProps } from './PostManagerView';
6
- export { PostStats } from './PostStats';
7
- export { PostFilters } from './PostFilters';
8
- export { PostTable } from './PostTable';
9
- export { PostCards } from './PostCards';
10
- export { EmptyState } from './EmptyState';
11
- export { PostActionsMenu } from './PostActionsMenu';
12
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Post Manager View Exports
3
- */
4
- export { PostManagerView } from './PostManagerView';
5
- // Sub-components (for potential reuse)
6
- export { PostStats } from './PostStats';
7
- export { PostFilters } from './PostFilters';
8
- export { PostTable } from './PostTable';
9
- export { PostCards } from './PostCards';
10
- export { EmptyState } from './EmptyState';
11
- export { PostActionsMenu } from './PostActionsMenu';
@@ -1,15 +0,0 @@
1
- /**
2
- * Post Manager View Exports
3
- */
4
-
5
- export { PostManagerView } from './PostManagerView';
6
- export type { PostManagerViewProps } from './PostManagerView';
7
-
8
- // Sub-components (for potential reuse)
9
- export { PostStats } from './PostStats';
10
- export { PostFilters } from './PostFilters';
11
- export { PostTable } from './PostTable';
12
- export { PostCards } from './PostCards';
13
- export { EmptyState } from './EmptyState';
14
- export { PostActionsMenu } from './PostActionsMenu';
15
-
@@ -1,12 +0,0 @@
1
- /**
2
- * Preview Bridge View
3
- * Live preview of blog post
4
- * Follows dashboard earth-tone design system
5
- */
6
- export interface PreviewBridgeViewProps {
7
- postId?: string;
8
- siteId: string;
9
- locale: string;
10
- }
11
- export declare function PreviewBridgeView({ postId, siteId, locale }: PreviewBridgeViewProps): import("react/jsx-runtime").JSX.Element;
12
- //# sourceMappingURL=PreviewBridgeView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreviewBridgeView.d.ts","sourceRoot":"","sources":["PreviewBridgeView.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,2CA6CnF"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Preview Bridge View
3
- * Live preview of blog post
4
- * Follows dashboard earth-tone design system
5
- */
6
- 'use client';
7
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
- import { ExternalLink, RefreshCw } from 'lucide-react';
9
- export function PreviewBridgeView({ postId, siteId, locale }) {
10
- return (_jsxs("div", { className: "h-full w-full bg-white dark:bg-neutral-900 flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between p-6 border-b border-neutral-300 dark:border-neutral-700 bg-neutral-100 dark:bg-neutral-800/50", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-black text-neutral-950 dark:text-white uppercase tracking-tighter", children: "Preview" }), _jsx("p", { className: "text-xs text-neutral-500 dark:text-neutral-400", children: postId ? `Previewing post: ${postId}` : 'Live preview of your post' })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("button", { className: "inline-flex items-center gap-2 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-full text-[10px] font-black uppercase tracking-widest hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-all", children: [_jsx(RefreshCw, { size: 14 }), "Refresh"] }), _jsxs("button", { className: "inline-flex items-center gap-2 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-full text-[10px] font-black uppercase tracking-widest hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-all", children: [_jsx(ExternalLink, { size: 14 }), "Open in New Tab"] })] })] }), _jsx("div", { className: "flex-1 overflow-hidden bg-neutral-100 dark:bg-neutral-800/30", children: _jsx("div", { className: "h-full w-full p-8", children: _jsx("div", { className: "h-full w-full bg-white dark:bg-neutral-900 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700 overflow-hidden", children: _jsx("div", { className: "h-full w-full flex items-center justify-center", children: _jsxs("div", { className: "text-center", children: [_jsx("p", { className: "text-sm text-neutral-500 dark:text-neutral-400 mb-2", children: "Preview will be rendered here" }), _jsx("p", { className: "text-xs text-neutral-400", children: "Using iframe or side-by-side panel" })] }) }) }) }) })] }));
11
- }
@@ -1,64 +0,0 @@
1
- /**
2
- * Preview Bridge View
3
- * Live preview of blog post
4
- * Follows dashboard earth-tone design system
5
- */
6
-
7
- 'use client';
8
-
9
- import React from 'react';
10
- import { ExternalLink, RefreshCw } from 'lucide-react';
11
-
12
- export interface PreviewBridgeViewProps {
13
- postId?: string;
14
- siteId: string;
15
- locale: string;
16
- }
17
-
18
- export function PreviewBridgeView({ postId, siteId, locale }: PreviewBridgeViewProps) {
19
- return (
20
- <div className="h-full w-full bg-white dark:bg-neutral-900 flex flex-col">
21
- {/* Header */}
22
- <div className="flex items-center justify-between p-6 border-b border-neutral-300 dark:border-neutral-700 bg-neutral-100 dark:bg-neutral-800/50">
23
- <div>
24
- <h1 className="text-xl font-black text-neutral-950 dark:text-white uppercase tracking-tighter">
25
- Preview
26
- </h1>
27
- <p className="text-xs text-neutral-500 dark:text-neutral-400">
28
- {postId ? `Previewing post: ${postId}` : 'Live preview of your post'}
29
- </p>
30
- </div>
31
-
32
- <div className="flex items-center gap-3">
33
- <button className="inline-flex items-center gap-2 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-full text-[10px] font-black uppercase tracking-widest hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-all">
34
- <RefreshCw size={14} />
35
- Refresh
36
- </button>
37
- <button className="inline-flex items-center gap-2 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-full text-[10px] font-black uppercase tracking-widest hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-all">
38
- <ExternalLink size={14} />
39
- Open in New Tab
40
- </button>
41
- </div>
42
- </div>
43
-
44
- {/* Preview Container */}
45
- <div className="flex-1 overflow-hidden bg-neutral-100 dark:bg-neutral-800/30">
46
- <div className="h-full w-full p-8">
47
- <div className="h-full w-full bg-white dark:bg-neutral-900 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700 overflow-hidden">
48
- <div className="h-full w-full flex items-center justify-center">
49
- <div className="text-center">
50
- <p className="text-sm text-neutral-500 dark:text-neutral-400 mb-2">
51
- Preview will be rendered here
52
- </p>
53
- <p className="text-xs text-neutral-400">
54
- Using iframe or side-by-side panel
55
- </p>
56
- </div>
57
- </div>
58
- </div>
59
- </div>
60
- </div>
61
- </div>
62
- );
63
- }
64
-
@@ -1,6 +0,0 @@
1
- /**
2
- * Preview Bridge View Exports
3
- */
4
- export { PreviewBridgeView } from './PreviewBridgeView';
5
- export type { PreviewBridgeViewProps } from './PreviewBridgeView';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Preview Bridge View Exports
3
- */
4
- export { PreviewBridgeView } from './PreviewBridgeView';
@@ -1,7 +0,0 @@
1
- /**
2
- * Preview Bridge View Exports
3
- */
4
-
5
- export { PreviewBridgeView } from './PreviewBridgeView';
6
- export type { PreviewBridgeViewProps } from './PreviewBridgeView';
7
-
@@ -1,10 +0,0 @@
1
- /**
2
- * Settings View - Development/Installation Screen
3
- * Allows manual configuration of plugin settings (darkMode, backgroundColors)
4
- */
5
- export interface SettingsViewProps {
6
- siteId: string;
7
- locale: string;
8
- }
9
- export declare function SettingsView({ siteId, locale }: SettingsViewProps): import("react/jsx-runtime").JSX.Element;
10
- //# sourceMappingURL=SettingsView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingsView.d.ts","sourceRoot":"","sources":["SettingsView.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAyRjE"}
@@ -1,111 +0,0 @@
1
- /**
2
- * Settings View - Development/Installation Screen
3
- * Allows manual configuration of plugin settings (darkMode, backgroundColors)
4
- */
5
- 'use client';
6
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
- import { useState, useEffect } from 'react';
8
- import { Save, RotateCcw, Palette, Moon, Sun } from 'lucide-react';
9
- export function SettingsView({ siteId, locale }) {
10
- // Get current config from window global
11
- const getCurrentConfig = () => {
12
- var _a, _b;
13
- if (typeof window !== 'undefined' && window.__JHITS_PLUGIN_PROPS__) {
14
- const pluginProps = window.__JHITS_PLUGIN_PROPS__['plugin-blog'];
15
- return {
16
- darkMode: (_a = pluginProps === null || pluginProps === void 0 ? void 0 : pluginProps.darkMode) !== null && _a !== void 0 ? _a : true,
17
- backgroundColors: (_b = pluginProps === null || pluginProps === void 0 ? void 0 : pluginProps.backgroundColors) !== null && _b !== void 0 ? _b : {
18
- light: '#ffffff',
19
- dark: '#171717',
20
- },
21
- };
22
- }
23
- return {
24
- darkMode: true,
25
- backgroundColors: {
26
- light: '#ffffff',
27
- dark: '#171717',
28
- },
29
- };
30
- };
31
- const [darkMode, setDarkMode] = useState(getCurrentConfig().darkMode);
32
- const [lightBg, setLightBg] = useState(getCurrentConfig().backgroundColors.light);
33
- const [darkBg, setDarkBg] = useState(getCurrentConfig().backgroundColors.dark || '#171717');
34
- const [hasChanges, setHasChanges] = useState(false);
35
- const [saved, setSaved] = useState(false);
36
- // Check for changes
37
- useEffect(() => {
38
- const current = getCurrentConfig();
39
- const hasChanges = darkMode !== current.darkMode ||
40
- lightBg !== current.backgroundColors.light ||
41
- darkBg !== (current.backgroundColors.dark || '#171717');
42
- setHasChanges(hasChanges);
43
- setSaved(false);
44
- }, [darkMode, lightBg, darkBg]);
45
- // Save configuration
46
- const handleSave = () => {
47
- if (typeof window === 'undefined')
48
- return;
49
- // Initialize window global if needed
50
- if (!window.__JHITS_PLUGIN_PROPS__) {
51
- window.__JHITS_PLUGIN_PROPS__ = {};
52
- }
53
- // Update configuration
54
- window.__JHITS_PLUGIN_PROPS__['plugin-blog'] = Object.assign(Object.assign({}, (window.__JHITS_PLUGIN_PROPS__['plugin-blog'] || {})), { darkMode, backgroundColors: {
55
- light: lightBg,
56
- dark: darkBg,
57
- } });
58
- // Also save to localStorage for persistence
59
- try {
60
- localStorage.setItem('__JHITS_PLUGIN_BLOG_CONFIG__', JSON.stringify({
61
- darkMode,
62
- backgroundColors: {
63
- light: lightBg,
64
- dark: darkBg,
65
- },
66
- }));
67
- }
68
- catch (e) {
69
- console.warn('[SettingsView] Failed to save to localStorage:', e);
70
- }
71
- setSaved(true);
72
- setTimeout(() => setSaved(false), 2000);
73
- // Trigger a custom event to notify other components
74
- window.dispatchEvent(new CustomEvent('blog-plugin-config-updated', {
75
- detail: { darkMode, backgroundColors: { light: lightBg, dark: darkBg } }
76
- }));
77
- console.log('[SettingsView] Configuration saved:', {
78
- darkMode,
79
- backgroundColors: { light: lightBg, dark: darkBg },
80
- });
81
- };
82
- // Reset to defaults
83
- const handleReset = () => {
84
- setDarkMode(true);
85
- setLightBg('#ffffff');
86
- setDarkBg('#171717');
87
- };
88
- // Load from localStorage on mount
89
- useEffect(() => {
90
- var _a, _b, _c, _d, _e;
91
- try {
92
- const saved = localStorage.getItem('__JHITS_PLUGIN_BLOG_CONFIG__');
93
- if (saved) {
94
- const config = JSON.parse(saved);
95
- setDarkMode((_a = config.darkMode) !== null && _a !== void 0 ? _a : true);
96
- setLightBg((_c = (_b = config.backgroundColors) === null || _b === void 0 ? void 0 : _b.light) !== null && _c !== void 0 ? _c : '#ffffff');
97
- setDarkBg((_e = (_d = config.backgroundColors) === null || _d === void 0 ? void 0 : _d.dark) !== null && _e !== void 0 ? _e : '#171717');
98
- }
99
- }
100
- catch (e) {
101
- console.warn('[SettingsView] Failed to load from localStorage:', e);
102
- }
103
- }, []);
104
- return (_jsx("div", { className: "min-h-screen bg-neutral-50 dark:bg-neutral-900 p-8", children: _jsxs("div", { className: "max-w-4xl mx-auto", children: [_jsxs("div", { className: "mb-8", children: [_jsx("h1", { className: "text-4xl font-black uppercase tracking-tighter text-neutral-950 dark:text-white mb-2", children: "Blog Plugin Settings" }), _jsx("p", { className: "text-sm text-neutral-600 dark:text-neutral-400", children: "Configure editor appearance and behavior. Changes are applied immediately." })] }), _jsxs("div", { className: "bg-white dark:bg-neutral-800 rounded-[2.5rem] border border-neutral-200 dark:border-neutral-700 shadow-lg p-8", children: [_jsx("div", { className: "mb-8 pb-8 border-b border-neutral-200 dark:border-neutral-700", children: _jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [darkMode ? (_jsx(Moon, { className: "size-5 text-neutral-600 dark:text-neutral-400" })) : (_jsx(Sun, { className: "size-5 text-neutral-600 dark:text-neutral-400" })), _jsxs("div", { children: [_jsx("label", { className: "text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Dark Mode" }), _jsx("p", { className: "text-xs text-neutral-500 dark:text-neutral-500 mt-1", children: "Enable dark mode for editor content area and wrappers" })] })] }), _jsx("button", { onClick: () => setDarkMode(!darkMode), className: `relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${darkMode
105
- ? 'bg-primary'
106
- : 'bg-neutral-300 dark:bg-neutral-600'}`, children: _jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${darkMode ? 'translate-x-6' : 'translate-x-1'}` }) })] }) }), _jsxs("div", { className: "mb-8", children: [_jsxs("div", { className: "flex items-center gap-3 mb-6", children: [_jsx(Palette, { className: "size-5 text-neutral-600 dark:text-neutral-400" }), _jsxs("div", { children: [_jsx("label", { className: "text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Background Colors" }), _jsx("p", { className: "text-xs text-neutral-500 dark:text-neutral-500 mt-1", children: "Set custom background colors for the editor canvas" })] })] }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsxs("label", { className: "block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-2", children: ["Light Mode Background ", _jsx("span", { className: "text-red-500", children: "*" })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("input", { type: "text", value: lightBg, onChange: (e) => setLightBg(e.target.value), placeholder: "#ffffff", className: "flex-1 bg-dashboard-card border border-dashboard-border p-4 rounded-2xl text-sm font-bold outline-none focus:border-primary transition-all text-dashboard-text" }), _jsx("div", { className: "w-16 h-16 rounded-xl border-2 border-neutral-200 dark:border-neutral-700", style: { backgroundColor: lightBg } })] }), _jsx("p", { className: "text-xs text-neutral-400 dark:text-neutral-600 mt-1", children: "CSS color value (hex, rgb, or named color)" })] }), _jsxs("div", { children: [_jsxs("label", { className: "block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-2", children: ["Dark Mode Background ", _jsx("span", { className: "text-neutral-400", children: "(Optional)" })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("input", { type: "text", value: darkBg, onChange: (e) => setDarkBg(e.target.value), placeholder: "#171717", disabled: !darkMode, className: `flex-1 bg-white dark:bg-neutral-900/50 border border-neutral-300 dark:border-neutral-700 p-4 rounded-2xl text-sm font-bold outline-none focus:border-primary transition-all dark:text-neutral-100 ${!darkMode ? 'opacity-50 cursor-not-allowed' : ''}` }), _jsx("div", { className: `w-16 h-16 rounded-xl border-2 border-neutral-200 dark:border-neutral-700 ${!darkMode ? 'opacity-50' : ''}`, style: { backgroundColor: darkBg } })] }), _jsx("p", { className: "text-xs text-neutral-400 dark:text-neutral-600 mt-1", children: "Only used when dark mode is enabled" })] })] })] }), _jsxs("div", { className: "mb-8 p-6 bg-neutral-50 dark:bg-neutral-900/50 rounded-2xl border border-neutral-200 dark:border-neutral-700", children: [_jsx("label", { className: "block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-3", children: "Preview" }), _jsx("div", { className: "h-32 rounded-xl border-2 border-dashed border-neutral-300 dark:border-neutral-700 flex items-center justify-center", style: {
107
- backgroundColor: darkMode ? darkBg : lightBg,
108
- }, children: _jsx("span", { className: "text-xs font-bold uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Editor Canvas Preview" }) })] }), _jsxs("div", { className: "flex items-center justify-between pt-6 border-t border-neutral-200 dark:border-neutral-700", children: [_jsxs("button", { onClick: handleReset, className: "px-6 py-3 rounded-full border border-neutral-300 dark:border-neutral-700 bg-white dark:bg-neutral-900/50 text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400 hover:bg-neutral-50 dark:hover:bg-neutral-800 transition-colors flex items-center gap-2", children: [_jsx(RotateCcw, { className: "size-4" }), "Reset"] }), _jsxs("button", { onClick: handleSave, disabled: !hasChanges, className: `px-6 py-3 rounded-full text-sm font-black uppercase tracking-widest transition-all flex items-center gap-2 ${hasChanges
109
- ? 'bg-primary text-white hover:bg-primary/90 shadow-lg shadow-primary/20'
110
- : 'bg-neutral-200 dark:bg-neutral-700 text-neutral-400 dark:text-neutral-600 cursor-not-allowed'}`, children: [_jsx(Save, { className: "size-4" }), saved ? 'Saved!' : 'Save Changes'] })] })] }), _jsxs("div", { className: "mt-6 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-2xl p-6", children: [_jsx("h3", { className: "text-sm font-black uppercase tracking-widest text-blue-900 dark:text-blue-300 mb-2", children: "How It Works" }), _jsxs("ul", { className: "text-xs text-blue-800 dark:text-blue-400 space-y-1 list-disc list-inside", children: [_jsxs("li", { children: ["Changes are saved to ", _jsx("code", { className: "bg-blue-100 dark:bg-blue-900/50 px-1 rounded", children: "window.__JHITS_PLUGIN_PROPS__" }), " and localStorage"] }), _jsx("li", { children: "Configuration persists across page refreshes" }), _jsx("li", { children: "To apply changes in the editor, navigate to a post editor page" }), _jsx("li", { children: "For production, configure these settings in your client app's blog config file" })] })] })] }) }));
111
- }