1pub mod autogen;
67pub mod docs;
68pub mod palette;
69pub mod parse;
70pub mod tokens;
71pub mod transform;
72pub mod types;
73pub mod vrt;
74
75pub use parse::parse_art;
77pub use tokens::{
78 build_token_map, find_dependent_tokens, flatten_token_categories, generate_tokens_markdown,
79 parse_tokens_from_json, parse_tokens_from_path, parse_tokens_from_value,
80 resolve_token_categories, validate_reference,
81};
82pub use transform::{transform_to_csf, transform_to_vue};
83pub use types::{
84 ArtDescriptor, ArtDescriptorOwned, ArtMetadata, ArtMetadataOwned, ArtParseError,
85 ArtParseOptions, ArtParseResult, ArtScriptBlock, ArtScriptBlockOwned, ArtStatus, ArtStyleBlock,
86 ArtStyleBlockOwned, ArtVariant, ArtVariantOwned, CsfOutput, SourceLocation, ViewportConfig,
87};
88
89pub use vize_carton::Bump;
91
92pub fn serve() {
96 todo!("Component gallery server for Vue SFC - implement with Vite plugin")
97}
98
99#[cfg(test)]
100mod tests {
101 use super::{
102 ArtDescriptorOwned, ArtParseOptions, Bump, parse_art, transform_to_csf, transform_to_vue,
103 };
104
105 #[test]
106 fn test_full_workflow() {
107 let allocator = Bump::new();
108 let source = r#"
109<script setup lang="ts">
110defineArt("./Button.vue", {
111 title: "Button",
112 description: "A versatile button component",
113 category: "atoms",
114 tags: ["ui", "input"],
115});
116</script>
117
118<art>
119 <variant name="Primary" default>
120 <Button variant="primary">Primary Button</Button>
121 </variant>
122 <variant name="Secondary">
123 <Button variant="secondary">Secondary Button</Button>
124 </variant>
125 <variant name="With Icon">
126 <Button variant="primary" icon="plus">Add Item</Button>
127 </variant>
128</art>
129
130<style scoped>
131.art-container {
132 padding: 20px;
133}
134</style>
135"#;
136
137 let art = parse_art(
139 &allocator,
140 source,
141 ArtParseOptions {
142 filename: "Button.art.vue".into(),
143 },
144 )
145 .unwrap();
146
147 assert_eq!(art.metadata.title, "Button");
148 assert_eq!(
149 art.metadata.description,
150 Some("A versatile button component")
151 );
152 assert_eq!(art.metadata.category, Some("atoms"));
153 assert_eq!(art.metadata.tags.len(), 2);
154 assert_eq!(art.variants.len(), 3);
155 assert!(art.script_setup.is_some());
156 assert_eq!(art.styles.len(), 1);
157
158 let csf = transform_to_csf(&art);
160 insta::assert_debug_snapshot!(csf);
161
162 let vue = transform_to_vue(&art);
164 insta::assert_debug_snapshot!(vue);
165 }
166
167 #[test]
168 fn test_default_variant() {
169 let allocator = Bump::new();
170 let source = r#"
171<art title="Test">
172 <variant name="First">
173 <div>First</div>
174 </variant>
175 <variant name="Second" default>
176 <div>Second</div>
177 </variant>
178</art>
179"#;
180
181 let art = parse_art(&allocator, source, ArtParseOptions::default()).unwrap();
182 let default = art.default_variant().unwrap();
183 assert_eq!(default.name, "Second");
184 }
185
186 #[test]
187 fn test_into_owned() {
188 let allocator = Bump::new();
189 let source = r#"
190<art title="Button" component="./Button.vue">
191 <variant name="Primary">
192 <Button>Click</Button>
193 </variant>
194</art>
195"#;
196
197 let art = parse_art(&allocator, source, ArtParseOptions::default()).unwrap();
198 let owned: ArtDescriptorOwned = art.into_owned();
199
200 assert_eq!(owned.metadata.title, "Button");
201 assert_eq!(owned.variants.len(), 1);
202 }
203
204 #[test]
205 fn test_arena_efficiency() {
206 let allocator = Bump::new();
208
209 let sources = [
210 r#"<art title="A"><variant name="V1"><div>1</div></variant></art>"#,
211 r#"<art title="B"><variant name="V2"><div>2</div></variant></art>"#,
212 r#"<art title="C"><variant name="V3"><div>3</div></variant></art>"#,
213 ];
214
215 for source in sources {
216 let art = parse_art(&allocator, source, ArtParseOptions::default()).unwrap();
217 assert!(!art.metadata.title.is_empty());
218 }
219
220 }
223}