@@ -33,32 +33,99 @@ export default defineConfig({
3333 cleanUrls : true ,
3434
3535 head : [
36+ // Google Analytics 4
37+ [
38+ 'script' ,
39+ {
40+ async : '' ,
41+ src : 'https://www.googletagmanager.com/gtag/js?id=G-5JHR3XB6XK' ,
42+ } ,
43+ ] ,
44+ [
45+ 'script' ,
46+ { } ,
47+ `
48+ window.dataLayer = window.dataLayer || [];
49+ function gtag(){dataLayer.push(arguments);}
50+ gtag('js', new Date());
51+ gtag('config', 'G-5JHR3XB6XK');
52+ ` ,
53+ ] ,
54+
3655 // Preconnect for faster resource loading
3756 [ 'link' , { rel : 'preconnect' , href : 'https://fonts.googleapis.com' } ] ,
38- [ 'link' , { rel : 'preconnect' , href : 'https://fonts.gstatic.com' , crossorigin : '' } ] ,
57+ [
58+ 'link' ,
59+ { rel : 'preconnect' , href : 'https://fonts.gstatic.com' , crossorigin : '' } ,
60+ ] ,
3961 [ 'link' , { rel : 'preconnect' , href : 'https://api.iconify.design' } ] ,
4062 [ 'link' , { rel : 'preconnect' , href : 'https://flow.demo.vyuh.tech' } ] ,
4163 // Non-blocking font loading - reduced weights for faster load
4264 // Montserrat: 600 (semibold), 700 (bold), 900 (black for headers)
4365 // JetBrains Mono: 400 only (code doesn't need variants)
44- [ 'link' , {
45- rel : 'stylesheet' ,
46- href : 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Montserrat:wght@600;700;900&display=swap' ,
47- media : 'print' ,
48- onload : "this.media='all'"
49- } ] ,
66+ [
67+ 'link' ,
68+ {
69+ rel : 'stylesheet' ,
70+ href : 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Montserrat:wght@600;700;900&display=swap' ,
71+ media : 'print' ,
72+ onload : "this.media='all'" ,
73+ } ,
74+ ] ,
5075 // Fallback for browsers with JS disabled
51- [ 'noscript' , { } , '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Montserrat:wght@600;700;900&display=swap">' ] ,
76+ [
77+ 'noscript' ,
78+ { } ,
79+ '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Montserrat:wght@600;700;900&display=swap">' ,
80+ ] ,
5281 [ 'link' , { rel : 'icon' , href : '/icon.svg' , type : 'image/svg+xml' } ] ,
5382 [ 'meta' , { property : 'og:type' , content : 'website' } ] ,
54- [ 'meta' , { property : 'og:title' , content : 'Vyuh Node Flow - Visual Flow Editor for Flutter' } ] ,
55- [ 'meta' , { property : 'og:description' , content : 'A flexible, high-performance node-based flow editor for building workflow editors, visual programming interfaces, and interactive diagrams in Flutter.' } ] ,
56- [ 'meta' , { property : 'og:image' , content : 'https://flow.vyuh.tech/node-flow-banner.png' } ] ,
83+ [
84+ 'meta' ,
85+ {
86+ property : 'og:title' ,
87+ content : 'Vyuh Node Flow - Visual Flow Editor for Flutter' ,
88+ } ,
89+ ] ,
90+ [
91+ 'meta' ,
92+ {
93+ property : 'og:description' ,
94+ content :
95+ 'A flexible, high-performance node-based flow editor for building workflow editors, visual programming interfaces, and interactive diagrams in Flutter.' ,
96+ } ,
97+ ] ,
98+ [
99+ 'meta' ,
100+ {
101+ property : 'og:image' ,
102+ content : 'https://flow.vyuh.tech/node-flow-banner.png' ,
103+ } ,
104+ ] ,
57105 [ 'meta' , { property : 'og:url' , content : 'https://flow.vyuh.tech' } ] ,
58106 [ 'meta' , { name : 'twitter:card' , content : 'summary_large_image' } ] ,
59- [ 'meta' , { name : 'twitter:title' , content : 'Vyuh Node Flow - Visual Flow Editor for Flutter' } ] ,
60- [ 'meta' , { name : 'twitter:description' , content : 'A flexible, high-performance node-based flow editor for building workflow editors, visual programming interfaces, and interactive diagrams in Flutter.' } ] ,
61- [ 'meta' , { name : 'twitter:image' , content : 'https://flow.vyuh.tech/node-flow-banner.png' } ] ,
107+ [
108+ 'meta' ,
109+ {
110+ name : 'twitter:title' ,
111+ content : 'Vyuh Node Flow - Visual Flow Editor for Flutter' ,
112+ } ,
113+ ] ,
114+ [
115+ 'meta' ,
116+ {
117+ name : 'twitter:description' ,
118+ content :
119+ 'A flexible, high-performance node-based flow editor for building workflow editors, visual programming interfaces, and interactive diagrams in Flutter.' ,
120+ } ,
121+ ] ,
122+ [
123+ 'meta' ,
124+ {
125+ name : 'twitter:image' ,
126+ content : 'https://flow.vyuh.tech/node-flow-banner.png' ,
127+ } ,
128+ ] ,
62129 ] ,
63130
64131 // Ignore dead links to planned pages that don't exist yet
@@ -101,7 +168,10 @@ export default defineConfig({
101168 {
102169 text : 'Getting Started' ,
103170 items : [
104- { text : 'Installation' , link : '/docs/getting-started/installation' } ,
171+ {
172+ text : 'Installation' ,
173+ link : '/docs/getting-started/installation' ,
174+ } ,
105175 { text : 'Quick Start' , link : '/docs/getting-started/quick-start' } ,
106176 ] ,
107177 } ,
@@ -110,7 +180,10 @@ export default defineConfig({
110180 items : [
111181 { text : 'Architecture' , link : '/docs/core-concepts/architecture' } ,
112182 { text : 'Controller' , link : '/docs/core-concepts/controller' } ,
113- { text : 'Configuration' , link : '/docs/core-concepts/configuration' } ,
183+ {
184+ text : 'Configuration' ,
185+ link : '/docs/core-concepts/configuration' ,
186+ } ,
114187 { text : 'Nodes' , link : '/docs/core-concepts/nodes' } ,
115188 { text : 'Ports' , link : '/docs/core-concepts/ports' } ,
116189 { text : 'Connections' , link : '/docs/core-concepts/connections' } ,
@@ -119,12 +192,24 @@ export default defineConfig({
119192 {
120193 text : 'Components' ,
121194 items : [
122- { text : 'NodeFlowEditor' , link : '/docs/components/node-flow-editor' } ,
123- { text : 'NodeFlowViewer' , link : '/docs/components/node-flow-viewer' } ,
195+ {
196+ text : 'NodeFlowEditor' ,
197+ link : '/docs/components/node-flow-editor' ,
198+ } ,
199+ {
200+ text : 'NodeFlowViewer' ,
201+ link : '/docs/components/node-flow-viewer' ,
202+ } ,
124203 { text : 'NodeWidget' , link : '/docs/components/node-widget' } ,
125204 { text : 'PortWidget' , link : '/docs/components/port-widget' } ,
126- { text : 'ConnectionsLayer' , link : '/docs/components/connections-layer' } ,
127- { text : 'Special Node Types' , link : '/docs/components/special-node-types' } ,
205+ {
206+ text : 'ConnectionsLayer' ,
207+ link : '/docs/components/connections-layer' ,
208+ } ,
209+ {
210+ text : 'Special Node Types' ,
211+ link : '/docs/components/special-node-types' ,
212+ } ,
128213 { text : 'Minimap' , link : '/docs/components/minimap' } ,
129214 ] ,
130215 } ,
@@ -136,8 +221,14 @@ export default defineConfig({
136221 text : 'Theming' ,
137222 items : [
138223 { text : 'Overview' , link : '/docs/theming/overview' } ,
139- { text : 'Connection Styles' , link : '/docs/theming/connection-styles' } ,
140- { text : 'Connection Effects' , link : '/docs/theming/connection-effects' } ,
224+ {
225+ text : 'Connection Styles' ,
226+ link : '/docs/theming/connection-styles' ,
227+ } ,
228+ {
229+ text : 'Connection Effects' ,
230+ link : '/docs/theming/connection-effects' ,
231+ } ,
141232 { text : 'Port Shapes' , link : '/docs/theming/port-shapes' } ,
142233 { text : 'Port Labels' , link : '/docs/theming/port-labels' } ,
143234 { text : 'Grid Styles' , link : '/docs/theming/grid-styles' } ,
@@ -147,12 +238,21 @@ export default defineConfig({
147238 {
148239 text : 'Advanced' ,
149240 items : [
150- { text : 'Special Node Types' , link : '/docs/advanced/special-node-types' } ,
241+ {
242+ text : 'Special Node Types' ,
243+ link : '/docs/advanced/special-node-types' ,
244+ } ,
151245 { text : 'Level of Detail (LOD)' , link : '/docs/advanced/lod' } ,
152246 { text : 'Events' , link : '/docs/advanced/events' } ,
153247 { text : 'Serialization' , link : '/docs/advanced/serialization' } ,
154- { text : 'Keyboard Shortcuts' , link : '/docs/advanced/keyboard-shortcuts' } ,
155- { text : 'Shortcuts & Actions' , link : '/docs/advanced/shortcuts-actions' } ,
248+ {
249+ text : 'Keyboard Shortcuts' ,
250+ link : '/docs/advanced/keyboard-shortcuts' ,
251+ } ,
252+ {
253+ text : 'Shortcuts & Actions' ,
254+ link : '/docs/advanced/shortcuts-actions' ,
255+ } ,
156256 ] ,
157257 } ,
158258 {
0 commit comments