@veztraa/report-designer 0.1.0

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.
@@ -0,0 +1,35 @@
1
+ import { CSSProperties } from 'react';
2
+ import { Template } from '@veztraa/report-core';
3
+ import { ToolbarConfig, ToolbarAction } from './toolbar/Toolbar';
4
+ import { ElementsConfig, ElementType } from './panels/ComponentPalette';
5
+ export interface ReportDesignerProps {
6
+ /** The canvas JSON to load into the designer. When this prop changes, the designer reloads immediately. */
7
+ report?: Template;
8
+ /** Preview/sample data for {{field}} bindings — a JSON string or plain object. Updates immediately when changed. */
9
+ data?: string | Record<string, unknown>;
10
+ /** Called whenever the user edits preview data inside the designer (receives JSON string). */
11
+ onDataChange?: (data: string) => void;
12
+ /** Controlled color theme — sync with your app's theme toggle. */
13
+ theme?: "light" | "dark";
14
+ /** Called when the user clicks the theme toggle inside the designer. */
15
+ onThemeChange?: (theme: "light" | "dark") => void;
16
+ /** Customize the top toolbar — hide built-in actions, override Save / Load, or add custom buttons. */
17
+ toolbar?: ToolbarConfig;
18
+ /** Control which element types appear in the palette — whitelist, blacklist, or hide entirely. */
19
+ elements?: ElementsConfig;
20
+ /** Primary accent color (6-digit hex). All buttons, rings, and indicators derive from this. */
21
+ accentColor?: string;
22
+ /** Initial zoom level (0.25–2.0). Applied once on mount. Defaults to `1` (100%). */
23
+ defaultZoom?: number;
24
+ /** Inline styles applied to the root container div. */
25
+ style?: CSSProperties;
26
+ /** Extra CSS class names applied to the root container div. */
27
+ className?: string;
28
+ }
29
+ export type { ToolbarConfig, ToolbarAction, ElementsConfig, ElementType };
30
+ /**
31
+ * The embeddable report designer. This is the component that would be published
32
+ * as `<ReportDesigner />` — it fills its parent container, so a host app can drop
33
+ * it into any sized box and drive it with props.
34
+ */
35
+ export declare function ReportDesigner({ report, data, onDataChange, theme: themeProp, onThemeChange, toolbar, elements, accentColor, defaultZoom, style, className, }: ReportDesignerProps): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export declare const CANVAS_SIZES: Record<string, [number, number]>;
2
+ export declare function Canvas(): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { ReportElement } from '@veztraa/report-core';
2
+ interface Props {
3
+ el: ReportElement;
4
+ zoom: number;
5
+ sectionWidth: number;
6
+ sectionHeight: number;
7
+ }
8
+ export declare function CanvasElement({ el, zoom, sectionWidth, sectionHeight }: Props): import("react").JSX.Element;
9
+ export {};
@@ -0,0 +1,4 @@
1
+ export declare function Collapse({ open, children }: {
2
+ open: boolean;
3
+ children: React.ReactNode;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export declare function Popup({ open, style, children, ...rest }: {
2
+ open: boolean;
3
+ style?: React.CSSProperties;
4
+ children: React.ReactNode;
5
+ } & React.HTMLAttributes<HTMLDivElement>): import("react").JSX.Element | null;
@@ -0,0 +1,15 @@
1
+ import { ReportElement } from '@veztraa/report-core';
2
+ interface Props {
3
+ el: ReportElement;
4
+ }
5
+ export declare function TextElementView({ el }: Props): import("react").JSX.Element | null;
6
+ export declare function RectangleElementView({ el }: Props): import("react").JSX.Element | null;
7
+ export declare function LineElementView({ el }: Props): import("react").JSX.Element | null;
8
+ export declare function TableElementView({ el }: Props): import("react").JSX.Element | null;
9
+ export declare function ImageElementView({ el }: Props): import("react").JSX.Element | null;
10
+ export declare function ChartElementView({ el }: Props): import("react").JSX.Element | null;
11
+ export declare function QRCodeElementView({ el }: Props): import("react").JSX.Element | null;
12
+ export declare function BarcodeElementView({ el }: Props): import("react").JSX.Element | null;
13
+ export declare function PageBreakElementView(): import("react").JSX.Element;
14
+ export declare function renderElementView(el: ReportElement): import("react").JSX.Element | null;
15
+ export {};
@@ -0,0 +1,56 @@
1
+ import { CSSProperties } from 'react';
2
+ export interface IconProps {
3
+ size?: number;
4
+ color?: string;
5
+ strokeWidth?: number;
6
+ className?: string;
7
+ style?: CSSProperties;
8
+ }
9
+ export type LucideIcon = React.FC<IconProps>;
10
+ export declare function Sun(p: IconProps): import("react").JSX.Element;
11
+ export declare function Moon(p: IconProps): import("react").JSX.Element;
12
+ export declare function Check(p: IconProps): import("react").JSX.Element;
13
+ export declare function Copy(p: IconProps): import("react").JSX.Element;
14
+ export declare function Type(p: IconProps): import("react").JSX.Element;
15
+ export declare function AlignLeft(p: IconProps): import("react").JSX.Element;
16
+ export declare function Table2(p: IconProps): import("react").JSX.Element;
17
+ export declare function Image(p: IconProps): import("react").JSX.Element;
18
+ export declare function BarChart2(p: IconProps): import("react").JSX.Element;
19
+ export declare function Barcode(p: IconProps): import("react").JSX.Element;
20
+ export declare function QrCode(p: IconProps): import("react").JSX.Element;
21
+ export declare function Square(p: IconProps): import("react").JSX.Element;
22
+ export declare function Minus(p: IconProps): import("react").JSX.Element;
23
+ export declare function SeparatorHorizontal(p: IconProps): import("react").JSX.Element;
24
+ export declare function Plus(p: IconProps): import("react").JSX.Element;
25
+ export declare function X(p: IconProps): import("react").JSX.Element;
26
+ export declare function ChevronRight(p: IconProps): import("react").JSX.Element;
27
+ export declare function ChevronDown(p: IconProps): import("react").JSX.Element;
28
+ export declare function Code2(p: IconProps): import("react").JSX.Element;
29
+ export declare function Eye(p: IconProps): import("react").JSX.Element;
30
+ export declare function EyeOff(p: IconProps): import("react").JSX.Element;
31
+ export declare function Lock(p: IconProps): import("react").JSX.Element;
32
+ export declare function LockOpen(p: IconProps): import("react").JSX.Element;
33
+ export declare function Layers(p: IconProps): import("react").JSX.Element;
34
+ export declare function Database(p: IconProps): import("react").JSX.Element;
35
+ export declare function FileText(p: IconProps): import("react").JSX.Element;
36
+ export declare function List(p: IconProps): import("react").JSX.Element;
37
+ export declare function MousePointer2(p: IconProps): import("react").JSX.Element;
38
+ export declare function Bold(p: IconProps): import("react").JSX.Element;
39
+ export declare function Italic(p: IconProps): import("react").JSX.Element;
40
+ export declare function Underline(p: IconProps): import("react").JSX.Element;
41
+ export declare function Strikethrough(p: IconProps): import("react").JSX.Element;
42
+ export declare function AlignCenter(p: IconProps): import("react").JSX.Element;
43
+ export declare function AlignRight(p: IconProps): import("react").JSX.Element;
44
+ export declare function AlignJustify(p: IconProps): import("react").JSX.Element;
45
+ export declare function AlignStartVertical(p: IconProps): import("react").JSX.Element;
46
+ export declare function AlignCenterVertical(p: IconProps): import("react").JSX.Element;
47
+ export declare function AlignEndVertical(p: IconProps): import("react").JSX.Element;
48
+ export declare function Braces(p: IconProps): import("react").JSX.Element;
49
+ export declare function Trash2(p: IconProps): import("react").JSX.Element;
50
+ export declare function GripVertical(p: IconProps): import("react").JSX.Element;
51
+ export declare function Undo2(p: IconProps): import("react").JSX.Element;
52
+ export declare function Redo2(p: IconProps): import("react").JSX.Element;
53
+ export declare function Download(p: IconProps): import("react").JSX.Element;
54
+ export declare function Upload(p: IconProps): import("react").JSX.Element;
55
+ export declare function ZoomIn(p: IconProps): import("react").JSX.Element;
56
+ export declare function ZoomOut(p: IconProps): import("react").JSX.Element;
package/dist/index.css ADDED
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.z-10{z-index:10}.z-50{z-index:50}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-full{height:100%}.min-h-0{min-height:0px}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize-none{resize:none}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.gap-0\.5{gap:.125rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-amber-800\/60{border-color:#92400e99}.border-amber-900\/50{border-color:#78350f80}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.bg-amber-900\/60{background-color:#78350f99}.bg-amber-950\/40{background-color:#451a0366}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-900{--tw-bg-opacity: 1;background-color:rgb(30 58 138 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-green-900{--tw-bg-opacity: 1;background-color:rgb(20 83 45 / var(--tw-bg-opacity, 1))}.bg-orange-900{--tw-bg-opacity: 1;background-color:rgb(124 45 18 / var(--tw-bg-opacity, 1))}.bg-purple-900{--tw-bg-opacity: 1;background-color:rgb(88 28 135 / var(--tw-bg-opacity, 1))}.bg-yellow-900{--tw-bg-opacity: 1;background-color:rgb(113 63 18 / var(--tw-bg-opacity, 1))}.p-0\.5{padding:.125rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.tracking-wider{letter-spacing:.05em}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-orange-300{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--bg: #0c0c10;--panel: #111115;--card: #17171c;--input: #1e1e25;--hover: #242430;--active: #2c2c3a;--border: rgba(255,255,255,.07);--border-h: rgba(255,255,255,.13);--border-s: rgba(255,255,255,.2);--text-1: #e4e4ef;--text-2: #8080a0;--text-3: #404055;--accent: #7c6af7;--accent-h: #9585f9;--accent-dim: rgba(124,106,247,.14);--accent-ring: rgba(124,106,247,.4);--danger: #f87171;--success: #4ade80;--warn: #fbbf24}[data-theme=light]{--bg: #eeeef4;--panel: #ffffff;--card: #f4f4f9;--input: #eaeaf2;--hover: #e2e2ec;--active: #d8d8e8;--border: rgba(0,0,0,.1);--border-h: rgba(0,0,0,.18);--border-s: rgba(0,0,0,.28);--text-1: #111118;--text-2: #3c3c52;--text-3: #6c6c84;--accent: #6c63ff;--accent-h: #7b73ff;--accent-dim: rgba(108,99,255,.1);--accent-ring: rgba(108,99,255,.22);--danger: #dc2626;--success: #16a34a;--warn: #d97706}*,*:before,*:after{box-sizing:border-box}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#ffffff2e}input:focus-visible,textarea:focus-visible,select:focus-visible,button:focus-visible{outline:1.5px solid var(--accent);outline-offset:1px}.resize-handle{position:absolute;width:8px;height:8px;background:var(--accent);border:1.5px solid rgba(255,255,255,.85);border-radius:2.5px;z-index:10;transition:transform .12s ease}.resize-handle:hover{transform:scale(1.4)}.canvas-grid{background-image:radial-gradient(circle,rgba(255,255,255,.07) 1px,transparent 1px);background-size:20px 20px}[data-theme=light] .canvas-grid{background-image:radial-gradient(circle,rgba(0,0,0,.09) 1px,transparent 1px)}.font-mono{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace}.section-label{font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;position:absolute;top:3px;left:6px;pointer-events:none}.hover\:bg-amber-700\/70:hover{background-color:#b45309b3}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800\/50:hover{background-color:#1f293780}.hover\:text-gray-200:hover{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}
@@ -0,0 +1,2 @@
1
+ export { ReportDesigner } from './ReportDesigner';
2
+ export type { ReportDesignerProps, ToolbarConfig, ToolbarAction, ElementsConfig, ElementType } from './ReportDesigner';