@jhits/plugin-images 0.0.14 → 0.0.15
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/components/Image.d.ts +1 -6
- package/dist/components/Image.d.ts.map +1 -1
- package/dist/components/Image.js +86 -202
- package/dist/components/ImageEditor.d.ts.map +1 -1
- package/dist/components/ImageEditor.js +21 -125
- package/dist/components/ImagePicker.d.ts.map +1 -1
- package/dist/components/ImagePicker.js +6 -59
- package/dist/utils/fallback.d.ts +9 -4
- package/dist/utils/fallback.d.ts.map +1 -1
- package/dist/utils/fallback.js +40 -12
- package/dist/utils/transforms.d.ts.map +1 -1
- package/dist/utils/transforms.js +7 -10
- package/dist/views/ImageManager/components/CleanupLibraryModal.d.ts +12 -0
- package/dist/views/ImageManager/components/CleanupLibraryModal.d.ts.map +1 -0
- package/dist/views/ImageManager/components/CleanupLibraryModal.js +7 -0
- package/dist/views/ImageManager/components/DeleteImageModal.d.ts +15 -0
- package/dist/views/ImageManager/components/DeleteImageModal.d.ts.map +1 -0
- package/dist/views/ImageManager/components/DeleteImageModal.js +8 -0
- package/dist/views/ImageManager/components/ImageGrid.d.ts +12 -0
- package/dist/views/ImageManager/components/ImageGrid.d.ts.map +1 -0
- package/dist/views/ImageManager/components/ImageGrid.js +15 -0
- package/dist/views/ImageManager/components/ImageManagerHeader.d.ts +11 -0
- package/dist/views/ImageManager/components/ImageManagerHeader.d.ts.map +1 -0
- package/dist/views/ImageManager/components/ImageManagerHeader.js +6 -0
- package/dist/views/ImageManager/components/ImageManagerStats.d.ts +8 -0
- package/dist/views/ImageManager/components/ImageManagerStats.d.ts.map +1 -0
- package/dist/views/ImageManager/components/ImageManagerStats.js +6 -0
- package/dist/views/ImageManager/components/ImageManagerToolbar.d.ts +9 -0
- package/dist/views/ImageManager/components/ImageManagerToolbar.d.ts.map +1 -0
- package/dist/views/ImageManager/components/ImageManagerToolbar.js +10 -0
- package/dist/views/ImageManager/components/ImageTable.d.ts +13 -0
- package/dist/views/ImageManager/components/ImageTable.d.ts.map +1 -0
- package/dist/views/ImageManager/components/ImageTable.js +13 -0
- package/dist/views/ImageManager/types.d.ts +26 -0
- package/dist/views/ImageManager/types.d.ts.map +1 -0
- package/dist/views/ImageManager/types.js +1 -0
- package/dist/views/ImageManager.d.ts +1 -1
- package/dist/views/ImageManager.d.ts.map +1 -1
- package/dist/views/ImageManager.js +28 -52
- package/package.json +10 -9
- package/src/components/Image.tsx +107 -262
- package/src/components/ImageEditor.tsx +31 -193
- package/src/components/ImagePicker.tsx +22 -107
- package/src/utils/fallback.ts +46 -13
- package/src/utils/transforms.ts +9 -12
- package/src/views/ImageManager/components/CleanupLibraryModal.tsx +96 -0
- package/src/views/ImageManager/components/DeleteImageModal.tsx +144 -0
- package/src/views/ImageManager/components/ImageGrid.tsx +119 -0
- package/src/views/ImageManager/components/ImageManagerHeader.tsx +72 -0
- package/src/views/ImageManager/components/ImageManagerStats.tsx +60 -0
- package/src/views/ImageManager/components/ImageManagerToolbar.tsx +60 -0
- package/src/views/ImageManager/components/ImageTable.tsx +120 -0
- package/src/views/ImageManager/types.ts +27 -0
- package/src/views/ImageManager.tsx +103 -571
- package/src/components/BackgroundImage.d.ts +0 -11
- package/src/components/BackgroundImage.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/config.d.ts +0 -9
- package/src/components/GlobalImageEditor/config.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/eventHandlers.d.ts +0 -20
- package/src/components/GlobalImageEditor/eventHandlers.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/imageDetection.d.ts +0 -16
- package/src/components/GlobalImageEditor/imageDetection.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/imageSetup.d.ts +0 -9
- package/src/components/GlobalImageEditor/imageSetup.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/saveLogic.d.ts +0 -26
- package/src/components/GlobalImageEditor/saveLogic.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/stylingDetection.d.ts +0 -9
- package/src/components/GlobalImageEditor/stylingDetection.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/transformParsing.d.ts +0 -16
- package/src/components/GlobalImageEditor/transformParsing.d.ts.map +0 -1
- package/src/components/GlobalImageEditor/types.d.ts +0 -36
- package/src/components/GlobalImageEditor/types.d.ts.map +0 -1
- package/src/components/GlobalImageEditor.d.ts +0 -8
- package/src/components/GlobalImageEditor.d.ts.map +0 -1
- package/src/components/Image.d.ts +0 -22
- package/src/components/Image.d.ts.map +0 -1
- package/src/components/ImageBrowserModal.d.ts +0 -13
- package/src/components/ImageBrowserModal.d.ts.map +0 -1
- package/src/components/ImageEditor.d.ts +0 -27
- package/src/components/ImageEditor.d.ts.map +0 -1
- package/src/components/ImagePicker.d.ts +0 -3
- package/src/components/ImagePicker.d.ts.map +0 -1
- package/src/components/ImagesPluginInit.d.ts +0 -24
- package/src/components/ImagesPluginInit.d.ts.map +0 -1
- package/src/hooks/useImagePicker.d.ts +0 -20
- package/src/hooks/useImagePicker.d.ts.map +0 -1
- package/src/types/index.d.ts +0 -80
- package/src/types/index.d.ts.map +0 -1
- package/src/utils/fallback.d.ts +0 -27
- package/src/utils/fallback.d.ts.map +0 -1
- package/src/utils/transforms.d.ts +0 -26
- package/src/utils/transforms.d.ts.map +0 -1
- package/src/views/ImageManager.d.ts +0 -10
- package/src/views/ImageManager.d.ts.map +0 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Search, Grid3x3, List } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface ImageManagerToolbarProps {
|
|
7
|
+
search: string;
|
|
8
|
+
setSearch: (value: string) => void;
|
|
9
|
+
viewMode: 'grid' | 'list';
|
|
10
|
+
setViewMode: (mode: 'grid' | 'list') => void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function ImageManagerToolbar({
|
|
14
|
+
search,
|
|
15
|
+
setSearch,
|
|
16
|
+
viewMode,
|
|
17
|
+
setViewMode
|
|
18
|
+
}: ImageManagerToolbarProps) {
|
|
19
|
+
return (
|
|
20
|
+
<div className="px-4">
|
|
21
|
+
<div className="flex flex-col sm:flex-row items-center gap-4 p-2 bg-dashboard-card/30 backdrop-blur-xl border border-dashboard-border/40 rounded-2xl shadow-sm">
|
|
22
|
+
<div className="relative flex-1 group w-full">
|
|
23
|
+
<Search className="absolute left-4 top-1/2 -translate-y-1/2 text-dashboard-text-secondary/40 group-focus-within:text-primary transition-colors duration-300" size={18} />
|
|
24
|
+
<input
|
|
25
|
+
type="text"
|
|
26
|
+
placeholder="Search assets by filename..."
|
|
27
|
+
value={search}
|
|
28
|
+
onChange={(e) => setSearch(e.target.value)}
|
|
29
|
+
className="w-full pl-12 pr-6 py-3 bg-transparent border-none outline-none text-sm font-semibold text-dashboard-text placeholder:text-dashboard-text-secondary/30"
|
|
30
|
+
/>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div className="flex items-center gap-1.5 p-1.5 bg-dashboard-bg/50 rounded-xl border border-dashboard-border/40">
|
|
34
|
+
<button
|
|
35
|
+
onClick={() => setViewMode('grid')}
|
|
36
|
+
className={`p-2.5 rounded-lg transition-all ${
|
|
37
|
+
viewMode === 'grid'
|
|
38
|
+
? 'bg-primary text-white shadow-lg shadow-primary/20'
|
|
39
|
+
: 'text-dashboard-text-secondary hover:text-primary hover:bg-primary/5'
|
|
40
|
+
}`}
|
|
41
|
+
title="Grid View"
|
|
42
|
+
>
|
|
43
|
+
<Grid3x3 size={18} />
|
|
44
|
+
</button>
|
|
45
|
+
<button
|
|
46
|
+
onClick={() => setViewMode('list')}
|
|
47
|
+
className={`p-2.5 rounded-lg transition-all ${
|
|
48
|
+
viewMode === 'list'
|
|
49
|
+
? 'bg-primary text-white shadow-lg shadow-primary/20'
|
|
50
|
+
: 'text-dashboard-text-secondary hover:text-primary hover:bg-primary/5'
|
|
51
|
+
}`}
|
|
52
|
+
title="List View"
|
|
53
|
+
>
|
|
54
|
+
<List size={18} />
|
|
55
|
+
</button>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import Image from 'next/image';
|
|
5
|
+
import { Eye, Trash2, Activity, Circle, CheckCircle2 } from 'lucide-react';
|
|
6
|
+
import { ImageMetadata } from '../types';
|
|
7
|
+
|
|
8
|
+
interface ImageTableProps {
|
|
9
|
+
images: ImageMetadata[];
|
|
10
|
+
isImageInUse: (filename: string) => boolean;
|
|
11
|
+
getImageUsage: (filename: string) => any[];
|
|
12
|
+
formatFileSize: (bytes: number) => string;
|
|
13
|
+
formatDate: (date: string) => string;
|
|
14
|
+
onViewFull: (url: string) => void;
|
|
15
|
+
onDelete: (image: ImageMetadata) => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function ImageTable({
|
|
19
|
+
images,
|
|
20
|
+
isImageInUse,
|
|
21
|
+
getImageUsage,
|
|
22
|
+
formatFileSize,
|
|
23
|
+
formatDate,
|
|
24
|
+
onViewFull,
|
|
25
|
+
onDelete
|
|
26
|
+
}: ImageTableProps) {
|
|
27
|
+
return (
|
|
28
|
+
<div className="bg-dashboard-card/40 rounded-2xl overflow-hidden border border-dashboard-border/40 shadow-sm">
|
|
29
|
+
<table className="w-full text-left border-collapse">
|
|
30
|
+
<thead>
|
|
31
|
+
<tr className="text-[10px] font-bold text-dashboard-text-secondary uppercase tracking-widest border-b border-dashboard-border/40 bg-dashboard-bg/20">
|
|
32
|
+
<th className="px-8 py-5">Asset Reference</th>
|
|
33
|
+
<th className="px-8 py-5">File Size</th>
|
|
34
|
+
<th className="px-8 py-5">Uploaded</th>
|
|
35
|
+
<th className="px-8 py-5">Usage Status</th>
|
|
36
|
+
<th className="px-8 py-5 text-right">Actions</th>
|
|
37
|
+
</tr>
|
|
38
|
+
</thead>
|
|
39
|
+
<tbody className="divide-y divide-dashboard-border/30">
|
|
40
|
+
{images.map((image) => {
|
|
41
|
+
const usage = getImageUsage(image.filename);
|
|
42
|
+
const inUse = isImageInUse(image.filename);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<tr key={image.id} className="group hover:bg-primary/[0.03] transition-colors">
|
|
46
|
+
<td className="px-8 py-4">
|
|
47
|
+
<div className="flex items-center gap-4">
|
|
48
|
+
<div className={`size-12 relative bg-dashboard-bg/50 rounded-xl overflow-hidden border transition-all ${
|
|
49
|
+
inUse ? 'border-primary/30' : 'border-dashboard-border/60'
|
|
50
|
+
}`}>
|
|
51
|
+
<Image
|
|
52
|
+
src={image.url}
|
|
53
|
+
alt={image.filename}
|
|
54
|
+
fill
|
|
55
|
+
className="object-cover"
|
|
56
|
+
unoptimized
|
|
57
|
+
/>
|
|
58
|
+
</div>
|
|
59
|
+
<div className="min-w-0">
|
|
60
|
+
<p className="font-bold text-dashboard-text text-sm tracking-tight group-hover:text-primary transition-colors truncate max-w-[250px]" title={image.filename}>
|
|
61
|
+
{image.filename}
|
|
62
|
+
</p>
|
|
63
|
+
<p className="text-[9px] font-medium text-dashboard-text-secondary opacity-60 uppercase tracking-widest">Media Asset</p>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</td>
|
|
67
|
+
<td className="px-8 py-4">
|
|
68
|
+
<span className="text-xs font-semibold text-dashboard-text/70">
|
|
69
|
+
{formatFileSize(image.size)}
|
|
70
|
+
</span>
|
|
71
|
+
</td>
|
|
72
|
+
<td className="px-8 py-4">
|
|
73
|
+
<span className="text-xs font-semibold text-dashboard-text/70">
|
|
74
|
+
{formatDate(image.uploadedAt)}
|
|
75
|
+
</span>
|
|
76
|
+
</td>
|
|
77
|
+
<td className="px-8 py-4">
|
|
78
|
+
{inUse ? (
|
|
79
|
+
<span className="inline-flex items-center gap-2 px-3 py-1 bg-emerald-500/10 text-emerald-600 border border-emerald-500/20 rounded-full text-[9px] font-bold uppercase tracking-wider">
|
|
80
|
+
<CheckCircle2 size={10} />
|
|
81
|
+
Active{usage.length > 0 ? ` (${usage.length})` : ''}
|
|
82
|
+
</span>
|
|
83
|
+
) : (
|
|
84
|
+
<span className="inline-flex items-center gap-2 px-3 py-1 bg-dashboard-bg/50 border border-dashboard-border/60 text-dashboard-text-secondary/60 rounded-full text-[9px] font-bold uppercase tracking-wider">
|
|
85
|
+
<Circle size={10} />
|
|
86
|
+
Unlinked
|
|
87
|
+
</span>
|
|
88
|
+
)}
|
|
89
|
+
</td>
|
|
90
|
+
<td className="px-8 py-4 text-right">
|
|
91
|
+
<div className="flex items-center justify-end gap-1.5">
|
|
92
|
+
<button
|
|
93
|
+
onClick={() => onViewFull(image.url)}
|
|
94
|
+
className="p-2.5 text-dashboard-text-secondary hover:text-primary hover:bg-primary/10 rounded-lg transition-all active:scale-90"
|
|
95
|
+
title="View Image"
|
|
96
|
+
>
|
|
97
|
+
<Eye size={18} />
|
|
98
|
+
</button>
|
|
99
|
+
<button
|
|
100
|
+
onClick={() => onDelete(image)}
|
|
101
|
+
className={`p-2.5 rounded-lg transition-all active:scale-90 ${
|
|
102
|
+
inUse
|
|
103
|
+
? 'text-neutral-300 cursor-not-allowed opacity-20'
|
|
104
|
+
: 'text-dashboard-text-secondary hover:text-red-500 hover:bg-red-500/10'
|
|
105
|
+
}`}
|
|
106
|
+
disabled={inUse}
|
|
107
|
+
title="Delete Image"
|
|
108
|
+
>
|
|
109
|
+
<Trash2 size={18} />
|
|
110
|
+
</button>
|
|
111
|
+
</div>
|
|
112
|
+
</td>
|
|
113
|
+
</tr>
|
|
114
|
+
);
|
|
115
|
+
})}
|
|
116
|
+
</tbody>
|
|
117
|
+
</table>
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ImageMetadata {
|
|
2
|
+
id: string;
|
|
3
|
+
filename: string;
|
|
4
|
+
url: string;
|
|
5
|
+
size: number;
|
|
6
|
+
mimeType: string;
|
|
7
|
+
uploadedAt: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ImageUsage {
|
|
11
|
+
imageId: string;
|
|
12
|
+
filename: string;
|
|
13
|
+
usage: Array<{
|
|
14
|
+
plugin: string;
|
|
15
|
+
type: string;
|
|
16
|
+
title: string;
|
|
17
|
+
id: string;
|
|
18
|
+
url?: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface StorageStats {
|
|
23
|
+
totalImages: number;
|
|
24
|
+
totalSize: number;
|
|
25
|
+
usedImages: number;
|
|
26
|
+
availableImages: number;
|
|
27
|
+
}
|