@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.
Files changed (94) hide show
  1. package/dist/components/Image.d.ts +1 -6
  2. package/dist/components/Image.d.ts.map +1 -1
  3. package/dist/components/Image.js +86 -202
  4. package/dist/components/ImageEditor.d.ts.map +1 -1
  5. package/dist/components/ImageEditor.js +21 -125
  6. package/dist/components/ImagePicker.d.ts.map +1 -1
  7. package/dist/components/ImagePicker.js +6 -59
  8. package/dist/utils/fallback.d.ts +9 -4
  9. package/dist/utils/fallback.d.ts.map +1 -1
  10. package/dist/utils/fallback.js +40 -12
  11. package/dist/utils/transforms.d.ts.map +1 -1
  12. package/dist/utils/transforms.js +7 -10
  13. package/dist/views/ImageManager/components/CleanupLibraryModal.d.ts +12 -0
  14. package/dist/views/ImageManager/components/CleanupLibraryModal.d.ts.map +1 -0
  15. package/dist/views/ImageManager/components/CleanupLibraryModal.js +7 -0
  16. package/dist/views/ImageManager/components/DeleteImageModal.d.ts +15 -0
  17. package/dist/views/ImageManager/components/DeleteImageModal.d.ts.map +1 -0
  18. package/dist/views/ImageManager/components/DeleteImageModal.js +8 -0
  19. package/dist/views/ImageManager/components/ImageGrid.d.ts +12 -0
  20. package/dist/views/ImageManager/components/ImageGrid.d.ts.map +1 -0
  21. package/dist/views/ImageManager/components/ImageGrid.js +15 -0
  22. package/dist/views/ImageManager/components/ImageManagerHeader.d.ts +11 -0
  23. package/dist/views/ImageManager/components/ImageManagerHeader.d.ts.map +1 -0
  24. package/dist/views/ImageManager/components/ImageManagerHeader.js +6 -0
  25. package/dist/views/ImageManager/components/ImageManagerStats.d.ts +8 -0
  26. package/dist/views/ImageManager/components/ImageManagerStats.d.ts.map +1 -0
  27. package/dist/views/ImageManager/components/ImageManagerStats.js +6 -0
  28. package/dist/views/ImageManager/components/ImageManagerToolbar.d.ts +9 -0
  29. package/dist/views/ImageManager/components/ImageManagerToolbar.d.ts.map +1 -0
  30. package/dist/views/ImageManager/components/ImageManagerToolbar.js +10 -0
  31. package/dist/views/ImageManager/components/ImageTable.d.ts +13 -0
  32. package/dist/views/ImageManager/components/ImageTable.d.ts.map +1 -0
  33. package/dist/views/ImageManager/components/ImageTable.js +13 -0
  34. package/dist/views/ImageManager/types.d.ts +26 -0
  35. package/dist/views/ImageManager/types.d.ts.map +1 -0
  36. package/dist/views/ImageManager/types.js +1 -0
  37. package/dist/views/ImageManager.d.ts +1 -1
  38. package/dist/views/ImageManager.d.ts.map +1 -1
  39. package/dist/views/ImageManager.js +28 -52
  40. package/package.json +10 -9
  41. package/src/components/Image.tsx +107 -262
  42. package/src/components/ImageEditor.tsx +31 -193
  43. package/src/components/ImagePicker.tsx +22 -107
  44. package/src/utils/fallback.ts +46 -13
  45. package/src/utils/transforms.ts +9 -12
  46. package/src/views/ImageManager/components/CleanupLibraryModal.tsx +96 -0
  47. package/src/views/ImageManager/components/DeleteImageModal.tsx +144 -0
  48. package/src/views/ImageManager/components/ImageGrid.tsx +119 -0
  49. package/src/views/ImageManager/components/ImageManagerHeader.tsx +72 -0
  50. package/src/views/ImageManager/components/ImageManagerStats.tsx +60 -0
  51. package/src/views/ImageManager/components/ImageManagerToolbar.tsx +60 -0
  52. package/src/views/ImageManager/components/ImageTable.tsx +120 -0
  53. package/src/views/ImageManager/types.ts +27 -0
  54. package/src/views/ImageManager.tsx +103 -571
  55. package/src/components/BackgroundImage.d.ts +0 -11
  56. package/src/components/BackgroundImage.d.ts.map +0 -1
  57. package/src/components/GlobalImageEditor/config.d.ts +0 -9
  58. package/src/components/GlobalImageEditor/config.d.ts.map +0 -1
  59. package/src/components/GlobalImageEditor/eventHandlers.d.ts +0 -20
  60. package/src/components/GlobalImageEditor/eventHandlers.d.ts.map +0 -1
  61. package/src/components/GlobalImageEditor/imageDetection.d.ts +0 -16
  62. package/src/components/GlobalImageEditor/imageDetection.d.ts.map +0 -1
  63. package/src/components/GlobalImageEditor/imageSetup.d.ts +0 -9
  64. package/src/components/GlobalImageEditor/imageSetup.d.ts.map +0 -1
  65. package/src/components/GlobalImageEditor/saveLogic.d.ts +0 -26
  66. package/src/components/GlobalImageEditor/saveLogic.d.ts.map +0 -1
  67. package/src/components/GlobalImageEditor/stylingDetection.d.ts +0 -9
  68. package/src/components/GlobalImageEditor/stylingDetection.d.ts.map +0 -1
  69. package/src/components/GlobalImageEditor/transformParsing.d.ts +0 -16
  70. package/src/components/GlobalImageEditor/transformParsing.d.ts.map +0 -1
  71. package/src/components/GlobalImageEditor/types.d.ts +0 -36
  72. package/src/components/GlobalImageEditor/types.d.ts.map +0 -1
  73. package/src/components/GlobalImageEditor.d.ts +0 -8
  74. package/src/components/GlobalImageEditor.d.ts.map +0 -1
  75. package/src/components/Image.d.ts +0 -22
  76. package/src/components/Image.d.ts.map +0 -1
  77. package/src/components/ImageBrowserModal.d.ts +0 -13
  78. package/src/components/ImageBrowserModal.d.ts.map +0 -1
  79. package/src/components/ImageEditor.d.ts +0 -27
  80. package/src/components/ImageEditor.d.ts.map +0 -1
  81. package/src/components/ImagePicker.d.ts +0 -3
  82. package/src/components/ImagePicker.d.ts.map +0 -1
  83. package/src/components/ImagesPluginInit.d.ts +0 -24
  84. package/src/components/ImagesPluginInit.d.ts.map +0 -1
  85. package/src/hooks/useImagePicker.d.ts +0 -20
  86. package/src/hooks/useImagePicker.d.ts.map +0 -1
  87. package/src/types/index.d.ts +0 -80
  88. package/src/types/index.d.ts.map +0 -1
  89. package/src/utils/fallback.d.ts +0 -27
  90. package/src/utils/fallback.d.ts.map +0 -1
  91. package/src/utils/transforms.d.ts +0 -26
  92. package/src/utils/transforms.d.ts.map +0 -1
  93. package/src/views/ImageManager.d.ts +0 -10
  94. 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
+ }