@@ -35,15 +35,17 @@ function updateVariantClasses({
3535 const updateElementClasses = (
3636 element : HTMLElement ,
3737 dataCslp : string ,
38- observer : MutationObserver
38+ observer ? : MutationObserver
3939 ) => {
4040 if ( ! dataCslp ) return ;
4141
4242 if (
4343 dataCslp . startsWith ( "v2:" ) &&
44- element . classList . contains ( "visual-builder__base -field" )
44+ ! element . classList . contains ( "visual-builder__variant -field" )
4545 ) {
46- element . classList . remove ( "visual-builder__base-field" ) ;
46+ if ( element . classList . contains ( "visual-builder__base-field" ) ) {
47+ element . classList . remove ( "visual-builder__base-field" ) ;
48+ }
4749 if ( highlightVariantFields ) {
4850 element . classList . add (
4951 visualBuilderStyles ( ) [ "visual-builder__variant-field" ] ,
@@ -73,7 +75,7 @@ function updateVariantClasses({
7375 ) ;
7476 element . classList . add ( "visual-builder__disabled-variant-field" ) ;
7577 }
76-
78+ if ( ! observer ) return ;
7779 // Disconnect this observer after processing
7880 observer . disconnect ( ) ;
7981 const index = observers . indexOf ( observer ) ;
@@ -82,20 +84,79 @@ function updateVariantClasses({
8284 }
8385 } ;
8486
87+ const addElementClasses = ( element : HTMLElement ) => {
88+ const dataCslp = element . getAttribute ( DATA_CSLP_ATTR_SELECTOR ) ;
89+
90+ if ( ! dataCslp ) {
91+ //recursive call for child nodes
92+ element . childNodes . forEach ( ( child ) => {
93+ if ( child instanceof HTMLElement ) {
94+ addElementClasses ( child ) ;
95+ }
96+ } ) ;
97+ return ;
98+ }
99+ //if element might have been updated by another observer
100+ if (
101+ dataCslp . startsWith ( "v2:" ) &&
102+ element . classList . contains ( "visual-builder__variant-field" )
103+ ) {
104+ return ;
105+ }
106+ // if element has not given variant/base class
107+ if (
108+ dataCslp . startsWith ( "v2:" ) &&
109+ ! element . classList . contains ( "visual-builder__variant-field" )
110+ ) {
111+ if ( element . classList . contains ( "visual-builder__base-field" ) ) {
112+ element . classList . remove ( "visual-builder__base-field" ) ;
113+ }
114+ if ( highlightVariantFields ) {
115+ element . classList . add (
116+ visualBuilderStyles ( ) [ "visual-builder__variant-field" ] ,
117+ "visual-builder__variant-field"
118+ ) ;
119+ } else {
120+ element . classList . add ( "visual-builder__variant-field" ) ;
121+ }
122+ } else if ( ! dataCslp . startsWith ( "v2:" ) ) {
123+ if ( element . classList . contains ( "visual-builder__variant-field" ) ) {
124+ element . classList . remove (
125+ visualBuilderStyles ( ) [ "visual-builder__variant-field" ] ,
126+ "visual-builder__variant-field"
127+ ) ;
128+ }
129+ element . classList . add ( "visual-builder__base-field" ) ;
130+ }
131+
132+ //recursive call for child nodes
133+ element . childNodes . forEach ( ( child ) => {
134+ if ( child instanceof HTMLElement ) {
135+ addElementClasses ( child ) ;
136+ }
137+ } ) ;
138+ } ;
139+
85140 // Create a separate observer for each element
86141 const elementsWithCslp = document . querySelectorAll (
87142 `[${ DATA_CSLP_ATTR_SELECTOR } ]`
88143 ) ;
89-
90144 elementsWithCslp . forEach ( ( elementNode ) => {
91145 const element = elementNode as HTMLElement ;
92-
93146 const observer = new MutationObserver ( ( mutations ) => {
94147 mutations . forEach ( ( mutation ) => {
95148 if (
96- mutation . type === "attributes" &&
97- mutation . attributeName === DATA_CSLP_ATTR_SELECTOR
149+ ( mutation . type === "attributes" &&
150+ mutation . attributeName === DATA_CSLP_ATTR_SELECTOR ) ||
151+ mutation . type === "childList"
98152 ) {
153+ if ( mutation . addedNodes . length > 0 ) {
154+ mutation . addedNodes . forEach ( ( node ) => {
155+ if ( node instanceof HTMLElement ) {
156+ addElementClasses ( node ) ;
157+ }
158+ } ) ;
159+ }
99160 const dataCslp = element . getAttribute (
100161 DATA_CSLP_ATTR_SELECTOR
101162 ) ;
@@ -105,7 +166,11 @@ function updateVariantClasses({
105166 } ) ;
106167
107168 observers . push ( observer ) ;
108- observer . observe ( element , { attributes : true } ) ;
169+ observer . observe ( element , {
170+ attributes : true ,
171+ childList : true , // Observe direct children
172+ subtree : true ,
173+ } ) ;
109174 } ) ;
110175
111176 setTimeout ( ( ) => {
0 commit comments