1use crate::models;
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
15pub struct ComponentNode {
16 #[serde(rename = "id")]
18 pub id: String,
19 #[serde(rename = "name")]
21 pub name: String,
22 #[serde(rename = "visible", skip_serializing_if = "Option::is_none")]
24 pub visible: Option<bool>,
25 #[serde(rename = "locked", skip_serializing_if = "Option::is_none")]
27 pub locked: Option<bool>,
28 #[serde(rename = "isFixed", skip_serializing_if = "Option::is_none")]
30 pub is_fixed: Option<bool>,
31 #[serde(rename = "scrollBehavior")]
33 pub scroll_behavior: ScrollBehavior,
34 #[serde(rename = "rotation", skip_serializing_if = "Option::is_none")]
36 pub rotation: Option<f64>,
37 #[serde(rename = "componentPropertyReferences", skip_serializing_if = "Option::is_none")]
39 pub component_property_references: Option<std::collections::HashMap<String, String>>,
40 #[serde(rename = "pluginData", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")]
41 pub plugin_data: Option<Option<serde_json::Value>>,
42 #[serde(rename = "sharedPluginData", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")]
43 pub shared_plugin_data: Option<Option<serde_json::Value>>,
44 #[serde(rename = "boundVariables", skip_serializing_if = "Option::is_none")]
45 pub bound_variables: Option<Box<models::IsLayerTraitBoundVariables>>,
46 #[serde(rename = "explicitVariableModes", skip_serializing_if = "Option::is_none")]
48 pub explicit_variable_modes: Option<std::collections::HashMap<String, String>>,
49 #[serde(rename = "blendMode")]
51 pub blend_mode: models::BlendMode,
52 #[serde(rename = "opacity", skip_serializing_if = "Option::is_none")]
54 pub opacity: Option<f64>,
55 #[serde(rename = "children")]
57 pub children: Vec<models::SubcanvasNode>,
58 #[serde(rename = "preserveRatio", skip_serializing_if = "Option::is_none")]
60 pub preserve_ratio: Option<bool>,
61 #[serde(rename = "constraints", skip_serializing_if = "Option::is_none")]
63 pub constraints: Option<Box<models::LayoutConstraint>>,
64 #[serde(rename = "relativeTransform", skip_serializing_if = "Option::is_none")]
66 pub relative_transform: Option<Vec<Vec<f64>>>,
67 #[serde(rename = "size", skip_serializing_if = "Option::is_none")]
69 pub size: Option<Box<models::Vector>>,
70 #[serde(rename = "layoutAlign", skip_serializing_if = "Option::is_none")]
72 pub layout_align: Option<LayoutAlign>,
73 #[serde(rename = "layoutGrow", skip_serializing_if = "Option::is_none")]
75 pub layout_grow: Option<f64>,
76 #[serde(rename = "layoutPositioning", skip_serializing_if = "Option::is_none")]
78 pub layout_positioning: Option<LayoutPositioning>,
79 #[serde(rename = "minWidth", skip_serializing_if = "Option::is_none")]
81 pub min_width: Option<f64>,
82 #[serde(rename = "maxWidth", skip_serializing_if = "Option::is_none")]
84 pub max_width: Option<f64>,
85 #[serde(rename = "minHeight", skip_serializing_if = "Option::is_none")]
87 pub min_height: Option<f64>,
88 #[serde(rename = "maxHeight", skip_serializing_if = "Option::is_none")]
90 pub max_height: Option<f64>,
91 #[serde(rename = "layoutSizingHorizontal", skip_serializing_if = "Option::is_none")]
93 pub layout_sizing_horizontal: Option<LayoutSizingHorizontal>,
94 #[serde(rename = "layoutSizingVertical", skip_serializing_if = "Option::is_none")]
96 pub layout_sizing_vertical: Option<LayoutSizingVertical>,
97 #[serde(rename = "clipsContent")]
99 pub clips_content: bool,
100 #[serde(rename = "background", skip_serializing_if = "Option::is_none")]
102 pub background: Option<Vec<models::Paint>>,
103 #[serde(rename = "backgroundColor", skip_serializing_if = "Option::is_none")]
105 pub background_color: Option<Box<models::Rgba>>,
106 #[serde(rename = "layoutGrids", skip_serializing_if = "Option::is_none")]
108 pub layout_grids: Option<Vec<models::LayoutGrid>>,
109 #[serde(rename = "overflowDirection", skip_serializing_if = "Option::is_none")]
111 pub overflow_direction: Option<OverflowDirection>,
112 #[serde(rename = "layoutMode", skip_serializing_if = "Option::is_none")]
114 pub layout_mode: Option<LayoutMode>,
115 #[serde(rename = "primaryAxisSizingMode", skip_serializing_if = "Option::is_none")]
117 pub primary_axis_sizing_mode: Option<PrimaryAxisSizingMode>,
118 #[serde(rename = "counterAxisSizingMode", skip_serializing_if = "Option::is_none")]
120 pub counter_axis_sizing_mode: Option<CounterAxisSizingMode>,
121 #[serde(rename = "primaryAxisAlignItems", skip_serializing_if = "Option::is_none")]
123 pub primary_axis_align_items: Option<PrimaryAxisAlignItems>,
124 #[serde(rename = "counterAxisAlignItems", skip_serializing_if = "Option::is_none")]
126 pub counter_axis_align_items: Option<CounterAxisAlignItems>,
127 #[serde(rename = "paddingLeft", skip_serializing_if = "Option::is_none")]
129 pub padding_left: Option<f64>,
130 #[serde(rename = "paddingRight", skip_serializing_if = "Option::is_none")]
132 pub padding_right: Option<f64>,
133 #[serde(rename = "paddingTop", skip_serializing_if = "Option::is_none")]
135 pub padding_top: Option<f64>,
136 #[serde(rename = "paddingBottom", skip_serializing_if = "Option::is_none")]
138 pub padding_bottom: Option<f64>,
139 #[serde(rename = "itemSpacing", skip_serializing_if = "Option::is_none")]
141 pub item_spacing: Option<f64>,
142 #[serde(rename = "itemReverseZIndex", skip_serializing_if = "Option::is_none")]
144 pub item_reverse_z_index: Option<bool>,
145 #[serde(rename = "strokesIncludedInLayout", skip_serializing_if = "Option::is_none")]
147 pub strokes_included_in_layout: Option<bool>,
148 #[serde(rename = "layoutWrap", skip_serializing_if = "Option::is_none")]
150 pub layout_wrap: Option<LayoutWrap>,
151 #[serde(rename = "counterAxisSpacing", skip_serializing_if = "Option::is_none")]
153 pub counter_axis_spacing: Option<f64>,
154 #[serde(rename = "counterAxisAlignContent", skip_serializing_if = "Option::is_none")]
156 pub counter_axis_align_content: Option<CounterAxisAlignContent>,
157 #[serde(rename = "cornerRadius", skip_serializing_if = "Option::is_none")]
159 pub corner_radius: Option<f64>,
160 #[serde(rename = "cornerSmoothing", skip_serializing_if = "Option::is_none")]
162 pub corner_smoothing: Option<f64>,
163 #[serde(rename = "rectangleCornerRadii", skip_serializing_if = "Option::is_none")]
165 pub rectangle_corner_radii: Option<Vec<f64>>,
166 #[serde(rename = "fills")]
168 pub fills: Vec<models::Paint>,
169 #[serde(rename = "styles", skip_serializing_if = "Option::is_none")]
171 pub styles: Option<std::collections::HashMap<String, String>>,
172 #[serde(rename = "strokes", skip_serializing_if = "Option::is_none")]
174 pub strokes: Option<Vec<models::Paint>>,
175 #[serde(rename = "strokeWeight", skip_serializing_if = "Option::is_none")]
177 pub stroke_weight: Option<f64>,
178 #[serde(rename = "strokeAlign", skip_serializing_if = "Option::is_none")]
180 pub stroke_align: Option<StrokeAlign>,
181 #[serde(rename = "strokeJoin", skip_serializing_if = "Option::is_none")]
183 pub stroke_join: Option<StrokeJoin>,
184 #[serde(rename = "strokeDashes", skip_serializing_if = "Option::is_none")]
186 pub stroke_dashes: Option<Vec<f64>>,
187 #[serde(rename = "fillGeometry", skip_serializing_if = "Option::is_none")]
189 pub fill_geometry: Option<Vec<models::Path>>,
190 #[serde(rename = "strokeGeometry", skip_serializing_if = "Option::is_none")]
192 pub stroke_geometry: Option<Vec<models::Path>>,
193 #[serde(rename = "strokeCap", skip_serializing_if = "Option::is_none")]
195 pub stroke_cap: Option<StrokeCap>,
196 #[serde(rename = "strokeMiterAngle", skip_serializing_if = "Option::is_none")]
198 pub stroke_miter_angle: Option<f64>,
199 #[serde(rename = "exportSettings", skip_serializing_if = "Option::is_none")]
201 pub export_settings: Option<Vec<models::ExportSetting>>,
202 #[serde(rename = "effects")]
204 pub effects: Vec<models::Effect>,
205 #[serde(rename = "isMask", skip_serializing_if = "Option::is_none")]
207 pub is_mask: Option<bool>,
208 #[serde(rename = "maskType", skip_serializing_if = "Option::is_none")]
210 pub mask_type: Option<MaskType>,
211 #[serde(rename = "isMaskOutline", skip_serializing_if = "Option::is_none")]
213 pub is_mask_outline: Option<bool>,
214 #[serde(rename = "transitionNodeID", skip_serializing_if = "Option::is_none")]
216 pub transition_node_id: Option<String>,
217 #[serde(rename = "transitionDuration", skip_serializing_if = "Option::is_none")]
219 pub transition_duration: Option<f64>,
220 #[serde(rename = "transitionEasing", skip_serializing_if = "Option::is_none")]
222 pub transition_easing: Option<models::EasingType>,
223 #[serde(rename = "individualStrokeWeights", skip_serializing_if = "Option::is_none")]
225 pub individual_stroke_weights: Option<Box<models::StrokeWeights>>,
226 #[serde(rename = "componentPropertyDefinitions", skip_serializing_if = "Option::is_none")]
228 pub component_property_definitions: Option<std::collections::HashMap<String, models::ComponentPropertyDefinition>>,
229}
230
231impl ComponentNode {
232 pub fn new(id: String, name: String, scroll_behavior: ScrollBehavior, blend_mode: models::BlendMode, children: Vec<models::SubcanvasNode>, clips_content: bool, fills: Vec<models::Paint>, effects: Vec<models::Effect>) -> ComponentNode {
233 ComponentNode {
234 id,
235 name,
236 visible: None,
237 locked: None,
238 is_fixed: None,
239 scroll_behavior,
240 rotation: None,
241 component_property_references: None,
242 plugin_data: None,
243 shared_plugin_data: None,
244 bound_variables: None,
245 explicit_variable_modes: None,
246 blend_mode,
247 opacity: None,
248 children,
249 preserve_ratio: None,
250 constraints: None,
251 relative_transform: None,
252 size: None,
253 layout_align: None,
254 layout_grow: None,
255 layout_positioning: None,
256 min_width: None,
257 max_width: None,
258 min_height: None,
259 max_height: None,
260 layout_sizing_horizontal: None,
261 layout_sizing_vertical: None,
262 clips_content,
263 background: None,
264 background_color: None,
265 layout_grids: None,
266 overflow_direction: None,
267 layout_mode: None,
268 primary_axis_sizing_mode: None,
269 counter_axis_sizing_mode: None,
270 primary_axis_align_items: None,
271 counter_axis_align_items: None,
272 padding_left: None,
273 padding_right: None,
274 padding_top: None,
275 padding_bottom: None,
276 item_spacing: None,
277 item_reverse_z_index: None,
278 strokes_included_in_layout: None,
279 layout_wrap: None,
280 counter_axis_spacing: None,
281 counter_axis_align_content: None,
282 corner_radius: None,
283 corner_smoothing: None,
284 rectangle_corner_radii: None,
285 fills,
286 styles: None,
287 strokes: None,
288 stroke_weight: None,
289 stroke_align: None,
290 stroke_join: None,
291 stroke_dashes: None,
292 fill_geometry: None,
293 stroke_geometry: None,
294 stroke_cap: None,
295 stroke_miter_angle: None,
296 export_settings: None,
297 effects,
298 is_mask: None,
299 mask_type: None,
300 is_mask_outline: None,
301 transition_node_id: None,
302 transition_duration: None,
303 transition_easing: None,
304 individual_stroke_weights: None,
305 component_property_definitions: None,
306 }
307 }
308}
309#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
311pub enum ScrollBehavior {
312 #[serde(rename = "SCROLLS")]
313 Scrolls,
314 #[serde(rename = "FIXED")]
315 Fixed,
316 #[serde(rename = "STICKY_SCROLLS")]
317 StickyScrolls,
318}
319
320impl Default for ScrollBehavior {
321 fn default() -> ScrollBehavior {
322 Self::Scrolls
323 }
324}
325#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
327pub enum LayoutAlign {
328 #[serde(rename = "INHERIT")]
329 Inherit,
330 #[serde(rename = "STRETCH")]
331 Stretch,
332 #[serde(rename = "MIN")]
333 Min,
334 #[serde(rename = "CENTER")]
335 Center,
336 #[serde(rename = "MAX")]
337 Max,
338}
339
340impl Default for LayoutAlign {
341 fn default() -> LayoutAlign {
342 Self::Inherit
343 }
344}
345#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
347pub enum LayoutPositioning {
348 #[serde(rename = "AUTO")]
349 Auto,
350 #[serde(rename = "ABSOLUTE")]
351 Absolute,
352}
353
354impl Default for LayoutPositioning {
355 fn default() -> LayoutPositioning {
356 Self::Auto
357 }
358}
359#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
361pub enum LayoutSizingHorizontal {
362 #[serde(rename = "FIXED")]
363 Fixed,
364 #[serde(rename = "HUG")]
365 Hug,
366 #[serde(rename = "FILL")]
367 Fill,
368}
369
370impl Default for LayoutSizingHorizontal {
371 fn default() -> LayoutSizingHorizontal {
372 Self::Fixed
373 }
374}
375#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
377pub enum LayoutSizingVertical {
378 #[serde(rename = "FIXED")]
379 Fixed,
380 #[serde(rename = "HUG")]
381 Hug,
382 #[serde(rename = "FILL")]
383 Fill,
384}
385
386impl Default for LayoutSizingVertical {
387 fn default() -> LayoutSizingVertical {
388 Self::Fixed
389 }
390}
391#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
393pub enum OverflowDirection {
394 #[serde(rename = "HORIZONTAL_SCROLLING")]
395 HorizontalScrolling,
396 #[serde(rename = "VERTICAL_SCROLLING")]
397 VerticalScrolling,
398 #[serde(rename = "HORIZONTAL_AND_VERTICAL_SCROLLING")]
399 HorizontalAndVerticalScrolling,
400 #[serde(rename = "NONE")]
401 None,
402}
403
404impl Default for OverflowDirection {
405 fn default() -> OverflowDirection {
406 Self::HorizontalScrolling
407 }
408}
409#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
411pub enum LayoutMode {
412 #[serde(rename = "NONE")]
413 None,
414 #[serde(rename = "HORIZONTAL")]
415 Horizontal,
416 #[serde(rename = "VERTICAL")]
417 Vertical,
418}
419
420impl Default for LayoutMode {
421 fn default() -> LayoutMode {
422 Self::None
423 }
424}
425#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
427pub enum PrimaryAxisSizingMode {
428 #[serde(rename = "FIXED")]
429 Fixed,
430 #[serde(rename = "AUTO")]
431 Auto,
432}
433
434impl Default for PrimaryAxisSizingMode {
435 fn default() -> PrimaryAxisSizingMode {
436 Self::Fixed
437 }
438}
439#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
441pub enum CounterAxisSizingMode {
442 #[serde(rename = "FIXED")]
443 Fixed,
444 #[serde(rename = "AUTO")]
445 Auto,
446}
447
448impl Default for CounterAxisSizingMode {
449 fn default() -> CounterAxisSizingMode {
450 Self::Fixed
451 }
452}
453#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
455pub enum PrimaryAxisAlignItems {
456 #[serde(rename = "MIN")]
457 Min,
458 #[serde(rename = "CENTER")]
459 Center,
460 #[serde(rename = "MAX")]
461 Max,
462 #[serde(rename = "SPACE_BETWEEN")]
463 SpaceBetween,
464}
465
466impl Default for PrimaryAxisAlignItems {
467 fn default() -> PrimaryAxisAlignItems {
468 Self::Min
469 }
470}
471#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
473pub enum CounterAxisAlignItems {
474 #[serde(rename = "MIN")]
475 Min,
476 #[serde(rename = "CENTER")]
477 Center,
478 #[serde(rename = "MAX")]
479 Max,
480 #[serde(rename = "BASELINE")]
481 Baseline,
482}
483
484impl Default for CounterAxisAlignItems {
485 fn default() -> CounterAxisAlignItems {
486 Self::Min
487 }
488}
489#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
491pub enum LayoutWrap {
492 #[serde(rename = "NO_WRAP")]
493 NoWrap,
494 #[serde(rename = "WRAP")]
495 Wrap,
496}
497
498impl Default for LayoutWrap {
499 fn default() -> LayoutWrap {
500 Self::NoWrap
501 }
502}
503#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
505pub enum CounterAxisAlignContent {
506 #[serde(rename = "AUTO")]
507 Auto,
508 #[serde(rename = "SPACE_BETWEEN")]
509 SpaceBetween,
510}
511
512impl Default for CounterAxisAlignContent {
513 fn default() -> CounterAxisAlignContent {
514 Self::Auto
515 }
516}
517#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
519pub enum StrokeAlign {
520 #[serde(rename = "INSIDE")]
521 Inside,
522 #[serde(rename = "OUTSIDE")]
523 Outside,
524 #[serde(rename = "CENTER")]
525 Center,
526}
527
528impl Default for StrokeAlign {
529 fn default() -> StrokeAlign {
530 Self::Inside
531 }
532}
533#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
535pub enum StrokeJoin {
536 #[serde(rename = "MITER")]
537 Miter,
538 #[serde(rename = "BEVEL")]
539 Bevel,
540 #[serde(rename = "ROUND")]
541 Round,
542}
543
544impl Default for StrokeJoin {
545 fn default() -> StrokeJoin {
546 Self::Miter
547 }
548}
549#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
551pub enum StrokeCap {
552 #[serde(rename = "NONE")]
553 None,
554 #[serde(rename = "ROUND")]
555 Round,
556 #[serde(rename = "SQUARE")]
557 Square,
558 #[serde(rename = "LINE_ARROW")]
559 LineArrow,
560 #[serde(rename = "TRIANGLE_ARROW")]
561 TriangleArrow,
562 #[serde(rename = "DIAMOND_FILLED")]
563 DiamondFilled,
564 #[serde(rename = "CIRCLE_FILLED")]
565 CircleFilled,
566 #[serde(rename = "TRIANGLE_FILLED")]
567 TriangleFilled,
568 #[serde(rename = "WASHI_TAPE_1")]
569 WashiTape1,
570 #[serde(rename = "WASHI_TAPE_2")]
571 WashiTape2,
572 #[serde(rename = "WASHI_TAPE_3")]
573 WashiTape3,
574 #[serde(rename = "WASHI_TAPE_4")]
575 WashiTape4,
576 #[serde(rename = "WASHI_TAPE_5")]
577 WashiTape5,
578 #[serde(rename = "WASHI_TAPE_6")]
579 WashiTape6,
580}
581
582impl Default for StrokeCap {
583 fn default() -> StrokeCap {
584 Self::None
585 }
586}
587#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
589pub enum MaskType {
590 #[serde(rename = "ALPHA")]
591 Alpha,
592 #[serde(rename = "VECTOR")]
593 Vector,
594 #[serde(rename = "LUMINANCE")]
595 Luminance,
596}
597
598impl Default for MaskType {
599 fn default() -> MaskType {
600 Self::Alpha
601 }
602}
603