@@ -245,7 +245,7 @@ function apply_custom_class(element, className) {
245
245
for ( let j = 0 ; j < classes . length ; j ++ ) {
246
246
const class_entry = classes [ j ] ;
247
247
248
- if ( '[' === class_entry [ 0 ] ) {
248
+ if ( '[' === class_entry [ 0 ] && ']' !== class_entry [ 1 ] ) {
249
249
apply_custom_class ( element , class_entry ) ;
250
250
continue ;
251
251
}
@@ -283,14 +283,14 @@ function do_apply(element, selectors, classes, events, media_query, original_cla
283
283
284
284
if ( selectors ) {
285
285
elements_to_apply = [ ] ;
286
- if ( typeof selectors === 'object' && ! Array . isArray ( selectors ) ) {
286
+ if ( 'object' === typeof selectors && ! Array . isArray ( selectors ) ) {
287
287
selectors = [ selectors ] ;
288
288
}
289
289
for ( let j = 0 ; j < selectors . length ; j ++ ) {
290
- const selector = selectors [ j ] ;
291
- if ( typeof selector === 'object' ) {
290
+ let selector = selectors [ j ] ;
291
+ if ( 'object' === typeof selector ) {
292
292
const { tag, selectors : _selectors } = selector ;
293
- if ( tag === 'lookout' ) {
293
+ if ( 'lookout' === tag ) {
294
294
let before_to_apply = [ ] ;
295
295
let after_to_apply = [ ] ;
296
296
const { before, after } = selector ;
@@ -340,7 +340,10 @@ function do_apply(element, selectors, classes, events, media_query, original_cla
340
340
}
341
341
continue ;
342
342
}
343
- const elements = element . querySelectorAll ( selector ) ;
343
+ if ( / \@ c u r r e n t / . test ( selector ) ) {
344
+ selector = selector . replace ( / \@ c u r r e n t / g, retrieve_current_selector ( element ) ) ;
345
+ }
346
+ const elements = 'HTML' !== selector ? element . querySelectorAll ( selector ) : [ document . documentElement ] ;
344
347
for ( let k = 0 ; k < elements . length ; k ++ ) {
345
348
elements_to_apply . push ( elements [ k ] ) ;
346
349
}
@@ -421,18 +424,24 @@ function init(document, event = undefined) {
421
424
}
422
425
}
423
426
427
+ if ( ! document . documentElement ) return ;
428
+ if ( ! document . documentElement . hasAttribute ( 'aria-busy' ) ) return ;
429
+
424
430
document . documentElement . removeAttribute ( 'aria-busy' ) ;
425
431
}
426
432
427
433
function init_observer ( record ) {
428
434
// console.time('init_observer');
435
+ const elements = [ ] ;
429
436
for ( let i = 0 ; i < record . length ; i ++ ) {
430
437
const { type, target, attributeName } = record [ i ] ;
431
- if ( type === 'attributes' && attributeName === 'class' ) {
432
- apply_custom_class ( target , target . className ) ;
438
+ if ( 'attributes' === type && 'class' === attributeName ) {
439
+ // apply_custom_class(target, target.className);
440
+ elements . push ( target ) ;
433
441
}
434
442
if ( type === 'childList' ) {
435
- const elements = target . querySelectorAll ( '*:not(head, head *)[class]' ) ;
443
+ // const elements = target.querySelectorAll('*:not(head, head *)[class]');
444
+ elements . push ( ...target . querySelectorAll ( '*:not(head, head *)[class]' ) ) ;
436
445
for ( let j = 0 ; j < elements . length ; j ++ ) {
437
446
const element = elements [ j ] ;
438
447
apply_custom_class ( element , element . className ) ;
@@ -448,4 +457,38 @@ const CSS_IN_JS_IN_HTML = {
448
457
fromClassNameToGroups : split_classname_to_classes_groups ,
449
458
} ;
450
459
460
+ function retrieve_current_selector ( element ) {
461
+ let limit = 1000 ;
462
+ const selectors = [ ] ;
463
+ let cursor_index_child ;
464
+ let cursor_element ;
465
+ do {
466
+ cursor_element = cursor_element ?. parentElement ?? element ;
467
+ if ( cursor_element . id ) {
468
+ selectors . push ( cursor_element . id ) ;
469
+ continue ;
470
+ }
471
+ const { parentElement, tagName } = cursor_element ;
472
+ if ( parentElement ) {
473
+ const { children } = parentElement ;
474
+ cursor_index_child = Array . from ( children ) . indexOf ( cursor_element ) ;
475
+ if ( cursor_index_child > 1 ) {
476
+ selectors . unshift ( `${ tagName } :nth-child(${ cursor_index_child + 1 } )` ) ;
477
+ continue ;
478
+ }
479
+ selectors . unshift ( tagName ) ;
480
+ continue ;
481
+ }
482
+ selectors . unshift ( tagName ) ;
483
+ if ( ! parentElement ) break ;
484
+ if ( 'HTML' === tagName ) break ;
485
+ if ( 'BODY' === tagName ) break ;
486
+ } while ( limit -- ) ;
487
+ if ( limit < 1 ) {
488
+ console . error ( 'retrieve_current_selector : limit reached' ) ;
489
+ return '' ;
490
+ }
491
+ return selectors . join ( '>' ) ;
492
+ }
493
+
451
494
window . CSS_IN_JS_IN_HTML = CSS_IN_JS_IN_HTML ;
0 commit comments