leptos_helios/chart/
types.rs

1//! Chart Types and Enums
2//!
3//! This module defines the core types and enums used in chart specifications.
4
5use serde::{Deserialize, Serialize};
6
7/// Data reference for chart data
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct DataReference {
10    pub source: String,
11    pub format: DataFormat,
12    pub schema: Option<DataSchema>,
13}
14
15/// Data format types
16#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
17pub enum DataFormat {
18    JSON,
19    CSV,
20    Parquet,
21    Arrow,
22    Inline,
23}
24
25/// Data schema definition
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
27pub struct DataSchema {
28    pub fields: Vec<FieldDef>,
29    pub primary_key: Option<String>,
30}
31
32/// Field definition
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34pub struct FieldDef {
35    pub name: String,
36    pub data_type: DataType,
37    pub nullable: bool,
38    pub description: Option<String>,
39}
40
41/// Data types
42#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
43pub enum DataType {
44    String,
45    Number,
46    Integer,
47    Boolean,
48    Date,
49    DateTime,
50    Time,
51    // Additional types for compatibility
52    Quantitative,
53    Nominal,
54    Ordinal,
55    Temporal,
56}
57
58/// Chart encoding specification
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
60pub struct Encoding {
61    pub x: Option<EncodingDef>,
62    pub y: Option<EncodingDef>,
63    pub color: Option<EncodingDef>,
64    pub size: Option<EncodingDef>,
65    pub shape: Option<EncodingDef>,
66    pub opacity: Option<EncodingDef>,
67    pub text: Option<EncodingDef>,
68    pub tooltip: Option<EncodingDef>,
69    pub detail: Option<EncodingDef>,
70    pub order: Option<EncodingDef>,
71    pub row: Option<EncodingDef>,
72    pub column: Option<EncodingDef>,
73}
74
75/// Encoding definition
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
77pub struct EncodingDef {
78    pub field: String,
79    pub data_type: DataType,
80    pub scale: Option<Scale>,
81    pub axis: Option<Axis>,
82    pub legend: Option<Legend>,
83    pub bin: Option<Bin>,
84    pub aggregate: Option<Aggregate>,
85    pub sort: Option<Sort>,
86}
87
88/// Position encoding for x and y axes (alias for EncodingDef)
89pub type PositionEncoding = EncodingDef;
90
91/// Color encoding (alias for EncodingDef)
92pub type ColorEncoding = EncodingDef;
93
94/// Size encoding (alias for EncodingDef)
95pub type SizeEncoding = EncodingDef;
96
97/// Scale configuration
98#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
99pub struct Scale {
100    pub domain: Option<ScaleDomain>,
101    pub range: Option<ScaleRange>,
102    pub type_: Option<ScaleType>,
103    pub zero: Option<bool>,
104    pub nice: Option<bool>,
105    pub padding: Option<f32>,
106}
107
108/// Scale domain
109#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
110pub enum ScaleDomain {
111    Data,
112    Independent,
113    Values(Vec<serde_json::Value>),
114}
115
116/// Scale range
117#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
118pub enum ScaleRange {
119    Values(Vec<serde_json::Value>),
120    Scheme(String),
121}
122
123/// Scale types
124#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
125pub enum ScaleType {
126    Linear,
127    Log,
128    Pow,
129    Sqrt,
130    Symlog,
131    Time,
132    Utc,
133    Ordinal,
134    Band,
135    Point,
136}
137
138/// Axis configuration
139#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
140pub struct Axis {
141    pub title: Option<String>,
142    pub labels: Option<bool>,
143    pub grid: Option<bool>,
144    pub ticks: Option<bool>,
145    pub domain: Option<bool>,
146    pub orient: Option<AxisOrient>,
147    pub format: Option<String>,
148    pub angle: Option<f32>,
149}
150
151/// Axis orientation
152#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
153pub enum AxisOrient {
154    Top,
155    Bottom,
156    Left,
157    Right,
158}
159
160/// Legend configuration
161#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
162pub struct Legend {
163    pub title: Option<String>,
164    pub orient: Option<LegendOrient>,
165    pub offset: Option<f32>,
166    pub padding: Option<f32>,
167    pub margin: Option<f32>,
168    pub gradient_length: Option<f32>,
169    pub gradient_thickness: Option<f32>,
170    pub gradient_stroke_color: Option<String>,
171    pub gradient_stroke_width: Option<f32>,
172    pub label_color: Option<String>,
173    pub label_font: Option<String>,
174    pub label_font_size: Option<f32>,
175    pub label_limit: Option<f32>,
176    pub symbol_color: Option<String>,
177    pub symbol_size: Option<f32>,
178    pub symbol_stroke_width: Option<f32>,
179    pub symbol_type: Option<String>,
180    pub title_color: Option<String>,
181    pub title_font: Option<String>,
182    pub title_font_size: Option<f32>,
183    pub title_font_weight: Option<String>,
184    pub title_limit: Option<f32>,
185    pub title_padding: Option<f32>,
186}
187
188/// Legend orientation
189#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
190pub enum LegendOrient {
191    Left,
192    Right,
193    Top,
194    Bottom,
195    None,
196}
197
198/// Bin configuration
199#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
200pub struct Bin {
201    pub maxbins: Option<u32>,
202    pub step: Option<f32>,
203    pub steps: Option<Vec<f32>>,
204    pub minstep: Option<f32>,
205    pub divide: Option<Vec<f32>>,
206    pub extent: Option<Vec<f32>>,
207    pub nice: Option<bool>,
208}
209
210/// Aggregate operations
211#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
212pub enum Aggregate {
213    Count,
214    Valid,
215    Missing,
216    Distinct,
217    Sum,
218    Mean,
219    Average,
220    Variance,
221    Variancep,
222    Stdev,
223    Stdevp,
224    Median,
225    Q1,
226    Q3,
227    Modeskew,
228    Min,
229    Max,
230    Argmin,
231    Argmax,
232    Values,
233    Uniq,
234    UniqBy,
235}
236
237/// Sort configuration
238#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
239pub struct Sort {
240    pub field: Option<String>,
241    pub order: Option<SortOrder>,
242}
243
244/// Sort order
245#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
246pub enum SortOrder {
247    Ascending,
248    Descending,
249}
250
251/// Chart configuration
252#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
253pub struct ChartConfig {
254    pub title: String,
255    pub description: String,
256    pub width: Option<f32>,
257    pub height: Option<f32>,
258    pub padding: Option<Padding>,
259    pub background: Option<String>,
260    pub viewport: Option<Viewport>,
261    pub legend: Option<Legend>,
262    pub axis: Option<AxisConfig>,
263    pub mark: Option<MarkConfig>,
264    pub selection: Option<SelectionConfig>,
265    pub scale: Option<ScaleConfig>,
266    pub range: Option<RangeConfig>,
267    pub facet: Option<FacetConfig>,
268    pub header: Option<HeaderConfig>,
269    pub overlay: Option<OverlayConfig>,
270    pub style: Option<StyleConfig>,
271    pub signals: Option<Vec<SignalConfig>>,
272    pub data: Option<Vec<DataConfig>>,
273    pub layout: Option<LayoutConfig>,
274    pub projection: Option<ProjectionConfig>,
275    pub encoding: Option<EncodingConfig>,
276    pub resolve: Option<ResolveConfig>,
277    pub autosize: Option<AutosizeConfig>,
278    pub usermeta: Option<serde_json::Value>,
279}
280
281/// Padding configuration
282#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
283pub struct Padding {
284    pub top: Option<f32>,
285    pub bottom: Option<f32>,
286    pub left: Option<f32>,
287    pub right: Option<f32>,
288}
289
290/// Viewport configuration
291#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
292pub struct Viewport {
293    pub stroke: Option<String>,
294    pub stroke_width: Option<f32>,
295    pub fill: Option<String>,
296    pub fill_opacity: Option<f32>,
297}
298
299/// Axis configuration
300#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
301pub struct AxisConfig {
302    pub band_position: Option<f32>,
303    pub domain: Option<bool>,
304    pub domain_color: Option<String>,
305    pub domain_opacity: Option<f32>,
306    pub domain_width: Option<f32>,
307    pub grid: Option<bool>,
308    pub grid_color: Option<String>,
309    pub grid_dash: Option<Vec<f32>>,
310    pub grid_opacity: Option<f32>,
311    pub grid_width: Option<f32>,
312    pub label_angle: Option<f32>,
313    pub label_color: Option<String>,
314    pub label_flush: Option<bool>,
315    pub label_flush_offset: Option<f32>,
316    pub label_font: Option<String>,
317    pub label_font_size: Option<f32>,
318    pub label_font_style: Option<String>,
319    pub label_font_weight: Option<String>,
320    pub label_limit: Option<f32>,
321    pub label_padding: Option<f32>,
322    pub label_separation: Option<f32>,
323    pub max_extent: Option<f32>,
324    pub min_extent: Option<f32>,
325    pub short_time_labels: Option<bool>,
326    pub tick_color: Option<String>,
327    pub tick_dash: Option<Vec<f32>>,
328    pub tick_opacity: Option<f32>,
329    pub tick_size: Option<f32>,
330    pub tick_width: Option<f32>,
331    pub ticks: Option<bool>,
332    pub title_align: Option<String>,
333    pub title_anchor: Option<String>,
334    pub title_angle: Option<f32>,
335    pub title_baseline: Option<String>,
336    pub title_color: Option<String>,
337    pub title_font: Option<String>,
338    pub title_font_size: Option<f32>,
339    pub title_font_style: Option<String>,
340    pub title_font_weight: Option<String>,
341    pub title_limit: Option<f32>,
342    pub title_padding: Option<f32>,
343    pub title_x: Option<f32>,
344    pub title_y: Option<f32>,
345}
346
347/// Mark configuration
348#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
349pub struct MarkConfig {
350    pub color: Option<String>,
351    pub fill: Option<String>,
352    pub fill_opacity: Option<f32>,
353    pub stroke: Option<String>,
354    pub stroke_cap: Option<String>,
355    pub stroke_dash: Option<Vec<f32>>,
356    pub stroke_dash_offset: Option<f32>,
357    pub stroke_join: Option<String>,
358    pub stroke_miter_limit: Option<f32>,
359    pub stroke_opacity: Option<f32>,
360    pub stroke_width: Option<f32>,
361    pub opacity: Option<f32>,
362    pub blend: Option<String>,
363    pub fill_rule: Option<String>,
364    pub stroke_foreground: Option<bool>,
365    pub stroke_offset: Option<f32>,
366    pub aria: Option<bool>,
367    pub description: Option<String>,
368    pub cursor: Option<String>,
369    pub href: Option<String>,
370    pub tooltip: Option<serde_json::Value>,
371    pub zindex: Option<f32>,
372}
373
374/// Selection configuration
375#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
376pub struct SelectionConfig {
377    pub interval: Option<IntervalConfig>,
378    pub single: Option<SingleConfig>,
379    pub multi: Option<MultiConfig>,
380}
381
382/// Interval selection configuration
383#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
384pub struct IntervalConfig {
385    pub bind: Option<String>,
386    pub clear: Option<String>,
387    pub empty: Option<String>,
388    pub encodings: Option<Vec<String>>,
389    pub fields: Option<Vec<String>>,
390    pub init: Option<serde_json::Value>,
391    pub mark: Option<MarkConfig>,
392    pub on: Option<String>,
393    pub resolve: Option<String>,
394    pub translate: Option<String>,
395    pub zoom: Option<String>,
396}
397
398/// Single selection configuration
399#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
400pub struct SingleConfig {
401    pub bind: Option<String>,
402    pub clear: Option<String>,
403    pub empty: Option<String>,
404    pub encodings: Option<Vec<String>>,
405    pub fields: Option<Vec<String>>,
406    pub init: Option<serde_json::Value>,
407    pub on: Option<String>,
408    pub resolve: Option<String>,
409    pub toggle: Option<String>,
410    pub nearest: Option<bool>,
411}
412
413/// Multi selection configuration
414#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
415pub struct MultiConfig {
416    pub bind: Option<String>,
417    pub clear: Option<String>,
418    pub empty: Option<String>,
419    pub encodings: Option<Vec<String>>,
420    pub fields: Option<Vec<String>>,
421    pub init: Option<serde_json::Value>,
422    pub on: Option<String>,
423    pub resolve: Option<String>,
424    pub toggle: Option<String>,
425    pub nearest: Option<bool>,
426}
427
428/// Scale configuration
429#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
430pub struct ScaleConfig {
431    pub band_padding_inner: Option<f32>,
432    pub band_padding_outer: Option<f32>,
433    pub bar_size: Option<f32>,
434    pub continuous_padding: Option<f32>,
435    pub max_font_size: Option<f32>,
436    pub max_opacity: Option<f32>,
437    pub max_size: Option<f32>,
438    pub max_stroke_width: Option<f32>,
439    pub min_font_size: Option<f32>,
440    pub min_opacity: Option<f32>,
441    pub min_size: Option<f32>,
442    pub min_stroke_width: Option<f32>,
443    pub point_padding: Option<f32>,
444    pub range_step: Option<f32>,
445    pub round: Option<bool>,
446    pub text_x_range_step: Option<f32>,
447    pub use_unaggregated_domain: Option<bool>,
448}
449
450/// Range configuration
451#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
452pub struct RangeConfig {
453    pub category: Option<Vec<String>>,
454    pub diverging: Option<Vec<String>>,
455    pub heatmap: Option<Vec<String>>,
456    pub ordinal: Option<Vec<String>>,
457    pub ramp: Option<Vec<String>>,
458    pub symbol: Option<Vec<String>>,
459}
460
461/// Facet configuration
462#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
463pub struct FacetConfig {
464    pub spacing: Option<f32>,
465}
466
467/// Header configuration
468#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
469pub struct HeaderConfig {
470    pub label_angle: Option<f32>,
471    pub label_color: Option<String>,
472    pub label_font: Option<String>,
473    pub label_font_size: Option<f32>,
474    pub label_font_style: Option<String>,
475    pub label_font_weight: Option<String>,
476    pub label_limit: Option<f32>,
477    pub label_padding: Option<f32>,
478    pub title_align: Option<String>,
479    pub title_anchor: Option<String>,
480    pub title_angle: Option<f32>,
481    pub title_baseline: Option<String>,
482    pub title_color: Option<String>,
483    pub title_font: Option<String>,
484    pub title_font_size: Option<f32>,
485    pub title_font_style: Option<String>,
486    pub title_font_weight: Option<String>,
487    pub title_limit: Option<f32>,
488    pub title_padding: Option<f32>,
489}
490
491/// Overlay configuration
492#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
493pub struct OverlayConfig {
494    pub line: Option<bool>,
495    pub point_style_fill_opacity: Option<f32>,
496    pub point_style_stroke: Option<String>,
497    pub point_style_stroke_width: Option<f32>,
498    pub point_style_fill: Option<String>,
499    pub point_style_stroke_opacity: Option<f32>,
500    pub point_style_stroke_dash: Option<Vec<f32>>,
501    pub point_style_stroke_dash_offset: Option<f32>,
502    pub point_style_stroke_cap: Option<String>,
503    pub point_style_stroke_join: Option<String>,
504    pub point_style_stroke_miter_limit: Option<f32>,
505    pub point_style_stroke_foreground: Option<bool>,
506    pub point_style_stroke_offset: Option<f32>,
507    pub point_style_opacity: Option<f32>,
508    pub point_style_blend: Option<String>,
509    pub point_style_fill_rule: Option<String>,
510    pub point_style_aria: Option<bool>,
511    pub point_style_description: Option<String>,
512    pub point_style_cursor: Option<String>,
513    pub point_style_href: Option<String>,
514    pub point_style_tooltip: Option<serde_json::Value>,
515    pub point_style_zindex: Option<f32>,
516}
517
518/// Style configuration
519#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
520pub struct StyleConfig {
521    pub group: Option<serde_json::Value>,
522    pub cell: Option<serde_json::Value>,
523    pub facet: Option<serde_json::Value>,
524}
525
526/// Signal configuration
527#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
528pub struct SignalConfig {
529    pub name: String,
530    pub value: Option<serde_json::Value>,
531    pub bind: Option<serde_json::Value>,
532    pub on: Option<Vec<serde_json::Value>>,
533    pub update: Option<String>,
534    pub init: Option<String>,
535    pub react: Option<bool>,
536    pub force: Option<bool>,
537}
538
539/// Data configuration
540#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
541pub struct DataConfig {
542    pub name: String,
543    pub source: Option<String>,
544    pub url: Option<String>,
545    pub format: Option<serde_json::Value>,
546    pub values: Option<serde_json::Value>,
547    pub transform: Option<Vec<serde_json::Value>>,
548}
549
550/// Layout configuration
551#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
552pub struct LayoutConfig {
553    pub padding: Option<f32>,
554    pub columns: Option<u32>,
555    pub bounds: Option<String>,
556    pub spacing: Option<f32>,
557    pub header_row: Option<f32>,
558    pub header_column: Option<f32>,
559    pub header_facet: Option<f32>,
560    pub footer_row: Option<f32>,
561    pub footer_column: Option<f32>,
562    pub footer_facet: Option<f32>,
563    pub title_row: Option<f32>,
564    pub title_column: Option<f32>,
565    pub title_facet: Option<f32>,
566    pub label_row: Option<f32>,
567    pub label_column: Option<f32>,
568    pub label_facet: Option<f32>,
569    pub center_row: Option<bool>,
570    pub center_column: Option<bool>,
571    pub center_facet: Option<bool>,
572    pub align: Option<String>,
573    pub columns_align: Option<String>,
574    pub rows_align: Option<String>,
575    pub facet_align: Option<String>,
576    pub columns_columns: Option<u32>,
577    pub rows_columns: Option<u32>,
578    pub facet_columns: Option<u32>,
579    pub columns_rows: Option<u32>,
580    pub rows_rows: Option<u32>,
581    pub facet_rows: Option<u32>,
582    pub columns_spacing: Option<f32>,
583    pub rows_spacing: Option<f32>,
584    pub facet_spacing: Option<f32>,
585    pub columns_padding: Option<f32>,
586    pub rows_padding: Option<f32>,
587    pub facet_padding: Option<f32>,
588    pub columns_bounds: Option<String>,
589    pub rows_bounds: Option<String>,
590    pub facet_bounds: Option<String>,
591    pub columns_center: Option<bool>,
592    pub rows_center: Option<bool>,
593    pub facet_center: Option<bool>,
594    pub columns_align_all: Option<String>,
595    pub rows_align_all: Option<String>,
596    pub facet_align_all: Option<String>,
597    pub columns_columns_all: Option<u32>,
598    pub rows_columns_all: Option<u32>,
599    pub facet_columns_all: Option<u32>,
600    pub columns_rows_all: Option<u32>,
601    pub rows_rows_all: Option<u32>,
602    pub facet_rows_all: Option<u32>,
603    pub columns_spacing_all: Option<f32>,
604    pub rows_spacing_all: Option<f32>,
605    pub facet_spacing_all: Option<f32>,
606    pub columns_padding_all: Option<f32>,
607    pub rows_padding_all: Option<f32>,
608    pub facet_padding_all: Option<f32>,
609    pub columns_bounds_all: Option<String>,
610    pub rows_bounds_all: Option<String>,
611    pub facet_bounds_all: Option<String>,
612    pub columns_center_all: Option<bool>,
613    pub rows_center_all: Option<bool>,
614    pub facet_center_all: Option<bool>,
615}
616
617/// Projection configuration
618#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
619pub struct ProjectionConfig {
620    pub type_: Option<String>,
621    pub clip_angle: Option<f32>,
622    pub clip_extent: Option<Vec<Vec<f32>>>,
623    pub center: Option<Vec<f32>>,
624    pub rotate: Option<Vec<f32>>,
625    pub precision: Option<f32>,
626    pub scale: Option<f32>,
627    pub translate: Option<Vec<f32>>,
628    pub coefficient: Option<f32>,
629    pub distance: Option<f32>,
630    pub fraction: Option<f32>,
631    pub lobes: Option<f32>,
632    pub parallel: Option<f32>,
633    pub radius: Option<f32>,
634    pub ratio: Option<f32>,
635    pub spacing: Option<f32>,
636    pub tilt: Option<f32>,
637}
638
639/// Encoding configuration
640#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
641pub struct EncodingConfig {
642    pub x: Option<EncodingDef>,
643    pub y: Option<EncodingDef>,
644    pub color: Option<EncodingDef>,
645    pub size: Option<EncodingDef>,
646    pub shape: Option<EncodingDef>,
647    pub opacity: Option<EncodingDef>,
648    pub text: Option<EncodingDef>,
649    pub tooltip: Option<EncodingDef>,
650    pub detail: Option<EncodingDef>,
651    pub order: Option<EncodingDef>,
652    pub row: Option<EncodingDef>,
653    pub column: Option<EncodingDef>,
654}
655
656/// Resolve configuration
657#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
658pub struct ResolveConfig {
659    pub axis: Option<serde_json::Value>,
660    pub legend: Option<serde_json::Value>,
661    pub scale: Option<serde_json::Value>,
662}
663
664/// Autosize configuration
665#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
666pub struct AutosizeConfig {
667    pub type_: Option<String>,
668    pub contains: Option<String>,
669    pub resize: Option<bool>,
670}
671
672impl Default for ChartConfig {
673    fn default() -> Self {
674        Self {
675            title: String::new(),
676            description: String::new(),
677            width: None,
678            height: None,
679            padding: None,
680            background: None,
681            viewport: None,
682            legend: None,
683            axis: None,
684            mark: None,
685            selection: None,
686            scale: None,
687            range: None,
688            facet: None,
689            header: None,
690            overlay: None,
691            style: None,
692            signals: None,
693            data: None,
694            layout: None,
695            projection: None,
696            encoding: None,
697            resolve: None,
698            autosize: None,
699            usermeta: None,
700        }
701    }
702}
703
704/// Mark types for charts
705#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
706pub enum MarkType {
707    /// Point marks for scatter plots
708    Point {
709        size: Option<f32>,
710        shape: Option<PointShape>,
711        opacity: Option<f32>,
712    },
713    /// Line marks for line charts
714    Line {
715        interpolate: Option<Interpolation>,
716        stroke_width: Option<f32>,
717        stroke_dash: Option<Vec<f32>>,
718    },
719    /// Bar marks for bar charts
720    Bar {
721        width: Option<BarWidth>,
722        corner_radius: Option<f32>,
723    },
724    /// Area marks for area charts
725    Area {
726        interpolate: Option<Interpolation>,
727        opacity: Option<f32>,
728    },
729    /// Text marks for annotations
730    Text {
731        font_size: Option<f32>,
732        font_family: Option<String>,
733        align: Option<TextAlign>,
734    },
735    /// Rectangle marks for heatmaps
736    Rect {
737        stroke: Option<crate::Color>,
738        stroke_width: Option<f32>,
739    },
740    /// Scatter plot with enhanced features
741    Scatter {
742        size: Option<f32>,
743        shape: Option<PointShape>,
744        opacity: Option<f32>,
745        jitter: Option<f32>,
746        trend_line: Option<bool>,
747    },
748    /// Box plot for statistical visualization
749    BoxPlot {
750        width: Option<f32>,
751        outlier_detection: Option<bool>,
752        whisker_type: Option<WhiskerType>,
753    },
754    /// Violin plot for distribution visualization
755    Violin {
756        width: Option<f32>,
757        bandwidth: Option<f32>,
758        kernel: Option<KernelType>,
759    },
760    /// Heatmap with color mapping
761    Heatmap {
762        color_scheme: Option<String>,
763        interpolation: Option<Interpolation>,
764        stroke: Option<crate::Color>,
765    },
766    /// Histogram for distribution analysis
767    Histogram {
768        bin_width: Option<f32>,
769        bin_count: Option<u32>,
770        density: Option<bool>,
771    },
772    /// Density plot for smooth distributions
773    Density {
774        bandwidth: Option<f32>,
775        kernel: Option<KernelType>,
776        fill: Option<bool>,
777    },
778    /// Contour plot for 2D density
779    Contour {
780        levels: Option<u32>,
781        color_scheme: Option<String>,
782        stroke_width: Option<f32>,
783    },
784    /// Radar chart for multivariate data
785    Radar {
786        radius: Option<f32>,
787        stroke_width: Option<f32>,
788        fill_opacity: Option<f32>,
789    },
790    /// Sankey diagram for flow visualization
791    Sankey {
792        node_width: Option<f32>,
793        node_padding: Option<f32>,
794        link_opacity: Option<f32>,
795    },
796    /// Treemap for hierarchical data
797    Treemap {
798        padding: Option<f32>,
799        round: Option<bool>,
800        method: Option<TreemapMethod>,
801    },
802    /// Composite chart with multiple marks
803    Composite(Vec<MarkType>),
804    /// 3D Point marks
805    Point3D {
806        size: Option<f32>,
807        shape: Option<PointShape>,
808        opacity: Option<f32>,
809    },
810    /// 3D Surface
811    Surface3D {
812        wireframe: Option<bool>,
813        opacity: Option<f32>,
814    },
815    /// Choropleth map
816    Choropleth {
817        projection: Option<String>,
818        stroke: Option<crate::Color>,
819        stroke_width: Option<f32>,
820    },
821    /// Network graph
822    NetworkGraph {
823        layout: Option<String>,
824        node_size: Option<f32>,
825        edge_width: Option<f32>,
826    },
827    /// Dot map
828    DotMap {
829        projection: Option<String>,
830        dot_size: Option<f32>,
831        dot_opacity: Option<f32>,
832    },
833    /// Flow map
834    FlowMap {
835        projection: Option<String>,
836        flow_width: Option<f32>,
837        flow_opacity: Option<f32>,
838    },
839}
840
841/// Point shapes
842#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
843pub enum PointShape {
844    Circle,
845    Square,
846    Diamond,
847    Triangle,
848    Cross,
849    Plus,
850    Star,
851}
852
853/// Interpolation types
854#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
855pub enum Interpolation {
856    Linear,
857    Step,
858    StepBefore,
859    StepAfter,
860    Basis,
861    BasisOpen,
862    BasisClosed,
863    Bundle,
864    Cardinal,
865    CardinalOpen,
866    CardinalClosed,
867    Monotone,
868    CatmullRom,
869    CatmullRomOpen,
870    CatmullRomClosed,
871}
872
873/// Bar width specification
874#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
875pub enum BarWidth {
876    Band,
877    Point,
878    Value(f32),
879}
880
881/// Text alignment
882#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
883pub enum TextAlign {
884    Left,
885    Center,
886    Right,
887}
888
889/// Whisker types for box plots
890#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
891pub enum WhiskerType {
892    IQR,
893    MinMax,
894    StdDev,
895}
896
897/// Kernel types for density plots
898#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
899pub enum KernelType {
900    Gaussian,
901    Epanechnikov,
902    Uniform,
903    Triangular,
904    Biweight,
905    Triweight,
906    Cosine,
907}
908
909/// Treemap methods
910#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
911pub enum TreemapMethod {
912    Squarify,
913    Resquarify,
914    Binary,
915    Dice,
916    Slice,
917    SliceDice,
918}
919
920/// Transform operations
921#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
922pub struct Transform {
923    pub operation: TransformOperation,
924    pub parameters: std::collections::HashMap<String, serde_json::Value>,
925}
926
927/// Transform operations
928#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
929pub enum TransformOperation {
930    Filter,
931    Aggregate,
932    Bin,
933    Calculate,
934    Density,
935    Extent,
936    Flatten,
937    Fold,
938    Impute,
939    JoinAggregate,
940    Loess,
941    Lookup,
942    Pivot,
943    Quantile,
944    Regression,
945    Sample,
946    Sequence,
947    Stack,
948    TimeUnit,
949    Window,
950}
951
952/// Selection definitions
953#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
954pub struct Selection {
955    pub name: String,
956    pub selection_type: SelectionType,
957    pub parameters: std::collections::HashMap<String, serde_json::Value>,
958}
959
960/// Selection types
961#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
962pub enum SelectionType {
963    Single,
964    Multi,
965    Interval,
966}
967
968/// Intelligence features
969#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
970pub struct Intelligence {
971    pub features: Vec<IntelligenceFeature>,
972    pub parameters: std::collections::HashMap<String, serde_json::Value>,
973    pub forecast: Option<ForecastConfig>,
974    pub anomaly_detection: Option<AnomalyConfig>,
975    pub trend_analysis: Option<bool>,
976    pub clustering: Option<ClusterConfig>,
977}
978
979/// Forecast configuration
980#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
981pub struct ForecastConfig {
982    pub enabled: bool,
983    pub horizon: Option<u32>,
984    pub confidence_interval: Option<f64>,
985}
986
987/// Anomaly detection configuration
988#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
989pub struct AnomalyConfig {
990    pub enabled: bool,
991    pub threshold: Option<f64>,
992    pub method: Option<String>,
993}
994
995/// Clustering configuration
996#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
997pub struct ClusterConfig {
998    pub enabled: bool,
999    pub algorithm: Option<String>,
1000    pub num_clusters: Option<u32>,
1001}
1002
1003/// Intelligence features
1004#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1005pub enum IntelligenceFeature {
1006    AnomalyDetection,
1007    TrendAnalysis,
1008    Clustering,
1009    Classification,
1010    Regression,
1011    Forecasting,
1012    OutlierDetection,
1013    PatternRecognition,
1014}