vibrant-tool 0.1.2 → 0.1.4

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 (44) hide show
  1. package/README.md +36 -36
  2. package/dist/App.d.ts +1 -5
  3. package/dist/lib/hooks/useBrightnessEffect.d.ts +1 -1
  4. package/dist/lib/services/api.d.ts +1 -0
  5. package/dist/lib/services/color.service.d.ts +10 -0
  6. package/dist/lib/services/product.service.d.ts +4 -0
  7. package/dist/lib/services/quote.service.d.ts +24 -0
  8. package/dist/lib/services/shape.service.d.ts +7 -1
  9. package/dist/lib/services/template-design.service.d.ts +36 -0
  10. package/dist/lib/services/upload.service.d.ts +5 -0
  11. package/dist/lib/types/color.types.d.ts +9 -0
  12. package/dist/lib/types/fabric.types.d.ts +6 -0
  13. package/dist/lib/types/font.types.d.ts +6 -10
  14. package/dist/lib/types/product.types.d.ts +23 -0
  15. package/dist/lib/types/shape.types.d.ts +19 -14
  16. package/dist/lib/utils/canvas-setup.d.ts +9 -4
  17. package/dist/lib/utils/color-apply.utils.d.ts +23 -0
  18. package/dist/lib/utils/color-conversions.utils.d.ts +4 -0
  19. package/dist/lib/utils/custom-controls.d.ts +1 -1
  20. package/dist/lib/utils/fabric-helper.d.ts +2 -0
  21. package/dist/lib/utils/page-manager.d.ts +3 -2
  22. package/dist/lib/utils/qr-utils.d.ts +1 -1
  23. package/dist/lib/utils/query-params.d.ts +28 -0
  24. package/dist/lib/utils/svg-utils.d.ts +3 -0
  25. package/dist/modules/canvas/index.d.ts +1 -5
  26. package/dist/modules/components/color-picker/ChannelRow.d.ts +17 -0
  27. package/dist/modules/components/color-picker/ChannelSlider.d.ts +15 -0
  28. package/dist/modules/components/color-picker/index.d.ts +8 -1
  29. package/dist/modules/components/product-not-found/index.d.ts +3 -0
  30. package/dist/modules/index.d.ts +1 -5
  31. package/dist/modules/side-panel/color-panel/index.d.ts +1 -0
  32. package/dist/modules/topbar/preview-modal.d.ts +3 -0
  33. package/dist/vibrant-tool.css +631 -72
  34. package/dist/vibrant-tool.es.js +40463 -6494
  35. package/dist/vibrant-tool.umd.js +37526 -3558
  36. package/dist/zustand/productStore.d.ts +11 -0
  37. package/dist/zustand/recentElementsStore.d.ts +21 -0
  38. package/dist/zustand/selectionStore.d.ts +4 -1
  39. package/package.json +72 -71
  40. package/dist/modules/components/alpha-slider/index.d.ts +0 -12
  41. package/dist/modules/components/cmyk-inputs/index.d.ts +0 -12
  42. package/dist/modules/components/color-preview-box/index.d.ts +0 -6
  43. package/dist/modules/components/gradient-selector/index.d.ts +0 -10
  44. package/dist/modules/components/hue-slider/index.d.ts +0 -9
package/README.md CHANGED
@@ -1,36 +1,36 @@
1
- ## Next.js setup in consumer app
2
-
3
- Update `next.config.ts`:
4
-
5
- ```ts
6
- import type { NextConfig } from "next";
7
-
8
- const nextConfig: NextConfig = {
9
- transpilePackages: ["vibrant-tool"]
10
- };
11
-
12
- export default nextConfig;
13
- ```
14
-
15
- Import global styles in your app layout (`app/layout.tsx`):
16
-
17
- ```ts
18
- import "vibrant-tool/styles.css";
19
- ```
20
-
21
- Use the editor component:
22
-
23
- ```tsx
24
- "use client";
25
-
26
- import { VibrantEditor } from "vibrant-tool";
27
-
28
- export default function Page() {
29
- return <VibrantEditor />;
30
- }
31
- ```
32
-
33
- ## Exported API
34
-
35
- - `VibrantEditor`
36
- - `default` export: `VibrantEditor`
1
+ ## Next.js setup in consumer app
2
+
3
+ Update `next.config.ts`:
4
+
5
+ ```ts
6
+ import type { NextConfig } from "next";
7
+
8
+ const nextConfig: NextConfig = {
9
+ transpilePackages: ["vibrant-tool"]
10
+ };
11
+
12
+ export default nextConfig;
13
+ ```
14
+
15
+ Import global styles in your app layout (`app/layout.tsx`):
16
+
17
+ ```ts
18
+ import "vibrant-tool/styles.css";
19
+ ```
20
+
21
+ Use the editor component:
22
+
23
+ ```tsx
24
+ "use client";
25
+
26
+ import { VibrantEditor } from "vibrant-tool";
27
+
28
+ export default function Page() {
29
+ return <VibrantEditor />;
30
+ }
31
+ ```
32
+
33
+ ## Exported API
34
+
35
+ - `VibrantEditor`
36
+ - `default` export: `VibrantEditor`
package/dist/App.d.ts CHANGED
@@ -1,5 +1 @@
1
- export default function App({ width, height, link }: {
2
- width?: number;
3
- height?: number;
4
- link?: string;
5
- }): import("react/jsx-runtime").JSX.Element;
1
+ export default function App(): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import { Canvas } from 'fabric';
2
- export declare function useBrightnessEffect(canvas: Canvas | null, enabled: boolean): void;
2
+ export declare function useBrightnessEffect(canvas: Canvas | null, active: boolean): void;
@@ -9,4 +9,5 @@ interface ApiFetchOptions<TBody> {
9
9
  headers?: HeadersInit;
10
10
  }
11
11
  export declare function apiFetch<TResponse, TBody = unknown>(endpoint: string, options?: ApiFetchOptions<TBody>): Promise<TResponse>;
12
+ export declare function apiUploadImage<TResponse, TBody = unknown>(endpoint: string, options?: ApiFetchOptions<TBody>): Promise<TResponse>;
12
13
  export {};
@@ -0,0 +1,10 @@
1
+ import { ColorItem } from '../types/color.types';
2
+ export interface ColorQuery {
3
+ page?: number;
4
+ limit?: number;
5
+ search?: string;
6
+ status?: boolean | string;
7
+ }
8
+ export declare const ColorService: {
9
+ getAll(params?: ColorQuery): Promise<ColorItem[]>;
10
+ };
@@ -0,0 +1,4 @@
1
+ import { ProductOptionResponse } from '../types/product.types';
2
+ export declare const ProductService: {
3
+ getProductOptions(id: string): Promise<ProductOptionResponse>;
4
+ };
@@ -0,0 +1,24 @@
1
+ export interface QuoteItem {
2
+ _id?: string;
3
+ content: string;
4
+ author: string;
5
+ position?: number;
6
+ status?: boolean;
7
+ }
8
+ export interface QuoteResponse {
9
+ success: boolean;
10
+ data: QuoteItem[];
11
+ pagination?: {
12
+ total: number;
13
+ page: number;
14
+ limit: number;
15
+ totalPages: number;
16
+ };
17
+ }
18
+ export declare const QuoteService: {
19
+ getAllQuotes(params?: {
20
+ page?: number;
21
+ limit?: number;
22
+ search?: string;
23
+ }): Promise<QuoteItem[]>;
24
+ };
@@ -1,9 +1,15 @@
1
- import { ElementItem, ExternalShapeType, ShapeType } from '../types/shape.types';
1
+ import { ElementItem, ExternalShapeType, ShapeType, TextTemplateItem } from '../types/shape.types';
2
2
  type NormalizedShapeResponse = {
3
3
  items: ElementItem[];
4
4
  };
5
5
  export declare const ShapeService: {
6
6
  getAll(data: ShapeType): Promise<NormalizedShapeResponse>;
7
7
  getAllExternal(data: ExternalShapeType): Promise<NormalizedShapeResponse>;
8
+ getTextTemplates(data: ShapeType): Promise<{
9
+ items: TextTemplateItem[];
10
+ }>;
11
+ getTextTemplateById(id: string): Promise<TextTemplateItem | null>;
12
+ updateTextTemplate(id: string, body: any): Promise<any>;
13
+ convertImages(url: string): Promise<any>;
8
14
  };
9
15
  export {};
@@ -0,0 +1,36 @@
1
+ export interface TemplatePage {
2
+ side: "front" | "back";
3
+ designData: any;
4
+ image?: string;
5
+ order?: number;
6
+ }
7
+ export interface TemplateDesignItem {
8
+ _id: string;
9
+ name?: string;
10
+ type?: "design" | "text" | string;
11
+ pages: TemplatePage[];
12
+ designs?: any[];
13
+ image?: string;
14
+ product?: string | any;
15
+ category?: string | any;
16
+ colors?: string[];
17
+ industries?: string[];
18
+ status?: boolean;
19
+ }
20
+ export interface TemplateDesignResponse {
21
+ success: boolean;
22
+ data: TemplateDesignItem[];
23
+ message?: string;
24
+ }
25
+ export declare const TemplateDesignService: {
26
+ getTemplates(data: {
27
+ product?: string;
28
+ page: number;
29
+ limit: number;
30
+ }): Promise<TemplateDesignResponse | null>;
31
+ getTemplateDesignById(id: string): Promise<{
32
+ success: boolean;
33
+ data: TemplateDesignItem;
34
+ } | null>;
35
+ updateTemplateDesign(id: string, body: Partial<TemplateDesignItem>): Promise<TemplateDesignResponse | null>;
36
+ };
@@ -0,0 +1,5 @@
1
+ export declare function dataUrlToFile(dataUrl: string, filename?: string): File;
2
+ export declare const UploadService: {
3
+ uploadFileApi(file: File | Blob, filename?: string): Promise<string>;
4
+ uploadDataUrl(dataUrl: string, filename?: string): Promise<string>;
5
+ };
@@ -9,3 +9,12 @@ export interface HSVColor {
9
9
  s: number;
10
10
  v: number;
11
11
  }
12
+ export interface ColorItem {
13
+ _id: string;
14
+ colorName: string;
15
+ hexCode: string;
16
+ colorGroup?: string;
17
+ cmyk?: string;
18
+ pantone?: string;
19
+ status?: boolean;
20
+ }
@@ -1,4 +1,5 @@
1
1
  import { Canvas, FabricObject } from 'fabric';
2
+ import { CMYKColor } from './color.types';
2
3
  export interface AppFabricObject extends FabricObject {
3
4
  objectId?: string;
4
5
  objectName?: string;
@@ -12,13 +13,18 @@ export type SavedDesign = {
12
13
  updatedAt: number;
13
14
  };
14
15
  export interface ExtendedFabricObject extends FabricObject {
16
+ __cmyk?: CMYKColor;
15
17
  __isQR?: boolean;
16
18
  __qrValue?: string;
17
19
  __qrDataUrl?: string;
18
20
  __qrDark?: string;
21
+ __qrDarkCmyk?: CMYKColor;
19
22
  __qrLight?: string;
23
+ __qrLightCmyk?: CMYKColor;
20
24
  __barcodeBackground?: string;
25
+ __barcodeBgCmyk?: CMYKColor;
21
26
  __barcodeForeground?: string;
27
+ __barcodeFgCmyk?: CMYKColor;
22
28
  __isVideo?: boolean;
23
29
  videoEl?: HTMLVideoElement;
24
30
  trimStart?: number;
@@ -1,14 +1,12 @@
1
1
  export interface FontType {
2
- pagination: boolean;
3
- pageNumber: number | 1;
4
- pageSize: number | 30;
5
- IsAdmin: boolean;
2
+ page: number | 1;
3
+ limit: number | 30;
6
4
  }
7
5
  export interface FontItem {
8
6
  _id: string;
9
- IsActive: boolean;
7
+ status: boolean;
10
8
  chieldFonts: {
11
- IsActive: boolean;
9
+ status: boolean;
12
10
  fontFile: string;
13
11
  fontImage: string;
14
12
  fontName: string;
@@ -21,8 +19,6 @@ export interface FontItem {
21
19
  fontWeight: string;
22
20
  }
23
21
  export interface FontItemResponse {
24
- message: {
25
- data: FontItem[];
26
- };
27
- status: boolean;
22
+ data: FontItem[];
23
+ success: boolean;
28
24
  }
@@ -0,0 +1,23 @@
1
+ export interface ProductOptionItem {
2
+ _id: string;
3
+ parentId: string;
4
+ width: number;
5
+ height: number;
6
+ bleedArea: number;
7
+ trimArea: number;
8
+ safetyArea: number;
9
+ status: boolean;
10
+ options: {
11
+ attributeItemDisplayName: string;
12
+ attributeItemName: string;
13
+ variantCode: string;
14
+ variantName: string;
15
+ variantType: string;
16
+ }[];
17
+ optionsMap?: Record<string, string>;
18
+ [key: string]: any;
19
+ }
20
+ export interface ProductOptionResponse {
21
+ success: boolean;
22
+ data: ProductOptionItem;
23
+ }
@@ -1,15 +1,11 @@
1
1
  export interface ShapeType {
2
- type?: string;
3
2
  category?: string | null;
4
- pageNumber?: number | 1;
5
- pagination?: boolean;
6
- id?: string;
7
- statusKey?: string;
8
- statusValue?: string;
3
+ page?: number | 1;
4
+ limit?: number | 10;
9
5
  }
10
6
  export interface ElementItem {
11
7
  _id: string;
12
- IsActive: boolean;
8
+ status: boolean;
13
9
  category: string;
14
10
  image: string;
15
11
  largeImage: string;
@@ -18,19 +14,28 @@ export interface ElementItem {
18
14
  data?: string;
19
15
  }
20
16
  export interface ElementItemResponse {
21
- message: {
22
- data: ElementItem[];
23
- };
24
- status: boolean;
17
+ data: ElementItem[];
18
+ success: boolean;
25
19
  }
26
20
  export interface ExternalItemResponse {
27
21
  data: ElementItem[];
28
- status: boolean;
22
+ success: boolean;
29
23
  }
30
24
  export interface ExternalShapeType {
31
25
  query?: string | null;
32
26
  keyType: string | null;
33
- pageNumber: number | 1;
34
- pageSize: number | 30;
27
+ page: number | 1;
28
+ limit: number | 30;
35
29
  isVector: boolean;
36
30
  }
31
+ export interface TextTemplateItem {
32
+ _id: string;
33
+ status: boolean;
34
+ name: string;
35
+ image: string;
36
+ jsonData: object;
37
+ }
38
+ export interface TextTemplateResponse {
39
+ data: TextTemplateItem[];
40
+ success: boolean;
41
+ }
@@ -17,10 +17,15 @@ export declare function createLargeWorkarea(canvas: Canvas, config: VCanvasConfi
17
17
  evented: false;
18
18
  name: string;
19
19
  }, import('fabric').SerializedRectProps, import('fabric').ObjectEvents>;
20
- export declare function createWorkarea(canvas: Canvas, container: HTMLDivElement, sizeInInches?: {
21
- width: number;
22
- height: number;
23
- }): Rect<{
20
+ export interface WorkareaProductOptions {
21
+ bleedArea?: number;
22
+ trimArea?: number;
23
+ safetyArea?: number;
24
+ hideGuidelines?: boolean;
25
+ isTextTemplate?: boolean;
26
+ optionsMap?: Record<string, string>;
27
+ }
28
+ export declare function createWorkarea(canvas: Canvas, container: HTMLDivElement, productData?: WorkareaProductOptions | null): Rect<{
24
29
  width: number;
25
30
  height: number;
26
31
  fill: string;
@@ -0,0 +1,23 @@
1
+ import { CMYKColor } from '../types/color.types';
2
+ /**
3
+ * Normalizes any valid CSS color or fabric color string into 6-digit #rrggbb hex.
4
+ */
5
+ export declare function normalizeHexColor(c: any): string | null;
6
+ /**
7
+ * Extracts all unique colors (fills and visible strokes) from selected target objects only.
8
+ * Avoids reading default prototype fills from Group containers.
9
+ */
10
+ export declare function extractAllTargetColors(targets: any[]): string[];
11
+ /**
12
+ * Extracts the primary color, opacity, and __cmyk from the first selected target object.
13
+ */
14
+ export declare function extractTargetColor(targets: any[]): {
15
+ color?: string;
16
+ opacity?: number;
17
+ cmyk?: CMYKColor;
18
+ };
19
+ /**
20
+ * Replaces a specific color (or applies new color) across selected Fabric objects.
21
+ * If targetOldColor is specified, only occurrences of that color are replaced.
22
+ */
23
+ export declare function applyFillToFabricObjects(objects: any[], newColor: string, alpha: number, targetOldColor: string | null | undefined, canvas: any, cmykValues?: CMYKColor): void;
@@ -17,3 +17,7 @@ export declare function hexToRgb(hex: string): {
17
17
  g: number;
18
18
  b: number;
19
19
  };
20
+ export declare function hexToCmyk(hex: string): CMYKColor;
21
+ export declare function cmykToHex(c: number, m: number, y: number, k: number): string;
22
+ export declare function convertSvgColorsToCmyk(svg: string): string;
23
+ export declare function convertPdfToDeviceCMYK(rawBuffer: ArrayBuffer): Promise<Uint8Array>;
@@ -1,5 +1,5 @@
1
1
  import { Control, FabricObject } from 'fabric';
2
2
  export declare function renderRotateIcon(ctx: CanvasRenderingContext2D, left: number, top: number, fabricObject: FabricObject): void;
3
- export declare function createRotateControl(): Control;
3
+ export declare function createRotateControl(size?: number, offsetY?: number): Control;
4
4
  export declare function configureObjectControls(obj: FabricObject): void;
5
5
  export declare function initializeRotateImage(): void;
@@ -1,2 +1,4 @@
1
1
  import { Canvas } from 'fabric';
2
2
  export declare function loadPageToCanvas(canvas: Canvas, json: any): Promise<void>;
3
+ export declare function getWorkareaDataUrl(cvs: Canvas, multiplier?: number): string;
4
+ export declare function renderPageDataUrl(json: any, baseCanvas: Canvas, multiplier?: number): Promise<string>;
@@ -1,3 +1,4 @@
1
1
  import { Canvas } from 'fabric';
2
- export type PageSide = "front" | "back";
3
- export declare function switchCanvasPage(canvas: Canvas, currentPage: PageSide, targetPage: PageSide, pageJSON: Record<PageSide, any>, clearSelection: () => void, containerRef: React.MutableRefObject<HTMLDivElement | null>, data?: any): Promise<void>;
2
+ import { PageSide } from '../../zustand/historyStore';
3
+ export type { PageSide };
4
+ export declare function switchCanvasPage(canvas: Canvas, currentPage: PageSide, targetPage: PageSide, pageJSON: Record<PageSide, any>, clearSelection: () => void, containerRef: React.MutableRefObject<HTMLDivElement | null>): Promise<void>;
@@ -1,4 +1,4 @@
1
1
  import { FabricObject } from 'fabric';
2
2
  import { ExtendedFabricObject } from '../types/fabric.types';
3
3
  export declare const isQRCode: (obj?: FabricObject | null) => obj is ExtendedFabricObject;
4
- export declare function generateQRSVG(value: string, dark: string, light: string): Promise<string>;
4
+ export declare function generateQRSVG(value: string, dark?: string, light?: string): Promise<string>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Universal Query Parameter Helpers
3
+ * Can be used anywhere in the codebase (React components, utilities, stores, services).
4
+ */
5
+ /**
6
+ * Get a query parameter string value by key
7
+ * @example const productId = getQueryParam('productId');
8
+ */
9
+ export declare function getQueryParam(key: string): string | null;
10
+ /**
11
+ * Get a query parameter as a number
12
+ * @example const width = getQueryParamNumber('width', 3.5);
13
+ */
14
+ export declare function getQueryParamNumber(key: string, defaultValue?: number): number | undefined;
15
+ /**
16
+ * Get a query parameter as a boolean
17
+ * @example const isVector = getQueryParamBoolean('isVector', false);
18
+ */
19
+ export declare function getQueryParamBoolean(key: string, defaultValue?: boolean): boolean;
20
+ /**
21
+ * Get all query parameters as a plain Key-Value object
22
+ * @example const params = getAllQueryParams();
23
+ */
24
+ export declare function getAllQueryParams(): Record<string, string>;
25
+ /**
26
+ * Update or set a query parameter in the current browser URL without page reload
27
+ */
28
+ export declare function setQueryParam(key: string, value: string | number | boolean | null): void;
@@ -1,8 +1,11 @@
1
1
  import { FabricObject } from 'fabric';
2
+ import { ExtendedFabricObject } from '../types/fabric.types';
2
3
  export declare function addSVGToCanvas(type: string | undefined, url: string): Promise<void>;
3
4
  export declare function renderSVGStringToCanvas(type: string | undefined, svg: string, options?: {
4
5
  background?: string;
5
6
  color?: string;
6
7
  }): Promise<FabricObject<Partial<import('fabric').FabricObjectProps>, import('fabric').SerializedObjectProps, import('fabric').ObjectEvents> | undefined>;
8
+ export declare function updateBarcodeObjectColors(barcodeGroup: ExtendedFabricObject, fgColor: string, bgColor: string): void;
9
+ export declare function updateQRObjectColors(qrGroup: ExtendedFabricObject, darkColor: string, lightColor: string): void;
7
10
  export declare function extractSVGColors(svg: FabricObject): string[];
8
11
  export declare function replaceSVGColor(svg: FabricObject, fromColor: string, toColor: string): void;
@@ -1,5 +1 @@
1
- export default function Workspace({ width, height, link }: {
2
- width?: number;
3
- height?: number;
4
- link?: string;
5
- }): import("react/jsx-runtime").JSX.Element;
1
+ export default function Workspace(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ export interface ChannelRowProps {
2
+ label: string;
3
+ labelColor: string;
4
+ /** Full accessible name for the channel (e.g. "Cyan") */
5
+ ariaLabel: string;
6
+ value: number;
7
+ min: number;
8
+ max: number;
9
+ gradient: string;
10
+ onChange: (value: number) => void;
11
+ /** Discrete commit. `'slider'` = drag/keypress on the track; `'input'` = the number box. */
12
+ onCommit?: (source: 'slider' | 'input') => void;
13
+ /** Part-level classes forwarded to the slider track / thumb. */
14
+ sliderClassName?: string;
15
+ sliderThumbClassName?: string;
16
+ }
17
+ export declare function ChannelRow({ label, labelColor, ariaLabel, value, min, max, gradient, onChange, onCommit, sliderClassName, sliderThumbClassName }: ChannelRowProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ export interface ChannelSliderProps {
2
+ value: number;
3
+ min: number;
4
+ max: number;
5
+ gradient: string;
6
+ /** Accessible name for the slider (e.g. "Cyan", "Magenta") */
7
+ ariaLabel: string;
8
+ onChange: (value: number) => void;
9
+ /** Discrete commit — fires on pointer-up (end of a drag) and on blur */
10
+ onCommit?: () => void;
11
+ /** Extra class on the track / thumb */
12
+ className?: string;
13
+ thumbClassName?: string;
14
+ }
15
+ export declare function ChannelSlider({ value, min, max, gradient, ariaLabel, onChange, onCommit, className, thumbClassName }: ChannelSliderProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1,8 @@
1
- export default function CMYKColorPicker(): import("react/jsx-runtime").JSX.Element | null;
1
+ import { CMYKColor } from '../../../lib/types/color.types';
2
+ interface CMYKColorPickerProps {
3
+ value?: string | CMYKColor;
4
+ onChange?: (hexOrCmyk: any, cmyk?: CMYKColor) => void;
5
+ className?: string;
6
+ }
7
+ export default function CMYKColorPicker({ value, onChange, className }?: CMYKColorPickerProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
@@ -0,0 +1,3 @@
1
+ export default function ProductNotFound({ message, }: {
2
+ message?: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1 @@
1
- export default function Home({ width, height, link }: {
2
- width?: number;
3
- height?: number;
4
- link?: string;
5
- }): import("react/jsx-runtime").JSX.Element;
1
+ export default function Home(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function ColorPanel(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ export default function PreviewModal({ onClose }: {
2
+ onClose: () => void;
3
+ }): import("react/jsx-runtime").JSX.Element;