@@ -104,22 +104,14 @@ export default class CSSRuntime extends MasterCSS {
104
104
105
105
// @ts -expect-error readonly
106
106
this . observer = new MutationObserver ( ( mutationRecords ) => {
107
- // console.clear()
108
- // const test = ''
109
- // if (test) {
110
- // console.log('')
111
- // console.log(`${test}: ${this.classCounts.get(test)}`)
112
- // }
113
107
const eachClassCounts = new Map ( )
114
108
const targetFirstAttrMutationRecord = new Map < Element , MutationRecord > ( )
115
-
116
109
const updateClassCount = ( classes : Set < string > | string [ ] | DOMTokenList , isAdding = false ) => {
117
110
const usage = isAdding ? 1 : - 1
118
111
classes . forEach ( ( className ) => {
119
112
eachClassCounts . set ( className , ( eachClassCounts . get ( className ) || 0 ) + usage )
120
113
} )
121
114
}
122
-
123
115
const connectedStatusMap = new Map < Element , { change : number , mutationRecord : MutationRecord } > ( )
124
116
const disconnectedStatusMap = new Map < Element , { change : number , mutationRecord : MutationRecord } > ( )
125
117
const recordStatus = ( target : Element , mutationRecord : MutationRecord , map : Map < Element , { change : number , mutationRecord : MutationRecord } > , adding : boolean ) => {
@@ -130,8 +122,12 @@ export default class CSSRuntime extends MasterCSS {
130
122
} else {
131
123
map . set ( target , { change : adding ? 1 : - 1 , mutationRecord } )
132
124
}
125
+ for ( const child of target . children ) {
126
+ if ( 'classList' in child ) {
127
+ recordStatus ( child as Element , mutationRecord , map , adding )
128
+ }
129
+ }
133
130
}
134
-
135
131
mutationRecords . forEach ( ( mutationRecord ) => {
136
132
const target = mutationRecord . target as Element
137
133
switch ( mutationRecord . type ) {
@@ -151,40 +147,27 @@ export default class CSSRuntime extends MasterCSS {
151
147
break
152
148
}
153
149
} )
154
-
155
- const updatedTargetChangeMap = new Map < Element , number > ( )
156
-
157
150
const updateTarget = ( target : Element , adding : boolean ) => {
158
- const change = updatedTargetChangeMap . get ( target ) || 0
159
- const newChange = change + ( adding ? 1 : - 1 )
160
- if ( newChange >= - 1 && newChange <= 1 ) {
161
- updatedTargetChangeMap . set ( target , newChange )
162
- const firstAttrMutationRecord = targetFirstAttrMutationRecord . get ( target )
151
+ const firstAttrMutationRecord = targetFirstAttrMutationRecord . get ( target )
152
+ if ( firstAttrMutationRecord ) {
153
+ targetFirstAttrMutationRecord . delete ( target )
154
+ }
155
+ if ( adding ) {
156
+ updateClassCount ( target . classList , adding )
157
+ } else {
163
158
if ( firstAttrMutationRecord ) {
164
- targetFirstAttrMutationRecord . delete ( target )
165
- }
166
- if ( adding ) {
167
- updateClassCount ( target . classList , adding )
159
+ updateClassCount ( firstAttrMutationRecord . oldValue ? firstAttrMutationRecord . oldValue . split ( / \s + / ) : [ ] , adding )
168
160
} else {
169
- if ( firstAttrMutationRecord ) {
170
- updateClassCount ( firstAttrMutationRecord . oldValue ? firstAttrMutationRecord . oldValue . split ( / \s + / ) : [ ] , adding )
171
- } else {
172
- updateClassCount ( target . classList , adding )
173
- }
174
- disconnectedStatusMap . forEach ( ( disconnectedTargetStatus , disconnectedTarget ) => {
175
- if ( disconnectedTargetStatus . mutationRecord . target === target && disconnectedTargetStatus . change !== 0 ) {
176
- updateTarget ( disconnectedTarget , disconnectedTargetStatus . change > 0 )
177
- }
178
- } )
179
- }
180
- for ( const child of target . children ) {
181
- updateTarget ( child as Element , adding )
161
+ updateClassCount ( target . classList , adding )
182
162
}
163
+ disconnectedStatusMap . forEach ( ( disconnectedTargetStatus , disconnectedTarget ) => {
164
+ if ( disconnectedTargetStatus . mutationRecord . target === target && disconnectedTargetStatus . change !== 0 ) {
165
+ updateTarget ( disconnectedTarget , disconnectedTargetStatus . change > 0 )
166
+ }
167
+ } )
183
168
}
184
169
}
185
-
186
170
connectedStatusMap . forEach ( ( { change } , target ) => change !== 0 && updateTarget ( target , change > 0 ) )
187
-
188
171
targetFirstAttrMutationRecord . forEach ( ( mutation , target ) => {
189
172
if ( ! target . isConnected ) return
190
173
const oldClassList = mutation . oldValue ? mutation . oldValue . split ( / \s + / ) : [ ]
@@ -195,11 +178,9 @@ export default class CSSRuntime extends MasterCSS {
195
178
} )
196
179
const removedClasses = oldClassList . filter ( c => ! newClassList . contains ( c ) )
197
180
if ( addedClasses . length ) {
198
- // console.log('[attribute]', '[add] ', addedClasses, target)
199
181
updateClassCount ( addedClasses , true )
200
182
}
201
183
if ( removedClasses . length ) {
202
- // console.log('[attribute]', '[remove]', removedClasses, target)
203
184
updateClassCount ( removedClasses , false )
204
185
}
205
186
} )
0 commit comments