@rovela-ai/sdk 0.1.25 → 0.1.27

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 (115) hide show
  1. package/dist/admin/components/CategoryForm.d.ts.map +1 -1
  2. package/dist/admin/components/CategoryForm.js +2 -2
  3. package/dist/admin/components/CategoryForm.js.map +1 -1
  4. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  5. package/dist/admin/components/ProductForm.js +3 -35
  6. package/dist/admin/components/ProductForm.js.map +1 -1
  7. package/dist/admin/components/ProductTable.d.ts.map +1 -1
  8. package/dist/admin/components/ProductTable.js +6 -1
  9. package/dist/admin/components/ProductTable.js.map +1 -1
  10. package/dist/admin/server/admin-service.d.ts +3 -3
  11. package/dist/admin/server/admin-service.d.ts.map +1 -1
  12. package/dist/admin/server/admin-service.js +12 -22
  13. package/dist/admin/server/admin-service.js.map +1 -1
  14. package/dist/auth/server/customer-service.d.ts +2 -2
  15. package/dist/auth/server/customer-service.d.ts.map +1 -1
  16. package/dist/auth/server/customer-service.js +11 -20
  17. package/dist/auth/server/customer-service.js.map +1 -1
  18. package/dist/auth/server/password-reset-service.d.ts +1 -0
  19. package/dist/auth/server/password-reset-service.d.ts.map +1 -1
  20. package/dist/auth/server/password-reset-service.js +5 -7
  21. package/dist/auth/server/password-reset-service.js.map +1 -1
  22. package/dist/auth/server/verification-service.d.ts +1 -0
  23. package/dist/auth/server/verification-service.d.ts.map +1 -1
  24. package/dist/auth/server/verification-service.js +6 -9
  25. package/dist/auth/server/verification-service.js.map +1 -1
  26. package/dist/core/db/client.d.ts +2 -44
  27. package/dist/core/db/client.d.ts.map +1 -1
  28. package/dist/core/db/client.js +2 -106
  29. package/dist/core/db/client.js.map +1 -1
  30. package/dist/core/db/index.d.ts +1 -1
  31. package/dist/core/db/index.d.ts.map +1 -1
  32. package/dist/core/db/index.js +2 -2
  33. package/dist/core/db/index.js.map +1 -1
  34. package/dist/core/db/queries.d.ts +18 -35
  35. package/dist/core/db/queries.d.ts.map +1 -1
  36. package/dist/core/db/queries.js +69 -110
  37. package/dist/core/db/queries.js.map +1 -1
  38. package/dist/core/db/schema.d.ts +1 -137
  39. package/dist/core/db/schema.d.ts.map +1 -1
  40. package/dist/core/db/schema.js +6 -23
  41. package/dist/core/db/schema.js.map +1 -1
  42. package/dist/core/server/index.d.ts +1 -1
  43. package/dist/core/server/index.d.ts.map +1 -1
  44. package/dist/core/server/index.js +1 -3
  45. package/dist/core/server/index.js.map +1 -1
  46. package/dist/core/types.d.ts +0 -5
  47. package/dist/core/types.d.ts.map +1 -1
  48. package/dist/emails/config.d.ts.map +1 -1
  49. package/dist/emails/config.js +11 -17
  50. package/dist/emails/config.js.map +1 -1
  51. package/dist/media/api/delete.d.ts +44 -0
  52. package/dist/media/api/delete.d.ts.map +1 -0
  53. package/dist/media/api/delete.js +134 -0
  54. package/dist/media/api/delete.js.map +1 -0
  55. package/dist/media/api/index.d.ts +17 -0
  56. package/dist/media/api/index.d.ts.map +1 -0
  57. package/dist/media/api/index.js +17 -0
  58. package/dist/media/api/index.js.map +1 -0
  59. package/dist/media/api/presign.d.ts +39 -0
  60. package/dist/media/api/presign.d.ts.map +1 -0
  61. package/dist/media/api/presign.js +138 -0
  62. package/dist/media/api/presign.js.map +1 -0
  63. package/dist/media/components/DropZone.d.ts +18 -0
  64. package/dist/media/components/DropZone.d.ts.map +1 -0
  65. package/dist/media/components/DropZone.js +112 -0
  66. package/dist/media/components/DropZone.js.map +1 -0
  67. package/dist/media/components/ImageGalleryUpload.d.ts +18 -0
  68. package/dist/media/components/ImageGalleryUpload.d.ts.map +1 -0
  69. package/dist/media/components/ImageGalleryUpload.js +156 -0
  70. package/dist/media/components/ImageGalleryUpload.js.map +1 -0
  71. package/dist/media/components/ImageUpload.d.ts +17 -0
  72. package/dist/media/components/ImageUpload.d.ts.map +1 -0
  73. package/dist/media/components/ImageUpload.js +95 -0
  74. package/dist/media/components/ImageUpload.js.map +1 -0
  75. package/dist/media/components/index.d.ts +10 -0
  76. package/dist/media/components/index.d.ts.map +1 -0
  77. package/dist/media/components/index.js +9 -0
  78. package/dist/media/components/index.js.map +1 -0
  79. package/dist/media/config.d.ts +57 -0
  80. package/dist/media/config.d.ts.map +1 -0
  81. package/dist/media/config.js +142 -0
  82. package/dist/media/config.js.map +1 -0
  83. package/dist/media/hooks/index.d.ts +8 -0
  84. package/dist/media/hooks/index.d.ts.map +1 -0
  85. package/dist/media/hooks/index.js +7 -0
  86. package/dist/media/hooks/index.js.map +1 -0
  87. package/dist/media/hooks/useUpload.d.ts +32 -0
  88. package/dist/media/hooks/useUpload.d.ts.map +1 -0
  89. package/dist/media/hooks/useUpload.js +258 -0
  90. package/dist/media/hooks/useUpload.js.map +1 -0
  91. package/dist/media/index.d.ts +57 -0
  92. package/dist/media/index.d.ts.map +1 -0
  93. package/dist/media/index.js +68 -0
  94. package/dist/media/index.js.map +1 -0
  95. package/dist/media/server/delete.d.ts +59 -0
  96. package/dist/media/server/delete.d.ts.map +1 -0
  97. package/dist/media/server/delete.js +176 -0
  98. package/dist/media/server/delete.js.map +1 -0
  99. package/dist/media/server/index.d.ts +10 -0
  100. package/dist/media/server/index.d.ts.map +1 -0
  101. package/dist/media/server/index.js +13 -0
  102. package/dist/media/server/index.js.map +1 -0
  103. package/dist/media/server/presign.d.ts +57 -0
  104. package/dist/media/server/presign.d.ts.map +1 -0
  105. package/dist/media/server/presign.js +112 -0
  106. package/dist/media/server/presign.js.map +1 -0
  107. package/dist/media/server/r2-client.d.ts +30 -0
  108. package/dist/media/server/r2-client.d.ts.map +1 -0
  109. package/dist/media/server/r2-client.js +76 -0
  110. package/dist/media/server/r2-client.js.map +1 -0
  111. package/dist/media/types.d.ts +271 -0
  112. package/dist/media/types.d.ts.map +1 -0
  113. package/dist/media/types.js +52 -0
  114. package/dist/media/types.js.map +1 -0
  115. package/package.json +15 -1
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela-ai/sdk/media/components/DropZone
5
+ *
6
+ * Drag-and-drop zone for file uploads.
7
+ */
8
+ import { useState, useCallback, useRef } from 'react';
9
+ import { cn } from '../../core/utils';
10
+ import { DEFAULT_UPLOAD_CONFIG } from '../types';
11
+ /**
12
+ * DropZone component for drag-and-drop file selection.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * <DropZone
17
+ * onFiles={(files) => handleFiles(files)}
18
+ * multiple
19
+ * accept={['image/jpeg', 'image/png']}
20
+ * >
21
+ * Drop images here
22
+ * </DropZone>
23
+ * ```
24
+ */
25
+ export function DropZone({ onFiles, multiple = false, accept = DEFAULT_UPLOAD_CONFIG.allowedTypes, maxSize = DEFAULT_UPLOAD_CONFIG.maxSizeBytes, disabled = false, className, children, }) {
26
+ const [isDragging, setIsDragging] = useState(false);
27
+ const fileInputRef = useRef(null);
28
+ // Handle drag events
29
+ const handleDragEnter = useCallback((e) => {
30
+ e.preventDefault();
31
+ e.stopPropagation();
32
+ if (!disabled) {
33
+ setIsDragging(true);
34
+ }
35
+ }, [disabled]);
36
+ const handleDragLeave = useCallback((e) => {
37
+ e.preventDefault();
38
+ e.stopPropagation();
39
+ setIsDragging(false);
40
+ }, []);
41
+ const handleDragOver = useCallback((e) => {
42
+ e.preventDefault();
43
+ e.stopPropagation();
44
+ if (!disabled) {
45
+ setIsDragging(true);
46
+ }
47
+ }, [disabled]);
48
+ // Filter and validate files
49
+ const filterFiles = useCallback((fileList) => {
50
+ if (!fileList)
51
+ return [];
52
+ const files = Array.from(fileList);
53
+ return files.filter((file) => {
54
+ // Check type
55
+ if (accept.length > 0 && !accept.includes(file.type)) {
56
+ console.warn(`File type ${file.type} not accepted`);
57
+ return false;
58
+ }
59
+ // Check size
60
+ if (maxSize && file.size > maxSize) {
61
+ console.warn(`File ${file.name} exceeds size limit`);
62
+ return false;
63
+ }
64
+ return true;
65
+ });
66
+ }, [accept, maxSize]);
67
+ // Handle drop
68
+ const handleDrop = useCallback((e) => {
69
+ e.preventDefault();
70
+ e.stopPropagation();
71
+ setIsDragging(false);
72
+ if (disabled)
73
+ return;
74
+ const files = filterFiles(e.dataTransfer.files);
75
+ if (files.length > 0) {
76
+ onFiles(multiple ? files : [files[0]]);
77
+ }
78
+ }, [disabled, filterFiles, multiple, onFiles]);
79
+ // Handle file input change
80
+ const handleFileChange = useCallback((e) => {
81
+ const files = filterFiles(e.target.files);
82
+ if (files.length > 0) {
83
+ onFiles(multiple ? files : [files[0]]);
84
+ }
85
+ // Reset input so the same file can be selected again
86
+ e.target.value = '';
87
+ }, [filterFiles, multiple, onFiles]);
88
+ // Handle click to open file picker
89
+ const handleClick = useCallback(() => {
90
+ if (!disabled && fileInputRef.current) {
91
+ fileInputRef.current.click();
92
+ }
93
+ }, [disabled]);
94
+ // Handle keyboard activation
95
+ const handleKeyDown = useCallback((e) => {
96
+ if ((e.key === 'Enter' || e.key === ' ') && !disabled) {
97
+ e.preventDefault();
98
+ fileInputRef.current?.click();
99
+ }
100
+ }, [disabled]);
101
+ return (_jsxs("div", { role: "button", tabIndex: disabled ? -1 : 0, onClick: handleClick, onKeyDown: handleKeyDown, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: cn('relative rounded-lg border-2 border-dashed transition-colors', 'flex items-center justify-center p-6 text-center', 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2', isDragging && !disabled && 'border-primary bg-primary/5', !isDragging && !disabled && 'border-border hover:border-primary/50 hover:bg-muted/50', disabled && 'cursor-not-allowed opacity-50', className), children: [_jsx("input", { ref: fileInputRef, type: "file", multiple: multiple, accept: accept.join(','), onChange: handleFileChange, disabled: disabled, className: "sr-only", tabIndex: -1 }), _jsx("div", { className: "pointer-events-none", children: children || (_jsxs("div", { className: "text-muted-foreground", children: [_jsx(UploadIcon, { className: "mx-auto h-10 w-10 mb-2" }), _jsx("p", { className: "text-sm font-medium", children: isDragging ? 'Drop files here' : 'Drop files or click to upload' }), _jsx("p", { className: "mt-1 text-xs", children: accept.length > 0
102
+ ? `Accepts: ${accept.map((t) => t.split('/')[1]).join(', ')}`
103
+ : 'All file types accepted' })] })) }), isDragging && (_jsx("div", { className: "absolute inset-0 rounded-lg bg-primary/10 pointer-events-none" }))] }));
104
+ }
105
+ /**
106
+ * Simple upload icon component
107
+ */
108
+ function UploadIcon({ className }) {
109
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }), _jsx("polyline", { points: "17 8 12 3 7 8" }), _jsx("line", { x1: "12", x2: "12", y1: "3", y2: "15" })] }));
110
+ }
111
+ export default DropZone;
112
+ //# sourceMappingURL=DropZone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropZone.js","sourceRoot":"","sources":["../../../src/media/components/DropZone.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ImageGalleryUploadProps } from '../types';
2
+ /**
3
+ * Multi-image upload component for products.
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * <ImageGalleryUpload
8
+ * value={productImages}
9
+ * onChange={(urls) => setProductImages(urls)}
10
+ * folder="products"
11
+ * entityId={productId}
12
+ * maxImages={10}
13
+ * />
14
+ * ```
15
+ */
16
+ export declare function ImageGalleryUpload({ value, onChange, folder, entityId, maxImages, maxSizeMB, disabled, className, }: ImageGalleryUploadProps): import("react/jsx-runtime").JSX.Element;
17
+ export default ImageGalleryUpload;
18
+ //# sourceMappingURL=ImageGalleryUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageGalleryUpload.d.ts","sourceRoot":"","sources":["../../../src/media/components/ImageGalleryUpload.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAGvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAc,EACd,SAAc,EACd,QAAgB,EAChB,SAAS,GACV,EAAE,uBAAuB,2CAgSzB;AA2HD,eAAe,kBAAkB,CAAA"}
@@ -0,0 +1,156 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela-ai/sdk/media/components/ImageGalleryUpload
5
+ *
6
+ * Multi-image upload component with drag-to-reorder functionality.
7
+ * Designed for product images with primary image designation.
8
+ */
9
+ import { useState, useCallback } from 'react';
10
+ import Image from 'next/image';
11
+ import { cn } from '../../core/utils';
12
+ import { useUpload } from '../hooks/useUpload';
13
+ import { DropZone } from './DropZone';
14
+ import { DEFAULT_UPLOAD_CONFIG } from '../types';
15
+ /**
16
+ * Multi-image upload component for products.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <ImageGalleryUpload
21
+ * value={productImages}
22
+ * onChange={(urls) => setProductImages(urls)}
23
+ * folder="products"
24
+ * entityId={productId}
25
+ * maxImages={10}
26
+ * />
27
+ * ```
28
+ */
29
+ export function ImageGalleryUpload({ value = [], onChange, folder, entityId, maxImages = 10, maxSizeMB = 10, disabled = false, className, }) {
30
+ const [deletingIndex, setDeletingIndex] = useState(null);
31
+ const [dragIndex, setDragIndex] = useState(null);
32
+ const [dragOverIndex, setDragOverIndex] = useState(null);
33
+ // Upload hook
34
+ const { upload, isUploading, progress, error, reset } = useUpload({
35
+ folder,
36
+ entityId,
37
+ config: {
38
+ maxSizeBytes: maxSizeMB * 1024 * 1024,
39
+ },
40
+ onSuccess: (result) => {
41
+ if (result.url) {
42
+ onChange([...value, result.url]);
43
+ }
44
+ },
45
+ });
46
+ // Handle file selection
47
+ const handleFiles = useCallback(async (files) => {
48
+ if (disabled || isUploading)
49
+ return;
50
+ // Check max images limit
51
+ const remainingSlots = maxImages - value.length;
52
+ if (remainingSlots <= 0)
53
+ return;
54
+ const filesToUpload = files.slice(0, remainingSlots);
55
+ // Upload files sequentially
56
+ for (const file of filesToUpload) {
57
+ await upload(file);
58
+ }
59
+ }, [upload, disabled, isUploading, maxImages, value.length]);
60
+ // Handle delete
61
+ const handleDelete = useCallback(async (index) => {
62
+ if (disabled || deletingIndex !== null)
63
+ return;
64
+ const url = value[index];
65
+ if (!url)
66
+ return;
67
+ setDeletingIndex(index);
68
+ try {
69
+ const response = await fetch('/api/media', {
70
+ method: 'DELETE',
71
+ headers: { 'Content-Type': 'application/json' },
72
+ body: JSON.stringify({ url }),
73
+ });
74
+ // Remove from list regardless of delete success
75
+ // (the server file might already be gone)
76
+ const newImages = [...value];
77
+ newImages.splice(index, 1);
78
+ onChange(newImages);
79
+ }
80
+ catch (err) {
81
+ console.error('Delete error:', err);
82
+ // Still remove from list
83
+ const newImages = [...value];
84
+ newImages.splice(index, 1);
85
+ onChange(newImages);
86
+ }
87
+ finally {
88
+ setDeletingIndex(null);
89
+ }
90
+ }, [value, onChange, disabled, deletingIndex]);
91
+ // Drag and drop reordering
92
+ const handleDragStart = useCallback((e, index) => {
93
+ if (disabled)
94
+ return;
95
+ setDragIndex(index);
96
+ e.dataTransfer.effectAllowed = 'move';
97
+ // Set drag image (optional - use the element itself)
98
+ if (e.currentTarget instanceof HTMLElement) {
99
+ e.dataTransfer.setDragImage(e.currentTarget, 50, 50);
100
+ }
101
+ }, [disabled]);
102
+ const handleDragOver = useCallback((e, index) => {
103
+ e.preventDefault();
104
+ if (dragIndex === null || dragIndex === index)
105
+ return;
106
+ setDragOverIndex(index);
107
+ }, [dragIndex]);
108
+ const handleDragEnd = useCallback(() => {
109
+ if (dragIndex !== null && dragOverIndex !== null && dragIndex !== dragOverIndex) {
110
+ // Reorder
111
+ const newImages = [...value];
112
+ const [removed] = newImages.splice(dragIndex, 1);
113
+ newImages.splice(dragOverIndex, 0, removed);
114
+ onChange(newImages);
115
+ }
116
+ setDragIndex(null);
117
+ setDragOverIndex(null);
118
+ }, [dragIndex, dragOverIndex, value, onChange]);
119
+ const handleDragLeave = useCallback(() => {
120
+ setDragOverIndex(null);
121
+ }, []);
122
+ // Move image to primary position
123
+ const handleMakePrimary = useCallback((index) => {
124
+ if (index === 0 || disabled)
125
+ return;
126
+ const newImages = [...value];
127
+ const [removed] = newImages.splice(index, 1);
128
+ newImages.unshift(removed);
129
+ onChange(newImages);
130
+ }, [value, onChange, disabled]);
131
+ const canAddMore = value.length < maxImages;
132
+ return (_jsxs("div", { className: cn('space-y-4', className), children: [value.length > 0 && (_jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-4", children: value.map((url, index) => (_jsxs("div", { draggable: !disabled, onDragStart: (e) => handleDragStart(e, index), onDragOver: (e) => handleDragOver(e, index), onDragEnd: handleDragEnd, onDragLeave: handleDragLeave, className: cn('relative aspect-square rounded-lg border overflow-hidden group', 'transition-all duration-200', dragIndex === index && 'opacity-50 scale-95', dragOverIndex === index && 'ring-2 ring-primary ring-offset-2', !disabled && 'cursor-grab active:cursor-grabbing'), children: [_jsx(Image, { src: url, alt: `Image ${index + 1}`, fill: true, className: "object-cover", sizes: "(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 25vw" }), index === 0 && (_jsx("div", { className: "absolute top-2 left-2 px-2 py-0.5 rounded-full bg-primary text-primary-foreground text-xs font-medium", children: "Primary" })), _jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/40 transition-colors", children: _jsxs("div", { className: "absolute inset-0 flex items-center justify-center gap-2 opacity-0 group-hover:opacity-100 transition-opacity", children: [index !== 0 && (_jsx("button", { type: "button", onClick: () => handleMakePrimary(index), disabled: disabled, className: cn('rounded-full bg-white/90 p-2 text-gray-700', 'hover:bg-white transition-colors', 'disabled:opacity-50 disabled:cursor-not-allowed'), title: "Make primary", children: _jsx(StarIcon, { className: "h-4 w-4" }) })), _jsx("button", { type: "button", onClick: () => handleDelete(index), disabled: disabled || deletingIndex !== null, className: cn('rounded-full bg-destructive p-2 text-destructive-foreground', 'hover:bg-destructive/90 transition-colors', 'disabled:opacity-50 disabled:cursor-not-allowed'), title: "Remove image", children: deletingIndex === index ? (_jsx(SpinnerIcon, { className: "h-4 w-4 animate-spin" })) : (_jsx(TrashIcon, { className: "h-4 w-4" })) })] }) }), _jsx("div", { className: "absolute top-2 right-2 p-1 rounded bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity", children: _jsx(GripIcon, { className: "h-4 w-4 text-white" }) })] }, url))) })), canAddMore && (_jsx(DropZone, { onFiles: handleFiles, multiple: maxImages - value.length > 1, accept: DEFAULT_UPLOAD_CONFIG.allowedTypes, maxSize: maxSizeMB * 1024 * 1024, disabled: disabled || isUploading, className: "min-h-[120px]", children: _jsx("div", { className: "text-muted-foreground", children: isUploading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(SpinnerIcon, { className: "mx-auto h-8 w-8 animate-spin" }), _jsx("p", { className: "text-sm", children: "Uploading..." }), progress && (_jsxs("div", { className: "w-full max-w-[200px] mx-auto", children: [_jsx("div", { className: "h-1.5 bg-muted rounded-full overflow-hidden", children: _jsx("div", { className: "h-full bg-primary transition-all duration-300", style: { width: `${progress.percentage}%` } }) }), _jsxs("p", { className: "text-xs mt-1", children: [progress.percentage, "%"] })] }))] })) : (_jsxs(_Fragment, { children: [_jsx(ImagePlusIcon, { className: "mx-auto h-10 w-10 mb-2" }), _jsx("p", { className: "text-sm font-medium", children: value.length === 0 ? 'Add product images' : 'Add more images' }), _jsx("p", { className: "text-xs mt-1", children: "Drop images or click to browse" }), _jsxs("p", { className: "text-xs text-muted-foreground/70", children: [value.length, " / ", maxImages, " images"] })] })) }) })), !canAddMore && (_jsxs("p", { className: "text-sm text-muted-foreground text-center", children: ["Maximum ", maxImages, " images reached. Remove an image to add more."] })), error && (_jsxs("div", { className: "flex items-center gap-2 text-sm text-destructive", children: [_jsx(AlertIcon, { className: "h-4 w-4 flex-shrink-0" }), _jsx("span", { children: error }), _jsx("button", { type: "button", onClick: reset, className: "text-primary hover:underline ml-auto", children: "Retry" })] })), value.length > 1 && (_jsx("p", { className: "text-xs text-muted-foreground", children: "Drag images to reorder. First image is the primary product image." }))] }));
133
+ }
134
+ // =============================================================================
135
+ // Icon Components
136
+ // =============================================================================
137
+ function ImagePlusIcon({ className }) {
138
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("path", { d: "M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7" }), _jsx("line", { x1: "16", x2: "22", y1: "5", y2: "5" }), _jsx("line", { x1: "19", x2: "19", y1: "2", y2: "8" }), _jsx("circle", { cx: "9", cy: "9", r: "2" }), _jsx("path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" })] }));
139
+ }
140
+ function TrashIcon({ className }) {
141
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("path", { d: "M3 6h18" }), _jsx("path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6" }), _jsx("path", { d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2" }), _jsx("line", { x1: "10", x2: "10", y1: "11", y2: "17" }), _jsx("line", { x1: "14", x2: "14", y1: "11", y2: "17" })] }));
142
+ }
143
+ function StarIcon({ className }) {
144
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" }) }));
145
+ }
146
+ function GripIcon({ className }) {
147
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("circle", { cx: "9", cy: "5", r: "1" }), _jsx("circle", { cx: "9", cy: "12", r: "1" }), _jsx("circle", { cx: "9", cy: "19", r: "1" }), _jsx("circle", { cx: "15", cy: "5", r: "1" }), _jsx("circle", { cx: "15", cy: "12", r: "1" }), _jsx("circle", { cx: "15", cy: "19", r: "1" })] }));
148
+ }
149
+ function SpinnerIcon({ className }) {
150
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) }));
151
+ }
152
+ function AlertIcon({ className }) {
153
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", x2: "12", y1: "8", y2: "12" }), _jsx("line", { x1: "12", x2: "12.01", y1: "16", y2: "16" })] }));
154
+ }
155
+ export default ImageGalleryUpload;
156
+ //# sourceMappingURL=ImageGalleryUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageGalleryUpload.js","sourceRoot":"","sources":["../../../src/media/components/ImageGalleryUpload.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ImageUploadProps } from '../types';
2
+ /**
3
+ * Single image upload component.
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * <ImageUpload
8
+ * value={categoryImage}
9
+ * onChange={(url) => setCategoryImage(url)}
10
+ * folder="categories"
11
+ * entityId={categoryId}
12
+ * />
13
+ * ```
14
+ */
15
+ export declare function ImageUpload({ value, onChange, folder, entityId, maxSizeMB, disabled, className, placeholder, aspectRatio, }: ImageUploadProps): import("react/jsx-runtime").JSX.Element;
16
+ export default ImageUpload;
17
+ //# sourceMappingURL=ImageUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUpload.d.ts","sourceRoot":"","sources":["../../../src/media/components/ImageUpload.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAGhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAc,EACd,QAAgB,EAChB,SAAS,EACT,WAA+B,EAC/B,WAAoB,GACrB,EAAE,gBAAgB,2CA+JlB;AAkFD,eAAe,WAAW,CAAA"}
@@ -0,0 +1,95 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela-ai/sdk/media/components/ImageUpload
5
+ *
6
+ * Single image upload component with preview, progress, and delete functionality.
7
+ */
8
+ import { useState, useCallback } from 'react';
9
+ import Image from 'next/image';
10
+ import { cn } from '../../core/utils';
11
+ import { useUpload } from '../hooks/useUpload';
12
+ import { DropZone } from './DropZone';
13
+ import { DEFAULT_UPLOAD_CONFIG } from '../types';
14
+ /**
15
+ * Single image upload component.
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * <ImageUpload
20
+ * value={categoryImage}
21
+ * onChange={(url) => setCategoryImage(url)}
22
+ * folder="categories"
23
+ * entityId={categoryId}
24
+ * />
25
+ * ```
26
+ */
27
+ export function ImageUpload({ value, onChange, folder, entityId, maxSizeMB = 10, disabled = false, className, placeholder = 'Upload an image', aspectRatio = '16/9', }) {
28
+ const [isDeleting, setIsDeleting] = useState(false);
29
+ // Upload hook
30
+ const { upload, isUploading, progress, error, reset } = useUpload({
31
+ folder,
32
+ entityId,
33
+ config: {
34
+ maxSizeBytes: maxSizeMB * 1024 * 1024,
35
+ },
36
+ onSuccess: (result) => {
37
+ if (result.url) {
38
+ onChange(result.url);
39
+ }
40
+ },
41
+ });
42
+ // Handle file selection
43
+ const handleFiles = useCallback(async (files) => {
44
+ if (files.length === 0 || disabled || isUploading)
45
+ return;
46
+ await upload(files[0]);
47
+ }, [upload, disabled, isUploading]);
48
+ // Handle delete
49
+ const handleDelete = useCallback(async () => {
50
+ if (!value || disabled || isDeleting)
51
+ return;
52
+ setIsDeleting(true);
53
+ try {
54
+ const response = await fetch('/api/media', {
55
+ method: 'DELETE',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify({ url: value }),
58
+ });
59
+ if (response.ok) {
60
+ onChange(null);
61
+ }
62
+ else {
63
+ console.error('Failed to delete image');
64
+ }
65
+ }
66
+ catch (err) {
67
+ console.error('Delete error:', err);
68
+ }
69
+ finally {
70
+ setIsDeleting(false);
71
+ }
72
+ }, [value, disabled, isDeleting, onChange]);
73
+ // Reset error and retry
74
+ const handleRetry = useCallback(() => {
75
+ reset();
76
+ }, [reset]);
77
+ return (_jsxs("div", { className: cn('space-y-2', className), children: [value ? (_jsxs("div", { className: "relative rounded-lg border border-border overflow-hidden", children: [_jsx("div", { className: "relative bg-muted", style: { aspectRatio }, children: _jsx(Image, { src: value, alt: "Uploaded image", fill: true, className: "object-cover", sizes: "(max-width: 768px) 100vw, 50vw" }) }), _jsx("div", { className: "absolute inset-0 bg-black/0 hover:bg-black/40 transition-colors group", children: _jsx("div", { className: "absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity", children: _jsx("button", { type: "button", onClick: handleDelete, disabled: disabled || isDeleting, className: cn('rounded-full bg-destructive p-2 text-destructive-foreground', 'hover:bg-destructive/90 transition-colors', 'disabled:opacity-50 disabled:cursor-not-allowed'), title: "Remove image", children: isDeleting ? (_jsx(SpinnerIcon, { className: "h-5 w-5 animate-spin" })) : (_jsx(TrashIcon, { className: "h-5 w-5" })) }) }) })] })) : (_jsx(DropZone, { onFiles: handleFiles, multiple: false, accept: DEFAULT_UPLOAD_CONFIG.allowedTypes, maxSize: maxSizeMB * 1024 * 1024, disabled: disabled || isUploading, className: cn('min-h-[120px]', aspectRatio && `aspect-[${aspectRatio}]`), children: _jsx("div", { className: "text-muted-foreground", children: isUploading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(SpinnerIcon, { className: "mx-auto h-8 w-8 animate-spin" }), _jsx("p", { className: "text-sm", children: "Uploading..." }), progress && (_jsxs("div", { className: "w-full max-w-[200px] mx-auto", children: [_jsx("div", { className: "h-1.5 bg-muted rounded-full overflow-hidden", children: _jsx("div", { className: "h-full bg-primary transition-all duration-300", style: { width: `${progress.percentage}%` } }) }), _jsxs("p", { className: "text-xs mt-1", children: [progress.percentage, "%"] })] }))] })) : (_jsxs(_Fragment, { children: [_jsx(ImageIcon, { className: "mx-auto h-10 w-10 mb-2" }), _jsx("p", { className: "text-sm font-medium", children: placeholder }), _jsx("p", { className: "text-xs mt-1", children: "Drop an image or click to browse" }), _jsxs("p", { className: "text-xs text-muted-foreground/70", children: ["Max ", maxSizeMB, "MB"] })] })) }) })), error && (_jsxs("div", { className: "flex items-center gap-2 text-sm text-destructive", children: [_jsx(AlertIcon, { className: "h-4 w-4 flex-shrink-0" }), _jsx("span", { children: error }), _jsx("button", { type: "button", onClick: handleRetry, className: "text-primary hover:underline ml-auto", children: "Retry" })] }))] }));
78
+ }
79
+ // =============================================================================
80
+ // Icon Components
81
+ // =============================================================================
82
+ function ImageIcon({ className }) {
83
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2" }), _jsx("circle", { cx: "9", cy: "9", r: "2" }), _jsx("path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" })] }));
84
+ }
85
+ function TrashIcon({ className }) {
86
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("path", { d: "M3 6h18" }), _jsx("path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6" }), _jsx("path", { d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2" }), _jsx("line", { x1: "10", x2: "10", y1: "11", y2: "17" }), _jsx("line", { x1: "14", x2: "14", y1: "11", y2: "17" })] }));
87
+ }
88
+ function SpinnerIcon({ className }) {
89
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) }));
90
+ }
91
+ function AlertIcon({ className }) {
92
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", x2: "12", y1: "8", y2: "12" }), _jsx("line", { x1: "12", x2: "12.01", y1: "16", y2: "16" })] }));
93
+ }
94
+ export default ImageUpload;
95
+ //# sourceMappingURL=ImageUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUpload.js","sourceRoot":"","sources":["../../../src/media/components/ImageUpload.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAEhD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,WAAW,GAAG,iBAAiB,EAC/B,WAAW,GAAG,MAAM,GACH;IACjB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEnD,cAAc;IACd,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;QAChE,MAAM;QACN,QAAQ;QACR,MAAM,EAAE;YACN,YAAY,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;SACtC;QACD,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;KACF,CAAC,CAAA;IAEF,wBAAwB;IACxB,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EAAE,KAAa,EAAE,EAAE;QACtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,IAAI,WAAW;YAAE,OAAM;QACzD,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACxB,CAAC,EACD,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAChC,CAAA;IAED,gBAAgB;IAChB,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,UAAU;YAAE,OAAM;QAE5C,aAAa,CAAC,IAAI,CAAC,CAAA;QAEnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;gBACzC,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;aACrC,CAAC,CAAA;YAEF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAA;QACrC,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE3C,wBAAwB;IACxB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,KAAK,EAAE,CAAA;IACT,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,aAEvC,KAAK,CAAC,CAAC,CAAC,CACP,eAAK,SAAS,EAAC,0DAA0D,aAEvE,cACE,SAAS,EAAC,mBAAmB,EAC7B,KAAK,EAAE,EAAE,WAAW,EAAE,YAEtB,KAAC,KAAK,IACJ,GAAG,EAAE,KAAK,EACV,GAAG,EAAC,gBAAgB,EACpB,IAAI,QACJ,SAAS,EAAC,cAAc,EACxB,KAAK,EAAC,gCAAgC,GACtC,GACE,EAGN,cAAK,SAAS,EAAC,uEAAuE,YACpF,cAAK,SAAS,EAAC,wGAAwG,YACrH,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,QAAQ,IAAI,UAAU,EAChC,SAAS,EAAE,EAAE,CACX,6DAA6D,EAC7D,2CAA2C,EAC3C,iDAAiD,CAClD,EACD,KAAK,EAAC,cAAc,YAEnB,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,WAAW,IAAC,SAAS,EAAC,sBAAsB,GAAG,CACjD,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,CAClC,GACM,GACL,GACF,IACF,CACP,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IACP,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,KAAK,EACf,MAAM,EAAE,qBAAqB,CAAC,YAAY,EAC1C,OAAO,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,EAChC,QAAQ,EAAE,QAAQ,IAAI,WAAW,EACjC,SAAS,EAAE,EAAE,CACX,eAAe,EACf,WAAW,IAAI,WAAW,WAAW,GAAG,CACzC,YAED,cAAK,SAAS,EAAC,uBAAuB,YACnC,WAAW,CAAC,CAAC,CAAC,CACb,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,WAAW,IAAC,SAAS,EAAC,8BAA8B,GAAG,EACxD,YAAG,SAAS,EAAC,SAAS,6BAAiB,EACtC,QAAQ,IAAI,CACX,eAAK,SAAS,EAAC,8BAA8B,aAC3C,cAAK,SAAS,EAAC,6CAA6C,YAC1D,cACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,UAAU,GAAG,EAAE,GAC3C,GACE,EACN,aAAG,SAAS,EAAC,cAAc,aAAE,QAAQ,CAAC,UAAU,SAAM,IAClD,CACP,IACG,CACP,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,SAAS,IAAC,SAAS,EAAC,wBAAwB,GAAG,EAChD,YAAG,SAAS,EAAC,qBAAqB,YAAE,WAAW,GAAK,EACpD,YAAG,SAAS,EAAC,cAAc,iDAEvB,EACJ,aAAG,SAAS,EAAC,kCAAkC,qBACxC,SAAS,UACZ,IACH,CACJ,GACG,GACG,CACZ,EAGA,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,kDAAkD,aAC/D,KAAC,SAAS,IAAC,SAAS,EAAC,uBAAuB,GAAG,EAC/C,yBAAO,KAAK,GAAQ,EACpB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,sCAAsC,sBAGzC,IACL,CACP,IACG,CACP,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,SAAS,SAAS,CAAC,EAAE,SAAS,EAA0B;IACtD,OAAO,CACL,eACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAE,SAAS,aAEpB,eAAM,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EACzD,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,GAAG,EAC9B,eAAM,CAAC,EAAC,2CAA2C,GAAG,IAClD,CACP,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,SAAS,EAA0B;IACtD,OAAO,CACL,eACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAE,SAAS,aAEpB,eAAM,CAAC,EAAC,SAAS,GAAG,EACpB,eAAM,CAAC,EAAC,uCAAuC,GAAG,EAClD,eAAM,CAAC,EAAC,oCAAoC,GAAG,EAC/C,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,IACpC,CACP,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAA0B;IACxD,OAAO,CACL,cACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAE,SAAS,YAEpB,eAAM,CAAC,EAAC,6BAA6B,GAAG,GACpC,CACP,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,SAAS,EAA0B;IACtD,OAAO,CACL,eACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAE,SAAS,aAEpB,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,GAAG,EACjC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,GAAG,EACvC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,IACvC,CACP,CAAA;AACH,CAAC;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @rovela-ai/sdk/media/components
3
+ *
4
+ * Media upload components.
5
+ */
6
+ export { DropZone } from './DropZone';
7
+ export { ImageUpload } from './ImageUpload';
8
+ export { ImageGalleryUpload } from './ImageGalleryUpload';
9
+ export type { DropZoneProps, ImageUploadProps, ImageGalleryUploadProps, } from '../types';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/media/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @rovela-ai/sdk/media/components
3
+ *
4
+ * Media upload components.
5
+ */
6
+ export { DropZone } from './DropZone';
7
+ export { ImageUpload } from './ImageUpload';
8
+ export { ImageGalleryUpload } from './ImageGalleryUpload';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/media/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @rovela-ai/sdk/media/config
3
+ *
4
+ * Media storage configuration.
5
+ * Loads R2/S3 credentials from environment variables.
6
+ */
7
+ import type { MediaStorageConfig, UploadConfig } from './types';
8
+ /**
9
+ * Get media storage configuration from environment variables.
10
+ * Returns null if required variables are missing.
11
+ */
12
+ export declare function getMediaConfig(): MediaStorageConfig | null;
13
+ /**
14
+ * Check if media storage is configured
15
+ */
16
+ export declare function isMediaConfigured(): boolean;
17
+ /**
18
+ * Get media configuration or throw an error if not configured.
19
+ * Use this in API routes where configuration is required.
20
+ */
21
+ export declare function requireMediaConfig(): MediaStorageConfig;
22
+ /**
23
+ * Default upload configuration
24
+ */
25
+ export declare const defaultUploadConfig: UploadConfig;
26
+ /**
27
+ * Get upload configuration with optional overrides
28
+ */
29
+ export declare function getUploadConfig(overrides?: Partial<UploadConfig>): UploadConfig;
30
+ /**
31
+ * Build the storage key (path) for a file.
32
+ *
33
+ * Structure: stores/{storeId}/{folder}/{entityId?}/{filename}
34
+ *
35
+ * Examples:
36
+ * - stores/abc123/products/prod456/1699999999_abc123.jpg
37
+ * - stores/abc123/categories/cat789/cover.jpg
38
+ * - stores/abc123/general/1699999999_abc123.jpg
39
+ */
40
+ export declare function buildStorageKey(storeId: string, folder: string, filename: string, entityId?: string): string;
41
+ /**
42
+ * Build the public URL for a stored file
43
+ */
44
+ export declare function buildPublicUrl(publicBaseUrl: string, key: string): string;
45
+ /**
46
+ * Extract the storage key from a public URL
47
+ */
48
+ export declare function extractKeyFromUrl(publicBaseUrl: string, url: string): string | null;
49
+ /**
50
+ * Get MIME type from filename extension
51
+ */
52
+ export declare function getMimeType(filename: string): string;
53
+ /**
54
+ * Check if a MIME type is an allowed image type
55
+ */
56
+ export declare function isAllowedImageType(mimeType: string, config?: UploadConfig): boolean;
57
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/media/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAM/D;;;GAGG;AACH,wBAAgB,cAAc,IAAI,kBAAkB,GAAG,IAAI,CAqB1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,kBAAkB,CASvD;AAMD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAIjC,CAAA;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAK/E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQnF;AAsBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,YAAkC,GACzC,OAAO,CAET"}